diff --git a/README.md b/README.md index d1958e21..258880bb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ reset-map-and-players --> reset map and players databases __Requirements:__ -Ubuntu 20.04 (works in LXD) +Ubuntu 20.04/22.04 (works in LXD) Be in the project directory via cd before you run any scripts! diff --git a/config-file-example b/config-file-example index a32698ae..0e536e3f 100644 --- a/config-file-example +++ b/config-file-example @@ -1,4 +1,5 @@ -mt_version="5.4.1" +mt_version="5.10.0" +mt_game_version="5.8.0" first_install=y ufw_enable=y ufw_ssh_port_for_accept=22 diff --git a/mods-download b/mods-download index ef611d78..68571703 100755 --- a/mods-download +++ b/mods-download @@ -3,6 +3,10 @@ rm -rf mods mkdir mods cd mods + +git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/digilines.git +git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mesecons.git +git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/xcompat.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/3d_armor.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/unified_inventory.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/unifiedbricks.git @@ -69,32 +73,32 @@ git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-m git clone --recurse-submodules --depth 1 --branch master https://github.com/cheapie/plasticbox.git git clone --recurse-submodules --depth 1 --branch master https://github.com/torusJKL/charcoal.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Sokomine/windmill.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/farming.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/protector.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/playerplus.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_npc.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_redo.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_water.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_monster.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_animal.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mob_horse.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bows.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/builtin_item.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bonemeal.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stamina.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wine.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bees.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wool.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/regrow.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/ambience.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bakedclay.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stairs.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/anvils.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/carts.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/doors.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/pie.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/castle.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_sky.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/farming.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/protector.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/playerplus.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_npc.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_redo.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_water.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_monster.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_animal.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mob_horse.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bows.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/builtin_item.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bonemeal.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/stamina.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/wine.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bees.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/wool.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/regrow.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/ambience.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bakedclay.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/stairs.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/anvils.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/carts.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/doors.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/pie.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/castle.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_sky.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Uberi/Minetest-WorldEdit.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/realchess.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git @@ -146,6 +150,8 @@ echo "This fix can be removed after some time" sed -i 's/run_at_every_load = false,/run_at_every_load = true,/' homedecor_modpack/homedecor_kitchen/init.lua fi +sed -i 's/homedecor/homedecor?/' plasticbox/depends.txt + #update skins-db cd skinsdb/updater python3 update_skins.py diff --git a/mods-list b/mods-list index 97fb8ef7..9ca92004 100644 --- a/mods-list +++ b/mods-list @@ -16,7 +16,6 @@ load_mod_letters = true load_mod_trafficlight = true load_mod_jukebox = true load_mod_tubelib_addons1 = true -load_mod_plasmascreen = true load_mod_mobs_npc = true load_mod_my_future_doors = true load_mod_itemframes = true @@ -29,7 +28,6 @@ load_mod_builtin_item = true load_mod_homedecor_exterior = true load_mod_flowerpot = true load_mod_3d_armor_stand = true -load_mod_junglegrass = true load_mod_mobs_crocs = true load_mod_homedecor_electrical = true load_mod_homedecor_doors_and_gates = true @@ -75,7 +73,6 @@ load_mod_bbq = true load_mod_wieldview = true load_mod_death_compass = true load_mod_facade = true -load_mod_inbox = true load_mod_cloud_items = true load_mod_bows = true load_mod_3dmushrooms = true @@ -273,3 +270,50 @@ load_mod_home_vending_machines = true load_mod_pl_sunflowers = true load_mod_pl_seaweed = true load_mod_pl_waterlilies = true +load_mod_homedecor_inbox = true +load_mod_armor_steel = true +load_mod_armor_nether = true +load_mod_armor_mithril = true +load_mod_armor_gold = true +load_mod_armor_diamond = true +load_mod_armor_cactus = true +load_mod_armor_bronze = true +load_mod_armor_admin = true +load_mod_armor_crystal = true +load_mod_homedecor_plasmascreen = true +load_mod_armor_wood = true +load_mod_xcompat = true +load_mod_mesecons_wires = true +load_mod_mesecons_walllever = true +load_mod_mesecons_torch = true +load_mod_mesecons_solarpanel = true +load_mod_mesecons_random = true +load_mod_mesecons_pressureplates = true +load_mod_mesecons_powerplant = true +load_mod_mesecons_pistons = true +load_mod_mesecons_mvps = true +load_mod_mesecons_luacontroller = true +load_mod_mesecons_movestones = true +load_mod_mesecons_lightstone = true +load_mod_mesecons_lamp = true +load_mod_mesecons_insulated = true +load_mod_mesecons_gates = true +load_mod_mesecons_extrawires = true +load_mod_mesecons_detector = true +load_mod_mesecons_delayer = true +load_mod_mesecons_commandblock = true +load_mod_mesecons_button = true +load_mod_mesecons_blinkyplant = true +load_mod_digilines = true +load_mod_mesecons_microcontroller = true +load_mod_mesecons_gamecompat = true +load_mod_mesecons_alias = true +load_mod_mesecons_receiver = true +load_mod_mesecons_fpga = true +load_mod_mesecons = true +load_mod_mesecons_materials = true +load_mod_mesecons_hydroturbine = true +load_mod_mesecons_switch = true +load_mod_mesecons_stickyblocks = true +load_mod_mesecons_noteblock = true +load_mod_mesecons_doors = true diff --git a/mods/3d_armor/.ldoc/crafting.luadoc b/mods/3d_armor/.ldoc/crafting.luadoc new file mode 100644 index 00000000..7f24674b --- /dev/null +++ b/mods/3d_armor/.ldoc/crafting.luadoc @@ -0,0 +1,39 @@ + +--- 3D Armor Crafting +-- +-- @topic crafting + + +--- Craft recipes for helmets, chestplates, leggings, boots, & shields. +-- +-- @craft armor +-- @usage +-- Key: +-- - m: material +-- - wood: group:wood +-- - cactus: default:cactus +-- - steel: default:steel_ingot +-- - bronze: default:bronze_ingot +-- - diamond: default:diamond +-- - gold: default:gold_ingot +-- - mithril: moreores:mithril_ingot +-- - crystal: ethereal:crystal_ingot +-- - nether: nether:nether_ingot +-- +-- helmet: chestplate: leggings: +-- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ +-- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +-- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ +-- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ +-- +-- boots: shield: +-- ┌───┬───┬───┐ ┌───┬───┬───┐ +-- │ │ │ │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ │ m │ │ +-- └───┴───┴───┘ └───┴───┴───┘ diff --git a/mods/3d_armor/.ldoc/gendoc.sh b/mods/3d_armor/.ldoc/gendoc.sh index df70dc85..5c84a145 100755 --- a/mods/3d_armor/.ldoc/gendoc.sh +++ b/mods/3d_armor/.ldoc/gendoc.sh @@ -31,7 +31,7 @@ rm -rf "${d_export}" # generate items, settings, & crafts topics temp files echo -e "\ngenerating temp files ..." -for script in "src" "settings" "crafts"; do +for script in src settings; do script="${d_ldoc}/parse_${script}.py" if test ! -f "${script}"; then echo "ERROR: script doesn't exist: ${script}" @@ -48,7 +48,7 @@ done echo # generate new doc files -"${cmd_ldoc}" --UNSAFE_NO_SANDBOX -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? +"${cmd_ldoc}" --unsafe_no_sandbox -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? # check exit status if test ${retval} -ne 0; then @@ -57,7 +57,7 @@ if test ${retval} -ne 0; then fi echo -e "\ncleaning temp files ..." -rm -vf "${d_ldoc}/"*.luadoc +find "${d_ldoc}" -type f -name "*.luadoc" ! -name "crafting.luadoc" -exec rm -vf {} + # HACK: ldoc does not seem to like the "shields:" prefix echo -e "\ncompensating for LDoc's issue with \"shields:\" prefix ..." @@ -72,7 +72,7 @@ sed -i \ printf "\ncopying textures ..." mkdir -p "${d_data}" texture_count=0 -for d_mod in "3d_armor" "shields"; do +for d_mod in armor_* shields; do printf "\rcopying textures from ${d_mod} ...\n" for png in $(find "${d_root}/${d_mod}/textures" -maxdepth 1 -type f -name "*.png"); do if test -f "${d_data}/$(basename ${png})"; then diff --git a/mods/3d_armor/.ldoc/parse_crafts.py b/mods/3d_armor/.ldoc/parse_crafts.py deleted file mode 100755 index ea0af471..00000000 --- a/mods/3d_armor/.ldoc/parse_crafts.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -# This script will parse source files for craft recipes. - -import sys, os, codecs, errno - - -path = os.path.realpath(__file__) -script = os.path.basename(path) -d_root = os.path.dirname(os.path.dirname(path)) -d_ldoc = os.path.join(d_root, ".ldoc") - -craftfile = os.path.realpath(os.path.join(d_root, "3d_armor/armor.lua")) -if not os.path.isfile(craftfile): - print("ERROR: craft file does not exist for parsing: {}".format(craftfile)) - sys.exit(errnor.ENOENT) - -buffer = codecs.open(craftfile, "r", "utf-8") -if not buffer: - print("ERROR: could not open file for reading: {}".format(craftfile)) - sys.exit(errno.EIO) - -data_in = buffer.read() -buffer.close() - -craft = "" - -data_in = data_in.replace("\r\n", "\n").replace("\r", "\n") -for sect in data_in.split("\n---"): - if "@craft armor" in sect: - sect = "---{}".format(sect) - for li in sect.split("\n"): - if li.startswith("--"): - craft = "{}\n{}".format(craft, li) - -outfile = os.path.join(d_ldoc, "crafting.luadoc") - -buffer = codecs.open(outfile, "w", "utf-8") -if not buffer: - print("ERROR: could not open file for writing: {}".format(outfile)) - sys.exit(errno.EIO) - -buffer.write("\n--- 3D Armor Crafting\n--\n-- @topic crafting\n\n{}\n".format(craft)) -buffer.close() - -print("crafts exported to\t{}".format(outfile)) diff --git a/mods/3d_armor/.luacheckrc b/mods/3d_armor/.luacheckrc index 88349afc..6b769d66 100644 --- a/mods/3d_armor/.luacheckrc +++ b/mods/3d_armor/.luacheckrc @@ -18,6 +18,7 @@ read_globals = { -- deps "default", + "player_api", "minetest", "unified_inventory", "wardrobe", diff --git a/mods/3d_armor/3d_armor/LICENSE.txt b/mods/3d_armor/3d_armor/LICENSE.txt deleted file mode 100644 index f253f299..00000000 --- a/mods/3d_armor/3d_armor/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -[mod] 3d Armor [3d_armor] -========================= - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -License Textures ----------------- - -Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0 diff --git a/mods/3d_armor/3d_armor/README.md b/mods/3d_armor/3d_armor/README.md index 32fc07ef..b023784a 100644 --- a/mods/3d_armor/3d_armor/README.md +++ b/mods/3d_armor/3d_armor/README.md @@ -6,7 +6,7 @@ |-[Armor Configuration](#armor-configuration) |||- - [3d_Armor Item Storage](#3d_armor-item-storage) |- - [disable_specific_materials](#to-disable-individual-armor-materials) |||- - [Armor Registration](#armor-registration) |- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups) -|- - [armor_init_times](#number-of-initialization-attempts) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor) +|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor) |- - [armor_bones_delay](#armor-not-in-bones-due-to-server-lag) |||- - - [Elements](#elements) |- - [armor_update_time](#how-often-player-armor-items-are-updated) |||- - - [Attributes](#attributes) |- - [armor_drop](#drop-armor-when-a-player-dies) |||- - - [Physics](#physics) @@ -19,7 +19,7 @@ |- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:remove_all](#armor-remove_all) |- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:equip](#armor-equip) |- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:unequip](#armor-unequip) -|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - - [armor:update_skin](#armor-update_skin) +| |||- - - [armor:update_skin](#armor-update_skin) |-[Credits](#credits) |||- - [Callbacks](#Callbacks) | |||- - - [Item callbacks](#item-callbacks) | |||- - - [Global callbacks](#global-callbacks) @@ -60,11 +60,6 @@ Change the following default settings by going to Main Menu>>Settings(Tab)>>All armor_init_delay = 2 -### Number of initialization attempts - **Increase to prevent glitches - Use in conjunction with armor_init_delay if initialization problems persist.** - - armor_init_times = 10 - ### Armor not in bones due to server lag **Increase to help resolve** @@ -254,7 +249,7 @@ The above allows armor to block/prevent new damage types but you also need to as ## Groups used by 3d_Armor 3d_armor has many default groups already registered, these are categorized under 4 main headings - **Elements:** armor_head, armor_torso, armor_legs, armor_feet - - **Attributes:** armor_heal, armor_fire, armor_water + - **Attributes:** armor_heal, armor_fire, armor_water, armor_feather - **Physics:** physics_jump, physics_speed, physics_gravity - **Durability:** armor_use, flammable @@ -334,6 +329,9 @@ The below Diamond chestplate has a 12% chance to completely block all damage (ar damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, }) +#### Armor_feather +***"Armor_feather"*** will slow a player when falling. This only has one level or state, which is armor_feather=1 + ### Physics The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability. diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua index 112d208d..065f1f9f 100644 --- a/mods/3d_armor/3d_armor/api.lua +++ b/mods/3d_armor/3d_armor/api.lua @@ -112,7 +112,7 @@ armor = { timer = 0, elements = {"head", "torso", "legs", "feet"}, physics = {"jump", "speed", "gravity"}, - attributes = {"heal", "fire", "water"}, + attributes = {"heal", "fire", "water", "feather"}, formspec = "image[2.5,0;2,4;armor_preview]".. default.gui_bg.. default.gui_bg_img.. @@ -162,7 +162,6 @@ armor = { armor.config = { init_delay = 2, - init_times = 10, bones_delay = 1, update_time = 1, drop = minetest.get_modpath("bones") ~= nil, @@ -183,6 +182,7 @@ armor.config = { water_protect = true, fire_protect = minetest.get_modpath("ethereal") ~= nil, fire_protect_torch = minetest.get_modpath("ethereal") ~= nil, + feather_fall = true, punch_damage = true, } @@ -352,7 +352,7 @@ armor.update_player_visuals = function(self, player) end local name = player:get_player_name() if self.textures[name] then - default.player_set_textures(player, { + player_api.set_textures(player, { self.textures[name].skin, self.textures[name].armor, self.textures[name].wielditem, @@ -373,7 +373,7 @@ armor.set_player_armor = function(self, player) local state = 0 local count = 0 local preview = armor:get_preview(name) - local texture = "3d_armor_trans.png" + local texture = "blank.png" local physics = {} local attributes = {} local levels = {} @@ -415,7 +415,7 @@ armor.set_player_armor = function(self, player) end -- DEPRECATED, use armor_groups instead if def.groups["armor_radiation"] and levels["radiation"] then - levels["radiation"] = def.groups["armor_radiation"] + levels["radiation"] = levels["radiation"] + def.groups["armor_radiation"] end end local item = stack:get_name() @@ -490,10 +490,13 @@ armor.set_player_armor = function(self, player) armor_monoid.monoid:add_change(player, change, "3d_armor:armor") else -- Preserve immortal group (damage disabled for player) - local immortal = player:get_armor_groups().immortal + local player_groups = player:get_armor_groups() + local immortal = player_groups.immortal if immortal and immortal ~= 0 then groups.immortal = 1 end + -- Preserve fall_damage_add_percent group (fall damage modifier) + groups.fall_damage_add_percent = player_groups.fall_damage_add_percent player:set_armor_groups(groups) end if use_player_monoids then @@ -627,6 +630,9 @@ end armor.damage = function(self, player, index, stack, use) local old_stack = ItemStack(stack) local worn_armor = armor:get_weared_armor_elements(player) + if not worn_armor then + return + end local armor_worn_cnt = 0 for k,v in pairs(worn_armor) do armor_worn_cnt = armor_worn_cnt + 1 @@ -677,6 +683,10 @@ armor.equip = function(self, player, itemstack) for i=1, armor_inv:get_size("armor") do local stack = armor_inv:get_stack("armor", i) if self:get_element(stack:get_name()) == armor_element then + --prevents equiping an armor that would unequip a cursed armor. + if minetest.get_item_group(stack:get_name(), "cursed") ~= 0 then + return itemstack + end index = i self:unequip(player, armor_element) break @@ -709,11 +719,14 @@ armor.unequip = function(self, player, armor_element) if self:get_element(stack:get_name()) == armor_element then armor_inv:set_stack("armor", i, "") minetest.after(0, function() - local inv = player:get_inventory() - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - minetest.add_item(player:get_pos(), stack) + local pplayer = minetest.get_player_by_name(name) + if pplayer then -- player is still online + local inv = pplayer:get_inventory() + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + minetest.add_item(pplayer:get_pos(), stack) + end end end) self:run_callbacks("on_unequip", player, i, stack) @@ -798,9 +811,6 @@ end -- @tparam[opt] bool listring Use `listring` formspec element (default: `false`). -- @treturn string Formspec formatted string. armor.get_armor_formspec = function(self, name, listring) - if armor.def[name].init_time == 0 then - return "label[0,0;Armor not initialized!]" - end local formspec = armor.formspec.. "list[detached:"..name.."_armor;armor;0,0.5;2,3;]" if listring == true then @@ -929,6 +939,10 @@ armor.get_valid_player = function(self, player, msg) minetest.log("warning", ("3d_armor%s: Player reference is nil"):format(msg)) return end + if type(player) ~= "userdata" then + -- Fake player, fail silently + return + end local name = player:get_player_name() if not name then minetest.log("warning", ("3d_armor%s: Player name is nil"):format(msg)) diff --git a/mods/3d_armor/3d_armor/armor.conf.example b/mods/3d_armor/3d_armor/armor.conf.example index af403968..ee63812a 100644 --- a/mods/3d_armor/3d_armor/armor.conf.example +++ b/mods/3d_armor/3d_armor/armor.conf.example @@ -35,10 +35,6 @@ ARMOR_FIRE_NODES = { -- Increase this if you get initialization glitches when a player first joins. ARMOR_INIT_DELAY = 1 --- Number of initialization attempts. --- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist. -ARMOR_INIT_TIMES = 1 - -- Increase this if armor is not getting into bones due to server lag. ARMOR_BONES_DELAY = 1 diff --git a/mods/3d_armor/3d_armor/armor.lua b/mods/3d_armor/3d_armor/armor.lua deleted file mode 100644 index 7a364ad7..00000000 --- a/mods/3d_armor/3d_armor/armor.lua +++ /dev/null @@ -1,1027 +0,0 @@ - ---- Registered armors. --- --- @topic armor - - --- support for i18n -local S = armor.get_translator - - ---- Admin Helmet --- --- @helmet 3d_armor:helmet_admin --- @img 3d_armor_inv_helmet_admin.png --- @grp armor_head 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp armor_water 1 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:helmet_admin", { - description = S("Admin Helmet"), - inventory_image = "3d_armor_inv_helmet_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Chestplate --- --- @chestplate 3d_armor:chestplate_admin --- @img 3d_armor_inv_chestplate_admin.png --- @grp armor_torso 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:chestplate_admin", { - description = S("Admin Chestplate"), - inventory_image = "3d_armor_inv_chestplate_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_torso=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Leggings --- --- @leggings 3d_armor:leggings_admin --- @img 3d_armor_inv_leggings_admin.png --- @grp armor_legs 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:leggings_admin", { - description = S("Admin Leggings"), - inventory_image = "3d_armor_inv_leggings_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_legs=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Boots --- --- @boots 3d_armor:boots_admin --- @img 3d_armor_inv_boots_admin.png --- @grp armor_feet 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:boots_admin", { - description = S("Admin Boots"), - inventory_image = "3d_armor_inv_boots_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_feet=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - -minetest.register_alias("adminboots", "3d_armor:boots_admin") -minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") -minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") -minetest.register_alias("adminleggings", "3d_armor:leggings_admin") - - ---- Wood --- --- Requires setting `armor_material_wood`. --- --- @section wood - -if armor.materials.wood then - --- Wood Helmet - -- - -- @helmet 3d_armor:helmet_wood - -- @img 3d_armor_inv_helmet_wood.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:helmet_wood", { - description = S("Wood Helmet"), - inventory_image = "3d_armor_inv_helmet_wood.png", - groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Chestplate - -- - -- @chestplate 3d_armor:chestplate_wood - -- @img 3d_armor_inv_chestplate_wood.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:chestplate_wood", { - description = S("Wood Chestplate"), - inventory_image = "3d_armor_inv_chestplate_wood.png", - groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Leggings - -- - -- @leggings 3d_armor:leggings_wood - -- @img 3d_armor_inv_leggings_wood.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @grp flammable 1 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:leggings_wood", { - description = S("Wood Leggings"), - inventory_image = "3d_armor_inv_leggings_wood.png", - groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Boots - -- - -- @boots 3d_armor:boots_wood - -- @img 3d_armor_inv_boots_wood.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:boots_wood", { - description = S("Wood Boots"), - inventory_image = "3d_armor_inv_boots_wood.png", - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, - }) - local wood_armor_fuel = { - helmet = 6, - chestplate = 8, - leggings = 7, - boots = 5 - } - for armor, burn in pairs(wood_armor_fuel) do - minetest.register_craft({ - type = "fuel", - recipe = "3d_armor:" .. armor .. "_wood", - burntime = burn, - }) - end -end - - ---- Cactus --- --- Requires setting `armor_material_cactus`. --- --- @section cactus - -if armor.materials.cactus then - --- Cactus Helmet - -- - -- @helmet 3d_armor:helmet_cactus - -- @img 3d_armor_inv_helmet_cactus.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:helmet_cactus", { - description = S("Cactus Helmet"), - inventory_image = "3d_armor_inv_helmet_cactus.png", - groups = {armor_head=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Chestplate - -- - -- @chestplate 3d_armor:chestplate_cactus - -- @img 3d_armor_inv_chestplate_cactus.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:chestplate_cactus", { - description = S("Cactus Chestplate"), - inventory_image = "3d_armor_inv_chestplate_cactus.png", - groups = {armor_torso=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Leggings - -- - -- @leggings 3d_armor:leggings_cactus - -- @img 3d_armor_inv_leggings_cactus.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:leggings_cactus", { - description = S("Cactus Leggings"), - inventory_image = "3d_armor_inv_leggings_cactus.png", - groups = {armor_legs=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Boots - -- - -- @boots 3d_armor:boots_cactus - -- @img 3d_armor_inv_boots_cactus.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:boots_cactus", { - description = S("Cactus Boots"), - inventory_image = "3d_armor_inv_boots_cactus.png", - groups = {armor_feet=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - local cactus_armor_fuel = { - helmet = 14, - chestplate = 16, - leggings = 15, - boots = 13 - } - for armor, burn in pairs(cactus_armor_fuel) do - minetest.register_craft({ - type = "fuel", - recipe = "3d_armor:" .. armor .. "_cactus", - burntime = burn, - }) - end -end - - ---- Steel --- --- Requires setting `armor_material_steel`. --- --- @section steel - -if armor.materials.steel then - --- Steel Helmet - -- - -- @helmet 3d_armor:helmet_steel - -- @img 3d_armor_inv_helmet_steel.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.01 - -- @grp physica_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_steel", { - description = S("Steel Helmet"), - inventory_image = "3d_armor_inv_helmet_steel.png", - groups = {armor_head=1, armor_heal=0, armor_use=800, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Chestplate - -- - -- @chestplate 3d_armor:chestplate_steel - -- @img 3d_armor_inv_chestplate_steel.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed - -- @grp physics_gravity - -- @armorgrp fleshy - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_steel", { - description = S("Steel Chestplate"), - inventory_image = "3d_armor_inv_chestplate_steel.png", - groups = {armor_torso=1, armor_heal=0, armor_use=800, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Leggings - -- - -- @leggings 3d_armor:leggings_steel - -- @img 3d_armor_inv_leggings_steel.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.03 - -- @grp physics_gravity 0.03 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_steel", { - description = S("Steel Leggings"), - inventory_image = "3d_armor_inv_leggings_steel.png", - groups = {armor_legs=1, armor_heal=0, armor_use=800, - physics_speed=-0.03, physics_gravity=0.03}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Boots - -- - -- @boots 3d_armor:boots_steel - -- @img 3d_armor_inv_boots_steel.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_steel", { - description = S("Steel Boots"), - inventory_image = "3d_armor_inv_boots_steel.png", - groups = {armor_feet=1, armor_heal=0, armor_use=800, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) -end - - ---- Bronze --- --- Requires setting `armor_material_bronze`. --- --- @section bronze - -if armor.materials.bronze then - --- Bronze Helmet - -- - -- @helmet 3d_armor:helmet_bronze - -- @img 3d_armor_inv_helmet_bronze.png - -- @grp armor_head 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_bronze", { - description = S("Bronze Helmet"), - inventory_image = "3d_armor_inv_helmet_bronze.png", - groups = {armor_head=1, armor_heal=6, armor_use=400, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Chestplate - -- - -- @chestplate 3d_armor:chestplate_bronze - -- @img 3d_armor_inv_chestplate_bronze.png - -- @grp armor_torso 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.04 - -- @grp physics_gravity 0.04 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_bronze", { - description = S("Bronze Chestplate"), - inventory_image = "3d_armor_inv_chestplate_bronze.png", - groups = {armor_torso=1, armor_heal=6, armor_use=400, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Leggings - -- - -- @leggings 3d_armor:leggings_bronze - -- @img 3d_armor_inv_leggings_bronze.png - -- @grp armor_legs 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.03 - -- @grp physics_gravity 0.03 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_bronze", { - description = S("Bronze Leggings"), - inventory_image = "3d_armor_inv_leggings_bronze.png", - groups = {armor_legs=1, armor_heal=6, armor_use=400, - physics_speed=-0.03, physics_gravity=0.03}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Boots - -- - -- @boots 3d_armor:boots_bronze - -- @img 3d_armor_inv_boots_bronze.png - -- @grp armor_feet 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_bronze", { - description = S("Bronze Boots"), - inventory_image = "3d_armor_inv_boots_bronze.png", - groups = {armor_feet=1, armor_heal=6, armor_use=400, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) -end - - ---- Diamond --- --- Requires setting `armor_material_diamond`. --- --- @section diamond - -if armor.materials.diamond then - --- Diamond Helmet - -- - -- @helmet 3d_armor:helmet_diamond - -- @img 3d_armor_inv_helmet_diamond.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_diamond", { - description = S("Diamond Helmet"), - inventory_image = "3d_armor_inv_helmet_diamond.png", - groups = {armor_head=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Chestplate - -- - -- @chestplate 3d_armor:chestplate_diamond - -- @img 3d_armor_inv_chestplate_diamond.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_diamond", { - description = S("Diamond Chestplate"), - inventory_image = "3d_armor_inv_chestplate_diamond.png", - groups = {armor_torso=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Leggings - -- - -- @leggings 3d_armor:leggings_diamond - -- @img 3d_armor_inv_leggings_diamond.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_diamond", { - description = S("Diamond Leggings"), - inventory_image = "3d_armor_inv_leggings_diamond.png", - groups = {armor_legs=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Boots - -- - -- @boots 3d_armor:boots_diamond - -- @img 3d_armor_inv_boots_diamond.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_diamond", { - description = S("Diamond Boots"), - inventory_image = "3d_armor_inv_boots_diamond.png", - groups = {armor_feet=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) -end - - ---- Gold --- --- Requires `armor_material_gold`. --- --- @section gold - -if armor.materials.gold then - --- Gold Helmet - -- - -- @helmet 3d_armor:helmet_gold - -- @img 3d_armor_inv_helmet_gold.png - -- @grp armor_head 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.02 - -- @grp physics_gravity 0.02 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_gold", { - description = S("Gold Helmet"), - inventory_image = "3d_armor_inv_helmet_gold.png", - groups = {armor_head=1, armor_heal=6, armor_use=300, - physics_speed=-0.02, physics_gravity=0.02}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Chestplate - -- - -- @chestplate 3d_armor:chestplate_gold - -- @img 3d_armor_inv_chestplate_gold.png - -- @grp armor_torso 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.05 - -- @grp physics_gravity 0.05 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_gold", { - description = S("Gold Chestplate"), - inventory_image = "3d_armor_inv_chestplate_gold.png", - groups = {armor_torso=1, armor_heal=6, armor_use=300, - physics_speed=-0.05, physics_gravity=0.05}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Leggings - -- - -- @leggings 3d_armor:leggings_gold - -- @img 3d_armor_inv_leggings_gold.png - -- @grp armor_legs 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.04 - -- @grp physics_gravity 0.04 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_gold", { - description = S("Gold Leggings"), - inventory_image = "3d_armor_inv_leggings_gold.png", - groups = {armor_legs=1, armor_heal=6, armor_use=300, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Boots - -- - -- @boots 3d_armor:boots_gold - -- @img 3d_armor_inv_boots_gold.png - -- @grp armor_feet 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.02 - -- @grp physics_gravity 0.02 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_gold", { - description = S("Gold Boots"), - inventory_image = "3d_armor_inv_boots_gold.png", - groups = {armor_feet=1, armor_heal=6, armor_use=300, - physics_speed=-0.02, physics_gravity=0.02}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) -end - - ---- Mithril --- --- Requires `armor_material_mithril`. --- --- @section mithril - -if armor.materials.mithril then - --- Mithril Helmet - -- - -- @helmet 3d_armor:helmet_mithril - -- @img 3d_armor_inv_helmet_mithril.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_mithril", { - description = S("Mithril Helmet"), - inventory_image = "3d_armor_inv_helmet_mithril.png", - groups = {armor_head=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Chestplate - -- - -- @chestplate 3d_armor:chestplate_mithril - -- @img 3d_armor_inv_chestplate_mithril.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_mithril", { - description = S("Mithril Chestplate"), - inventory_image = "3d_armor_inv_chestplate_mithril.png", - groups = {armor_torso=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Leggings - -- - -- @leggings 3d_armor:leggings_mithril - -- @img 3d_armor_inv_leggings_mithril.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_mithril", { - description = S("Mithril Leggings"), - inventory_image = "3d_armor_inv_leggings_mithril.png", - groups = {armor_legs=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Boots - -- - -- @boots 3d_armor:boots_mithril - -- @img 3d_armor_inv_boots_mithril.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_mithril", { - description = S("Mithril Boots"), - inventory_image = "3d_armor_inv_boots_mithril.png", - groups = {armor_feet=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) -end - - ---- Crystal --- --- Requires `armor_material_crystal`. --- --- @section crystal - -if armor.materials.crystal then - --- Crystal Helmet - -- - -- @helmet 3d_armor:helmet_crystal - -- @img 3d_armor_inv_helmet_crystal.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_crystal", { - description = S("Crystal Helmet"), - inventory_image = "3d_armor_inv_helmet_crystal.png", - groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Chestplate - -- - -- @chestplate 3d_armor:chestplate_crystal - -- @img 3d_armor_inv_chestplate_crystal.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_crystal", { - description = S("Crystal Chestplate"), - inventory_image = "3d_armor_inv_chestplate_crystal.png", - groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Leggings - -- - -- @leggings 3d_armor:leggings_crystal - -- @img 3d_armor_inv_leggings_crystal.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_crystal", { - description = S("Crystal Leggings"), - inventory_image = "3d_armor_inv_leggings_crystal.png", - groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Boots - -- - -- @boots 3d_armor:boots_crystal - -- @img 3d_armor_inv_boots_crystal.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp physics_speed 1 - -- @grp physics_jump 0.5 - -- @grp armor_fire 1 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_crystal", { - description = S("Crystal Boots"), - inventory_image = "3d_armor_inv_boots_crystal.png", - groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, - physics_jump=0.5, armor_fire=1}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) -end - - ---- Nether --- --- Requires `armor_material_nether`. --- --- @section nether - -if armor.materials.nether then - --- Nether Helmet - -- - -- @helmet 3d_armor:helmet_nether - -- @img 3d_armor_inv_helmet_nether.png - -- @grp armor_head 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 18 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_nether", { - description = S("Nether Helmet"), - inventory_image = "3d_armor_inv_helmet_nether.png", - groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=18}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Chestplate - -- - -- @chestplate 3d_armor:chestplate_nether - -- @img 3d_armor_inv_chestplate_nether.png - -- @grp armor_torso 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 25 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_nether", { - description = S("Nether Chestplate"), - inventory_image = "3d_armor_inv_chestplate_nether.png", - groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=25}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Leggings - -- - -- @leggings 3d_armor:leggings_nether - -- @img 3d_armor_inv_leggings_nether.png - -- @grp armor_legs 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 25 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_nether", { - description = S("Nether Leggings"), - inventory_image = "3d_armor_inv_leggings_nether.png", - groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=25}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Boots - -- - -- @boots 3d_armor:boots_nether - -- @img 3d_armor_inv_boots_nether.png - -- @grp armor_feet 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 18 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_nether", { - description = S("Nether Boots"), - inventory_image = "3d_armor_inv_boots_nether.png", - groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=18}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) -end - - ---- Crafting --- --- @section craft - ---- Craft recipes for helmets, chestplates, leggings, boots, & shields. --- --- @craft armor --- @usage --- Key: --- - m: material --- - wood: group:wood --- - cactus: default:cactus --- - steel: default:steel_ingot --- - bronze: default:bronze_ingot --- - diamond: default:diamond --- - gold: default:gold_ingot --- - mithril: moreores:mithril_ingot --- - crystal: ethereal:crystal_ingot --- - nether: nether:nether_ingot --- --- helmet: chestplate: leggings: --- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ --- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ --- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ --- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ --- --- boots: shield: --- ┌───┬───┬───┐ ┌───┬───┬───┐ --- │ │ │ │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ │ m │ │ --- └───┴───┴───┘ └───┴───┴───┘ - -for k, v in pairs(armor.materials) do - minetest.register_craft({ - output = "3d_armor:helmet_"..k, - recipe = { - {v, v, v}, - {v, "", v}, - {"", "", ""}, - }, - }) - minetest.register_craft({ - output = "3d_armor:chestplate_"..k, - recipe = { - {v, "", v}, - {v, v, v}, - {v, v, v}, - }, - }) - minetest.register_craft({ - output = "3d_armor:leggings_"..k, - recipe = { - {v, v, v}, - {v, "", v}, - {v, "", v}, - }, - }) - minetest.register_craft({ - output = "3d_armor:boots_"..k, - recipe = { - {v, "", v}, - {v, "", v}, - }, - }) -end diff --git a/mods/3d_armor/3d_armor/depends.txt b/mods/3d_armor/3d_armor/depends.txt deleted file mode 100644 index ef233db1..00000000 --- a/mods/3d_armor/3d_armor/depends.txt +++ /dev/null @@ -1,9 +0,0 @@ -default -player_monoids? -armor_monoid? -pova? -fire? -ethereal? -bakedclay? -moreores? -nether? diff --git a/mods/3d_armor/3d_armor/description.txt b/mods/3d_armor/3d_armor/description.txt deleted file mode 100644 index b0a9b0a5..00000000 --- a/mods/3d_armor/3d_armor/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds craftable armor that is visible to other players. diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua index 7577269f..6718b971 100644 --- a/mods/3d_armor/3d_armor/init.lua +++ b/mods/3d_armor/3d_armor/init.lua @@ -2,7 +2,6 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) local worldpath = minetest.get_worldpath() local last_punch_time = {} -local pending_players = {} local timer = 0 dofile(modpath.."/api.lua") @@ -99,17 +98,7 @@ for _, mod in pairs(skin_mods) do armor.set_skin_mod(mod) end end -if not minetest.get_modpath("moreores") then - armor.materials.mithril = nil -end -if not minetest.get_modpath("ethereal") then - armor.materials.crystal = nil -end -if not minetest.get_modpath("nether") then - armor.materials.nether = nil -end -dofile(modpath.."/armor.lua") -- Armor Initialization @@ -191,11 +180,7 @@ local function validate_armor_inventory(player) end local function init_player_armor(initplayer) - local name = initplayer:get_player_name() - local pos = initplayer:get_pos() - if not name or not pos then - return false - end + local name = assert(initplayer:get_player_name()) local armor_inv = minetest.create_detached_inventory(name.."_armor", { on_put = function(inv, listname, index, stack, player) validate_armor_inventory(player) @@ -234,6 +219,11 @@ local function init_player_armor(initplayer) if player:get_player_name() ~= name then return 0 end + --cursed items cannot be unequiped by the player + local is_cursed = minetest.get_item_group(stack:get_name(), "cursed") ~= 0 + if not minetest.is_creative_enabled(player) and is_cursed then + return 0 + end return stack:get_count() end, allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) @@ -261,7 +251,6 @@ local function init_player_armor(initplayer) end end armor.def[name] = { - init_time = minetest.get_gametime(), level = 0, state = 0, count = 0, @@ -279,8 +268,8 @@ local function init_player_armor(initplayer) local skin = armor:get_player_skin(name) armor.textures[name] = { skin = skin, - armor = "3d_armor_trans.png", - wielditem = "3d_armor_trans.png", + armor = "blank.png", + wielditem = "blank.png", preview = armor.default_skin.."_preview.png", } local texture_path = minetest.get_modpath("player_textures") @@ -294,17 +283,16 @@ local function init_player_armor(initplayer) end end armor:set_player_armor(initplayer) - return true end -- Armor Player Model -default.player_register_model("3d_armor_character.b3d", { +player_api.register_model("3d_armor_character.b3d", { animation_speed = 30, textures = { armor.default_skin..".png", - "3d_armor_trans.png", - "3d_armor_trans.png", + "blank.png", + "blank.png", }, animations = { stand = {x=0, y=79}, @@ -313,6 +301,10 @@ default.player_register_model("3d_armor_character.b3d", { mine = {x=189, y=198}, walk_mine = {x=200, y=219}, sit = {x=81, y=160}, + -- compatibility w/ the emote mod + wave = {x = 192, y = 196, override_local = true}, + point = {x = 196, y = 196, override_local = true}, + freeze = {x = 205, y = 205, override_local = true}, }, }) @@ -330,16 +322,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) minetest.register_on_joinplayer(function(player) - default.player_set_model(player, "3d_armor_character.b3d") - local player_name = player:get_player_name() - - minetest.after(0, function() - -- TODO: Added in 7566ecc - What's the prupose? - local pplayer = minetest.get_player_by_name(player_name) - if pplayer and init_player_armor(pplayer) == false then - pending_players[pplayer] = 0 - end - end) + player_api.set_model(player, "3d_armor_character.b3d") + init_player_armor(player) end) minetest.register_on_leaveplayer(function(player) @@ -348,7 +332,6 @@ minetest.register_on_leaveplayer(function(player) armor.def[name] = nil armor.textures[name] = nil end - pending_players[player] = nil end) if armor.config.drop == true or armor.config.destroy == true then @@ -361,9 +344,12 @@ if armor.config.drop == true or armor.config.destroy == true then for i=1, armor_inv:get_size("armor") do local stack = armor_inv:get_stack("armor", i) if stack:get_count() > 0 then - table.insert(drop, stack) - armor:run_callbacks("on_unequip", player, i, stack) - armor_inv:set_stack("armor", i, nil) + --soulbound armors remain equipped after death + if minetest.get_item_group(stack:get_name(), "soulbound") == 0 then + table.insert(drop, stack) + armor:run_callbacks("on_unequip", player, i, stack) + armor_inv:set_stack("armor", i, nil) + end end end armor:save_armor_inventory(player) @@ -399,8 +385,8 @@ if armor.config.drop == true or armor.config.destroy == true then end) end end) -else -- reset un-dropped armor and it's effects minetest.register_on_respawnplayer(function(player) + -- reset un-dropped armor and it's effects armor:set_player_armor(player) end) end @@ -409,10 +395,14 @@ if armor.config.punch_damage == true then minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities) local name = player:get_player_name() - local hit_ip = hitter:is_player() - if name and hit_ip and minetest.is_protected(player:get_pos(), "") then - return - elseif name then + if hitter then + local hit_ip = hitter:is_player() + if name and hit_ip and minetest.is_protected(player:get_pos(), "") then + return + end + end + + if name then armor:punch(player, hitter, time_from_last_punch, tool_capabilities) last_punch_time[name] = minetest.get_gametime() end @@ -420,43 +410,53 @@ if armor.config.punch_damage == true then end minetest.register_on_player_hpchange(function(player, hp_change, reason) - if player and reason.type ~= "drown" and reason.hunger == nil - and hp_change < 0 then - local name = player:get_player_name() - if name then - local heal = armor.def[name].heal - if heal >= math.random(100) then - hp_change = 0 - end - -- check if armor damage was handled by fire or on_punchplayer - local time = last_punch_time[name] or 0 - if time == 0 or time + 1 < minetest.get_gametime() then - armor:punch(player) - end + if not minetest.is_player(player) then + return hp_change + end + + if reason.type == "drown" or reason.hunger or hp_change >= 0 then + return hp_change + end + + local name = player:get_player_name() + local properties = player:get_properties() + local hp = player:get_hp() + if hp + hp_change < properties.hp_max then + local heal = armor.def[name].heal + if heal >= math.random(100) then + hp_change = 0 + end + -- check if armor damage was handled by fire or on_punchplayer + local time = last_punch_time[name] or 0 + if time == 0 or time + 1 < minetest.get_gametime() then + armor:punch(player) end end + return hp_change end, true) minetest.register_globalstep(function(dtime) timer = timer + dtime + + if armor.config.feather_fall == true then + for _,player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if armor.def[name].feather > 0 then + local vel_y = player:get_velocity().y + if vel_y < -0.5 then + vel_y = -(vel_y * 0.05) + player:add_velocity({x = 0, y = vel_y, z = 0}) + end + end + end + end + if timer <= armor.config.init_delay then return end timer = 0 - for player, count in pairs(pending_players) do - local remove = init_player_armor(player) == true - pending_players[player] = count + 1 - if remove == false and count > armor.config.init_times then - minetest.log("warning", S("3d_armor: Failed to initialize player")) - remove = true - end - if remove == true then - pending_players[player] = nil - end - end - -- water breathing protection, added by TenPlus1 if armor.config.water_protect == true then for _,player in pairs(minetest.get_connected_players()) do @@ -469,22 +469,14 @@ minetest.register_globalstep(function(dtime) end end) --- Fire Protection, added by TenPlus1. if armor.config.fire_protect == true then - -- override any hot nodes that do not already deal damage - for _, row in pairs(armor.fire_nodes) do - if minetest.registered_nodes[row[1]] then - local damage = minetest.registered_nodes[row[1]].damage_per_second - if not damage or damage == 0 then - minetest.override_item(row[1], {damage_per_second = row[3]}) - end - end - end -else - print ("[3d_armor] Fire Nodes disabled") -end -if armor.config.fire_protect == true then + -- make torches hurt + minetest.override_item("default:torch", {damage_per_second = 1}) + minetest.override_item("default:torch_wall", {damage_per_second = 1}) + minetest.override_item("default:torch_ceiling", {damage_per_second = 1}) + + -- check player damage for any hot nodes we may be protected against minetest.register_on_player_hpchange(function(player, hp_change, reason) if reason.type == "node_damage" and reason.node then @@ -493,9 +485,7 @@ if armor.config.fire_protect == true then local name = player:get_player_name() for _,igniter in pairs(armor.fire_nodes) do if reason.node == igniter[1] then - if armor.def[name].fire < igniter[2] then - armor:punch(player, "fire") - else + if armor.def[name].fire >= igniter[2] then hp_change = 0 end end diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.de.tr b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr index 82389192..f5190774 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.de.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor : Abgetrennter Rüstungsbestand ist nicht gesetzt: @1 -3d_armor: Player name is nil @1=3d_armor : Spielername ist nicht gesetzt: @1 -3d_armor: Player reference is nil @1=3d_armor : Spielerreferenz ist nicht gesetzt: @1 - -### armor.lua ### - -Admin Boots=Adminstiefel -Admin Chestplate=Adminbrustplatte -Admin Helmet=Adminhelm -Admin Leggings=Adminhose -Bronze Boots=Bronzestiefel -Bronze Chestplate=Bronzebrustplatte -Bronze Helmet=Bronzehelm -Bronze Leggings=Bronzehose -Cactus Boots=Kaktusstiefel -Cactus Chestplate=Kaktusbrustplatte -Cactus Helmet=Kaktushelm -Cactus Leggings=Kaktushose -Crystal Boots=Kristallstiefel -Crystal Chestplate=Kristallbrustplatte -Crystal Helmet=Kristallhelm -Crystal Leggings=Kristallhose -Nether Boots=Netherstiefel -Nether Chestplate=Netherbrustplatte -Nether Helmet=Netherhelm -Nether Leggings=Netherhose -Diamond Boots=Diamantstiefel -Diamond Chestplate=Diamantbrustplatte -Diamond Helmet=Diamanthelm -Diamond Leggings=Diamanthose -Gold Boots=Goldstiefel -Gold Chestplate=Goldbrustplatte -Gold Helmet=Goldhelm -Gold Leggings=Goldhose -Mithril Boots=Mithrilstiefel -Mithril Chestplate=Mithrilbrustplatte -Mithril Helmet=Mithrilhelm -Mithril Leggings=Mithrilhose -Steel Boots=Stahlstiefel -Steel Chestplate=Stahlbrustplatte -Steel Helmet=Stahlhelm -Steel Leggings=Stahlhose -Wood Boots=Holzstiefel -Wood Chestplate=Holzbrustplatte -Wood Helmet=Holzhelm -Wood Leggings=Holzhose - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor : Initialisierung des Spielers fehlgeschlagen -Fire=Feuer -Heal=Heilen +Radiation=Strahlung Level=Stufe -Radiation=Strahlen -Your @1 got destroyed!=Deine @1 wurde zerstört! -Your @1 is almost broken!=Deine @1 ist fast kaputt! -[3d_armor] Fire Nodes disabled=[3d_armor] Feuer-Knoten deaktiviert +Heal=Heilung +Fire=Feuer +Your @1 is almost broken!=@1 ist fast kaputt! +Your @1 got destroyed!=@1 wurde zerstört! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr new file mode 100644 index 00000000..e3e1a2df --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiado +Level=Nivelo +Heal=Blokŝanco +Fire=Fajro +Your @1 is almost broken!=Via @1 estas preskaŭ rompita! +Your @1 got destroyed!=Via @1 detruiĝis! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.es.tr b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr index 61ff5f98..cf79d05e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.es.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: La armadura desconectada es nula @1 -3d_armor: Player name is nil @1=3d_armor: El nombre del jugador es nulo @1 -3d_armor: Player reference is nil @1=3d_armor: La referencia del jugador es nula @1 - -### armor.lua ### - -Admin Boots=Botas de admin -Admin Chestplate=Peto de admin -Admin Helmet=Casco de admin -Admin Leggings=Grebas de admin -Bronze Boots=Botas de bronce -Bronze Chestplate=Peto de bronce -Bronze Helmet=Casco de bronce -Bronze Leggings=Grebas de bronce -Cactus Boots=Botas de cactus -Cactus Chestplate=Peto de cactus -Cactus Helmet=Casco de cactus -Cactus Leggings=Grebas de cactus -Crystal Boots=Botas de cristal -Crystal Chestplate=Peto de cristal -Crystal Helmet=Casco de cristal -Crystal Leggings=Grebas de cristal -Nether Boots=Botas de nether -Nether Chestplate=Peto de nether -Nether Helmet=Casco de nether -Nether Leggings=Grebas de nether -Diamond Boots=Botas de diamante -Diamond Chestplate=Peto de diamante -Diamond Helmet=Casco de diamante -Diamond Leggings=Grebas de diamante -Gold Boots=Botas de oro -Gold Chestplate=Peto de oro -Gold Helmet=Casco de oro -Gold Leggings=Grebas de oro -Mithril Boots=Botas de mitrilo -Mithril Chestplate=Peto de mitrilo -Mithril Helmet=Casco de mitrilo -Mithril Leggings=Grebas de mitrilo -Steel Boots=Botas de acero -Steel Chestplate=Peto de acero -Steel Helmet=Casco de acero -Steel Leggings=Grebas de acero -Wood Boots=Botas de madera -Wood Chestplate=Peto de madera -Wood Helmet=Casco de madera -Wood Leggings=Grebas de madera - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Fallo en la inicialización del jugador -Fire=Fuego -Heal=Salud -Level=Nivel Radiation=Radiación -Your @1 got destroyed!=¡Tu @1 fue destruído! +Level=Nivel +Heal=Salud +Fire=Fuego Your @1 is almost broken!=¡Tu @1 esta a punto de romperse! -[3d_armor] Fire Nodes disabled=[3d_armor] Nodos de fuego desabilitados +Your @1 got destroyed!=¡Tu @1 fue destruído! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr index 458fb153..5d2a4fa0 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor : Inventaire détaché pour l'armure non trouvé @1 -3d_armor: Player name is nil @1=3d_armor : Nom du joueur non trouvé @1 -3d_armor: Player reference is nil @1=3d_armor : Référence au joueur non trouvée @1 - -### armor.lua ### - -Admin Boots=Bottes d'admin -Admin Chestplate=Cuirasse d'admin -Admin Helmet=Casque d'admin -Admin Leggings=Jambières d'admin -Bronze Boots=Bottes en bronze -Bronze Chestplate=Cuirasse en bronze -Bronze Helmet=Casque en bronze -Bronze Leggings=Jambières en bronze -Cactus Boots=Bottes en cactus -Cactus Chestplate=Cuirasse en cactus -Cactus Helmet=Casque en cactus -Cactus Leggings=Jambières en cactus -Crystal Boots=Bottes en cristal -Crystal Chestplate=Cuirasse en cristal -Crystal Helmet=Casque en cristal -Crystal Leggings=Jambières en cristal -Nether Boots=Bottes en nether -Nether Chestplate=Cuirasse en nether -Nether Helmet=Casque en nether -Nether Leggings=Jambières en nether -Diamond Boots=Bottes en diamant -Diamond Chestplate=Cuirasse en diamant -Diamond Helmet=Casque en diamant -Diamond Leggings=Jambières en diamant -Gold Boots=Bottes en or -Gold Chestplate=Cuirasse en or -Gold Helmet=Casque en or -Gold Leggings=Jambières en or -Mithril Boots=Bottes en mithril -Mithril Chestplate=Cuirasse en mithril -Mithril Helmet=Casque en mithril -Mithril Leggings=Jambières en mithril -Steel Boots=Bottes en acier -Steel Chestplate=Cuirasse en acier -Steel Helmet=Casque en acier -Steel Leggings=Jambières en acier -Wood Boots=Bottes en bois -Wood Chestplate=Cuirasse en bois -Wood Helmet=Casque en bois -Wood Leggings=Jambières en bois - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor : Impossible d'initialiser le joueur -Fire=Fire -Heal=Soins -Level=Niveau Radiation=Radiation -Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! +Level=Niveau +Heal=Soins +Fire=Fire Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 ! -[3d_armor] Fire Nodes disabled=[3d_armor] Nœuds de type feu désactivés +Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.it.tr b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr index fbbd45be..8d1184d9 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.it.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: L'inventario separato dell'armatura è nullo @1 -3d_armor: Player name is nil @1=3d_armor: Il nome dell'utente è nullo @1 -3d_armor: Player reference is nil @1=3d_armor: Il riferimento all'utente è nullo @1 - -### armor.lua ### - -Admin Boots=Stivali dell'amministratrice/tore -Admin Chestplate=Corazza dell'amministratrice/tore -Admin Helmet=Elmo dell'amministratrice/tore -Admin Leggings=Gambali dell'amministratrice/tore -Bronze Boots=Stivali di bronzo -Bronze Chestplate=Corazza di bronzo -Bronze Helmet=Elmo di bronzo -Bronze Leggings=Gambali di bronzo -Cactus Boots=Stivali di cactus -Cactus Chestplate=Corazza di cactus -Cactus Helmet=Elmo di cactus -Cactus Leggings=Gambali di cactus -Crystal Boots=Stivali di cristallo -Crystal Chestplate=Corazza di cristallo -Crystal Helmet=Elmo di cristallo -Crystal Leggings=Gambali di cristallo -Nether Boots=Stivali di nether -Nether Chestplate=Corazza di nether -Nether Helmet=Elmo di nether -Nether Leggings=Gambali di nether -Diamond Boots=Stivali di diamante -Diamond Chestplate=Corazza di diamante -Diamond Helmet=Elmo di diamante -Diamond Leggings=Gambali di diamante -Gold Boots=Stivali d'oro -Gold Chestplate=Corazza d'oro -Gold Helmet=Elmo d'oro -Gold Leggings=Gambali d'oro -Mithril Boots=Stivali di mithril -Mithril Chestplate=Corazza di mithril -Mithril Helmet=Elmo di mithril -Mithril Leggings=Gambali di mithril -Steel Boots=Stivali d'acciaio -Steel Chestplate=Corazza d'acciaio -Steel Helmet=Elmo d'acciaio -Steel Leggings=Gambali d'acciaio -Wood Boots=Stivali di legno -Wood Chestplate=Corazza di legno -Wood Helmet=Elmo di legno -Wood Leggings=Gambali di legno - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Inizializzazione dell'utente fallita -Fire=Fuoco -Heal=Guarigione -Level=Livello Radiation=Radiazione -Your @1 got destroyed!=@1 in frantumi! +Level=Livello +Heal=Guarigione +Fire=Fuoco Your @1 is almost broken!=@1 quasi in frantumi! -[3d_armor] Fire Nodes disabled=[3d_armor] Nodi fuoco disabilitati - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod caricata ma inutilizzata. -Back=Indietro -Armor=Armatura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod caricata ma inutilizzata. -Armor stand top=Parte superiore del supporto per armatura -Armor stand=Supporto per armatura -Armor Stand=Supporto per armatura -Locked Armor stand=Supporto per armatura chiuso a chiave -Armor Stand (owned by @1)=Supporto per armatura (di proprietà di @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod caricata ma inutilizzata. -3d Armor=Armatura 3D -Armor not initialized!=Armatura non inizializzata! -Admin Shield=Scudo dell'amministratrice/tore -Wooden Shield=Scudo di legno -Enhanced Wood Shield=Scudo di legno migliorato -Cactus Shield=Scudo di cactus -Enhanced Cactus Shield=Scudo di cactus migliorato -Steel Shield=Scudo d'acciaio -Bronze Shield=Scudo di bronzo -Diamond Shield=Scudo di diamante -Gold Shield=Scudo d'oro -Mithril Shield=Scudo di mithril -Crystal Shield=Scudo di cristallo -Nether Shield=Scudo di nether +Your @1 got destroyed!=@1 in frantumi! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr index dab20123..8d55a24f 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventori perisai terpisah tiada nilai @1 -3d_armor: Player name is nil @1=3d_armor: Nama pemain tiada nilai @1 -3d_armor: Player reference is nil @1=3d_armor: Rujukan pemain tiada nilai @1 - -### armor.lua ### - -Admin Boots=But Pentadbir -Admin Chestplate=Perisai Dada Pentadbir -Admin Helmet=Helmet Pentadbir -Admin Leggings=Perisai Kaki Pentadbir -Bronze Boots=But Gangsa -Bronze Chestplate=Perisai Dada Gangsa -Bronze Helmet=Helmet Gangsa -Bronze Leggings=Perisai Kaki Gangsa -Cactus Boots=But Kaktus -Cactus Chestplate=Perisai Dada Kaktus -Cactus Helmet=Helmet Kaktus -Cactus Leggings=Perisai Kaki Kaktus -Crystal Boots=But Kristal -Crystal Chestplate=Perisai Dada Kristal -Crystal Helmet=Helmet Kristal -Crystal Leggings=Perisai Kaki Kristal -Nether Boots=But Nether -Nether Chestplate=Perisai Dada Nether -Nether Helmet=Helmet Nether -Nether Leggings=Perisai Kaki Nether -Diamond Boots=But Intan -Diamond Chestplate=Perisai Dada Intan -Diamond Helmet=Helmet Intan -Diamond Leggings=Perisai Kaki Intan -Gold Boots=But Emas -Gold Chestplate=Perisai Dada Emas -Gold Helmet=Helmet Emas -Gold Leggings=Perisai Kaki Emas -Mithril Boots=But Mithril -Mithril Chestplate=Perisai Dada Mithril -Mithril Helmet=Helmet Mithril -Mithril Leggings=Perisai Kaki Mithril -Steel Boots=But Keluli -Steel Chestplate=Perisai Dada Keluli -Steel Helmet=Helmet Keluli -Steel Leggings=Perisai Kaki Keluli -Wood Boots=But Kayu -Wood Chestplate=Perisai Dada Kayu -Wood Helmet=Helmet Kayu -Wood Leggings=Perisai Kaki Kayu - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Gagal mengasalkan pemain -Fire=Api -Heal=Pulih -Level=Tahap Radiation=Radiasi -Your @1 got destroyed!=@1 anda telah musnah! +Level=Tahap +Heal=Pulih +Fire=Api Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nod-nod Api dilumpuhkan - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mods dimuatkan tetapi tidak digunakan. -Back=Kembali -Armor=Perisai -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan. -Armor stand top=Bhg atas dirian perisai -Armor stand=Dirian perisai -Armor Stand=Dirian Perisai -Locked Armor stand=Dirian perisai Berkunci -Armor Stand (owned by @1)=Dirian Perisai (milik @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mods dimuatkan tetapi tidak digunakan. -3d Armor=Perisai 3d -Armor not initialized!=Perisai tidak diasalkan! -Admin Shield=Perisai Pegang Pentadbir -Wooden Shield=Perisai Pegang Kayu -Enhanced Wood Shield=Perisai Pegang Kayu Kukuh -Cactus Shield=Perisai Pegang Kaktus -Enhanced Cactus Shield=Perisai Pegang Kaktus Kukuh -Steel Shield=Perisai Pegang Keluli -Bronze Shield=Perisai Pegang Gangsa -Diamond Shield=Perisai Pegang Intan -Gold Shield=Perisai Pegang Emas -Mithril Shield=Perisai Pegang Mithril -Crystal Shield=Perisai Pegang Kristal -Nether Shield=Perisai Pegang Nether +Your @1 got destroyed!=@1 anda telah musnah! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr new file mode 100644 index 00000000..2e3815b2 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Promieniowanie +Level=Poziom +Heal=Uzdrawianie +Fire=Ogień +Your @1 is almost broken!=Twój @1 jest prawie zepsuty! +Your @1 got destroyed!=Twój @1 został zniszczony! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr index e9e296ed..4ccba88e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 -3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 -3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 - -### armor.lua ### - -Admin Boots=Botas de Administrador -Admin Chestplate=Peitoral de Administrador -Admin Helmet=Capacete de Administrador -Admin Leggings=Calças de Administrador -Bronze Boots=Botas de Bronze -Bronze Chestplate=Peitoral de Bronze -Bronze Helmet=Capacete de Bronze -Bronze Leggings=Calças de Bronze -Cactus Boots=Botas de Madeira -Cactus Chestplate=Peitoral de Cacto -Cactus Helmet=Capacete de Cacto -Cactus Leggings=Calças de Cacto -Crystal Boots=Botas de Cristal -Crystal Chestplate=Peitoral de Cristal -Crystal Helmet=Capacete de Cristal -Crystal Leggings=Calças de Cristal -Nether Boots=Botas de Nether -Nether Chestplate=Peitoral de Nether -Nether Helmet=Capacete de Nether -Nether Leggings=Calças de Nether -Diamond Boots=Botas de Diamante -Diamond Chestplate=Peitoral de Diamante -Diamond Helmet=Capacete de Diamante -Diamond Leggings=Calças de Diamante -Gold Boots=Botas de Ouro -Gold Chestplate=Peitoral de Ouro -Gold Helmet=Capacete de Ouro -Gold Leggings=Calças de Ouro -Mithril Boots=Botas de Mithril -Mithril Chestplate=Peitoral de Mithril -Mithril Helmet=Capacete de Mithril -Mithril Leggings=Calças de Mithril -Steel Boots=Botas de Aço -Steel Chestplate=Peitoral de Aço -Steel Helmet=Capacete de Aço -Steel Leggings=Calças de Aço -Wood Boots=Botas de Madeira -Wood Chestplate=Peitoral de Madeira -Wood Helmet=Capacete de Madeira -Wood Leggings=Calças de Madeira - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador -Fire=Fogo -Heal=Saúde -Level=Nível Radiation=Radiação -Your @1 got destroyed!=@1 foi destruído(a)! +Level=Nível +Heal=Saúde +Fire=Fogo Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. -Back=Voltar -Armor=Armadura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. -Armor stand top=Topo de estande de armadura -Armor stand=Estande de armadura -Armor Stand=Estande de Armadura -Locked Armor stand=Estande de Armadura Trancada -Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. -3d Armor=3d Armor -Armor not initialized!=Armadura não inicializada! -Admin Shield=Escudo de Administrador -Wooden Shield=Escudo de Madeira -Enhanced Wood Shield=Escudo de Madeira Melhorado -Cactus Shield=Escudo de Cacto -Enhanced Cactus Shield=Escudo de Cacto Melhorado -Steel Shield=Escudo de Aço -Bronze Shield=Escudo de Bronze -Diamond Shield=Escudo de Diamante -Gold Shield=Escudo de Ouro -Mithril Shield=Escudo de Mithril -Crystal Shield=Escudo de Cristal -Nether Shield=Escudo de Nether +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr index e9e296ed..4ccba88e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 -3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 -3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 - -### armor.lua ### - -Admin Boots=Botas de Administrador -Admin Chestplate=Peitoral de Administrador -Admin Helmet=Capacete de Administrador -Admin Leggings=Calças de Administrador -Bronze Boots=Botas de Bronze -Bronze Chestplate=Peitoral de Bronze -Bronze Helmet=Capacete de Bronze -Bronze Leggings=Calças de Bronze -Cactus Boots=Botas de Madeira -Cactus Chestplate=Peitoral de Cacto -Cactus Helmet=Capacete de Cacto -Cactus Leggings=Calças de Cacto -Crystal Boots=Botas de Cristal -Crystal Chestplate=Peitoral de Cristal -Crystal Helmet=Capacete de Cristal -Crystal Leggings=Calças de Cristal -Nether Boots=Botas de Nether -Nether Chestplate=Peitoral de Nether -Nether Helmet=Capacete de Nether -Nether Leggings=Calças de Nether -Diamond Boots=Botas de Diamante -Diamond Chestplate=Peitoral de Diamante -Diamond Helmet=Capacete de Diamante -Diamond Leggings=Calças de Diamante -Gold Boots=Botas de Ouro -Gold Chestplate=Peitoral de Ouro -Gold Helmet=Capacete de Ouro -Gold Leggings=Calças de Ouro -Mithril Boots=Botas de Mithril -Mithril Chestplate=Peitoral de Mithril -Mithril Helmet=Capacete de Mithril -Mithril Leggings=Calças de Mithril -Steel Boots=Botas de Aço -Steel Chestplate=Peitoral de Aço -Steel Helmet=Capacete de Aço -Steel Leggings=Calças de Aço -Wood Boots=Botas de Madeira -Wood Chestplate=Peitoral de Madeira -Wood Helmet=Capacete de Madeira -Wood Leggings=Calças de Madeira - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador -Fire=Fogo -Heal=Saúde -Level=Nível Radiation=Radiação -Your @1 got destroyed!=@1 foi destruído(a)! +Level=Nível +Heal=Saúde +Fire=Fogo Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. -Back=Voltar -Armor=Armadura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. -Armor stand top=Topo de estande de armadura -Armor stand=Estande de armadura -Armor Stand=Estande de Armadura -Locked Armor stand=Estande de Armadura Trancada -Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. -3d Armor=3d Armor -Armor not initialized!=Armadura não inicializada! -Admin Shield=Escudo de Administrador -Wooden Shield=Escudo de Madeira -Enhanced Wood Shield=Escudo de Madeira Melhorado -Cactus Shield=Escudo de Cacto -Enhanced Cactus Shield=Escudo de Cacto Melhorado -Steel Shield=Escudo de Aço -Bronze Shield=Escudo de Bronze -Diamond Shield=Escudo de Diamante -Gold Shield=Escudo de Ouro -Mithril Shield=Escudo de Mithril -Crystal Shield=Escudo de Cristal -Nether Shield=Escudo de Nether +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr index b817c79e..afbc441a 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr @@ -1,85 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Отдельный инвентарь брони является nil @1 -3d_armor: Player name is nil @1=3d_armor: Имя игрока является nil @1 -3d_armor: Player reference is nil @1=3d_armor: Ссылка игрока является nil @1 - -### armor.lua ### - -Admin Boots=ботинки админа -Admin Chestplate=бронежилет админа -Admin Helmet=шлем админа -Admin Leggings=гамаши админа -Bronze Boots=бронзовые ботинки -Bronze Chestplate=бронзовый бронежилет -Bronze Helmet=бронзовый шлем -Bronze Leggings=бронзовые гамаши -Cactus Boots=кактусовые ботинки -Cactus Chestplate=кактусовый бронежилет -Cactus Helmet=кактусовый шлем -Cactus Leggings=кактусовые гамаши -Crystal Boots=кристалловые ботинки -Crystal Chestplate=кристалловый бронежилет -Crystal Helmet=кристалловый шлем -Crystal Leggings=кристалловые гамаши -Diamond Boots=алмазные ботинки -Diamond Chestplate=алмазный бронежилет -Diamond Helmet=алмазный шлем -Diamond Leggings=алмазные гамаши -Gold Boots=золотые ботинки -Gold Chestplate=золотой бронежилет -Gold Helmet=золотой шлем -Gold Leggings=золотые гамаши -Mithril Boots=мифриловые ботинки -Mithril Chestplate=мифриловый бронежилет -Mithril Helmet=мифриловый шлем -Mithril Leggings=мифриловые гамаши -Steel Boots=стальные ботинки -Steel Chestplate=стальной бронежилет -Steel Helmet=стальной шлем -Steel Leggings=стальные гамаши -Wood Boots=деревянные ботинки -Wood Chestplate=деревянный бронежилет -Wood Helmet=деревянный шлем -Wood Leggings=деревянные гамаши - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: не смог подготовить игрока -Fire=огонь -Heal=исцеление -Level=уровень Radiation=излучение -Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)! +Level=уровень +Heal=исцеление +Fire=огонь Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] блоки огня отключены - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: мод загружен но не используется. -Back=назад -Armor=бронь -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: мод загружен но не используется. -Armor stand top=стойка для брони (верх) -Armor stand=стойка для брони -Armor Stand=стойка для брони -Locked Armor stand=защищенная стойка для брони -Armor Stand (owned by @1)=стойка для брони (принадлежит @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: мод загружен но не используется. -3d Armor=3D бронь -Armor not initialized!=бронь не подготовлена! -Admin Shield=щит админа -Wooden Shield=деревянный щит -Enhanced Wood Shield=улучшенный деревянный щит -Cactus Shield=кактусный щит -Enhanced Cactus Shield=улучшенный кактусный щит -Steel Shield=стальной щит -Bronze Shield=бронзовый щит -Diamond Shield=алмазный щит -Gold Shield=золотой щит -Mithril Shield=мифриловый щит -Crystal Shield=кристалловый щит +Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr new file mode 100644 index 00000000..08b7ee1e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Strålning +Level=Nivå +Heal=Läkning +Fire=Eld +Your @1 is almost broken!=Din @1 är nästan förstörd! +Your @1 got destroyed!=Din @1 blev förstörd! diff --git a/mods/3d_armor/3d_armor/locale/template.txt b/mods/3d_armor/3d_armor/locale/template.txt index 0898a63d..5e4e65c1 100644 --- a/mods/3d_armor/3d_armor/locale/template.txt +++ b/mods/3d_armor/3d_armor/locale/template.txt @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1= -3d_armor: Player name is nil @1= -3d_armor: Player reference is nil @1= - -### armor.lua ### - -Admin Boots= -Admin Chestplate= -Admin Helmet= -Admin Leggings= -Bronze Boots= -Bronze Chestplate= -Bronze Helmet= -Bronze Leggings= -Cactus Boots= -Cactus Chestplate= -Cactus Helmet= -Cactus Leggings= -Crystal Boots= -Crystal Chestplate= -Crystal Helmet= -Crystal Leggings= -Nether Boots= -Nether Chestplate= -Nether Helmet= -Nether Leggings= -Diamond Boots= -Diamond Chestplate= -Diamond Helmet= -Diamond Leggings= -Gold Boots= -Gold Chestplate= -Gold Helmet= -Gold Leggings= -Mithril Boots= -Mithril Chestplate= -Mithril Helmet= -Mithril Leggings= -Steel Boots= -Steel Chestplate= -Steel Helmet= -Steel Leggings= -Wood Boots= -Wood Chestplate= -Wood Helmet= -Wood Leggings= - -### init.lua ### - -3d_armor: Failed to initialize player= -Fire= -Heal= -Level= Radiation= -Your @1 got destroyed!= +Level= +Heal= +Fire= Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled= +Your @1 got destroyed!= diff --git a/mods/3d_armor/3d_armor/mod.conf b/mods/3d_armor/3d_armor/mod.conf index 9d2cc681..167c2a18 100644 --- a/mods/3d_armor/3d_armor/mod.conf +++ b/mods/3d_armor/3d_armor/mod.conf @@ -1,4 +1,5 @@ name = 3d_armor -depends = default -optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores, nether +depends = default, player_api +optional_depends = player_monoids, armor_monoid, pova, moreores description = Adds craftable armor that is visible to other players. +min_minetest_version = 5.0 diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png deleted file mode 100644 index 4a31242b..00000000 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png and /dev/null differ diff --git a/mods/3d_armor/3d_armor/textures/preview_index.txt b/mods/3d_armor/3d_armor/textures/preview_index.txt deleted file mode 100644 index 5b08da84..00000000 --- a/mods/3d_armor/3d_armor/textures/preview_index.txt +++ /dev/null @@ -1,49 +0,0 @@ -3d_armor/textures/3d_armor_helmet_wood.png:head -3d_armor/textures/3d_armor_chestplate_wood.png:torso -3d_armor/textures/3d_armor_leggings_wood.png:legs -3d_armor/textures/3d_armor_boots_wood.png:feet - -3d_armor/textures/3d_armor_helmet_cactus.png:head -3d_armor/textures/3d_armor_chestplate_cactus.png:torso -3d_armor/textures/3d_armor_leggings_cactus.png:legs -3d_armor/textures/3d_armor_boots_cactus.png:feet - -3d_armor/textures/3d_armor_helmet_steel.png:head -3d_armor/textures/3d_armor_chestplate_steel.png:torso -3d_armor/textures/3d_armor_leggings_steel.png:legs -3d_armor/textures/3d_armor_boots_steel.png:feet - -3d_armor/textures/3d_armor_helmet_bronze.png:head -3d_armor/textures/3d_armor_chestplate_bronze.png:torso -3d_armor/textures/3d_armor_leggings_bronze.png:legs -3d_armor/textures/3d_armor_boots_bronze.png:feet - -3d_armor/textures/3d_armor_helmet_gold.png:head -3d_armor/textures/3d_armor_chestplate_gold.png:torso -3d_armor/textures/3d_armor_leggings_gold.png:legs -3d_armor/textures/3d_armor_boots_gold.png:feet - -3d_armor/textures/3d_armor_helmet_diamond.png:head -3d_armor/textures/3d_armor_chestplate_diamond.png:torso -3d_armor/textures/3d_armor_leggings_diamond.png:legs -3d_armor/textures/3d_armor_boots_diamond.png:feet - -3d_armor/textures/3d_armor_helmet_mithril.png:head -3d_armor/textures/3d_armor_chestplate_mithril.png:torso -3d_armor/textures/3d_armor_leggings_mithril.png:legs -3d_armor/textures/3d_armor_boots_mithril.png:feet - -3d_armor/textures/3d_armor_helmet_crystal.png:head -3d_armor/textures/3d_armor_chestplate_crystal.png:torso -3d_armor/textures/3d_armor_leggings_crystal.png:legs -3d_armor/textures/3d_armor_boots_crystal.png:feet - -3d_armor/textures/3d_armor_helmet_nether.png:head -3d_armor/textures/3d_armor_chestplate_nether.png:torso -3d_armor/textures/3d_armor_leggings_nether.png:legs -3d_armor/textures/3d_armor_boots_nether.png:feet - -3d_armor/textures/3d_armor_helmet_admin.png:head -3d_armor/textures/3d_armor_chestplate_admin.png:torso -3d_armor/textures/3d_armor_leggings_admin.png:legs -3d_armor/textures/3d_armor_boots_admin.png:feet diff --git a/mods/3d_armor/3d_armor_ip/LICENSE.txt b/mods/3d_armor/3d_armor_ip/LICENSE.txt deleted file mode 100644 index b924ac07..00000000 --- a/mods/3d_armor/3d_armor_ip/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] 3d Armor integration to inventory plus [3d_armor_ip] -========================================================== - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_ip/depends.txt b/mods/3d_armor/3d_armor_ip/depends.txt deleted file mode 100644 index e96293b9..00000000 --- a/mods/3d_armor/3d_armor_ip/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor -inventory_plus? diff --git a/mods/3d_armor/3d_armor_ip/description.txt b/mods/3d_armor/3d_armor_ip/description.txt deleted file mode 100644 index 58b700eb..00000000 --- a/mods/3d_armor/3d_armor_ip/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the inventory plus. diff --git a/mods/3d_armor/3d_armor_ip/init.lua b/mods/3d_armor/3d_armor_ip/init.lua index f0612004..d01365d2 100644 --- a/mods/3d_armor/3d_armor_ip/init.lua +++ b/mods/3d_armor/3d_armor_ip/init.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape if not minetest.global_exists("inventory_plus") then - minetest.log("warning", S("3d_armor_ip: Mod loaded but unused.")) + minetest.log("warning", "3d_armor_ip: Mod loaded but unused.") return end diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr new file mode 100644 index 00000000..f15fd317 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Zurück +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr new file mode 100644 index 00000000..f84e706c --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Dorso +Armor=Armaĵo diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr index 5f540b12..8a6595f6 100644 --- a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr @@ -1,8 +1,3 @@ # textdomain: 3d_armor_ip - - -### init.lua ### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip : Mod chargé mais inutilisé. -Armor=Armure Back=Retour +Armor=Armure diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr new file mode 100644 index 00000000..4a8f8203 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Voltar +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr new file mode 100644 index 00000000..e2d778bc --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Tillbaka +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_ip/locale/template.txt b/mods/3d_armor/3d_armor_ip/locale/template.txt index 133bce8d..c21c6aaa 100644 --- a/mods/3d_armor/3d_armor_ip/locale/template.txt +++ b/mods/3d_armor/3d_armor_ip/locale/template.txt @@ -1,8 +1,3 @@ # textdomain: 3d_armor_ip - - -### init.lua ### - -3d_armor_ip: Mod loaded but unused.= -Armor= Back= +Armor= diff --git a/mods/3d_armor/3d_armor_sfinv/LICENSE.txt b/mods/3d_armor/3d_armor_sfinv/LICENSE.txt deleted file mode 100644 index 2b2a9f64..00000000 --- a/mods/3d_armor/3d_armor_sfinv/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] 3d Armor sfinv integration [3d_armor_sfinv] -================================================= - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_sfinv/depends.txt b/mods/3d_armor/3d_armor_sfinv/depends.txt deleted file mode 100644 index c7beedae..00000000 --- a/mods/3d_armor/3d_armor_sfinv/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor -sfinv? diff --git a/mods/3d_armor/3d_armor_sfinv/description.txt b/mods/3d_armor/3d_armor_sfinv/description.txt deleted file mode 100644 index 15f4e963..00000000 --- a/mods/3d_armor/3d_armor_sfinv/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the sfinv inventory. diff --git a/mods/3d_armor/3d_armor_sfinv/init.lua b/mods/3d_armor/3d_armor_sfinv/init.lua index 830ebbcb..f99c2440 100644 --- a/mods/3d_armor/3d_armor_sfinv/init.lua +++ b/mods/3d_armor/3d_armor_sfinv/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) if not minetest.global_exists("sfinv") then - minetest.log("warning", S("3d_armor_sfinv: Mod loaded but unused.")) + minetest.log("warning", "3d_armor_sfinv: Mod loaded but unused.") return end diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr new file mode 100644 index 00000000..b597332b --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr new file mode 100644 index 00000000..7cc47ce8 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armaĵoj diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr index ee72e52b..dd0a0026 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod cargado pero no activado. Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr index f25bd115..bdaf2a0a 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod chargé mais inutilisé. Armor=Armure diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr new file mode 100644 index 00000000..dd0a0026 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr new file mode 100644 index 00000000..14972b78 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_sfinv/locale/template.txt b/mods/3d_armor/3d_armor_sfinv/locale/template.txt index a3f01b5c..954dcf32 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/template.txt +++ b/mods/3d_armor/3d_armor_sfinv/locale/template.txt @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.= Armor= diff --git a/mods/3d_armor/3d_armor_stand/LICENSE.txt b/mods/3d_armor/3d_armor_stand/LICENSE.txt deleted file mode 100644 index e3cb55d6..00000000 --- a/mods/3d_armor/3d_armor_stand/LICENSE.txt +++ /dev/null @@ -1,43 +0,0 @@ -[mod] 3d Armor Stand [3d_armor_stand] -===================================== - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Lecense Models --------------- - -Copyright (C) 2016-2019 Stuart Jones - CC BY-SA 3.0 - -UV model mapping by tobyplowy(aka toby109tt) - -License Textures ----------------- - -3d_armor_stand.png -3d_armor_stand_locked.png - -Copyright (C) 2017-2019 tobyplowy - CC BY-SA 3.0 - -3d_armor_stand_feet.png -3d_armor_stand_head.png -3d_armor_stand_legs.png -3d_armor_stand_torso.png - -Copyright (C) 2016-2019 Stuart Jones - CC BY-SA 3.0 diff --git a/mods/3d_armor/3d_armor_stand/depends.txt b/mods/3d_armor/3d_armor_stand/depends.txt deleted file mode 100644 index fdbb2900..00000000 --- a/mods/3d_armor/3d_armor_stand/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor - diff --git a/mods/3d_armor/3d_armor_stand/init.lua b/mods/3d_armor/3d_armor_stand/init.lua index 612345b5..83c29d03 100644 --- a/mods/3d_armor/3d_armor_stand/init.lua +++ b/mods/3d_armor/3d_armor_stand/init.lua @@ -62,7 +62,7 @@ local function update_entity(pos) object = minetest.add_entity(pos, "3d_armor_stand:armor_entity") end if object then - local texture = "3d_armor_trans.png" + local texture = "blank.png" local textures = {} local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -134,7 +134,7 @@ local function remove_hidden_node(pos) end minetest.register_node("3d_armor_stand:top", { - description = S("Armor stand top"), + description = S("Armor Stand Top"), paramtype = "light", drawtype = "plantlike", sunlight_propagates = true, @@ -144,12 +144,13 @@ minetest.register_node("3d_armor_stand:top", { buildable_to = false, drop = "", groups = {not_in_creative_inventory = 1}, + is_ground_content = false, on_blast = function() end, - tiles = {"3d_armor_trans.png"}, + tiles = {"blank.png"}, }) minetest.register_node("3d_armor_stand:armor_stand", { - description = S("Armor stand"), + description = S("Armor Stand"), drawtype = "mesh", mesh = "3d_armor_stand.obj", tiles = {"3d_armor_stand.png"}, @@ -165,6 +166,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { }, }, groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -218,7 +220,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { }) minetest.register_node("3d_armor_stand:locked_armor_stand", { - description = S("Locked Armor stand"), + description = S("Locked Armor Stand"), drawtype = "mesh", mesh = "3d_armor_stand.obj", tiles = {"3d_armor_stand_locked.png"}, @@ -234,6 +236,7 @@ minetest.register_node("3d_armor_stand:locked_armor_stand", { }, }, groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -299,27 +302,107 @@ minetest.register_node("3d_armor_stand:locked_armor_stand", { end, }) +minetest.register_node("3d_armor_stand:shared_armor_stand", { + description = S("Shared Armor Stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand_shared.png"}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", armor_stand_formspec) + meta:set_string("infotext", S("Shared Armor Stand")) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + inv:set_size("armor_"..element, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Shared Armor Stand")) + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + -- Not affected by TNT + end, +}) + minetest.register_entity("3d_armor_stand:armor_entity", { - physical = true, - visual = "mesh", - mesh = "3d_armor_entity.obj", - visual_size = {x=1, y=1}, - collisionbox = {0,0,0,0,0,0}, - textures = {"3d_armor_trans.png"}, - pos = nil, - timer = 0, + initial_properties = { + physical = true, + visual = "mesh", + mesh = "3d_armor_entity.obj", + visual_size = {x=1, y=1}, + collisionbox = {0,0,0,0,0,0}, + textures = {"blank.png"}, + }, + _pos = nil, on_activate = function(self) local pos = self.object:get_pos() if pos then - self.pos = vector.round(pos) + self._pos = vector.round(pos) update_entity(pos) end end, on_blast = function(self, damage) local drops = {} - local node = minetest.get_node(self.pos) + local node = minetest.get_node(self._pos) if node.name == "3d_armor_stand:armor_stand" then - drop_armor(self.pos) + drop_armor(self._pos) self.object:remove() end return false, false, drops @@ -327,7 +410,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { }) minetest.register_abm({ - nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:armor_stand"}, + nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:shared_armor_stand", "3d_armor_stand:armor_stand"}, interval = 15, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) @@ -353,3 +436,10 @@ minetest.register_craft({ {"3d_armor_stand:armor_stand", "default:steel_ingot"}, } }) + +minetest.register_craft({ + output = "3d_armor_stand:shared_armor_stand", + recipe = { + {"3d_armor_stand:armor_stand", "default:copper_ingot"}, + } +}) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr new file mode 100644 index 00000000..ece548a6 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rüstungsständeroberseite +Armor Stand=Rüstungsständer +Locked Armor Stand=Abgeschlossener Rüstungsständer +Armor Stand (owned by @1)=Rüstungsständer (Eigentum von @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr new file mode 100644 index 00000000..47a17aba --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Armaĵtenila Supro +Armor Stand=Armaĵtenilo +Locked Armor Stand=Ŝlosita Armaĵtenilo +Armor Stand (owned by @1)=Ŝlosita Armaĵtenilo (posedata de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr new file mode 100644 index 00000000..32b87078 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr @@ -0,0 +1,6 @@ +# textdomain: 3d_armor_stand +Armor Stand Top= +Armor Stand=Soporte de armadura +Locked Armor Stand=Soporte de armadura privado +Shared Armor Stand=Soporte de armadura compartido +Armor Stand (owned by @1)=Soporte de armadura (de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr index 7d4cd381..f92d3778 100644 --- a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr @@ -1,10 +1,5 @@ # textdomain: 3d_armor_stand - - -### init.lua ### - +Armor Stand Top=Haut de support d'armure Armor Stand=Support d'armure +Locked Armor Stand=Support d'armure verrouillé Armor Stand (owned by @1)=Support d'armure (propriété de @1) -Armor stand=Support d'armure -Armor stand top=Haut de support d'armure -Locked Armor stand=Support d'armure verrouillé diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr new file mode 100644 index 00000000..0a8fb297 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Topo do suporte de armadura +Armor Stand=Suporte de Armadura +Locked Armor Stand=Suporte de armadura trancado +Armor Stand (owned by @1)=Suporte de Armadura (dono: @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr new file mode 100755 index 00000000..5987eed7 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=верх стойки для брони +Armor Stand=стойка для брони +Locked Armor Stand=стойка для брони с замком +Armor Stand (owned by @1)=стойка для бони (владелец @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr new file mode 100644 index 00000000..5800a313 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rustningställstopp +Armor Stand=Rustningställ +Locked Armor Stand=Låst rustningställ +Armor Stand (owned by @1)=Rustningställ (ägd av @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/template.txt b/mods/3d_armor/3d_armor_stand/locale/template.txt index 25befcb7..f9fcb5da 100644 --- a/mods/3d_armor/3d_armor_stand/locale/template.txt +++ b/mods/3d_armor/3d_armor_stand/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: 3d_armor_stand - - -### init.lua ### - +Armor Stand Top= Armor Stand= +Locked Armor Stand= +Shared Armor Stand= Armor Stand (owned by @1)= -Armor stand= -Armor stand top= -Locked Armor stand= diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png new file mode 100644 index 00000000..e54b599d Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png differ diff --git a/mods/3d_armor/3d_armor_ui/LICENSE.txt b/mods/3d_armor/3d_armor_ui/LICENSE.txt deleted file mode 100644 index 6ae23a6f..00000000 --- a/mods/3d_armor/3d_armor_ui/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] 3d Armor integration to unified inventory [3d_armor_ui] -============================================================= - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_ui/description.txt b/mods/3d_armor/3d_armor_ui/description.txt deleted file mode 100644 index e6bf11c8..00000000 --- a/mods/3d_armor/3d_armor_ui/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the unified inventory. diff --git a/mods/3d_armor/3d_armor_ui/init.lua b/mods/3d_armor/3d_armor_ui/init.lua index 28193e73..6afd13fc 100644 --- a/mods/3d_armor/3d_armor_ui/init.lua +++ b/mods/3d_armor/3d_armor_ui/init.lua @@ -23,7 +23,7 @@ end) unified_inventory.register_button("armor", { type = "image", image = "inventory_plus_armor.png", - tooltip = S("3d Armor") + tooltip = S("3D Armor") }) unified_inventory.register_page("armor", { @@ -33,9 +33,6 @@ unified_inventory.register_page("armor", { local gridy = 0.6 local name = player:get_player_name() - if armor.def[name].init_time == 0 then - return {formspec="label[0,0;"..F(S("Armor not initialized!")).."]"} - end local formspec = perplayer_formspec.standard_inv_bg.. perplayer_formspec.standard_inv.. ui.make_inv_img_grid(gridx, gridy, 2, 3).. diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr new file mode 100644 index 00000000..84e850c1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D-Rüstung +Armor not initialized!=Rüstung ist nicht initialisiert! +Armor=Rüstung +Level=Stufe +Heal=Heilung +Fire=Feuer +Radiation=Strahlung diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr new file mode 100644 index 00000000..7c31cbd1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armaĵoj +Armor not initialized!=Armaĵoj ne pretigitaj! +Armor=Armaĵo +Level=Nivelo +Heal=Sanigi +Fire=Fajro +Radiation=Radiado diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr index 38e0f05a..358814cb 100644 --- a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr @@ -1,12 +1,8 @@ # textdomain: 3d_armor_ui - - -### init.lua ### - -3d Armor=Armure 3d -Armor=Armure +3D Armor=Armure 3D Armor not initialized!=Armure non initialisée ! -Fire=Feu -Heal=Soins +Armor=Armure Level=Niveau +Heal=Soins +Fire=Feu Radiation=Radiation diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr new file mode 100644 index 00000000..761c6ec7 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armor +Armor not initialized!=Armadura não inicializada! +Armor=Armadura +Level=Nível +Heal=Vida +Fire=Fogo +Radiation=Radiação diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr new file mode 100644 index 00000000..711bf9c3 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor= +Armor not initialized!=Rustning har inte initialiserats +Armor=Rustning +Level=Nivå +Heal=Läkning +Fire=Eld +Radiation=Strålning diff --git a/mods/3d_armor/3d_armor_ui/locale/template.txt b/mods/3d_armor/3d_armor_ui/locale/template.txt index 0f7a8cb5..4982060c 100644 --- a/mods/3d_armor/3d_armor_ui/locale/template.txt +++ b/mods/3d_armor/3d_armor_ui/locale/template.txt @@ -1,12 +1,8 @@ # textdomain: 3d_armor_ui - - -### init.lua ### - -3d Armor= -Armor= +3D Armor= Armor not initialized!= -Fire= -Heal= +Armor= Level= +Heal= +Fire= Radiation= diff --git a/mods/3d_armor/LICENSE.md b/mods/3d_armor/LICENSE.md index f7793ffa..4e638395 100644 --- a/mods/3d_armor/LICENSE.md +++ b/mods/3d_armor/LICENSE.md @@ -1,9 +1,9 @@ 3D Armor - Visible Player Armor =============================== -License Source Code: Copyright (C) 2013-2018 Stuart Jones - LGPL v2.1 +License Source Code: Copyright (C) 2013-2023 Stuart Jones - LGPL v2.1 -Armor Textures: Copyright (C) 2017-2018 davidthecreator - CC-BY-SA 3.0 +Armor Textures: Copyright (C) 2017-2023 davidthecreator - CC-BY-SA 3.0 Special credit to Jordach and MirceaKitsune for providing the default 3d character model. diff --git a/mods/3d_armor/README.md b/mods/3d_armor/README.md index 3655e33a..8b114584 100644 --- a/mods/3d_armor/README.md +++ b/mods/3d_armor/README.md @@ -1,5 +1,5 @@ -Modpack - 3d Armor [0.4.13] -=========================== +Modpack - 3d Armor +================== ![3d_armor screenshot](https://github.com/minetest-mods/3d_armor/blob/master/screenshot.png) @@ -22,7 +22,7 @@ Modpack - 3d Armor [0.4.13] [mod] Visible Player Armor [3d_armor] ------------------------------------- -Minetest Version: 5.0.0 +Minetest Version: 5.0.0 and newer Game: minetest_game and many derivatives @@ -49,7 +49,24 @@ and [simple_skins] by TenPlus1. Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. see armor.conf.example for all available options. -For mod installation instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods +For **mod installation** instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods + +The specific "armors as modpack" refactorization allows anyone to enable/disable any armors they want as mods rather than obscure settings of the past. (See [#78](https://github.com/minetest-mods/3d_armor/commit/9444afd7222a71fc17d40c9793506812d715dcc3) for further explanation.) + +Currently, the modpack includes: + +- armor_admin +- armor_bronze +- armor_cactus +- armor_crystal +- armor_diamond +- armor_gold +- armor_mithril +- armor_nether +- armor_steel +- armor_wood + +as separate armor mods intentionally. All these mods depend on 3d_armor. [API Reference](https://minetest-mods.github.io/3d_armor/reference/) diff --git a/mods/3d_armor/armor_admin/init.lua b/mods/3d_armor/armor_admin/init.lua new file mode 100644 index 00000000..a84ec624 --- /dev/null +++ b/mods/3d_armor/armor_admin/init.lua @@ -0,0 +1,94 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Admin Helmet +-- +-- @helmet 3d_armor:helmet_admin +-- @img 3d_armor_inv_helmet_admin.png +-- @grp armor_head 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp armor_water 1 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:helmet_admin", { + description = S("Admin Helmet"), + inventory_image = "3d_armor_inv_helmet_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Chestplate +-- +-- @chestplate 3d_armor:chestplate_admin +-- @img 3d_armor_inv_chestplate_admin.png +-- @grp armor_torso 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:chestplate_admin", { + description = S("Admin Chestplate"), + inventory_image = "3d_armor_inv_chestplate_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_torso=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Leggings +-- +-- @leggings 3d_armor:leggings_admin +-- @img 3d_armor_inv_leggings_admin.png +-- @grp armor_legs 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:leggings_admin", { + description = S("Admin Leggings"), + inventory_image = "3d_armor_inv_leggings_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_legs=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Boots +-- +-- @boots 3d_armor:boots_admin +-- @img 3d_armor_inv_boots_admin.png +-- @grp armor_feet 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:boots_admin", { + description = S("Admin Boots"), + inventory_image = "3d_armor_inv_boots_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_feet=1, armor_heal=100, armor_use=0, physics_speed=1, + armor_water=1, not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +minetest.register_alias("adminboots", "3d_armor:boots_admin") +minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") +minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") +minetest.register_alias("adminleggings", "3d_armor:leggings_admin") diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.de.tr b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr new file mode 100644 index 00000000..d4751c0f --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhelm +Admin Chestplate=Adminbrustplatte +Admin Leggings=Adminhose +Admin Boots=Adminstiefel diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr new file mode 100644 index 00000000..ee050eb2 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Administra Kasko +Admin Chestplate=Administra Kiraso +Admin Leggings=Administra Pantalono +Admin Boots=Administraj Botoj diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.es.tr b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr new file mode 100644 index 00000000..3e1f8e04 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casco de admin +Admin Chestplate=Peto de admin +Admin Leggings=Grebas de admin +Admin Boots=Botas de admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr new file mode 100644 index 00000000..497df2d3 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casque d'admin +Admin Chestplate=Cuirasse d'admin +Admin Leggings=Jambières d'admin +Admin Boots=Bottes d'admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.it.tr b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr new file mode 100644 index 00000000..d59b9c92 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Elmo dell'amministratrice/tore +Admin Chestplate=Corazza dell'amministratrice/tore +Admin Leggings=Gambali dell'amministratrice/tore +Admin Boots=Stivali dell'amministratrice/tore diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr new file mode 100644 index 00000000..b91f9def --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Helmet Pentadbir +Admin Chestplate=Perisai Dada Pentadbir +Admin Leggings=Perisai Kaki Pentadbir +Admin Boots=But Pentadbir diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr new file mode 100644 index 00000000..077be2be --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Capacete de Administrador +Admin Chestplate=Peitoral de Administrador +Admin Leggings=Calças de Administrador +Admin Boots=Botas de Administrador diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr new file mode 100644 index 00000000..cd300fb0 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=шлем админа +Admin Chestplate=нагрудник админа +Admin Leggings=штаны админа +Admin Boots=ботинки админа diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr new file mode 100644 index 00000000..91631fe8 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhjälm +Admin Chestplate=Adminbröstplåt +Admin Leggings=Adminbyxor +Admin Boots=Adminstövlar diff --git a/mods/3d_armor/armor_admin/locale/template.txt b/mods/3d_armor/armor_admin/locale/template.txt new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/mod.conf b/mods/3d_armor/armor_admin/mod.conf new file mode 100644 index 00000000..588d4a43 --- /dev/null +++ b/mods/3d_armor/armor_admin/mod.conf @@ -0,0 +1,3 @@ +name = armor_admin +depends = 3d_armor +description = Adds admin armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png diff --git a/mods/3d_armor/armor_bronze/init.lua b/mods/3d_armor/armor_bronze/init.lua new file mode 100644 index 00000000..ebdc4c2b --- /dev/null +++ b/mods/3d_armor/armor_bronze/init.lua @@ -0,0 +1,180 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) +--- Bronze +-- +-- Requires setting `armor_material_bronze`. +-- +-- @section bronze + +if armor.materials.bronze then + --- Bronze Helmet + -- + -- @helmet 3d_armor:helmet_bronze + -- @img 3d_armor_inv_helmet_bronze.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_bronze", { + description = S("Bronze Helmet"), + inventory_image = "3d_armor_inv_helmet_bronze.png", + groups = {armor_head=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Chestplate + -- + -- @chestplate 3d_armor:chestplate_bronze + -- @img 3d_armor_inv_chestplate_bronze.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_bronze", { + description = S("Bronze Chestplate"), + inventory_image = "3d_armor_inv_chestplate_bronze.png", + groups = {armor_torso=1, armor_heal=6, armor_use=400, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Leggings + -- + -- @leggings 3d_armor:leggings_bronze + -- @img 3d_armor_inv_leggings_bronze.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_bronze", { + description = S("Bronze Leggings"), + inventory_image = "3d_armor_inv_leggings_bronze.png", + groups = {armor_legs=1, armor_heal=6, armor_use=400, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Boots + -- + -- @boots 3d_armor:boots_bronze + -- @img 3d_armor_inv_boots_bronze.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_bronze", { + description = S("Bronze Boots"), + inventory_image = "3d_armor_inv_boots_bronze.png", + groups = {armor_feet=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "bronze" + local m = armor.materials.bronze + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr new file mode 100644 index 00000000..789bdd82 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronzehelm +Bronze Chestplate=Bronzebrustplatte +Bronze Leggings=Bronzehose +Bronze Boots=Bronzestiefel diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr new file mode 100644 index 00000000..f7a13c2d --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronza Kasko +Bronze Chestplate=Bronza Kiraso +Bronze Leggings=Bronza Pantalono +Bronze Boots=Bronzaj Botoj diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr new file mode 100644 index 00000000..8103e7a4 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casco de bronce +Bronze Chestplate=Peto de bronce +Bronze Leggings=Grebas de bronce +Bronze Boots=Botas de bronce diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr new file mode 100644 index 00000000..72d1dc4c --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casque en bronze +Bronze Chestplate=Cuirasse en bronze +Bronze Leggings=Jambières en bronze +Bronze Boots=Bottes en bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr new file mode 100644 index 00000000..e1298244 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Elmo di bronzo +Bronze Chestplate=Corazza di bronzo +Bronze Leggings=Gambali di bronzo +Bronze Boots=Stivali di bronzo diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr new file mode 100644 index 00000000..f9167771 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Helmet Gangsa +Bronze Chestplate=Perisai Dada Gangsa +Bronze Leggings=Perisai Kaki Gangsa +Bronze Boots=But Gangsa diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr new file mode 100644 index 00000000..61abdd48 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=бронзовый шлем +Bronze Chestplate=бронзовый нагрудник +Bronze Leggings=бронзовые штаны +Bronze Boots=бронзовые ботинки diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr new file mode 100644 index 00000000..eea6741f --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronshjälm +Bronze Chestplate=Bronsbröstplatta +Bronze Leggings=Bronsbyxor +Bronze Boots=Bronsstövlar diff --git a/mods/3d_armor/armor_bronze/locale/template.txt b/mods/3d_armor/armor_bronze/locale/template.txt new file mode 100644 index 00000000..59a56121 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet= +Bronze Chestplate= +Bronze Leggings= +Bronze Boots= diff --git a/mods/3d_armor/armor_bronze/mod.conf b/mods/3d_armor/armor_bronze/mod.conf new file mode 100644 index 00000000..7eec9023 --- /dev/null +++ b/mods/3d_armor/armor_bronze/mod.conf @@ -0,0 +1,3 @@ +name = armor_bronze +depends = 3d_armor +description = Adds craftable bronze armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png diff --git a/mods/3d_armor/armor_cactus/init.lua b/mods/3d_armor/armor_cactus/init.lua new file mode 100644 index 00000000..aaece5c6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Cactus +-- +-- Requires setting `armor_material_cactus`. +-- +-- @section cactus + +if armor.materials.cactus then + --- Cactus Helmet + -- + -- @helmet 3d_armor:helmet_cactus + -- @img 3d_armor_inv_helmet_cactus.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_cactus", { + description = S("Cactus Helmet"), + inventory_image = "3d_armor_inv_helmet_cactus.png", + groups = {armor_head=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Chestplate + -- + -- @chestplate 3d_armor:chestplate_cactus + -- @img 3d_armor_inv_chestplate_cactus.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_cactus", { + description = S("Cactus Chestplate"), + inventory_image = "3d_armor_inv_chestplate_cactus.png", + groups = {armor_torso=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Leggings + -- + -- @leggings 3d_armor:leggings_cactus + -- @img 3d_armor_inv_leggings_cactus.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_cactus", { + description = S("Cactus Leggings"), + inventory_image = "3d_armor_inv_leggings_cactus.png", + groups = {armor_legs=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Boots + -- + -- @boots 3d_armor:boots_cactus + -- @img 3d_armor_inv_boots_cactus.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_cactus", { + description = S("Cactus Boots"), + inventory_image = "3d_armor_inv_boots_cactus.png", + groups = {armor_feet=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + local cactus_armor_fuel = { + helmet = 14, + chestplate = 16, + leggings = 15, + boots = 13 + } + for armor, burn in pairs(cactus_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_cactus", + burntime = burn, + }) + end + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "cactus" + local m = armor.materials.cactus + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr new file mode 100644 index 00000000..a09c15e6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushelm +Cactus Chestplate=Kaktusbrustplatte +Cactus Leggings=Kaktushose +Cactus Boots=Kaktusstiefel diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr new file mode 100644 index 00000000..fffcd5d5 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kakta Kasko +Cactus Chestplate=Kakta Kiraso +Cactus Leggings=Kakta Pantalono +Cactus Boots=Kaktaj Botoj diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr new file mode 100644 index 00000000..f9689177 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casco de cactus +Cactus Chestplate=Peto de cactus +Cactus Leggings=Grebas de cactus +Cactus Boots=Botas de cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr new file mode 100644 index 00000000..b678e313 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casque en cactus +Cactus Chestplate=Cuirasse en cactus +Cactus Leggings=Jambières en cactus +Cactus Boots=Bottes en cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr new file mode 100644 index 00000000..e46a235a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Elmo di cactus +Cactus Chestplate=Corazza di cactus +Cactus Leggings=Gambali di cactus +Cactus Boots=Stivali di cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr new file mode 100644 index 00000000..f859b9eb --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Helmet Kaktus +Cactus Chestplate=Perisai Dada Kaktus +Cactus Leggings=Perisai Kaki Kaktus +Cactus Boots=But Kaktus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr new file mode 100644 index 00000000..f3ca0923 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr new file mode 100644 index 00000000..75eca173 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Cacto diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr new file mode 100644 index 00000000..5c7df36a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=кактусовый шлем +Cactus Chestplate=кактусовый нагрудник +Cactus Leggings=кактусовые штаны +Cactus Boots=кактусовые ботинки diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr new file mode 100644 index 00000000..2f0981ac --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushjälm +Cactus Chestplate=Kaktusbröstplatta +Cactus Leggings=Kaktusbyxor +Cactus Boots=Kaktusstövlar diff --git a/mods/3d_armor/armor_cactus/locale/template.txt b/mods/3d_armor/armor_cactus/locale/template.txt new file mode 100644 index 00000000..49da2402 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet= +Cactus Chestplate= +Cactus Leggings= +Cactus Boots= diff --git a/mods/3d_armor/armor_cactus/mod.conf b/mods/3d_armor/armor_cactus/mod.conf new file mode 100644 index 00000000..fc94af23 --- /dev/null +++ b/mods/3d_armor/armor_cactus/mod.conf @@ -0,0 +1,3 @@ +name = armor_cactus +depends = 3d_armor +description = Adds craftable cactus armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png diff --git a/mods/3d_armor/armor_crystal/init.lua b/mods/3d_armor/armor_crystal/init.lua new file mode 100644 index 00000000..aa9a76af --- /dev/null +++ b/mods/3d_armor/armor_crystal/init.lua @@ -0,0 +1,169 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Crystal +-- +-- Requires `armor_material_crystal`. +-- +-- @section crystal + +if armor.materials.crystal then + --- Crystal Helmet + -- + -- @helmet 3d_armor:helmet_crystal + -- @img 3d_armor_inv_helmet_crystal.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_crystal", { + description = S("Crystal Helmet"), + inventory_image = "3d_armor_inv_helmet_crystal.png", + groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Chestplate + -- + -- @chestplate 3d_armor:chestplate_crystal + -- @img 3d_armor_inv_chestplate_crystal.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_crystal", { + description = S("Crystal Chestplate"), + inventory_image = "3d_armor_inv_chestplate_crystal.png", + groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Leggings + -- + -- @leggings 3d_armor:leggings_crystal + -- @img 3d_armor_inv_leggings_crystal.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_crystal", { + description = S("Crystal Leggings"), + inventory_image = "3d_armor_inv_leggings_crystal.png", + groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Boots + -- + -- @boots 3d_armor:boots_crystal + -- @img 3d_armor_inv_boots_crystal.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp physics_speed 1 + -- @grp physics_jump 0.5 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_crystal", { + description = S("Crystal Boots"), + inventory_image = "3d_armor_inv_boots_crystal.png", + groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, + physics_jump=0.5, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "crystal" + local m = armor.materials.crystal + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr new file mode 100644 index 00000000..18e76242 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhelm +Crystal Chestplate=Kristallbrustplatte +Crystal Leggings=Kristallhose +Crystal Boots=Kristallstiefel diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr new file mode 100644 index 00000000..7fae4ea2 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristala Kasko +Crystal Chestplate=Kristala Kiraso +Crystal Leggings=Kristala Pantalono +Crystal Boots=Kristalaj Botoj diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr new file mode 100644 index 00000000..cc7e60b1 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casco de cristal +Crystal Chestplate=Peto de cristal +Crystal Leggings=Grebas de cristal +Crystal Boots=Botas de cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr new file mode 100644 index 00000000..d127635d --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casque en cristal +Crystal Chestplate=Cuirasse en cristal +Crystal Leggings=Jambières en cristal +Crystal Boots=Bottes en cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr new file mode 100644 index 00000000..85c3f512 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Elmo di cristallo +Crystal Chestplate=Corazza di cristallo +Crystal Leggings=Gambali di cristallo +Crystal Boots=Stivali di cristallo diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr new file mode 100644 index 00000000..6e53ffda --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Helmet Kristal +Crystal Chestplate=Perisai Dada Kristal +Crystal Leggings=Perisai Kaki Kristal +Crystal Boots=But Kristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr new file mode 100644 index 00000000..4915198b --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=кристалловый шлем +Crystal Chestplate=кристалловый нагрудник +Crystal Leggings=кристалловые штаны +Crystal Boots=кристалловые ботинки diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr new file mode 100644 index 00000000..57d0bd12 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhjälm +Crystal Chestplate=Kristallbröstplatta +Crystal Leggings=Kristallbyxor +Crystal Boots=Kristallstövlar diff --git a/mods/3d_armor/armor_crystal/locale/template.txt b/mods/3d_armor/armor_crystal/locale/template.txt new file mode 100644 index 00000000..4244d314 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet= +Crystal Chestplate= +Crystal Leggings= +Crystal Boots= diff --git a/mods/3d_armor/armor_crystal/mod.conf b/mods/3d_armor/armor_crystal/mod.conf new file mode 100644 index 00000000..9531bbcc --- /dev/null +++ b/mods/3d_armor/armor_crystal/mod.conf @@ -0,0 +1,4 @@ +name = armor_crystal +depends = 3d_armor +optional_depends = ethereal +description = Adds craftable crystal armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png diff --git a/mods/3d_armor/armor_diamond/init.lua b/mods/3d_armor/armor_diamond/init.lua new file mode 100644 index 00000000..c92cf0eb --- /dev/null +++ b/mods/3d_armor/armor_diamond/init.lua @@ -0,0 +1,166 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Diamond +-- +-- Requires setting `armor_material_diamond`. +-- +-- @section diamond + +if armor.materials.diamond then + --- Diamond Helmet + -- + -- @helmet 3d_armor:helmet_diamond + -- @img 3d_armor_inv_helmet_diamond.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_diamond", { + description = S("Diamond Helmet"), + inventory_image = "3d_armor_inv_helmet_diamond.png", + groups = {armor_head=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Chestplate + -- + -- @chestplate 3d_armor:chestplate_diamond + -- @img 3d_armor_inv_chestplate_diamond.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_diamond", { + description = S("Diamond Chestplate"), + inventory_image = "3d_armor_inv_chestplate_diamond.png", + groups = {armor_torso=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Leggings + -- + -- @leggings 3d_armor:leggings_diamond + -- @img 3d_armor_inv_leggings_diamond.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_diamond", { + description = S("Diamond Leggings"), + inventory_image = "3d_armor_inv_leggings_diamond.png", + groups = {armor_legs=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Boots + -- + -- @boots 3d_armor:boots_diamond + -- @img 3d_armor_inv_boots_diamond.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_diamond", { + description = S("Diamond Boots"), + inventory_image = "3d_armor_inv_boots_diamond.png", + groups = {armor_feet=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "diamond" + local m = armor.materials.diamond + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr new file mode 100644 index 00000000..f19d67a3 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthelm +Diamond Chestplate=Diamantbrustplatte +Diamond Leggings=Diamanthose +Diamond Boots=Diamantstiefel diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr new file mode 100644 index 00000000..48e57683 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanta Kasko +Diamond Chestplate=Diamanta Kiraso +Diamond Leggings=Diamanta Pantalono +Diamond Boots=Diamantaj Botoj diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr new file mode 100644 index 00000000..c0a96b30 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casco de diamante +Diamond Chestplate=Peto de diamante +Diamond Leggings=Grebas de diamante +Diamond Boots=Botas de diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr new file mode 100644 index 00000000..347d2213 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casque en diamant +Diamond Chestplate=Cuirasse en diamant +Diamond Leggings=Jambières en diamant +Diamond Boots=Bottes en diamant diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr new file mode 100644 index 00000000..b5aa14c1 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Elmo di diamante +Diamond Chestplate=Corazza di diamante +Diamond Leggings=Gambali di diamante +Diamond Boots=Stivali di diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr new file mode 100644 index 00000000..bc6f7372 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Helmet Intan +Diamond Chestplate=Perisai Dada Intan +Diamond Leggings=Perisai Kaki Intan +Diamond Boots=But Intan diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr new file mode 100644 index 00000000..0ee465b9 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=алмазный шлем +Diamond Chestplate=алмазный нагрудник +Diamond Leggings=алмазные штаны +Diamond Boots=алмазные ботинки diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr new file mode 100644 index 00000000..622daadd --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthjälm +Diamond Chestplate=Diamantbröstplatta +Diamond Leggings=Diamantbyxor +Diamond Boots=Diamantstövlar diff --git a/mods/3d_armor/armor_diamond/locale/template.txt b/mods/3d_armor/armor_diamond/locale/template.txt new file mode 100644 index 00000000..6e169f12 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet= +Diamond Chestplate= +Diamond Leggings= +Diamond Boots= diff --git a/mods/3d_armor/armor_diamond/mod.conf b/mods/3d_armor/armor_diamond/mod.conf new file mode 100644 index 00000000..27d1cc98 --- /dev/null +++ b/mods/3d_armor/armor_diamond/mod.conf @@ -0,0 +1,3 @@ +name = armor_diamond +depends = 3d_armor +description = Adds craftable diamond armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png diff --git a/mods/3d_armor/armor_gold/init.lua b/mods/3d_armor/armor_gold/init.lua new file mode 100644 index 00000000..a8bb01ff --- /dev/null +++ b/mods/3d_armor/armor_gold/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Gold +-- +-- Requires `armor_material_gold`. +-- +-- @section gold + +if armor.materials.gold then + --- Gold Helmet + -- + -- @helmet 3d_armor:helmet_gold + -- @img 3d_armor_inv_helmet_gold.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_gold", { + description = S("Gold Helmet"), + inventory_image = "3d_armor_inv_helmet_gold.png", + groups = {armor_head=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Chestplate + -- + -- @chestplate 3d_armor:chestplate_gold + -- @img 3d_armor_inv_chestplate_gold.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.05 + -- @grp physics_gravity 0.05 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_gold", { + description = S("Gold Chestplate"), + inventory_image = "3d_armor_inv_chestplate_gold.png", + groups = {armor_torso=1, armor_heal=6, armor_use=300, + physics_speed=-0.05, physics_gravity=0.05}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Leggings + -- + -- @leggings 3d_armor:leggings_gold + -- @img 3d_armor_inv_leggings_gold.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_gold", { + description = S("Gold Leggings"), + inventory_image = "3d_armor_inv_leggings_gold.png", + groups = {armor_legs=1, armor_heal=6, armor_use=300, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Boots + -- + -- @boots 3d_armor:boots_gold + -- @img 3d_armor_inv_boots_gold.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_gold", { + description = S("Gold Boots"), + inventory_image = "3d_armor_inv_boots_gold.png", + groups = {armor_feet=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "gold" + local m = armor.materials.gold + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.de.tr b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr new file mode 100644 index 00000000..f7098cf1 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Goldhelm +Gold Chestplate=Goldbrustplatte +Gold Leggings=Goldhose +Gold Boots=Goldstiefel diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr new file mode 100644 index 00000000..58916f1d --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Ora Kasko +Gold Chestplate=Ora Kiraso +Gold Leggings=Ora Pantalono +Gold Boots=Oraj Botoj diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.es.tr b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr new file mode 100644 index 00000000..e82affbc --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casco de oro +Gold Chestplate=Peto de oro +Gold Leggings=Grebas de oro +Gold Boots=Botas de oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr new file mode 100644 index 00000000..8b3a2ae8 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casque en or +Gold Chestplate=Cuirasse en or +Gold Leggings=Jambières en or +Gold Boots=Bottes en or diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.it.tr b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr new file mode 100644 index 00000000..7480cfcd --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Elmo d'oro +Gold Chestplate=Corazza d'oro +Gold Leggings=Gambali d'oro +Gold Boots=Stivali d'oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr new file mode 100644 index 00000000..47e0e695 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Helmet Emas +Gold Chestplate=Perisai Dada Emas +Gold Leggings=Perisai Kaki Emas +Gold Boots=But Emas diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr new file mode 100644 index 00000000..c25f20fe --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=золотой шлем +Gold Chestplate=золотой нагрудник +Gold Leggings=золотые штаны +Gold Boots=золотые ботинки diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr new file mode 100644 index 00000000..02191d3b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Guldhjälm +Gold Chestplate=Goldbröstplatta +Gold Leggings=Guldbyxor +Gold Boots=Guldstövlar diff --git a/mods/3d_armor/armor_gold/locale/template.txt b/mods/3d_armor/armor_gold/locale/template.txt new file mode 100644 index 00000000..178aff0b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet= +Gold Chestplate= +Gold Leggings= +Gold Boots= diff --git a/mods/3d_armor/armor_gold/mod.conf b/mods/3d_armor/armor_gold/mod.conf new file mode 100644 index 00000000..092ab6de --- /dev/null +++ b/mods/3d_armor/armor_gold/mod.conf @@ -0,0 +1,3 @@ +name = armor_gold +depends = 3d_armor +description = Adds craftable gold armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png diff --git a/mods/3d_armor/armor_mithril/init.lua b/mods/3d_armor/armor_mithril/init.lua new file mode 100644 index 00000000..cdec0db3 --- /dev/null +++ b/mods/3d_armor/armor_mithril/init.lua @@ -0,0 +1,162 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Mithril +-- +-- Requires `armor_material_mithril`. +-- +-- @section mithril + +if armor.materials.mithril then + --- Mithril Helmet + -- + -- @helmet 3d_armor:helmet_mithril + -- @img 3d_armor_inv_helmet_mithril.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_mithril", { + description = S("Mithril Helmet"), + inventory_image = "3d_armor_inv_helmet_mithril.png", + groups = {armor_head=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Chestplate + -- + -- @chestplate 3d_armor:chestplate_mithril + -- @img 3d_armor_inv_chestplate_mithril.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_mithril", { + description = S("Mithril Chestplate"), + inventory_image = "3d_armor_inv_chestplate_mithril.png", + groups = {armor_torso=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Leggings + -- + -- @leggings 3d_armor:leggings_mithril + -- @img 3d_armor_inv_leggings_mithril.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_mithril", { + description = S("Mithril Leggings"), + inventory_image = "3d_armor_inv_leggings_mithril.png", + groups = {armor_legs=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Boots + -- + -- @boots 3d_armor:boots_mithril + -- @img 3d_armor_inv_boots_mithril.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_mithril", { + description = S("Mithril Boots"), + inventory_image = "3d_armor_inv_boots_mithril.png", + groups = {armor_feet=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "mithril" + local m = armor.materials.mithril + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr new file mode 100644 index 00000000..09fdf206 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhelm +Mithril Chestplate=Mithrilbrustplatte +Mithril Leggings=Mithrilhose +Mithril Boots=Mithrilstiefel diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr new file mode 100644 index 00000000..ae5c92da --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mitrila Kasko +Mithril Chestplate=Mitrila Kiraso +Mithril Leggings=Mitrila Pantalono +Mithril Boots=Mitrilaj Botoj diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr new file mode 100644 index 00000000..aaae80fb --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casco de mitrilo +Mithril Chestplate=Peto de mitrilo +Mithril Leggings=Grebas de mitrilo +Mithril Boots=Botas de mitrilo diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr new file mode 100644 index 00000000..fad39102 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casque en mithril +Mithril Chestplate=Cuirasse en mithril +Mithril Leggings=Jambières en mithril +Mithril Boots=Bottes en mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr new file mode 100644 index 00000000..9490f72b --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Elmo di mithril +Mithril Chestplate=Corazza di mithril +Mithril Leggings=Gambali di mithril +Mithril Boots=Stivali di mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr new file mode 100644 index 00000000..fc113a63 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Helmet Mithril +Mithril Chestplate=Perisai Dada Mithril +Mithril Leggings=Perisai Kaki Mithril +Mithril Boots=But Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr new file mode 100644 index 00000000..3444f2f8 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=мифриловый шлем +Mithril Chestplate=мифриловый нагрудник +Mithril Leggings=мифриловые штаны +Mithril Boots=мифриловые ботинки diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr new file mode 100644 index 00000000..0d8ed8e0 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhjälm +Mithril Chestplate=Mithrilbröstplatta +Mithril Leggings=Mithrilbyxor +Mithril Boots=Mithrilstövlar diff --git a/mods/3d_armor/armor_mithril/locale/template.txt b/mods/3d_armor/armor_mithril/locale/template.txt new file mode 100644 index 00000000..4d5da603 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet= +Mithril Chestplate= +Mithril Leggings= +Mithril Boots= diff --git a/mods/3d_armor/armor_mithril/mod.conf b/mods/3d_armor/armor_mithril/mod.conf new file mode 100644 index 00000000..5cc6948d --- /dev/null +++ b/mods/3d_armor/armor_mithril/mod.conf @@ -0,0 +1,4 @@ +name = armor_mithril +depends = 3d_armor +optional_depends = moreores +description = Adds craftable mithril armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png diff --git a/mods/3d_armor/armor_nether/init.lua b/mods/3d_armor/armor_nether/init.lua new file mode 100644 index 00000000..3e20ee33 --- /dev/null +++ b/mods/3d_armor/armor_nether/init.lua @@ -0,0 +1,168 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Nether +-- +-- Requires `armor_material_nether`. +-- +-- @section nether + +if armor.materials.nether then + --- Nether Helmet + -- + -- @helmet 3d_armor:helmet_nether + -- @img 3d_armor_inv_helmet_nether.png + -- @grp armor_head 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_nether", { + description = S("Nether Helmet"), + inventory_image = "3d_armor_inv_helmet_nether.png", + groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Chestplate + -- + -- @chestplate 3d_armor:chestplate_nether + -- @img 3d_armor_inv_chestplate_nether.png + -- @grp armor_torso 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_nether", { + description = S("Nether Chestplate"), + inventory_image = "3d_armor_inv_chestplate_nether.png", + groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Leggings + -- + -- @leggings 3d_armor:leggings_nether + -- @img 3d_armor_inv_leggings_nether.png + -- @grp armor_legs 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_nether", { + description = S("Nether Leggings"), + inventory_image = "3d_armor_inv_leggings_nether.png", + groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Boots + -- + -- @boots 3d_armor:boots_nether + -- @img 3d_armor_inv_boots_nether.png + -- @grp armor_feet 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_nether", { + description = S("Nether Boots"), + inventory_image = "3d_armor_inv_boots_nether.png", + groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "nether" + local m = armor.materials.nether + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) + +end diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.de.tr b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr new file mode 100644 index 00000000..d1793537 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhelm +Nether Chestplate=Netherbrustplatte +Nether Leggings=Netherhose +Nether Boots=Netherstiefel diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr new file mode 100644 index 00000000..cdf5c02f --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Inferna Kasko +Nether Chestplate=Inferna Kiraso +Nether Leggings=Inferna Pantalono +Nether Boots=Infernaj Botoj diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.es.tr b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr new file mode 100644 index 00000000..1e672e48 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casco de nether +Nether Chestplate=Peto de nether +Nether Leggings=Grebas de nether +Nether Boots=Botas de nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr new file mode 100644 index 00000000..96b78781 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casque en nether +Nether Chestplate=Cuirasse en nether +Nether Leggings=Jambières en nether +Nether Boots=Bottes en nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.it.tr b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr new file mode 100644 index 00000000..036118b4 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Elmo di nether +Nether Chestplate=Corazza di nether +Nether Leggings=Gambali di nether +Nether Boots=Stivali di nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr new file mode 100644 index 00000000..7b9fd1bb --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Helmet Nether +Nether Chestplate=Perisai Dada Nether +Nether Leggings=Perisai Kaki Nether +Nether Boots=But Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr new file mode 100644 index 00000000..3ba213d8 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=адский шлем +Nether Chestplate=адский нагрудник +Nether Leggings=адские штаны +Nether Boots=адские ботинки diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr new file mode 100644 index 00000000..a26599ce --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhjälm +Nether Chestplate=Netherbröstplatta +Nether Leggings=Netherbyxor +Nether Boots=Netherstövlar diff --git a/mods/3d_armor/armor_nether/locale/template.txt b/mods/3d_armor/armor_nether/locale/template.txt new file mode 100644 index 00000000..7b02e38c --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet= +Nether Chestplate= +Nether Leggings= +Nether Boots= diff --git a/mods/3d_armor/armor_nether/mod.conf b/mods/3d_armor/armor_nether/mod.conf new file mode 100644 index 00000000..3e99b555 --- /dev/null +++ b/mods/3d_armor/armor_nether/mod.conf @@ -0,0 +1,4 @@ +name = armor_nether +depends = 3d_armor +optional_depends = nether +description = Adds craftable wood armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png diff --git a/mods/3d_armor/armor_steel/init.lua b/mods/3d_armor/armor_steel/init.lua new file mode 100644 index 00000000..d8cbc0bc --- /dev/null +++ b/mods/3d_armor/armor_steel/init.lua @@ -0,0 +1,181 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Steel +-- +-- Requires setting `armor_material_steel`. +-- +-- @section steel + +if armor.materials.steel then + --- Steel Helmet + -- + -- @helmet 3d_armor:helmet_steel + -- @img 3d_armor_inv_helmet_steel.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physica_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_steel", { + description = S("Steel Helmet"), + inventory_image = "3d_armor_inv_helmet_steel.png", + groups = {armor_head=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Chestplate + -- + -- @chestplate 3d_armor:chestplate_steel + -- @img 3d_armor_inv_chestplate_steel.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed + -- @grp physics_gravity + -- @armorgrp fleshy + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_steel", { + description = S("Steel Chestplate"), + inventory_image = "3d_armor_inv_chestplate_steel.png", + groups = {armor_torso=1, armor_heal=0, armor_use=800, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Leggings + -- + -- @leggings 3d_armor:leggings_steel + -- @img 3d_armor_inv_leggings_steel.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_steel", { + description = S("Steel Leggings"), + inventory_image = "3d_armor_inv_leggings_steel.png", + groups = {armor_legs=1, armor_heal=0, armor_use=800, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Boots + -- + -- @boots 3d_armor:boots_steel + -- @img 3d_armor_inv_boots_steel.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_steel", { + description = S("Steel Boots"), + inventory_image = "3d_armor_inv_boots_steel.png", + groups = {armor_feet=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "steel" + local m = armor.materials.steel + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.de.tr b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr new file mode 100644 index 00000000..0be569ac --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Stahlhelm +Steel Chestplate=Stahlbrustplatte +Steel Leggings=Stahlhose +Steel Boots=Stahlstiefel diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr new file mode 100644 index 00000000..8c1d0661 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Ŝtala Kasko +Steel Chestplate=Ŝtala Kiraso +Steel Leggings=Ŝtala Pantalono +Steel Boots=Ŝtalaj Botoj diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.es.tr b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr new file mode 100644 index 00000000..9af65df6 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casco de acero +Steel Chestplate=Peto de acero +Steel Leggings=Grebas de acero +Steel Boots=Botas de acero diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr new file mode 100644 index 00000000..8f1d063a --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casque en acier +Steel Chestplate=Cuirasse en acier +Steel Leggings=Jambières en acier +Steel Boots=Bottes en acier diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.it.tr b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr new file mode 100644 index 00000000..cbd08789 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Elmo d'acciaio +Steel Chestplate=Corazza d'acciaio +Steel Leggings=Gambali d'acciaio +Steel Boots=Stivali d'acciaio diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr new file mode 100644 index 00000000..201a2f6c --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Helmet Keluli +Steel Chestplate=Perisai Dada Keluli +Steel Leggings=Perisai Kaki Keluli +Steel Boots=But Keluli diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr new file mode 100644 index 00000000..ed836ce2 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=стальной шлем +Steel Chestplate=стальной нагрудник +Steel Leggings=стальные штаны +Steel Boots=стальные ботинки diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr new file mode 100644 index 00000000..1353b4ad --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Stålhjälm +Steel Chestplate=Stålbröstplatta +Steel Leggings=Stålbyxor +Steel Boots=Stålstövlar diff --git a/mods/3d_armor/armor_steel/locale/template.txt b/mods/3d_armor/armor_steel/locale/template.txt new file mode 100644 index 00000000..0d6c3f61 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet= +Steel Chestplate= +Steel Leggings= +Steel Boots= diff --git a/mods/3d_armor/armor_steel/mod.conf b/mods/3d_armor/armor_steel/mod.conf new file mode 100644 index 00000000..962e756d --- /dev/null +++ b/mods/3d_armor/armor_steel/mod.conf @@ -0,0 +1,3 @@ +name = armor_steel +depends = 3d_armor +description = Adds craftable steel armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png diff --git a/mods/3d_armor/armor_wood/init.lua b/mods/3d_armor/armor_wood/init.lua new file mode 100644 index 00000000..f9b6b82b --- /dev/null +++ b/mods/3d_armor/armor_wood/init.lua @@ -0,0 +1,186 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Wood +-- +-- Requires setting `armor_material_wood`. +-- +-- @section wood + +if armor.materials.wood then + --- Wood Helmet + -- + -- @helmet 3d_armor:helmet_wood + -- @img 3d_armor_inv_helmet_wood.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_wood", { + description = S("Wood Helmet"), + inventory_image = "3d_armor_inv_helmet_wood.png", + groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Chestplate + -- + -- @chestplate 3d_armor:chestplate_wood + -- @img 3d_armor_inv_chestplate_wood.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_wood", { + description = S("Wood Chestplate"), + inventory_image = "3d_armor_inv_chestplate_wood.png", + groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Leggings + -- + -- @leggings 3d_armor:leggings_wood + -- @img 3d_armor_inv_leggings_wood.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_wood", { + description = S("Wood Leggings"), + inventory_image = "3d_armor_inv_leggings_wood.png", + groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Boots + -- + -- @boots 3d_armor:boots_wood + -- @img 3d_armor_inv_boots_wood.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_wood", { + description = S("Wood Boots"), + inventory_image = "3d_armor_inv_boots_wood.png", + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, + }) + local wood_armor_fuel = { + helmet = 6, + chestplate = 8, + leggings = 7, + boots = 5 + } + for armor, burn in pairs(wood_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_wood", + burntime = burn, + }) + end + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┐ ┌───┬───┬───┐ + -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "wood" + local m = armor.materials.wood + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.de.tr b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr new file mode 100644 index 00000000..f4a10224 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Holzhelm +Wood Chestplate=Holzbrustplatte +Wood Leggings=Holzhose +Wood Boots=Holzstiefel diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr new file mode 100644 index 00000000..042ca7de --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Ligna Kasko +Wood Chestplate=Ligna Kiraso +Wood Leggings=Ligna Pantalono +Wood Boots=Lignaj Botoj diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.es.tr b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr new file mode 100644 index 00000000..a43f9ab8 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casco de madera +Wood Chestplate=Peto de madera +Wood Leggings=Grebas de madera +Wood Boots=Botas de madera diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr new file mode 100644 index 00000000..953a787e --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casque en bois +Wood Chestplate=Cuirasse en bois +Wood Leggings=Jambières en bois +Wood Boots=Bottes en bois diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.it.tr b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr new file mode 100644 index 00000000..ef4b540d --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Elmo di legno +Wood Chestplate=Corazza di legno +Wood Leggings=Gambali di legno +Wood Boots=Stivali di legno diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr new file mode 100644 index 00000000..6ef45935 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Helmet Kayu +Wood Chestplate=Perisai Dada Kayu +Wood Leggings=Perisai Kaki Kayu +Wood Boots=But Kayu diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr new file mode 100644 index 00000000..93fdb554 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=деревянный шлем +Wood Chestplate=деревянный нагрудник +Wood Leggings=деревянные штаны +Wood Boots=деревянные ботинки diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr new file mode 100644 index 00000000..56b08a08 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Trähjälm +Wood Chestplate=Träbröstplatta +Wood Leggings=Träbyxor +Wood Boots=Trästövlar diff --git a/mods/3d_armor/armor_wood/locale/template.txt b/mods/3d_armor/armor_wood/locale/template.txt new file mode 100644 index 00000000..88934d38 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet= +Wood Chestplate= +Wood Leggings= +Wood Boots= diff --git a/mods/3d_armor/armor_wood/mod.conf b/mods/3d_armor/armor_wood/mod.conf new file mode 100644 index 00000000..2155fa3c --- /dev/null +++ b/mods/3d_armor/armor_wood/mod.conf @@ -0,0 +1,3 @@ +name = armor_wood +depends = 3d_armor +description = Adds craftable wood armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png diff --git a/mods/3d_armor/cc-by-sa-3.0.txt b/mods/3d_armor/cc-by-sa-3.0.txt new file mode 100644 index 00000000..604209a8 --- /dev/null +++ b/mods/3d_armor/cc-by-sa-3.0.txt @@ -0,0 +1,359 @@ +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at https://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/mods/3d_armor/description.txt b/mods/3d_armor/description.txt deleted file mode 100644 index 2da5ba4d..00000000 --- a/mods/3d_armor/description.txt +++ /dev/null @@ -1 +0,0 @@ -Visible player armor & wielded items. diff --git a/mods/3d_armor/lgpl-2.1.md b/mods/3d_armor/lgpl-2.1.md new file mode 100644 index 00000000..4c337f0b --- /dev/null +++ b/mods/3d_armor/lgpl-2.1.md @@ -0,0 +1,503 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +## Preamble + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public Licenses +are intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + +When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there +is no warranty for the free library. Also, if the library is modified +by someone else and passed on, the recipients should know that what +they have is not the original version, so that the original author's +reputation will not be affected by problems that might be introduced +by others. + +Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + +When a program is linked with a library, whether statically or using a +shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + +We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + +Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). Each +licensee is addressed as "you". + +A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does and +what the program that uses the Library does. + +**1.** You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a +fee. + +**2.** You may modify your copy or copies of the Library or any +portion of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +- **a)** The modified work must itself be a software library. +- **b)** You must cause the files modified to carry prominent + notices stating that you changed the files and the date of + any change. +- **c)** You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. +- **d)** If a facility in the modified Library refers to a function + or a table of data to be supplied by an application program that + uses the facility, other than as an argument passed when the + facility is invoked, then you must make a good faith effort to + ensure that, in the event an application does not supply such + function or table, the facility still operates, and performs + whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of + the application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may opt to apply the terms of the ordinary GNU General +Public License instead of this License to a given copy of the Library. +To do this, you must alter all the notices that refer to this License, +so that they refer to the ordinary GNU General Public License, version +2, instead of to this License. (If a newer version than version 2 of +the ordinary GNU General Public License has appeared, then you can +specify that version instead if you wish.) Do not make any other +change in these notices. + +Once this change is made in a given copy, it is irreversible for that +copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the +Library into a program that is not a library. + +**4.** You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from +a designated place, then offering equivalent access to copy the source +code from the same place satisfies the requirement to distribute the +source code, even though third parties are not compelled to copy the +source along with the object code. + +**5.** A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a work, +in isolation, is not a derivative work of the Library, and therefore +falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. Section +6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure +layouts and accessors, and small macros and small inline functions +(ten lines or less in length), then the use of the object file is +unrestricted, regardless of whether it is legally a derivative work. +(Executables containing this object code plus portions of the Library +will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +**6.** As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a work +containing portions of the Library, and distribute that work under +terms of your choice, provided that the terms permit modification of +the work for the customer's own use and reverse engineering for +debugging such modifications. + +You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +- **a)** Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood that + the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) +- **b)** Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (1) uses at run time + a copy of the library already present on the user's computer + system, rather than copying library functions into the executable, + and (2) will operate properly with a modified version of the + library, if the user installs one, as long as the modified version + is interface-compatible with the version that the work was + made with. +- **c)** Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. +- **d)** If distribution of the work is made by offering access to + copy from a designated place, offer equivalent access to copy the + above specified materials from the same place. +- **e)** Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +**7.** 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +- **a)** Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other + library facilities. This must be distributed under the terms of + the Sections above. +- **b)** Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + +**8.** You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +**9.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +**10.** Each time you redistribute the Library (or any work based on +the Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +**11.** If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to patent +issues), conditions are imposed on you (whether by court order, +agreement or otherwise) that contradict the conditions of this +License, they do not excuse you from the conditions of this License. +If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, +then as a consequence you may not distribute the Library at all. For +example, if a patent license would not permit royalty-free +redistribution of the Library by all those who receive copies directly +or indirectly through you, then the only way you could satisfy both it +and this License would be to refrain entirely from distribution of the +Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**12.** If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +**13.** The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +**14.** If you wish to incorporate parts of the Library into other +free programs whose distribution conditions are incompatible with +these, write to the author to ask for permission. For software which +is copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +**NO WARRANTY** + +**15.** BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**16.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + +## How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It +is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper +mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in + the library `Frob' (a library for tweaking knobs) written + by James Random Hacker. + + signature of Ty Coon, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/3d_armor/modpack.conf b/mods/3d_armor/modpack.conf index bf746c51..9fa2a905 100644 --- a/mods/3d_armor/modpack.conf +++ b/mods/3d_armor/modpack.conf @@ -1 +1,3 @@ +name = 3d_armor +title = 3D Armor description = Visible player armor & wielded items. diff --git a/mods/3d_armor/settingtypes.txt b/mods/3d_armor/settingtypes.txt index 3606dcd6..cd7750e0 100644 --- a/mods/3d_armor/settingtypes.txt +++ b/mods/3d_armor/settingtypes.txt @@ -13,10 +13,6 @@ armor_material_nether (Enable nether armor) bool true # Increase this if you get initialization glitches when a player first joins. armor_init_delay (Initialization delay) int 2 -# Number of initialization attempts. -# Use in conjunction with armor_init_delay if initialization problems persist. -armor_init_times (Initialization attempts) int 10 - # Increase this if armor is not getting into bones due to server lag. armor_bones_delay (Delay for bones) int 1 diff --git a/mods/3d_armor/shields/LICENSE.txt b/mods/3d_armor/shields/LICENSE.txt deleted file mode 100644 index 1f848593..00000000 --- a/mods/3d_armor/shields/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -[mod] Shields [shields] -======================= - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -License Textures ----------------- - -Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0 diff --git a/mods/3d_armor/shields/depends.txt b/mods/3d_armor/shields/depends.txt deleted file mode 100644 index 585cc7aa..00000000 --- a/mods/3d_armor/shields/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -3d_armor diff --git a/mods/3d_armor/shields/description.txt b/mods/3d_armor/shields/description.txt deleted file mode 100644 index cb378bbf..00000000 --- a/mods/3d_armor/shields/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds visible shields to 3d armor. diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua index 63b4e22e..3b2b43cf 100644 --- a/mods/3d_armor/shields/init.lua +++ b/mods/3d_armor/shields/init.lua @@ -328,8 +328,8 @@ if armor.materials.mithril then armor:register_armor("shields:shield_mithril", { description = S("Mithril Shield"), inventory_image = "shields_inv_shield_mithril.png", - groups = {armor_shield=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, + groups = {armor_shield=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, damage_groups = {cracky=2, snappy=1, level=3}, reciprocate_damage = true, on_damage = function(player, index, stack) diff --git a/mods/3d_armor/shields/locale/shields.de.tr b/mods/3d_armor/shields/locale/shields.de.tr index 341563cc..7f86b4d6 100644 --- a/mods/3d_armor/shields/locale/shields.de.tr +++ b/mods/3d_armor/shields/locale/shields.de.tr @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield=Adminschild -Bronze Shield=Bronzeschild +Wooden Shield=Holzschild +Enhanced Wood Shield=Verstärkter Holzschild Cactus Shield=Kaktusschild -Crystal Shield=Kristallschild -Nether Shield=Netherschild +Enhanced Cactus Shield=Verstärkter Kaktusschild +Steel Shield=Stahlschild +Bronze Shield=Bronzeschild Diamond Shield=Diamantschild -Enhanced Cactus Shield=verbessert Kaktusschild -Enhanced Wood Shield=verbessert Holzschild Gold Shield=Goldschild Mithril Shield=Mithrilschild -Steel Shield=Stahlschild -Wooden Shield=Holzschild +Crystal Shield=Kristallschild +Nether Shield=Netherschild diff --git a/mods/3d_armor/shields/locale/shields.eo.tr b/mods/3d_armor/shields/locale/shields.eo.tr new file mode 100644 index 00000000..02de4e9e --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.eo.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Administra Ŝildo +Wooden Shield=Ligna Ŝildo +Enhanced Wood Shield=Plibonigita Ligna Ŝildo +Cactus Shield=Kakta Ŝildo +Enhanced Cactus Shield=Plibonigita Kakta Ŝildo +Steel Shield=Ŝtala Ŝildo +Bronze Shield=Bronza Ŝildo +Diamond Shield=Diamanta Ŝildo +Gold Shield=Ora Ŝildo +Mithril Shield=Mitrila Ŝildo +Crystal Shield=Kristala Ŝildo +Nether Shield=Inferna Ŝildo diff --git a/mods/3d_armor/shields/locale/shields.es.tr b/mods/3d_armor/shields/locale/shields.es.tr new file mode 100644 index 00000000..962f130f --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.es.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de admin +Wooden Shield=Escudo de madera +Enhanced Wood Shield=Escudo de madera mejorado +Cactus Shield=Escudo de cactus +Enhanced Cactus Shield=Escudo de cactus mejorado +Steel Shield=Escudo de acero +Bronze Shield=Escudo de bronce +Diamond Shield=Escudo de diamante +Gold Shield=Escudo de oro +Mithril Shield=Escudo de mitrilo +Crystal Shield=Escudo de cristal +Nether Shield=Escudo de nether diff --git a/mods/3d_armor/shields/locale/shields.fr.tr b/mods/3d_armor/shields/locale/shields.fr.tr index 081c794d..5c76e992 100644 --- a/mods/3d_armor/shields/locale/shields.fr.tr +++ b/mods/3d_armor/shields/locale/shields.fr.tr @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield=Bouclier d'admin -Bronze Shield=Bouclier en bronze -Cactus Shield=Bouclier en cactus -Crystal Shield=Bouclier en cristal -Nether Shield=Bouclier en nether -Diamond Shield=Bouclier en diamant -Enhanced Cactus Shield=Bouclier en cactus amélioré +Wooden Shield=Bouclier en bois Enhanced Wood Shield=Bouclier en bois amélioré +Cactus Shield=Bouclier en cactus +Enhanced Cactus Shield=Bouclier en cactus amélioré +Steel Shield=Bouclier en acier +Bronze Shield=Bouclier en bronze +Diamond Shield=Bouclier en diamant Gold Shield=Bouclier en or Mithril Shield=Bouclier en mithril -Steel Shield=Bouclier en acier -Wooden Shield=Bouclier en bois +Crystal Shield=Bouclier en cristal +Nether Shield=Bouclier en nether diff --git a/mods/3d_armor/shields/locale/shields.pt_BR.tr b/mods/3d_armor/shields/locale/shields.pt_BR.tr new file mode 100644 index 00000000..26515cc6 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de Administrador +Wooden Shield=Escudo de Madeira +Enhanced Wood Shield=Escudo de Madeira Encantado +Cactus Shield=Escudo de Cacto +Enhanced Cactus Shield=Escude de Cacto Encantado +Steel Shield=Escudo de Aço +Bronze Shield=Escudo de Bronze +Diamond Shield=Escudo de Diamante +Gold Shield=Escudo de Ouro +Mithril Shield=Escudo de Mithril +Crystal Shield=Escudo de Cristal +Nether Shield=Escudo de Nether diff --git a/mods/3d_armor/shields/locale/shields.ru.tr b/mods/3d_armor/shields/locale/shields.ru.tr new file mode 100755 index 00000000..9e80ce64 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.ru.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=щит админа +Wooden Shield=деревянный щит +Enhanced Wood Shield=усиленный деревянный щит +Cactus Shield=кактусовый щит +Enhanced Cactus Shield=усиленный кактусовый щит +Steel Shield=стальной щит +Bronze Shield=бронзовый щит +Diamond Shield=алмазный щит +Gold Shield=золотой щит +Mithril Shield=мифриловый щит +Crystal Shield=кристальный щит +Nether Shield=адский щит diff --git a/mods/3d_armor/shields/locale/shields.sv.tr b/mods/3d_armor/shields/locale/shields.sv.tr new file mode 100644 index 00000000..fb14f539 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.sv.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Adminsköld +Wooden Shield=Träsköld +Enhanced Wood Shield=Förbättrad träsköld +Cactus Shield=Kaktussköld +Enhanced Cactus Shield=Förbättrad kaktussköld +Steel Shield=Stålsköld +Bronze Shield=Bronssköld +Diamond Shield=Diamantsköld +Gold Shield=Guldsköld +Mithril Shield=Mithrilsköld +Crystal Shield=Kristallsköld +Nether Shield=Nethersköld diff --git a/mods/3d_armor/shields/locale/template.txt b/mods/3d_armor/shields/locale/template.txt index 9c30ca79..1b39fd68 100644 --- a/mods/3d_armor/shields/locale/template.txt +++ b/mods/3d_armor/shields/locale/template.txt @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield= -Bronze Shield= -Cactus Shield= -Crystal Shield= -Nether Shield= -Diamond Shield= -Enhanced Cactus Shield= +Wooden Shield= Enhanced Wood Shield= +Cactus Shield= +Enhanced Cactus Shield= +Steel Shield= +Bronze Shield= +Diamond Shield= Gold Shield= Mithril Shield= -Steel Shield= -Wooden Shield= +Crystal Shield= +Nether Shield= diff --git a/mods/3d_armor/wieldview/LICENSE.txt b/mods/3d_armor/wieldview/LICENSE.txt deleted file mode 100644 index e1552c06..00000000 --- a/mods/3d_armor/wieldview/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] visible wielded items [wieldview] -======================================= - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/wieldview/depends.txt b/mods/3d_armor/wieldview/depends.txt deleted file mode 100644 index b6cac219..00000000 --- a/mods/3d_armor/wieldview/depends.txt +++ /dev/null @@ -1 +0,0 @@ -3d_armor diff --git a/mods/3d_armor/wieldview/description.txt b/mods/3d_armor/wieldview/description.txt deleted file mode 100644 index 0d51ad95..00000000 --- a/mods/3d_armor/wieldview/description.txt +++ /dev/null @@ -1 +0,0 @@ -Makes hand wielded items visible to other players. diff --git a/mods/3d_armor/wieldview/get_texture.lua b/mods/3d_armor/wieldview/get_texture.lua new file mode 100644 index 00000000..1c84f16b --- /dev/null +++ b/mods/3d_armor/wieldview/get_texture.lua @@ -0,0 +1,215 @@ +local f = string.format + +local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") +if not node_tiles then + node_tiles = false + minetest.settings:set("wieldview_node_tiles", "false") +end + +-- https://github.com/minetest/minetest/blob/9fc018ded10225589d2559d24a5db739e891fb31/doc/lua_api.txt#L453-L462 +local function escape_texture(texturestring) + -- store in a variable so we don't return both rvs of gsub + local v = texturestring:gsub("%^", "\\^"):gsub(":", "\\:") + return v +end + +local function memoize(func) + local memo = {} + return function(arg) + if arg == nil then + return func(arg) + end + local rv = memo[arg] + + if not rv then + rv = func(arg) + memo[arg] = rv + end + + return rv + end +end + +local function is_vertical_frames(animation) + return ( + animation.type == "vertical_frames" and + animation.aspect_w and + animation.aspect_h + ) +end + +local function get_single_frame(animation, image_name) + return ("[combine:%ix%i^[noalpha^[colorize:#FFF:255^[mask:%s"):format( + animation.aspect_w, + animation.aspect_h, + image_name + ) +end + +local function is_sheet_2d(animation) + return ( + animation.type == "sheet_2d" and + animation.frames_w and + animation.frames_h + ) +end + +local function get_sheet_2d(animation, image_name) + return ("%s^[sheet:%ix%i:0,0"):format( + image_name, + animation.frames_w, + animation.frames_h + ) +end + +local get_image_from_tile = memoize(function(tile) + if type(tile) == "string" then + return tile + + elseif type(tile) == "table" then + local image_name + + if type(tile.image) == "string" then + image_name = tile.image + + elseif type(tile.name) == "string" then + image_name = tile.name + + end + + if image_name then + local animation = tile.animation + if animation then + if is_vertical_frames(animation) then + return get_single_frame(animation, image_name) + + elseif is_sheet_2d(animation) then + return get_sheet_2d(animation, image_name) + end + end + + return image_name + end + end + + return "blank.png" +end) + +local function get_image_cube(tiles) + if #tiles >= 6 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[6] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 5 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[5] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 4 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[4] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 3 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 2 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png") + ) + + elseif #tiles == 1 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png") + ) + end + + return "blank.png" +end + +local function is_normal_node(drawtype) + return ( + drawtype == "normal" or + drawtype == "allfaces" or + drawtype == "allfaces_optional" or + drawtype == "glasslike" or + drawtype == "glasslike_framed" or + drawtype == "glasslike_framed_optional" or + drawtype == "liquid" + ) +end + +armor.get_wield_image = memoize(function(item) + item = ItemStack(item) + + if item:is_empty() then + return "blank.png" + end + + local def = item:get_definition() + if not def then + return "unknown_item.png" + end + + local meta = item:get_meta() + local color = meta:get("color") or def.color + + local image = "blank.png" + + if def.wield_image and def.wield_image ~= "" then + local parts = {def.wield_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.wield_overlay then + parts[#parts + 1] = def.wield_overlay + end + image = table.concat(parts, "^") + + elseif def.inventory_image and def.inventory_image ~= "" then + local parts = {def.inventory_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.inventory_overlay then + parts[#parts + 1] = def.inventory_overlay + end + image = table.concat(parts, "^") + + elseif def.type == "node" then + if def.drawtype == "nodebox" or def.drawtype == "mesh" then + image = "blank.png" + + else + local tiles = def.tiles + if type(tiles) == "string" then + image = get_image_from_tile(tiles) + + elseif type(tiles) == "table" then + if is_normal_node(def.drawtype) and node_tiles then + image = get_image_cube(tiles) + + else + image = get_image_from_tile(tiles[1]) + end + end + end + end + + return image +end) diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua index 6397d049..80bb9cff 100644 --- a/mods/3d_armor/wieldview/init.lua +++ b/mods/3d_armor/wieldview/init.lua @@ -4,31 +4,20 @@ if not update_time then update_time = 2 minetest.settings:set("wieldview_update_time", tostring(update_time)) end -local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") -if not node_tiles then - node_tiles = false - minetest.settings:set("wieldview_node_tiles", "false") -end wieldview = { wielded_item = {}, transform = {}, } +dofile(minetest.get_modpath(minetest.get_current_modname()).."/get_texture.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") wieldview.get_item_texture = function(self, item) - local texture = "3d_armor_trans.png" + local texture = "blank.png" if item ~= "" then - if minetest.registered_items[item] then - if minetest.registered_items[item].inventory_image ~= "" then - texture = minetest.registered_items[item].inventory_image - elseif node_tiles == true and minetest.registered_items[item].tiles - and type(minetest.registered_items[item].tiles[1]) == "string" - and minetest.registered_items[item].tiles[1] ~= "" then - texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) - end - end + texture = armor.get_wield_image(item) + -- Get item image transformation, first from group, then from transform.lua local transform = minetest.get_item_group(item, "wieldview_transform") if transform == 0 then diff --git a/mods/Minetest-WorldEdit/.luacheckrc b/mods/Minetest-WorldEdit/.luacheckrc new file mode 100644 index 00000000..e9f95fc1 --- /dev/null +++ b/mods/Minetest-WorldEdit/.luacheckrc @@ -0,0 +1,28 @@ +read_globals = { + "minetest", "VoxelArea", "ItemStack", + "unified_inventory", "sfinv", "smart_inventory", "inventory_plus", + "dump", + + table = {fields = {"copy", "indexof", "insert_all"}}, + vector = {fields = { + -- as of 5.0 + "new", "direction", "distance", "length", "normalize", "floor", "round", + "apply", "equals", "sort", "add", "subtract", "multiply", "divide", + -- polyfilled + "copy" + }}, +} +globals = {"worldedit"} + +-- Ignore these errors until someone decides to fix them +ignore = {"212", "213", "411", "412", "421", "422", "431", "432", "631"} + +files["worldedit/common.lua"] = { + globals = {"vector"}, +} +files["worldedit/test"] = { + read_globals = {"testnode1", "testnode2", "testnode3", "area", "check", "place_pattern"}, +} +files["worldedit/test/init.lua"] = { + globals = {"testnode1", "testnode2", "testnode3", "area", "check", "place_pattern"}, +} diff --git a/mods/Minetest-WorldEdit/.util/run_tests.sh b/mods/Minetest-WorldEdit/.util/run_tests.sh index 5cbc15ec..e596dda7 100755 --- a/mods/Minetest-WorldEdit/.util/run_tests.sh +++ b/mods/Minetest-WorldEdit/.util/run_tests.sh @@ -1,29 +1,41 @@ #!/bin/bash -tempdir=/tmp/mt +tempdir=$(mktemp -d) confpath=$tempdir/minetest.conf worldpath=$tempdir/world +trap 'rm -rf "$tempdir"' EXIT -use_docker=y -[ -x ../../bin/minetestserver ] && use_docker= +[ -f worldedit/mod.conf ] || { echo "Must be run in modpack root folder." >&2; exit 1; } -rm -rf $tempdir -mkdir -p $worldpath -# the docker image doesn't have devtest -[ -n "$use_docker" ] || printf '%s\n' gameid=devtest >$worldpath/world.mt +mtserver= +if [ "$1" == "--docker" ]; then + command -v docker >/dev/null || { echo "Docker is not installed." >&2; exit 1; } + [ -d minetest_game ] || echo "A source checkout of minetest_game was not found. This can fail if your docker image does not ship a game." >&2; +else + mtserver=$(command -v minetestserver) + [[ -z "$mtserver" && -x ../../bin/minetestserver ]] && mtserver=../../bin/minetestserver + [ -z "$mtserver" ] && { echo "To run the test outside of Docker, an installation of minetestserver is required." >&2; exit 1; } +fi + +mkdir $worldpath printf '%s\n' mg_name=singlenode '[end_of_params]' >$worldpath/map_meta.txt printf '%s\n' worldedit_run_tests=true max_forceloaded_blocks=9999 >$confpath -if [ -n "$use_docker" ]; then +if [ -z "$mtserver" ]; then chmod -R 777 $tempdir - docker run --rm -i \ - -v $confpath:/etc/minetest/minetest.conf \ - -v $tempdir:/var/lib/minetest/.minetest \ - -v "$PWD/worldedit":/var/lib/minetest/.minetest/world/worldmods/worldedit \ - registry.gitlab.com/minetest/minetest/server:${MINETEST_VER} + [ -z "$DOCKER_IMAGE" ] && DOCKER_IMAGE="ghcr.io/minetest/minetest:master" + vol=( + -v "$confpath":/etc/minetest/minetest.conf + -v "$tempdir":/var/lib/minetest/.minetest + -v "$PWD/worldedit":/var/lib/minetest/.minetest/world/worldmods/worldedit + ) + [ -d minetest_game ] && vol+=( + -v "$PWD/minetest_game":/var/lib/minetest/.minetest/games/minetest_game + ) + docker run --rm -i "${vol[@]}" "$DOCKER_IMAGE" else mkdir $worldpath/worldmods ln -s "$PWD/worldedit" $worldpath/worldmods/worldedit - ../../bin/minetestserver --config $confpath --world $worldpath --logfile /dev/null + $mtserver --config "$confpath" --world "$worldpath" --logfile /dev/null fi test -f $worldpath/tests_ok || exit 1 diff --git a/mods/Minetest-WorldEdit/ChatCommands.md b/mods/Minetest-WorldEdit/ChatCommands.md index 1d3b4e9b..1b7a1c04 100644 --- a/mods/Minetest-WorldEdit/ChatCommands.md +++ b/mods/Minetest-WorldEdit/ChatCommands.md @@ -409,14 +409,15 @@ Load nodes from "(world folder)/schems/``.we" with position 1 of the curre ### `//lua ` -Executes `` as a Lua chunk in the global namespace. +Executes `` as a Lua chunk in the global namespace with the variables `name`, `player` and `pos` (= player position) available. - //lua worldedit.pos1["singleplayer"] = {x=0, y=0, z=0} - //lua worldedit.rotate(worldedit.pos1["singleplayer"], worldedit.pos2["singleplayer"], "y", 90) + //lua worldedit.pos1[name] = vector.new(0, 0, 0) + //lua worldedit.rotate(worldedit.pos1["jones"], worldedit.pos2["jones"], "y", 90) + //lua player:set_pos(worldedit.pos2[name]) ### `//luatransform ` -Executes `` as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region. +Executes `` as a Lua chunk in the global namespace with the variable `pos` available, for each node in the current WorldEdit region. //luatransform minetest.swap_node(pos, {name="default:stone"}) //luatransform if minetest.get_node(pos).name == "air" then minetest.add_node(pos, {name="default:water_source"}) end @@ -428,11 +429,12 @@ Save the current WorldEdit region using the Minetest Schematic format to "(world //mtschemcreate some random filename //mtschemcreate huge_base -### `//mtschemplace ` +### `//mtschemplace [rotation]` Load nodes from "(world folder)/schems/``.mts" with position 1 of the current WorldEdit region as the origin. +Valid values for `[rotation]` are 0, 90, 180 and 270. - //mtschemplace some random filename + //mtschemplace a_tree 270 //mtschemplace huge_base ### `//mtschemprob start/finish/get` diff --git a/mods/Minetest-WorldEdit/README.md b/mods/Minetest-WorldEdit/README.md index d377902d..69ca93ad 100644 --- a/mods/Minetest-WorldEdit/README.md +++ b/mods/Minetest-WorldEdit/README.md @@ -2,7 +2,7 @@ WorldEdit v1.3 ============== The ultimate in-game world editing tool for [Minetest](http://minetest.net/)! Tons of functionality to help with building, fixing, and more. -For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) at the Minetest forums. +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=572) at the Minetest forums. # New users should see the [tutorial](Tutorial.md). diff --git a/mods/Minetest-WorldEdit/WorldEdit API.md b/mods/Minetest-WorldEdit/WorldEdit API.md index fc9cf652..ae27f417 100644 --- a/mods/Minetest-WorldEdit/WorldEdit API.md +++ b/mods/Minetest-WorldEdit/WorldEdit API.md @@ -227,11 +227,19 @@ Code ---- Contained in code.lua, this module allows arbitrary Lua code to be used with WorldEdit. -### error = worldedit.lua(code) +### error = worldedit.lua(code, name) -Executes `code` as a Lua chunk in the global namespace. +the given code gets encapsulated into a function with parameters `name`, `player`, `pos` +where + * `name` is a playername or `nil` + * `player` is the player object of the above player if applicable, otherwise `nil` + * `pos` is the position of the aforementioned player (if applicable, otherwise `nil`) rounded to integers -Returns an error if the code fails or nil otherwise. +the resulting function is then executed as a Lua chunk in the global namespace. + +The return is + * a string in case of an error + * a tuple of `nil` and return of the function converted to a string in case of success ### error = worldedit.luatransform(pos1, pos2, code) diff --git a/mods/Minetest-WorldEdit/modpack.conf b/mods/Minetest-WorldEdit/modpack.conf index 4d9e6f56..450e010e 100644 --- a/mods/Minetest-WorldEdit/modpack.conf +++ b/mods/Minetest-WorldEdit/modpack.conf @@ -1,2 +1,3 @@ name = Minetest-WorldEdit description = WorldEdit is an in-game world editor. Use it to repair griefing, or just create awesome buildings in seconds. +min_minetest_version = 5.0 diff --git a/mods/Minetest-WorldEdit/settingtypes.txt b/mods/Minetest-WorldEdit/settingtypes.txt new file mode 100644 index 00000000..99ca1bc6 --- /dev/null +++ b/mods/Minetest-WorldEdit/settingtypes.txt @@ -0,0 +1,4 @@ +# For operations that potentially affect more than the specified amount of nodes +# WorldEdit will require additional confirmation via //y before proceeding. +# Set to 0 to disable the confirmation in all cases. +worldedit_safe_region_limit (Limit for safe region warning) int 20000 diff --git a/mods/Minetest-WorldEdit/worldedit/code.lua b/mods/Minetest-WorldEdit/worldedit/code.lua index a939debb..0765e841 100644 --- a/mods/Minetest-WorldEdit/worldedit/code.lua +++ b/mods/Minetest-WorldEdit/worldedit/code.lua @@ -2,17 +2,29 @@ -- @module worldedit.code --- Executes `code` as a Lua chunk in the global namespace. --- @return An error message if the code fails, or nil on success. -function worldedit.lua(code) - local func, err = loadstring(code) - if not func then -- Syntax error +-- the code will be encapsulated into a function with parameters +-- * name (the name of the player issuing the //lua command) +-- * player (the player object of the player) +-- * pos (the position of the player rounded to integers) +-- @return string in case of error, tuple of nil, return of code as string in case of success +function worldedit.lua(code, name) + local factory, err = loadstring("return function(name, player, pos)\n" .. code .. "\nend") + if not factory then -- Syntax error return err end - local good, err = pcall(func) - if not good then -- Runtime error - return err + local func = factory() + local player, pos + if name then + player = minetest.get_player_by_name(name) + if player then + pos = vector.round(player:get_pos()) + end end - return nil + local good, err = pcall(func, name, player, pos) + if not good then -- Runtime error + return tostring(err) + end + return nil, dump(err) end @@ -31,7 +43,7 @@ function worldedit.luatransform(pos1, pos2, code) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) while pos.x <= pos2.x do pos.y = pos1.y while pos.y <= pos2.y do @@ -39,7 +51,7 @@ function worldedit.luatransform(pos1, pos2, code) while pos.z <= pos2.z do local good, err = pcall(func, pos) if not good then -- Runtime error - return err + return tostring(err) end pos.z = pos.z + 1 end diff --git a/mods/Minetest-WorldEdit/worldedit/common.lua b/mods/Minetest-WorldEdit/worldedit/common.lua index 9a2215dd..8289f66e 100644 --- a/mods/Minetest-WorldEdit/worldedit/common.lua +++ b/mods/Minetest-WorldEdit/worldedit/common.lua @@ -1,12 +1,21 @@ --- Common functions [INTERNAL]. All of these functions are internal! -- @module worldedit.common +-- Polyfill for vector.copy (added in 5.5.0) +if not vector.copy then + local vnew = vector.new + vector.copy = function(v) + return vnew(v.x, v.y, v.z) + end +end + + --- Copies and modifies positions `pos1` and `pos2` so that each component of -- `pos1` is less than or equal to the corresponding component of `pos2`. -- Returns the new positions. function worldedit.sort_pos(pos1, pos2) - pos1 = {x=pos1.x, y=pos1.y, z=pos1.z} - pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} + pos1 = vector.copy(pos1) + pos2 = vector.copy(pos2) if pos1.x > pos2.x then pos2.x, pos1.x = pos1.x, pos2.x end @@ -45,12 +54,22 @@ function worldedit.get_axis_others(axis) end +-- Create a vmanip and read the area from map, this causes all +-- MapBlocks to be loaded into memory synchronously. +-- This doesn't actually *keep* them loaded, unlike the name implies. function worldedit.keep_loaded(pos1, pos2) - -- Create a vmanip and read the area from map, this - -- causes all MapBlocks to be loaded into memory. - -- This doesn't actually *keep* them loaded, unlike the name implies. - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos2) + -- rough estimate, a MapNode is 4 bytes in the engine + if worldedit.volume(pos1, pos2) > 268400000 then + print("[WorldEdit] Requested to load an area bigger than 1GB, refusing. The subsequent operation may fail.") + return + end + if minetest.load_area then + -- same effect but without unnecessary data copying + minetest.load_area(pos1, pos2) + else + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos2) + end end @@ -65,7 +84,7 @@ function mh.get_empty_data(area) -- only partially modified aren't overwriten. local data = {} local c_ignore = minetest.get_content_id("ignore") - for i = 1, worldedit.volume(area.MinEdge, area.MaxEdge) do + for i = 1, area:getVolume() do data[i] = c_ignore end return data @@ -117,3 +136,72 @@ function mh.finish(manip, data) manip:update_map() end + +-- returns an iterator that returns voxelarea indices for a hollow cuboid +function mh.iter_hollowcuboid(area, minx, miny, minz, maxx, maxy, maxz) + local i = area:index(minx, miny, minz) - 1 + local xrange = maxx - minx + 1 + local nextaction = i + 1 + xrange + local do_hole = false + + local y = 0 + local ydiff = maxy - miny + local ystride = area.ystride + local ymultistride = ydiff * ystride + + local z = 0 + local zdiff = maxz - minz + local zstride = area.zstride + local zcorner = true + + return function() + -- continue i until it needs to jump ystride + i = i + 1 + if i ~= nextaction then + return i + end + + -- add the x offset if y (and z) are not 0 or maxy (or maxz) + if do_hole then + do_hole = false + i = i + xrange - 2 + nextaction = i + 1 + return i + end + + -- continue y until maxy is exceeded + y = y+1 + if y ~= ydiff + 1 then + i = i + ystride - xrange + if zcorner + or y == ydiff then + nextaction = i + xrange + else + nextaction = i + 1 + do_hole = true + end + return i + end + + -- continue z until maxz is exceeded + z = z+1 + if z == zdiff + 1 then + -- hollowcuboid finished, return nil + return + end + + -- set i to index(minx, miny, minz + z) - 1 + i = i + zstride - (ymultistride + xrange) + zcorner = z == zdiff + + -- y is 0, so traverse the xs + y = 0 + nextaction = i + xrange + return i + end +end + +function mh.iterp_hollowcuboid(area, minp, maxp) + return mh.iter_hollowcuboid(area, minp.x, minp.y, minp.z, + maxp.x, maxp.y, maxp.z) +end diff --git a/mods/Minetest-WorldEdit/worldedit/compatibility.lua b/mods/Minetest-WorldEdit/worldedit/compatibility.lua index c989a058..e0bd5ea7 100644 --- a/mods/Minetest-WorldEdit/worldedit/compatibility.lua +++ b/mods/Minetest-WorldEdit/worldedit/compatibility.lua @@ -24,11 +24,14 @@ function worldedit.metasave(pos1, pos2, filename) return count end -function worldedit.metaload(originpos, filename) +function worldedit.metaload(originpos, file_name) deprecated("load") - filename = minetest.get_worldpath() .. "/schems/" .. file .. ".wem" - local file, err = io.open(filename, "wb") - if err then return 0 end + local file_path = minetest.get_worldpath() .. + "/schems/" .. file_name .. ".wem" + local file, err = io.open(file_path, "wb") + if err then + return 0 + end local data = file:read("*a") return worldedit.deserialize(originpos, data) end diff --git a/mods/Minetest-WorldEdit/worldedit/cuboid.lua b/mods/Minetest-WorldEdit/worldedit/cuboid.lua index d27e2333..5c52747b 100644 --- a/mods/Minetest-WorldEdit/worldedit/cuboid.lua +++ b/mods/Minetest-WorldEdit/worldedit/cuboid.lua @@ -2,16 +2,16 @@ worldedit.cuboid_volumetric_expand = function(name, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "Undefined cuboid" end - + local delta1 = vector.new() local delta2 = vector.new() local delta_dir1 local delta_dir2 - + delta1 = vector.add(delta1, amount) delta2 = vector.add(delta2, amount) delta_dir1, delta_dir2 = worldedit.get_expansion_directions(pos1, pos2) @@ -19,7 +19,7 @@ worldedit.cuboid_volumetric_expand = function(name, amount) delta2 = vector.multiply(delta2, delta_dir2) worldedit.pos1[name] = vector.add(pos1, delta1) worldedit.pos2[name] = vector.add(pos2, delta2) - + return true end @@ -28,18 +28,18 @@ end worldedit.cuboid_linear_expand = function(name, axis, direction, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "undefined cuboid" end - + if direction ~= 1 and direction ~= -1 then return false, "invalid marker" end - + local marker = worldedit.marker_get_closest_to_axis(name, axis, direction) local deltavect = vector.new() - + if axis == 'x' then deltavect.x = amount * direction elseif axis == 'y' then @@ -49,7 +49,7 @@ worldedit.cuboid_linear_expand = function(name, axis, direction, amount) else return false, "invalid axis" end - + worldedit.marker_move(name, marker, deltavect) return true end @@ -59,11 +59,13 @@ end worldedit.cuboid_shift = function(name, axis, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "undefined cuboid" end - + + assert(not rawequal(pos1, pos2)) -- vectors must not alias + if axis == 'x' then worldedit.pos1[name].x = pos1.x + amount worldedit.pos2[name].x = pos2.x + amount @@ -76,7 +78,7 @@ worldedit.cuboid_shift = function(name, axis, amount) else return false, "invalid axis" end - + return true end @@ -86,7 +88,7 @@ worldedit.marker_move = function(name, marker, deltavector) if marker ~= 1 and marker ~= 2 then return false end - + if marker == 1 then local pos = worldedit.pos1[name] worldedit.pos1[name] = vector.add(deltavector, pos) @@ -94,7 +96,7 @@ worldedit.marker_move = function(name, marker, deltavector) local pos = worldedit.pos2[name] worldedit.pos2[name] = vector.add(deltavector, pos) end - + return true end @@ -134,10 +136,11 @@ end -- Return the marker that is closest to the player worldedit.marker_get_closest_to_player = function(name) - local playerpos = minetest.get_player_by_name(name):get_pos() + local player = assert(minetest.get_player_by_name(name)) + local playerpos = player:get_pos() local dist1 = vector.distance(playerpos, worldedit.pos1[name]) local dist2 = vector.distance(playerpos, worldedit.pos2[name]) - + if dist1 < dist2 then return 1 else @@ -150,7 +153,7 @@ end worldedit.marker_get_closest_to_axis = function(name, axis, direction) local pos1 = vector.new() local pos2 = vector.new() - + if direction ~= 1 and direction ~= -1 then return nil end @@ -185,20 +188,20 @@ worldedit.marker_get_closest_to_axis = function(name, axis, direction) end --- Translates up, down, left, right, front, back to their corresponding axes and +-- Translates up, down, left, right, front, back to their corresponding axes and -- directions according to faced direction worldedit.translate_direction = function(name, direction) local axis, dir = worldedit.player_axis(name) local resaxis, resdir - + if direction == "up" then return 'y', 1 end - + if direction == "down" then return 'y', -1 end - + if direction == "front" then if axis == "y" then resaxis = nil @@ -208,7 +211,7 @@ worldedit.translate_direction = function(name, direction) resdir = dir end end - + if direction == "back" then if axis == "y" then resaxis = nil @@ -218,7 +221,7 @@ worldedit.translate_direction = function(name, direction) resdir = -dir end end - + if direction == "left" then if axis == 'x' then resaxis = 'z' @@ -228,7 +231,7 @@ worldedit.translate_direction = function(name, direction) resdir = -dir end end - + if direction == "right" then if axis == 'x' then resaxis = 'z' @@ -238,6 +241,6 @@ worldedit.translate_direction = function(name, direction) resdir = dir end end - + return resaxis, resdir end diff --git a/mods/Minetest-WorldEdit/worldedit/init.lua b/mods/Minetest-WorldEdit/worldedit/init.lua index 4f0f2c19..dab89032 100644 --- a/mods/Minetest-WorldEdit/worldedit/init.lua +++ b/mods/Minetest-WorldEdit/worldedit/init.lua @@ -27,6 +27,7 @@ end dofile(path .. "/common.lua") load_module(path .. "/manipulations.lua") load_module(path .. "/primitives.lua") +load_module(path .. "/transformations.lua") load_module(path .. "/visualization.lua") load_module(path .. "/serialization.lua") load_module(path .. "/code.lua") @@ -39,6 +40,6 @@ if minetest.settings:get_bool("log_mods") then end if minetest.settings:get_bool("worldedit_run_tests") then - dofile(path .. "/test.lua") + dofile(path .. "/test/init.lua") minetest.after(0, worldedit.run_tests) end diff --git a/mods/Minetest-WorldEdit/worldedit/manipulations.lua b/mods/Minetest-WorldEdit/worldedit/manipulations.lua index 54dc8885..73d02425 100644 --- a/mods/Minetest-WorldEdit/worldedit/manipulations.lua +++ b/mods/Minetest-WorldEdit/worldedit/manipulations.lua @@ -98,51 +98,6 @@ function worldedit.replace(pos1, pos2, search_node, replace_node, inverse) end -local function deferred_execution(next_one, finished) - -- Allocate 100% of server step for execution (might lag a little) - local allocated_usecs = - tonumber(minetest.settings:get("dedicated_server_step")) * 1000000 - local function f() - local deadline = minetest.get_us_time() + allocated_usecs - repeat - local is_done = next_one() - if is_done then - if finished then - finished() - end - return - end - until minetest.get_us_time() >= deadline - minetest.after(0, f) - end - f() -end - ---- Duplicates a region `amount` times with offset vector `direction`. --- Stacking is spread across server steps. --- @return The number of nodes stacked. -function worldedit.stack2(pos1, pos2, direction, amount, finished) - -- Protect arguments from external changes during execution - pos1 = table.copy(pos1) - pos2 = table.copy(pos2) - direction = table.copy(direction) - - local i = 0 - local translated = {x=0, y=0, z=0} - local function step() - translated.x = translated.x + direction.x - translated.y = translated.y + direction.y - translated.z = translated.z + direction.z - worldedit.copy2(pos1, pos2, translated) - i = i + 1 - return i >= amount - end - deferred_execution(step, finished) - - return worldedit.volume(pos1, pos2) * amount -end - - --- Copies a region along `axis` by `amount` nodes. -- @param pos1 -- @param pos2 @@ -155,7 +110,7 @@ function worldedit.copy(pos1, pos2, axis, amount) -- Decide if we need to copy stuff backwards (only applies to metadata) local backwards = amount > 0 and amount < (pos2[axis] - pos1[axis] + 1) - local off = {x=0, y=0, z=0} + local off = vector.new() off[axis] = amount return worldedit.copy2(pos1, pos2, off, backwards) end @@ -170,7 +125,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) local src_manip, src_area = mh.init(pos1, pos2) - local src_stride = {x=1, y=src_area.ystride, z=src_area.zstride} + local src_stride = vector.new(1, src_area.ystride, src_area.zstride) local src_offset = vector.subtract(pos1, src_area.MinEdge) local dpos1 = vector.add(pos1, off) @@ -178,7 +133,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) local dim = vector.add(vector.subtract(pos2, pos1), 1) local dst_manip, dst_area = mh.init(dpos1, dpos2) - local dst_stride = {x=1, y=dst_area.ystride, z=dst_area.zstride} + local dst_stride = vector.new(1, dst_area.ystride, dst_area.zstride) local dst_offset = vector.subtract(dpos1, dst_area.MinEdge) local function do_copy(src_data, dst_data) @@ -217,8 +172,6 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) dst_manip:set_param2_data(dst_data) mh.finish(dst_manip) - src_data = nil - dst_data = nil -- Copy metadata local get_meta = minetest.get_meta @@ -226,7 +179,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) for z = dim.z-1, 0, -1 do for y = dim.y-1, 0, -1 do for x = dim.x-1, 0, -1 do - local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z} + local pos = vector.new(pos1.x+x, pos1.y+y, pos1.z+z) local meta = get_meta(pos):to_table() pos = vector.add(pos, off) get_meta(pos):from_table(meta) @@ -237,7 +190,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) for z = 0, dim.z-1 do for y = 0, dim.y-1 do for x = 0, dim.x-1 do - local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z} + local pos = vector.new(pos1.x+x, pos1.y+y, pos1.z+z) local meta = get_meta(pos):to_table() pos = vector.add(pos, off) get_meta(pos):from_table(meta) @@ -286,21 +239,21 @@ function worldedit.move(pos1, pos2, axis, amount) end -- Copy stuff to new location - local off = {x=0, y=0, z=0} + local off = vector.new() off[axis] = amount worldedit.copy2(pos1, pos2, off, backwards) -- Nuke old area if not overlap then - nuke_area({x=0, y=0, z=0}, dim) + nuke_area(vector.new(), dim) else -- Source and destination region are overlapping, which means we can't -- blindly delete the [pos1, pos2] area local leftover = vector.new(dim) -- size of the leftover slice leftover[axis] = math.abs(amount) if amount > 0 then - nuke_area({x=0, y=0, z=0}, leftover) + nuke_area(vector.new(), leftover) else - local top = {x=0, y=0, z=0} -- offset of the leftover slice from pos1 + local top = vector.new() -- offset of the leftover slice from pos1 top[axis] = dim[axis] - math.abs(amount) nuke_area(top, leftover) end @@ -309,316 +262,6 @@ function worldedit.move(pos1, pos2, axis, amount) return worldedit.volume(pos1, pos2) end ---- Duplicates a region along `axis` `amount` times. --- Stacking is spread across server steps. --- @param pos1 --- @param pos2 --- @param axis Axis direction, "x", "y", or "z". --- @param count --- @return The number of nodes stacked. -function worldedit.stack(pos1, pos2, axis, count, finished) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local length = pos2[axis] - pos1[axis] + 1 - if count < 0 then - count = -count - length = -length - end - - local i, distance = 0, 0 - local function step() - distance = distance + length - worldedit.copy(pos1, pos2, axis, distance) - i = i + 1 - return i >= count - end - deferred_execution(step, finished) - - return worldedit.volume(pos1, pos2) * count -end - - ---- Stretches a region by a factor of positive integers along the X, Y, and Z --- axes, respectively, with `pos1` as the origin. --- @param pos1 --- @param pos2 --- @param stretch_x Amount to stretch along X axis. --- @param stretch_y Amount to stretch along Y axis. --- @param stretch_z Amount to stretch along Z axis. --- @return The number of nodes scaled. --- @return The new scaled position 1. --- @return The new scaled position 2. -function worldedit.stretch(pos1, pos2, stretch_x, stretch_y, stretch_z) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - -- Prepare schematic of large node - local get_node, get_meta, place_schematic = minetest.get_node, - minetest.get_meta, minetest.place_schematic - local placeholder_node = {name="", param1=255, param2=0} - local nodes = {} - for i = 1, stretch_x * stretch_y * stretch_z do - nodes[i] = placeholder_node - end - local schematic = {size={x=stretch_x, y=stretch_y, z=stretch_z}, data=nodes} - - local size_x, size_y, size_z = stretch_x - 1, stretch_y - 1, stretch_z - 1 - - local new_pos2 = { - x = pos1.x + (pos2.x - pos1.x) * stretch_x + size_x, - y = pos1.y + (pos2.y - pos1.y) * stretch_y + size_y, - z = pos1.z + (pos2.z - pos1.z) * stretch_z + size_z, - } - worldedit.keep_loaded(pos1, new_pos2) - - local pos = {x=pos2.x, y=0, z=0} - local big_pos = {x=0, y=0, z=0} - while pos.x >= pos1.x do - pos.y = pos2.y - while pos.y >= pos1.y do - pos.z = pos2.z - while pos.z >= pos1.z do - local node = get_node(pos) -- Get current node - local meta = get_meta(pos):to_table() -- Get meta of current node - - -- Calculate far corner of the big node - local pos_x = pos1.x + (pos.x - pos1.x) * stretch_x - local pos_y = pos1.y + (pos.y - pos1.y) * stretch_y - local pos_z = pos1.z + (pos.z - pos1.z) * stretch_z - - -- Create large node - placeholder_node.name = node.name - placeholder_node.param2 = node.param2 - big_pos.x, big_pos.y, big_pos.z = pos_x, pos_y, pos_z - place_schematic(big_pos, schematic) - - -- Fill in large node meta - if next(meta.fields) ~= nil or next(meta.inventory) ~= nil then - -- Node has meta fields - for x = 0, size_x do - for y = 0, size_y do - for z = 0, size_z do - big_pos.x = pos_x + x - big_pos.y = pos_y + y - big_pos.z = pos_z + z - -- Set metadata of new node - get_meta(big_pos):from_table(meta) - end - end - end - end - pos.z = pos.z - 1 - end - pos.y = pos.y - 1 - end - pos.x = pos.x - 1 - end - return worldedit.volume(pos1, pos2) * stretch_x * stretch_y * stretch_z, pos1, new_pos2 -end - - ---- Transposes a region between two axes. --- @return The number of nodes transposed. --- @return The new transposed position 1. --- @return The new transposed position 2. -function worldedit.transpose(pos1, pos2, axis1, axis2) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - local compare - local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2] - - if extent1 > extent2 then - compare = function(extent1, extent2) - return extent1 > extent2 - end - else - compare = function(extent1, extent2) - return extent1 < extent2 - end - end - - -- Calculate the new position 2 after transposition - local new_pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} - new_pos2[axis1] = pos1[axis1] + extent2 - new_pos2[axis2] = pos1[axis2] + extent1 - - local upper_bound = {x=pos2.x, y=pos2.y, z=pos2.z} - if upper_bound[axis1] < new_pos2[axis1] then upper_bound[axis1] = new_pos2[axis1] end - if upper_bound[axis2] < new_pos2[axis2] then upper_bound[axis2] = new_pos2[axis2] end - worldedit.keep_loaded(pos1, upper_bound) - - local pos = {x=pos1.x, y=0, z=0} - local get_node, get_meta, set_node = minetest.get_node, - minetest.get_meta, minetest.set_node - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2] - if compare(extent1, extent2) then -- Transpose only if below the diagonal - local node1 = get_node(pos) - local meta1 = get_meta(pos):to_table() - local value1, value2 = pos[axis1], pos[axis2] -- Save position values - pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 -- Swap axis extents - local node2 = get_node(pos) - local meta2 = get_meta(pos):to_table() - set_node(pos, node1) - get_meta(pos):from_table(meta1) - pos[axis1], pos[axis2] = value1, value2 -- Restore position values - set_node(pos, node2) - get_meta(pos):from_table(meta2) - end - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return worldedit.volume(pos1, pos2), pos1, new_pos2 -end - - ---- Flips a region along `axis`. --- @return The number of nodes flipped. -function worldedit.flip(pos1, pos2, axis) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - worldedit.keep_loaded(pos1, pos2) - - --- TODO: Flip the region slice by slice along the flip axis using schematic method. - local pos = {x=pos1.x, y=0, z=0} - local start = pos1[axis] + pos2[axis] - pos2[axis] = pos1[axis] + math.floor((pos2[axis] - pos1[axis]) / 2) - local get_node, get_meta, set_node = minetest.get_node, - minetest.get_meta, minetest.set_node - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local node1 = get_node(pos) - local meta1 = get_meta(pos):to_table() - local value = pos[axis] -- Save position - pos[axis] = start - value -- Shift position - local node2 = get_node(pos) - local meta2 = get_meta(pos):to_table() - set_node(pos, node1) - get_meta(pos):from_table(meta1) - pos[axis] = value -- Restore position - set_node(pos, node2) - get_meta(pos):from_table(meta2) - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return worldedit.volume(pos1, pos2) -end - - ---- Rotates a region clockwise around an axis. --- @param pos1 --- @param pos2 --- @param axis Axis ("x", "y", or "z"). --- @param angle Angle in degrees (90 degree increments only). --- @return The number of nodes rotated. --- @return The new first position. --- @return The new second position. -function worldedit.rotate(pos1, pos2, axis, angle) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - local other1, other2 = worldedit.get_axis_others(axis) - angle = angle % 360 - - local count - if angle == 90 then - worldedit.flip(pos1, pos2, other1) - count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) - elseif angle == 180 then - worldedit.flip(pos1, pos2, other1) - count = worldedit.flip(pos1, pos2, other2) - elseif angle == 270 then - worldedit.flip(pos1, pos2, other2) - count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) - else - error("Only 90 degree increments are supported!") - end - return count, pos1, pos2 -end - - ---- Rotates all oriented nodes in a region clockwise around the Y axis. --- @param pos1 --- @param pos2 --- @param angle Angle in degrees (90 degree increments only). --- @return The number of nodes oriented. -function worldedit.orient(pos1, pos2, angle) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local registered_nodes = minetest.registered_nodes - - local wallmounted = { - [90] = {0, 1, 5, 4, 2, 3, 0, 0}, - [180] = {0, 1, 3, 2, 5, 4, 0, 0}, - [270] = {0, 1, 4, 5, 3, 2, 0, 0} - } - local facedir = { - [90] = { 1, 2, 3, 0, 13, 14, 15, 12, 17, 18, 19, 16, - 9, 10, 11, 8, 5, 6, 7, 4, 23, 20, 21, 22}, - [180] = { 2, 3, 0, 1, 10, 11, 8, 9, 6, 7, 4, 5, - 18, 19, 16, 17, 14, 15, 12, 13, 22, 23, 20, 21}, - [270] = { 3, 0, 1, 2, 19, 16, 17, 18, 15, 12, 13, 14, - 7, 4, 5, 6, 11, 8, 9, 10, 21, 22, 23, 20} - } - - angle = angle % 360 - if angle == 0 then - return 0 - end - if angle % 90 ~= 0 then - error("Only 90 degree increments are supported!") - end - local wallmounted_substitution = wallmounted[angle] - local facedir_substitution = facedir[angle] - - worldedit.keep_loaded(pos1, pos2) - - local count = 0 - local get_node, swap_node = minetest.get_node, minetest.swap_node - local pos = {x=pos1.x, y=0, z=0} - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local node = get_node(pos) - local def = registered_nodes[node.name] - if def then - local paramtype2 = def.paramtype2 - if paramtype2 == "wallmounted" or - paramtype2 == "colorwallmounted" then - local orient = node.param2 % 8 - node.param2 = node.param2 - orient + - wallmounted_substitution[orient + 1] - swap_node(pos, node) - count = count + 1 - elseif paramtype2 == "facedir" or - paramtype2 == "colorfacedir" then - local orient = node.param2 % 32 - node.param2 = node.param2 - orient + - facedir_substitution[orient + 1] - swap_node(pos, node) - count = count + 1 - end - end - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return count -end - --- Attempts to fix the lighting in a region. -- @return The number of nodes updated. @@ -646,17 +289,16 @@ function worldedit.clear_objects(pos1, pos2) return false end local entity = obj:get_luaentity() - return not entity or not entity.name:find("^worldedit:") + return not (entity and entity.name:find("^worldedit:")) end -- Offset positions to include full nodes (positions are in the center of nodes) - local pos1x, pos1y, pos1z = pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5 - local pos2x, pos2y, pos2z = pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5 + pos1 = vector.add(pos1, -0.5) + pos2 = vector.add(pos2, 0.5) local count = 0 if minetest.get_objects_in_area then - local objects = minetest.get_objects_in_area({x=pos1x, y=pos1y, z=pos1z}, - {x=pos2x, y=pos2y, z=pos2z}) + local objects = minetest.get_objects_in_area(pos1, pos2) for _, obj in pairs(objects) do if should_delete(obj) then @@ -670,21 +312,22 @@ function worldedit.clear_objects(pos1, pos2) -- Fallback implementation via get_objects_inside_radius -- Center of region local center = { - x = pos1x + ((pos2x - pos1x) / 2), - y = pos1y + ((pos2y - pos1y) / 2), - z = pos1z + ((pos2z - pos1z) / 2) + x = pos1.x + ((pos2.x - pos1.x) / 2), + y = pos1.y + ((pos2.y - pos1.y) / 2), + z = pos1.z + ((pos2.z - pos1.z) / 2) } -- Bounding sphere radius local radius = math.sqrt( - (center.x - pos1x) ^ 2 + - (center.y - pos1y) ^ 2 + - (center.z - pos1z) ^ 2) - for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do + (center.x - pos1.x) ^ 2 + + (center.y - pos1.y) ^ 2 + + (center.z - pos1.z) ^ 2) + local objects = minetest.get_objects_inside_radius(center, radius) + for _, obj in pairs(objects) do if should_delete(obj) then local pos = obj:get_pos() - if pos.x >= pos1x and pos.x <= pos2x and - pos.y >= pos1y and pos.y <= pos2y and - pos.z >= pos1z and pos.z <= pos2z then + if pos.x >= pos1.x and pos.x <= pos2.x and + pos.y >= pos1.y and pos.y <= pos2.y and + pos.z >= pos1.z and pos.z <= pos2.z then -- Inside region obj:remove() count = count + 1 @@ -693,4 +336,3 @@ function worldedit.clear_objects(pos1, pos2) end return count end - diff --git a/mods/Minetest-WorldEdit/worldedit/primitives.lua b/mods/Minetest-WorldEdit/worldedit/primitives.lua index 0a7d1756..07b175c3 100644 --- a/mods/Minetest-WorldEdit/worldedit/primitives.lua +++ b/mods/Minetest-WorldEdit/worldedit/primitives.lua @@ -14,31 +14,26 @@ local mh = worldedit.manip_helpers -- @return The number of nodes added. function worldedit.cube(pos, width, height, length, node_name, hollow) -- Set up voxel manipulator - local basepos = vector.subtract(pos, {x=math.floor(width/2), y=0, z=math.floor(length/2)}) - local manip, area = mh.init(basepos, vector.add(basepos, {x=width, y=height, z=length})) + local basepos = vector.subtract(pos, + vector.new(math.floor(width / 2), 0, math.floor(length / 2))) + local endpos = vector.add(basepos, + vector.new(width - 1, height - 1, length - 1)) + local manip, area = mh.init(basepos, endpos) local data = mh.get_empty_data(area) -- Add cube local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = vector.subtract(basepos, area.MinEdge) local count = 0 + local iterfunc + if hollow then + iterfunc = mh.iterp_hollowcuboid(area, basepos, endpos) + else + iterfunc = area:iterp(basepos, endpos) + end - for z = 0, length-1 do - local index_z = (offset.z + z) * stride.z + 1 -- +1 for 1-based indexing - for y = 0, height-1 do - local index_y = index_z + (offset.y + y) * stride.y - for x = 0, width-1 do - local is_wall = z == 0 or z == length-1 - or y == 0 or y == height-1 - or x == 0 or x == width-1 - if not hollow or is_wall then - local i = index_y + (offset.x + x) - data[i] = node_id - count = count + 1 - end - end - end + for vi in iterfunc do + data[vi] = node_id + count = count + 1 end mh.finish(manip, data) @@ -149,7 +144,7 @@ function worldedit.cylinder(pos, axis, length, radius1, radius2, node_name, holl end -- Handle negative lengths - local current_pos = {x=pos.x, y=pos.y, z=pos.z} + local current_pos = vector.new(pos) if length < 0 then length = -length current_pos[axis] = current_pos[axis] - length @@ -162,12 +157,8 @@ function worldedit.cylinder(pos, axis, length, radius1, radius2, node_name, holl -- Add desired shape (anything inbetween cylinder & cone) local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = { - x = current_pos.x - area.MinEdge.x, - y = current_pos.y - area.MinEdge.y, - z = current_pos.z - area.MinEdge.z, - } + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(current_pos, area.MinEdge) local count = 0 for i = 0, length - 1 do -- Calulate radius for this "height" in the cylinder @@ -225,12 +216,8 @@ function worldedit.pyramid(pos, axis, height, node_name, hollow) -- Add pyramid local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = { - x = pos.x - area.MinEdge.x, - y = pos.y - area.MinEdge.y, - z = pos.z - area.MinEdge.z, - } + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(pos, area.MinEdge) local size = math.abs(height * step) local count = 0 -- For each level of the pyramid @@ -242,8 +229,8 @@ function worldedit.pyramid(pos, axis, height, node_name, hollow) for index3 = -size, size do local i = new_index2 + (index3 + offset[other2]) * stride[other2] if (not hollow or size - math.abs(index2) < 2 or size - math.abs(index3) < 2) then - data[i] = node_id - count = count + 1 + data[i] = node_id + count = count + 1 end end end @@ -271,9 +258,9 @@ function worldedit.spiral(pos, length, height, spacer, node_name) -- Set up variables local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset_x, offset_y, offset_z = pos.x - area.MinEdge.x, pos.y - area.MinEdge.y, pos.z - area.MinEdge.z - local i = offset_z * stride.z + offset_y * stride.y + offset_x + 1 + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(pos, area.MinEdge) + local i = offset.z * stride.z + offset.y * stride.y + offset.x + 1 -- Add first column local count = height diff --git a/mods/Minetest-WorldEdit/worldedit/serialization.lua b/mods/Minetest-WorldEdit/worldedit/serialization.lua index 0b3cc4b5..ea01fd1e 100644 --- a/mods/Minetest-WorldEdit/worldedit/serialization.lua +++ b/mods/Minetest-WorldEdit/worldedit/serialization.lua @@ -66,7 +66,7 @@ function worldedit.serialize(pos1, pos2) has_meta[hash_node_position(meta_positions[i])] = true end - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local count = 0 local result = {} while pos.x <= pos2.x do @@ -114,12 +114,15 @@ function worldedit.serialize(pos1, pos2) return LATEST_SERIALIZATION_HEADER .. result, count end --- Contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) --- by ChillCode, available under the MIT license. local function deserialize_workaround(content) - local nodes + local nodes, err if not minetest.global_exists("jit") then - nodes = minetest.deserialize(content, true) + nodes, err = minetest.deserialize(content, true) + elseif not content:match("^%s*return%s*{") then + -- The data doesn't look like we expect it to so we can't apply the workaround. + -- hope for the best + minetest.log("warning", "WorldEdit: deserializing data but can't apply LuaJIT workaround") + nodes, err = minetest.deserialize(content, true) else -- XXX: This is a filthy hack that works surprisingly well -- in LuaJIT, `minetest.deserialize` will fail due to the register limit @@ -129,18 +132,27 @@ local function deserialize_workaround(content) local escaped = content:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) local startpos, startpos1 = 1, 1 local endpos + local entry while true do -- go through each individual node entry (except the last) - startpos, endpos = escaped:find("},%s*{", startpos) + startpos, endpos = escaped:find("}%s*,%s*{", startpos) if not startpos then break end local current = content:sub(startpos1, startpos) - local entry = minetest.deserialize("return " .. current, true) + entry, err = minetest.deserialize("return " .. current, true) + if not entry then + break + end table.insert(nodes, entry) startpos, startpos1 = endpos, endpos end - local entry = minetest.deserialize("return " .. content:sub(startpos1), true) -- process the last entry - table.insert(nodes, entry) + if not err then + entry = minetest.deserialize("return " .. content:sub(startpos1), true) -- process the last entry + table.insert(nodes, entry) + end + end + if err then + minetest.log("warning", "WorldEdit: deserialize: " .. err) end return nodes end @@ -148,7 +160,7 @@ end --- Loads the schematic in `value` into a node list in the latest format. -- @return A node list in the latest format, or nil on failure. local function load_schematic(value) - local version, header, content = worldedit.read_header(value) + local version, _, content = worldedit.read_header(value) local nodes = {} if version == 1 or version == 2 then -- Original flat table format local tables = minetest.deserialize(content, true) @@ -223,9 +235,7 @@ function worldedit.allocate_with_nodes(origin_pos, nodes) if y > pos2y then pos2y = y end if z > pos2z then pos2z = z end end - local pos1 = {x=pos1x, y=pos1y, z=pos1z} - local pos2 = {x=pos2x, y=pos2y, z=pos2z} - return pos1, pos2, #nodes + return vector.new(pos1x, pos1y, pos1z), vector.new(pos2x, pos2y, pos2z), #nodes end @@ -240,14 +250,16 @@ function worldedit.deserialize(origin_pos, value) worldedit.keep_loaded(pos1, pos2) local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z - local count = 0 local add_node, get_meta = minetest.add_node, minetest.get_meta + local registered_nodes = minetest.registered_nodes for i, entry in ipairs(nodes) do - entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z - -- Entry acts as both position and node - add_node(entry, entry) - if entry.meta then - get_meta(entry):from_table(entry.meta) + if registered_nodes[entry.name] then + entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + -- Entry acts as both position and node + add_node(entry, entry) + if entry.meta then + get_meta(entry):from_table(entry.meta) + end end end return #nodes diff --git a/mods/Minetest-WorldEdit/worldedit/test.lua b/mods/Minetest-WorldEdit/worldedit/test/init.lua similarity index 70% rename from mods/Minetest-WorldEdit/worldedit/test.lua rename to mods/Minetest-WorldEdit/worldedit/test/init.lua index 70627326..32d30c96 100644 --- a/mods/Minetest-WorldEdit/worldedit/test.lua +++ b/mods/Minetest-WorldEdit/worldedit/test/init.lua @@ -1,7 +1,8 @@ +-- TODO: don't shit individual variables into the globals + --------------------- -- Helpers --------------------- - local vec = vector.new local vecw = function(axis, n, base) local ret = vec(base) @@ -16,9 +17,9 @@ local set_node = minetest.set_node -- Nodes --------------------- local air = "air" -local testnode1 -local testnode2 -local testnode3 +rawset(_G, "testnode1", "") +rawset(_G, "testnode2", "") +rawset(_G, "testnode3", "") -- Loads nodenames to use for tests local function init_nodes() testnode1 = minetest.registered_aliases["mapgen_stone"] @@ -27,7 +28,7 @@ local function init_nodes() assert(testnode1 and testnode2 and testnode3) end -- Writes repeating pattern into given area -local function place_pattern(pos1, pos2, pattern) +rawset(_G, "place_pattern", function(pos1, pos2, pattern) local pos = vec() local node = {name=""} local i = 1 @@ -43,14 +44,14 @@ local function place_pattern(pos1, pos2, pattern) end end end -end +end) --------------------- -- Area management --------------------- assert(minetest.get_mapgen_setting("mg_name") == "singlenode") -local area = {} +rawset(_G, "area", {}) do local areamin, areamax local off @@ -71,6 +72,9 @@ do end -- Reset area contents and state area.clear = function() + if off and vector.equals(off, vec(0, 0, 0)) then + return + end local vmanip = minetest.get_voxel_manip(areamin, areamax) local vpos1, vpos2 = vmanip:get_emerged_area() local vcount = (vpos2.x - vpos1.x + 1) * (vpos2.y - vpos1.y + 1) * (vpos2.z - vpos1.z + 1) @@ -87,10 +91,10 @@ do -- Returns an usable area [pos1, pos2] that does not overlap previous ones area.get = function(sizex, sizey, sizez) local size - if sizey == nil or sizez == nil then - size = {x=sizex, y=sizex, z=sizex} + if sizey == nil and sizez == nil then + size = vec(sizex, sizex, sizex) else - size = {x=sizex, y=sizey, z=sizez} + size = vec(sizex, sizey, sizez) end local pos1 = vector.add(areamin, off) local pos2 = vector.subtract(vector.add(pos1, size), 1) @@ -148,7 +152,7 @@ end --------------------- -- Checks --------------------- -local check = {} +rawset(_G, "check", {}) -- Check that all nodes in [pos1, pos2] are the node(s) specified check.filled = function(pos1, pos2, nodes) if type(nodes) == "string" then @@ -215,7 +219,7 @@ end -- The actual tests --------------------- local tests = {} -local function register_test(name, func, opts) +worldedit.register_test = function(name, func, opts) assert(type(name) == "string") assert(func == nil or type(func) == "function") if not opts then @@ -227,6 +231,7 @@ local function register_test(name, func, opts) opts.func = func table.insert(tests, opts) end +local register_test = worldedit.register_test -- How this works: -- register_test registers a test with a name and function -- The function should return if the test passes or otherwise cause a Lua error @@ -241,8 +246,8 @@ end register_test("Internal self-test") register_test("is area loaded?", function() local pos1, _ = area.get(1) - assert(get_node(pos1).name == "air") -end, {dry=true}) + assert(get_node(pos1).name == air) +end) register_test("area.split", function() for i = 2, 6 do @@ -255,7 +260,7 @@ register_test("area.split", function() assert((half1.z - pos1.z) == (pos2.z - half2.z)) -- divided equally end end -end, {dry=true}) +end) register_test("check.filled", function() local pos1, pos2 = area.get(1, 2, 1) @@ -276,118 +281,49 @@ register_test("pattern", function() end) -register_test("Generic node manipulations") -register_test("worldedit.set", function() - local pos1, pos2 = area.get(10) - local m = area.margin(1) +for _, name in ipairs({ + "manipulations", "primitives", "schematic" +}) do + dofile(minetest.get_modpath("worldedit") .. "/test/" .. name .. ".lua") +end - worldedit.set(pos1, pos2, testnode1) - check.filled(pos1, pos2, testnode1) - check.filled2(m, air) +register_test("Code") +register_test("worldedit.lua", function() + -- syntax error + local err, ret = worldedit.lua("?") + assert(ret == nil) + assert(err:find("unexpected symbol")) + + -- runtime error + local err, ret = worldedit.lua("error(1234)") + assert(ret == nil) + assert(err:find("1234")) + + -- normal operation + local err, ret = worldedit.lua("return name..tostring(player == nil)..tostring(pos == nil)", "nobody") + assert(err == nil) + assert(ret == "\"nobodytruetrue\"") end) -register_test("worldedit.set mix", function() - local pos1, pos2 = area.get(10) - local m = area.margin(1) +register_test("worldedit.luatransform", function() + local pos1, pos2 = area.get(2) - worldedit.set(pos1, pos2, {testnode1, testnode2}) + -- syntax error + local err = worldedit.luatransform(pos1, pos2, "?") + assert(err:find("unexpected symbol")) - check.filled(pos1, pos2, {testnode1, testnode2}) - check.filled2(m, air) + -- runtime error + local err = worldedit.luatransform(pos1, pos2, "error(2345)") + assert(err:find("2345")) + + -- normal operation + local err = worldedit.luatransform(pos1, pos2, + "minetest.swap_node(pos, {name=" .. ("%q"):format(testnode1) .. "})") + assert(err == nil) + check.filled(pos1, pos1, testnode1) end) -register_test("worldedit.replace", function() - local pos1, pos2 = area.get(10) - local half1, half2 = area.split(pos1, pos2) - - worldedit.set(pos1, half1, testnode1) - worldedit.set(half2, pos2, testnode2) - worldedit.replace(pos1, pos2, testnode1, testnode3) - - check.not_filled(pos1, pos2, testnode1) - check.filled(pos1, half1, testnode3) - check.filled(half2, pos2, testnode2) -end) - -register_test("worldedit.replace inverse", function() - local pos1, pos2 = area.get(10) - local half1, half2 = area.split(pos1, pos2) - - worldedit.set(pos1, half1, testnode1) - worldedit.set(half2, pos2, testnode2) - worldedit.replace(pos1, pos2, testnode1, testnode3, true) - - check.filled(pos1, half1, testnode1) - check.filled(half2, pos2, testnode3) -end) - --- FIXME?: this one looks overcomplicated -register_test("worldedit.copy", function() - local pos1, pos2 = area.get(4) - local axis, n = area.dir(2) - local m = area.margin(1) - local b = pos1[axis] - - -- create one slice with testnode1, one with testnode2 - worldedit.set(pos1, vecw(axis, b + 1, pos2), testnode1) - worldedit.set(vecw(axis, b + 2, pos1), pos2, testnode2) - worldedit.copy(pos1, pos2, axis, n) - - -- should have three slices now - check.filled(pos1, vecw(axis, b + 1, pos2), testnode1) - check.filled(vecw(axis, b + 2, pos1), pos2, testnode1) - check.filled(vecw(axis, b + 4, pos1), vector.add(pos2, vecw(axis, n)), testnode2) - check.filled2(m, "air") -end) - -register_test("worldedit.copy2", function() - local pos1, pos2 = area.get(6) - local m1 = area.margin(1) - local pos1_, pos2_ = area.get(6) - local m2 = area.margin(1) - - local pattern = {testnode1, testnode2, testnode3, testnode1, testnode2} - place_pattern(pos1, pos2, pattern) - worldedit.copy2(pos1, pos2, vector.subtract(pos1_, pos1)) - - check.pattern(pos1, pos2, pattern) - check.pattern(pos1_, pos2_, pattern) - check.filled2(m1, "air") - check.filled2(m2, "air") -end) - -register_test("worldedit.move (overlap)", function() - local pos1, pos2 = area.get(7) - local axis, n = area.dir(2) - local m = area.margin(1) - - local pattern = {testnode2, testnode1, testnode2, testnode3, testnode3} - place_pattern(pos1, pos2, pattern) - worldedit.move(pos1, pos2, axis, n) - - check.filled(pos1, vecw(axis, pos1[axis] + n - 1, pos2), "air") - check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) - check.filled2(m, "air") -end) - -register_test("worldedit.move", function() - local pos1, pos2 = area.get(10) - local axis, n = area.dir(10) - local m = area.margin(1) - - local pattern = {testnode1, testnode3, testnode3, testnode2} - place_pattern(pos1, pos2, pattern) - worldedit.move(pos1, pos2, axis, n) - - check.filled(pos1, pos2, "air") - check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) - check.filled2(m, "air") -end) - --- TODO: the rest (also testing param2 + metadata) - - --------------------- -- Main function --------------------- @@ -406,7 +342,7 @@ worldedit.run_tests = function() for x = 0, math.floor(wanted.x/16) do for y = 0, math.floor(wanted.y/16) do for z = 0, math.floor(wanted.z/16) do - assert(minetest.forceload_block({x=x*16, y=y*16, z=z*16}, true)) + assert(minetest.forceload_block(vec(x*16, y*16, z*16), true, -1)) end end end @@ -418,9 +354,7 @@ worldedit.run_tests = function() local s = "---- " .. test.name .. " " print(s .. string.rep("-", 60 - #s)) else - if not test.dry then - area.clear() - end + area.clear() local ok, err = pcall(test.func) print(string.format("%-60s %s", test.name, ok and "pass" or "FAIL")) if not ok then diff --git a/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua b/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua new file mode 100644 index 00000000..10368a30 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua @@ -0,0 +1,121 @@ +--------------------- +local vec = vector.new +local vecw = function(axis, n, base) + local ret = vec(base) + ret[axis] = n + return ret +end +local air = "air" +--------------------- + + +worldedit.register_test("Generic node manipulations") +worldedit.register_test("worldedit.set", function() + local pos1, pos2 = area.get(10) + local m = area.margin(1) + + worldedit.set(pos1, pos2, testnode1) + + check.filled(pos1, pos2, testnode1) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.set mix", function() + local pos1, pos2 = area.get(10) + local m = area.margin(1) + + worldedit.set(pos1, pos2, {testnode1, testnode2}) + + check.filled(pos1, pos2, {testnode1, testnode2}) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.replace", function() + local pos1, pos2 = area.get(10) + local half1, half2 = area.split(pos1, pos2) + + worldedit.set(pos1, half1, testnode1) + worldedit.set(half2, pos2, testnode2) + worldedit.replace(pos1, pos2, testnode1, testnode3) + + check.not_filled(pos1, pos2, testnode1) + check.filled(pos1, half1, testnode3) + check.filled(half2, pos2, testnode2) +end) + +worldedit.register_test("worldedit.replace inverse", function() + local pos1, pos2 = area.get(10) + local half1, half2 = area.split(pos1, pos2) + + worldedit.set(pos1, half1, testnode1) + worldedit.set(half2, pos2, testnode2) + worldedit.replace(pos1, pos2, testnode1, testnode3, true) + + check.filled(pos1, half1, testnode1) + check.filled(half2, pos2, testnode3) +end) + +-- FIXME?: this one looks overcomplicated +worldedit.register_test("worldedit.copy", function() + local pos1, pos2 = area.get(4) + local axis, n = area.dir(2) + local m = area.margin(1) + local b = pos1[axis] + + -- create one slice with testnode1, one with testnode2 + worldedit.set(pos1, vecw(axis, b + 1, pos2), testnode1) + worldedit.set(vecw(axis, b + 2, pos1), pos2, testnode2) + worldedit.copy(pos1, pos2, axis, n) + + -- should have three slices now + check.filled(pos1, vecw(axis, b + 1, pos2), testnode1) + check.filled(vecw(axis, b + 2, pos1), pos2, testnode1) + check.filled(vecw(axis, b + 4, pos1), vector.add(pos2, vecw(axis, n)), testnode2) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.copy2", function() + local pos1, pos2 = area.get(6) + local m1 = area.margin(1) + local pos1_, pos2_ = area.get(6) + local m2 = area.margin(1) + + local pattern = {testnode1, testnode2, testnode3, testnode1, testnode2} + place_pattern(pos1, pos2, pattern) + worldedit.copy2(pos1, pos2, vector.subtract(pos1_, pos1)) + + check.pattern(pos1, pos2, pattern) + check.pattern(pos1_, pos2_, pattern) + check.filled2(m1, air) + check.filled2(m2, air) +end) + +worldedit.register_test("worldedit.move (overlap)", function() + local pos1, pos2 = area.get(7) + local axis, n = area.dir(2) + local m = area.margin(1) + + local pattern = {testnode2, testnode1, testnode2, testnode3, testnode3} + place_pattern(pos1, pos2, pattern) + worldedit.move(pos1, pos2, axis, n) + + check.filled(pos1, vecw(axis, pos1[axis] + n - 1, pos2), air) + check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.move", function() + local pos1, pos2 = area.get(10) + local axis, n = area.dir(10) + local m = area.margin(1) + + local pattern = {testnode1, testnode3, testnode3, testnode2} + place_pattern(pos1, pos2, pattern) + worldedit.move(pos1, pos2, axis, n) + + check.filled(pos1, pos2, air) + check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) + check.filled2(m, air) +end) + +-- TODO: the rest (also testing param2 + metadata) diff --git a/mods/Minetest-WorldEdit/worldedit/test/primitives.lua b/mods/Minetest-WorldEdit/worldedit/test/primitives.lua new file mode 100644 index 00000000..42bb39e0 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/primitives.lua @@ -0,0 +1,59 @@ +--------------------- +local vec = vector.new +local vecw = function(axis, n, base) + local ret = vec(base) + ret[axis] = n + return ret +end +local air = "air" +--------------------- + + +worldedit.register_test("Primitives") +worldedit.register_test("worldedit.cube", function() + local pos1, pos2 = area.get(6, 5, 4) + local m = area.margin(1) + + local center = vec(pos1.x + 3, pos1.y, pos1.z + 2) + + worldedit.cube(center, 6, 5, 4, testnode2) + + check.filled(pos1, pos2, testnode2) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.cube hollow small", function() + for n = 1, 2 do + local pos1, pos2 = area.get(n) + local m = area.margin(1) + + local center = vec(pos1.x + math.floor(n/2), pos1.y, pos1.z + math.floor(n/2)) + + worldedit.cube(center, n, n, n, testnode1, true) + + check.filled(pos1, pos2, testnode1) -- filled entirely + check.filled2(m, air) + end +end) + +worldedit.register_test("worldedit.cube hollow", function() + local pos1, pos2 = area.get(6, 5, 4) + local m = area.margin(1) + + local center = vec(pos1.x + 3, pos1.y, pos1.z + 2) + + worldedit.cube(center, 6, 5, 4, testnode1, true) + + check.filled(vector.add(pos1, vec(1,1,1)), vector.subtract(pos2, vec(1,1,1)), air) + check.filled2({ + { vecw("x", pos2.x, pos1), pos2 }, + { vecw("y", pos2.y, pos1), pos2 }, + { vecw("z", pos2.z, pos1), pos2 }, + { pos1, vecw("x", pos1.x, pos2) }, + { pos1, vecw("y", pos1.y, pos2) }, + { pos1, vecw("z", pos1.z, pos2) }, + }, testnode1) + check.filled2(m, air) +end) + + diff --git a/mods/Minetest-WorldEdit/worldedit/test/schematic.lua b/mods/Minetest-WorldEdit/worldedit/test/schematic.lua new file mode 100644 index 00000000..2866a320 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/schematic.lua @@ -0,0 +1,162 @@ +--------------------- +local vec = vector.new +local air = "air" +--------------------- + + +local function output_weird(numbers, body) + local s = {"return {"} + for _, parts in ipairs(numbers) do + s[#s+1] = "{" + for _, n in ipairs(parts) do + s[#s+1] = string.format(" {%d},", n) + end + s[#s+1] = "}," + end + return table.concat(s, "\n") .. table.concat(body, "\n") .. "}" +end + +local fmt1p = '{\n ["x"]=%d,\n ["y"]=%d,\n ["z"]=%d,\n},' +local fmt1n = '{\n ["name"]="%s",\n},' +local fmt4 = '{ ["x"] = %d, ["y"] = %d, ["z"] = %d, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["param1"] = 0, ["name"] = "%s" }' +local fmt5 = '{ ["x"] = %d, ["y"] = %d, ["z"] = %d, ["name"] = "%s" }' +local fmt51 = '{[r2]=0,x=%d,y=%d,z=%d,name=r%d}' +local fmt52 = '{x=%d,y=%d,z=%d,name=_[%d]}' + +local test_data = { + -- used by WorldEdit 0.2 (first public release) + { + name = "v1", ver = 1, + gen = function(pat) + local numbers = { + {2, 3, 4, 5, 6}, + {7, 8}, {9, 10}, {11, 12}, + {13, 14}, {15, 16} + } + return output_weird(numbers, { + fmt1p:format(0, 0, 0), + fmt1n:format(pat[1]), + fmt1p:format(0, 1, 0), + fmt1n:format(pat[3]), + fmt1p:format(1, 1, 0), + fmt1n:format(pat[1]), + fmt1p:format(1, 0, 1), + fmt1n:format(pat[3]), + fmt1p:format(0, 1, 1), + fmt1n:format(pat[1]), + }) + end + }, + + -- v2: missing because I couldn't find any code in my archives that actually wrote this format + + { + name = "v3", ver = 3, + gen = function(pat) + assert(pat[2] == air) + return table.concat({ + "0 0 0 " .. pat[1] .. " 0 0", + "0 1 0 " .. pat[3] .. " 0 0", + "1 1 0 " .. pat[1] .. " 0 0", + "1 0 1 " .. pat[3] .. " 0 0", + "0 1 1 " .. pat[1] .. " 0 0", + }, "\n") + end + }, + + { + name = "v4", ver = 4, + gen = function(pat) + return table.concat({ + "return { " .. fmt4:format(0, 0, 0, pat[1]), + fmt4:format(0, 1, 0, pat[3]), + fmt4:format(1, 1, 0, pat[1]), + fmt4:format(1, 0, 1, pat[3]), + fmt4:format(0, 1, 1, pat[1]) .. " }", + }, ", ") + end + }, + + -- like v4 but no meta and param (if empty) + { + name = "v5 (pre-5.6)", ver = 5, + gen = function(pat) + return table.concat({ + "5:return { " .. fmt5:format(0, 0, 0, pat[1]), + fmt5:format(0, 1, 0, pat[3]), + fmt5:format(1, 1, 0, pat[1]), + fmt5:format(1, 0, 1, pat[3]), + fmt5:format(0, 1, 1, pat[1]) .. " }", + }, ", ") + end + }, + + -- reworked engine serialization in 5.6 + { + name = "v5 (5.6)", ver = 5, + gen = function(pat) + return table.concat({ + '5:r1="' .. pat[1] .. '";r2="param1";r3="' .. pat[3] .. '";return {' + .. fmt51:format(0, 0, 0, 1), + fmt51:format(0, 1, 0, 3), + fmt51:format(1, 1, 0, 1), + fmt51:format(1, 0, 1, 3), + fmt51:format(0, 1, 1, 1) .. "}", + }, ",") + end + }, + + -- small changes on engine side again + { + name = "v5 (post-5.7)", ver = 5, + gen = function(pat) + return table.concat({ + '5:local _={};_[1]="' .. pat[1] .. '";_[3]="' .. pat[3] .. '";return {' + .. fmt52:format(0, 0, 0, 1), + fmt52:format(0, 1, 0, 3), + fmt52:format(1, 1, 0, 1), + fmt52:format(1, 0, 1, 3), + fmt52:format(0, 1, 1, 1) .. "}", + }, ",") + end + }, +} + + +worldedit.register_test("Schematics") +worldedit.register_test("worldedit.read_header", function() + local value = '5,foo,BAR,-1,234:the content' + local version, header, content = worldedit.read_header(value) + assert(version == 5) + assert(#header == 4) + assert(header[1] == "foo" and header[2] == "BAR") + assert(header[3] == "-1" and header[4] == "234") + assert(content == "the content") +end) + +worldedit.register_test("worldedit.allocate", function() + local value = '3:-1 0 0 dummy 0 0\n0 0 4 dummy 0 0\n0 1 0 dummy 0 0' + local pos1, pos2, count = worldedit.allocate(vec(1, 1, 1), value) + assert(vector.equals(pos1, vec(0, 1, 1))) + assert(vector.equals(pos2, vec(1, 2, 5))) + assert(count == 3) +end) + +for _, e in ipairs(test_data) do + worldedit.register_test("worldedit.deserialize " .. e.name, function() + local pos1, pos2 = area.get(2) + local m = area.margin(1) + + local pat = {testnode3, air, testnode2} + local value = e.gen(pat) + assert(type(value) == "string") + + local version = worldedit.read_header(value) + assert(version == e.ver, "version: got " .. tostring(version) .. " expected " .. e.ver) + local count = worldedit.deserialize(pos1, value) + assert(count ~= nil and count > 0) + + check.pattern(pos1, pos2, pat) + check.filled2(m, air) + end) +end diff --git a/mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png b/mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png deleted file mode 100644 index 13eb1218..00000000 Binary files a/mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png and /dev/null differ diff --git a/mods/Minetest-WorldEdit/worldedit/transformations.lua b/mods/Minetest-WorldEdit/worldedit/transformations.lua new file mode 100644 index 00000000..c33b93d2 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/transformations.lua @@ -0,0 +1,357 @@ +--- Node transformations. +-- @module worldedit.transformations + +worldedit.deferred_execution = function(next_one, finished) + -- Allocate 80% of server step for execution + local allocated_usecs = + tonumber(minetest.settings:get("dedicated_server_step"):split(" ")[1]) * 1000000 * 0.8 + local function f() + local deadline = minetest.get_us_time() + allocated_usecs + repeat + local is_done = next_one() + if is_done then + if finished then + finished() + end + return + end + until minetest.get_us_time() >= deadline + minetest.after(0, f) + end + f() +end + +--- Duplicates a region `amount` times with offset vector `direction`. +-- Stacking is spread across server steps. +-- @return The number of nodes stacked. +function worldedit.stack2(pos1, pos2, direction, amount, finished) + -- Protect arguments from external changes during execution + pos1 = vector.copy(pos1) + pos2 = vector.copy(pos2) + direction = vector.copy(direction) + + local i = 0 + local translated = vector.new() + local function step() + translated.x = translated.x + direction.x + translated.y = translated.y + direction.y + translated.z = translated.z + direction.z + worldedit.copy2(pos1, pos2, translated) + i = i + 1 + return i >= amount + end + worldedit.deferred_execution(step, finished) + + return worldedit.volume(pos1, pos2) * amount +end + + +--- Duplicates a region along `axis` `amount` times. +-- Stacking is spread across server steps. +-- @param pos1 +-- @param pos2 +-- @param axis Axis direction, "x", "y", or "z". +-- @param count +-- @return The number of nodes stacked. +function worldedit.stack(pos1, pos2, axis, count, finished) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local length = pos2[axis] - pos1[axis] + 1 + if count < 0 then + count = -count + length = -length + end + + local i, distance = 0, 0 + local function step() + distance = distance + length + worldedit.copy(pos1, pos2, axis, distance) + i = i + 1 + return i >= count + end + worldedit.deferred_execution(step, finished) + + return worldedit.volume(pos1, pos2) * count +end + + +--- Stretches a region by a factor of positive integers along the X, Y, and Z +-- axes, respectively, with `pos1` as the origin. +-- @param pos1 +-- @param pos2 +-- @param stretch_x Amount to stretch along X axis. +-- @param stretch_y Amount to stretch along Y axis. +-- @param stretch_z Amount to stretch along Z axis. +-- @return The number of nodes scaled. +-- @return The new scaled position 1. +-- @return The new scaled position 2. +function worldedit.stretch(pos1, pos2, stretch_x, stretch_y, stretch_z) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + -- Prepare schematic of large node + local get_node, get_meta, place_schematic = minetest.get_node, + minetest.get_meta, minetest.place_schematic + local placeholder_node = {name="", param1=255, param2=0} + local nodes = {} + for i = 1, stretch_x * stretch_y * stretch_z do + nodes[i] = placeholder_node + end + local schematic = {size=vector.new(stretch_x, stretch_y, stretch_z), data=nodes} + + local size_x, size_y, size_z = stretch_x - 1, stretch_y - 1, stretch_z - 1 + + local new_pos2 = { + x = pos1.x + (pos2.x - pos1.x) * stretch_x + size_x, + y = pos1.y + (pos2.y - pos1.y) * stretch_y + size_y, + z = pos1.z + (pos2.z - pos1.z) * stretch_z + size_z, + } + worldedit.keep_loaded(pos1, new_pos2) + + local pos = vector.new(pos2.x, 0, 0) + local big_pos = vector.new() + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = get_node(pos) -- Get current node + local meta = get_meta(pos):to_table() -- Get meta of current node + + -- Calculate far corner of the big node + local pos_x = pos1.x + (pos.x - pos1.x) * stretch_x + local pos_y = pos1.y + (pos.y - pos1.y) * stretch_y + local pos_z = pos1.z + (pos.z - pos1.z) * stretch_z + + -- Create large node + placeholder_node.name = node.name + placeholder_node.param2 = node.param2 + big_pos.x, big_pos.y, big_pos.z = pos_x, pos_y, pos_z + place_schematic(big_pos, schematic) + + -- Fill in large node meta + if next(meta.fields) ~= nil or next(meta.inventory) ~= nil then + -- Node has meta fields + for x = 0, size_x do + for y = 0, size_y do + for z = 0, size_z do + big_pos.x = pos_x + x + big_pos.y = pos_y + y + big_pos.z = pos_z + z + -- Set metadata of new node + get_meta(big_pos):from_table(meta) + end + end + end + end + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + return worldedit.volume(pos1, pos2) * stretch_x * stretch_y * stretch_z, pos1, new_pos2 +end + + +--- Transposes a region between two axes. +-- @return The number of nodes transposed. +-- @return The new transposed position 1. +-- @return The new transposed position 2. +function worldedit.transpose(pos1, pos2, axis1, axis2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local compare + local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2] + + if extent1 > extent2 then + compare = function(extent1, extent2) + return extent1 > extent2 + end + else + compare = function(extent1, extent2) + return extent1 < extent2 + end + end + + -- Calculate the new position 2 after transposition + local new_pos2 = vector.new(pos2) + new_pos2[axis1] = pos1[axis1] + extent2 + new_pos2[axis2] = pos1[axis2] + extent1 + + local upper_bound = vector.new(pos2) + if upper_bound[axis1] < new_pos2[axis1] then upper_bound[axis1] = new_pos2[axis1] end + if upper_bound[axis2] < new_pos2[axis2] then upper_bound[axis2] = new_pos2[axis2] end + worldedit.keep_loaded(pos1, upper_bound) + + local pos = vector.new(pos1.x, 0, 0) + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2] + if compare(extent1, extent2) then -- Transpose only if below the diagonal + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value1, value2 = pos[axis1], pos[axis2] -- Save position values + pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 -- Swap axis extents + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis1], pos[axis2] = value1, value2 -- Restore position values + set_node(pos, node2) + get_meta(pos):from_table(meta2) + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2), pos1, new_pos2 +end + + +--- Flips a region along `axis`. +-- @return The number of nodes flipped. +function worldedit.flip(pos1, pos2, axis) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + --- TODO: Flip the region slice by slice along the flip axis using schematic method. + local pos = vector.new(pos1.x, 0, 0) + local start = pos1[axis] + pos2[axis] + pos2[axis] = pos1[axis] + math.floor((pos2[axis] - pos1[axis]) / 2) + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value = pos[axis] -- Save position + pos[axis] = start - value -- Shift position + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis] = value -- Restore position + set_node(pos, node2) + get_meta(pos):from_table(meta2) + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2) +end + + +--- Rotates a region clockwise around an axis. +-- @param pos1 +-- @param pos2 +-- @param axis Axis ("x", "y", or "z"). +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes rotated. +-- @return The new first position. +-- @return The new second position. +function worldedit.rotate(pos1, pos2, axis, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local other1, other2 = worldedit.get_axis_others(axis) + angle = angle % 360 + + local count + if angle == 90 then + worldedit.flip(pos1, pos2, other1) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + elseif angle == 180 then + worldedit.flip(pos1, pos2, other1) + count = worldedit.flip(pos1, pos2, other2) + elseif angle == 270 then + worldedit.flip(pos1, pos2, other2) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + else + error("Only 90 degree increments are supported!") + end + return count, pos1, pos2 +end + + +--- Rotates all oriented nodes in a region clockwise around the Y axis. +-- @param pos1 +-- @param pos2 +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes oriented. +function worldedit.orient(pos1, pos2, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local registered_nodes = minetest.registered_nodes + + local wallmounted = { + [90] = {0, 1, 5, 4, 2, 3, 0, 0}, + [180] = {0, 1, 3, 2, 5, 4, 0, 0}, + [270] = {0, 1, 4, 5, 3, 2, 0, 0} + } + local facedir = { + [90] = { 1, 2, 3, 0, 13, 14, 15, 12, 17, 18, 19, 16, + 9, 10, 11, 8, 5, 6, 7, 4, 23, 20, 21, 22}, + [180] = { 2, 3, 0, 1, 10, 11, 8, 9, 6, 7, 4, 5, + 18, 19, 16, 17, 14, 15, 12, 13, 22, 23, 20, 21}, + [270] = { 3, 0, 1, 2, 19, 16, 17, 18, 15, 12, 13, 14, + 7, 4, 5, 6, 11, 8, 9, 10, 21, 22, 23, 20} + } + + angle = angle % 360 + if angle == 0 then + return 0 + end + if angle % 90 ~= 0 then + error("Only 90 degree increments are supported!") + end + local wallmounted_substitution = wallmounted[angle] + local facedir_substitution = facedir[angle] + + worldedit.keep_loaded(pos1, pos2) + + local count = 0 + local get_node, swap_node = minetest.get_node, minetest.swap_node + local pos = vector.new(pos1.x, 0, 0) + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + local def = registered_nodes[node.name] + if def then + local paramtype2 = def.paramtype2 + if paramtype2 == "wallmounted" or + paramtype2 == "colorwallmounted" then + local orient = node.param2 % 8 + node.param2 = node.param2 - orient + + wallmounted_substitution[orient + 1] + swap_node(pos, node) + count = count + 1 + elseif paramtype2 == "facedir" or + paramtype2 == "colorfacedir" then + local orient = node.param2 % 32 + node.param2 = node.param2 - orient + + facedir_substitution[orient + 1] + swap_node(pos, node) + count = count + 1 + end + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return count +end diff --git a/mods/Minetest-WorldEdit/worldedit/visualization.lua b/mods/Minetest-WorldEdit/worldedit/visualization.lua index 326a6c1d..1f27ab98 100644 --- a/mods/Minetest-WorldEdit/worldedit/visualization.lua +++ b/mods/Minetest-WorldEdit/worldedit/visualization.lua @@ -19,7 +19,7 @@ function worldedit.hide(pos1, pos2) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local get_node, get_meta, swap_node = minetest.get_node, minetest.get_meta, minetest.swap_node while pos.x <= pos2.x do @@ -79,7 +79,7 @@ function worldedit.highlight(pos1, pos2, node_name) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local get_node, get_meta, swap_node = minetest.get_node, minetest.get_meta, minetest.swap_node local count = 0 diff --git a/mods/Minetest-WorldEdit/worldedit_brush/init.lua b/mods/Minetest-WorldEdit/worldedit_brush/init.lua index 78c1bd17..67d2a40c 100644 --- a/mods/Minetest-WorldEdit/worldedit_brush/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_brush/init.lua @@ -1,8 +1,4 @@ -if minetest.raycast == nil then - error( - "worldedit_brush requires at least Minetest 5.0" - ) -end +local S = minetest.get_translator("worldedit_brush") local BRUSH_MAX_DIST = 150 local brush_on_use = function(itemstack, placer) @@ -12,7 +8,8 @@ local brush_on_use = function(itemstack, placer) local cmd = meta:get_string("command") if cmd == "" then worldedit.player_notify(name, - "This brush is not bound, use //brush to bind a command to it.") + S("This brush is not bound, use @1 to bind a command to it.", + minetest.colorize("#00ffff", "//brush")), "info") return false end @@ -22,17 +19,17 @@ local brush_on_use = function(itemstack, placer) local has_privs, missing_privs = minetest.check_player_privs(name, cmddef.privs) if not has_privs then worldedit.player_notify(name, - "Missing privileges: " .. table.concat(missing_privs, ", ")) + S("Missing privileges: @1", table.concat(missing_privs, ", ")), "error") return false end local raybegin = vector.add(placer:get_pos(), - {x=0, y=placer:get_properties().eye_height, z=0}) + vector.new(0, placer:get_properties().eye_height, 0)) local rayend = vector.add(raybegin, vector.multiply(placer:get_look_dir(), BRUSH_MAX_DIST)) local ray = minetest.raycast(raybegin, rayend, false, true) local pointed_thing = ray:next() if pointed_thing == nil then - worldedit.player_notify(name, "Too far away.") + worldedit.player_notify(name, S("Too far away."), "error") return false end @@ -41,17 +38,17 @@ local brush_on_use = function(itemstack, placer) worldedit.pos2[name] = nil worldedit.marker_update(name) - -- this isn't really clean... - local player_notify_old = worldedit.player_notify - worldedit.player_notify = function(name, msg) - if string.match(msg, "^%d") then return end -- discard "1234 nodes added." - return player_notify_old(name, msg) - end - assert(cmddef.require_pos < 2) local parsed = {cmddef.parse(meta:get_string("params"))} if not table.remove(parsed, 1) then return false end -- shouldn't happen + -- discard success messages + local player_notify_old = worldedit.player_notify + worldedit.player_notify = function(name, msg, typ) + if typ == "ok" then return end + return player_notify_old(name, msg, typ) + end + minetest.log("action", string.format("%s uses WorldEdit brush (//%s) at %s", name, cmd, minetest.pos_to_string(pointed_thing.under))) cmddef.func(name, unpack(parsed)) @@ -61,7 +58,7 @@ local brush_on_use = function(itemstack, placer) end minetest.register_tool(":worldedit:brush", { - description = "WorldEdit Brush", + description = S("WorldEdit Brush"), inventory_image = "worldedit_brush.png", stack_max = 1, -- no need to stack these (metadata prevents this anyway) range = 0, @@ -74,7 +71,7 @@ minetest.register_tool(":worldedit:brush", { worldedit.register_command("brush", { privs = {worldedit=true}, params = "none/ [parameters]", - description = "Assign command to WorldEdit brush item", + description = S("Assign command to WorldEdit brush item or clear assignment using 'none'"), parse = function(param) local found, _, cmd, params = param:find("^([^%s]+)%s+(.+)$") if not found then @@ -87,39 +84,39 @@ worldedit.register_command("brush", { return true, cmd, params end, func = function(name, cmd, params) - local itemstack = minetest.get_player_by_name(name):get_wielded_item() + local player = minetest.get_player_by_name(name) + if not player then return end + local itemstack = player:get_wielded_item() if itemstack == nil or itemstack:get_name() ~= "worldedit:brush" then - worldedit.player_notify(name, "Not holding brush item.") - return + return false, S("Not holding brush item.") end cmd = cmd:lower() local meta = itemstack:get_meta() if cmd == "none" then meta:from_table(nil) - worldedit.player_notify(name, "Brush assignment cleared.") + worldedit.player_notify(name, S("Brush assignment cleared."), "ok") else local cmddef = worldedit.registered_commands[cmd] if cmddef == nil or cmddef.require_pos ~= 1 then - worldedit.player_notify(name, "//" .. cmd .. " cannot be used with brushes") - return + return false, S("@1 cannot be used with brushes", + minetest.colorize("#00ffff", "//"..cmd)) end -- Try parsing command params so we can give the user feedback local ok, err = cmddef.parse(params) if not ok then - err = err or "invalid usage" - worldedit.player_notify(name, "Error with brush command: " .. err) - return + err = err or S("invalid usage") + return false, S("Error with command: @1", err) end meta:set_string("command", cmd) meta:set_string("params", params) - local fullcmd = "//" .. cmd .. " " .. params + local fullcmd = minetest.colorize("#00ffff", "//"..cmd) .. " " .. params meta:set_string("description", minetest.registered_tools["worldedit:brush"].description .. ": " .. fullcmd) - worldedit.player_notify(name, "Brush assigned to command: " .. fullcmd) + worldedit.player_notify(name, S("Brush assigned to command: @1", fullcmd), "ok") end - minetest.get_player_by_name(name):set_wielded_item(itemstack) + player:set_wielded_item(itemstack) end, }) diff --git a/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt b/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt new file mode 100644 index 00000000..81a98af7 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: worldedit_brush +This brush is not bound, use @1 to bind a command to it.= +Missing privileges: @1= +Too far away.= +WorldEdit Brush= +Assign command to WorldEdit brush item or clear assignment using 'none'= +Not holding brush item.= +Brush assignment cleared.= +@1 cannot be used with brushes= +invalid usage= +Error with command: @1= +Brush assigned to command: @1= diff --git a/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr b/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr new file mode 100644 index 00000000..42f52aaf --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr @@ -0,0 +1,12 @@ +# textdomain: worldedit_brush +This brush is not bound, use @1 to bind a command to it.=Dieser Pinsel ist nicht konfiguriert, nutzen Sie @1, um einen Befehl an ihn zu binden. +Missing privileges: @1=Fehlende Privilegien: @1 +Too far away.=Zu weit weg. +WorldEdit Brush=WorldEdit-Pinsel +Assign command to WorldEdit brush item or clear assignment using 'none'=Befehl an WorldEdit-Pinsel binden oder Zuweisung mittels „none“ aufheben +Not holding brush item.=Kein Pinsel in der Hand. +Brush assignment cleared.=Pinsel-Zuweisung aufgehoben. +@1 cannot be used with brushes=@1 kann nicht mit Pinseln verwendet werden +invalid usage=Ungültige Verwendung +Error with command: @1=Befehl ist fehlerhaft: @1 +Brush assigned to command: @1=Pinsel an Befehl gebunden: @1 diff --git a/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png b/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png index 03785ff6..415813fb 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png and b/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/code.lua b/mods/Minetest-WorldEdit/worldedit_commands/code.lua new file mode 100644 index 00000000..96661b79 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/code.lua @@ -0,0 +1,59 @@ +local S = minetest.get_translator("worldedit_commands") + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + + +worldedit.register_command("lua", { + params = "", + description = S("Executes as a Lua chunk in the global namespace"), + category = S("Code"), + privs = {worldedit=true, server=true}, + parse = function(param) + if param == "" then + return false + end + return true, param + end, + func = function(name, param) + -- shorthand like in the Lua interpreter + if param:sub(1, 1) == "=" then + param = "return " .. param:sub(2) + end + local err, ret = worldedit.lua(param, name) + if err == nil then + minetest.log("action", name .. " executed " .. param) + if ret ~= "nil" then + worldedit.player_notify(name, "code successfully executed, returned " .. ret, "info") + else + worldedit.player_notify(name, "code successfully executed", "ok") + end + else + minetest.log("action", name .. " tried to execute " .. param) + worldedit.player_notify(name, "code error: " .. err, "error") + end + end, +}) + +worldedit.register_command("luatransform", { + params = "", + description = S("Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region"), + category = S("Code"), + privs = {worldedit=true, server=true}, + require_pos = 2, + parse = function(param) + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) + if err then + worldedit.player_notify(name, "code error: " .. err, "error") + minetest.log("action", name.." tried to execute luatransform "..param) + else + worldedit.player_notify(name, "code successfully executed", "ok") + minetest.log("action", name.." executed luatransform "..param) + end + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua b/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua index 93e45fae..b2691127 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua @@ -1,6 +1,9 @@ +local S = minetest.get_translator("worldedit_commands") + worldedit.register_command("outset", { params = "[h/v] ", - description = "Outset the selected region.", + description = S("Outset the selected region."), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -11,7 +14,7 @@ worldedit.register_command("outset", { local hv_test = dir:find("[^hv]+") if hv_test ~= nil then - return false, "Invalid direction." + return false, S("Invalid direction: @1", dir) end return true, dir, tonumber(amount) @@ -28,18 +31,19 @@ worldedit.register_command("outset", { assert(worldedit.cuboid_linear_expand(name, 'y', 1, amount)) assert(worldedit.cuboid_linear_expand(name, 'y', -1, amount)) else - return false, "Invalid number of arguments" + return false, S("Invalid number of arguments") end worldedit.marker_update(name) - return true, "Region outset by " .. amount .. " blocks" + return true, S("Region outset by @1 nodes", amount) end, }) worldedit.register_command("inset", { params = "[h/v] ", - description = "Inset the selected region.", + description = S("Inset the selected region."), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -48,7 +52,7 @@ worldedit.register_command("inset", { return false end if dir:find("[^hv]") ~= nil then - return false, "Invalid direction." + return false, S("Invalid direction: @1", dir) end return true, dir, tonumber(amount) @@ -65,18 +69,19 @@ worldedit.register_command("inset", { assert(worldedit.cuboid_linear_expand(name, 'y', 1, -amount)) assert(worldedit.cuboid_linear_expand(name, 'y', -1, -amount)) else - return false, "Invalid number of arguments" + return false, S("Invalid number of arguments") end worldedit.marker_update(name) - return true, "Region inset by " .. amount .. " blocks" + return true, S("Region inset by @1 nodes", amount) end, }) worldedit.register_command("shift", { params = "x/y/z/?/up/down/left/right/front/back [+/-]", - description = "Shifts the selection area without moving its contents", + description = S("Shifts the selection area without moving its contents"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -98,20 +103,21 @@ worldedit.register_command("shift", { end if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end assert(worldedit.cuboid_shift(name, axis, amount * dir)) worldedit.marker_update(name) - return true, "Region shifted by " .. amount .. " nodes" + return true, S("Region shifted by @1 nodes", amount) end, }) worldedit.register_command("expand", { params = "[+/-]x/y/z/?/up/down/left/right/front/back [reverse amount]", - description = "Expands the selection in the selected absolute or relative axis", + description = S("Expands the selection in the selected absolute or relative axis"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -135,7 +141,7 @@ worldedit.register_command("expand", { axis, dir = worldedit.translate_direction(name, direction) if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end else if direction == "?" then @@ -153,14 +159,15 @@ worldedit.register_command("expand", { worldedit.cuboid_linear_expand(name, axis, dir, amount) worldedit.cuboid_linear_expand(name, axis, -dir, rev_amount) worldedit.marker_update(name) - return true, "Region expanded by " .. (amount + rev_amount) .. " nodes" + return true, S("Region expanded by @1 nodes", amount + rev_amount) end, }) worldedit.register_command("contract", { params = "[+/-]x/y/z/?/up/down/left/right/front/back [reverse amount]", - description = "Contracts the selection in the selected absolute or relative axis", + description = S("Contracts the selection in the selected absolute or relative axis"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -184,7 +191,7 @@ worldedit.register_command("contract", { axis, dir = worldedit.translate_direction(name, direction) if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end else if direction == "?" then @@ -202,13 +209,13 @@ worldedit.register_command("contract", { worldedit.cuboid_linear_expand(name, axis, dir, -amount) worldedit.cuboid_linear_expand(name, axis, -dir, -rev_amount) worldedit.marker_update(name) - return true, "Region contracted by " .. (amount + rev_amount) .. " nodes" + return true, S("Region contracted by @1 nodes", amount + rev_amount) end, }) worldedit.register_command("cubeapply", { params = "/( ) [parameters]", - description = "Select a cube with side length around position 1 and run on region", + description = S("Select a cube with side length around position 1 and run on region"), privs = {worldedit=true}, require_pos = 1, parse = function(param) @@ -230,7 +237,8 @@ worldedit.register_command("cubeapply", { end local cmddef = worldedit.registered_commands[cmd] if cmddef == nil or cmddef.require_pos ~= 2 then - return false, "invalid usage: //" .. cmd .. " cannot be used with cubeapply" + return false, S("invalid usage: @1 cannot be used with cubeapply", + minetest.colorize("#00ffff", "//"..cmd)) end -- run parsing of target command local parsed = {cmddef.parse(args)} @@ -241,15 +249,14 @@ worldedit.register_command("cubeapply", { end, nodes_needed = function(name, sidex, sidey, sidez, cmd, parsed) -- its not possible to defer to the target command at this point + -- FIXME: why not? return sidex * sidey * sidez end, func = function(name, sidex, sidey, sidez, cmd, parsed) local cmddef = assert(worldedit.registered_commands[cmd]) local success, missing_privs = minetest.check_player_privs(name, cmddef.privs) if not success then - worldedit.player_notify(name, "Missing privileges: " .. - table.concat(missing_privs, ", ")) - return + return false, S("Missing privileges: @1", table.concat(missing_privs, ", ")) end -- update region to be the cuboid the user wanted diff --git a/mods/Minetest-WorldEdit/worldedit_commands/init.lua b/mods/Minetest-WorldEdit/worldedit_commands/init.lua index 1cdb1077..7b5cd15c 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/init.lua @@ -1,36 +1,43 @@ -minetest.register_privilege("worldedit", "Can use WorldEdit commands") +local S = minetest.get_translator("worldedit_commands") + +minetest.register_privilege("worldedit", S("Can use WorldEdit commands")) worldedit.pos1 = {} worldedit.pos2 = {} -worldedit.set_pos = {} -worldedit.inspect = {} -worldedit.prob_pos = {} -worldedit.prob_list = {} - - local safe_region, reset_pending = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") -function worldedit.player_notify(name, message) - minetest.chat_send_player(name, "WorldEdit -!- " .. message, false) -end - worldedit.registered_commands = {} +local function copy_state(which, name) + if which == 0 then + return {} + elseif which == 1 then + return { + worldedit.pos1[name] and vector.copy(worldedit.pos1[name]) + } + else + return { + worldedit.pos1[name] and vector.copy(worldedit.pos1[name]), + worldedit.pos2[name] and vector.copy(worldedit.pos2[name]) + } + end +end + local function chatcommand_handler(cmd_name, name, param) local def = assert(worldedit.registered_commands[cmd_name]) if def.require_pos == 2 then local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] if pos1 == nil or pos2 == nil then - worldedit.player_notify(name, "no region selected") + worldedit.player_notify(name, S("no region selected"), "error") return end elseif def.require_pos == 1 then local pos1 = worldedit.pos1[name] if pos1 == nil then - worldedit.player_notify(name, "no position 1 selected") + worldedit.player_notify(name, S("no position 1 selected"), "error") return end end @@ -38,25 +45,38 @@ local function chatcommand_handler(cmd_name, name, param) local parsed = {def.parse(param)} local success = table.remove(parsed, 1) if not success then - worldedit.player_notify(name, parsed[1] or "invalid usage") + worldedit.player_notify(name, parsed[1] or S("invalid usage"), "error") return end - if def.nodes_needed then - local count = def.nodes_needed(name, unpack(parsed)) - safe_region(name, count, function() - local success, msg = def.func(name, unpack(parsed)) - if msg then - minetest.chat_send_player(name, msg) - end - end) - else - -- no "safe region" check - local success, msg = def.func(name, unpack(parsed)) + local run = function() + local ok, msg = def.func(name, unpack(parsed)) if msg then - minetest.chat_send_player(name, msg) + worldedit.player_notify(name, msg, ok and "ok" or "error") end end + + if not def.nodes_needed then + -- no safe region check + run() + return + end + + local count = def.nodes_needed(name, unpack(parsed)) + local old_state = copy_state(def.require_pos, name) + safe_region(name, count, function() + local state = copy_state(def.require_pos, name) + local ok = true + for i, v in ipairs(state) do + ok = ok and ( (v == nil and old_state[i] == nil) or vector.equals(v, old_state[i]) ) + end + if not ok then + worldedit.player_notify(name, S("ERROR: the operation was cancelled because the region has changed."), "error") + return + end + + run() + end) end -- Registers a chatcommand for WorldEdit @@ -64,8 +84,9 @@ end -- def = { -- privs = {}, -- Privileges needed -- params = "", -- Human readable parameter list (optional) --- -- setting params = "" will automatically provide a parse() if not given +-- -- if params = "" then a parse() implementation will automatically be provided -- description = "", -- Description +-- category = "", -- Category of the command (optional) -- require_pos = 0, -- Number of positions required to be set (optional) -- parse = function(param) -- return true, foo, bar, ... @@ -84,7 +105,9 @@ end function worldedit.register_command(name, def) local def = table.copy(def) assert(name and #name > 0) + def.name = name assert(def.privs) + def.category = def.category or "" def.require_pos = def.require_pos or 0 assert(def.require_pos >= 0 and def.require_pos < 3) if def.params == "" and not def.parse then @@ -100,6 +123,9 @@ function worldedit.register_command(name, def) minetest.log("warning", "//" .. name .. " might be missing nodes_needed") end--]] + -- disable further modification + setmetatable(def, {__newindex = {}}) + minetest.register_chatcommand("/" .. name, { privs = def.privs, params = def.params, @@ -112,105 +138,48 @@ function worldedit.register_command(name, def) end - -dofile(minetest.get_modpath("worldedit_commands") .. "/cuboid.lua") -dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua") -dofile(minetest.get_modpath("worldedit_commands") .. "/wand.lua") - - -local function check_region(name) - return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +do + local modpath = minetest.get_modpath("worldedit_commands") + for _, name in ipairs({ + "code", "cuboid", "manipulations", "marker", "nodename", "primitives", + "region", "schematics", "transform", "wand" + }) do + dofile(modpath .. "/" .. name .. ".lua") + end end --- Strips any kind of escape codes (translation, colors) from a string --- https://github.com/minetest/minetest/blob/53dd7819277c53954d1298dfffa5287c306db8d0/src/util/string.cpp#L777 -local function strip_escapes(input) - local s = function(idx) return input:sub(idx, idx) end - local out = "" - local i = 1 - while i <= #input do - if s(i) == "\027" then -- escape sequence - i = i + 1 - if s(i) == "(" then -- enclosed - i = i + 1 - while i <= #input and s(i) ~= ")" do - if s(i) == "\\" then - i = i + 2 - else - i = i + 1 - end - end - end - else - out = out .. s(i) - end - i = i + 1 + +-- Notifies a player of something related to WorldEdit. +-- Message types: +-- "error" = An operation did not work as expected. +-- "ok" = An operation completed successfully. Because notifications of this type +-- can be filtered, use this ONLY for generic messages like "1234 nodes set". +-- "info" = Other informational messages +-- @param name Name of player +-- @param message Message text +-- @param typ Type of message (optional but strongly recommend) +function worldedit.player_notify(name, message, typ) + local t = { + "WorldEdit", + "-!-", + tostring(message) + } + if typ == "error" then + t[2] = minetest.colorize("#f22", t[2]) + elseif typ == "ok" then + t[2] = minetest.colorize("#2f2", t[2]) end - --print(("%q -> %q"):format(input, out)) - return out -end - -local function string_endswith(full, part) - return full:find(part, 1, true) == #full - #part + 1 -end - -local description_cache = nil - --- normalizes node "description" `nodename`, returning a string (or nil) -worldedit.normalize_nodename = function(nodename) - nodename = nodename:gsub("^%s*(.-)%s*$", "%1") -- strip spaces - if nodename == "" then return nil end - - local fullname = ItemStack({name=nodename}):get_name() -- resolve aliases - if minetest.registered_nodes[fullname] or fullname == "air" then -- full name - return fullname - end - nodename = nodename:lower() - - for key, _ in pairs(minetest.registered_nodes) do - if string_endswith(key:lower(), ":" .. nodename) then -- matches name (w/o mod part) - return key - end - end - - if description_cache == nil then - -- cache stripped descriptions - description_cache = {} - for key, value in pairs(minetest.registered_nodes) do - local desc = strip_escapes(value.description):gsub("\n.*", "", 1):lower() - if desc ~= "" then - description_cache[key] = desc - end - end - end - - for key, desc in pairs(description_cache) do - if desc == nodename then -- matches description - return key - end - end - for key, desc in pairs(description_cache) do - if desc == nodename .. " block" then - -- fuzzy description match (e.g. "Steel" == "Steel Block") - return key - end - end - - local match = nil - for key, value in pairs(description_cache) do - if value:find(nodename, 1, true) ~= nil then - if match ~= nil then - return nil - end - match = key -- substring description match (only if no ambiguities) - end - end - return match + minetest.chat_send_player(name, table.concat(t, " ")) end -- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) function worldedit.player_axis(name) - local dir = minetest.get_player_by_name(name):get_look_dir() + local player = minetest.get_player_by_name(name) + if not player then + -- we promised to return something valid... + return "y", -1 + end + local dir = player:get_look_dir() local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z) if x > y then if x > z then @@ -222,132 +191,123 @@ function worldedit.player_axis(name) return "z", dir.z > 0 and 1 or -1 end -local function check_filename(name) - return name:find("^[%w%s%^&'@{}%[%],%$=!%-#%(%)%%%.%+~_]+$") ~= nil -end - worldedit.register_command("about", { privs = {}, params = "", - description = "Get information about the WorldEdit mod", + description = S("Get information about the WorldEdit mod"), func = function(name) - worldedit.player_notify(name, "WorldEdit " .. worldedit.version_string.. - " is available on this server. Type //help to get a list of ".. - "commands, or get more information at ".. - "https://github.com/Uberi/Minetest-WorldEdit") + worldedit.player_notify(name, S("WorldEdit @1".. + " is available on this server. Type @2 to get a list of ".. + "commands, or find more information at @3", + worldedit.version_string, minetest.colorize("#00ffff", "//help"), + "https://github.com/Uberi/Minetest-WorldEdit" + ), "info") end, }) --- mostly copied from builtin/chatcommands.lua with minor modifications -worldedit.register_command("help", { - privs = {}, - params = "[all/]", - description = "Get help for WorldEdit commands", - parse = function(param) - return true, param - end, - func = function(name, param) - local function format_help_line(cmd, def) - local msg = minetest.colorize("#00ffff", "//"..cmd) +-- initially copied from builtin/chatcommands.lua +local function help_command(name, param) + local function format_help_line(cmd, def, follow_alias) + local msg = minetest.colorize("#00ffff", "//"..cmd) + if def.name ~= cmd then + msg = msg .. ": " .. S("alias to @1", + minetest.colorize("#00ffff", "//"..def.name)) + if follow_alias then + msg = msg .. "\n" .. format_help_line(def.name, def) + end + else if def.params and def.params ~= "" then msg = msg .. " " .. def.params end if def.description and def.description ~= "" then msg = msg .. ": " .. def.description end - return msg end - - if not minetest.check_player_privs(name, "worldedit") then - return false, "You are not allowed to use any WorldEdit commands." - end - if param == "" then - local msg = "" - local cmds = {} - for cmd, def in pairs(worldedit.registered_commands) do - if minetest.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = cmd - end - end - table.sort(cmds) - return true, "Available commands: " .. table.concat(cmds, " ") .. "\n" - .. "Use '//help ' to get more information," - .. " or '//help all' to list everything." - elseif param == "all" then - local cmds = {} - for cmd, def in pairs(worldedit.registered_commands) do - if minetest.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = format_help_line(cmd, def) - end - end - table.sort(cmds) - return true, "Available commands:\n"..table.concat(cmds, "\n") - else - local def = worldedit.registered_commands[param] - if not def then - return false, "Command not available: " .. param - else - return true, format_help_line(param, def) - end - end - end, -}) - -worldedit.register_command("inspect", { - params = "[on/off/1/0/true/false/yes/no/enable/disable]", - description = "Enable or disable node inspection", - privs = {worldedit=true}, - parse = function(param) - if param == "on" or param == "1" or param == "true" or param == "yes" or param == "enable" or param == "" then - return true, true - elseif param == "off" or param == "0" or param == "false" or param == "no" or param == "disable" then - return true, false - end - return false - end, - func = function(name, enable) - if enable then - worldedit.inspect[name] = true - local axis, sign = worldedit.player_axis(name) - worldedit.player_notify(name, string.format("inspector: inspection enabled for %s, currently facing the %s axis", - name, axis .. (sign > 0 and "+" or "-"))) - else - worldedit.inspect[name] = nil - worldedit.player_notify(name, "inspector: inspection disabled") - end - end, -}) - -local function get_node_rlight(pos) - local vecs = { -- neighboring nodes - {x= 1, y= 0, z= 0}, - {x=-1, y= 0, z= 0}, - {x= 0, y= 1, z= 0}, - {x= 0, y=-1, z= 0}, - {x= 0, y= 0, z= 1}, - {x= 0, y= 0, z=-1}, - } - local ret = 0 - for _, v in ipairs(vecs) do - ret = math.max(ret, minetest.get_node_light(vector.add(pos, v))) + return msg + end + -- @param cmds list of {cmd, def} + local function sort_cmds(cmds) + table.sort(cmds, function(c1, c2) + local cmd1, cmd2 = c1[1], c2[1] + local def1, def2 = c1[2], c2[2] + -- by category (this puts the empty category first) + if def1.category ~= def2.category then + return def1.category < def2.category + end + -- put aliases last + if (cmd1 ~= def1.name) ~= (cmd2 ~= def2.name) then + return cmd2 ~= def2.name + end + -- then by name + return c1[1] < c2[1] + end) + end + + if not minetest.check_player_privs(name, "worldedit") then + return false, S("You are not allowed to use any WorldEdit commands.") + end + if param == "" then + local list = {} + for cmd, def in pairs(worldedit.registered_commands) do + if minetest.check_player_privs(name, def.privs) then + list[#list + 1] = cmd + end + end + table.sort(list) + local help = minetest.colorize("#00ffff", "//help") + return true, S("Available commands: @1@n" + .. "Use '@2' to get more information," + .. " or '@3' to list everything.", + table.concat(list, " "), help .. " ", help .. " all") + elseif param == "all" then + local cmds = {} + for cmd, def in pairs(worldedit.registered_commands) do + if minetest.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = {cmd, def} + end + end + sort_cmds(cmds) + local list = {} + local last_cat = "" + for _, e in ipairs(cmds) do + if e[2].category ~= last_cat then + last_cat = e[2].category + list[#list + 1] = "---- " .. last_cat + end + list[#list + 1] = format_help_line(e[1], e[2]) + end + return true, S("Available commands:@n") .. table.concat(list, "\n") + else + local def = worldedit.registered_commands[param] + if not def then + return false, S("Command not available: ") .. param + else + return true, format_help_line(param, def, true) + end end - return ret end -minetest.register_on_punchnode(function(pos, node, puncher) - local name = puncher:get_player_name() - if worldedit.inspect[name] then - local axis, sign = worldedit.player_axis(name) - local message = string.format("inspector: %s at %s (param1=%d, param2=%d, received light=%d) punched facing the %s axis", - node.name, minetest.pos_to_string(pos), node.param1, node.param2, get_node_rlight(pos), axis .. (sign > 0 and "+" or "-")) - worldedit.player_notify(name, message) - end -end) +worldedit.register_command("help", { + privs = {}, + params = "[all/]", + description = S("Get help for WorldEdit commands"), + parse = function(param) + return true, param + end, + func = function(name, param) + local ok, msg = help_command(name, param) + if msg then + worldedit.player_notify(name, msg, ok and "info" or "error") + end + end, +}) +-- needs to be here due to reset_pending() worldedit.register_command("reset", { params = "", - description = "Reset the region so that it is empty", + description = S("Reset the region so that it is empty"), + category = S("Region operations"), privs = {worldedit=true}, func = function(name) worldedit.pos1[name] = nil @@ -356,1310 +316,7 @@ worldedit.register_command("reset", { worldedit.set_pos[name] = nil --make sure the user does not try to confirm an operation after resetting pos: reset_pending(name) - worldedit.player_notify(name, "region reset") + return true, S("region reset") end, }) -worldedit.register_command("mark", { - params = "", - description = "Show markers at the region positions", - privs = {worldedit=true}, - func = function(name) - worldedit.marker_update(name) - worldedit.player_notify(name, "region marked") - end, -}) - -worldedit.register_command("unmark", { - params = "", - description = "Hide markers if currently shown", - privs = {worldedit=true}, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - worldedit.pos1[name] = nil - worldedit.pos2[name] = nil - worldedit.marker_update(name) - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.player_notify(name, "region unmarked") - end, -}) - -worldedit.register_command("pos1", { - params = "", - description = "Set WorldEdit region position 1 to the player's location", - privs = {worldedit=true}, - func = function(name) - local pos = minetest.get_player_by_name(name):get_pos() - pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - end, -}) - -worldedit.register_command("pos2", { - params = "", - description = "Set WorldEdit region position 2 to the player's location", - privs = {worldedit=true}, - func = function(name) - local pos = minetest.get_player_by_name(name):get_pos() - pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - end, -}) - -worldedit.register_command("p", { - params = "set/set1/set2/get", - description = "Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region", - privs = {worldedit=true}, - parse = function(param) - if param == "set" or param == "set1" or param == "set2" or param == "get" then - return true, param - end - return false, "unknown subcommand: " .. param - end, - func = function(name, param) - if param == "set" then --set both WorldEdit positions - worldedit.set_pos[name] = "pos1" - worldedit.player_notify(name, "select positions by punching two nodes") - elseif param == "set1" then --set WorldEdit position 1 - worldedit.set_pos[name] = "pos1only" - worldedit.player_notify(name, "select position 1 by punching a node") - elseif param == "set2" then --set WorldEdit position 2 - worldedit.set_pos[name] = "pos2" - worldedit.player_notify(name, "select position 2 by punching a node") - elseif param == "get" then --display current WorldEdit positions - if worldedit.pos1[name] ~= nil then - worldedit.player_notify(name, "position 1: " .. minetest.pos_to_string(worldedit.pos1[name])) - else - worldedit.player_notify(name, "position 1 not set") - end - if worldedit.pos2[name] ~= nil then - worldedit.player_notify(name, "position 2: " .. minetest.pos_to_string(worldedit.pos2[name])) - else - worldedit.player_notify(name, "position 2 not set") - end - end - end, -}) - -worldedit.register_command("fixedpos", { - params = "set1/set2 ", - description = "Set a WorldEdit region position to the position at (, , )", - privs = {worldedit=true}, - parse = function(param) - local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, flag, {x=tonumber(x), y=tonumber(y), z=tonumber(z)} - end, - func = function(name, flag, pos) - if flag == "set1" then - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - else --flag == "set2" - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - end - end, -}) - -minetest.register_on_punchnode(function(pos, node, puncher) - local name = puncher:get_player_name() - if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position - if worldedit.set_pos[name] == "pos1" then --setting position 1 - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.set_pos[name] = nil --finished setting positions - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "pos2" then --setting position 2 - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.set_pos[name] = nil --finished setting positions - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "prob" then --setting Minetest schematic node probabilities - worldedit.prob_pos[name] = pos - minetest.show_formspec(puncher:get_player_name(), "prob_val_enter", "field[text;;]") - end - end -end) - -worldedit.register_command("volume", { - params = "", - description = "Display the volume of the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - - local volume = worldedit.volume(pos1, pos2) - local abs = math.abs - worldedit.player_notify(name, "current region has a volume of " .. volume .. " nodes (" - .. abs(pos2.x - pos1.x) + 1 .. "*" - .. abs(pos2.y - pos1.y) + 1 .. "*" - .. abs(pos2.z - pos1.z) + 1 .. ")") - end, -}) - -worldedit.register_command("deleteblocks", { - params = "", - description = "remove all MapBlocks (16x16x16) containing the selected area from the map", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local success = minetest.delete_area(pos1, pos2) - if success then - worldedit.player_notify(name, "Area deleted.") - else - worldedit.player_notify(name, "There was an error during deletion of the area.") - end - end, -}) - -worldedit.register_command("set", { - params = "", - description = "Set the current WorldEdit region to ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.set(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes set") - end, -}) - -worldedit.register_command("param2", { - params = "", - description = "Set param2 of all nodes in the current WorldEdit region to ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local param2 = tonumber(param) - if not param2 then - return false - elseif param2 < 0 or param2 > 255 then - return false, "Param2 is out of range (must be between 0 and 255 inclusive!)" - end - return true, param2 - end, - nodes_needed = check_region, - func = function(name, param2) - local count = worldedit.set_param2(worldedit.pos1[name], worldedit.pos2[name], param2) - worldedit.player_notify(name, count .. " nodes altered") - end, -}) - -worldedit.register_command("mix", { - params = " [count1] [count2] ...", - description = "Fill the current WorldEdit region with a random mix of , ...", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local nodes = {} - for nodename in param:gmatch("[^%s]+") do - if tonumber(nodename) ~= nil and #nodes > 0 then - local last_node = nodes[#nodes] - for i = 1, tonumber(nodename) do - nodes[#nodes + 1] = last_node - end - else - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - nodes[#nodes + 1] = node - end - end - if #nodes == 0 then - return false - end - return true, nodes - end, - nodes_needed = check_region, - func = function(name, nodes) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.set(pos1, pos2, nodes) - worldedit.player_notify(name, count .. " nodes set") - end, -}) - -local check_replace = function(param) - local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$") - if found == nil then - return false - end - local newsearchnode = worldedit.normalize_nodename(searchnode) - if not newsearchnode then - return false, "invalid search node name: " .. searchnode - end - local newreplacenode = worldedit.normalize_nodename(replacenode) - if not newreplacenode then - return false, "invalid replace node name: " .. replacenode - end - return true, newsearchnode, newreplacenode -end - -worldedit.register_command("replace", { - params = " ", - description = "Replace all instances of with in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - parse = check_replace, - nodes_needed = check_region, - func = function(name, search_node, replace_node) - local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], - search_node, replace_node) - worldedit.player_notify(name, count .. " nodes replaced") - end, -}) - -worldedit.register_command("replaceinverse", { - params = " ", - description = "Replace all nodes other than with in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - parse = check_replace, - nodes_needed = check_region, - func = function(name, search_node, replace_node) - local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], - search_node, replace_node, true) - worldedit.player_notify(name, count .. " nodes replaced") - end, -}) - -local check_cube = function(param) - local found, _, w, h, l, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(w), tonumber(h), tonumber(l), node -end - -worldedit.register_command("hollowcube", { - params = " ", - description = "Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cube, - nodes_needed = function(name, w, h, l, node) - return w * h * l - end, - func = function(name, w, h, l, node) - local count = worldedit.cube(worldedit.pos1[name], w, h, l, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("cube", { - params = " ", - description = "Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cube, - nodes_needed = function(name, w, h, l, node) - return w * h * l - end, - func = function(name, w, h, l, node) - local count = worldedit.cube(worldedit.pos1[name], w, h, l, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_sphere = function(param) - local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(radius), node -end - -worldedit.register_command("hollowsphere", { - params = " ", - description = "Add hollow sphere centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_sphere, - nodes_needed = function(name, radius, node) - return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere - end, - func = function(name, radius, node) - local count = worldedit.sphere(worldedit.pos1[name], radius, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("sphere", { - params = " ", - description = "Add sphere centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_sphere, - nodes_needed = function(name, radius, node) - return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere - end, - func = function(name, radius, node) - local count = worldedit.sphere(worldedit.pos1[name], radius, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_dome = function(param) - local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(radius), node -end - -worldedit.register_command("hollowdome", { - params = " ", - description = "Add hollow dome centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_dome, - nodes_needed = function(name, radius, node) - return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome - end, - func = function(name, radius, node) - local count = worldedit.dome(worldedit.pos1[name], radius, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("dome", { - params = " ", - description = "Add dome centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_dome, - nodes_needed = function(name, radius, node) - return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome - end, - func = function(name, radius, node) - local count = worldedit.dome(worldedit.pos1[name], radius, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_cylinder = function(param) - -- two radii - local found, _, axis, length, radius1, radius2, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - -- single radius - found, _, axis, length, radius1, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") - radius2 = radius1 - end - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, axis, tonumber(length), tonumber(radius1), tonumber(radius2), node -end - -worldedit.register_command("hollowcylinder", { - params = "x/y/z/? [radius2] ", - description = "Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cylinder, - nodes_needed = function(name, axis, length, radius1, radius2, node) - local radius = math.max(radius1, radius2) - return math.ceil(math.pi * (radius ^ 2) * length) - end, - func = function(name, axis, length, radius1, radius2, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - length = length * sign - end - local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("cylinder", { - params = "x/y/z/? [radius2] ", - description = "Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cylinder, - nodes_needed = function(name, axis, length, radius1, radius2, node) - local radius = math.max(radius1, radius2) - return math.ceil(math.pi * (radius ^ 2) * length) - end, - func = function(name, axis, length, radius1, radius2, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - length = length * sign - end - local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_pyramid = function(param) - local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, axis, tonumber(height), node -end - -worldedit.register_command("hollowpyramid", { - params = "x/y/z/? ", - description = "Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_pyramid, - nodes_needed = function(name, axis, height, node) - return math.ceil(((height * 2 + 1) ^ 2) * height / 3) - end, - func = function(name, axis, height, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - height = height * sign - end - local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("pyramid", { - params = "x/y/z/? ", - description = "Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_pyramid, - nodes_needed = function(name, axis, height, node) - return math.ceil(((height * 2 + 1) ^ 2) * height / 3) - end, - func = function(name, axis, height, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - height = height * sign - end - local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("spiral", { - params = " ", - description = "Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(length), tonumber(height), tonumber(space), node - end, - nodes_needed = function(name, length, height, space, node) - return (length + space) * height -- TODO: this is not the upper bound - end, - func = function(name, length, height, space, node) - local count = worldedit.spiral(worldedit.pos1[name], length, height, space, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("copy", { - params = "x/y/z/? ", - description = "Copy the current WorldEdit region along the given axis by nodes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(amount) - end, - nodes_needed = function(name, axis, amount) - return check_region(name) * 2 - end, - func = function(name, axis, amount) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - amount = amount * sign - end - - local count = worldedit.copy(worldedit.pos1[name], worldedit.pos2[name], axis, amount) - worldedit.player_notify(name, count .. " nodes copied") - end, -}) - -worldedit.register_command("move", { - params = "x/y/z/? ", - description = "Move the current WorldEdit region along the given axis by nodes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(amount) - end, - nodes_needed = function(name, axis, amount) - return check_region(name) * 2 - end, - func = function(name, axis, amount) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - amount = amount * sign - end - - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.move(pos1, pos2, axis, amount) - - pos1[axis] = pos1[axis] + amount - pos2[axis] = pos2[axis] + amount - worldedit.marker_update(name) - worldedit.player_notify(name, count .. " nodes moved") - end, -}) - -worldedit.register_command("stack", { - params = "x/y/z/? ", - description = "Stack the current WorldEdit region along the given axis times", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(repetitions) - end, - nodes_needed = function(name, axis, repetitions) - return check_region(name) * math.abs(repetitions) - end, - func = function(name, axis, repetitions) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - repetitions = repetitions * sign - end - - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.volume(pos1, pos2) * math.abs(repetitions) - worldedit.stack(pos1, pos2, axis, repetitions, function() - worldedit.player_notify(name, count .. " nodes stacked") - end) - end, -}) - -worldedit.register_command("stack2", { - params = " ", - description = "Stack the current WorldEdit region times by offset , , ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local repetitions, incs = param:match("(%d+)%s*(.+)") - if repetitions == nil then - return false, "invalid count: " .. param - end - local x, y, z = incs:match("([+-]?%d+) ([+-]?%d+) ([+-]?%d+)") - if x == nil then - return false, "invalid increments: " .. param - end - - return true, tonumber(repetitions), {x=tonumber(x), y=tonumber(y), z=tonumber(z)} - end, - nodes_needed = function(name, repetitions, offset) - return check_region(name) * repetitions - end, - func = function(name, repetitions, offset) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.volume(pos1, pos2) * repetitions - worldedit.stack2(pos1, pos2, offset, repetitions, function() - worldedit.player_notify(name, count .. " nodes stacked") - end) - end, -}) - - -worldedit.register_command("stretch", { - params = " ", - description = "Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") - if found == nil then - return false - end - stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) - if stretchx == 0 or stretchy == 0 or stretchz == 0 then - return false, "invalid scaling factors: " .. param - end - return true, stretchx, stretchy, stretchz - end, - nodes_needed = function(name, stretchx, stretchy, stretchz) - return check_region(name) * stretchx * stretchy * stretchz - end, - func = function(name, stretchx, stretchy, stretchz) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count, pos1, pos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) - - --reset markers to scaled positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes stretched") - end, -}) - -worldedit.register_command("transpose", { - params = "x/y/z/? x/y/z/?", - description = "Transpose the current WorldEdit region along the given axes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") - if found == nil then - return false - elseif axis1 == axis2 then - return false, "invalid usage: axes must be different" - end - return true, axis1, axis2 - end, - nodes_needed = check_region, - func = function(name, axis1, axis2) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - if axis1 == "?" then axis1 = worldedit.player_axis(name) end - if axis2 == "?" then axis2 = worldedit.player_axis(name) end - local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2) - - --reset markers to transposed positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes transposed") - end, -}) - -worldedit.register_command("flip", { - params = "x/y/z/?", - description = "Flip the current WorldEdit region along the given axis", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param ~= "x" and param ~= "y" and param ~= "z" and param ~= "?" then - return false - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - if param == "?" then param = worldedit.player_axis(name) end - local count = worldedit.flip(worldedit.pos1[name], worldedit.pos2[name], param) - worldedit.player_notify(name, count .. " nodes flipped") - end, -}) - -worldedit.register_command("rotate", { - params = "x/y/z/? ", - description = "Rotate the current WorldEdit region around the given axis by angle (90 degree increment)", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - angle = tonumber(angle) - if angle % 90 ~= 0 or angle % 360 == 0 then - return false, "invalid usage: angle must be multiple of 90" - end - return true, axis, angle - end, - nodes_needed = check_region, - func = function(name, axis, angle) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - if axis == "?" then axis = worldedit.player_axis(name) end - local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle) - - --reset markers to rotated positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes rotated") - end, -}) - -worldedit.register_command("orient", { - params = "", - description = "Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, angle = param:find("^([+-]?%d+)$") - if found == nil then - return false - end - angle = tonumber(angle) - if angle % 90 ~= 0 then - return false, "invalid usage: angle must be multiple of 90" - end - return true, angle - end, - nodes_needed = check_region, - func = function(name, angle) - local count = worldedit.orient(worldedit.pos1[name], worldedit.pos2[name], angle) - worldedit.player_notify(name, count .. " nodes oriented") - end, -}) - -worldedit.register_command("fixlight", { - params = "", - description = "Fix the lighting in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.fixlight(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes updated") - end, -}) - -worldedit.register_command("drain", { - params = "", - description = "Remove any fluid node within the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - -- TODO: make an API function for this - local count = 0 - local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) - for x = pos1.x, pos2.x do - for y = pos1.y, pos2.y do - for z = pos1.z, pos2.z do - local n = minetest.get_node({x=x, y=y, z=z}).name - local d = minetest.registered_nodes[n] - if d ~= nil and (d["drawtype"] == "liquid" or d["drawtype"] == "flowingliquid") then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - end - end - end - end - worldedit.player_notify(name, count .. " nodes updated") - end, -}) - -local clearcut_cache - -local function clearcut(pos1, pos2) - -- decide which nodes we consider plants - if clearcut_cache == nil then - clearcut_cache = {} - for name, def in pairs(minetest.registered_nodes) do - local groups = def.groups or {} - if ( - -- the groups say so - groups.flower or groups.grass or groups.flora or groups.plant or - groups.leaves or groups.tree or groups.leafdecay or groups.sapling or - -- drawtype heuristic - (def.is_ground_content and def.buildable_to and - (def.sunlight_propagates or not def.walkable) - and def.drawtype == "plantlike") or - -- if it's flammable, it probably needs to go too - (def.is_ground_content and not def.walkable and groups.flammable) - ) then - clearcut_cache[name] = true - end - end - end - local plants = clearcut_cache - - local count = 0 - local prev, any - - for x = pos1.x, pos2.x do - for z = pos1.z, pos2.z do - prev = false - any = false - -- first pass: remove floating nodes that would be left over - for y = pos1.y, pos2.y do - local n = minetest.get_node({x=x, y=y, z=z}).name - if plants[n] then - prev = true - any = true - elseif prev then - local def = minetest.registered_nodes[n] or {} - local groups = def.groups or {} - if groups.attached_node or (def.buildable_to and groups.falling_node) then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - else - prev = false - end - end - end - - -- second pass: remove plants, top-to-bottom to avoid item drops - if any then - for y = pos2.y, pos1.y, -1 do - local n = minetest.get_node({x=x, y=y, z=z}).name - if plants[n] then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - end - end - end - end - end - - return count -end - -worldedit.register_command("clearcut", { - params = "", - description = "Remove any plant, tree or foilage-like nodes in the selected region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) - local count = clearcut(pos1, pos2) - worldedit.player_notify(name, count .. " nodes removed") - end, -}) - -worldedit.register_command("hide", { - params = "", - description = "Hide all nodes in the current WorldEdit region non-destructively", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.hide(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes hidden") - end, -}) - -worldedit.register_command("suppress", { - params = "", - description = "Suppress all in the current WorldEdit region non-destructively", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.suppress(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes suppressed") - end, -}) - -worldedit.register_command("highlight", { - params = "", - description = "Highlight in the current WorldEdit region by hiding everything else non-destructively", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.highlight(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes highlighted") - end, -}) - -worldedit.register_command("restore", { - params = "", - description = "Restores nodes hidden with WorldEdit in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.restore(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes restored") - end, -}) - -local function detect_misaligned_schematic(name, pos1, pos2) - pos1, pos2 = worldedit.sort_pos(pos1, pos2) - -- Check that allocate/save can position the schematic correctly - -- The expected behaviour is that the (0,0,0) corner of the schematic stays - -- sat pos1, this only works when the minimum position is actually present - -- in the schematic. - local node = minetest.get_node(pos1) - local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore" - if not have_node_at_origin then - worldedit.player_notify(name, - "Warning: The schematic contains excessive free space and WILL be ".. - "misaligned when allocated or loaded. To avoid this, shrink your ".. - "area to cover exactly the nodes to be saved." - ) - end -end - -worldedit.register_command("save", { - params = "", - description = "Save the current WorldEdit region to \"(world folder)/schems/.we\"", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local result, count = worldedit.serialize(worldedit.pos1[name], - worldedit.pos2[name]) - detect_misaligned_schematic(name, worldedit.pos1[name], worldedit.pos2[name]) - - local path = minetest.get_worldpath() .. "/schems" - -- Create directory if it does not already exist - minetest.mkdir(path) - - local filename = path .. "/" .. param .. ".we" - local file, err = io.open(filename, "wb") - if err ~= nil then - worldedit.player_notify(name, "Could not save file to \"" .. filename .. "\"") - return - end - file:write(result) - file:flush() - file:close() - - worldedit.player_notify(name, count .. " nodes saved") - end, -}) - -worldedit.register_command("allocate", { - params = "", - description = "Set the region defined by nodes from \"(world folder)/schems/.we\" as the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - local filename = minetest.get_worldpath() .. "/schems/" .. param .. ".we" - local file, err = io.open(filename, "rb") - if err ~= nil then - worldedit.player_notify(name, "could not open file \"" .. filename .. "\"") - return - end - local value = file:read("*a") - file:close() - - local version = worldedit.read_header(value) - if version == nil or version == 0 then - worldedit.player_notify(name, "File is invalid!") - return - elseif version > worldedit.LATEST_SERIALIZATION_VERSION then - worldedit.player_notify(name, "File was created with newer version of WorldEdit!") - return - end - local nodepos1, nodepos2, count = worldedit.allocate(pos, value) - - if not nodepos1 then - worldedit.player_notify(name, "Schematic empty, nothing allocated") - return - end - - worldedit.pos1[name] = nodepos1 - worldedit.pos2[name] = nodepos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes allocated") - end, -}) - -worldedit.register_command("load", { - params = "", - description = "Load nodes from \"(world folder)/schems/[.we[m]]\" with position 1 of the current WorldEdit region as the origin", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - if param == "" then - worldedit.player_notify(name, "invalid usage: " .. param) - return - end - if not string.find(param, "^[%w \t.,+-_=!@#$%%^&*()%[%]{};'\"]+$") then - worldedit.player_notify(name, "invalid file name: " .. param) - return - end - - --find the file in the world path - local testpaths = { - minetest.get_worldpath() .. "/schems/" .. param, - minetest.get_worldpath() .. "/schems/" .. param .. ".we", - minetest.get_worldpath() .. "/schems/" .. param .. ".wem", - } - local file, err - for index, path in ipairs(testpaths) do - file, err = io.open(path, "rb") - if not err then - break - end - end - if err then - worldedit.player_notify(name, "could not open file \"" .. param .. "\"") - return - end - local value = file:read("*a") - file:close() - - local version = worldedit.read_header(value) - if version == nil or version == 0 then - worldedit.player_notify(name, "File is invalid!") - return - elseif version > worldedit.LATEST_SERIALIZATION_VERSION then - worldedit.player_notify(name, "File was created with newer version of WorldEdit!") - return - end - - local count = worldedit.deserialize(pos, value) - - worldedit.player_notify(name, count .. " nodes loaded") - end, -}) - -worldedit.register_command("lua", { - params = "", - description = "Executes as a Lua chunk in the global namespace", - privs = {worldedit=true, server=true}, - parse = function(param) - return true, param - end, - func = function(name, param) - local err = worldedit.lua(param) - if err then - worldedit.player_notify(name, "code error: " .. err) - minetest.log("action", name.." tried to execute "..param) - else - worldedit.player_notify(name, "code successfully executed", false) - minetest.log("action", name.." executed "..param) - end - end, -}) - -worldedit.register_command("luatransform", { - params = "", - description = "Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region", - privs = {worldedit=true, server=true}, - require_pos = 2, - parse = function(param) - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) - if err then - worldedit.player_notify(name, "code error: " .. err, false) - minetest.log("action", name.." tried to execute luatransform "..param) - else - worldedit.player_notify(name, "code successfully executed", false) - minetest.log("action", name.." executed luatransform "..param) - end - end, -}) - -worldedit.register_command("mtschemcreate", { - params = "", - description = "Save the current WorldEdit region using the Minetest ".. - "Schematic format to \"(world folder)/schems/.mts\"", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local path = minetest.get_worldpath() .. "/schems" - -- Create directory if it does not already exist - minetest.mkdir(path) - - local filename = path .. "/" .. param .. ".mts" - local ret = minetest.create_schematic(worldedit.pos1[name], - worldedit.pos2[name], worldedit.prob_list[name], - filename) - if ret == nil then - worldedit.player_notify(name, "Failed to create Minetest schematic") - else - worldedit.player_notify(name, "Saved Minetest schematic to " .. param) - end - worldedit.prob_list[name] = {} - end, -}) - -worldedit.register_command("mtschemplace", { - params = "", - description = "Load nodes from \"(world folder)/schems/.mts\" with position 1 of the current WorldEdit region as the origin", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - local path = minetest.get_worldpath() .. "/schems/" .. param .. ".mts" - if minetest.place_schematic(pos, path) == nil then - worldedit.player_notify(name, "failed to place Minetest schematic") - else - worldedit.player_notify(name, "placed Minetest schematic " .. param .. - " at " .. minetest.pos_to_string(pos)) - end - end, -}) - -worldedit.register_command("mtschemprob", { - params = "start/finish/get", - description = "Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry", - privs = {worldedit=true}, - parse = function(param) - if param ~= "start" and param ~= "finish" and param ~= "get" then - return false, "unknown subcommand: " .. param - end - return true, param - end, - func = function(name, param) - if param == "start" then --start probability setting - worldedit.set_pos[name] = "prob" - worldedit.prob_list[name] = {} - worldedit.player_notify(name, "select Minetest schematic probability values by punching nodes") - elseif param == "finish" then --finish probability setting - worldedit.set_pos[name] = nil - worldedit.player_notify(name, "finished Minetest schematic probability selection") - elseif param == "get" then --get all nodes that had probabilities set on them - local text = "" - local problist = worldedit.prob_list[name] - if problist == nil then - return - end - for k,v in pairs(problist) do - local prob = math.floor(((v.prob / 256) * 100) * 100 + 0.5) / 100 - text = text .. minetest.pos_to_string(v.pos) .. ": " .. prob .. "% | " - end - worldedit.player_notify(name, "currently set node probabilities:") - worldedit.player_notify(name, text) - end - end, -}) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "prob_val_enter" and not (fields.text == "" or fields.text == nil) then - local name = player:get_player_name() - local prob_entry = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} - local index = table.getn(worldedit.prob_list[name]) + 1 - worldedit.prob_list[name][index] = prob_entry - end -end) - -worldedit.register_command("clearobjects", { - params = "", - description = "Clears all objects within the WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.clear_objects(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " objects cleared") - end, -}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt b/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt new file mode 100644 index 00000000..33433cb8 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt @@ -0,0 +1,153 @@ +# textdomain: worldedit_commands +Outset the selected region.= +Invalid direction: @1= +Invalid number of arguments= +Region outset by @1 nodes= +Inset the selected region.= +Region inset by @1 nodes= +Shifts the selection area without moving its contents= +Invalid if looking straight up or down= +Region shifted by @1 nodes= +Expands the selection in the selected absolute or relative axis= +Region expanded by @1 nodes= +Contracts the selection in the selected absolute or relative axis= +Region contracted by @1 nodes= +Select a cube with side length around position 1 and run on region= +invalid usage: @1 cannot be used with cubeapply= +Missing privileges: @1= +Region operations= +Can use WorldEdit commands= +no region selected= +no position 1 selected= +invalid usage= +ERROR: the operation was cancelled because the region has changed.= +Could not open file "@1"= +Invalid file format!= +Schematic was created with a newer version of WorldEdit.= +Get information about the WorldEdit mod= +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or find more information at @3= +Get help for WorldEdit commands= +alias to @1= +You are not allowed to use any WorldEdit commands.= +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.= +Available commands:@n= +Command not available: = +Enable or disable node inspection= +inspector: inspection enabled for @1, currently facing the @2 axis= +inspector: inspection disabled= +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis= +Reset the region so that it is empty= +region reset= +Show markers at the region positions= +region marked= +Hide markers if currently shown= +region unmarked= +Set WorldEdit region position @1 to the player's location= +position @1 set to @2= +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region= +unknown subcommand: @1= +select positions by punching two nodes= +select position @1 by punching a node= +position @1: @2= +position @1 not set= +Set a WorldEdit region position to the position at (, , )= +Display the volume of the current WorldEdit region= +current region has a volume of @1 nodes (@2*@3*@4)= +Remove all MapBlocks (16x16x16) containing the selected area from the map= +Node manipulation= +Area deleted.= +There was an error during deletion of the area.= +Set the current WorldEdit region to = +invalid node name: @1= +@1 nodes set= +Set param2 of all nodes in the current WorldEdit region to = +Param2 is out of range (must be between 0 and 255 inclusive!)= +@1 nodes altered= +Fill the current WorldEdit region with a random mix of , ...= +invalid search node name: @1= +invalid replace node name: @1= +Replace all instances of with in the current WorldEdit region= +@1 nodes replaced= +Replace all nodes other than with in the current WorldEdit region= +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .= +Shapes= +@1 nodes added= +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .= +Add hollow sphere centered at WorldEdit position 1 with radius , composed of = +Add sphere centered at WorldEdit position 1 with radius , composed of = +Add hollow dome centered at WorldEdit position 1 with radius , composed of = +Add dome centered at WorldEdit position 1 with radius , composed of = +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of = +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of = +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of = +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of = +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of = +Copy the current WorldEdit region along the given axis by nodes= +Transformations= +@1 nodes copied= +Move the current WorldEdit region along the given axis by nodes= +@1 nodes moved= +Stack the current WorldEdit region along the given axis times= +@1 nodes stacked= +Stack the current WorldEdit region times by offset , , = +invalid count: @1= +invalid increments: @1= +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin= +invalid scaling factors: @1= +@1 nodes stretched= +Transpose the current WorldEdit region along the given axes= +invalid usage: axes must be different= +@1 nodes transposed= +Flip the current WorldEdit region along the given axis= +@1 nodes flipped= +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)= +invalid usage: angle must be multiple of 90= +@1 nodes rotated= +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)= +@1 nodes oriented= +Fix the lighting in the current WorldEdit region= +@1 nodes updated= +Remove any fluid node within the current WorldEdit region= +Remove any plant, tree or foliage-like nodes in the selected region= +@1 nodes removed= +Hide all nodes in the current WorldEdit region non-destructively= +@1 nodes hidden= +Suppress all in the current WorldEdit region non-destructively= +@1 nodes suppressed= +Highlight in the current WorldEdit region by hiding everything else non-destructively= +@1 nodes highlighted= +Restores nodes hidden with WorldEdit in the current WorldEdit region= +@1 nodes restored= +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.= +Save the current WorldEdit region to "(world folder)/schems/.we"= +Schematics= +Disallowed file name: @1= +Could not save file to "@1"= +@1 nodes saved= +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region= +Schematic empty, nothing allocated= +@1 nodes allocated= +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin= +Loading failed!= +@1 nodes loaded= +Executes as a Lua chunk in the global namespace= +Code= +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region= +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"= +Failed to create Minetest schematic= +Saved Minetest schematic to @1= +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin= +failed to place Minetest schematic= +placed Minetest schematic @1 at @2= +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry= +select Minetest schematic probability values by punching nodes= +finished Minetest schematic probability selection= +currently set node probabilities:= +invalid node probability given, not saved= +Clears all objects within the WorldEdit region= +@1 objects cleared= +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel= +Confirm a pending operation= +no operation pending= +Abort a pending operation= +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd= diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr new file mode 100644 index 00000000..61ffb90c --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr @@ -0,0 +1,164 @@ +# textdomain: worldedit_commands +## +# Übersetzungshinweise: +# node = Block +# command = Befehl +# region = Gebiet +# position 1/2 = Position 1/2 +# schematic = Schematic +# Der Anwender wird gesiezt. +# Diese Datei auf Rechtschreibfehler prüfen (unter Linux): +# sed -rne 's|^.*[^@]=(.*)$|\1|gp' worldedit_commands/locale/worldedit_commands.de.tr | sed -re 's/\b(WorldEdit|Schematic|Minetest)\b/Beispiel/g' | LANG=de_DE.UTF-8 hunspell -L +## +Outset the selected region.=Ausgewähltes Gebiet vergrößern. +Invalid direction: @1=Ungültige Richtung: @1 +Invalid number of arguments=Ungültige Anzahl der Argumente +Region outset by @1 nodes=Gebiet um @1 Blöcke vergrößert +Inset the selected region.=Ausgewähltes Gebiet verkleinern. +Region inset by @1 nodes=Gebiet um @1 Blöcke verkleinert +Shifts the selection area without moving its contents=Verschiebt das ausgewählte Gebiet ohne dessen Inhalt +Invalid if looking straight up or down=Nicht zulässig bei gerader Blickrichtung nach unten oder oben +Region shifted by @1 nodes=Gebiet um @1 Blöcke verschoben +Expands the selection in the selected absolute or relative axis=Erweitert das Gebiet in Richtung einer absoluten oder relativen Achse +Region expanded by @1 nodes=Gebiet um @1 Blöcke erweitert +Contracts the selection in the selected absolute or relative axis=Schrumpft das Gebiet in Richtung einer absoluten oder relativen Achse +Region contracted by @1 nodes=Gebiet um @1 Blöcke geschrumpft +Select a cube with side length around position 1 and run on region=Einen Würfel mit Seitenlänge um Position 1 auswählen und auf diesem Gebiet ausführen +invalid usage: @1 cannot be used with cubeapply=Ungültige Verwendung: @1 kann nicht mit cubeapply verwendet werden +Missing privileges: @1=Fehlende Privilegien: @1 +Region operations=Gebietsoperationen +Can use WorldEdit commands=Kann WorldEdit-Befehle benutzen +no region selected=Kein Gebiet ausgewählt +no position 1 selected=Keine Position 1 ausgewählt +invalid usage=Ungültige Verwendung +ERROR: the operation was cancelled because the region has changed.=FEHLER: Der Vorgang wurde abgebrochen, weil das Gebiet verändert wurde. +Could not open file "@1"=Konnte die Datei „@1“ nicht öffnen +Invalid file format!=Ungültiges Dateiformat! +Schematic was created with a newer version of WorldEdit.=Schematic wurde mit einer neueren Version von WorldEdit erstellt. +Get information about the WorldEdit mod=Informationen über die WorldEdit-Mod erhalten +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or find more information at @3=WorldEdit @1 ist auf diesem Server verfügbar. Nutzen Sie @2, um eine Liste der Befehle zu erhalten, oder finden Sie weitere Informationen unter @3 +Get help for WorldEdit commands=Hilfe für WorldEdit-Befehle erhalten +alias to @1=Alias für @1 +You are not allowed to use any WorldEdit commands.=Ihnen ist nicht erlaubt, WorldEdit-Befehle zu nutzen. +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.=Verfügbare Befehle: @1@n„@2“ benutzen, um mehr Informationen zu erhalten, oder „@3“, um alles aufzulisten. +Available commands:@n=Verfügbare Befehle:@n +Command not available: =Befehl nicht verfügbar: +Enable or disable node inspection=Inspizieren von Blöcken ein- oder ausschalten +inspector: inspection enabled for @1, currently facing the @2 axis=Inspektur: für @1 aktiviert, aktuell der @2-Achse zugewandt +inspector: inspection disabled=Inspektur: deaktiviert +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis=Inspektur: @1 bei @2 (param1@=@3, param2@=@4, einfallendes Licht@=@5), der „@6“-Achse zugewandt, gehauen +Reset the region so that it is empty=Gebiet zurücksetzen, sodass es leer ist +region reset=Gebiet zurückgesetzt +Show markers at the region positions=Markierungen bei den Gebietspositionen anzeigen +region marked=Gebiet markiert +Hide markers if currently shown=Markierungen verstecken, falls derzeit sichtbar +region unmarked=Gebiet nicht mehr markiert +Set WorldEdit region position @1 to the player's location=Position @1 des WorldEdit-Gebiets auf die Position des Spielers setzen +position @1 set to @2=Position @1 auf @2 gesetzt +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region=WorldEdit-Gebiet, WorldEdit-Position 1 oder WorldEdit-Position 2 durch Schlagen von Blöcken setzen oder aktuelles WorldEdit-Gebiet anzeigen +unknown subcommand: @1=Unbekannter Unterbefehl: @1 +select positions by punching two nodes=Wählen Sie die Position durch Hauen zweier Blöcke +select position @1 by punching a node=Wählen Sie Position @1 durch Hauen eines Blocks +position @1: @2=Position @1: @2 +position @1 not set=Position @1 ist nicht gesetzt +Set a WorldEdit region position to the position at (, , )=Eine Position des WorldEdit-Gebiets auf (, , ) setzen +Display the volume of the current WorldEdit region=Volumen des aktuellen WorldEdit-Gebiets anzeigen +current region has a volume of @1 nodes (@2*@3*@4)=Das aktuelle Gebiet hat ein Volumen von @1 Blöcken (@2×@3×@4) +Remove all MapBlocks (16x16x16) containing the selected area from the map=Alle Kartenblöcke (16×16×16) entfernen, die das gewählte Gebiet enthalten +Node manipulation=Block-Manipulation +Area deleted.=Gebiet gelöscht. +There was an error during deletion of the area.=Während des Löschens des Gebiets trat ein Fehler auf. +Set the current WorldEdit region to =Das aktuelle WorldEdit-Gebiet mit füllen +invalid node name: @1=Ungültiger Blockname: @1 +@1 nodes set=@1 Blöcke gesetzt +Set param2 of all nodes in the current WorldEdit region to =Den param2 aller Blocke im aktuellen WorldEdit-Gebiet auf setzen +Param2 is out of range (must be between 0 and 255 inclusive!)=Param2 muss zwischen 0 und 255 (inklusiv) sein +@1 nodes altered=@1 Blöcke verändert +Fill the current WorldEdit region with a random mix of , ...=Das aktuelle WorldEdit-Gebiet mit einer zufälligen Mischung aus , … füllen +invalid search node name: @1=Ungültiger Blockname für die Suche: @1 +invalid replace node name: @1=Ungültiger Blockname für das Ersetzen: @1 +Replace all instances of with in the current WorldEdit region=Alle Vorkommen von im aktuellen WorldEdit-Gebiet mit ersetzen +@1 nodes replaced=@1 Blöcke ersetzt +Replace all nodes other than with in the current WorldEdit region=Alle Blöcke außer im aktuellen WorldEdit-Gebiet mit ersetzen +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Einen hohlen Würfel mit der Unterseite zentriert auf WorldEdit-Position 1 setzen, mit den Abmessungen ××, bestehend aus . +Shapes=Formen +@1 nodes added=@1 Blöcke hinzugefügt +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Einen Würfel mit der Unterseite zentriert auf WorldEdit-Position 1 setzen, mit den Abmessungen ××, bestehend aus . +Add hollow sphere centered at WorldEdit position 1 with radius , composed of =Eine hohle Kugel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add sphere centered at WorldEdit position 1 with radius , composed of =Eine Kugel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add hollow dome centered at WorldEdit position 1 with radius , composed of =Eine hohle Kuppel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add dome centered at WorldEdit position 1 with radius , composed of =Eine Kuppel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Einen hohlen Zylinder zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge , Bodenradius (und oberen Radius [radius2]) setzen, bestehend aus +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Einen Zylinder zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge , Bodenradius (und oberen Radius [radius2]) setzen, bestehend aus +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Eine hohle Pyramide zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge setzen, bestehend aus +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Eine Pyramide zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge setzen, bestehend aus +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of =Eine Spirale zentriert auf WorldEdit-Position 1 mit Seitenlänge , Höhe , Wandabstand setzen, bestehend aus +Copy the current WorldEdit region along the given axis by nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um Blöcke kopieren +Transformations=Transformationen +@1 nodes copied=@1 Blöcke kopiert +Move the current WorldEdit region along the given axis by nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um Blöcke verschieben +@1 nodes moved=@1 Blöcke verschoben +Stack the current WorldEdit region along the given axis times=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse mal stapeln +@1 nodes stacked=@1 Blöcke gestapelt +Stack the current WorldEdit region times by offset , , =Das aktuelle WorldEdit-Gebiet mal um , , versetzt stapeln +invalid count: @1=Ungültige Anzahl: @1 +invalid increments: @1=Ungültige Schrittweite: @1 +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin=Die aktuellen WorldEdit-Positionen und -Region um einen Faktor von , , entlang der X-, Y- und Z-Achsen skalieren, mit Position 1 als Ausgangspunkt +invalid scaling factors: @1=Ungültige Skalierungsfaktoren: @1 +@1 nodes stretched=@1 Blöcke gestreckt +Transpose the current WorldEdit region along the given axes=Das aktuelle WorldEdit-Gebiet entlang den gegebenen Achsen transponieren +invalid usage: axes must be different=Ungültige Verwendung: Achsen müssen verschieden sein +@1 nodes transposed=@1 Blöcke transponiert +Flip the current WorldEdit region along the given axis=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse spiegeln +@1 nodes flipped=@1 Blöcke gespiegelt +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)=Das aktuelle WorldEdit-Gebiet um der gegebenen Achse um den Winkel rotieren (90-Grad-Schritte) +invalid usage: angle must be multiple of 90=Ungültige Verwendung: Winkel muss ein Vielfaches von 90 sein +@1 nodes rotated=@1 Blöcke rotiert +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)=Ausgerichtete Blöcke im aktuellen WorldEdit-Gebiet um die Y-Achse mit dem Winkel rotieren (90-Grad-Schritte) +@1 nodes oriented=@1 Blöcke ausgerichtet +Fix the lighting in the current WorldEdit region=Belichtung im aktuellen WorldEdit-Gebiet korrigieren +@1 nodes updated=@1 Blöcke verändert +Remove any fluid node within the current WorldEdit region=Alle flüssigen Blöcke im WorldEdit-Gebiet entfernen +Remove any plant, tree or foliage-like nodes in the selected region=Alle pflanzen-, baum- oder laubähnliche Blöcke im WorldEdit-Gebiet entfernen +@1 nodes removed=@1 Blöcke entfernt +Hide all nodes in the current WorldEdit region non-destructively=Alle Blöcke im WorldEdit-Gebiet nicht-destruktiv verstecken +@1 nodes hidden=@1 Blöcke versteckt +Suppress all in the current WorldEdit region non-destructively=Alle Blöcke vom Typ in der aktuellen WorldEdit-Region nicht-destruktiv verstecken +@1 nodes suppressed=@1 Blöcke versteckt +Highlight in the current WorldEdit region by hiding everything else non-destructively=Alle Blöcke vom Typ im WorldEdit-Gebiet hervorheben, indem alle anderen nicht-destruktiv versteckt werden +@1 nodes highlighted=@1 Blöcke hervorgehoben +Restores nodes hidden with WorldEdit in the current WorldEdit region=Stellt die von WorldEdit versteckten Blöcke im aktuellen WorldEdit-Gebiet wieder her +@1 nodes restored=@1 Blöcke wiederhergestellt +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Warnung: Das Schematic hat überschüssigen freien Platz und WIRD nach dem Laden falsch ausgerichtet sein. Um dies zu vermeiden, verkleinern Sie das Gebiet, sodass es die zu speichernden Blöcke exakt umfasst. +Save the current WorldEdit region to "(world folder)/schems/.we"=Das aktuelle WorldEdit-Gebiet in „(Weltordner)/schems/.we“ speichern +Schematics=Schematic +Disallowed file name: @1=Nicht erlaubter Dateiname: @1 +Could not save file to "@1"=Konnte die Datei nicht unter „@1“ speichern +@1 nodes saved=@1 Blöcke gespeichert +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region=Das aktuelle WorldEdit-Gebiet anhand der Blöcke in „(Weltordner)/schems/.we“ setzen +Schematic empty, nothing allocated=Schematic leer, nichts reserviert +@1 nodes allocated=@1 Blöcke reserviert +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin=Blöcke aus „(Weltordner)/schems/[.we[m]]“ mit Position 1 als Ausgangspunkt laden +Loading failed!=Laden fehlgeschlagen! +@1 nodes loaded=@1 Blöcke geladen +Executes as a Lua chunk in the global namespace= als einen Lua-Chunk im globalen Namensraum ausführen +Code=Code +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=Führt als einen Lua-Chunk im globalen Namensraum aus, wobei die Variable pos verfügbar ist, für jeden Block im aktuellen WorldEdit-Gebiet +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"=Das aktuelle WorldEdit-Gebiet als Minetest-Schematic in „(Weltordner)/schems/.mts“ speichern +Failed to create Minetest schematic=Konnte Minetest-Schematic nicht erstellen +Saved Minetest schematic to @1=Minetest-Schematic in @1 gespeichert +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin=Blöcke aus „(Weltordner)/schems/.mts“ mit Position 1 des aktuellen WorldEdit-Gebiets als Ausgangspunkt laden +failed to place Minetest schematic=Konnte Minetest-Schematic nicht platzieren +placed Minetest schematic @1 at @2=Minetest-Schematic @1 bei @2 platziert +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry=Startet die Eingabe von Block-Wahrscheinlichkeiten für Minetest-Schematics, holt die Blöcke, welche Wahrscheinlichkeiten gesetzt haben, oder beendet die Eingabe von Block-Wahrscheinlichkeiten +select Minetest schematic probability values by punching nodes=Minetest-Schematic-Wahrscheinlichkeitswerte mit Hauen eingeben +finished Minetest schematic probability selection=Minetest-Schematic-Wahrscheinlichkeitsauswahl abgeschlossen +currently set node probabilities:=Momentan gesetzte Block-Wahrscheinlichkeiten: +invalid node probability given, not saved=Ungültige Block-Wahrscheinlichkeit übergeben, nicht gespeichert +Clears all objects within the WorldEdit region=Löscht alle Objekte innerhalb des WorldEdit-Gebiets +@1 objects cleared=@1 Objekte gelöscht +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel=WARNUNG: Dieser Vorgang könnte bis zu @1 Blöcke betreffen; @2 zum Fortfahren oder @3 zum Abbrechen +Confirm a pending operation=Einen ausstehenden Vorgang bestätigen +no operation pending=Kein Vorgang ausstehend +Abort a pending operation=Einen ausstehenden Vorgang abbrechen +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd=WorldEdit-Zauberstab@nSetzen der 1. Position mit Linksklick, der 2. mit Rechtsklick diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr new file mode 100644 index 00000000..af242689 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr @@ -0,0 +1,155 @@ +# textdomain: worldedit_commands + +### init.lua ### +Can use WorldEdit commands=Возможность редактировать мир с помощью команд WorldEdit + +no region selected=не выделен регион +no position 1 selected=не установлена позиция региона 1 +invalid usage=не верное использование команды +Could not open file "@1"=Не удаётся открыть файл "@1" +Invalid file format!=Не верный формат файла! +Schematic was created with a newer version of WorldEdit.=Схема была создана с использованием более новой версии WorldEdit. + +Get information about the WorldEdit mod=Вывести информацию о WorldEdit +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or get more information at @3=WorldEdit @1 доступен на этом сервере. Наберите команду @2 чтобы увидеть список команд, больше информации по ссылке @3 +Get help for WorldEdit commands=Вывести информацию об использовании команд WorldEdit +You are not allowed to use any WorldEdit commands.=У вас нет привилегий, чтобы использовать команды WorldEdit. +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.=Доступные команды: @1@nИспользуйте '@2' для получения информации по команде или '@3' для вывода подсказок по всем командам. +Available commands:@n=Доступные команды:@n +Command not available: =Команда не найдена: +Enable or disable node inspection=Включить/отключить инспекцию блоков +inspector: inspection enabled for @1, currently facing the @2 axis=inspector: инспекция включена для @1, текущий взор в направлении оси @2 +inspector: inspection disabled=inspector: инспекция отключена +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis=inspector: @1 в @2 (param1@=@3, param2@=@4, received light@=@5) ударен по поверхности @6 +Reset the region so that it is empty=Сбросить выделение области +region reset=регион сброшен +Show markers at the region positions=Отобразить маркеры выделенной области +region marked=маркеры отображены +Hide markers if currently shown=Скрыть маркеры выделенной области +region unmarked=маркеры скрыты +Set WorldEdit region position @1 to the player's location=Установить маркер @1 для WorldEdit-региона в месте нахождения игрока +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region=Выделить WorldEdit-регион или установить маркеры для WorldEdit-региона, либо отобразить уже выбранную область +unknown subcommand: @1=неизвестная подкоманда: @1 +select positions by punching two nodes=выберите позиции, ударив по блокам +select position @1 by punching a node=выберите позицию @1, ударив по блоку +position @1: @2=позиция @1: @2 +position @1 not set=позиция @1 не установлена +Set a WorldEdit region position to the position at (, , )=Установить маркер для WorldEdit в позиции (, , ) +position @1 set to @2=позиция @1 установлена в @2 +Display the volume of the current WorldEdit region=Вывести информацию об объёме текущей выделенной области WorldEdit (кол-во нод, размеры) +current region has a volume of @1 nodes (@2*@3*@4)=текущий регион имеет объем @1 нод (@2*@3*@4) +Remove all MapBlocks (16x16x16) containing the selected area from the map=Удалить MapBlocks (16x16x16), содержащие выбранную область +Area deleted.=Область удалена. +There was an error during deletion of the area.=Что-то пошло не так при удалении области. +Set the current WorldEdit region to =Заполнить выбранный WorldEdit-регион указанным типом блоков +invalid node name: @1=неверное название блока: @1 +@1 nodes set=@1 блок(а/ов) установленно +Set param2 of all nodes in the current WorldEdit region to =Проставить param2 для всех блоков в текущем WorldEdit-регионе +Param2 is out of range (must be between 0 and 255 inclusive!)=Значение param2 должно быть от 0 до 255 (включительно!) +@1 nodes altered=изменено @1 блок(а/ов) +Fill the current WorldEdit region with a random mix of , ...=Заполнить выбранный WorldEdit-регион смесью указанных типов блоков +invalid search node name: @1=неверное название блока-поиска: @1 +invalid replace node name: @1=неверное название блока-замены: @1 +Replace all instances of with in the current WorldEdit region=Заменить все блоки на в выбранной WorldEdit-области +@1 nodes replaced=заменено @1 нод(а/ы) +Replace all nodes other than with in the current WorldEdit region=Заменить все блоки, кроме , на в выбранной WorldEdit-области +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Установить полый куб с центром нижней грани в позиции 1 и указанными размерами, состоящий из блоков . +@1 nodes added=добавлен(о) @1 блок(а/ов) +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Установить куб с центром нижней грани в позиции 1 и указанными размерами, состоящий из блоков . +Add hollow sphere centered at WorldEdit position 1 with radius , composed of =Установить полую сферу с центром в WorldEdit-позиции 1 радиусом , состоящую из блоков +Add sphere centered at WorldEdit position 1 with radius , composed of =Установить сферу с центром в WorldEdit-позиции 1 радиусом , состоящую из блоков +Add hollow dome centered at WorldEdit position 1 with radius , composed of =Установить полый купол с центром в WorldEdit-позиции 1 радиусом , состоящий из блоков +Add dome centered at WorldEdit position 1 with radius , composed of =Установить купол с центром в WorldEdit-позиции 1 радиусом , состоящий из блоков +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Установить полый цилиндр вдоль указанной оси, с центром в позиции 1, высотой/длинной , с радиусом основания (и радиусом вершины [radius 2]), состоящий из блоков +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Установить цилиндр вдоль указанной оси, с центром в позиции 1, высотой/длинной , с радиусом основания (и радиусом вершины [radius 2]), состоящий из блоков +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Установить полую пирамиду вдоль указанной оси, с центром в WorldEdit-позиции 1 высотой , состоящую из блоков +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Установить пирамиду вдоль указанной оси, с центром в WorldEdit-позиции 1 высотой , состоящую из блоков +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of =Установить спираль с центром в WorldEdit-позиции 1 шириной , высотой и с расстоянием между витками , состоящую из блоков +Copy the current WorldEdit region along the given axis by nodes=Копировать текущий WorldEdit-регион со смещением вдоль указанной оси (x/y/z) на блоков +@1 nodes copied=скопировано @1 нод(а/ы) +Move the current WorldEdit region along the given axis by nodes=Переместить текущий WorldEdit-регион вдоль указанной оси (x/y/z) на блоков +@1 nodes moved=перемещено @1 нод(а/ы) +Stack the current WorldEdit region along the given axis times=Размножить текущий WorldEdit-регион вдоль указанной оси раз +@1 nodes stacked=размножено @1 нод(а/ы) +Stack the current WorldEdit region times by offset , , =Размножить текущий WorldEdit-регион раз с шагом , , по соответствующим осям +invalid count: @1=неверное количество: @1 +invalid increments: @1=неверные приращения(шаг) +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin=Масштабировать текущий WorldEdit-регион с коэффициентами , , вдоль осей X, Y и Z, используя WorldEdit-позицию 1 в качестве точки отсчёта +invalid scaling factors: @1=неверные коэффициенты масштабирования: @1 +@1 nodes stretched=масштабировано @1 нод(а/ы) +Transpose the current WorldEdit region along the given axes=Транспонировать текущий WorldEdit-регион по заданным осям. +invalid usage: axes must be different=недопустимое использование: оси должны быть разными +@1 nodes transposed=транспонировано @1 нод(а/ы) +Flip the current WorldEdit region along the given axis=Перевернуть/Отразить текущий WorldEdit-регион вдоль указанной оси +@1 nodes flipped=отражено @1 нод(а/ы) +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)=Повернуть текущий WorldEdit-регион вокруг оси на угол (шаг - 90 градусов) +invalid usage: angle must be multiple of 90=недопустимое использование: угол должен быть кратен 90 +@1 nodes rotated=повёрнуто @1 нод(а/ы) +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)=Повернуть блоки в текущем WorldEdit-регионе вокруг оси Y на угол (шаг - 90 градусов) +@1 nodes oriented=повёрнуто @1 нод(а/ы) +Fix the lighting in the current WorldEdit region=Исправить освещение в текущем WorldEdit-регионе +@1 nodes updated=обновлено @1 нод(а/ы) +Remove any fluid node within the current WorldEdit region=Удалить любые жидкости в текущем WorldEdit-регионе +Remove any plant, tree or foliage-like nodes in the selected region=Удалить любые растения, деревья или листье-подобные ноды в текущем WorldEdit-регионе +@1 nodes removed=удалено @1 нод(а/ы) +Hide all nodes in the current WorldEdit region non-destructively=Скрыть узлы текущего WorldEdit-региона, не удаляя их +@1 nodes hidden=скрыто @1 нод(а/ы) +Suppress all in the current WorldEdit region non-destructively=Скрыть все блоки в текущем WorldEdit-регионе, не удаляя их +@1 nodes suppressed=скрыто @1 нод(а/ы) +Highlight in the current WorldEdit region by hiding everything else non-destructively=Скрыть все блоки, кроме , в текущем WorldEdit-регионе, не удаляя их +@1 nodes highlighted="подсвечено" @1 нод(а/ы) +Restores nodes hidden with WorldEdit in the current WorldEdit region=Восстановить скрытые WorldEdit'ом узлы в текущем WorldEdit-регионе +@1 nodes restored=восстановлено @1 нод(а/ы) +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Предупреждение: Схема содержит слишком много свободного места и будет смещена при размещении или загрузке. Чтобы избежать этого, уменьшите область так, чтобы она охватывала именно те узлы, которые необходимо сохранить. +Save the current WorldEdit region to "(world folder)/schems/.we"=Сохранить текущий WorldEdit-регион в файл "(world folder)/schems/.we" +Disallowed file name: @1=Недопустимое имя файла: @1 +Could not save file to "@1"=Не удалось сохранить файл в "@1" +@1 nodes saved=сохранено @1 нод(а/ы) +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region=Выделить область, определённую узлами из "(world folder)/schems/.we", как текущий WorldEdit-регион +Schematic empty, nothing allocated=Схема пуста, ничего не выделено +@1 nodes allocated=выделено @1 нод(а/ы) +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin=Загрузить регион из "(world folder)/schems/[.we[m]]" с WorldEdit-позицией 1 в качестве точки отсчёта +Loading failed!=Не удалось загрузить! +@1 nodes loaded=загружено @1 нод(а/ы) +Executes as a Lua chunk in the global namespace=Выполнить как Lua-код в глобальном пространстве имён +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=Выполнить как Lua-код в глобальном пространстве имён, с доступом к переменным позиций для каждого блока в текущем WordEdit-регионе +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"=Сохранить текущий WorldEdit-регион с использованием сжатия в формат Minetest Schematic в файл "(world folder)/schems/.mts" +Failed to create Minetest schematic=Не удалось создать Minetest-схему +Saved Minetest schematic to @1=Minetest-схема сохранена в @1 +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin=Загрузить блоки из "(world folder)/schems/.mts" с WorldEdit-позицией 1 в качестве точки отсчёта +failed to place Minetest schematic=не удалось загрузить Minetest-схему +placed Minetest schematic @1 at @2=Minetest-схема @1 загружена в @2 +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry=Начать запись вероятностей для Minetest Schematic, ударяя по блокам, закончить запись вероятностей или вывести уже записанные вероятности +select Minetest schematic probability values by punching nodes=выберите значения вероятностей для Minetest-схемы, ударя по нодам +finished Minetest schematic probability selection=выбор вероятностей для Minetest-схемы завершен +currently set node probabilities:=заданные вероятности нод на данный момент: +invalid node probability given, not saved=недопустимая вероятность ноды, не сохранена +Clears all objects within the WorldEdit region=Очистить все объекты в текущем WorldEdit-регионе +@1 objects cleared=очищено @1 объектов + +### safe.lua ### +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel=ПРЕДУПРЕЖДЕНИЕ: эта операция может затронуть до @1 нод; введите @2 для продолжения или @3 для отмены +Confirm a pending operation=Подтвердить отложенную операцию +no operation pending=нет ожидающей операции +Abort a pending operation=Отклонить отложенную операцию + +### cuboid.lua ### +Outset the selected region.=Расширить выделение региона. +Invalid direction: @1=Недопустимое направление: @1 +Invalid number of arguments=Недопустимое количество аргументов +Region outset by @1 nodes=Регион расширен на @1 нод(у/ы) +Inset the selected region.=Сузить выделение региона. +Region inset by @1 nodes=Регион сужен на @1 нод(у/ы) +Shifts the selection area without moving its contents=Сдвинуть выделение региона без перемещения его содержимого +Invalid if looking straight up or down=Недопустимо, если смотреть прямо вверх или вниз +Region shifted by @1 nodes=Регион сдвинут на @1 нод(у/ы) +Expands the selection in the selected absolute or relative axis=Увеличить выделение региона по выбранной абсолютной или относительной оси +Region expanded by @1 nodes=Регион увеличен на @1 нод(у/ы) +Contracts the selection in the selected absolute or relative axis=Уменьшить выделение региона по выбранной абсолютной или относительной оси +Region contracted by @1 nodes=Регион уменьшен на @1 нод(у/ы) +Select a cube with side length around position 1 and run on region=Выделить куб с длиной стороны вокруг позиции 1 и запустите <команду> в области +invalid usage: @1 cannot be used with cubeapply=недопустимое использование: @1 не может быть применено в cubeapply +Missing privileges: @1=Отсутствуют привилегии: @1 + +### wand.lua ### +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd=Инструмент WorldEdit Wand@nЛевая кнопка мыши, чтобы установить 1-ю позицию, правая кнопка мыши, чтобы установить 2-ю diff --git a/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua b/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua new file mode 100644 index 00000000..2a6d36b0 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua @@ -0,0 +1,366 @@ +local S = minetest.get_translator("worldedit_commands") + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + + +worldedit.register_command("deleteblocks", { + params = "", + description = S("Remove all MapBlocks (16x16x16) containing the selected area from the map"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local success = minetest.delete_area(pos1, pos2) + if success then + return true, S("Area deleted.") + else + return false, S("There was an error during deletion of the area.") + end + end, +}) + +worldedit.register_command("clearobjects", { + params = "", + description = S("Clears all objects within the WorldEdit region"), + category = S("Node manipulation"), -- not really, but it doesn't fit anywhere else + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.clear_objects(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 objects cleared", count) + end, +}) + +worldedit.register_command("set", { + params = "", + description = S("Set the current WorldEdit region to "), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.set(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes set", count) + end, +}) + +worldedit.register_command("param2", { + params = "", + description = S("Set param2 of all nodes in the current WorldEdit region to "), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local param2 = tonumber(param) + if not param2 then + return false + elseif param2 < 0 or param2 > 255 then + return false, S("Param2 is out of range (must be between 0 and 255 inclusive!)") + end + return true, param2 + end, + nodes_needed = check_region, + func = function(name, param2) + local count = worldedit.set_param2(worldedit.pos1[name], worldedit.pos2[name], param2) + return true, S("@1 nodes altered", count) + end, +}) + +worldedit.register_command("mix", { + params = " [count1] [count2] ...", + description = S("Fill the current WorldEdit region with a random mix of , ..."), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local nodes = {} + for nodename in param:gmatch("[^%s]+") do + if tonumber(nodename) ~= nil and #nodes > 0 then + local last_node = nodes[#nodes] + for i = 1, tonumber(nodename) do + nodes[#nodes + 1] = last_node + end + else + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + nodes[#nodes + 1] = node + end + end + if #nodes == 0 then + return false + end + return true, nodes + end, + nodes_needed = check_region, + func = function(name, nodes) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.set(pos1, pos2, nodes) + return true, S("@1 nodes set", count) + end, +}) + +local check_replace = function(param) + local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$") + if found == nil then + return false + end + local newsearchnode = worldedit.normalize_nodename(searchnode) + if not newsearchnode then + return false, S("invalid search node name: @1", searchnode) + end + local newreplacenode = worldedit.normalize_nodename(replacenode) + if not newreplacenode then + return false, S("invalid replace node name: @1", replacenode) + end + return true, newsearchnode, newreplacenode +end + +worldedit.register_command("replace", { + params = " ", + description = S("Replace all instances of with in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = check_replace, + nodes_needed = check_region, + func = function(name, search_node, replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + search_node, replace_node) + return true, S("@1 nodes replaced", count) + end, +}) + +worldedit.register_command("replaceinverse", { + params = " ", + description = S("Replace all nodes other than with in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = check_replace, + nodes_needed = check_region, + func = function(name, search_node, replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + search_node, replace_node, true) + return true, S("@1 nodes replaced", count) + end, +}) + +worldedit.register_command("fixlight", { + params = "", + description = S("Fix the lighting in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.fixlight(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes updated", count) + end, +}) + +local drain_cache + +local function drain(pos1, pos2) + if drain_cache == nil then + drain_cache = {} + for name, d in pairs(minetest.registered_nodes) do + if d.drawtype == "liquid" or d.drawtype == "flowingliquid" then + drain_cache[name] = true + end + end + end + + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local count = 0 + + local get_node, remove_node = minetest.get_node, minetest.remove_node + for x = pos1.x, pos2.x do + for y = pos1.y, pos2.y do + for z = pos1.z, pos2.z do + local p = vector.new(x, y, z) + local n = get_node(p).name + if drain_cache[n] then + remove_node(p) + count = count + 1 + end + end + end + end + return count +end + +worldedit.register_command("drain", { + params = "", + description = S("Remove any fluid node within the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = drain(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes updated", count) + end, +}) + +local clearcut_cache + +local function clearcut(pos1, pos2) + -- decide which nodes we consider plants + if clearcut_cache == nil then + clearcut_cache = {} + for name, def in pairs(minetest.registered_nodes) do + local groups = def.groups or {} + if ( + -- the groups say so + groups.flower or groups.grass or groups.flora or groups.plant or + groups.leaves or groups.tree or groups.leafdecay or groups.sapling or + -- drawtype heuristic + (def.is_ground_content and def.buildable_to and + (def.sunlight_propagates or not def.walkable) + and def.drawtype == "plantlike") or + -- if it's flammable, it probably needs to go too + (def.is_ground_content and not def.walkable and groups.flammable) + ) then + clearcut_cache[name] = true + end + end + end + local plants = clearcut_cache + + local count = 0 + local prev, any + + local get_node, remove_node = minetest.get_node, minetest.remove_node + for x = pos1.x, pos2.x do + for z = pos1.z, pos2.z do + prev = false + any = false + -- first pass: remove floating nodes that would be left over + for y = pos1.y, pos2.y do + local pos = vector.new(x, y, z) + local n = get_node(pos).name + if plants[n] then + prev = true + any = true + elseif prev then + local def = minetest.registered_nodes[n] or {} + local groups = def.groups or {} + if groups.attached_node or (def.buildable_to and groups.falling_node) then + remove_node(pos) + count = count + 1 + else + prev = false + end + end + end + + -- second pass: remove plants, top-to-bottom to avoid item drops + if any then + for y = pos2.y, pos1.y, -1 do + local pos = vector.new(x, y, z) + local n = get_node(pos).name + if plants[n] then + remove_node(pos) + count = count + 1 + end + end + end + end + end + + return count +end + +worldedit.register_command("clearcut", { + params = "", + description = S("Remove any plant, tree or foliage-like nodes in the selected region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) + local count = clearcut(pos1, pos2) + return true, S("@1 nodes removed", count) + end, +}) + +worldedit.register_command("hide", { + params = "", + description = S("Hide all nodes in the current WorldEdit region non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.hide(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes hidden", count) + end, +}) + +worldedit.register_command("suppress", { + params = "", + description = S("Suppress all in the current WorldEdit region non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.suppress(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes suppressed", count) + end, +}) + +worldedit.register_command("highlight", { + params = "", + description = S("Highlight in the current WorldEdit region by hiding everything else non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.highlight(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes highlighted", count) + end, +}) + +worldedit.register_command("restore", { + params = "", + description = S("Restores nodes hidden with WorldEdit in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.restore(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes restored", count) + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/mark.lua b/mods/Minetest-WorldEdit/worldedit_commands/marker.lua similarity index 87% rename from mods/Minetest-WorldEdit/worldedit_commands/mark.lua rename to mods/Minetest-WorldEdit/worldedit_commands/marker.lua index a195280b..640f3730 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/mark.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/marker.lua @@ -6,16 +6,14 @@ local init_sentinel = "new" .. tostring(math.random(99999)) --marks worldedit region position 1 worldedit.mark_pos1 = function(name, region_too) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local pos1 = worldedit.pos1[name] if worldedit.marker1[name] ~= nil then --marker already exists worldedit.marker1[name]:remove() --remove marker worldedit.marker1[name] = nil end if pos1 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos1) + worldedit.keep_loaded(pos1, pos1) --add marker worldedit.marker1[name] = minetest.add_entity(pos1, "worldedit:pos1", init_sentinel) @@ -30,16 +28,14 @@ end --marks worldedit region position 2 worldedit.mark_pos2 = function(name, region_too) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local pos2 = worldedit.pos2[name] if worldedit.marker2[name] ~= nil then --marker already exists worldedit.marker2[name]:remove() --remove marker worldedit.marker2[name] = nil end if pos2 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos2, pos2) + worldedit.keep_loaded(pos2, pos2) --add marker worldedit.marker2[name] = minetest.add_entity(pos2, "worldedit:pos2", init_sentinel) @@ -77,15 +73,14 @@ worldedit.mark_region = function(name) local thickness = 0.2 local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos2) + -- TODO maybe we could skip this actually? + worldedit.keep_loaded(pos1, pos2) local markers = {} --XY plane markers for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do - local entpos = {x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z} + local entpos = vector.new(pos1.x + sizex - 0.5, pos1.y + sizey - 0.5, z) local marker = minetest.add_entity(entpos, "worldedit:region_cube", init_sentinel) if marker ~= nil then marker:set_properties({ @@ -99,7 +94,7 @@ worldedit.mark_region = function(name) --YZ plane markers for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do - local entpos = {x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5} + local entpos = vector.new(x, pos1.y + sizey - 0.5, pos1.z + sizez - 0.5) local marker = minetest.add_entity(entpos, "worldedit:region_cube", init_sentinel) if marker ~= nil then marker:set_properties({ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua b/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua new file mode 100644 index 00000000..ebf80e03 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua @@ -0,0 +1,85 @@ +-- Strips any kind of escape codes (translation, colors) from a string +-- https://github.com/minetest/minetest/blob/53dd7819277c53954d1298dfffa5287c306db8d0/src/util/string.cpp#L777 +local function strip_escapes(input) + local s = function(idx) return input:sub(idx, idx) end + local out = "" + local i = 1 + while i <= #input do + if s(i) == "\027" then -- escape sequence + i = i + 1 + if s(i) == "(" then -- enclosed + i = i + 1 + while i <= #input and s(i) ~= ")" do + if s(i) == "\\" then + i = i + 2 + else + i = i + 1 + end + end + end + else + out = out .. s(i) + end + i = i + 1 + end + --print(("%q -> %q"):format(input, out)) + return out +end + +local function string_endswith(full, part) + return full:find(part, 1, true) == #full - #part + 1 +end + +local description_cache = nil + +-- normalizes node "description" `nodename`, returning a string (or nil) +worldedit.normalize_nodename = function(nodename) + nodename = nodename:gsub("^%s*(.-)%s*$", "%1") -- strip spaces + if nodename == "" then return nil end + + local fullname = ItemStack({name=nodename}):get_name() -- resolve aliases + if minetest.registered_nodes[fullname] or fullname == "air" then -- full name + return fullname + end + nodename = nodename:lower() + + for key, _ in pairs(minetest.registered_nodes) do + if string_endswith(key:lower(), ":" .. nodename) then -- matches name (w/o mod part) + return key + end + end + + if description_cache == nil then + -- cache stripped descriptions + description_cache = {} + for key, value in pairs(minetest.registered_nodes) do + local desc = strip_escapes(value.description):gsub("\n.*", "", 1):lower() + if desc ~= "" then + description_cache[key] = desc + end + end + end + + for key, desc in pairs(description_cache) do + if desc == nodename then -- matches description + return key + end + end + for key, desc in pairs(description_cache) do + if desc == nodename .. " block" then + -- fuzzy description match (e.g. "Steel" == "Steel Block") + return key + end + end + + local match = nil + for key, value in pairs(description_cache) do + if value:find(nodename, 1, true) ~= nil then + if match ~= nil then + return nil + end + match = key -- substring description match (only if no ambiguities) + end + end + return match +end diff --git a/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua b/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua new file mode 100644 index 00000000..d36a403a --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua @@ -0,0 +1,276 @@ +local S = minetest.get_translator("worldedit_commands") + + +local check_cube = function(param) + local found, _, w, h, l, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(w), tonumber(h), tonumber(l), node +end + +worldedit.register_command("hollowcube", { + params = " ", + description = S("Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of ."), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cube, + nodes_needed = function(name, w, h, l, node) + return w * h * l + end, + func = function(name, w, h, l, node) + local count = worldedit.cube(worldedit.pos1[name], w, h, l, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("cube", { + params = " ", + description = S("Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of ."), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cube, + nodes_needed = function(name, w, h, l, node) + return w * h * l + end, + func = function(name, w, h, l, node) + local count = worldedit.cube(worldedit.pos1[name], w, h, l, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_sphere = function(param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(radius), node +end + +worldedit.register_command("hollowsphere", { + params = " ", + description = S("Add hollow sphere centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_sphere, + nodes_needed = function(name, radius, node) + return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere + end, + func = function(name, radius, node) + local count = worldedit.sphere(worldedit.pos1[name], radius, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("sphere", { + params = " ", + description = S("Add sphere centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_sphere, + nodes_needed = function(name, radius, node) + return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere + end, + func = function(name, radius, node) + local count = worldedit.sphere(worldedit.pos1[name], radius, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_dome = function(param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(radius), node +end + +worldedit.register_command("hollowdome", { + params = " ", + description = S("Add hollow dome centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_dome, + nodes_needed = function(name, radius, node) + return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome + end, + func = function(name, radius, node) + local count = worldedit.dome(worldedit.pos1[name], radius, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("dome", { + params = " ", + description = S("Add dome centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_dome, + nodes_needed = function(name, radius, node) + return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome + end, + func = function(name, radius, node) + local count = worldedit.dome(worldedit.pos1[name], radius, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_cylinder = function(param) + -- two radii + local found, _, axis, length, radius1, radius2, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + -- single radius + found, _, axis, length, radius1, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") + radius2 = radius1 + end + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, axis, tonumber(length), tonumber(radius1), tonumber(radius2), node +end + +worldedit.register_command("hollowcylinder", { + params = "x/y/z/? [radius2] ", + description = S("Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cylinder, + nodes_needed = function(name, axis, length, radius1, radius2, node) + local radius = math.max(radius1, radius2) + return math.ceil(math.pi * (radius ^ 2) * length) + end, + func = function(name, axis, length, radius1, radius2, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("cylinder", { + params = "x/y/z/? [radius2] ", + description = S("Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cylinder, + nodes_needed = function(name, axis, length, radius1, radius2, node) + local radius = math.max(radius1, radius2) + return math.ceil(math.pi * (radius ^ 2) * length) + end, + func = function(name, axis, length, radius1, radius2, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_pyramid = function(param) + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, axis, tonumber(height), node +end + +worldedit.register_command("hollowpyramid", { + params = "x/y/z/? ", + description = S("Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_pyramid, + nodes_needed = function(name, axis, height, node) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) + end, + func = function(name, axis, height, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("pyramid", { + params = "x/y/z/? ", + description = S("Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_pyramid, + nodes_needed = function(name, axis, height, node) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) + end, + func = function(name, axis, height, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("spiral", { + params = " ", + description = S("Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(length), tonumber(height), tonumber(space), node + end, + nodes_needed = function(name, length, height, space, node) + return (length + space) * height -- TODO: this is not the upper bound + end, + func = function(name, length, height, space, node) + local count = worldedit.spiral(worldedit.pos1[name], length, height, space, node) + return true, S("@1 nodes added", count) + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/region.lua b/mods/Minetest-WorldEdit/worldedit_commands/region.lua new file mode 100644 index 00000000..9045c8aa --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/region.lua @@ -0,0 +1,234 @@ +local S = minetest.get_translator("worldedit_commands") + +worldedit.set_pos = {} +worldedit.inspect = {} + + +worldedit.register_command("inspect", { + params = "[on/off/1/0/true/false/yes/no/enable/disable]", + description = S("Enable or disable node inspection"), + privs = {worldedit=true}, + parse = function(param) + if param == "on" or param == "1" or param == "true" or param == "yes" or param == "enable" or param == "" then + return true, true + elseif param == "off" or param == "0" or param == "false" or param == "no" or param == "disable" then + return true, false + end + return false + end, + func = function(name, enable) + if enable then + worldedit.inspect[name] = true + local axis, sign = worldedit.player_axis(name) + worldedit.player_notify(name, S( + "inspector: inspection enabled for @1, currently facing the @2 axis", + name, + axis .. (sign > 0 and "+" or "-") + ), "info") + else + worldedit.inspect[name] = nil + worldedit.player_notify(name, S("inspector: inspection disabled"), "info") + end + end, +}) + +local VEC_6DIRS = { + vector.new( 1, 0, 0), + vector.new(-1, 0, 0), + vector.new( 0, 1, 0), + vector.new( 0,-1, 0), + vector.new( 0, 0, 1), + vector.new( 0, 0,-1), +} +local function get_node_rlight(pos) + local ret = 0 + for _, v in ipairs(VEC_6DIRS) do + ret = math.max(ret, minetest.get_node_light(vector.add(pos, v))) + end + return ret +end + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if worldedit.inspect[name] then + local axis, sign = worldedit.player_axis(name) + local message = S( + "inspector: @1 at @2 (param1=@3, param2=@4, received light=@5) punched facing the @6 axis", + node.name, + minetest.pos_to_string(pos), + node.param1, + node.param2, + get_node_rlight(pos), + axis .. (sign > 0 and "+" or "-") + ) + worldedit.player_notify(name, message, "info") + end +end) + + +worldedit.register_command("mark", { + params = "", + description = S("Show markers at the region positions"), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + worldedit.marker_update(name) + return true, S("region marked") + end, +}) + +worldedit.register_command("unmark", { + params = "", + description = S("Hide markers if currently shown"), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + worldedit.pos1[name] = nil + worldedit.pos2[name] = nil + worldedit.marker_update(name) + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + return true, S("region unmarked") + end, +}) + +local function set_pos1(name, pos) + assert(pos) + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.player_notify(name, S("position @1 set to @2", 1, minetest.pos_to_string(pos)), "ok") +end + +local function set_pos2(name, pos) + assert(pos) + worldedit.pos2[name] = pos + worldedit.mark_pos2(name) + worldedit.player_notify(name, S("position @1 set to @2", 2, minetest.pos_to_string(pos)), "ok") +end + +worldedit.register_command("pos1", { + params = "", + description = S("Set WorldEdit region position @1 to the player's location", 1), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + set_pos1(name, vector.round(player:get_pos())) + end, +}) + +worldedit.register_command("pos2", { + params = "", + description = S("Set WorldEdit region position @1 to the player's location", 2), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + set_pos2(name, vector.round(player:get_pos())) + end, +}) + +worldedit.register_command("p", { + params = "set/set1/set2/get", + description = S("Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region"), + category = S("Region operations"), + privs = {worldedit=true}, + parse = function(param) + if param == "set" or param == "set1" or param == "set2" or param == "get" then + return true, param + end + return false, S("unknown subcommand: @1", param) + end, + func = function(name, param) + local msg + if param == "set" then --set both WorldEdit positions + worldedit.set_pos[name] = "pos1" + msg = S("select positions by punching two nodes") + elseif param == "set1" then --set WorldEdit position 1 + worldedit.set_pos[name] = "pos1only" + msg = S("select position @1 by punching a node", 1) + elseif param == "set2" then --set WorldEdit position 2 + worldedit.set_pos[name] = "pos2" + msg = S("select position @1 by punching a node", 2) + elseif param == "get" then --display current WorldEdit positions + if worldedit.pos1[name] ~= nil then + msg = S("position @1: @2", 1, minetest.pos_to_string(worldedit.pos1[name])) + else + msg = S("position @1 not set", 1) + end + msg = msg .. "\n" + if worldedit.pos2[name] ~= nil then + msg = msg .. S("position @1: @2", 2, minetest.pos_to_string(worldedit.pos2[name])) + else + msg = msg .. S("position @1 not set", 2) + end + end + if msg then + worldedit.player_notify(name, msg, "info") + end + end, +}) + +worldedit.register_command("fixedpos", { + params = "set1/set2 ", + description = S("Set a WorldEdit region position to the position at (, , )"), + category = S("Region operations"), + privs = {worldedit=true}, + parse = function(param) + local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, flag, vector.new(tonumber(x), tonumber(y), tonumber(z)) + end, + func = function(name, flag, pos) + if flag == "set1" then + set_pos1(name, pos) + else --flag == "set2" + set_pos2(name, pos) + end + end, +}) + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position + if worldedit.set_pos[name] == "pos1" then --setting position 1 + set_pos1(name, pos) + worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation + elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only + set_pos1(name, pos) + worldedit.set_pos[name] = nil --finished setting positions + elseif worldedit.set_pos[name] == "pos2" then --setting position 2 + set_pos2(name, pos) + worldedit.set_pos[name] = nil --finished setting positions + elseif worldedit.set_pos[name] == "prob" then --setting Minetest schematic node probabilities + worldedit.prob_pos[name] = pos + minetest.show_formspec(name, "prob_val_enter", "field[text;;]") + end + end +end) + +worldedit.register_command("volume", { + params = "", + description = S("Display the volume of the current WorldEdit region"), + category = S("Region operations"), + privs = {worldedit=true}, + require_pos = 2, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + + local volume = worldedit.volume(pos1, pos2) + local abs = math.abs + worldedit.player_notify(name, S( + "current region has a volume of @1 nodes (@2*@3*@4)", + volume, + abs(pos2.x - pos1.x) + 1, + abs(pos2.y - pos1.y) + 1, + abs(pos2.z - pos1.z) + 1 + ), "info") + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/safe.lua b/mods/Minetest-WorldEdit/worldedit_commands/safe.lua index c83cac8a..cd8fee1f 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/safe.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/safe.lua @@ -1,15 +1,30 @@ +local S = minetest.get_translator("worldedit_commands") + +local safe_region_limit = tonumber(minetest.settings:get("worldedit_safe_region_limit") or "20000") + local safe_region_callback = {} --`count` is the number of nodes that would possibly be modified --`callback` is a callback to run when the user confirms local function safe_region(name, count, callback) - if count < 20000 then + if safe_region_limit <= 0 or count < safe_region_limit then return callback() end - --save callback to call later + -- save callback to call later safe_region_callback[name] = callback - worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel") + + local count_str = tostring(count) + -- highlight millions, 1 mln <=> 100x100x100 cube + if #count_str > 6 then + count_str = minetest.colorize("#f33", count_str:sub(1, -7)) .. count_str:sub(-6, -1) + end + + local yes_cmd = minetest.colorize("#00ffff", "//y") + local no_cmd = minetest.colorize("#00ffff", "//n") + local msg = S("WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel", + count_str, yes_cmd, no_cmd) + worldedit.player_notify(name, msg, "info") end local function reset_pending(name) @@ -18,11 +33,11 @@ end minetest.register_chatcommand("/y", { params = "", - description = "Confirm a pending operation", + description = S("Confirm a pending operation"), func = function(name) local callback = safe_region_callback[name] if not callback then - worldedit.player_notify(name, "no operation pending") + worldedit.player_notify(name, S("no operation pending"), "error") return end @@ -33,10 +48,10 @@ minetest.register_chatcommand("/y", { minetest.register_chatcommand("/n", { params = "", - description = "Abort a pending operation", + description = S("Abort a pending operation"), func = function(name) if not safe_region_callback[name] then - worldedit.player_notify(name, "no operation pending") + worldedit.player_notify(name, S("no operation pending"), "error") return end diff --git a/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua b/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua new file mode 100644 index 00000000..1aae07e1 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua @@ -0,0 +1,284 @@ +local S = minetest.get_translator("worldedit_commands") + +worldedit.prob_pos = {} +worldedit.prob_list = {} + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + +local function check_filename(name) + return name:find("^[%w%s%^&'@{}%[%],%$=!%-#%(%)%%%.%+~_]+$") ~= nil +end + +local function open_schematic(name, param) + -- find the file in the world path + local testpaths = { + minetest.get_worldpath() .. "/schems/" .. param, + minetest.get_worldpath() .. "/schems/" .. param .. ".we", + minetest.get_worldpath() .. "/schems/" .. param .. ".wem", + } + local file, err + for index, path in ipairs(testpaths) do + file, err = io.open(path, "rb") + if not err then + break + end + end + if err then + worldedit.player_notify(name, S("Could not open file \"@1\"", param), "error") + return + end + local value = file:read("*a") + file:close() + + local version = worldedit.read_header(value) + if version == nil or version == 0 then + worldedit.player_notify(name, S("Invalid file format!"), "error") + return + elseif version > worldedit.LATEST_SERIALIZATION_VERSION then + worldedit.player_notify(name, S("Schematic was created with a newer version of WorldEdit."), "error") + return + end + + return value +end + +local function detect_misaligned_schematic(name, pos1, pos2) + pos1 = worldedit.sort_pos(pos1, pos2) + -- Check that allocate/save can position the schematic correctly + -- The expected behaviour is that the (0,0,0) corner of the schematic stays + -- at pos1, this only works when the minimum position is actually present + -- in the schematic. + local node = minetest.get_node(pos1) + local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore" + if not have_node_at_origin then + worldedit.player_notify(name, + S("Warning: The schematic contains excessive free space and WILL be ".. + "misaligned when allocated or loaded. To avoid this, shrink your ".. + "area to cover exactly the nodes to be saved.") + ) + end +end + + +worldedit.register_command("save", { + params = "", + description = S("Save the current WorldEdit region to \"(world folder)/schems/.we\""), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local result, count = worldedit.serialize(worldedit.pos1[name], + worldedit.pos2[name]) + detect_misaligned_schematic(name, worldedit.pos1[name], worldedit.pos2[name]) + + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + minetest.mkdir(path) + + local filename = path .. "/" .. param .. ".we" + local file, err = io.open(filename, "wb") + if err ~= nil then + return false, S("Could not save file to \"@1\"", filename) + end + file:write(result) + file:flush() + file:close() + + return true, S("@1 nodes saved", count) + end, +}) + +worldedit.register_command("allocate", { + params = "", + description = S("Set the region defined by nodes from \"(world folder)/schems/.we\" as the current WorldEdit region"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + func = function(name, param) + local pos = worldedit.pos1[name] + + local value = open_schematic(name, param) + if not value then + return false + end + + local nodepos1, nodepos2, count = worldedit.allocate(pos, value) + if not nodepos1 then + return false, S("Schematic empty, nothing allocated") + end + + worldedit.pos1[name] = nodepos1 + worldedit.pos2[name] = nodepos2 + worldedit.marker_update(name) + + return true, S("@1 nodes allocated", count) + end, +}) + +worldedit.register_command("load", { + params = "", + description = S("Load nodes from \"(world folder)/schems/[.we[m]]\" with position 1 of the current WorldEdit region as the origin"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + func = function(name, param) + local pos = worldedit.pos1[name] + + local value = open_schematic(name, param) + if not value then + return false + end + + local count = worldedit.deserialize(pos, value) + if count == nil then + return false, S("Loading failed!") + end + return true, S("@1 nodes loaded", count) + end, +}) + + +worldedit.register_command("mtschemcreate", { + params = "", + description = S("Save the current WorldEdit region using the Minetest ".. + "Schematic format to \"(world folder)/schems/.mts\""), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + minetest.mkdir(path) + + local filename = path .. "/" .. param .. ".mts" + local ret = minetest.create_schematic(worldedit.pos1[name], + worldedit.pos2[name], worldedit.prob_list[name], + filename) + worldedit.prob_list[name] = {} + if ret == nil then + return false, S("Failed to create Minetest schematic") + end + return true, S("Saved Minetest schematic to @1", param) + end, +}) + +worldedit.register_command("mtschemplace", { + params = "", + description = S("Load nodes from \"(world folder)/schems/.mts\" with position 1 of the current WorldEdit region as the origin"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + local found, _, filename, rotation = param:find("^(.+)%s+([012789]+)$") + if found == nil then + filename = param + elseif rotation ~= "0" and rotation ~= "90" and rotation ~= "180" and rotation ~= "270" then + return false, S("Invalid rotation: @1", rotation) + end + if not check_filename(filename) then + return false, S("Disallowed file name: @1", filename) + end + return true, filename, rotation + end, + func = function(name, filename, rotation) + local pos = worldedit.pos1[name] + + local path = minetest.get_worldpath() .. "/schems/" .. filename .. ".mts" + if minetest.place_schematic(pos, path, rotation) == nil then + return false, S("failed to place Minetest schematic") + end + return true, S("placed Minetest schematic @1 at @2", + filename, minetest.pos_to_string(pos)) + end, +}) + +worldedit.register_command("mtschemprob", { + params = "start/finish/get", + description = S("Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry"), + category = S("Schematics"), + privs = {worldedit=true}, + parse = function(param) + if param ~= "start" and param ~= "finish" and param ~= "get" then + return false, S("unknown subcommand: @1", param) + end + return true, param + end, + func = function(name, param) + if param == "start" then --start probability setting + worldedit.set_pos[name] = "prob" + worldedit.prob_list[name] = {} + worldedit.player_notify(name, S("select Minetest schematic probability values by punching nodes"), "info") + elseif param == "finish" then --finish probability setting + worldedit.set_pos[name] = nil + worldedit.player_notify(name, S("finished Minetest schematic probability selection"), "info") + elseif param == "get" then --get all nodes that had probabilities set on them + local text = "" + local problist = worldedit.prob_list[name] + if problist == nil then + return + end + for k,v in pairs(problist) do + local prob = math.floor(((v.prob / 256) * 100) * 100 + 0.5) / 100 + text = text .. minetest.pos_to_string(v.pos) .. ": " .. prob .. "% | " + end + worldedit.player_notify(name, S("currently set node probabilities:") .. "\n" .. text, "info") + end + end, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "prob_val_enter" then + local name = player:get_player_name() + local problist = worldedit.prob_list[name] + if problist == nil then + return + end + local e = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} + if e.pos == nil or e.prob == nil or e.prob < 0 or e.prob > 256 then + worldedit.player_notify(name, S("invalid node probability given, not saved"), "error") + return + end + problist[#problist+1] = e + end +end) + diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png index fde36a87..73ff039f 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png and b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png index 4c304aa8..84559deb 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png and b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png index 1502f165..d0e78192 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png and b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png new file mode 100644 index 00000000..b2baf1aa Binary files /dev/null and b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/transform.lua b/mods/Minetest-WorldEdit/worldedit_commands/transform.lua new file mode 100644 index 00000000..ce3d0853 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/transform.lua @@ -0,0 +1,269 @@ +local S = minetest.get_translator("worldedit_commands") + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + + +worldedit.register_command("copy", { + params = "x/y/z/? ", + description = S("Copy the current WorldEdit region along the given axis by nodes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(amount) + end, + nodes_needed = function(name, axis, amount) + return check_region(name) * 2 + end, + func = function(name, axis, amount) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local count = worldedit.copy(worldedit.pos1[name], worldedit.pos2[name], axis, amount) + return true, S("@1 nodes copied", count) + end, +}) + +worldedit.register_command("move", { + params = "x/y/z/? ", + description = S("Move the current WorldEdit region along the given axis by nodes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(amount) + end, + nodes_needed = function(name, axis, amount) + return check_region(name) * 2 + end, + func = function(name, axis, amount) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.move(pos1, pos2, axis, amount) + + pos1[axis] = pos1[axis] + amount + pos2[axis] = pos2[axis] + amount + worldedit.marker_update(name) + return true, S("@1 nodes moved", count) + end, +}) + +worldedit.register_command("stack", { + params = "x/y/z/? ", + description = S("Stack the current WorldEdit region along the given axis times"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(repetitions) + end, + nodes_needed = function(name, axis, repetitions) + return check_region(name) * math.abs(repetitions) + end, + func = function(name, axis, repetitions) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + repetitions = repetitions * sign + end + + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.volume(pos1, pos2) * math.abs(repetitions) + worldedit.stack(pos1, pos2, axis, repetitions, function() + worldedit.player_notify(name, S("@1 nodes stacked", count), "ok") + end) + end, +}) + +worldedit.register_command("stack2", { + params = " ", + description = S("Stack the current WorldEdit region times by offset , , "), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local repetitions, incs = param:match("(%d+)%s*(.+)") + if repetitions == nil then + return false, S("invalid count: @1", param) + end + local x, y, z = incs:match("([+-]?%d+) ([+-]?%d+) ([+-]?%d+)") + if x == nil then + return false, S("invalid increments: @1", param) + end + + return true, tonumber(repetitions), vector.new(tonumber(x), tonumber(y), tonumber(z)) + end, + nodes_needed = function(name, repetitions, offset) + return check_region(name) * repetitions + end, + func = function(name, repetitions, offset) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.volume(pos1, pos2) * repetitions + worldedit.stack2(pos1, pos2, offset, repetitions, function() + worldedit.player_notify(name, S("@1 nodes stacked", count), "ok") + end) + end, +}) + +worldedit.register_command("stretch", { + params = " ", + description = S("Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") + if found == nil then + return false + end + stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) + if stretchx == 0 or stretchy == 0 or stretchz == 0 then + return false, S("invalid scaling factors: @1", param) + end + return true, stretchx, stretchy, stretchz + end, + nodes_needed = function(name, stretchx, stretchy, stretchz) + return check_region(name) * stretchx * stretchy * stretchz + end, + func = function(name, stretchx, stretchy, stretchz) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count, pos1, pos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) + + --reset markers to scaled positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes stretched", count) + end, +}) + +worldedit.register_command("transpose", { + params = "x/y/z/? x/y/z/?", + description = S("Transpose the current WorldEdit region along the given axes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") + if found == nil then + return false + elseif axis1 == axis2 then + return false, S("invalid usage: axes must be different") + end + return true, axis1, axis2 + end, + nodes_needed = check_region, + func = function(name, axis1, axis2) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if axis1 == "?" then axis1 = worldedit.player_axis(name) end + if axis2 == "?" then axis2 = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2) + + --reset markers to transposed positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes transposed", count) + end, +}) + +worldedit.register_command("flip", { + params = "x/y/z/?", + description = S("Flip the current WorldEdit region along the given axis"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param ~= "x" and param ~= "y" and param ~= "z" and param ~= "?" then + return false + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + if param == "?" then param = worldedit.player_axis(name) end + local count = worldedit.flip(worldedit.pos1[name], worldedit.pos2[name], param) + return true, S("@1 nodes flipped", count) + end, +}) + +worldedit.register_command("rotate", { + params = "x/y/z/? ", + description = S("Rotate the current WorldEdit region around the given axis by angle (90 degree increment)"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + angle = tonumber(angle) + if angle % 90 ~= 0 or angle % 360 == 0 then + return false, S("invalid usage: angle must be multiple of 90") + end + return true, axis, angle + end, + nodes_needed = check_region, + func = function(name, axis, angle) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if axis == "?" then axis = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle) + + --reset markers to rotated positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes rotated", count) + end, +}) + +worldedit.register_command("orient", { + params = "", + description = S("Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, angle = param:find("^([+-]?%d+)$") + if found == nil then + return false + end + angle = tonumber(angle) + if angle % 90 ~= 0 then + return false, S("invalid usage: angle must be multiple of 90") + end + return true, angle + end, + nodes_needed = check_region, + func = function(name, angle) + local count = worldedit.orient(worldedit.pos1[name], worldedit.pos2[name], angle) + return true, S("@1 nodes oriented", count) + end, +}) + diff --git a/mods/Minetest-WorldEdit/worldedit_commands/wand.lua b/mods/Minetest-WorldEdit/worldedit_commands/wand.lua index faa77ff5..05c0aeec 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/wand.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/wand.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("worldedit_commands") + local function above_or_under(placer, pointed_thing) if placer:get_player_control().sneak then return pointed_thing.above @@ -9,11 +11,18 @@ end local punched_air_time = {} minetest.register_tool(":worldedit:wand", { - description = "WorldEdit Wand tool\nLeft-click to set 1st position, right-click to set 2nd", + description = S("WorldEdit Wand tool\nLeft-click to set 1st position, right-click to set 2nd"), inventory_image = "worldedit_wand.png", stack_max = 1, -- there is no need to have more than one liquids_pointable = true, -- ground with only water on can be selected as well + -- ignore marker cube so the clicking on the position markers works reliably + pointabilities = { + objects = { + ["worldedit:region_cube"] = false + } + }, + on_use = function(itemstack, placer, pointed_thing) if placer == nil or pointed_thing == nil then return end local name = placer:get_player_name() @@ -32,7 +41,7 @@ minetest.register_tool(":worldedit:wand", { local entity = pointed_thing.ref:get_luaentity() if entity and entity.name == "worldedit:pos2" then -- set pos1 = pos2 - worldedit.pos1[name] = worldedit.pos2[name] + worldedit.pos1[name] = vector.copy(worldedit.pos2[name]) worldedit.mark_pos1(name) end end @@ -57,7 +66,7 @@ minetest.register_tool(":worldedit:wand", { local entity = pointed_thing.ref:get_luaentity() if entity and entity.name == "worldedit:pos1" then -- set pos2 = pos1 - worldedit.pos2[name] = worldedit.pos1[name] + worldedit.pos2[name] = vector.copy(worldedit.pos1[name]) worldedit.mark_pos2(name) end return itemstack -- nothing consumed, nothing changed diff --git a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua index 6279d8a8..75c205a5 100644 --- a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua +++ b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua @@ -140,7 +140,7 @@ local function execute_worldedit_command(command_name, player_name, params) assert(chatcmd, "unknown command: " .. command_name) local _, msg = chatcmd.func(player_name, params) if msg then - worldedit.player_notify(player_name, msg) + minetest.chat_send_player(player_name, msg) end end diff --git a/mods/Minetest-WorldEdit/worldedit_gui/init.lua b/mods/Minetest-WorldEdit/worldedit_gui/init.lua index 378abab3..bb85df88 100644 --- a/mods/Minetest-WorldEdit/worldedit_gui/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_gui/init.lua @@ -4,10 +4,10 @@ worldedit = worldedit or {} Example: worldedit.register_gui_function("worldedit_gui_hollow_cylinder", { - name = "Make Hollow Cylinder", - privs = {worldedit=true}, - get_formspec = function(name) return "some formspec here" end, - on_select = function(name) print(name .. " clicked the button!") end, + name = "Make Hollow Cylinder", + privs = {worldedit=true}, + get_formspec = function(name) return "some formspec here" end, + on_select = function(name) print(name .. " clicked the button!") end, }) Use `nil` for the `options` parameter to unregister the function associated with the given identifier. @@ -35,14 +35,14 @@ end Example: worldedit.register_gui_handler("worldedit_gui_hollow_cylinder", function(name, fields) - print(minetest.serialize(fields)) + print(minetest.serialize(fields)) end) ]] worldedit.register_gui_handler = function(identifier, handler) local enabled = true minetest.register_on_player_receive_fields(function(player, formname, fields) - if not enabled then return false end + if not enabled or formname ~= "" or fields.worldedit_gui then return false end enabled = false minetest.after(0.2, function() enabled = true end) local name = player:get_player_name() @@ -80,6 +80,7 @@ if minetest.global_exists("unified_inventory") then -- unified inventory install unified_inventory.register_button("worldedit_gui", { type = "image", image = "inventory_plus_worldedit_gui.png", + tooltip = "Edit your World!", condition = function(player) return minetest.check_player_privs(player:get_player_name(), {worldedit=true}) end, @@ -193,7 +194,8 @@ elseif minetest.global_exists("sfinv") then -- sfinv installed get = function(self, player, context) local can_worldedit = minetest.check_player_privs(player, {worldedit=true}) local fs = orig_get(self, player, context) - return fs .. (can_worldedit and "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" or "") + return fs .. (can_worldedit and "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" .. + "tooltip[worldedit_gui;Edit your World!]" or "") end }) @@ -262,7 +264,7 @@ worldedit.register_gui_handler("worldedit_gui", function(name, fields) --ensure player has permission to perform action local has_privs, missing_privs = minetest.check_player_privs(name, entry.privs) if not has_privs then - worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")") + worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")", "error") return false end if entry.on_select then diff --git a/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png b/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png index ff9404b4..86a72334 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png and b/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png differ diff --git a/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png b/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png index f57436ca..fc80c2d3 100644 Binary files a/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png and b/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png differ diff --git a/mods/advtrains/.build.yml b/mods/advtrains/.build.yml index 303348fe..c2332f2a 100644 --- a/mods/advtrains/.build.yml +++ b/mods/advtrains/.build.yml @@ -6,17 +6,12 @@ packages: - unzip - wget - lua-busted +- luajit sources : - https://git.sr.ht/~gpcf/advtrains tasks: -- download_mt_server: | - mkdir bin - wget https://lifomaps.de/advtrains-test/builtin.tar.gz - tar xf builtin.tar.gz - curl https://lifomaps.de/advtrains-test/minetestserver -o ~/bin/minetestserver - chmod +x ~/bin/minetestserver - install_mt_game : | curl -L https://github.com/minetest/minetest_game/archive/master.zip -o master.zip mkdir -p .minetest/games/ @@ -45,4 +40,9 @@ tasks: git clone https://git.bananach.space/basic_trains.git/ - run_test_world: | echo "bind_address = 127.0.0.1" > minetest.conf - ~/bin/minetestserver --port 31111 --gameid minetest_game --config ~/minetest.conf --world ~/.minetest/worlds/advtrains_testworld + minetestserver --port 31111 --gameid minetest_game --config ~/minetest.conf --world ~/.minetest/worlds/advtrains_testworld --logfile ~/minetest.log +- test_po_files : | + cd advtrains/advtrains + for f in po/*.po; do + luajit -e 'require("poconvert").from_string("advtrains", io.input():read("*a"))' < $f + done diff --git a/mods/advtrains/README.md b/mods/advtrains/README.md index 41a35f57..e80e4b56 100644 --- a/mods/advtrains/README.md +++ b/mods/advtrains/README.md @@ -83,6 +83,7 @@ Small code contributions: * Inventory images : mbb * Node texture for LuaATC controller: Jeija (from Mesecons) * Mod Description : hajo +* 45 degree platforms design : Och_Noe #### Sounds: @@ -91,7 +92,7 @@ Small code contributions: * advtrains\_steam\_whistle : googol * advtrains\_subway\_horn : https://freesound.org/people/Mullumbimby/sounds/385283/ * advtrains\_subway\_\* : Gabriel (gbl08ma) -* 45 degree platforms design : Och_Noe + ### Testers: diff --git a/mods/advtrains/advtrains/api_doc.txt b/mods/advtrains/advtrains/api_doc.txt index 1e49df32..5668ba32 100644 --- a/mods/advtrains/advtrains/api_doc.txt +++ b/mods/advtrains/advtrains/api_doc.txt @@ -85,6 +85,13 @@ advtrains.register_wagon(name, prototype, description, inventory_image) wagon_span=2, ^- How far this wagon extends from its base position. Is the half of the wagon length. ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking. + wheel_positions = {1.5, -1.5}, + ^- Optional: if defined, the wagon will be placed so that these 2 wheel positions are on the track + ^- This parameter is recommended for long wagons (wagon_span >= 2). + ^- The position is a distance relative to the center of the wagon. + ^- Must have exactly 2 entries, corresponding to the front (1) and rear (2) wheel of the wagon object. 1st must be greater than 2nd. + ^- If not provided, the simple 1-position positioning logic will be used (wagon is positioned with the center on the track) + extent_h = 1, ^- Determines the collision box extent in x/z direction. Defaults to 1 (=3x3) ^- The actual bounding box size is (extent_h*2)+1, so 0 means 1x1, 1 means 3x3 and 2 means 5x5 diff --git a/mods/advtrains/advtrains/atc.lua b/mods/advtrains/advtrains/atc.lua index c1ff2186..b572cdc8 100644 --- a/mods/advtrains/advtrains/atc.lua +++ b/mods/advtrains/advtrains/atc.lua @@ -106,7 +106,7 @@ local apn_func=function(pos) -- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function! local meta=minetest.get_meta(pos) if meta then - meta:set_string("infotext", attrans("ATC controller, unconfigured.")) + meta:set_string("infotext", attrans("Unconfigured ATC controller")) meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta)) end end @@ -233,7 +233,7 @@ local matchptn={ advtrains.train_ensure_init(id, train) -- no one minds if this failed... this shouldn't even be called without train being initialized... else - atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!")) + atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving.")) end return 1 end, @@ -245,11 +245,11 @@ local matchptn={ end, ["K"] = function(id, train) if train.door_open == 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Doors closed")) + atwarn(sid(id), attrans("ATC Kick command warning: doors are closed.")) return 1 end if train.velocity > 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Train moving")) + atwarn(sid(id), attrans("ATC Kick command warning: train moving.")) return 1 end local tp = train.trainparts diff --git a/mods/advtrains/advtrains/copytool.lua b/mods/advtrains/advtrains/copytool.lua index 0c1cdfe9..ca5cae1b 100644 --- a/mods/advtrains/advtrains/copytool.lua +++ b/mods/advtrains/advtrains/copytool.lua @@ -26,7 +26,7 @@ minetest.register_tool("advtrains:copytool", { return itemstack end if not minetest.check_player_privs(placer, {train_operator = true }) then - minetest.chat_send_player(pname, "You don't have the train_operator privilege.") + minetest.chat_send_player(pname, S("You do not have the @1 privilege.", "train_operator")) return itemstack end if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then @@ -38,7 +38,7 @@ minetest.register_tool("advtrains:copytool", { local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true}) if not prevpos then - minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!") + minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough.")) return end @@ -49,12 +49,12 @@ minetest.register_tool("advtrains:copytool", { end local clipboard = meta:get_string("clipboard") if (clipboard == "") then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end clipboard = minetest.deserialize(clipboard) if (clipboard.wagons == nil) then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end @@ -71,7 +71,7 @@ minetest.register_tool("advtrains:copytool", { local train = advtrains.trains[id] train.off_track = train.end_index advtrains.TRAIN_MAX_WAGONS then + atwarn("Cannot couple",stat_train.id,"and",init_train.id,"- train would have length",tot_len,"which is above the limit of",advtrains.TRAIN_MAX_WAGONS) + return + end + + advtrains.te_run_callbacks_on_couple(init_train, stat_train) if stat_train_opposite then -- insert wagons in inverse order and set their wagon_flipped state @@ -310,7 +335,7 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front) --atdebug("CMCT: t1",t1_cplt,"t2",t2_cplt,"") -- if at least one of the trains has no couplers table, it always couples (fallback behavior and mode for universal shunters) - if not t1_cplt or not t2_cplt then + if minetest.settings:get_bool("advtrains_universal_couplers", false) or not t1_cplt or not t2_cplt then return true end @@ -326,11 +351,11 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front) for typ,_ in pairs(t1_cplt) do table.insert(t1_cplhr, advtrains.coupler_types[typ] or typ) end - if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end + if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end for typ,_ in pairs(t2_cplt) do table.insert(t2_cplhr, advtrains.coupler_types[typ] or typ) end - if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end + if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end return false, attrans("Can not couple: The couplers of the trains do not match (@1 and @2).", table.concat(t1_cplhr, ","), table.concat(t2_cplhr, ",")) end @@ -428,7 +453,7 @@ minetest.register_entity("advtrains:discouple", { self.object:remove() return end - --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. + --get_yaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. if not self.wagon.object:get_yaw() then self.object:remove() return @@ -475,7 +500,7 @@ minetest.register_entity("advtrains:couple", { self.object:remove() end, on_step=function(self, dtime) - if advtrains.wagon_outside_range(self.object:getpos()) then + if advtrains.wagon_outside_range(self.object:get_pos()) then --atdebug("Couple Removing outside range") self.object:remove() return @@ -514,7 +539,7 @@ minetest.register_entity("advtrains:couple", { tp2=advtrains.path_get_interpolated(train2, train2.end_index) end local pos_median=advtrains.pos_median(tp1, tp2) - if not vector.equals(pos_median, self.object:getpos()) then + if not vector.equals(pos_median, self.object:get_pos()) then self.object:set_pos(pos_median) end self.position_set=true diff --git a/mods/advtrains/advtrains/craft_items.lua b/mods/advtrains/advtrains/craft_items.lua index 0e693ebc..1188b64a 100644 --- a/mods/advtrains/advtrains/craft_items.lua +++ b/mods/advtrains/advtrains/craft_items.lua @@ -6,7 +6,7 @@ core.register_craftitem("advtrains:boiler", { core.register_craftitem("advtrains:driver_cab", { - description = attrans("driver's cab"), + description = attrans("Driver's cab"), inventory_image = "advtrains_driver_cab.png", }) diff --git a/mods/advtrains/advtrains/crafting.lua b/mods/advtrains/advtrains/crafting.lua index 7626d55b..9f804566 100644 --- a/mods/advtrains/advtrains/crafting.lua +++ b/mods/advtrains/advtrains/crafting.lua @@ -21,6 +21,14 @@ minetest.register_craft({ }, }) --Wallmounted Signal +minetest.register_craft({ + output = 'advtrains:signal_wall_l_off 2', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'dye:red'}, + {'', 'default:steel_ingot', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'dye:dark_green'}, + }, +}) minetest.register_craft({ output = 'advtrains:signal_wall_r_off 2', recipe = { @@ -29,6 +37,15 @@ minetest.register_craft({ {'dye:dark_green', 'default:steel_ingot', 'default:steel_ingot'}, }, }) +minetest.register_craft({ + output = 'advtrains:signal_wall_t_off 2', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'dye:dark_green', '', 'dye:red'}, + }, +}) + --Wallmounted Signals can be converted into every orientation by shapeless crafting minetest.register_craft({ diff --git a/mods/advtrains/advtrains/debugitems.lua b/mods/advtrains/advtrains/debugitems.lua index e672308c..e5982165 100644 --- a/mods/advtrains/advtrains/debugitems.lua +++ b/mods/advtrains/advtrains/debugitems.lua @@ -51,3 +51,33 @@ minetest.register_chatcommand("atyaw", end end, }) + +minetest.register_tool("advtrains:wagonpos_tester", +{ + description = "Wagon position tester", + groups = {cracky=1}, -- key=name, value=rating; rating=1..3. + inventory_image = "drwho_screwdriver.png", + wield_image = "drwho_screwdriver.png", + stack_max = 1, + range = 7.0, + + on_place = function(itemstack, placer, pointed_thing) + + end, + --[[ + ^ Shall place item and return the leftover itemstack + ^ default: minetest.item_place ]] + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type=="node" then + local pos = pointed_thing.under + local trains = advtrains.occ.get_trains_at(pos) + for train_id, index in pairs(trains) do + local wagon_num, wagon_id, wagon_data, offset_from_center = advtrains.get_wagon_at_index(train_id, index) + if wagon_num then + atdebug(wagon_num, wagon_id, offset_from_center) + end + end + end + end, +} +) diff --git a/mods/advtrains/advtrains/init.lua b/mods/advtrains/advtrains/init.lua index a7e57649..4a0b928c 100644 --- a/mods/advtrains/advtrains/init.lua +++ b/mods/advtrains/advtrains/init.lua @@ -22,9 +22,6 @@ Copyright (C) 2016-2020 Moritz Blei (orwell96) and contributors local lot = os.clock() minetest.log("action", "[advtrains] Loading...") --- There is no need to support 0.4.x anymore given that the compatitability with it is already broken by 1bb1d825f46af3562554c12fba35a31b9f7973ff -attrans = minetest.get_translator ("advtrains") - --advtrains advtrains = {trains={}, player_to_train_mapping={}} @@ -48,6 +45,9 @@ advtrains.IGNORE_WORLD = false local NO_SAVE = false -- Do not save any data to advtrains save files +advtrains.TRAIN_MAX_WAGONS = 20 +-- Limit on the maximum number of wagons that may be in a train + -- ========================================================================== -- Use a global slowdown factor to slow down train movements. Now a setting @@ -178,7 +178,7 @@ function assertt(var, typ) end end -dofile(advtrains.modpath.."/helpers.lua"); +dofile(advtrains.modpath.."/helpers.lua") --dofile(advtrains.modpath.."/debugitems.lua"); advtrains.meseconrules = @@ -198,13 +198,19 @@ advtrains.meseconrules = advtrains.fpath=minetest.get_worldpath().."/advtrains" +advtrains.poconvert = dofile(advtrains.modpath.."/poconvert.lua") +advtrains.poconvert.from_flat("advtrains") +attrans = minetest.get_translator("advtrains") + advtrains.speed = dofile(advtrains.modpath.."/speed.lua") +advtrains.texture = dofile(advtrains.modpath.."/texture.lua") dofile(advtrains.modpath.."/path.lua") dofile(advtrains.modpath.."/trainlogic.lua") dofile(advtrains.modpath.."/trainhud.lua") dofile(advtrains.modpath.."/trackplacer.lua") dofile(advtrains.modpath.."/copytool.lua") +dofile(advtrains.modpath.."/wagonprop_tool.lua") dofile(advtrains.modpath.."/tracks.lua") dofile(advtrains.modpath.."/occupation.lua") dofile(advtrains.modpath.."/atc.lua") @@ -229,7 +235,6 @@ end dofile(advtrains.modpath.."/lzb.lua") - --load/save -- backup variables, used if someone should accidentally delete a sub-mod @@ -471,6 +476,7 @@ advtrains.avt_save = function(remove_players_from_wagons) "text_outside", "text_inside", "line", "routingcode", "il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt", "points_split", "autocouple", "atc_wait_autocouple", "ars_disable", + "staticdata", }) --then save it tmp_trains[id]=v @@ -734,6 +740,21 @@ minetest.register_chatcommand("at_whereis", end end, }) +minetest.register_chatcommand("at_tp", + { + params = "", + description = "Teleports you to the position of the train with the given id", + privs = {train_operator = true, teleport = true}, + func = function(name,param) + local train = advtrains.trains[param] + if not train or not train.last_pos then + return false, "Train "..param.." does not exist or is invalid" + else + minetest.get_player_by_name(name):set_pos(train.last_pos) + return true, "Teleporting to train "..param + end + end, +}) minetest.register_chatcommand("at_disable_step", { params = "", @@ -755,6 +776,16 @@ minetest.register_chatcommand("at_disable_step", end, }) +minetest.register_chatcommand("at_status", + { + params = "", + description = "Print advtrains status info", + privs = {train_operator = true}, + func = function(name, param) + return true, advtrains.print_concat_table({"Advtrains Status: no_action",no_action,"slowdown",advtrains.global_slowdown,"(log",math.log(advtrains.global_slowdown),")"}) + end, +}) + advtrains.is_no_action = function() return no_action end diff --git a/mods/advtrains/advtrains/locale/README.md b/mods/advtrains/advtrains/locale/README.md new file mode 120000 index 00000000..61e473c2 --- /dev/null +++ b/mods/advtrains/advtrains/locale/README.md @@ -0,0 +1 @@ +../po/README.md \ No newline at end of file diff --git a/mods/advtrains/advtrains/locale/advtrains.de.tr b/mods/advtrains/advtrains/locale/advtrains.de.tr deleted file mode 100644 index 6abbc123..00000000 --- a/mods/advtrains/advtrains/locale/advtrains.de.tr +++ /dev/null @@ -1,77 +0,0 @@ -# textdomain: advtrains -This wagon is owned by @1, you can't destroy it.=Dieser Waggon gehört @1, du kannst ihn nicht abbauen. -Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=Warnung: Du erhältst nur etwas Stahl zurück. Wenn du sicher bist, dass du den Waggon zerstören willst, halte 'Schleichen' und klicke links. -Show Inventory=Zeige Inventar -Select seat:=Wähle einen Sitzplatz aus: -ATC controller, unconfigured.=Zugbeeinflussungsschiene, nicht konfiguiert. -ATC controller=Zugbeeinflussungsschiene -ATC controller, mode @1@nChannel: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nKanal: @2 -ATC controller, mode @1@nCommand: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nBefehl: @2 -Command=Befehl -Command (on)=Befehl (wenn ein) -Digiline channel=Digiline-Kanal -Save=Speichern -ATC Reverse command warning: didn't reverse train, train moving!=Zugbeeinflussung - Warnung: Befehl 'R' nicht ausgeführt, Zug in Bewegung! -ATC command syntax error: I statement not closed: @1=Zugbeeinflussung - Syntaxfehler: I-Anweisung nicht geschlossen: @1 -ATC command parse error: Unknown command: @1=Zugbeeinflussung - Fehler: Unbekannter Befehl: @1 -This position is protected!=Diese Position ist geschützt! -You need to own at least one neighboring wagon to destroy this couple.=Du musst Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln. -@1 Platform (low)=Niedriger @1-Bahnsteig -@1 Platform (high)=Hoher @1-Bahnsteig -off=aus -on=ein -Lampless Signal (@1)=Mechanisches Signal (@1) -Signal (@1)=Lichtsignal (@1) -Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=Schienenwerkzeug@n@nLinksklick: Schienentyp ändern, Rechtsklick: Objekt drehen. -This node can't be rotated using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug drehen. -This node can't be changed using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug bearbeiten. -Can't place: not pointing at node=Kann nicht platzieren: Du zeigst nicht auf einen Block. -Can't place: space occupied!=Kann nicht platzieren: Platz besetzt. -Can't place: protected position!=Kann nicht platzieren: Position geschützt. -Can't place: Not enough slope items left (@1 required)=Kann nicht platzieren: nicht genug Steigungsblöcke, es werden insgesamt @1 benötigt. -Can't place: There's no slope of length @1=Kann nicht platzieren: Keine Steigung der Länge @1 definiert. -Can't place: no supporting node at upper end.=Kann nicht platzieren: kein unterstützender Block am Ende der Steigung. -Deprecated Track=ausrangierte Schiene, nicht verwenden. -Track=Schiene -Bumper=Prellbock -Detector Rail=Detektorschiene -Speed:=Geschw.: -Target:=Zielges.: -@1 Slope=@1 Steigung -Can't get on: wagon full or doors closed!=Kann nicht einsteigen: Waggon voll oder Türen geschlossen. -Use Sneak+rightclick to bypass closed doors!=Nutze Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem einzusteigen. -Lock couples=Kupplungen sperren -Save wagon properties=Waggon-Einstellungen speichern -Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=Türen sind geschlossen! Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem auszusteigen. -Wagon properties=Waggon-Einstellungen -Get off=Aussteigen -Get off (forced)=Aussteigen (erzwingen) -(Doors closed)=(Türen geschlossen) -Access to @1=Zugang zu @1 -Default Seat=Standardsitzplatz -Default Seat (driver stand)=Standardsitzplatz (Führerstand) -Driver Stand=Führerstand -Driver Stand (left)=Führerstand Links -Driver Stand (right)=Führerstand Rechts -Industrial Train Engine=Industrielle Lokomotive -Industrial tank wagon=Tankwaggon -Industrial wood wagon=Holztransportwaggon -Japanese Train Engine=Japanische Personenzug-Lokomotive -Japanese Train Wagon=Japanischer Personenzug-Passagierwaggon -Steam Engine=Dampflokomotive -Detailed Steam Engine=detaillierte Dampflokomotive -Passenger Wagon=Passagierwaggon -Box wagon=Güterwaggon -Subway Passenger Wagon=U-Bahn-Waggon -The wagon's inventory is not empty!=Das Inventar dieses Waggons ist nicht leer! -This track can not be changed!=Diese Schiene kann nicht geändert werden! -This track can not be rotated!=Diese Schiene kann nicht gedreht werden! -This track can not be removed!=Diese Schiene kann nicht entfernt werden! -Position is occupied by a train.=Ein Zug steht an dieser Position. -There's a Track Circuit Break here.=Hier ist eine Gleisabschnittsgrenze (TCB). -There's a Signal Influence Point here.=Hier ist ein Signal-Beeinflussungspunkt. -Buffer and Chain Coupler=Schraubenkupplung -Scharfenberg Coupler=Scharfenbergkupplung -Japanese Train Inter-Wagon Connection=Waggonzwischenverbindung Japanischer Personenzug -Can not couple: The couplers of the trains do not match (@1 and @2).=Kann nicht ankuppeln: Die Kupplungen der Züge passen nicht zueinander (@1 und @2) -= diff --git a/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr b/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr deleted file mode 100644 index ef9c99b4..00000000 --- a/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr +++ /dev/null @@ -1,107 +0,0 @@ -# textdomain: advtrains - -# Advtrains Core (unorganized) -This wagon is owned by @1, you can't destroy it.=这是@1的车厢, 你不能摧毁它. -Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=警告: 如果你摧毁此车厢, 你只能拿到一些钢方块. 如果你确定要摧毁这个车厢,请按潜行键并左键单击此车厢. -ATC controller, unconfigured.=ATC控制器 (未配置) -ATC controller=ATC控制器 -ATC controller, mode @1@nChannel: @2=ATC控制器@n模式: @1@n频道: @2 -ATC controller, mode @1@nCommand: @2=ATC控制器@n模式: @1@n命令: @2 -Command=命令 -Command (on)=命令(激活时) -Digiline channel=Digiline 频道 -ATC Reverse command warning: didn't reverse train, train moving!=ATC警告:未执行“R”命令, 火车在移动 -ATC command syntax error: I statement not closed: @1=ATC语法错误: "I"命令不完整: @1 -ATC command parse error: Unknown command: @1=ATC语法错误: 未知命令: @1 -This position is protected!=这里已被保护. -You need to own at least one neighboring wagon to destroy this couple.=你必须至少拥有其中一个车厢才能解耦这两个车厢. -This node can't be rotated using the trackworker!=你不能使用铁路调整工具旋转这个方块. -This node can't be changed using the trackworker!=你不能使用铁路调整工具调整这个方块. -Can't place: not pointing at node=无法放置: 你没有选择任何方块. -Can't place: space occupied!=无法放置: 此区域已被占用. -Can't place: protected position!=无法放置: 此区域已被保护. -Can't place: Not enough slope items left (@1 required)=无法放置: 你没有足够的铁路斜坡放置工具 (你需要@1个) -Can't place: There's no slope of length @1=无法放置: advtrains不支持长度为@1m的斜坡. -Can't place: no supporting node at upper end.=无法放置: 较高端没有支撑方块. -Deprecated Track=请不要使用 -Can't get on: wagon full or doors closed!=无法上车: 车门已关闭或车厢已满 -Use Sneak+rightclick to bypass closed doors!=请使用潜行+右键上车 -Lock couples=锁定连接处 -Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=车门已关闭, 请使用潜行+右键单击下车 -Access to @1=可前往@1 -The clipboard couldn't access the metadata. Paste failed.=无法粘贴: 剪贴板无法访问元数据 -The clipboard couldn't access the metadata. Copy failed.=无法复制: 剪贴板无法访问元数据 - -# Train HUD/Formspecs -Speed:=速度: -Target:=目标速度: -Show Inventory=显示物品栏 -Select seat:=请选择座位 -Wagon properties=车厢属性 -Save wagon properties=保存车厢属性 -Text displayed outside on train=车厢外部显示 -Text displayed inside train=车厢内部显示 -Line=火车线路 -Routingcode=路由码 -Get off=下车 -Get off (forced)=强制下车 -(Doors closed)=(车门已关闭) - -# General -Save=保存 -# "off" and "on" can be translated differently depending on the context and are therefore not translated. -off=off -on=on - -# Line automation -Station Code=车站代码 -Station Name=车站名称 -Door Delay=车门关闭时间 -Departure Speed=出发速度 -Stop Time=停站时间 - -# Items -Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=铁路调整工具@n@n左键单击: 切换轨道类型@n右键单击: 旋转方块 -Passive Component Naming Tool@n@nRight-click to name a passive component.=被动元件命名工具@n@n右键单击命名所选元件. -Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train=火车复制工具@n@n左键单击: 复制@n右键单击: 粘帖 -Track=铁轨 -Perpendicular Diamond Crossing Track=垂直交叉铁轨 -45/90 Degree Diamond Crossing Track=45度交叉铁轨 -Unloading Track=卸货铁轨 -Loading Track=装货铁轨 -Bumper=保险杠 -Detector Rail=探测铁轨 -@1 Slope=@1斜坡 -@1 Platform (low)=50cm高的@1站台 -@1 Platform (high)=1m高的@1站台 -@1 Platform (45 degree)=1m高的@1站台 (45度) -Lampless Signal (@1)=臂板信号机 (@1) -Signal (@1)=信号灯 (@1) -Wallmounted Signal (l)=壁挂式信号灯 (左侧) -Wallmounted Signal (r)=壁挂式信号灯 (右侧) -Wallmounted Signal (t)=悬挂式信号灯 -Andrew's Cross=铁路道口信号灯 -Boiler=锅炉 -driver's cab=驾驶室 -Wheel=车轮 -Chimney=烟囱 - -# Seats -Default Seat=默认座位 -Default Seat (driver stand)=默认座位 (司机座位) -Driver Stand=司机座位 -Driver Stand (left)=左侧司机座位 -Driver Stand (right)=右侧司机座位 - -# Wagon/engine types -Industrial Train Engine=工业用火车头 -Big Industrial Train Engine=大型工业用火车头 -Industrial tank wagon=液体运输车厢 -Industrial wood wagon=木材运输车厢 -Japanese Train Engine=高速列车车头 -Japanese Train Wagon=高速列车车厢 -Steam Engine=蒸汽机车 -Detailed Steam Engine=精细的蒸汽机车 -Passenger Wagon=客车 -Box Wagon=货运车厢 -Subway Passenger Wagon=地铁车厢 diff --git a/mods/advtrains/advtrains/occupation.lua b/mods/advtrains/advtrains/occupation.lua index db399910..26e1f79b 100644 --- a/mods/advtrains/advtrains/occupation.lua +++ b/mods/advtrains/advtrains/occupation.lua @@ -86,9 +86,10 @@ end function o.set_item(train_id, pos, idx) local t = occgetcreate(pos) + assert(idx) local i = 1 while t[i] do - if t[i]==train_id then + if t[i]==train_id and t[i+1]==index then break end i = i + 2 @@ -98,25 +99,30 @@ function o.set_item(train_id, pos, idx) end -function o.clear_item(train_id, pos) +function o.clear_all_items(train_id, pos) local t = occget(pos) if not t then return end local i = 1 - local moving = false while t[i] do if t[i]==train_id then - if moving then - -- if, for some occasion, there should be a duplicate entry, erase this one too - atwarn("Duplicate occupation entry at",pos,"for train",train_id,":",t) - i = i - 2 - end - moving = true + table.remove(t, i) + table.remove(t, i) + else + i = i + 2 end - if moving then - t[i] = t[i+2] - t[i+1] = t[i+3] + end +end +function o.clear_specific_item(train_id, pos, index) + local t = occget(pos) + if not t then return end + local i = 1 + while t[i] do + if t[i]==train_id and t[i+1]==index then + table.remove(t, i) + table.remove(t, i) + else + i = i + 2 end - i = i + 2 end end @@ -143,64 +149,88 @@ function o.check_collision(pos, train_id) return false end --- Gets a mapping of train id's to indexes of trains that share this path item with this train --- The train itself will not be included. --- If the requested index position is off-track, returns {}. --- returns (table with train_id->index), position -function o.get_occupations(train, index) - local ppos, ontrack = advtrains.path_get(train, index) - if not ontrack then - atlog("Train",train.id,"get_occupations requested off-track",index) - return {}, ppos - end +-- Gets a mapping of train id's to indexes of trains that have a path item at this position +-- Note that the case where 2 or more indices are at a position only occurs if there is a track loop. +-- returns (table with train_id->{index1, index2...}) +function o.reverse_lookup(ppos) local pos = advtrains.round_vector_floor_y(ppos) local t = occget(pos) if not t then return {} end local r = {} local i = 1 - local train_id = train.id while t[i] do - if t[i]~=train_id then - r[t[i]] = t[i+1] - end + if not r[t[i]] then r[t[i]] = {} end + table.insert(r[t[i]], t[i+1]) i = i + 2 end + return r +end + +-- Gets a mapping of train id's to indexes of trains that have a path item at this position. +-- Quick variant: will only return one index per train (the latest one added) +-- returns (table with train_id->index) +function o.reverse_lookup_quick(ppos) + local pos = advtrains.round_vector_floor_y(ppos) + local t = occget(pos) + if not t then return {} end + local r = {} + local i = 1 + while t[i] do + r[t[i]] = t[i+1] + i = i + 2 + end + return r +end + +local OCC_CLOSE_PROXIMITY = 3 +-- Gets a mapping of train id's to index of trains that have a path item at this position. Selects at most one index based on a given heuristic, or even none if it does not match the heuristic criterion +-- returns (table with train_id->index), position +-- "in_train": first index that lies between train index and end index +-- "train_at_node": first index where the train is standing on that node (like in_train but with +-0.5 added to index) +-- "first_ahead": smallest index that is > current index +-- "before_end"(default): smallest index that is > end index +-- "close_proximity": within 3 indices close to the train index and end_index +-- "any": just output the first index found and do not check further (also occurs if both "in_train" and "first_ahead" heuristics have failed +function o.reverse_lookup_sel(pos, heuristic) + if not heuristic then heuristic = "before_end" end + local om = o.reverse_lookup(pos) + local r = {} + for tid, idxs in pairs(om) do + r[tid] = idxs[1] + if heuristic~="any" then + --must run a heuristic + --atdebug("reverse_lookup_sel is running heuristic for", pos,heuristic,"idxs",table.concat(idxs,",")) + local otrn = advtrains.trains[tid] + advtrains.train_ensure_init(tid, otrn) + local h_value + for _,idx in ipairs(idxs) do + if heuristic == "first_ahead" and idx > otrn.index and (not h_value or h_value>idx) then + h_value = idx + end + if heuristic == "before_end" and idx > otrn.end_index and (not h_value or h_value>idx) then + h_value = idx + end + if heuristic == "in_train" and idx < otrn.index and idx > otrn.end_index then + h_value = idx + end + if heuristic == "train_at_node" and idx < (otrn.index+0.5) and idx > (otrn.end_index-0.5) then + h_value = idx + end + if heuristic == "close_proximity" and idx < (otrn.index + OCC_CLOSE_PROXIMITY) and idx > (otrn.end_index - OCC_CLOSE_PROXIMITY) then + h_value = idx + end + end + r[tid] = h_value + --atdebug(h_value,"chosen") + end + end return r, pos end -- Gets a mapping of train id's to indexes of trains that stand or drive over -- returns (table with train_id->index) function o.get_trains_at(ppos) local pos = advtrains.round_vector_floor_y(ppos) - local t = occget(pos) - if not t then return {} end - local r = {} - local i = 1 - while t[i] do - local train = advtrains.trains[t[i]] - local idx = t[i+1] - if train.end_index - 0.5 <= idx and idx <= train.index + 0.5 then - r[t[i]] = idx - end - i = i + 2 - end - return r -end - --- Gets a mapping of train id's to indexes of trains that have a path --- generated over this node --- returns (table with train_id->index) -function o.get_trains_over(ppos) - local pos = advtrains.round_vector_floor_y(ppos) - local t = occget(pos) - if not t then return {} end - local r = {} - local i = 1 - while t[i] do - local idx = t[i+1] - r[t[i]] = idx - i = i + 2 - end - return r + return o.reverse_lookup_sel(pos, "train_at_node") end advtrains.occ = o diff --git a/mods/advtrains/advtrains/path.lua b/mods/advtrains/advtrains/path.lua index f2b8a13a..76769473 100644 --- a/mods/advtrains/advtrains/path.lua +++ b/mods/advtrains/advtrains/path.lua @@ -119,7 +119,7 @@ function advtrains.path_invalidate(train, ignore_lock) if train.path then for i,p in pairs(train.path) do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(p)) + advtrains.occ.clear_all_items(train.id, advtrains.round_vector_floor_y(p)) end end train.path = nil @@ -162,7 +162,7 @@ function advtrains.path_invalidate_ahead(train, start_idx, ignore_when_passed) -- leave current node in path, it won't change. What might change is the path onward from here (e.g. switch) local i = idx + 1 while train.path[i] do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i])) + advtrains.occ.clear_specific_item(train.id, advtrains.round_vector_floor_y(train.path[i]), i) i = i+1 end train.path_ext_f=idx @@ -375,12 +375,25 @@ function advtrains.path_get_index_by_offset(train, index, offset) return c_idx + frac end + +-- The path_dist[] table contains absolute distance values for every whole index. +-- Use this function to retrieve the correct absolute distance for a fractional index value (interpolate between floor and ceil index) +-- returns: absolute distance from path item 0 +function advtrains.path_get_path_dist_fractional(train, index) + local start_index_f = atfloor(index) + local frac = index - start_index_f + -- ensure path exists + advtrains.path_get_adjacent(train, index) + local dist1, dist2 = train.path_dist[start_index_f], train.path_dist[start_index_f+1] + return dist1 + (dist2-dist1)*frac +end + local PATH_CLEAR_KEEP = 4 function advtrains.path_clear_unused(train) local i for i = train.path_ext_b, train.path_req_b - PATH_CLEAR_KEEP do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i])) + advtrains.occ.clear_specific_item(train.id, advtrains.round_vector_floor_y(train.path[i]), i) train.path[i] = nil train.path_dist[i-1] = nil train.path_cp[i] = nil @@ -421,18 +434,19 @@ end -- Projects the path of "train" onto the path of "onto_train_id", and returns the index on onto_train's path -- that corresponds to "index" on "train"'s path, as well as whether both trains face each other -- index may be fractional +-- heuristic: see advtrains.occ.reverse_lookup_sel() -- returns: res_index, trains_facing -- returns nil when path can not be projected, either because trains are on different tracks or -- node at "index" happens to be on a turnout and it's the wrong direction -- Note - duplicate with similar functionality is in train_step_b() - that code combines train detection with projecting -function advtrains.path_project(train, index, onto_train_id) +function advtrains.path_project(train, index, onto_train_id, heuristic) local base_idx = atfloor(index) local frac_part = index - base_idx local base_pos = advtrains.path_get(train, base_idx) local base_cn = train.path_cn[base_idx] local otrn = advtrains.trains[onto_train_id] -- query occupation - local occ = advtrains.occ.get_trains_over(base_pos) + local occ = advtrains.occ.reverse_lookup_sel(base_pos, heuristic) -- is wanted train id contained? local ob_idx = occ[onto_train_id] if not ob_idx then diff --git a/mods/advtrains/advtrains/po/README.md b/mods/advtrains/advtrains/po/README.md new file mode 100644 index 00000000..3e94682c --- /dev/null +++ b/mods/advtrains/advtrains/po/README.md @@ -0,0 +1,70 @@ +# Translations +Please read this document before working on any translations. + +Unlike many other mods, Advtrains uses `.po` files for localization, +which are then automatically converted to `.tr` files when the mod is +loaded. Therefore, please submit patches that edit the `.po` files. + +## Getting Started +The translation files can be edited like any other `.po` file. + +If the translation file for your language does not exist, create it by +copying `template.txt` to `advtrains.XX.tr`, where `XX` is replaced by +the language code. + +Feel free to use the [discussion mailing list][srht-discuss] if you +have any questions regarding localization. + +You can share your `.po` file directly or [as a patch][gsm] to the [dev +mailing list][srht-devel]. The latter is encouraged, but, unlike code +changes, translation files sent directly are also accepted. + +[tr-format]: https://minetest.gitlab.io/minetest/translations/#translation-file-format +[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss +[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel +[gsm]: https://git-send-email.io + +## Translation Notes +* Translations should be consistent. You can use other entries or the +translations in Minetest as a reference. +* Translations do not have to fully correspond to the original text - +they only need to provide the same information. In particular, +translations do not need to have the same linguistical structure as the +original text. +* Replacement sequences (`@1`, `@2`, etc) should not be translated. +* Certain abbreviations or names, such as "Ks" or "Zs 3", should +generally not be translated. + +### (de) German +* Verwenden Sie die neue Rechtschreibung und die Sie-Form. +* Mit der deutschen Tastaturbelegung unter Linux können die +Anführungszeichen „“ mit AltGr-V bzw. AltGr-B eingegeben werden. + +### (zh) Chinese +(This section is written in English to avoid writing the note twice or +using only one of the variants, as most of this section applies to both +the traditional and simplified variants.) + +* Please use the 「」 quotation marks for Traditional Chinese and “” +for Simplified Chinese. +* Please use the fullwidth variants of: , 、 。 ? ! : ; +* Please use the halfwidth variants of: ( ) [ ] / \ | +* Please do not leave any space between Han characters (including +fullwidth punctuation marks). +* Please leave a space between Han characters (excluding fullwidth +punctuation marks) and characters from other scripts (including +halfwidth punctuation marks). However, do not leave any space between +Han characters and Arabic numerals. + +## Notes for developers +* The `update-translations.sh` script can be used to update the +translation files. However, please make sure to install the +`basic_trains` mod before running the script. +* Please make sure that the first argument to `S` (or `attrans`) _only_ +includes string literals without formatting or concatenation. This is +unfortunately a limitation of the `xgettext` utility. +* Avoid word-by-word translations. +* Avoid manipulating translated strings (except for concatenation). Use +server-side translations if you have to modify the text sent to users. +* Avoid truncating strings unless multibyte characters are handled +properly. diff --git a/mods/advtrains/advtrains/po/advtrains.pot b/mods/advtrains/advtrains/po/advtrains.pot new file mode 100644 index 00000000..6fda1d7d --- /dev/null +++ b/mods/advtrains/advtrains/po/advtrains.pot @@ -0,0 +1,632 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the advtrains package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "" diff --git a/mods/advtrains/advtrains/po/de.po b/mods/advtrains/advtrains/po/de.po new file mode 100644 index 00000000..8821fe38 --- /dev/null +++ b/mods/advtrains/advtrains/po/de.po @@ -0,0 +1,724 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:18+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Zugbeeinflussungsgleis in Betriebsart „@1“\n" +"Befehl: @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Befehl" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Befehl (wenn aktiviert)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline-Kanal" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "Speichern" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt " +"werden." + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "" +"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum " +"Ausstieg gezwungen." + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht " +"zum Ausstieg gezwungen." + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Zugbeeinflussung: Unbekannter Befehl: @1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Werkzeug zur Erstellung von Zugkopien\n" +"\n" +"Linksklick: Zug ins Clipboard kopieren\n" +"Right-click: Kopierten Zug einfügen" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Ihnen fehlt das „@1“-Privileg." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des " +"Zuges nicht eingefügt werden." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Das Clipboard ist leer." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" +"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden " +"kann." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht " +"kopiert werden." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Der Zug wurde Kopiert." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Schraubenkupplung" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenbergkupplung" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "Sie dürfen ohne das „train_operator“-Privileg keine Züge ankuppeln." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)." + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "Führerstand" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Niedriger @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Hoher @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Hoher @1-Bahnsteig (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Niedriger @1-Bahnsteig (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen " +"bauen." + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren." + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Mechanisches Signal" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Lichtsignal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "An der linken Seite montiertes Signal" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "An der rechten Seite montiertes Signal" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "An der Decke montiertes Signal" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Andreaskreuz" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"Gleiswerkzeug\n" +"\n" +"Linksklick: Gleistyp ändern\n" +"Rechtsklick: Objekt drehen" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden." + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "Dieses Gleis kann nicht gedreht werden." + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden." + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "Dieses Gleis kann nicht geändert werden." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Dieses Gleis kann nicht entfernt werden." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Ein Zug steht an dieser Position." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Hier ist ein Signal-Beeinflussungspunkt." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1 Steigung" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block." + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "Es kann nicht platziert werden: Diese Position ist besetzt." + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es " +"werden insgesamt @1 benötigt." + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" +"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht " +"definiert." + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" +"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende " +"der Steigung." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "Das Inventar dieses Waggons ist nicht leer." + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können." + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. " +"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Inventar Zeigen" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Waggon-Einstellungen" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Aussteigen" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Ausstieg zwingen" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Türen geschlossen)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "In diesem Waggon ist kein Sitzplatz vorhanden." + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "Der Waggon ist voll." + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "Die Türen sind geschlossen." + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "Sie können nicht in diesen Waggon einsteigen." + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Wählen Sie einen Sitzplatz aus:" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Waggon-Einstellungen speichern" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Äußere Anzeige" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Innere Anzeige" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Linie" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" +"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz " +"geschlossener Türen auszusteigen." + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "Sie haben keinen Zugang zum Führerstand." + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "Geschwindigkeitskontrolle: @1" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren." + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "Sie dürfen dieses Gleis nicht konfigurieren." + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "Geschwindigkeitskontrollgleis" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Kennzeichen der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Name der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Zeit für die Türschließung" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Zielgeschwindigkeit bei Abfahrt" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Gleis" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Wartezeit" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "Türseite" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "Zug Umkehren" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "Fahrgäste zum Ausstieg zwingen" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" +"Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird von " +"@2 verwaltet." + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" +"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen." + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "Gleis zur Kennzeichnung einer Haltestelle" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "Nicht konfiguierter LuaATC-Bauteil" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" +"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren." + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "LuaATC-Bauteil mit Fehlermeldung: @1" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" +"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche " +"Programme ausführen)" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"PC-Benennungswerkzeug\n" +"\n" +"Rechtsklick zur Benennung der passiven Komponente." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "Sie dürfen ohne das „@1“ keinen passiven LuaATC-Bauteil benennen." + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Führerstand Rechts" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Führerstand Links" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Große Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Tankwaggon" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Holztransportwaggon" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Waggonzwischenverbindung Japanischer Personenzüge" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Führerstand" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Japanische Personenzug-Lokomotive" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Japanischer Personenzug-Passagierwaggon" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Dampflokomotive" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "Detaillierte Dampflokomotive" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Passagierwaggon" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Güterwaggon" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "U-Bahn-Waggon" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Y-Weiche" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Dreiwegweiche" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Kreuzung mit zueinander orthogonalen Gleisen" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Kreuzung mit einem achsenparallelen Gleis" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Diagonale Gleiskreuzung" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Prellbock" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Zugbeeinflussungsgleis" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Abladungsgleis" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Beladungsgleis" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Detektorgleis" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n" +#~ "Kanal: @2" + +#~ msgid "Access to @1" +#~ msgstr "Zugang zu @1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind " +#~ "geschlossen." + +#~ msgid "Can't place: protected position!" +#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt." + +#~ msgid "Default Seat" +#~ msgstr "Standardsitzplatz" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Standardsitzplatz (Führerstand)" + +#~ msgid "Deprecated Track" +#~ msgstr "ausrangiertes Gleis, nicht verwenden." + +#~ msgid "Lock couples" +#~ msgstr "Kupplungen sperren" + +#~ msgid "Speed:" +#~ msgstr "Geschw.:" + +#~ msgid "Target:" +#~ msgstr "Zielges.:" + +#~ msgid "This position is protected!" +#~ msgstr "Diese Position ist geschützt!" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen " +#~ "einzusteigen." + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln." diff --git a/mods/advtrains/advtrains/po/fr.po b/mods/advtrains/advtrains/po/fr.po new file mode 100644 index 00000000..c744d2ca --- /dev/null +++ b/mods/advtrains/advtrains/po/fr.po @@ -0,0 +1,728 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2024-11-02 21:31+0100\n" +"Last-Translator: Tanavit \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "Controlleur ATC, non-configuré" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Controlleur ATC, mode @1\n" +"Commande : @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Commande" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Commande (marche)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Canal Digiline" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "Sauvegarder" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" +"Attention : Commande ATC de renversement impossible car le train se déplace." + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "Avertissement commande ATC Éjecter : portes closes." + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "Avertissement commande ATC Éjecter : train en mouvement." + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Outil de copie/collage de train\n" +"\n" +"Clic-Gauche : copie\n" +"\n" +"Clic-Droit : collage" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Vous ne possédez pas le privilège \"@1\"." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Le presse-papier est vide." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "La fin du train serait hors voie : annulation." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "Pas de telle entité lua." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Pas de tel wagon : @1." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Pas de tel train : @1." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Train copié." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Attelage à tampon et vis" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Attelage Scharfenberg" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" +"Vous n'êtes pas autorisé à coupler des trains sans le privilège " +"\"train_operator\"." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" +"Accouplement impossible: les attelages des trains ne concordent pas (@1 et " +"@2)." + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "Chaudière à vapeur" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "Cabine de pilotage" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "Roue" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "Cheminée" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Quai @1 (bas)" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Quai @1 (haut)" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Quai @1 (haut, 45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Quai @1 (bas, 45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "Possibilité de poser, retirer ou opérer les trains" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" +"Possibilité de poser, retirer ou opérer un quelconque train, indépendamment " +"du propriétaire, de la liste blanche ou de protection" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "Possibilité de poser ou retirer des voies dans les zones non protégées" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" +"Possibilité d'opérer des embranchements et signaux dans les zones non " +"protégées" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie sans le privilège " +"\"track_builder\" (?)" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement " +"protégé." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège " +"\"railway_operator\" manquant)" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Sémaphore" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Signal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "Signal mural (gauche)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "Signal mural (droit)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "Signal mural (plafond)" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Croix de Saint André" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"Outil \"Trackworker\"\n" +"\n" +"Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n" +"\n" +"Clic-Droit : tourne l'objet" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\"." + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "Cette voie ne peut pas être tournée." + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\"." + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "Cette voie ne peut pas être modifiée." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Cette voie ne peut pas être enlevée." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Cet emplacement est occupé par un train." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Il y a un \"Track Circuit Break\" ici." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Il y a un \"Signal Influence Point\" ici." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "Pente @1" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "Placement impossible : ne pointe pas un nœud." + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "Placement impossible : espace occupé." + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)." + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1." + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" +"Franchissement de signal rouge : examinez la situation et inversez le sens " +"de marche du train." + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "Le stock de ce wagon n'est pas vide." + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" +"Les wagons doivent être désaccouplés des autres pour pouvoir être détruits." + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Attention: Si vous détruisez ce wagon, vous ne récupérerez que de la " +"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement " +"(Sneak)\" et Clic-Gauche." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Montrer le stock" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "Ordinateur embarqué" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Propriétés du wagon" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Débarquer" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Débarquer (de force)" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Portes closes)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "Ce wagon n'a pas de siège." + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "Ce wagon est plein." + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "Portes closes : (Essayez la \"sneak key\"!\")" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "Montée impossible dans ce wagon." + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Choisir le siège :" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Sauvegarder les propriétés du wagon" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Texte affiché à l'extérieur du train" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Texte affiché à l'intérieur du train" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Ligne" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "Code de routage" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" +"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour " +"franchir les portes et débarquer." + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "Accès interdit au poste de pilotage." + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "Point de limitation de vitesse : @1" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "Placez un point de limitation de vitesse :" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "Vous n'êtes pas autorisé à configurer cette voie sans le privilège @1." + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "Vous n'êtes pas autorisé à configurer cette voie." + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "Voie de point de limitation de vitesse" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Code de Station" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Nom de Station" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Durée d'ouverture des portes" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Vitesse de départ" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Voie" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Durée d'arrêt" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "Coté d'ouvertures des portes" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "Inversion du sens de marche" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "Éjecter les passagers" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "Le code de station \"@1\" existe et est possédé par @2." + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" +"Cette station est la propriété de @1. Vous n'êtes pas autorisé à modifier " +"son nom." + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "Voie d'arrêt en station" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "Composant LuaATC non configuré" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "Environnement LuaATC" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "Effacer l'environnement LuaATC" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "Code" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "Vous ne pouvez configurer ce composant LuaATC sans le privilege @1." + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "Composant LuaATC assigné à l'environnement '@1'" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "Composant LuaATC assigné à un environnement invalide" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "Erreur @1 du composant LuaATC" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" +"Permet le placement et la configuration de composants LuaATC avec risque " +"d'exécution de code Lua dangereux" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "Commande Mesecon de LuaATC" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "Panneau de commande de LuaATC" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"Outil de nommage de composant passif\n" +"\n" +"Clic-Droit pour nommer un composant passif." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1." + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "Nommer le composant (chaîne vide pour effacer)" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Poste de pilotage (droit)" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Poste de pilotage (gauche)" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Locomotive industrielle" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Grosse locomotive industrielle" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Wagon-citerne industriel" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Wagon grumier industriel" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Passage inter-voiture de train Japonais" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Poste de pilotage" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Motrice Japonaise" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Voiture Japonaise" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Locomotive à vapeur" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "Locomotive à vapeur complexe" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Voiture passager" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Wagon de frêt" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "Voiture de Métropolitain" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Embranchement en Y" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Embranchement triple" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Croisement perpendiculaire" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Croisement perpendiculo-diagonal" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Croisement diagonal" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Heurtoir" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Controlleur ATC" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Voie de Déchargement" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Voie de Chargement" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Voie détectrice" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Controlleur ATC, mode @1\n" +#~ "Canal : @2" + +#~ msgid "Access to @1" +#~ msgstr "Accès à @1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !" + +#~ msgid "Can't place: protected position!" +#~ msgstr "Placement impossible : emplacement protégé" + +#~ msgid "Default Seat" +#~ msgstr "Siège par défaut" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Siège par défaut (poste de pilotage)" + +#~ msgid "Deprecated Track" +#~ msgstr "Voie déconseillée" + +#~ msgid "Lock couples" +#~ msgstr "Verrouiller l'accouplement" + +#~ msgid "Speed:" +#~ msgstr "Vitesse : " + +#~ msgid "Target:" +#~ msgstr "Destination : " + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !" + +#~ msgid "This position is protected!" +#~ msgstr "Cet emplacement est protégé !" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les " +#~ "portes closes !" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer " +#~ "cet attelage." diff --git a/mods/advtrains/advtrains/po/update-translations.sh b/mods/advtrains/advtrains/po/update-translations.sh new file mode 100755 index 00000000..3a56c7ce --- /dev/null +++ b/mods/advtrains/advtrains/po/update-translations.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# NOTE: Please make sure you also have basic_trains installed, as it uses attrans for historical reasons + +PODIR=`dirname "$0"` +ATDIR="$PODIR/../.." +BTDIR="$ATDIR/../basic_trains" +POTFILE="$PODIR/advtrains.pot" + +xgettext \ + -D "$ATDIR" \ + -D "$BTDIR" \ + -d advtrains \ + -o "$POTFILE" \ + -p . \ + -L lua \ + --from-code=UTF-8 \ + --sort-by-file \ + --keyword='attrans' \ + --keyword='S' \ + --package-name='advtrains' \ + --msgid-bugs-address='advtrains-discuss@lists.sr.ht' \ + `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \ + && +for i in "$PODIR"/*.po; do + msgmerge -U \ + --sort-by-file \ + $i "$POTFILE" +done diff --git a/mods/advtrains/advtrains/po/zh_CN.po b/mods/advtrains/advtrains/po/zh_CN.po new file mode 100644 index 00000000..5bcc316c --- /dev/null +++ b/mods/advtrains/advtrains/po/zh_CN.po @@ -0,0 +1,696 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:24+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Simplified)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "ATC 控制器 (未配置)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模式:@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (激活时)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline 频道" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "保存" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:火车正在移动,无法改变行车方向。" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:车门已关闭,无法踢出乘客。" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:火车正在移动,无法踢出乘客。" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 语法错误:“I”命令不完整:@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 语法错误:未知命令:@1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火车复制工具\n" +"\n" +"左键单击:复制\n" +"右键单击:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您没有“@1”权限。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "轨道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "无法粘贴:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪贴板是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火车后部不在轨道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您没有指向一个可以用火车复制工具复制的物体。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 为“@1”的车厢不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 为“@1”的列车不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "无法复制:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "已复制列车。" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "链式车钩" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式车钩" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您没有“train_operator”权限,不能连接这两节车厢。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<没有车钩>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "锅炉" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "驾驶室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "车轮" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "烟囱" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "较低的@1站台" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "较高的@1站台" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "较高的@1站台 (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "较低的@1站台 (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在这里建造铁路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "这里已被保护,您不能在这里建造铁路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您没有“railway_operator”权限,不能控制铁路设施。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂板信号机" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "信号灯" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "壁挂式信号灯 (左侧)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "壁挂式信号灯 (右侧)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "悬挂式信号灯" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "铁路道口信号灯" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"铁路调整工具\n" +"\n" +"左键单击:切换轨道类型\n" +"右键单击:旋转方块" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "您不能使用铁路调整工具旋转这个方块。" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "您不能旋转这段轨道。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "您不能使用铁路调整工具调整这个方块。" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "您不能调整这段轨道。" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您不能移除这段轨道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "无法放置斜坡:您没有选择任何方块。" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "无法放置斜坡:此区域已被占用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "无法放置斜坡:较高端没有支撑方块。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "这是 @1 的车厢,您不能摧毁它。" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按" +"潜行键并左键单击此车厢。" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "显示物品栏" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "车厢属性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下车" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "强制下车" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(车门已关闭)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "这节车厢没有座位。" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "车厢已满。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "请选择座位:" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "保存车厢属性" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "车厢外部显示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "车厢内部显示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "火车线路" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由码" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "车门已关闭,请使用潜行+右键单击下车。" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您没有“@1”权限,不能调整这段轨道。" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您不能调整这段轨道。" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "车站代码" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "车站名称" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "车门关闭时间" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出发速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "轨道" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "停站时间" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "改变行车方向" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "车站轨道" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 部件 (未配置)" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被动元件命名工具\n" +"\n" +"右键单击命名所选元件。" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您没有“@1”权限,不能命名被动元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "右侧司机座位" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "左侧司机座位" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工业用火车头" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工业用火车头" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液体运输车厢" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木材运输车厢" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本火车车钩" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "司机座位" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列车车头" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列车车厢" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽机车" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精细的蒸汽机车" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客车" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "货运车厢" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地铁车厢" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "对称道岔" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三开道岔" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉轨道" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉轨道 (其中一条轨道与坐标轴平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉轨道" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保险杠" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸货轨道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "装货轨道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探测轨道" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模式:@1\n" +#~ "频道:@2" + +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "无法上车:车门已关闭或车厢已满。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "无法放置:此区域已被保护。" + +#~ msgid "Default Seat" +#~ msgstr "默认座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "默认座位 (司机座位)" + +#~ msgid "Deprecated Track" +#~ msgstr "请不要使用" + +#~ msgid "Lock couples" +#~ msgstr "锁定连接处" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目标速度" + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您不能使用铁路调整工具旋转这个方块。" + +#~ msgid "This position is protected!" +#~ msgstr "这里已被保护。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "请使用潜行+右键上车。" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "这里已被保护,您不能在这里建造铁路。" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。" diff --git a/mods/advtrains/advtrains/po/zh_TW.po b/mods/advtrains/advtrains/po/zh_TW.po new file mode 100644 index 00000000..ece82c3f --- /dev/null +++ b/mods/advtrains/advtrains/po/zh_TW.po @@ -0,0 +1,696 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:31+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Traditional)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "ATC 控制器 (未配置)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模式:@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (啟用時)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline 頻道" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "儲存" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:火車正在移動,無法改變行車方向。" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:車門已關閉,無法踢出乘客。" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:火車正在移動,無法踢出乘客。" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 語法錯誤:「I」命令不完整:@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 語法錯誤:未知命令:@1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火車複製工具\n" +"\n" +"左鍵單擊:複製\n" +"右鍵單擊:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您沒有「@1」許可權。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "軌道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "無法貼上:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪貼簿是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火車後部不在軌道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您沒有指向一個可以用火車複製工具複製的物體。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 為「@1」的車廂不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 為「@1」的列車不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "無法複製:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "已複製火車。" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "鏈式連結器" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式連結器" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<無連結器>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "鍋爐" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "駕駛室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "車輪" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "煙囪" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "較低的@1月臺" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "較高的@1月臺" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "較高的@1月臺 (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "較低的@1月臺 (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡建造鐵路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂木式號誌機" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "色燈號誌機" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "壁掛式色燈號誌機 (左側)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "壁掛式色燈號誌機 (右側)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "懸掛式色燈號誌機" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "平交道號誌燈" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"鐵路調整工具\n" +"\n" +"左鍵單擊:切換軌道型別\n" +"右鍵單擊:旋轉方塊" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "您不能使用鐵路調整工具旋轉這個方塊。" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "您不能旋轉這段軌道。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "您不能使用鐵路調整工具調整這個方塊。" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "您不能調整這段軌道。" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您不能移除這段軌道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "無法放置斜坡:您沒有選擇任何方塊。" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "無法放置斜坡:此區域已被佔用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "無法放置斜坡:較高階沒有支撐方塊。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "這是 @1 的車廂,您不能摧毀它。" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按" +"潛行鍵並左鍵單擊此車廂。" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "顯示物品欄" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "車廂屬性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下車" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "強制下車" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(車門已關閉)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "這節車廂沒有座位。" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "車廂已滿。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "請選擇座位:" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "儲存車廂屬性" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "車廂外部顯示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "車廂內部顯示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "火車線路" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由碼" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "車門已關閉,請使用潛行+右鍵單擊下車。" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您沒有「@1」許可權,不能調整這段軌道。" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您不能調整這段軌道。" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "車站碼" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "車站名稱" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "車門關閉時間" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出發速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "軌道" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "停站時間" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "改變行車方向" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "車站軌道" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 元件 (未配置)" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被動元件命名工具\n" +"\n" +"右鍵單擊命名所選元件。" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您沒有「@1」許可權,不能命名這個元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "右側司機座位" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "左側司機座位" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工業用火車頭" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工業用火車頭" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液體運輸車廂" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木材運輸車廂" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本火車連結器" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "司機座位" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列車車頭" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列車車廂" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽機車" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精細的蒸汽機車" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客車" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "貨運車廂" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地鐵車廂" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "對稱道岔" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三開道岔" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉軌道" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉軌道 (其中一條軌道與座標軸平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉軌道" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保險槓" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸貨軌道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "裝貨軌道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探測軌道" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模式:@1\n" +#~ "頻道:@2" + +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "無法上車:車門已關閉或車廂已滿。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "無法放置:此區域已被保護。" + +#~ msgid "Default Seat" +#~ msgstr "預設座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "預設座位 (司機座位)" + +#~ msgid "Deprecated Track" +#~ msgstr "請不要使用" + +#~ msgid "Lock couples" +#~ msgstr "鎖定連結處" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目標速度" + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。" + +#~ msgid "This position is protected!" +#~ msgstr "這裡已被保護。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "請使用潛行+右鍵上車。" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。" diff --git a/mods/advtrains/advtrains/poconvert.lua b/mods/advtrains/advtrains/poconvert.lua new file mode 100644 index 00000000..74f962ee --- /dev/null +++ b/mods/advtrains/advtrains/poconvert.lua @@ -0,0 +1,185 @@ +local unescape_string +do + local schartbl = { -- https://en.wikipedia.org/wiki/Escape_sequences_in_C + a = "\a", + b = "\b", + e = string.char(0x1b), + f = "\f", + n = "\n", + r = "\r", + t = "\t", + v = "\v", + } + local function replace_single(pfx, c) + local pl = #pfx + if pl % 2 == 0 then + return string.sub(pfx, 1, pl/2) .. c + end + return string.sub(pfx, 1, math.floor(pl/2)) .. (schartbl[c] or c) + end + unescape_string = function(str) + return string.gsub(str, [[(\+)([abefnrtv'"?])]], replace_single) + end +end + +local function readstring_aux(str, pos) + local _, spos = string.find(str, [[^%s*"]], pos) + if not spos then + return nil + end + local ipos = spos + while true do + local _, epos, m = string.find(str, [[(\*)"]], ipos+1) + if not epos then + return error("String extends beyond the end of input") + end + ipos = epos + if #m % 2 == 0 then + return unescape_string(string.sub(str, spos+1, epos-1)), epos+1 + end + end +end + +local function readstring(str, pos) + local st = {} + local nxt = pos + while true do + local s, npos = readstring_aux(str, nxt) + if not s then + if not st[1] then + return nil, nxt + else + return table.concat(st), nxt + end + end + nxt = npos + table.insert(st, s) + end +end + +local function readtoken(str, pos) + local _, epos, tok = string.find(str, [[^%s*(%S+)]], pos) + if epos == nil then + return nil, pos + end + return tok, epos+1 +end + +local function readcomment_add_flags(flags, s) + for flag in string.gmatch(s, ",%s*([^,]+)") do + flags[flag] = true + end +end + +local function readcomment_aux(str, pos) + local _, epos, sval = string.find(str, "^\n*#([^\n]*)", pos) + if not epos then + return nil + end + return sval, epos+1 +end + +local function readcomment(str, pos) + local st = {} + local nxt = pos + local flags = {} + while true do + local s, npos = readcomment_aux(str, nxt) + if not npos then + local t = { + comment = table.concat(st, "\n"), + flags = flags, + } + return t, nxt + end + if string.sub(s, 1, 1) == "," then + readcomment_add_flags(flags, s) + end + table.insert(st, s) + nxt = npos + end +end + +local function readpo(str) + local st = {} + local pos = 1 + while true do + local entry, nxt = readcomment(str, pos) + local msglines = 0 + while true do + local tok, npos = readtoken(str, nxt) + if tok == nil or string.sub(tok, 1, 1) == "#" then + break + elseif string.sub(tok, 1, 3) ~= "msg" then + return error("Invalid token: " .. tok) + elseif entry[tok] ~= nil then + break + else + local value, npos = readstring(str, npos) + assert(value ~= nil, "No string provided for " .. tok) + entry[tok] = value + nxt = npos + msglines = msglines+1 + end + end + if msglines == 0 then + return st + elseif entry.msgid ~= "" then + assert(entry.msgid ~= nil, "Missing untranslated string") + assert(entry.msgstr ~= nil, "Missing translated string") + table.insert(st, entry) + end + pos = nxt + end +end + +local escape_lookup = { + ["="] = "@=", + ["\n"] = "@n" +} +local function escape_string(st) + return (string.gsub(st, "[=\n]", escape_lookup)) +end + +local function convert_po_string(textdomain, str) + local st = {string.format("# textdomain: %s", textdomain)} + for _, entry in ipairs(readpo(str)) do + local line = ("%s=%s"):format(escape_string(entry.msgid), escape_string(entry.msgstr)) + if entry.flags.fuzzy then + line = "#" .. line + end + table.insert(st, line) + end + return table.concat(st, "\n") +end + +local function convert_po_file(textdomain, inpath, outpath) + local f, err = io.open(inpath, "rb") + assert(f, err) + local str = convert_po_string(textdomain, f:read("*a")) + f:close() + minetest.safe_file_write(outpath, str) + return str +end + +local function convert_flat_po_directory(textdomain, modpath) + assert(textdomain, "No textdomain specified for po file conversion") + local mp = modpath or minetest.get_modpath(textdomain) + assert(mp ~= nil, "No path to write for " .. textdomain) + local popath = mp .. "/po" + local trpath = mp .. "/locale" + for _, infile in pairs(minetest.get_dir_list(popath, false)) do + local lang = string.match(infile, [[^([^%.]+)%.po$]]) + if lang then + local inpath = popath .. "/" .. infile + local outpath = ("%s/%s.%s.tr"):format(trpath, textdomain, lang) + convert_po_file(textdomain, inpath, outpath) + end + end +end + +return { + from_string = convert_po_string, + from_file = convert_po_file, + from_flat = convert_flat_po_directory, +} diff --git a/mods/advtrains/advtrains/protection.lua b/mods/advtrains/advtrains/protection.lua index 7474977a..ac1cd66a 100644 --- a/mods/advtrains/advtrains/protection.lua +++ b/mods/advtrains/advtrains/protection.lua @@ -4,24 +4,24 @@ -- Privileges to control TRAIN DRIVING/COUPLING minetest.register_privilege("train_operator", { - description = "Without this privilege, a player can't do anything about trains, neither place or remove them nor drive or couple them (but he can build tracks if he has track_builder)", + description = attrans("Can place, remove and operate trains"), give_to_singleplayer= true, }); minetest.register_privilege("train_admin", { - description = "Player may drive, place or remove any trains from/to anywhere, regardless of owner, whitelist or protection", + description = attrans("Can place, remove and operate any train, regardless of owner, whitelist, or protection"), give_to_singleplayer= true, }); -- Privileges to control TRACK BUILDING minetest.register_privilege("track_builder", { - description = "Player can place and/or dig rails not protected from him. If he also has protection_bypass, he can place/dig any rails", + description = attrans("Can place and dig tracks in unprotected areas"), give_to_singleplayer= true, }); -- Privileges to control OPERATING TURNOUTS/SIGNALS minetest.register_privilege("railway_operator", { - description = "Player can operate turnouts and signals not protected from him. If he also has protection_bypass, he can operate any turnouts/signals", + description = attrans("Can operate turnouts and signals in unprotected areas"), give_to_singleplayer= true, }); @@ -145,12 +145,12 @@ function advtrains.check_track_protection(pos, pname, near, prot_p) --atdebug("CTP: ",pos,pname,near,prot_p,"priv=",priv,"prot=",prot,"dprot=",dprot) if not priv and (not boo or prot or not dprot) then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks without track_builder privilege") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks without the track_builder privilege.") or attrans("You are not allowed to build tracks without the track_builder privilege.")) minetest.log("action", pname.." tried to modify terrain "..nears.."track at "..minetest.pos_to_string(apos).." but is not permitted to (no privilege)") return false end if prot then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks at protected position!") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks at this protected position.") or attrans("You are not allowed to build tracks at this protected position.")) minetest.record_protection_violation(pos, pname) minetest.log("action", pname.." tried to modify "..nears.."track at "..minetest.pos_to_string(apos).." but position is protected!") return false @@ -181,7 +181,7 @@ function advtrains.check_turnout_signal_protection(pos, pname) nocheck=false return true else - minetest.chat_send_player(pname, "You are not allowed to operate turnouts and signals (missing railway_operator privilege)") + minetest.chat_send_player(pname, attrans("You are not allowed to operate turnouts and signals without the railway_operator privilege.")) minetest.log("action", pname.." tried to operate turnout/signal at "..minetest.pos_to_string(pos).." but does not have railway_operator") nocheck=false return false diff --git a/mods/advtrains/advtrains/settingtypes.txt b/mods/advtrains/advtrains/settingtypes.txt index 2b627cb5..a495d1e4 100644 --- a/mods/advtrains/advtrains/settingtypes.txt +++ b/mods/advtrains/advtrains/settingtypes.txt @@ -61,3 +61,6 @@ advtrains_save_interval (Save Interval) int 60 20 3600 # If enabled, trains only collide with nodes with "normal" drawtype. advtrains_forgiving_collision (Forgiving Collision mode) bool false +# Enable universal couplers for wagons +# If enabled, wagons will bypass the checks that compare the coupler types when coupling. +advtrains_universal_couplers (Universal Couplers) bool false \ No newline at end of file diff --git a/mods/advtrains/advtrains/signals.lua b/mods/advtrains/advtrains/signals.lua index b26c9500..c03afbf6 100644 --- a/mods/advtrains/advtrains/signals.lua +++ b/mods/advtrains/advtrains/signals.lua @@ -60,7 +60,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_retrosignal.png"}, inventory_image="advtrains_retrosignal_inv.png", drop="advtrains:retrosignal_off", - description=attrans("Lampless Signal (@1)", attrans(r..rotation)), + description=attrans("Lampless Signal"), sunlight_propagates=true, groups = { cracky=3, @@ -124,7 +124,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_signal_"..r..".png"}, inventory_image="advtrains_signal_inv.png", drop="advtrains:signal_off", - description=attrans("Signal (@1)", attrans(r..rotation)), + description=attrans("Signal"), groups = { cracky=3, not_blocking_trains=1, @@ -187,6 +187,11 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", if r=="off" then crea=0 end --tunnel signals. no rotations. + local swdesc = { -- needed for xgettext + l = attrans("Wallmounted Signal (left)"), + r = attrans("Wallmounted Signal (right)"), + t = attrans("Wallmounted Signal (top)"), + } for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, { drawtype = "mesh", @@ -200,7 +205,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", mesh = "advtrains_signal_wall_"..loc..".b3d", tiles = {"advtrains_signal_wall_"..r..".png"}, drop="advtrains:signal_wall_"..loc.."_off", - description=attrans("Wallmounted Signal ("..loc..")"), + description=swdesc[loc], groups = { cracky=3, not_blocking_trains=1, @@ -314,7 +319,7 @@ minetest.register_node("advtrains:across_on", { mesh = "advtrains_across.obj", tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}}, drop="advtrains:across_off", - description=attrans("Andrew's Cross (on) (you hacker you)"), + description=attrans("Andrew's Cross"), groups = { cracky=3, not_blocking_trains=1, diff --git a/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg b/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg index 74df6692..2b441ae7 100644 Binary files a/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg and b/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg differ diff --git a/mods/advtrains/advtrains/spec/poconvert_spec.lua b/mods/advtrains/advtrains/spec/poconvert_spec.lua new file mode 100644 index 00000000..51f33e7c --- /dev/null +++ b/mods/advtrains/advtrains/spec/poconvert_spec.lua @@ -0,0 +1,70 @@ +package.path = "../?.lua;" .. package.path +advtrains = {} +_G.advtrains = advtrains +local poconvert = require("poconvert") + +describe("PO file converter", function() + it("should convert PO files", function() + assert.equals([[ +# textdomain: foo +foo=bar +baz= +#@=wh\at\\@n=@=w\as\\@n +multiline@nstrings=multiline@nresult +with context?=oder doch nicht]], poconvert.from_string("foo", [[ +msgid "" +msgstr "whatever metadata" + +msgid "foo" +msgstr "bar" + +msgid "baz" +msgstr "" + +#, fuzzy +msgid "=wh\\at\\\\\n" +msgstr "=w\\as\\\\\n" + +msgid "multi" +"line\n" +"strings" +msgstr "multi" +"line\n" +"result" + +msgctxt "i18n context" +msgid "with context?" +msgstr "oder doch nicht"]])) + end) + it("should reject invalid tokens", function() + assert.has.errors(function() + poconvert.from_string("", [[ +foo "" +bar ""]]) + end, "Invalid token: foo") + end) + it("should reject entries without a msgstr", function() + assert.has.errors(function() + poconvert.from_string("", [[msgid "foo"]]) + end, "Missing translated string") + end) + it("should reject entries without a msgid", function() + assert.has.errors(function() + poconvert.from_string("", [[msgstr "foo"]]) + end, "Missing untranslated string") + end) + it("should reject entries with improperly enclosed strings", function() + assert.has.errors(function() + poconvert.from_string("", [[ +msgid "foo" +msgstr "bar \]]) + end, "String extends beyond the end of input") + end) + it("should reject incomplete input", function() + assert.has.errors(function() + poconvert.from_string("", [[ +msgid "foo" +msgstr]]) + end, "No string provided for msgstr") + end) +end) diff --git a/mods/advtrains/advtrains/spec/texture_spec.lua b/mods/advtrains/advtrains/spec/texture_spec.lua new file mode 100644 index 00000000..2e3bd5d0 --- /dev/null +++ b/mods/advtrains/advtrains/spec/texture_spec.lua @@ -0,0 +1,19 @@ +package.path = "../?.lua;" .. package.path +local T = require "texture" + +describe("Texture creation", function() + it("works", function() + assert.same("^.png", tostring(T.raw"^.png")) + assert.same("foo\\:bar.png", tostring(T"foo:bar.png")) + end) +end) + +describe("Texture modifiers", function() + it("work", function() + assert.same("x^[colorize:c", tostring(T"x":colorize"c")) + assert.same("x^[colorize:c:alpha", tostring(T"x":colorize("c", "alpha"))) + assert.same("x^[multiply:c", tostring(T"x":multiply"c")) + assert.same("x^[resize:2x3", tostring(T"x":resize(2, 3))) + assert.same("x^[transformI", tostring(T"x":transform"I")) + end) +end) diff --git a/mods/advtrains/advtrains/spec/wagons_spec.lua b/mods/advtrains/advtrains/spec/wagons_spec.lua new file mode 100644 index 00000000..df0687be --- /dev/null +++ b/mods/advtrains/advtrains/spec/wagons_spec.lua @@ -0,0 +1,40 @@ +require "mineunit" +mineunit "core" + +_G.advtrains = { + wagon_load_range = 32 +} +sourcefile "wagons" + +local myproto = {_test = true} +advtrains.register_wagon(":mywagon", myproto, "My wagon", "", false) +advtrains.register_wagon_alias(":myalias", ":mywagon") +advtrains.register_wagon_alias(":myotheralias", ":myalias") + +local myotherproto = {_other = true} +advtrains.register_wagon(":noalias", myotherproto, "Not aliased wagon", "", false) +advtrains.register_wagon_alias(":noalias", ":mywagon") + +advtrains.register_wagon_alias(":nilalias", ":nil") + +advtrains.register_wagon_alias(":R1", ":R2") +advtrains.register_wagon_alias(":R2", ":R3") +advtrains.register_wagon_alias(":R3", ":R1") + +describe("wagon alias system", function() + it("should work", function() + assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myalias")}) + assert.equal(myproto, advtrains.wagon_prototypes[":myalias"]) + assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myotheralias")}) + end) + it("should respect wagon registration", function() + assert.same({":noalias", myotherproto}, {advtrains.resolve_wagon_alias(":noalias")}) + end) + it("should handle recursive loops", function() + assert.same({}, {advtrains.resolve_wagon_alias(":R1")}) + end) + it("should return nil for missing entries", function() + assert.same({}, {advtrains.resolve_wagon_alias(":what")}) + assert.same({}, {advtrains.resolve_wagon_alias(":nilalias")}) + end) +end) diff --git a/mods/advtrains/advtrains/texture.lua b/mods/advtrains/advtrains/texture.lua new file mode 100644 index 00000000..e6d83b06 --- /dev/null +++ b/mods/advtrains/advtrains/texture.lua @@ -0,0 +1,228 @@ +local tx = {} +setmetatable(tx, {__call = function(_, ...) return tx.base(...) end}) + +function tx.escape(str) + return (string.gsub(tostring(str), [[([%^:\])]], [[\%1]])) +end + +local function getargs(...) + return select("#", ...), {...} +end + +local function curry(f, x) + return function(...) + return f(x, ...) + end +end + +local function xmkmodifier(func) + return function(self, ...) + table.insert(self, (func(...))) + return self + end +end + +local function mkmodifier(fmt, spec) + return xmkmodifier(function(...) + local count = select("#", ...) + local args = {...} + for k, f in pairs(spec) do + args[k] = f(args[k]) + end + return string.format(fmt, unpack(args, 1, count)) + end) +end + +-- Texture object +local tx_lib = {} +local tx_mt = { + __index = tx_lib, + __tostring = function(self) + return table.concat(self, "^") + end, + __concat = function(a, b) + return tx.raw(("%s^%s"):format(tostring(a), tostring(b))) + end, +} + +function tx.raw(str) + return setmetatable({str}, tx_mt) +end +function tx.base(str) + return tx.raw(tx.escape(str)) +end +-- TODO: use [fill when 5.8.0 becomes widely used client-side +function tx.fill(w, h, color) + return tx"advtrains_hud_bg.png":resize(w, h):colorize(color) +end + +-- Most texture modifiers +tx_lib.colorize = xmkmodifier(function(c, a) + local str = ("[colorize:%s"):format(tx.escape(c)) + if a then + str = str .. ":" .. a + end + return str +end) +tx_lib.multiply = mkmodifier("[multiply:%s", {tx.escape}) +tx_lib.resize = mkmodifier("[resize:%dx%d", {}) +tx_lib.transform = mkmodifier("[transform%s", {tx.escape}) + +-- [combine + +local combine = {} + +function combine:add(x, y, ent) + table.insert(self.st, ([[%d,%d=%s]]):format(x, y, tx.escape(tostring(ent)))) + return self +end + +local combine_mt = { + __index = combine, + __tostring = function(self) + return table.concat(self.st, ":") + end, +} + +function tx.combine(w, h, bg) + local base = ("[combine:%dx%d"):format(w, h) + local obj = setmetatable({width = w, height = h, st = {base}}, combine_mt) + if bg then + obj:add_fill(0, 0, w, h, bg) + end + return obj +end + +function combine:add_fill(x, y, ...) + return self:add(x, y, tx.fill(...)) +end + +local function add_multicolor_fill(n, self, x, y, w, h, ...) + local argc, argv = getargs(...) + local t = 0 + for k = 1, argc, 2 do + t = t + argv[k] + end + local newargs = {x, y, w, h} + local sk, wk = n, n+2 + local s = newargs[wk]/t + for k = 1, argc, 2 do + local v = argv[k] * s + newargs[wk] = v + newargs[5] = argv[k+1] + self:add_fill(unpack(newargs)) + newargs[sk] = newargs[sk] + v + end + return self +end +combine.add_multicolor_fill_topdown = curry(add_multicolor_fill, 2) +combine.add_multicolor_fill_leftright = curry(add_multicolor_fill, 1) + +local function add_segmentbar(n, self, x, y, w, h, m, c, ...) + local argc, argv = getargs(...) + local baseargs = {x, y, w, h} + local ss = (baseargs[n+2]+m)/c + local bs = ss - m + for k = 1, argc, 3 do + local lower, upper, fill = argv[k], argv[k+1], argv[k+2] + lower = math.max(0, math.floor(lower))+1 + upper = math.min(c, math.floor(upper)) + if lower <= upper then + local args = {x, y, w, h, fill} + args[n+2] = bs + args[n] = args[n] + ss*(lower-1) + for i = lower, upper do + self:add_fill(unpack(args)) + args[n] = args[n] + ss + end + end + end + return self +end +combine.add_segmentbar_topdown = curry(add_segmentbar, 2) +combine.add_segmentbar_leftright = curry(add_segmentbar, 1) + +local function add_lever(n, self, x, y, w, h, hs, ss, val, hf, sf) + local baseargs = {x, y, w, h} + local sargs = {x, y, w, h, sf} + sargs[5-n] = ss + sargs[n+2] = baseargs[n+2] + ss - hs + for k = 1, 2 do + sargs[k] = baseargs[k] + (baseargs[k+2] - sargs[k+2])/2 + end + self:add_fill(unpack(sargs)) + local hargs = {x, y, w, h, hf} + hargs[n+2] = hs + hargs[n] = baseargs[n] + (baseargs[n+2]-hs)*val + self:add_fill(unpack(hargs)) + return self +end +combine.add_lever_topdown = curry(add_lever, 2) +combine.add_lever_leftright = curry(add_lever, 1) + +--[[ Seven-segment display + -1- +6 2 + -7- +5 3 + -4- +--]] +local sevenseg_digits = { + ["0"] = {1, 2, 3, 4, 5, 6}, + ["1"] = {2, 3}, + ["2"] = {1, 2, 4, 5, 7}, + ["3"] = {1, 2, 3, 4, 7}, + ["4"] = {2, 3, 6, 7}, + ["5"] = {1, 3, 4, 6, 7}, + ["6"] = {1, 3, 4, 5, 6, 7}, + ["7"] = {1, 2, 3}, + ["8"] = {1, 2, 3, 4, 5, 6, 7}, + ["9"] = {1, 2, 3, 4, 6, 7}, +} + +function combine:add_str7seg(x0, y0, tw, th, str, fill) + --[[ w and h (as width/height of individual (horizontal) segments) have the following properties: + tw = n(w+3h)-h + th = 2w+3h + --]] + local len = #str + local h = (2*tw-len*th)/(3*len-2) + local w = (th-3*h)/2 + local ws = w+3*h + local segs = { + {h, 0, w, h}, + {w+h, h, h, w}, + {w+h, w+2*h, h, w}, + {h, 2*(w+h), w, h}, + {0, w+2*h, h, w}, + {0, h, h, w}, + {h, w+h, w, h}, + } + for i = 1, len do + for _, k in pairs(sevenseg_digits[string.sub(str, i, i)] or {}) do + local s = segs[k] + self:add_fill(s[1]+x0, s[2]+y0, s[3], s[4], fill) + end + x0 = x0 + ws + end + return self +end + +function combine:add_n7seg(x, y, w, h, n, prec, ...) + if not (type(n) == "number" and type(prec) == "number") then + error("passed non-numeric value or precision to numeric display") + elseif prec < 0 then + error("negative length") + end + local pfx = "" + if n >= 0 then + n = math.min(10^prec-1, n) + else + n = math.min(10^(prec-1)-1, -n) + pfx = "-" + end + local str = ("%d"):format(n) + return self:add_str7seg(x, y, w, h, pfx .. ("0"):rep(prec-#str-#pfx) .. str, ...) +end + +return tx diff --git a/mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png b/mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png new file mode 100644 index 00000000..6352c557 Binary files /dev/null and b/mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png differ diff --git a/mods/advtrains/advtrains/trackplacer.lua b/mods/advtrains/advtrains/trackplacer.lua index fe762909..25880887 100644 --- a/mods/advtrains/advtrains/trackplacer.lua +++ b/mods/advtrains/advtrains/trackplacer.lua @@ -275,11 +275,24 @@ function tp.register_track_placer(nnprefix, imgprefix, dispname, def) groups={advtrains_trackplacer=1, digtron_on_place=1}, liquids_pointable = def.liquids_pointable, on_place = function(itemstack, placer, pointed_thing) - local name = placer:get_player_name() - if not name then - return itemstack, false - end if pointed_thing.type=="node" then + do + local pointed_pos = pointed_thing.under + local pointed_node = minetest.get_node(pointed_pos) + local pointed_def = minetest.registered_nodes[pointed_node.name] + if pointed_def and pointed_def.on_rightclick then + local controls = placer:get_player_control() + if not controls.sneak then + return pointed_def.on_rightclick(pointed_pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end + + local name = placer:get_player_name() + if not name then + return itemstack, false + end + local pos=pointed_thing.above local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0}) if not advtrains.check_track_protection(pos, name) then @@ -310,7 +323,7 @@ end minetest.register_craftitem("advtrains:trackworker",{ - description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc."), + description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate object"), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "advtrains_trackworker.png", wield_image = "advtrains_trackworker.png", @@ -337,7 +350,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end end @@ -347,7 +360,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be rotated!") + local str = attrans("This track can not be rotated.") if reason then str = str .. " " .. reason end @@ -374,7 +387,7 @@ minetest.register_craftitem("advtrains:trackworker",{ if v==rotation then modpos=k end end if not modpos then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) @@ -401,7 +414,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then - minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker!")) + minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker.")) return end end @@ -411,7 +424,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be changed!") + local str = attrans("This track can not be changed.") if reason then str = str .. " " .. reason end diff --git a/mods/advtrains/advtrains/tracks.lua b/mods/advtrains/advtrains/tracks.lua index 261818e3..ee824260 100644 --- a/mods/advtrains/advtrains/tracks.lua +++ b/mods/advtrains/advtrains/tracks.lua @@ -446,7 +446,7 @@ Depending on the number of connections: local function can_dig_callback(pos, player) local ok, reason = advtrains.can_dig_or_modify_track(pos) if not ok and player then - minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason) + minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed.") .. " " .. reason) end return ok end @@ -468,10 +468,11 @@ function advtrains.register_tracks(tracktype, def, preset) drawtype = "mesh", paramtype="light", paramtype2="facedir", + use_texture_alpha = "blend", walkable = false, selection_box = { type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2}, }, mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), @@ -645,17 +646,17 @@ end function sl.create_slopeplacer_on_place(def, preset) return function(istack, player, pt) if not pt.type=="node" then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local pos=pt.above if not pos then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local node=minetest.get_node(pos) if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: space occupied.")) return istack end if not advtrains.check_track_protection(pos, player:get_player_name()) then @@ -708,17 +709,17 @@ function sl.create_slopeplacer_on_place(def, preset) pos=vector.subtract(pos, dirvec) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: Not enough slope items left (@1 required).", step)) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: There's no slope of length @1.",step)) end return istack end step=step+1 pos=vector.add(pos, dirvec) end - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end.")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: no supporting node at upper end.")) return itemstack end end diff --git a/mods/advtrains/advtrains/trainhud.lua b/mods/advtrains/advtrains/trainhud.lua index 22aa6cf5..ce4b9136 100644 --- a/mods/advtrains/advtrains/trainhud.lua +++ b/mods/advtrains/advtrains/trainhud.lua @@ -1,5 +1,7 @@ --trainhud.lua: holds all the code for train controlling +local T = advtrains.texture + advtrains.hud = {} advtrains.hhud = {} @@ -8,6 +10,8 @@ advtrains.hud[player:get_player_name()] = nil advtrains.hhud[player:get_player_name()] = nil end) +local hud_type_key = minetest.features.hud_def_type_field and "type" or "hud_elem_type" + local mletter={[1]="F", [-1]="R", [0]="N"} function advtrains.on_control_change(pc, train, flip) @@ -101,19 +105,21 @@ function advtrains.set_trainhud(name, text, driver) if not player then return end + local drivertext = driver or "" local driverhud = { - hud_elem_type = "image", + [hud_type_key] = "image", name = "ADVTRAINS_DRIVER", position = {x=0.5, y=1}, offset = {x=0,y=-170}, - text = driver or "", + text = drivertext, alignment = {x=0,y=-1}, - scale = {x=1,y=1},} + scale = {x=1,y=1}, + } if not hud then - hud = {["driver"]={}} + hud = {} advtrains.hud[name] = hud hud.id = player:hud_add({ - hud_elem_type = "text", + [hud_type_key] = "text", name = "ADVTRAINS", number = 0xFFFFFF, position = {x=0.5, y=1}, @@ -122,17 +128,22 @@ function advtrains.set_trainhud(name, text, driver) scale = {x=200, y=60}, alignment = {x=0, y=-1}, }) - hud.oldText=text hud.driver = player:hud_add(driverhud) + hud.oldText = text + hud.oldDriver = drivertext else if hud.oldText ~= text then player:hud_change(hud.id, "text", text) hud.oldText=text end if hud.driver then - player:hud_change(hud.driver, "text", driver or "") + if hud.oldDriver ~= drivertext then + player:hud_change(hud.driver, "text", drivertext) + hud.oldDriver = drivertext + end elseif driver then hud.driver = player:hud_add(driverhud) + hud.oldDriver = drivertext end end end @@ -147,7 +158,7 @@ function advtrains.set_help_hud(name, text) hud = {} advtrains.hhud[name] = hud hud.id = player:hud_add({ - hud_elem_type = "text", + [hud_type_key] = "text", name = "ADVTRAINS_HELP", number = 0xFFFFFF, position = {x=1, y=0.3}, @@ -184,138 +195,94 @@ function advtrains.hud_train_format(train, flip) local vel = advtrains.abs_ceil(train.velocity) local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity)) - local tlev=train.lever or 1 + local tlev=train.lever or 3 if train.velocity==0 and not train.active_control then tlev=1 end if train.hud_lzb_effect_tmr then tlev=1 end - local ht = {"[combine:440x110:0,0=(advtrains_hud_bg.png^[resize\\:440x110)"} + local hud = T.combine(440, 110, "black") local st = {} if train.debug then st = {train.debug} end - -- seven-segment display - local function sevenseg(digit, x, y, w, h, m) - --[[ - -1- - 2 3 - -4- - 5 6 - -7- - ]] - local segs = { - {h, 0, w, h}, - {0, h, h, w}, - {w+h, h, h, w}, - {h, w+h, w, h}, - {0, w+2*h, h, w}, - {w+h, w+2*h, h, w}, - {h, 2*(w+h), w, h}} - local trans = { - [0] = {true, true, true, false, true, true, true}, - [1] = {false, false, true, false, false, true, false}, - [2] = {true, false, true, true, true, false, true}, - [3] = {true, false, true, true, false, true, true}, - [4] = {false, true, true, true, false, true, false}, - [5] = {true, true, false, true, false, true, true}, - [6] = {true, true, false, true, true, true, true}, - [7] = {true, false, true, false, false, true, false}, - [8] = {true, true, true, true, true, true, true}, - [9] = {true, true, true, true, false, true, true}} - local ent = trans[digit or 10] - if not ent then return end - for i = 1, 7, 1 do - if ent[i] then - local s = segs[i] - ht[#ht+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^%s)",x+s[1], y+s[2], s[3], s[4], m) - end - end - end - -- lever - ht[#ht+1] = "275,10=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:5x18)" - ht[#ht+1] = "275,28=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:5x18)" - ht[#ht+1] = "275,46=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:5x36)" - ht[#ht+1] = "275,82=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:5x18)" - ht[#ht+1] = "292,16=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:6x78)" - ht[#ht+1] = sformat("280,%s=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:30x18)",18*(4-tlev)+10) + hud:add_multicolor_fill_topdown(275, 10, 5, 90, 1, "cyan", 1, "white", 2, "orange", 1, "red") + hud:add_lever_topdown(280, 10, 30, 90, 18, 6, (4-tlev)/4, "gray", "darkslategray") -- reverser - ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan") - ht[#ht+1] = sformat("245,85=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "") - ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x40)" - ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 65 or 30) + hud:add(245, 10, T"advtrains_hud_arrow.png":transform"FY":multiply(flip and "gray" or "cyan")) + hud:add(245, 85, T"advtrains_hud_arrow.png":multiply(flip and "orange" or "gray")) + hud:add_lever_topdown(240, 30, 25, 50, 15, 5, flip and 1 or 0, "gray", "darkslategray") -- train control/safety indication - if train.tarvelocity or train.atc_command then - ht[#ht+1] = "10,10=(advtrains_hud_atc.png^[resize\\:30x30^[multiply\\:cyan)" - end - if train.hud_lzb_effect_tmr then - ht[#ht+1] = "50,10=(advtrains_hud_lzb.png^[resize\\:30x30^[multiply\\:red)" - end - if train.is_shunt then - ht[#ht+1] = "90,10=(advtrains_hud_shunt.png^[resize\\:30x30^[multiply\\:orange)" - end + hud:add(10, 10, T"advtrains_hud_atc.png":resize(30, 30):multiply((train.tarvelocity or train.atc_command) and "cyan" or "darkslategray")) + hud:add(50, 10, T"advtrains_hud_lzb.png":resize(30, 30):multiply(train.hud_lzb_effect_tmr and "red" or "darkslategray")) + hud:add(90, 10, T"advtrains_hud_shunt.png":resize(30, 30):multiply(train.is_shunt and "orange" or "darkslategray")) -- door - ht[#ht+1] = "187,10=(advtrains_hud_bg.png^[resize\\:26x30^[colorize\\:white)" - ht[#ht+1] = "189,12=(advtrains_hud_bg.png^[resize\\:22x11)" - ht[#ht+1] = sformat("170,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==-1 and "white" or "darkslategray") - ht[#ht+1] = "172,12=(advtrains_hud_bg.png^[resize\\:11x11)" - ht[#ht+1] = sformat("215,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==1 and "white" or "darkslategray") - ht[#ht+1] = "217,12=(advtrains_hud_bg.png^[resize\\:11x11)" + hud:add_fill(187, 10, 26, 30, "white"):add_fill(189, 12, 22, 11, "black") + hud:add_fill(170, 10, 15, 30, train.door_open==-1 and "white" or "darkslategray"):add_fill(172, 12, 11, 11, "black") + hud:add_fill(215, 10, 15, 30, train.door_open==1 and "white" or "darkslategray"):add_fill(217, 12, 11, 11, "black") -- speed indication(s) - sevenseg(math.floor(vel/10), 320, 10, 30, 10, "[colorize\\:red\\:255") - sevenseg(vel%10, 380, 10, 30, 10, "[colorize\\:red\\:255") - for i = 1, vel, 1 do - ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:white)", i*11-1) - end - for i = max+1, 20, 1 do - ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:darkslategray)", i*11-1) - end + hud:add_n7seg(320, 10, 110, 90, vel, 2, "red") + hud:add_segmentbar_leftright(10, 65, 217, 20, 3, 20, max, 20, "darkslategray", 0, vel, "white") if res and res > 0 then - ht[#ht+1] = sformat("%d,60=(advtrains_hud_bg.png^[resize\\:3x30^[colorize\\:red\\:255)", 7+res*11) + hud:add_fill(7+res*11, 60, 3, 30, "red") end if train.tarvelocity then - ht[#ht+1] = sformat("%d,85=(advtrains_hud_arrow.png^[multiply\\:cyan^[transformFY^[makealpha\\:#000000)", 1+train.tarvelocity*11) + hud:add(1+train.tarvelocity*11, 85, T"advtrains_hud_arrow.png":transform"FY":multiply"cyan") end + local lzbdisp local lzb = train.lzb if lzb and lzb.checkpoints then local oc = lzb.checkpoints for i = 1, #oc do + if advtrains.interlocking then + local udata = oc[i].udata + if udata and udata.signal_pos then + local sigd = advtrains.interlocking.db.get_sigd_for_signal(udata.signal_pos) + if sigd then + local tcbs = advtrains.interlocking.db.get_tcbs(sigd) or {} + if tcbs.route_rsn then + table.insert(st, ("%s: %s"):format(minetest.pos_to_string(sigd.p), tcbs.route_rsn)) + end + end + end + end local spd = oc[i].speed spd = advtrains.speed.min(spd, train.speed_restriction) if spd == -1 then spd = nil end local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil if c then - ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) - ht[#ht+1] = sformat("130,35=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) if spd and spd~=0 then - ht[#ht+1] = sformat("%d,50=(advtrains_hud_arrow.png^[multiply\\:red^[makealpha\\:#000000)", 1+spd*11) + hud:add(1+spd*11, 50, T"advtrains_hud_arrow.png":multiply"red") end - local floor = math.floor - local dist = floor(((oc[i].index or train.index)-train.index)) + local dist = math.floor(((oc[i].index or train.index)-train.index)) dist = math.max(0, math.min(999, dist)) - for j = 1, 3, 1 do - sevenseg(floor((dist/10^(3-j))%10), 119+j*11, 18, 4, 2, "[colorize\\:"..c) - end + lzbdisp = {c = c, d = dist} break end end end + if not lzbdisp then + lzbdisp = {c = "darkslategray", d = 888} + end + hud:add_fill(130, 10, 30, 5, lzbdisp.c) + hud:add_fill(130, 35, 30, 5, lzbdisp.c) + hud:add_n7seg(131, 18, 28, 14, lzbdisp.d, 3, lzbdisp.c) if res and res == 0 then - st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.") + table.insert(st, attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.")) end if train.atc_command then - st[#st+1] = sformat("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "") + table.insert(st, ("ATC: %s%s"):format(train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "")) end - return table.concat(st,"\n"), table.concat(ht,":") + return table.concat(st,"\n"), tostring(hud) end local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12, active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true, - door_open = 1, lzb = {oncoming = {{spd=6, idx=125.7}}}, index = 0, + door_open = 1, lzb = {checkpoints = {{speed=6, index=125.7}}}, index = 100, } minetest.register_node("advtrains:hud_demo",{ diff --git a/mods/advtrains/advtrains/trainlogic.lua b/mods/advtrains/advtrains/trainlogic.lua index 35c37263..ed49a4c0 100644 --- a/mods/advtrains/advtrains/trainlogic.lua +++ b/mods/advtrains/advtrains/trainlogic.lua @@ -142,10 +142,8 @@ minetest.register_on_joinplayer(function(player) local pname = player:get_player_name() local id=advtrains.player_to_train_mapping[pname] if id then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.train_id==id then - wagon:reattach_all() - end + for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do + wagon:reattach_all() end end end) @@ -157,12 +155,10 @@ minetest.register_on_dieplayer(function(player) if id then local train=advtrains.trains[id] if not train then advtrains.player_to_train_mapping[pname]=nil return end - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.train_id==id then - --when player dies, detach him from the train - --call get_off_plr on every wagon since we don't know which one he's on. - wagon:get_off_plr(pname) - end + for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do + --when player dies, detach him from the train + --call get_off_plr on every wagon since we don't know which one he's on. + wagon:get_off_plr(pname) end -- just in case no wagon felt responsible for this player: clear train mapping advtrains.player_to_train_mapping[pname] = nil @@ -267,6 +263,10 @@ function advtrains.train_ensure_init(id, train) atwarn(debug.traceback()) return nil end + + if not train.staticdata then + train.staticdata = {} + end train.dirty = true if train.no_step then @@ -616,7 +616,7 @@ function advtrains.train_step_b(id, train, dtime) local base_cn = train.path_cn[base_idx] --atdebug(id,"Begin Checking for on-track collisions new_idx=",new_index_curr_tv,"base_idx=",base_idx,"base_pos=",base_pos,"base_cn=",base_cn) -- query occupation - local occ = advtrains.occ.get_trains_over(base_pos) + local occ = advtrains.occ.reverse_lookup_sel(base_pos, "close_proximity") -- iterate other trains for otid, ob_idx in pairs(occ) do if otid ~= id then @@ -646,7 +646,7 @@ function advtrains.train_step_b(id, train, dtime) -- Phase 2 - project ref_index back onto our path and check again (necessary because there might be a turnout on the way and we are driving into the flank if target_is_inside then - local our_index = advtrains.path_project(otrn, ref_index, id) + local our_index = advtrains.path_project(otrn, ref_index, id, "before_end") --atdebug("Backprojected our_index",our_index) if our_index and our_index <= new_index_curr_tv and our_index >= train.index then --FIX: If train was already past the collision point in the previous step, there is no collision! Fixes bug with split_at_index @@ -800,9 +800,12 @@ function advtrains.train_step_c(id, train, dtime) if is_loaded_area then local objs = minetest.get_objects_inside_radius(rcollpos, 2) for _,obj in ipairs(objs) do - if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0 - and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then - obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil) + if not obj:is_player() then + local armor = obj:get_armor_groups() + local luaentity = obj:get_luaentity() + if armor.fleshy and armor.fleshy > 0 and luaentity and luaentity.name ~= "signs_lib:text" then + obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil) + end end end end @@ -1050,7 +1053,16 @@ function advtrains.update_trainpart_properties(train_id, invert_flipstate) if data then local wagon = advtrains.wagon_prototypes[data.type or data.entity_name] if not wagon then - atwarn("Wagon '",data.type,"' couldn't be found. Please check that all required modules are loaded!") + local ent = advtrains.wagon_objects[w_id] + local pdesc + if ent then + pdesc = "at " .. minetest.pos_to_string(ent:get_pos()) + elseif train.last_pos then + pdesc = "near " .. minetest.pos_to_string(train.last_pos) + else + pdesc = "at an unknown location" + end + atwarn(string.format("Wagon %q %s could not be found. Please check that all required modules are loaded!", data.type, pdesc)) wagon = advtrains.wagon_prototypes["advtrains:wagon_placeholder"] end @@ -1105,8 +1117,17 @@ function advtrains.spawn_wagons(train_id) if advtrains.position_in_range(pos, ablkrng) then --atdebug("wagon",w_id,"spawning") local wt = advtrains.get_wagon_prototype(data) - local wagon = minetest.add_entity(pos, wt):get_luaentity() - wagon:set_id(w_id) + local wobj = minetest.add_entity(pos, wt) + if not wobj then + atwarn("Failed to spawn wagon", w_id, "of type", wt) + else + local wagon = wobj:get_luaentity() + if not wagon then + atwarn("Wagon", w_id, "of type", wt, "spawned with nil luaentity") + else + wagon:set_id(w_id) + end + end end end else @@ -1173,6 +1194,8 @@ function advtrains.split_train_at_index(train, index) newtrain.points_split = advtrains.merge_tables(train.points_split) newtrain.autocouple = train.autocouple + advtrains.te_run_callbacks_on_decouple(train, newtrain, index) + return newtrain_id -- return new train ID, so new train can be manipulated end @@ -1206,7 +1229,6 @@ function advtrains.invert_train(train_id) advtrains.update_trainpart_properties(train_id, true) -- recalculate path - advtrains.train_ensure_init(train_id, train) -- If interlocking present, check whether this train is in a section and then set as shunt move after reversion if advtrains.interlocking and train.il_sections and #train.il_sections > 0 then @@ -1232,7 +1254,7 @@ function advtrains.invalidate_all_paths(pos) local tab if pos then -- if position given, check occupation system - tab = advtrains.occ.get_trains_over(pos) + tab = advtrains.occ.reverse_lookup_quick(pos) else tab = advtrains.trains end @@ -1245,7 +1267,7 @@ end -- Calls invalidate_path_ahead on all trains occupying (having paths over) this node -- Can be called during train step. function advtrains.invalidate_all_paths_ahead(pos) - local tab = advtrains.occ.get_trains_over(pos) + local tab = advtrains.occ.reverse_lookup_sel(pos, "first_ahead") for id,index in pairs(tab) do local train = advtrains.trains[id] diff --git a/mods/advtrains/advtrains/wagonprop_tool.lua b/mods/advtrains/advtrains/wagonprop_tool.lua new file mode 100644 index 00000000..2a4a9e21 --- /dev/null +++ b/mods/advtrains/advtrains/wagonprop_tool.lua @@ -0,0 +1,43 @@ +minetest.register_craftitem("advtrains:wagon_prop_tool",{ --craftitem because it does nothing on its own + description = attrans("Wagon Properties Tool\nPunch a wagon to view and edit the Wagon Properties"), + short_description = attrans("Wagon Properties Tool"), + groups = {}, + inventory_image = "advtrains_wagon_prop_tool.png", + wield_image = "advtrains_wagon_prop_tool.png", + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local pname = user:get_player_name() + if not pname or pname == "" then + return + end + + --sanity checks in case of clicking the wrong entity/node/nothing + if pointed_thing.type ~= "object" then return end --not an entity + local object = pointed_thing.ref:get_luaentity() + if not object.id then return end --entity doesn't have an id field + + local wagon = advtrains.wagons[object.id] --check if wagon exists in advtrains + if not wagon then --not a wagon + return + end --end sanity checks + + --whitelist protection check + if not advtrains.check_driving_couple_protection(pname,wagon.owner,wagon.whitelist) then + minetest.chat_send_player(pname, attrans("Insufficient privileges to use this!")) + return + end + object:show_wagon_properties(pname) + return itemstack + end, +}) + +if minetest.get_modpath("default") then --register recipe + minetest.register_craft({ + output = "advtrains:wagon_prop_tool", + recipe = { + {"advtrains:dtrack_placer","dye:black","default:paper"}, + {"screwdriver:screwdriver","default:paper","default:paper"}, + {"","","group:wood"}, + } + }) +end \ No newline at end of file diff --git a/mods/advtrains/advtrains/wagons.lua b/mods/advtrains/advtrains/wagons.lua index 94eda30e..cf158712 100644 --- a/mods/advtrains/advtrains/wagons.lua +++ b/mods/advtrains/advtrains/wagons.lua @@ -13,7 +13,13 @@ local GETOFF_TP_DELAY = 0.5 local IGNORE_WORLD = advtrains.IGNORE_WORLD advtrains.wagons = {} -advtrains.wagon_prototypes = {} +advtrains.wagon_alias = {} +advtrains.wagon_prototypes = setmetatable({}, { + __index = function(t, k) + local _, proto = advtrains.resolve_wagon_alias(k) + return proto + end +}) advtrains.wagon_objects = {} local unload_wgn_range = advtrains.wagon_load_range + 32 @@ -200,7 +206,7 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct end for listname, _ in pairs(inv:get_lists()) do if not inv:is_empty(listname) then - minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty!")); + minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty.")); return end end @@ -280,7 +286,7 @@ function wagon:on_step(dtime) local data = advtrains.wagons[self.id] if not pos then - --atdebug("["..self.id.."][fatal] missing position (object:getpos() returned nil)") + --atdebug("["..self.id.."][fatal] missing position (object:get_pos() returned nil)") return end @@ -364,6 +370,15 @@ function wagon:on_step(dtime) outside = outside .."\n!!! Train off track !!!" end + -- liquid container: display liquid contents in infotext + if self.techage_liquid_capacity then + if data.techage_liquid and data.techage_liquid.name then + outside = outside .."\nLiquid: "..data.techage_liquid.name..", "..data.techage_liquid.amount.." units" + else + outside = outside .."\nLiquid: empty" + end + end + if self.infotext_cache~=outside then self.object:set_properties({infotext=outside}) self.infotext_cache=outside @@ -413,13 +428,38 @@ function wagon:on_step(dtime) end -- Calculate new position, yaw and direction vector + -- note: "index" is needed to be the center index, required by door code local index = advtrains.path_get_index_by_offset(train, train.index, -data.pos_in_train) - local pos, yaw, npos, npos2 = advtrains.path_get_interpolated(train, index) - local vdir = vector.normalize(vector.subtract(npos2, npos)) + local pos, yaw, npos, npos2, vdir + + -- use new position logic? + if self.wheel_positions then + -- request two positions, calculate difference and yaw from this + -- depending on flipstate, need to invert wheel pos indices -> wheelpos * fct + local index1 = advtrains.path_get_index_by_offset(train, index, self.wheel_positions[1] * fct) + local index2 = advtrains.path_get_index_by_offset(train, index, self.wheel_positions[2] * fct) + local pos1 = advtrains.path_get_interpolated(train, index1) + local pos2 = advtrains.path_get_interpolated(train, index2) + npos = advtrains.path_get(train, atfloor(index)) -- need npos just for node loaded check + -- calculate center of 2 positions and vdir vector + -- if wheel positions are asymmetric, needs to weight by the difference! + local fact = self.wheel_positions[1] / (self.wheel_positions[1]-self.wheel_positions[2]) + pos = {x=pos1.x-(pos1.x-pos2.x)*fact, y=pos1.y-(pos1.y-pos2.y)*fact, z=pos1.z-(pos1.z-pos2.z)*fact} + if data.wagon_flipped then + vdir = vector.normalize(vector.subtract(pos2, pos1)) + else + vdir = vector.normalize(vector.subtract(pos1, pos2)) + end + yaw = math.atan2(-vdir.x, vdir.z) + else + --old position logic (for small wagons): use center index and just get position + pos, yaw, npos, npos2 = advtrains.path_get_interpolated(train, index) + vdir = vector.normalize(vector.subtract(npos2, npos)) + end --automatic get_on --needs to know index and path - if self.door_entry and train.door_open and train.door_open~=0 and train.velocity==0 then + if train.velocity==0 and self.door_entry and train.door_open and train.door_open~=0 then --using the mapping created by the trainlogic globalstep for i, ino in ipairs(self.door_entry) do --fct is the flipstate flag from door animation above @@ -470,28 +510,32 @@ function wagon:on_step(dtime) end end - --DisCouple + -- Spawn discouple object when train stands, in all other cases remove it. -- FIX: Need to do this after the yaw calculation - if is_in_loaded_area and data.pos_in_trainparts and data.pos_in_trainparts>1 then - if train.velocity==0 then - if not self.discouple or not self.discouple.object:get_yaw() then - atprint(self.id,"trying to spawn discouple") - local dcpl_pos = vector.add(pos, {y=0, x=-math.sin(yaw)*self.wagon_span, z=math.cos(yaw)*self.wagon_span}) - local object=minetest.add_entity(dcpl_pos, "advtrains:discouple") - if object then - local le=object:get_luaentity() - le.wagon=self - --box is hidden when attached, so unuseful. - --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) - self.discouple=le - end - end - else - if self.discouple and self.discouple.object:get_yaw() then - self.discouple.object:remove() - atprint(self.id," removing discouple") + if train.velocity==0 and is_in_loaded_area and data.pos_in_trainparts and data.pos_in_trainparts>1 then + if not self.discouple or not self.discouple.object:get_yaw() then + atprint(self.id,"trying to spawn discouple") + local dcpl_pos = vector.add(pos, {y=0, x=-math.sin(yaw)*self.wagon_span, z=math.cos(yaw)*self.wagon_span}) + local object=minetest.add_entity(dcpl_pos, "advtrains:discouple") + if object then + local le=object:get_luaentity() + le.wagon=self + --box is hidden when attached, so unuseful. + --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) + self.discouple=le end end + else + if self.discouple and self.discouple.object:get_yaw() then + self.discouple.object:remove() + atprint(self.id," removing discouple") + end + end + + -- object yaw (corrected by flipstate) + local oyaw = yaw + if data.wagon_flipped then + oyaw = yaw + math.pi end --FIX: use index of the wagon, not of the train. @@ -500,10 +544,6 @@ function wagon:on_step(dtime) local velocityvec = vector.multiply(vdir, velocity) local accelerationvec = vector.multiply(vdir, acceleration) - if data.wagon_flipped then - yaw=yaw+math.pi - end - -- this timer runs off every 2 seconds. self.updatepct_timer=(self.updatepct_timer or 0)-dtime local updatepct_timer_elapsed = self.updatepct_timer<=0 @@ -540,19 +580,19 @@ function wagon:on_step(dtime) or not vector.equals(velocityvec, self.old_velocity_vector) or not self.old_acceleration_vector or not vector.equals(accelerationvec, self.old_acceleration_vector) - or self.old_yaw~=yaw + or self.old_yaw~=oyaw or updatepct_timer_elapsed then--only send update packet if something changed self.object:set_pos(pos) self.object:set_velocity(velocityvec) self.object:set_acceleration(accelerationvec) - if #self.seats > 0 and self.old_yaw ~= yaw then + if #self.seats > 0 and self.old_yaw ~= oyaw then if not self.player_yaw then self.player_yaw = {} end if not self.old_yaw then - self.old_yaw=yaw + self.old_yaw=oyaw end for _,name in pairs(data.seatp) do local p = minetest.get_player_by_name(name) @@ -562,11 +602,11 @@ function wagon:on_step(dtime) self.player_yaw[name] = p:get_look_horizontal()-self.old_yaw end -- set player looking direction using calculated offset - p:set_look_horizontal((self.player_yaw[name] or 0)+yaw) + p:set_look_horizontal((self.player_yaw[name] or 0)+oyaw) end end self.turning = true - elseif self.old_yaw == yaw then + elseif self.old_yaw == oyaw then -- train is no longer turning self.turning = false end @@ -576,9 +616,9 @@ function wagon:on_step(dtime) if data.wagon_flipped then pitch = -pitch end - self.object:set_rotation({x=pitch, y=yaw, z=0}) + self.object:set_rotation({x=pitch, y=oyaw, z=0}) else - self.object:set_yaw(yaw) + self.object:set_yaw(oyaw) end if self.update_animation then @@ -597,7 +637,7 @@ function wagon:on_step(dtime) self.old_velocity_vector=velocityvec self.old_velocity = train.velocity self.old_acceleration_vector=accelerationvec - self.old_yaw=yaw + self.old_yaw=oyaw atprintbm("wagon step", t) end @@ -664,7 +704,7 @@ function wagon:on_rightclick(clicker) end local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak - local allow, rsn=false, "Wagon has no seats!" + local allow, rsn=false, attrans("This wagon has no seats.") for _,sgr in ipairs(self.assign_to_seat_group) do allow, rsn = self:check_seat_group_access(pname, sgr) if allow then @@ -675,16 +715,16 @@ function wagon:on_rightclick(clicker) self:get_on(clicker, seatid) return else - rsn="Wagon is full." + rsn=attrans("This wagon is full.") end else - rsn="Doors are closed! (try holding sneak key!)" + rsn=attrans("Doors are closed! (Try holding sneak key!)") end end end end end - minetest.chat_send_player(pname, attrans("Can't get on: "..rsn)) + minetest.chat_send_player(pname, rsn or attrans("You can't get on this wagon.")) else self:show_get_on_form(pname) end @@ -780,8 +820,8 @@ function wagon:get_off(seatno) end --if not door_entry, or paths missing, fall back to old method --atdebug("using fallback") - local objpos=advtrains.round_vector_floor_y(self.object:getpos()) - local yaw=self.object:getyaw() + local objpos=advtrains.round_vector_floor_y(self.object:get_pos()) + local yaw=self.object:get_yaw() local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4) local offp --abuse helper function @@ -834,6 +874,7 @@ function wagon:show_wagon_properties(pname) ]] local data = advtrains.wagons[self.id] local form="size[5,5]" + form=form.."label[0.2,0;"..attrans("This Wagon ID")..": "..self.id.."]" form = form .. "field[0.5,1;4.5,1;whitelist;Allow these players to access your wagon:;"..minetest.formspec_escape(data.whitelist or "").."]" form = form .. "field[0.5,2;4.5,1;roadnumber;Wagon road number:;"..minetest.formspec_escape(data.roadnumber or "").."]" local fc = "" @@ -858,7 +899,7 @@ end --BordCom local function checkcouple(ent) - if not ent or not ent:getyaw() then + if not ent or not ent:get_yaw() then return nil end local le = ent:get_luaentity() @@ -937,6 +978,7 @@ function wagon:show_bordcom(pname) local linhei local form = "size[11,9]label[0.5,0;AdvTrains Boardcom v0.1]" + form=form.."textarea[7.5,0.05;10,1;;"..attrans("Train ID")..": "..(minetest.formspec_escape(train.id or ""))..";]" form=form.."textarea[0.5,1.5;7,1;text_outside;"..attrans("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]" form=form.."textarea[0.5,3;7,1;text_inside;"..attrans("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]" form=form.."field[7.5,1.75;3,1;line;"..attrans("Line")..";"..(minetest.formspec_escape(train.line or "")).."]" @@ -1054,12 +1096,11 @@ function wagon:handle_bordcom_fields(pname, formname, fields) for i, tpid in ipairs(train.trainparts) do if fields["dcpl_"..i] then advtrains.safe_decouple_wagon(tpid, pname) - elseif fields["wgprp"..i] then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then - wagon:show_wagon_properties(pname) - return - end + elseif fields["wgprp"..i] and data.owner==pname then + local wagon = advtrains.get_wagon_entity(tpid) + if wagon then + wagon:show_wagon_properties(pname) + return end end end @@ -1105,44 +1146,48 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) local uid=string.match(formname, "^advtrains_geton_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - local data = advtrains.wagons[wagon.id] - if fields.inv then - if wagon.has_inventory and wagon.get_inventory_formspec then - minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid))) - end - elseif fields.seat then - local val=minetest.explode_textlist_event(fields.seat) - if val and val.type~="INV" and not data.seatp[player:get_player_name()] then - --get on - wagon:get_on(player, val.index) - --will work with the new close_formspec functionality. close exactly this formspec. - minetest.show_formspec(player:get_player_name(), formname, "") - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + local data = advtrains.wagons[wagon.id] + if fields.inv then + if wagon.has_inventory and wagon.get_inventory_formspec then + minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid))) + end + elseif fields.seat then + local val=minetest.explode_textlist_event(fields.seat) + if val and val.type~="INV" and not data.seatp[player:get_player_name()] then + --get on + wagon:get_on(player, val.index) + --will work with the new close_formspec functionality. close exactly this formspec. + minetest.show_formspec(player:get_player_name(), formname, "") end end end + return true end + uid=string.match(formname, "^advtrains_seating_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - local pname=player:get_player_name() - local no=wagon:get_seatno(pname) - if no then - if wagon.seat_groups then - wagon:seating_from_key_helper(pname, fields, no) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + local pname=player:get_player_name() + local no=wagon:get_seatno(pname) + if no then + if wagon.seat_groups then + wagon:seating_from_key_helper(pname, fields, no) end end end + return true end + uid=string.match(formname, "^advtrains_prop_(.+)$") if uid then local pname=player:get_player_name() local data = advtrains.wagons[uid] - if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then + if not data then + return true + elseif pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then return true end if fields.save or not fields.quit then @@ -1164,29 +1209,32 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) wagon.show_wagon_properties({id=uid}, pname) end end + return true end uid=string.match(formname, "^advtrains_bordcom_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) end + return true end + uid=string.match(formname, "^advtrains_inv_(.+)$") if uid then local pname=player:get_player_name() local data = advtrains.wagons[uid] if fields.prop and data.owner==pname then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then - wagon:show_wagon_properties(pname) - --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + wagon:show_wagon_properties(pname) + --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) end end + return true end end) + function wagon:seating_from_key_helper(pname, fields, no) local data = advtrains.wagons[self.id] local sgr=self.seats[no].group @@ -1213,7 +1261,7 @@ function wagon:seating_from_key_helper(pname, fields, no) self:show_bordcom(pname) end if fields.dcwarn then - minetest.chat_send_player(pname, attrans("Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!")) + minetest.chat_send_player(pname, attrans("Doors are closed. Use Sneak+rightclick to ignore the closed doors and get off.")) end if fields.off then self:get_off(no) @@ -1222,10 +1270,10 @@ end function wagon:check_seat_group_access(pname, sgr) local data = advtrains.wagons[self.id] if self.seat_groups[sgr].driving_ctrl_access and not (advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)) then - return false, "Not allowed to access a driver stand!" + return false, attrans("You are not allowed to access the driver stand.") end if self.seat_groups[sgr].driving_ctrl_access then - advtrains.log("Drive", pname, self.object:getpos(), self:train().text_outside) + advtrains.log("Drive", pname, self.object:get_pos(), self:train().text_outside) end return true end @@ -1283,11 +1331,33 @@ function advtrains.get_wagon_prototype(data) data.type = data.entity_name data.entity_name = nil end - if not wt or not advtrains.wagon_prototypes[wt] then + local rt, proto = advtrains.resolve_wagon_alias(wt) + if not rt then atwarn("Unable to load wagon type",wt,", using placeholder") - wt="advtrains:wagon_placeholder" + rt = "advtrains:wagon_placeholder" + proto = advtrains.wagon_prototypes[rt] end - return wt, advtrains.wagon_prototypes[wt] + return rt, proto +end + +function advtrains.register_wagon_alias(src, dst) + advtrains.wagon_alias[src] = dst +end + +local function recursive_resolve_alias(name, seen) + local prototype = rawget(advtrains.wagon_prototypes, name) + if prototype then + return name, prototype + end + local resolved = advtrains.wagon_alias[name] + if resolved and not seen[resolved] then + seen[name] = true + return recursive_resolve_alias(resolved, seen) + end +end + +function advtrains.resolve_wagon_alias(name) + return recursive_resolve_alias(name, {}) end function advtrains.standard_inventory_formspec(self, pname, invname) @@ -1334,13 +1404,23 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati groups = wagon_groups, on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then + if pointed_thing.type ~= "node" then return end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local pointed_def = minetest.registered_nodes[node.name] + if pointed_def and pointed_def.on_rightclick then + local controls = placer:get_player_control() + if not controls.sneak then + return pointed_def.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + end + local pname = placer:get_player_name() - local node=minetest.get_node_or_nil(pointed_thing.under) - if not node then atprint("[advtrains]Ignore at placer position") return itemstack end + if node.name == "ignore" then atprint("[advtrains]Ignore at placer position") return itemstack end local nodename=node.name if(not advtrains.is_track_and_drives_on(nodename, prototype.drives_on)) then atprint("no track here, not placing.") @@ -1350,14 +1430,14 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati minetest.chat_send_player(pname, "You don't have the train_operator privilege.") return itemstack end - if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pos, placer:get_player_name()) then return itemstack end local tconns=advtrains.get_track_connections(node.name, node.param2) local yaw = placer:get_look_horizontal() local plconnid = advtrains.yawToClosestConn(yaw, tconns) - local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, prototype.drives_on) + local prevpos = advtrains.get_adjacent_rail(pos, tconns, plconnid, prototype.drives_on) if not prevpos then minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!") return @@ -1365,7 +1445,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati local wid = advtrains.create_wagon(sysname, pname) - local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, {wid}) + local id=advtrains.create_new_train_at(pos, plconnid, 0, {wid}) if not advtrains.is_creative(pname) then itemstack:take_item() @@ -1393,3 +1473,88 @@ advtrains.register_wagon("advtrains:wagon_placeholder", { drops={}, }, "Wagon placeholder", "advtrains_wagon_placeholder.png", true) + + +-- Helper function to retrieve the wagon at a certain position in a train, given its train ID and the desired index within that train's path +-- +-- Returns: wagon_num, wagon_id, wagon_data, offset_from_center +-- wagon_num: The n'th wagon in the train (index into "trainparts" table) +-- wagon_id: The wagon ID. Obtain wagon data from advtrains.wagons[wagon_id], and subsequently the wagon prototype via advtrains.get_wagon_prototype(data) +-- offset_from_center: The offset (an absolute distance value) from the center point of the wagon. Positive is towards the end of the train, negative towards the start. (note that this is inverse to the counting direction of the index!) +-- +--[[ To get the wagon standing at a certain world position, you first need to retrieve the index via the occupation table, as follows: + local trains = advtrains.occ.get_trains_at(pos) + for train_id, index in pairs(trains) do + local wagon_num, wagon_id, wagon_data, offset_from_center = advtrains.get_wagon_at_index(train_id, index) + if wagon_num then + ... + end + end +]]-- +function advtrains.get_wagon_at_index(train_id, w_index) + local train = advtrains.trains[train_id] + if not train then error("Passed train id "..train_id.." doesnt exist") end + -- ensure init - always required + advtrains.train_ensure_init(train_id, train) + -- Use path dist to determine the offset from the start of the train + local dstart = advtrains.path_get_path_dist_fractional(train, train.index) + local dtarget = advtrains.path_get_path_dist_fractional(train, w_index) + local dist_from_start = dstart - dtarget -- NOTE: dist_from_start is supposed to be positive, but dtarget will be smaller than dstart + -- if dist_from_start is <0, we are outside of train + if dist_from_start < 0 then + return nil + end + -- scan over wagons to see if dist_from_start falls into its window + local start_pos = 0 + local center_pos + local end_pos + local i = 1 + while train.trainparts[i] do + local w_id = train.trainparts[i] + -- get wagon prototype to retrieve wagon span + local wdata = advtrains.wagons[w_id] + if wdata then + local wtype, wproto = advtrains.get_wagon_prototype(wdata) + local wagon_span = wproto.wagon_span + -- determine center and end pos + center_pos = start_pos + wagon_span + end_pos = center_pos + wagon_span + if start_pos <= dist_from_start and dist_from_start < end_pos then + -- Found the correct wagon in the train! + local offset_from_center = dist_from_start - center_pos + return i, w_id, wdata, offset_from_center + end + -- go on + start_pos = end_pos + else + error("Wagon "..w_id.." from train "..train_id.." doesnt exist!") + end + i = i + 1 + end + -- nothing found, dist must be further back + return nil +end + +function advtrains.get_wagon_entity(wagon_id) + if not advtrains.wagons[wagon_id] then return end + local object = advtrains.wagon_objects[wagon_id] + if object then + return object:get_luaentity() + end +end + +function advtrains.next_wagon_entity_in_train(train, i) + local wagon_id = train.trainparts[i + 1] + if wagon_id then + local wagon = advtrains.get_wagon_entity(wagon_id) + if wagon then + return i + 1, wagon + end + end +end + +function advtrains.wagon_entity_pairs_in_train(train_id) + local train = advtrains.trains[train_id] + if not train then return function() end end + return advtrains.next_wagon_entity_in_train, train, 0 +end diff --git a/mods/advtrains/advtrains_interlocking/database.lua b/mods/advtrains/advtrains_interlocking/database.lua index 6787c504..5096d489 100644 --- a/mods/advtrains/advtrains_interlocking/database.lua +++ b/mods/advtrains/advtrains_interlocking/database.lua @@ -425,7 +425,7 @@ function ildb.link_track_sections(merge_id, root_id) merge_ts(root_id, merge_id) end -function ildb.remove_from_interlocking(sigd) +function ildb.remove_from_interlocking(sigd, no_tcb_marker) local tcbs = ildb.get_tcbs(sigd) if not ildb.may_modify_tcbs(tcbs) then return false end @@ -455,7 +455,9 @@ function ildb.remove_from_interlocking(sigd) track_sections[tsid] = nil end end - advtrains.interlocking.show_tcb_marker(sigd.p) + if not no_tcb_marker then + advtrains.interlocking.show_tcb_marker(sigd.p) + end if tcbs.signal then return false end @@ -468,10 +470,11 @@ function ildb.remove_tcb(pos) return true --FIX: not an error, because tcb is already removed end for connid=1,2 do - if not ildb.remove_from_interlocking({p=pos, s=connid}) then + if not ildb.remove_from_interlocking({p=pos, s=connid}, true) then return false end end + advtrains.interlocking.remove_tcb_marker_pts(pts) track_circuit_breaks[pts] = nil return true end diff --git a/mods/advtrains/advtrains_interlocking/route_prog.lua b/mods/advtrains/advtrains_interlocking/route_prog.lua index 6abe431b..e8f5e8e1 100644 --- a/mods/advtrains/advtrains_interlocking/route_prog.lua +++ b/mods/advtrains/advtrains_interlocking/route_prog.lua @@ -214,19 +214,32 @@ end local player_rte_prog = {} -function advtrains.interlocking.init_route_prog(pname, sigd) +function advtrains.interlocking.init_route_prog(pname, sigd, default_route) if not minetest.check_player_privs(pname, "interlocking") then minetest.chat_send_player(pname, "Insufficient privileges to use this!") return end - player_rte_prog[pname] = { + local rp = { origin = sigd, - route = { - name = "PROG["..pname.."]", - }, - tmp_lcks = {}, } - advtrains.interlocking.visualize_route(sigd, player_rte_prog[pname].route, "prog_"..pname, player_rte_prog[pname].tmp_lcks, pname) + if default_route then + rp.route = table.copy(default_route) + + -- "Step back one section", but keeping turnouts + local last_route = rp.route[#rp.route] + if last_route then + rp.tmp_lcks = last_route.locks + rp.route[#rp.route] = nil + end + rp.route.name = "PROG["..pname.."]" + else + rp.route = { + name = "PROG["..pname.."]" + } + rp.tmp_lcks = {} + end + player_rte_prog[pname] = rp + advtrains.interlocking.visualize_route(sigd, rp.route, "prog_"..pname, rp.tmp_lcks, pname) minetest.chat_send_player(pname, "Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.") end diff --git a/mods/advtrains/advtrains_interlocking/route_ui.lua b/mods/advtrains/advtrains_interlocking/route_ui.lua index 1999941a..a8fee834 100644 --- a/mods/advtrains/advtrains_interlocking/route_ui.lua +++ b/mods/advtrains/advtrains_interlocking/route_ui.lua @@ -24,7 +24,7 @@ function atil.show_route_edit_form(pname, sigd, routeid) local route = tcbs.routes[routeid] if not route then return end - local form = "size[9,10]label[0.5,0.2;Route overview]" + local form = "size[9,11]label[0.5,0.2;Route overview]" form = form.."field[0.8,1.2;6.5,1;name;Route name;"..minetest.formspec_escape(route.name).."]" form = form.."button[7.0,0.9;1.5,1;setname;Set]" @@ -85,11 +85,13 @@ function atil.show_route_edit_form(pname, sigd, routeid) form = form.."button[0.5,6;3,1;back;<<< Back to signal]" form = form.."button[4.5,6;2,1;aspect;Signal Aspect]" form = form.."button[6.5,6;2,1;delete;Delete Route]" + + form = form.."button[5.5,7;3,1;newfrom;New From Route]" --atdebug(route.ars) form = form.."style[ars;font=mono]" - form = form.."textarea[0.8,7.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]" - form = form.."button[5.5,7.23;3,1;savears;Save ARS List]" + form = form.."textarea[0.8,8.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]" + form = form.."button[5.5,8.23;3,1;savears;Save ARS List]" minetest.show_formspec(pname, "at_il_routeedit_"..minetest.pos_to_string(sigd.p).."_"..sigd.s.."_"..routeid, form) @@ -139,6 +141,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) table.remove(tcbs.routes, routeid) advtrains.interlocking.show_signalling_form(sigd, pname) end + + if fields.newfrom then + advtrains.interlocking.init_route_prog(pname, sigd, route) + minetest.close_formspec(pname, formname) + tcbs.ars_ignore_next = nil + return + end if fields.ars and fields.savears then route.ars = atil.text_to_ars(fields.ars) diff --git a/mods/advtrains/advtrains_interlocking/routesetting.lua b/mods/advtrains/advtrains_interlocking/routesetting.lua index 67efaea8..fd6d595f 100644 --- a/mods/advtrains/advtrains_interlocking/routesetting.lua +++ b/mods/advtrains/advtrains_interlocking/routesetting.lua @@ -113,6 +113,7 @@ function ilrs.set_route(signal, route, try) if c_tcbs.signal then c_tcbs.route_committed = true c_tcbs.aspect = route.aspect or advtrains.interlocking.GENERIC_FREE + c_tcbs.route_rsn = nil c_tcbs.route_origin = signal advtrains.interlocking.update_signal_aspect(c_tcbs) end @@ -291,7 +292,13 @@ function ilrs.update_route(sigd, tcbs, newrte, cancel) end if newrte then tcbs.routeset = newrte end --atdebug("Setting:",tcbs.routeset) - local succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset]) + local succ, rsn, cbts, cblk + if tcbs.routes[tcbs.routeset] then + succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset]) + else + succ = false + rsn = attrans("Route state changed.") + end if not succ then tcbs.route_rsn = rsn --atdebug("Routesetting failed:",rsn) diff --git a/mods/advtrains/advtrains_interlocking/signal_api.lua b/mods/advtrains/advtrains_interlocking/signal_api.lua index 83fae4aa..c70366be 100644 --- a/mods/advtrains/advtrains_interlocking/signal_api.lua +++ b/mods/advtrains/advtrains_interlocking/signal_api.lua @@ -165,6 +165,55 @@ This function will query get_aspect to retrieve the new aspect. ]]-- +minetest.register_entity("advtrains_interlocking:ipmarker", { + visual = "mesh", + mesh = "trackplane.b3d", + textures = {"at_il_signal_ip.png"}, + collisionbox = {-1,-0.5,-1, 1,-0.4,1}, + visual_size = {x=10, y=10}, + on_punch = function(self) + self.object:remove() + end, + on_rightclick = function(self, player) + if self.signalpos and player and player:is_player() then + local node = minetest.get_node(self.signalpos) + if minetest.get_item_group(node.name, "advtrains_signal") ~= 0 then + advtrains.interlocking.show_ip_form(self.signalpos, player:get_player_name()) + end + end + end, + get_staticdata = function() return "STATIC" end, + on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end, + static_save = false, +}) + +local function clean_ipmarker(spos) + for _, luaentity in pairs(minetest.luaentities) do + if luaentity.name == "advtrains_interlocking:ipmarker" + and luaentity.signalpos + and vector.equals(luaentity.signalpos, spos) then + luaentity.object:remove() + end + end +end + +local function ipmarker(ipos, connid, spos) + if spos then + clean_ipmarker(spos) + end + + local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes) + if not node_ok then return end + + local obj = minetest.add_entity(vector.offset(ipos, 0, 0.2, 0), "advtrains_interlocking:ipmarker") + if not obj then return end + obj:set_yaw(advtrains.dir_to_angle(conns[connid].c)) + local luaentity = obj:get_luaentity() + if luaentity then + luaentity.signalpos = spos + end +end + local DANGER = { main = 0, dst = false, @@ -213,6 +262,7 @@ end function advtrains.interlocking.signal_after_dig(pos) -- clear influence point advtrains.interlocking.db.clear_ip_by_signalpos(pos) + clean_ipmarker(pos) end function advtrains.interlocking.signal_set_aspect(pos, asp) @@ -305,20 +355,6 @@ end local players_assign_ip = {} -local function ipmarker(ipos, connid) - local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes) - if not node_ok then return end - local yaw = advtrains.dir_to_angle(conns[connid].c) - - -- using tcbmarker here - local obj = minetest.add_entity(vector.add(ipos, {x=0, y=0.2, z=0}), "advtrains_interlocking:tcbmarker") - if not obj then return end - obj:set_yaw(yaw) - obj:set_properties({ - textures = { "at_il_signal_ip.png" }, - }) -end - -- shows small info form for signal IP state/assignment -- only_notset: show only if it is not set yet (used by signal tcb assignment) function advtrains.interlocking.show_ip_form(pos, pname, only_notset) @@ -333,7 +369,7 @@ function advtrains.interlocking.show_ip_form(pos, pname, only_notset) form = form.."button_exit[0.5,2.5; 5,1;set;Move]" form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]" local ipos = minetest.string_to_pos(pts) - ipmarker(ipos, connid) + ipmarker(ipos, connid, pos) else form = form.."label[0.5,1.5;Influence point is not set.]" form = form.."label[0.5,2.0;It is recommended to set an influence point.]" @@ -361,6 +397,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) advtrains.interlocking.signal_init_ip_assign(pos, pname) elseif fields.clear then advtrains.interlocking.db.clear_ip_by_signalpos(pos) + clean_ipmarker(pos) end end end) @@ -397,7 +434,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) local pts = advtrains.roundfloorpts(pos) if not advtrains.interlocking.db.get_ip_signal_asp(pts, plconnid) then advtrains.interlocking.db.set_ip_signal(pts, plconnid, signalpos) - ipmarker(pos, plconnid) + ipmarker(pos, plconnid, signalpos) minetest.chat_send_player(pname, "Configuring Signal: Successfully set influence point") else minetest.chat_send_player(pname, "Configuring Signal: Influence point of another signal is already present!") diff --git a/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua b/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua index 0cc10da1..264834cc 100755 --- a/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua +++ b/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua @@ -550,6 +550,13 @@ minetest.register_entity("advtrains_interlocking:tcbmarker", { static_save = false, }) +function advtrains.interlocking.remove_tcb_marker_pts(pts) + if markerent[pts] then + markerent[pts]:remove() + markerent[pts] = nil + end +end + function advtrains.interlocking.show_tcb_marker(pos) --atdebug("showing tcb marker",pos) local tcb = ildb.get_tcb(pos) @@ -573,9 +580,7 @@ function advtrains.interlocking.show_tcb_marker(pos) end local pts = advtrains.roundfloorpts(pos) - if markerent[pts] then - markerent[pts]:remove() - end + advtrains.interlocking.remove_tcb_marker_pts(pts) local obj = minetest.add_entity(pos, "advtrains_interlocking:tcbmarker") if not obj then return end @@ -652,14 +657,22 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name) end form = form.."label[0.5,2.5;Routes:]" - form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",").."]" + form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",") if sel_rte then + form = form .. ";" .. sel_rte .."]" form = form.."button[0.5,6; 5,1;setroute;Set Route]" form = form.."button[0.5,7;2,1;dsproute;Show]" if hasprivs then form = form.."button[3.5,7;2,1;editroute;Edit]" + if sel_rte > 1 then + form = form .. "button[5.5,4;0.5,0.3;moveup;↑]" + end + if sel_rte < #strtab then + form = form .. "button[5.5,4.7;0.5,0.3;movedown;↓]" + end end else + form = form .. "]" if tcbs.ars_disabled then form = form.."label[0.5,6 ;NOTE: ARS is disabled.]" form = form.."label[0.5,6.5;Routes are not automatically set.]" @@ -810,6 +823,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.noauto then tcbs.route_auto = false end + + if sel_rte and tcbs.routes[sel_rte]and not tcbs.routeset then + if fields.moveup then + if tcbs.routes[sel_rte - 1] then + tcbs.routes[sel_rte - 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte - 1] + sel_rte = sel_rte - 1 + end + elseif fields.movedown then + if tcbs.routes[sel_rte + 1] then + tcbs.routes[sel_rte + 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte + 1] + sel_rte = sel_rte + 1 + end + end + end advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, true) return diff --git a/mods/advtrains/advtrains_interlocking/tsr_rail.lua b/mods/advtrains/advtrains_interlocking/tsr_rail.lua index f3025406..c1e3c1c7 100644 --- a/mods/advtrains/advtrains_interlocking/tsr_rail.lua +++ b/mods/advtrains/advtrains_interlocking/tsr_rail.lua @@ -3,13 +3,15 @@ -- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything. -- This code resembles the code in lines/stoprail.lua +local S = attrans + local function updateform(pos) local meta = minetest.get_meta(pos) local pe = advtrains.encode_pos(pos) local npr = advtrains.interlocking.npr_rails[pe] or 2 - meta:set_string("infotext", "Point speed restriction: "..npr) - meta:set_string("formspec", "field[npr;Set point speed restriction:;"..npr.."]") + meta:set_string("infotext", S("Point speed restriction: @1",npr)) + meta:set_string("formspec", "field[npr;"..S("Set point speed restriction:")..";"..npr.."]") end @@ -25,11 +27,11 @@ local adefunc = function(def, preset, suffix, rotation) on_receive_fields = function(pos, formname, fields, player) local pname = player:get_player_name() if not minetest.check_player_privs(pname, {interlocking=true}) then - minetest.chat_send_player(pname, "Interlocking privilege required!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track without the @1 privilege.", "interlocking")) return end if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "This rail is protected!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track.")) minetest.record_protection_violation(pos, pname) return end @@ -59,7 +61,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_npr.png", - description="Point Speed Restriction Rail", + description=S("Point Speed Restriction Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/mods/advtrains/advtrains_line_automation/stoprail.lua b/mods/advtrains/advtrains_line_automation/stoprail.lua index 55a4785a..6c74a3de 100644 --- a/mods/advtrains/advtrains_line_automation/stoprail.lua +++ b/mods/advtrains/advtrains_line_automation/stoprail.lua @@ -28,7 +28,7 @@ local function show_stoprailform(pos, player) local pe = advtrains.encode_pos(pos) local pname = player:get_player_name() if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -73,7 +73,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = advtrains.decode_pos(pe) if pos then if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -94,7 +94,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stdata.stn = fields.stn else - minetest.chat_send_player(pname, "Station code '"..fields.stn.."' does already exist and is owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("Station code \"@1\" already exists and is owned by @2.", fields.stn, stn.owner)) show_stoprailform(pos,player) return end @@ -108,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stn.name = fields.stnname else - minetest.chat_send_player(pname, "Not allowed to edit station name, owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("This station is owned by @1. You are not allowed to edit its name.", stn.owner)) end end @@ -218,7 +218,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_stop.png", - description="Station/Stop Rail", + description=attrans("Station/Stop Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/mods/advtrains/advtrains_luaautomation/README.md b/mods/advtrains/advtrains_luaautomation/README.md old mode 100755 new mode 100644 index 67a4b803..275653c0 --- a/mods/advtrains/advtrains_luaautomation/README.md +++ b/mods/advtrains/advtrains_luaautomation/README.md @@ -93,6 +93,9 @@ Removes any pending interrupts of this node. Make this active component send a digiline message on the specified channel. Not available in init code. + - `trainparts(train_id)` + returns a table with the ids of the cars the train is composed of, or false if `train_id` is invalid. `train_id` can be replaced with `atc_id` when used in LuaATC Rails. + - `atc_send_to_train(, )` Sends the specified ATC command to the train specified by its train id. This happens regardless of where the train is in the world, and can be used to remote-control trains. Returns true on success. If the train ID does not exist, returns false and does nothing. See [atc_command.txt](../atc_command.txt) for the ATC command syntax. @@ -142,22 +145,16 @@ asp = { -- the character of call_on and dead_end is purely informative call_on = , -- Call-on route, expect train in track ahead (not implemented yet) dead_end = , -- Route ends on a dead end (e.g. bumper) (not implemented yet) - - w_speed = , - -- "Warning speed restriction". Supposed for short-term speed - -- restrictions which always override any other restrictions - -- imposed by "speed" fields, until lifted by a value of -1 - -- (Example: german Langsamfahrstellen-Signale) } ``` -As of January 2020, the 'dst', 'call_on' and 'dead_end' fields are not used. +As of September 2024, the 'dst', 'call_on' and 'dead_end' fields are not used. #### Lines The advtrains_line_automation component adds a few contraptions that should make creating timeable systems easier. Part of its functionality is also available in LuaATC: -- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:lines:rwt) +- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:api:railway_time_api) - `schedule(rw_time, msg)`, `schedule_in(rw_dtime, msg)` Schedules an event of type {type="schedule", schedule=true, msg=msg} at (resp. after) the specified railway time (which can be in any format). You can only schedule one event this way. (uses the new lines-internal scheduler) @@ -255,7 +252,10 @@ In addition to the above environment functions, the following functions are avai The interlocking system uses this property for Automatic Routesetting. #### Shunting Functions and Variables -There are several functions available especially for shunting operations. Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive: +There are several functions available especially for shunting operations. +Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive. +FCs are composed of codes separated by exclamation marks (`!`), for instance `"foo!bar!baz"`. +Each wagon has a current FC, indicating its next destination. - `split_at_index(index, atc_command)` Splits the train at the specified index, into a train with index-1 wagons and a second train starting with the index-th wagon. The `atc_command` specified is sent to the second train after decoupling. `"S0"` or `"B0"` is common to ensure any locomotives in the remaining train don't continue to move. @@ -266,6 +266,25 @@ There are several functions available especially for shunting operations. Some o Command: `split_at_index(4,"S0")` Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"` + - `get_fc()` + Returns a table with the entire FC list for each wagon in the train. + Command: `get_fc()` + Result: `{"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"}` + + - `get_fc_index()` + Returns a table with the current FC index for each wagon in the train. Use in conjunction with the result from `get_fc()` to find a the current FC for a wagon. + Command: `get_fc_index()` + Result: `{1, 1, 1, 2, 1}` + + - `set_fc(fc_list, reset_index)` + Overwrites the FC list according to a table `fc_list`. A false or nil entry will leave the wagon unaffected, however all others will be overwritten. + Useful for mass-programming freight trains that use FC-shunting instead of walking to each wagon individually. If the new FC entry for a wagon is shorter than the old entry, the index will clip to the last FC in the new entry. + If `reset_index` is true, all Current FC values will reset to the first entry in the list, instead of remaining at the current index. + + Example: train has FC lists: `"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"` + Command: `set_fc({"", "foo!turtle", nil, "4tehlulz", false})` + Result: `""` `"foo!turtle"` `"testing"` `"4tehlulz"` `"hello_world"` + - `split_at_fc(atc_command, len)` Splits the train in such a way that all cars with non-empty current FC of the first part of the train have the same FC. The `atc_command` specified is sent to the rear part, as with split_at_index. It returns the fc of the cars of the first part. @@ -289,15 +308,11 @@ There are several functions available especially for shunting operations. Some o first part of the train as above. - `step_fc()` - Steps the FCs of all train cars forward. FCs are composed of codes - separated by exclamation marks (`!`), for instance - `"foo!bar!baz"`. Each wagon has a current FC, indicating its next - destination. Stepping the freight code forward, selects the next - code after the !. If the end of the string is reached, then the + Steps the FCs of all train cars forward, selecting the next + code after the `!`. If the end of the string is reached, then the first code is selected, except if the string ends with a question mark (`?`), then the order is reversed. - - `train_length()` returns the number of cars the train is composed of. diff --git a/mods/advtrains/advtrains_luaautomation/active_common.lua b/mods/advtrains/advtrains_luaautomation/active_common.lua index 50fb2bc0..074d3b34 100644 --- a/mods/advtrains/advtrains_luaautomation/active_common.lua +++ b/mods/advtrains/advtrains_luaautomation/active_common.lua @@ -1,4 +1,4 @@ - +local S = atltrans local ac = {nodes={}} @@ -14,7 +14,7 @@ end function ac.after_place_node(pos, player) local meta=minetest.get_meta(pos) meta:set_string("formspec", ac.getform(pos, meta)) - meta:set_string("infotext", "LuaATC component, unconfigured.") + meta:set_string("infotext", S("Unconfigured LuaATC component")) local ph=minetest.pos_to_string(pos) --just get first available key! for en,_ in pairs(atlatc.envs) do @@ -43,11 +43,11 @@ function ac.getform(pos, meta_p) end local form = "size["..atlatc.CODE_FORM_SIZE.."]" .."style[code;font=mono]" - .."label[0,-0.1;Environment]" + .."label[0,-0.1;"..S("LuaATC Environment").."]" .."dropdown[0,0.3;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" - .."button[5,0.2;2,1;save;Save]" - .."button[7,0.2;3,1;cle;Clear Local Env.]" - .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Code;"..minetest.formspec_escape(code).."]" + .."button[5,0.2;2,1;save;"..S("Save").."]" + .."button[7,0.2;3,1;cle;"..S("Clear Local Environment").."]" + .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;"..S("Code")..";"..minetest.formspec_escape(code).."]" .."label["..atlatc.CODE_FORM_ERRLABELPOS..";"..err.."]" return form end @@ -55,13 +55,17 @@ end function ac.after_dig_node(pos, node, player) advtrains.invalidate_all_paths(pos) advtrains.ndb.clear(pos) + atlatc.interrupt.clear_ints_at_pos(pos) + if advtrains.lines and advtrains.lines.sched then + advtrains.lines.sched.discard_all(advtrains.encode_pos(pos)) + end local ph=minetest.pos_to_string(pos) ac.nodes[ph]=nil end function ac.on_receive_fields(pos, formname, fields, player) if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then - minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") + minetest.chat_send_player(player:get_player_name(), S("You are not allowed to configure this LuaATC component without the @1 privilege.", "atlatc")) return end @@ -91,9 +95,9 @@ function ac.on_receive_fields(pos, formname, fields, player) meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then - meta:set_string("infotext", "LuaATC component, assigned to environment '"..nodetbl.env.."'") + meta:set_string("infotext", S("LuaATC component assigned to environment '@1'", nodetbl.env)) else - meta:set_string("infotext", "LuaATC component, invalid enviroment set!") + meta:set_string("infotext", S("LuaATC component assigned to an invalid environment")) end end @@ -168,7 +172,7 @@ function ac.run_in_env(pos, evtdata, customfct_p, ignore_no_code) atlatc.active.nodes[ph].err=dataout env:log("error", "LuaATC component at",ph,": LUA Error:",dataout) if meta then - meta:set_string("infotext", "LuaATC component, ERROR:"..dataout) + meta:set_string("infotext", S("LuaATC component with error: @1", dataout)) end --TODO temporary --if customfct.atc_id then diff --git a/mods/advtrains/advtrains_luaautomation/atc_rail.lua b/mods/advtrains/advtrains_luaautomation/atc_rail.lua index 5dde99c8..dd26f51f 100644 --- a/mods/advtrains/advtrains_luaautomation/atc_rail.lua +++ b/mods/advtrains/advtrains_luaautomation/atc_rail.lua @@ -91,6 +91,47 @@ function r.fire_event(pos, evtdata, appr_internal) if not train_id then return false end advtrains.train_step_fc(train) end, + get_fc = function() + if not train_id then return end + local fc_list = {} + for index,wagon_id in ipairs(train.trainparts) do + fc_list[index] = table.concat(advtrains.wagons[wagon_id].fc or {},"!") + end + return fc_list + end, + get_fc_index = function() + if not train_id then return end + local fc_index_list = {} + for widx, wagon_id in ipars(train.trainparts) do + fc_index_list[widx] = advtrains.wagons[wagon_id].fcind or 1 + end + return fc_index_list + end, + set_fc = function(fc_list,reset_index) + assertt(fc_list, "table") + if not train_id then return false end + -- safety type-check for entered values + for _,v in ipairs(fc_list) do + if v and type(v) ~= "string" then + error("FC entries must be a string") + return + end + end + for index,wagon_id in ipairs(train.trainparts) do + if fc_list[index] then -- has FC to enter to this wagon + local data = advtrains.wagons[wagon_id] + if data then -- wagon actually exists + --effectively copyied from wagons.lua, allowing for the :split function and reset_index + data.fc = fc_list[index]:split("!") + if reset_index or not data.fcind then + data.fcind = 1 + elseif data.fcind > #data.fc then + data.fcind = #data.fc + end + end + end + end + end, set_shunt = function() -- enable shunting mode if not train_id then return false end @@ -187,7 +228,7 @@ advtrains.register_tracks("default", { models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_atc.png", - description=atltrans("LuaATC Rail"), + description=atltrans("LuaATC Track"), formats={}, get_additional_definiton = function(def, preset, suffix, rotation) return { diff --git a/mods/advtrains/advtrains_luaautomation/environment.lua b/mods/advtrains/advtrains_luaautomation/environment.lua old mode 100755 new mode 100644 index 6b1a2837..b54d45c2 --- a/mods/advtrains/advtrains_luaautomation/environment.lua +++ b/mods/advtrains/advtrains_luaautomation/environment.lua @@ -153,6 +153,12 @@ local static_env = { local pos=atlatc.pcnaming.resolve_pos(parpos, "interrupt_pos") atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg}) end, + train_parts = function(train_id) + if not train_id then return false end + local train = advtrains.trains[train_id] + if not train then return false end + return table.copy(train.trainparts or {}) + end, -- sends an atc command to train regardless of where it is in the world atc_send_to_train = function(train_id, command) assertt(command, "string") @@ -164,6 +170,9 @@ local static_env = { return false end end, + get_slowdown = function() + return advtrains.global_slowdown + end } -- If interlocking is present, enable route setting functions @@ -221,7 +230,7 @@ if advtrains.interlocking then end static_env.set_aspect = function(signal, asp) local pos = atlatc.pcnaming.resolve_pos(signal) - return advtrains.interlocking.signal_set_aspect(pos) + return advtrains.interlocking.signal_set_aspect(pos,asp) end --section_occupancy() @@ -229,11 +238,8 @@ if advtrains.interlocking then if not ts_id then return nil end ts_id = tostring(ts_id) local response = advtrains.interlocking.db.get_ts(ts_id) - if response == nil then - return false - else - return response.trains - end + if not response then return false end + return (response.trains and table.copy(response.trains)) or {} end end @@ -262,6 +268,11 @@ if advtrains.lines then } end + +atlatc.register_function = function (name, f) + static_env[name] = f +end + for _, name in pairs(safe_globals) do static_env[name] = _G[name] end diff --git a/mods/advtrains/advtrains_luaautomation/init.lua b/mods/advtrains/advtrains_luaautomation/init.lua index c51aa71e..b359142d 100644 --- a/mods/advtrains/advtrains_luaautomation/init.lua +++ b/mods/advtrains/advtrains_luaautomation/init.lua @@ -2,15 +2,15 @@ -- Lua automation features for advtrains -- Uses global table 'atlatc' (AdvTrains_LuaATC) ---TODO: re-add localization (if merging localization, discard this hunk please) -atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end +atltrans = attrans +local S = atltrans --Privilege --Only trusted players should be enabled to build stuff which can break the server. atlatc = { envs = {}} -minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false }) +minetest.register_privilege("atlatc", { description = S("Can place and configure LuaATC components, including execute potentially harmful Lua code"), give_to_singleplayer = false, default= false }) --Size of code input forms in X,Y notation. Must be at least 10x10 atlatc.CODE_FORM_SIZE = "15,12" diff --git a/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua b/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua index bffff84e..69818399 100644 --- a/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua +++ b/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua @@ -6,6 +6,7 @@ -- From Mesecons mod https://mesecons.net/ -- (c) Jeija and Contributors +local S = atltrans local BASENAME = "advtrains_luaautomation:mesecon_controller" local rules = { @@ -207,7 +208,7 @@ for d = 0, 1 do } minetest.register_node(node_name, { - description = "LuaATC Mesecon Controller", + description = S("LuaATC Mesecon Controller"), drawtype = "nodebox", tiles = { top, diff --git a/mods/advtrains/advtrains_luaautomation/operation_panel.lua b/mods/advtrains/advtrains_luaautomation/operation_panel.lua index bfbbda41..8e12651f 100644 --- a/mods/advtrains/advtrains_luaautomation/operation_panel.lua +++ b/mods/advtrains/advtrains_luaautomation/operation_panel.lua @@ -1,13 +1,14 @@ +local S = atltrans -local function on_punch(pos, player) - atlatc.interrupt.add(0, pos, {type="punch", punch=true}) +local function on_punch(pos,node,player) + atlatc.interrupt.add(0, pos, {type="punch", punch=true, name=player:get_player_name()}) end minetest.register_node("advtrains_luaautomation:oppanel", { drawtype = "normal", tiles={"atlatc_oppanel.png"}, - description = "LuaATC operation panel", + description = S("LuaATC Operation Panel"), groups = { cracky = 1, save_in_at_nodedb=1, diff --git a/mods/advtrains/advtrains_luaautomation/pcnaming.lua b/mods/advtrains/advtrains_luaautomation/pcnaming.lua index 71f4d9a4..0089ae71 100644 --- a/mods/advtrains/advtrains_luaautomation/pcnaming.lua +++ b/mods/advtrains/advtrains_luaautomation/pcnaming.lua @@ -2,6 +2,8 @@ --a.k.a Passive component naming --Allows to assign names to passive components, so they can be called like: --setstate("iamasignal", "green") +local S = atltrans + atlatc.pcnaming={name_map={}} function atlatc.pcnaming.load(stuff) if type(stuff)=="table" then @@ -22,8 +24,11 @@ function atlatc.pcnaming.resolve_pos(pos, func_name) error("Invalid position supplied to " .. (func_name or "???")..": " .. dump(pos)) end + +local pcrename = {} + minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ - description = attrans("Passive Component Naming Tool\n\nRight-click to name a passive component."), + description = S("Passive Component Naming Tool\n\nRight-click to name a passive component."), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "atlatc_pcnaming.png", wield_image = "atlatc_pcnaming.png", @@ -34,7 +39,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ return end if not minetest.check_player_privs(pname, {atlatc=true}) then - minetest.chat_send_player(pname, "Missing privilege: atlatc") + minetest.chat_send_player(pname, S("You are not allowed to name LuaATC passive components without the @1 privilege.", "atlatc")) return end if pointed_thing.type=="node" then @@ -43,6 +48,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ minetest.record_protection_violation(pos, pname) return end + local node = advtrains.ndb.get_node(pos) local ndef = minetest.registered_nodes[node.name] if node.name and ( @@ -57,16 +63,17 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ pn=name end end - minetest.show_formspec(pname, "atlatc_naming_"..minetest.pos_to_string(pos), "field[pn;Set name of component (empty to clear);"..minetest.formspec_escape(pn).."]") + pcrename[pname] = pos + minetest.show_formspec(pname, "atlatc_naming", "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]") end end end, }) minetest.register_on_player_receive_fields(function(player, formname, fields) - local pts=string.match(formname, "^atlatc_naming_(.+)") - if pts then - local pos=minetest.string_to_pos(pts) - if fields.pn then + if formname == "atlatc_naming" then + local pname = player:get_player_name() + local pos=pcrename[pname] + if fields.pn and pos then --first remove all occurences for name, npos in pairs(atlatc.pcnaming.name_map) do if vector.equals(npos, pos) then diff --git a/mods/advtrains/advtrains_signals_ks/init.lua b/mods/advtrains/advtrains_signals_ks/init.lua index e97eb77e..258b8683 100755 --- a/mods/advtrains/advtrains_signals_ks/init.lua +++ b/mods/advtrains/advtrains_signals_ks/init.lua @@ -210,6 +210,8 @@ for _, rtab in ipairs({ danger = {asp = { main = false, shunt = false }, n = "shuntd", ici=true}, shuntd = {asp = { main = false, shunt = true } , n = "danger"}, }) do + local sbox = table.copy(rtab.sbox) + sbox[5] = 0 minetest.register_node("advtrains_signals_ks:ra_"..typ.."_"..rot, { description = "Ks Shunting Signal", drawtype = "mesh", @@ -223,7 +225,11 @@ for _, rtab in ipairs({ paramtype2 = "facedir", selection_box = { type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4} + fixed = {sbox, rotation_sbox} + }, + collision_box = { + type = "fixed", + fixed = sbox, }, groups = { cracky = 2, @@ -444,6 +450,23 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "advtrains_signals_ks:zs3_off_0 2", + recipe = { + {"","default:steel_ingot",""}, + {"default:steel_ingot","dye:white","default:steel_ingot"}, + {"","advtrains_signals_ks:mast_mast_0",""} + }, +}) +minetest.register_craft({ + output = "advtrains_signals_ks:zs3v_off_0 2", + recipe = { + {"","default:steel_ingot",""}, + {"default:steel_ingot","dye:yellow","default:steel_ingot"}, + {"","advtrains_signals_ks:mast_mast_0",""} + }, +}) + local sign_material = "default:sign_wall_steel" --fallback if minetest.get_modpath("basic_materials") then sign_material = "basic_materials:plastic_sheet" diff --git a/mods/advtrains/advtrains_train_track/init.lua b/mods/advtrains/advtrains_train_track/init.lua old mode 100755 new mode 100644 index 87720e23..32e12356 --- a/mods/advtrains/advtrains_train_track/init.lua +++ b/mods/advtrains/advtrains_train_track/init.lua @@ -1,6 +1,182 @@ -- Default tracks for advtrains -- (c) orwell96 and contributors +local default_boxen = { + ["st"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2}, + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, + + ["cr"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6875, -0.3750, 0.5000}, + {-0.3750, -0.5000, -1.000, 1.000, -0.3750, 0.000} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.7500, -0.3750, 0.8750}, + {-0.3750, -0.5000, 0.8750, 0.2500, -0.3750, 1.188}, + {0.7500, -0.5000, 0.2500, 1.063, -0.3750, 0.8750} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.125, 0.5000, -0.3750, 0.6875}, + {-0.8750, -0.5000, -0.9375, -0.5000, -0.3750, 0.06250}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8125, -0.5000, -0.5000, 1.188, -0.3750, 0.5000}, + {-0.1875, -0.5000, 0.5000, 0.8750, -0.3125, 0.8750}, + {-0.2500, -0.5000, -0.9375, 0.3125, -0.3125, -0.5000} + } + } + }, + }, + + ["swlst"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000}, + {-0.3125, -0.5000, -1.000, 0.9375, -0.3125, -0.06250} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.1875, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.8125, -0.5000, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, + + ["swrst"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000}, + {-0.8125, -0.5000, -1.000, 0.4375, -0.3125, -0.06250} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.1875, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.5000, -0.5000, 0.5000, 0.5000, -0.3750, 0.8750}, + {-0.8125, -0.5000, -0.8750, 0.5000, -0.3750, -0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, +} + +default_boxen["swlcr"] = default_boxen["swlst"] +default_boxen["swrcr"] = default_boxen["swrst"] + --flat advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack", @@ -10,6 +186,14 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Track"), formats={}, + + get_additional_definiton = function(def, preset, suffix, rotation) + if default_boxen[suffix] ~= nil and default_boxen[suffix][rotation] ~= nil then + return default_boxen[suffix][rotation] + else + return {} + end + end, }, advtrains.ap.t_30deg_flat) minetest.register_craft({ @@ -21,6 +205,59 @@ minetest.register_craft({ }, }) +local y3_boxen = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8750, -0.5000, -1.125, 0.8750, -0.3750, 0.4375} + } + } + }, + + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625}, + {0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000}, + } + } + }, + + --UX FIXME: - 3way - have to place straight route before l and r or the + --nodebox overlaps too much and can't place the straight track node. + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.1250, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-1.1250, -0.5000, -0.9375, -0.5000, -0.3750, 0.5000} + } + } + }, + + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + --{-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000}, + {-0.875, -0.5000, -0.5, 1.0, -0.3750, 0.5}, + --{-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625}, + {-0.4375, -0.5000, -0.8750, 0.5625, -0.3750, -0.5000}, + --{0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000}, + {-0.2500, -0.5000, -0.2500, 1.0000, -0.3750, 0.8125}, + } + } + }, +} + + +local function y3_turnouts_addef(def, preset, suffix, rotation) + return y3_boxen[rotation] or {} +end -- y-turnout advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_sy", @@ -30,6 +267,7 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Y-turnout"), formats = {}, + get_additional_definiton = y3_turnouts_addef, }, advtrains.ap.t_yturnout) minetest.register_craft({ output = 'advtrains:dtrack_sy_placer 2', @@ -48,6 +286,7 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("3-way turnout"), formats = {}, + get_additional_definiton = y3_turnouts_addef, }, advtrains.ap.t_s3way) minetest.register_craft({ output = 'advtrains:dtrack_s3_placer 1', @@ -59,6 +298,35 @@ minetest.register_craft({ }) -- Diamond Crossings + +local perp_boxen = { + [""] = {}, --default size + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8125, -0.5000, -0.8125, 0.8125, -0.3750, 0.8125} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, +} + -- perpendicular advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_xing", @@ -67,7 +335,10 @@ advtrains.register_tracks("default", { models_suffix=".obj", shared_texture="advtrains_dtrack_shared.png", description=attrans("Perpendicular Diamond Crossing Track"), - formats = {} + formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return perp_boxen[rotation] or {} + end }, advtrains.ap.t_perpcrossing) minetest.register_craft({ @@ -79,6 +350,73 @@ minetest.register_craft({ } }) +local ninety_plus_boxen = { + ["30l"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["30r"] = { + selection_box = { + type = "fixed", + fixed = { + {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000}, + {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500}, + {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000}, + {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000} + } + } + }, + ["45l"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["60l"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60r"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, +} + -- 90plusx -- When you face east and param2=0, then this set of rails has a rail at 90 -- degrees to the viewer, plus another rail crossing at 30, 45 or 60 degrees. @@ -89,7 +427,10 @@ advtrains.register_tracks("default", { models_suffix=".obj", shared_texture="advtrains_dtrack_shared.png", description=attrans("90+Angle Diamond Crossing Track"), - formats = {} + formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return ninety_plus_boxen[suffix] or {} + end, }, advtrains.ap.t_90plusx_crossing) minetest.register_craft({ output = 'advtrains:dtrack_xing90plusx_placer 2', @@ -99,6 +440,7 @@ minetest.register_craft({ {'', '', 'advtrains:dtrack_placer'} } }) + -- Deprecate any rails using the old name scheme minetest.register_lbm({ label = "Upgrade legacy 4590 rails", @@ -119,6 +461,83 @@ minetest.register_lbm({ -- This will replace any items left in the inventory minetest.register_alias("advtrains:dtrack_xing4590_placer", "advtrains:dtrack_xing90plusx_placer") +local diagonal_boxen = { + ["30r45l"] = { + selection_box = { + type = "fixed", + fixed = { + {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000}, + {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500}, + {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000}, + {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000} + } + } + }, + ["60l30l"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60l60r"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, + ["60r30r"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, + ["30l45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["60l45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60r45l"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, +} + -- Diagonal -- This set of rail crossings is named based on the angle of each intersecting -- direction when facing east and param2=0. Rails with l/r swapped are mirror @@ -131,6 +550,9 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Diagonal Diamond Crossing Track"), formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return diagonal_boxen[suffix] or {} + end, }, advtrains.ap.t_diagonalcrossing) minetest.register_craft({ output = 'advtrains:dtrack_xingdiag_placer 2', @@ -256,8 +678,45 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +local function load_wagon(wagon_id, node_inv, node_fc, unload) + local inv_modified = false + local w_inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..wagon_id}) + if w_inv and w_inv:get_list("box") then + + local wagon_data = advtrains.wagons[wagon_id] + local wagon_fc + if wagon_data.fc then + if not wagon_data.fcind then wagon_data.fcind = 1 end + wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or "" + end + + if node_fc == "" or wagon_fc == node_fc then + if not unload then + for _, item in ipairs(node_inv:get_list("main")) do + if w_inv:get_list("box") and w_inv:room_for_item("box", item) then + w_inv:add_item("box", item) + node_inv:remove_item("main", item) + if item.name ~= "" then inv_modified = true end + end + end + else + for _, item in ipairs(w_inv:get_list("box")) do + if node_inv:get_list("main") and node_inv:room_for_item("main", item) then + w_inv:remove_item("box", item) + node_inv:add_item("main", item) + if item.name ~= "" then inv_modified = true end + end + end + end + end + end + return inv_modified +end -local function train_load(pos, train_id, unload) +local function load_entire_train(pos, train_id, unload) -- flood load when not in an active area + if advtrains.is_node_loaded(pos) then -- leave the loading to the nodetimer if area is loaded + return + end local train=advtrains.trains[train_id] local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z}) if not string.match(below.name, "chest") then @@ -270,43 +729,60 @@ local function train_load(pos, train_id, unload) --track section is disabled return end - - local inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) - if inv and train.velocity < 2 then - for k, v in ipairs(train.trainparts) do - local i=minetest.get_inventory({type="detached", name="advtrains_wgn_"..v}) - if i and i:get_list("box") then - - local wagon_data = advtrains.wagons[v] - local wagon_fc - if wagon_data.fc then - if not wagon_data.fcind then wagon_data.fcind = 1 end - wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or "" - end - - if node_fc == "" or wagon_fc == node_fc then - if not unload then - for _, item in ipairs(inv:get_list("main")) do - if i:get_list("box") and i:room_for_item("box", item) then - i:add_item("box", item) - inv:remove_item("main", item) - end - end - else - for _, item in ipairs(i:get_list("box")) do - if inv:get_list("main") and inv:room_for_item("main", item) then - i:remove_item("box", item) - inv:add_item("main", item) - end + local node_inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) + if node_inv and train.velocity <= 2 then + for _, wagon_id in ipairs(train.trainparts) do + load_wagon(wagon_id, node_inv, node_fc, unload) + end + end +end + +local function load_wagon_on_timer(pos, unload) -- loading ramp when in an active area + if not advtrains.is_node_loaded(pos) then -- leave the loading for the flood load function. we're out of area + return true -- reset the nodetimer until the node is loaded again + end + local tid, tidx = advtrains.get_train_at_pos(pos) + if not tid or tid == "" then + return true + end -- no train to load. + + local train = advtrains.trains[tid] + local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z}) + if not string.match(below.name, "chest") then + atprint("this is not a chest! at "..minetest.pos_to_string(pos)) + return true + end + local node_fc = minetest.get_meta(pos):get_string("fc") or "" + if node_fc == "#" then + --track section is disabled + return true + end + local node_inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) + if node_inv and train.velocity <= 2 then + local _, wagon_id, wagon_data = advtrains.get_wagon_at_index(tid, tidx) + if wagon_id then + local inv_modified = load_wagon(wagon_id, node_inv, node_fc, unload) + if inv_modified then + if advtrains.wagon_prototypes[advtrains.get_wagon_prototype(wagon_data)].set_textures then + local wagon_object = advtrains.wagon_objects[wagon_id] + if wagon_object and wagon_data then + local ent = wagon_object:get_luaentity() + if ent and ent.set_textures then + ent:set_textures(wagon_data) end end end end end end + return true end - +local nodetimer_interval = minetest.settings:get("advtrains_loading_track_timer") or 1 +local function start_nodetimer(pos) + local timer = minetest.get_node_timer(pos) + timer:start(nodetimer_interval) +end advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_unload", @@ -325,9 +801,16 @@ advtrains.register_tracks("default", { on_rightclick = function(pos, node, player) show_fc_formspec(pos, player) end, + after_place_node = function(pos) + advtrains.ndb.update(pos) + start_nodetimer(pos) + end, + on_timer = function(pos) + return load_wagon_on_timer(pos, true) + end, advtrains = { on_train_enter = function(pos, train_id) - train_load(pos, train_id, true) + load_entire_train(pos, train_id, true) end, }, } @@ -350,9 +833,16 @@ advtrains.register_tracks("default", { on_rightclick = function(pos, node, player) show_fc_formspec(pos, player) end, + after_place_node = function(pos) + advtrains.ndb.update(pos) + start_nodetimer(pos) + end, + on_timer = function(pos) + return load_wagon_on_timer(pos, false) + end, advtrains = { on_train_enter = function(pos, train_id) - train_load(pos, train_id, false) + load_entire_train(pos, train_id, false) end, }, } @@ -366,7 +856,6 @@ if minetest.get_modpath("basic_materials") then elseif minetest.get_modpath("technic") then loader_core = "technic:control_logic_unit" end ---print("Loader Core: "..loader_core) minetest.register_craft({ type="shapeless", diff --git a/mods/advtrains/advtrains_train_track/settingtypes.txt b/mods/advtrains/advtrains_train_track/settingtypes.txt new file mode 100644 index 00000000..0af0081c --- /dev/null +++ b/mods/advtrains/advtrains_train_track/settingtypes.txt @@ -0,0 +1,4 @@ +# Set the nodetimer delay for the loading tracks. +# A longer delay may cause wagons to be missed if the pass over too fast. +# A shorter delay may cause lag as wagons are checked multiple times as they pass over. +advtrains_loading_track_timer (Loading Track Timer) int 1 \ No newline at end of file diff --git a/mods/ambience/README.md b/mods/ambience/README.md index 689ca017..8eee2fd8 100644 --- a/mods/ambience/README.md +++ b/mods/ambience/README.md @@ -20,5 +20,9 @@ Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers - 1.5 - Added 'flame_sound' and fire redo check, code tidy and tweak, added ephemeral flag for background sounds. - 1.6 - Finding env_sounds disables water and lava sets, added 'ambience_water_move' flag to override water walking sounds, use eye level for head node. - 1.7 - Music will play every 20-30 minutes if found, use '/mvol 0' to stop playing music or disable in-game. +- 1.8 - Players can set induvidual volume for sound and music which is saved. +- 1.9 - Tidy code, refactor music playing, add biome name to sound_check. +- 2.0 - Add Mineclone support, add ethereal leaf check, remove minetest.after for custom timer, add Polish translation, tweak & tidy code. +- 2.1 - Add ambience.group_total() function for easy counting of group: nodes inside a set. Code license: MIT diff --git a/mods/ambience/api.txt b/mods/ambience/api.txt index fb97081d..d682f475 100644 --- a/mods/ambience/api.txt +++ b/mods/ambience/api.txt @@ -27,6 +27,7 @@ ambience.add_set(set_name, def) 'positions' position data for every node found 'head_node' name of node at player head level 'feet_node' nameof node at player foot level + 'biome' name of biome at current position This will let you add a set or sounds with the frequency it's used and check function for it to play. If ephemeral is true then no handler will be used and sound will be played in background alongside other sounds. @@ -42,14 +43,22 @@ ambience.add_set("windy", { {name = "crow", length = 3, ephemeral = true}, }, sound_check = function(def) - local number = totals["default:sand"] or 0 -- yep, can also be nil + local number = def.totals["default:sand"] or 0 -- yep, can also be nil if number > 20 then return "windy", 0.2 -- return set to play and optional gain volume end - end, + end }) +Counting group: nodes +--------------------- + +Instead of counting each node total for things like leaves within the sound_check function, you could use the following helper function to return their total instead e.g. + +local number = ambience.group_totals(def.totals, "leaves") -- count all group:leaves + + Getting Sound Set ----------------- @@ -80,7 +89,7 @@ Additional Commands Two volume commands have been added to set sound and music volume: /svol (0.1 to 1.0) -/mvol (0.1 to 1.0) -- 0 can be used to stop music from playing when it begins +/mvol (0.1 to 1.0) -- 0 can be used to stop music curently playing Music @@ -88,4 +97,5 @@ Music Music can be stored in the sounds folder either on server or locally and so long as it is named 'ambience_music.1', 'ambience_music.2' etc. then it will select -a song randomly at midnight and play player. +a song randomly to play every 20 minutes. + diff --git a/mods/ambience/depends.txt b/mods/ambience/depends.txt deleted file mode 100644 index 9d316eb0..00000000 --- a/mods/ambience/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -fire? -playerplus? diff --git a/mods/ambience/description.txt b/mods/ambience/description.txt deleted file mode 100644 index fd0b66e3..00000000 --- a/mods/ambience/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds realistic sound effects into your world. diff --git a/mods/ambience/init.lua b/mods/ambience/init.lua index 6044ea07..059d0bb6 100644 --- a/mods/ambience/init.lua +++ b/mods/ambience/init.lua @@ -1,24 +1,29 @@ +-- global + ambience = {} -- settings + local SOUNDVOLUME = 1.0 local MUSICVOLUME = 0.6 +local MUSICINTERVAL = 60 * 20 local play_music = minetest.settings:get_bool("ambience_music") ~= false -local pplus = minetest.get_modpath("playerplus") local radius = 6 -local playing = {} +local playing = {} -- user settings, timers and current set playing local sound_sets = {} -- all the sounds and their settings local sound_set_order = {} -- needed because pairs loops randomly through tables local set_nodes = {} -- all the nodes needed for sets +-- translation + +local S = minetest.get_translator("ambience") -- add set to list -ambience.add_set = function(set_name, def) - if not set_name or not def then - return - end +function ambience.add_set(set_name, def) + + if not set_name or not def then return end sound_sets[set_name] = { frequency = def.frequency or 50, @@ -32,14 +37,10 @@ ambience.add_set = function(set_name, def) for i = 1, #sound_set_order do - if sound_set_order[i] == set_name then - can_add = false - end + if sound_set_order[i] == set_name then can_add = false end end - if can_add then - table.insert(sound_set_order, set_name) - end + if can_add then table.insert(sound_set_order, set_name) end -- add any missing nodes to the set_nodes table if def.nodes then @@ -50,27 +51,23 @@ ambience.add_set = function(set_name, def) for j = 1, #set_nodes do - if def.nodes[i] == set_nodes[j] then - can_add = false - end + if def.nodes[i] == set_nodes[j] then can_add = false end end - if can_add then - table.insert(set_nodes, can_add) - end + if can_add then table.insert(set_nodes, can_add) end end end end - -- return set from list using name -ambience.get_set = function(set_name) + +function ambience.get_set(set_name) return sound_sets[set_name] end - -- remove set from list -ambience.del_set = function(set_name) + +function ambience.del_set(set_name) sound_sets[set_name] = nil @@ -78,61 +75,79 @@ ambience.del_set = function(set_name) for i = 1, #sound_set_order do - if sound_set_order[i] == set_name then - can_del = i + if sound_set_order[i] == set_name then can_del = i end + end + + if can_del then table.remove(sound_set_order, can_del) end +end + +-- return node total belonging to a specific group: + +function ambience.group_total(ntab, ngrp) + + local tot = 0 + local def, grp + + for _,n in pairs(ntab) do + + def = minetest.registered_nodes[_] + grp = def and def.groups and def.groups[ngrp] + + if grp and grp > 0 then + tot = tot + n end end - if can_del then - table.remove(sound_set_order, can_del) - end + return tot end - -- setup table when player joins + minetest.register_on_joinplayer(function(player) + if player then - playing[player:get_player_name()] = {music = -1} + + local name = player:get_player_name() + local meta = player:get_meta() + + playing[name] = { + mvol = tonumber(meta:get_string("ambience.mvol")) or MUSICVOLUME, + svol = tonumber(meta:get_string("ambience.svol")) or SOUNDVOLUME, + timer = 0, + music = 0, + music_handler = nil + } end end) -- remove table when player leaves + minetest.register_on_leaveplayer(function(player) - if player then - playing[player:get_player_name()] = nil - end + + if player then playing[player:get_player_name()] = nil end end) - -- plays music and selects sound set -local get_ambience = function(player, tod, name) - -- play server or local music if music enabled and music not already playing - if play_music and MUSICVOLUME > 0 - and playing[name] and playing[name].music < 0 then +local function get_ambience(player, tod, name) - -- count backwards - playing[name].music = playing[name].music -1 + -- if enabled and not already playing, play local/server music on interval check + if play_music and playing[name] and playing[name].mvol > 0 then - -- play music every 20 minutes - if playing[name].music < -(60 * 20) then + -- increase music time interval + playing[name].music = playing[name].music + 1 - playing[name].music = minetest.sound_play("ambience_music", { + -- play music on interval check + if playing[name].music > MUSICINTERVAL and playing[name].music_handler == nil then + + playing[name].music_handler = minetest.sound_play("ambience_music", { to_player = name, - gain = MUSICVOLUME + gain = playing[name].mvol }) - -- reset music timer after 10 minutes - minetest.after(60 * 10, function(name) - - if playing[name] then - playing[name].music = -1 - end - end, name) + playing[name].music = 0 -- reset interval end - ---print("-- music count", playing[name].music) - +--print("-- music timer", playing[name].music .. "/" .. MUSICINTERVAL) end -- get foot and head level nodes at player position @@ -140,31 +155,33 @@ local get_ambience = function(player, tod, name) local prop = player:get_properties() local eyeh = prop.eye_height or 1.47 -- eye level with fallback - pos.y = pos.y + eyeh + pos.y = pos.y + eyeh -- head level - local nod_head = pplus and name and playerplus[name] - and playerplus[name].nod_head or minetest.get_node(pos).name + local nod_head = minetest.get_node(pos).name pos.y = (pos.y - eyeh) + 0.2 -- foot level - local nod_feet = pplus and name and playerplus[name] - and playerplus[name].nod_feet or minetest.get_node(pos).name + local nod_feet = minetest.get_node(pos).name pos.y = pos.y - 0.2 -- reset pos -- get all set nodes around player local ps, cn = minetest.find_nodes_in_area( - {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, - {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) - -- loop through sets in order and choose first that meets it's conditions + -- loop through sets in order and choose first that meets conditions set for n = 1, #sound_set_order do local set = sound_sets[ sound_set_order[n] ] if set and set.sound_check then - -- pass settings to function for condition check + -- get biome data + local bdata = minetest.get_biome_data(pos) + local biome = bdata and minetest.get_biome_name(bdata.biome) or "" + + -- pass settings to set function for condition check local set_name, gain = set.sound_check({ player = player, pos = pos, @@ -172,167 +189,178 @@ local get_ambience = function(player, tod, name) totals = cn, positions = ps, head_node = nod_head, - feet_node = nod_feet + feet_node = nod_feet, + biome = biome }) -- if conditions met return set name and gain value - if set_name then - return set_name, gain - end + if set_name then return set_name, gain end end end - return nil, nil -- ADDED + return nil, nil end +-- players routine local timer = 0 local random = math.random --- players routine minetest.register_globalstep(function(dtime) - -- one second timer - timer = timer + dtime - if timer < 1 then return end - timer = 0 + local players = minetest.get_connected_players() + local pname - local player_name, number, chance, ambience, handler, ok + -- reduce sound timer for each player and stop/reset when needed + for _, player in pairs(players) do + + pname = player:get_player_name() + + if playing[pname] and playing[pname].timer > 0 then + + playing[pname].timer = playing[pname].timer - dtime + + if playing[pname].timer <= 0 then + + if playing[pname].handler then + minetest.sound_stop(playing[pname].handler) + end + + playing[pname].set = nil + playing[pname].gain = nil + playing[pname].handler = nil + end + end + end + + -- one second timer + timer = timer + dtime ; if timer < 1 then return end ; timer = 0 + + local number, chance, ambience, handler, ok local tod = minetest.get_timeofday() -- loop through players - for _, player in pairs(minetest.get_connected_players()) do + for _, player in pairs(players) do - player_name = player:get_player_name() + pname = player:get_player_name() ---local t1 = os.clock() + local set_name, MORE_GAIN = get_ambience(player, tod, pname) - local set_name, MORE_GAIN = get_ambience(player, tod, player_name) - ---print(string.format("elapsed time: %.4f\n", os.clock() - t1)) - - ok = playing[player_name] -- everything starts off ok if player found + ok = playing[pname] -- everything starts off ok if player found -- are we playing something already? - if ok and playing[player_name].handler then + if ok and playing[pname].handler then -- stop current sound if another set active or gain changed - if playing[player_name].set ~= set_name - or playing[player_name].gain ~= MORE_GAIN then + if playing[pname].set ~= set_name + or playing[pname].gain ~= MORE_GAIN then ---print ("-- change stop", set_name, playing[player_name].handler) +--print ("-- change stop", set_name, playing[pname].handler) - minetest.sound_stop(playing[player_name].handler) + minetest.sound_stop(playing[pname].handler) - playing[player_name].set = nil - playing[player_name].gain = nil - playing[player_name].handler = nil + playing[pname].set = nil + playing[pname].gain = nil + playing[pname].handler = nil + playing[pname].timer = 0 else ok = false -- sound set still playing, skip new sound end end -- set random chance - chance = random(1, 1000) + chance = random(1000) -- if chance is lower than set frequency then select set if ok and set_name and chance < sound_sets[set_name].frequency then - -- choose random sound from set - number = random(#sound_sets[set_name].sounds) - ambience = sound_sets[set_name].sounds[number] + number = random(#sound_sets[set_name].sounds) -- choose random sound from set + ambience = sound_sets[set_name].sounds[number] -- grab sound information -- play sound handler = minetest.sound_play(ambience.name, { - to_player = player_name, - gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * SOUNDVOLUME, + to_player = pname, + gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * playing[pname].svol, pitch = ambience.pitch or 1.0 }, ambience.ephemeral) --print ("playing... " .. ambience.name .. " (" .. chance .. " < " -- .. sound_sets[set_name].frequency .. ") @ ", MORE_GAIN, handler) - -- only continue if sound playing returns handler if handler then ---print("-- current handler", handler) - - -- set what player is currently listening to - playing[player_name].set = set_name - playing[player_name].gain = MORE_GAIN - playing[player_name].handler = handler - - -- set timer to stop sound - minetest.after(ambience.length, function(handler, player_name) - ---print("-- timed stop", set_name, handler) - if handler then - minetest.sound_stop(handler) - end - - -- reset variables if handlers match - if playing[player_name] - and playing[player_name].handler == handler then - ---print("-- timed reset", handler, player_name) - - playing[player_name].set = nil - playing[player_name].gain = nil - playing[player_name].handler = nil - end - end, handler, player_name) + -- set what player is currently listening to if handler found + playing[pname].set = set_name + playing[pname].gain = MORE_GAIN + playing[pname].handler = handler + playing[pname].timer = ambience.length end end end end) - -- sound volume command + minetest.register_chatcommand("svol", { - params = "", - description = "set sound volume (0.1 to 1.0)", - privs = {server = true}, + params = S(""), + description = S("set sound volume (0.1 to 1.0)"), + privs = {}, func = function(name, param) - SOUNDVOLUME = tonumber(param) or SOUNDVOLUME + local svol = tonumber(param) or playing[name].svol - if SOUNDVOLUME < 0.1 then SOUNDVOLUME = 0.1 end - if SOUNDVOLUME > 1.0 then SOUNDVOLUME = 1.0 end + if svol < 0.1 then svol = 0.1 end + if svol > 1.0 then svol = 1.0 end - return true, "Sound volume set to " .. SOUNDVOLUME + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.svol", svol) + + playing[name].svol = svol + + return true, S("Sound volume set to @1", svol) end }) - -- music volume command (0 stops music) + minetest.register_chatcommand("mvol", { - params = "", - description = "set music volume (0.1 to 1.0, 0 to stop music)", - privs = {server = true}, + params = S(""), + description = S("set music volume (0.1 to 1.0, 0 to stop music)"), + privs = {}, func = function(name, param) - MUSICVOLUME = tonumber(param) or MUSICVOLUME + local mvol = tonumber(param) or playing[name].mvol - -- ability to stop music by setting volume to 0 - if MUSICVOLUME == 0 and playing[name].music - and playing[name].music >= 0 then + -- stop music currently playing by setting volume to 0 + if mvol == 0 and playing[name].music_handler then - minetest.sound_stop(playing[name].music) + minetest.sound_stop(playing[name].music_handler) - playing[name].music = -1 + playing[name].music_handler = nil + + minetest.chat_send_player(name, S("Music stopped!")) end - if MUSICVOLUME < 0 then MUSICVOLUME = 0 end - if MUSICVOLUME > 1.0 then MUSICVOLUME = 1.0 end + if mvol < 0 then mvol = 0 end + if mvol > 1.0 then mvol = 1.0 end - return true, "Music volume set to " .. MUSICVOLUME + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.mvol", mvol) + + playing[name].mvol = mvol + + return true, S("Music volume set to @1", mvol) end }) - -- load default sound sets + dofile(minetest.get_modpath("ambience") .. "/soundsets.lua") diff --git a/mods/ambience/sounds/SoundLicenses.txt b/mods/ambience/license.txt similarity index 57% rename from mods/ambience/sounds/SoundLicenses.txt rename to mods/ambience/license.txt index d1da1eab..9bab5bc5 100644 --- a/mods/ambience/sounds/SoundLicenses.txt +++ b/mods/ambience/license.txt @@ -1,105 +1,88 @@ - ------------Sound Lic: ---Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html ---Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html - ---Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html - ---Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html ---Bats In Cave Sound, License: Attr-Noncommercial 3.0 | Recorded by Mike Koenig , http://soundbible.com/1939-Bats-In-Cave.html - ---Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html - - --- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html - ---HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ - ---drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 - ---best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird, http://soundbible.com/1515-Best-Cardinal-Bird.html - ---birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/ (end) - ---robin2: Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/ (end) - ---Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ - ---bluejay.wav, Creative Commons 0 License, UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ - ---scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ - ---Underwater Pool - Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/1660-Underwater-Pool.html - ---dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ - ---dolphins - Attribution Noncommercial License, acclivity, http://www.freesound.org/people/acclivity/sounds/13691/ - -ComboWind uses: ---wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ ---drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ - ---Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html - ---small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ - ---Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ - ---water_swimming_splashing*, Attribution Noncommercial License, Robinhood76, http://www.freesound.org/people/Robinhood76/sounds/79657/ - ---earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 - ---fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ - ---seagull, Attribution Noncommercial License., hazure, http://www.freesound.org/people/hazure/sounds/23707/, - -desert: -coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ -http://www.freesound.org/people/Proxima4/sounds/104319/ -Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ -Rattlesnake Rattle, Public Domain, fws.gov, http://soundbible.com/237-Rattlesnake-Rattle.html - -flying: -crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ - -----------------Not used yet: -desert: -Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ - - 313hummer (Jordan Craige) ---echos http://soundcloud.com/jordan-craige/echos-1 -Creative Commons Attribution license (reuse allowed) Attribution 3.0 Unported (CC BY 3.0) -Not Used:--FoamOfTheSea http://soundcloud.com/jordan-craige/foam-of-the-sea - -xi-intersection: -http://soundcloud.com/xi-intersection/mass-effect-uncharted-worlds Creative Commons License ---not used: -http://soundcloud.com/xi-intersection/donkey-kong-country-2-flight -http://soundcloud.com/kogyo/kogyo-skalar-m1 - -lava: -http://www.freesound.org/people/Halion/sounds/17785/ (almost as good cc) (combine with rocks falling?) -http://www.freesound.org/people/pushtobreak/sounds/17823/ (attrib non cc really good) -http://www.freesound.org/people/klankbeeld/sounds/123970/ (horror rhythm) -Rockfall in mine.wav http://www.freesound.org/people/Benboncan/sounds/60085/ - - -http://www.freesound.org/people/snotch/sounds/96175/ (mud volcano) - ---natural night sounds in Boquete.wav, Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/15851/ -http://www.freesound.org/people/Dynamicell/sounds/17553/ -http://www.freesound.org/people/juskiddink/sounds/78955/ aspen tree in wind -http://www.freesound.org/people/Benboncan/sounds/69761/ wind in hedge birds animals - - -ButterflyTea: -Creative Commons : Attribution-Noncommercial-Share Alike 3.0 -http://www.jamendo.com/en/track/904012/dance-of-magical-flowers -http://www.jamendo.com/en/track/904013/magic-of-the-seventh-world -http://www.jamendo.com/en/track/904016/in-search-of-the-soul - -http://www.freesfx.co.uk/soundeffects/forests-jungles/ - -zero-project +The MIT License (MIT) -icecrack.ogg by figowitz (http://freesound.org/people/Figowitz/sounds/67881/) +Copyright (c) 2022 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Sound licenses: + +--Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html + +--Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html + +--Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html + +--Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html + +--Bats In Cave Sound, License: CC0 | Recorded by SaloSensei , https://freesound.org/people/SaloSensei/sounds/616219/ + +--Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html + +-- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html + +--HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ + +--drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 + +--best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird, http://soundbible.com/1515-Best-Cardinal-Bird.html + +--birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/ (end) + +--robin2: Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/ (end) + +--Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ + +--bluejay.wav, Creative Commons 0 License, UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ + +--scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ + +--dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ + +ComboWind uses: +--wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ +--drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ + +--Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html + +--small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ + +--Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ + +--earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 + +--fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ + +--seagull, Attribution 3.0 License., hazure, http://www.freesound.org/people/hazure/sounds/23707/, + +desert: +coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ +http://www.freesound.org/people/Proxima4/sounds/104319/ +Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ +Rattlesnake Rattle, Public Domain, fws.gov, http://soundbible.com/237-Rattlesnake-Rattle.html + +flying: +crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ + +desert wind: +Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ + +http://www.freesfx.co.uk/soundeffects/forests-jungles/ + +icecrack.ogg by ecfike, Creative Commons 0 license (https://freesound.org/people/ecfike/sounds/177212/) diff --git a/mods/ambience/locale/ambience.eo.tr b/mods/ambience/locale/ambience.eo.tr new file mode 100644 index 00000000..7bf35f45 --- /dev/null +++ b/mods/ambience/locale/ambience.eo.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=agordi sonlaŭtecon (0.1 ĝis 1.0) +Sound volume set to @1=Sonlaŭteco agordita al @1 += +set music volume (0.1 to 1.0, 0 to stop music)=agordi muziklaŭtecon (0.1 ĝis 1.0; malŝalti muzikon per 0) +Music volume set to @1=Muziklaŭteco agordita al @1 diff --git a/mods/ambience/locale/ambience.es.tr b/mods/ambience/locale/ambience.es.tr new file mode 100644 index 00000000..d31fc473 --- /dev/null +++ b/mods/ambience/locale/ambience.es.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=establecer volumen de sonido (0.1 a 1.0) +Sound volume set to @1=Volumen de sonido establecido a @1 += +set music volume (0.1 to 1.0, 0 to stop music)=establecer volumen de música (0.1 a 1.0, 0 para detener la música) +Music volume set to @1=Volumen de música establecido a @1 diff --git a/mods/ambience/locale/ambience.pl.tr b/mods/ambience/locale/ambience.pl.tr new file mode 100644 index 00000000..28674e0d --- /dev/null +++ b/mods/ambience/locale/ambience.pl.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=ustaw głośność dźwięku (0.1 do 1.0) +Sound volume set to @1=Głośność dźwięku ustawiona na @1 += +set music volume (0.1 to 1.0, 0 to stop music)=ustaw głośność muzyki (0.1 do 1.0, 0 aby zatrzymać muzykę) +Music volume set to @1=Głośność muzyki ustawiona na @1 diff --git a/mods/ambience/locale/template.txt b/mods/ambience/locale/template.txt new file mode 100644 index 00000000..5016ce50 --- /dev/null +++ b/mods/ambience/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)= +Sound volume set to @1= += +set music volume (0.1 to 1.0, 0 to stop music)= +Music volume set to @1= diff --git a/mods/ambience/mod.conf b/mods/ambience/mod.conf index de39c528..43c57ea1 100644 --- a/mods/ambience/mod.conf +++ b/mods/ambience/mod.conf @@ -1,4 +1,4 @@ name = ambience -depends = default -optional_depends = fire, playerplus description = Adds realistic sound effects into your world. +optional_depends = default, mcl_core, mclx_core +min_minetest_version = 5.0 diff --git a/mods/ambience/screenshot.jpg b/mods/ambience/screenshot.jpg new file mode 100644 index 00000000..574e2994 Binary files /dev/null and b/mods/ambience/screenshot.jpg differ diff --git a/mods/ambience/screenshot.png b/mods/ambience/screenshot.png deleted file mode 100644 index f1df0c9e..00000000 Binary files a/mods/ambience/screenshot.png and /dev/null differ diff --git a/mods/ambience/sounds/bats.ogg b/mods/ambience/sounds/bats.ogg new file mode 100644 index 00000000..27780b27 Binary files /dev/null and b/mods/ambience/sounds/bats.ogg differ diff --git a/mods/ambience/sounds/icecrack.ogg b/mods/ambience/sounds/icecrack.ogg index c09fcb2e..273b0a41 100644 Binary files a/mods/ambience/sounds/icecrack.ogg and b/mods/ambience/sounds/icecrack.ogg differ diff --git a/mods/ambience/sounds/jungle_day_1.ogg b/mods/ambience/sounds/jungle_day_1.ogg index 9ec8f13d..7791dae4 100644 Binary files a/mods/ambience/sounds/jungle_day_1.ogg and b/mods/ambience/sounds/jungle_day_1.ogg differ diff --git a/mods/ambience/sounds/swim_splashing.ogg b/mods/ambience/sounds/swim_splashing.ogg deleted file mode 100644 index 4c40847b..00000000 Binary files a/mods/ambience/sounds/swim_splashing.ogg and /dev/null differ diff --git a/mods/ambience/soundsets.lua b/mods/ambience/soundsets.lua index 9dc5d3e4..1262ba26 100644 --- a/mods/ambience/soundsets.lua +++ b/mods/ambience/soundsets.lua @@ -2,10 +2,15 @@ Default Sound Sets ------------------ - Order is very important when adding a sound set so it will play a certain - set of sounds before any another. + Order is very important when adding a sound set so it will play + certain sound sets before any another. --]] +-- mod support + +local mod_def = minetest.get_modpath("default") +local mod_mcl = minetest.get_modpath("mcl_core") + -- Underwater sounds play when player head is submerged ambience.add_set("underwater", { @@ -18,8 +23,9 @@ ambience.add_set("underwater", { sound_check = function(def) - if minetest.registered_nodes[def.head_node] - and minetest.registered_nodes[def.head_node].groups.water then + local nodef = minetest.registered_nodes[def.head_node] + + if nodef and nodef.groups and nodef.groups.water then return "underwater" end end @@ -29,181 +35,117 @@ ambience.add_set("underwater", { if minetest.settings:get_bool("ambience_water_move") ~= false then --- override default water sounds -minetest.override_item("default:water_source", { sounds = {} }) -minetest.override_item("default:water_flowing", { sounds = {} }) -minetest.override_item("default:river_water_source", { sounds = {} }) -minetest.override_item("default:river_water_flowing", { sounds = {} }) + -- override default water sounds -ambience.add_set("splash", { + if mod_def then + minetest.override_item("default:water_source", { sounds = {} }) + minetest.override_item("default:water_flowing", { sounds = {} }) + minetest.override_item("default:river_water_source", { sounds = {} }) + minetest.override_item("default:river_water_flowing", { sounds = {} }) + elseif mod_mcl then + minetest.override_item("mcl_core:water_source", { sounds = {} }) + minetest.override_item("mcl_core:water_flowing", { sounds = {} }) + minetest.override_item("mclx_core:river_water_source", { sounds = {} }) + minetest.override_item("mclx_core:river_water_flowing", { sounds = {} }) + end - frequency = 1000, + ambience.add_set("splash", { - sounds = { - {name = "swim_splashing", length = 3} - }, + frequency = 1000, - sound_check = function(def) + sounds = { + {name = "default_water_footstep", length = 2} + }, - if minetest.registered_nodes[def.feet_node] - and minetest.registered_nodes[def.feet_node].groups.water then + sound_check = function(def) - local control = def.player:get_player_control() + local nodef = minetest.registered_nodes[def.feet_node] - if control.up or control.down or control.left or control.right then - return "splash" + if nodef and nodef.groups and nodef.groups.water then + + local control = def.player:get_player_control() + + if control.up or control.down or control.left or control.right then + return "splash" + end end end - end -}) - + }) end -- check for env_sounds mod, if not found enable water flowing and lava sounds if not minetest.get_modpath("env_sounds") then --- Water sound plays when near flowing water + -- Water sound plays when near flowing water -ambience.add_set("flowing_water", { + ambience.add_set("flowing_water", { - frequency = 1000, + frequency = 1000, - sounds = { - {name = "waterfall", length = 6} - }, + sounds = { + {name = "waterfall", length = 6} + }, - nodes = {"default:water_flowing"}, + nodes = {"group:water"}, - sound_check = function(def) + sound_check = function(def) - local c = (def.totals["default:water_flowing"] or 0) + local c = (def.totals["default:water_flowing"] or 0) + + (def.totals["mcl_core:water_flowing"] or 0) - if c > 40 then - return "flowing_water", 0.5 + if c > 40 then return "flowing_water", 0.5 - elseif c > 5 then - return "flowing_water" + elseif c > 5 then return "flowing_water" end end - end -}) + }) --- River sound plays when near flowing river + -- River sound plays when near flowing river -ambience.add_set("river", { + ambience.add_set("river", { - frequency = 1000, + frequency = 1000, - sounds = { - {name = "river", length = 4, gain = 0.1} - }, + sounds = { + {name = "river", length = 4, gain = 0.1} + }, - nodes = {"default:river_water_flowing"}, + sound_check = function(def) - sound_check = function(def) + local c = (def.totals["default:river_water_flowing"] or 0) + + (def.totals["mclx_core:river_water_flowing"] or 0) - local c = (def.totals["default:river_water_flowing"] or 0) + if c > 20 then return "river", 0.5 - if c > 20 then - return "river", 0.5 - - elseif c > 5 then - return "river" + elseif c > 5 then return "river" end end - end -}) + }) --- Lava sound plays when near lava + -- Lava sound plays when near lava -ambience.add_set("lava", { + ambience.add_set("lava", { - frequency = 1000, + frequency = 1000, - sounds = { - {name = "lava", length = 7} - }, + sounds = { + {name = "lava", length = 7} + }, - nodes = {"default:lava_source", "default:lava_flowing"}, + nodes = {"group:lava"}, - sound_check = function(def) + sound_check = function(def) - local c = (def.totals["default:lava_source"] or 0) - + (def.totals["default:lava_flowing"] or 0) + local c = (def.totals["default:lava_source"] or 0) + + (def.totals["default:lava_flowing"] or 0) + + (def.totals["mcl_core:lava_source"] or 0) + + (def.totals["mcl_core:lava_flowing"] or 0) - if c > 20 then - return "lava", 0.5 + if c > 20 then return "lava", 0.5 - elseif c > 5 then - return "lava" + elseif c > 5 then return "lava" end end - end -}) - + }) else - print ("[Ambience] found env_sounds, flowing water and lava sounds disabled.") -end - --- Only add fire sounds set if flame_sound is disabled or fire redo active - -local flame_sound = minetest.settings:get_bool("flame_sound", true) -local fire_redo = minetest.get_modpath("fire") and fire.mod and fire.mod == "redo" - -if flame_sound and not fire_redo then - - print ("[Ambience] fire sounds not enabled, already active in fire mod.") - -else - --- Small fire sound plays when near lower than 9 flames - -ambience.add_set("smallfire", { - - frequency = 1000, - - sounds = { - {name = "fire_small", length = 6, gain = 0.1} - }, - - nodes = {"fire:basic_flame", "fire:permanent_flame"}, - - sound_check = function(def) - - local c = (def.totals["fire:basic_flame"] or 0) - + (def.totals["fire:permanent_flame"] or 0) - - if c > 5 and c < 9 then - return "smallfire", 0.5 - - elseif c > 0 and c < 9 then - return "smallfire" - end - end -}) - --- Large fire sound plays when near more than 9 flames - -ambience.add_set("largefire", { - - frequency = 1000, - - sounds = { - {name = "fire_large", length = 8, gain = 0.4} - }, - - sound_check = function(def) - - -- fire nodes were added in last set, so don't need to be added in this one - local c = (def.totals["fire:basic_flame"] or 0) - + (def.totals["fire:permanent_flame"] or 0) - - if c > 20 then - return "largefire", 0.5 - - elseif c > 8 then - return "largefire" - end - end -}) - + print ("[MOD] Ambience - found env_sounds, using for water and lava sounds.") end -- Beach sounds play when below y-pos 6 and 150+ water source found @@ -214,16 +156,16 @@ ambience.add_set("beach", { sounds = { {name = "seagull", length = 4.5, ephemeral = true}, + {name = "seagull", length = 4.5, pitch = 1.2, ephemeral = true}, {name = "beach", length = 13}, {name = "gull", length = 1, ephemeral = true}, {name = "beach_2", length = 6} }, - nodes = {"default:water_source"}, - sound_check = function(def) local c = (def.totals["default:water_source"] or 0) + + (def.totals["mcl_core:water_source"] or 0) if def.pos.y < 6 and def.pos.y > 0 and c > 150 then return "beach" @@ -238,20 +180,20 @@ ambience.add_set("ice", { frequency = 250, sounds = { - {name = "icecrack", length = 23, gain = 0.7}, + {name = "icecrack", length = 5, gain = 1.1}, {name = "desertwind", length = 8}, {name = "wind", length = 9} }, - nodes = {"default:ice"}, + nodes = (mod_mcl and {"mcl_core:ice", "mcl_core:packed_ice"} or {"default:ice"}), sound_check = function(def) local c = (def.totals["default:ice"] or 0) + +(def.totals["mcl_core:ice"] or 0) + + (def.totals["mcl_core:packed_ice"] or 0) - if c > 100 then - return "ice" - end + if c > 100 then return "ice" end end }) @@ -267,16 +209,19 @@ ambience.add_set("desert", { {name = "desertwind", length = 8} }, - nodes = {"default:desert_sand", "default:sand"}, + nodes = { + (mod_mcl and "mcl_core:redsand" or "default:desert_sand"), + (mod_mcl and "mcl_core:sand" or "default:sand") + }, sound_check = function(def) local c = (def.totals["default:desert_sand"] or 0) + (def.totals["default:sand"] or 0) + + (def.totals["mcl_core:sand"] or 0) + + (def.totals["mcl_core:redsand"] or 0) - if c > 150 and def.pos.y > 10 then - return "desert" - end + if c > 150 and def.pos.y > 10 then return "desert" end end }) @@ -288,16 +233,18 @@ ambience.add_set("cave", { sounds = { {name = "drippingwater1", length = 1.5, ephemeral = true}, - {name = "drippingwater2", length = 1.5, ephemeral = true} + {name = "drippingwater2", length = 1.5, ephemeral = true}, + {name = "drippingwater2", length = 1.5, pitch = 1.2, ephemeral = true}, + {name = "drippingwater2", length = 1.5, pitch = 1.4, ephemeral = true}, + {name = "bats", length = 5, ephemeral = true} }, sound_check = function(def) local c = (def.totals["default:water_source"] or 0) + + (def.totals["mcl_core:water_source"] or 0) - if c > 0 and def.pos.y < -25 then - return "cave" - end + if c > 0 and def.pos.y < -25 then return "cave" end end }) @@ -312,18 +259,18 @@ ambience.add_set("jungle", { {name = "deer", length = 7, ephemeral = true}, {name = "canadianloon2", length = 14}, {name = "bird1", length = 11}, - {name = "peacock", length = 2, ephemeral = true} + {name = "peacock", length = 2, ephemeral = true}, + {name = "peacock", length = 2, pitch = 1.2, ephemeral = true} }, - nodes = {"default:jungletree"}, + nodes = {(mod_mcl and "mcl_trees:tree_jungle" or "default:jungletree")}, sound_check = function(def) local c = (def.totals["default:jungletree"] or 0) + + (def.totals["mcl_trees:tree_jungle"] or 0) - if def.tod > 0.2 and def.tod < 0.8 and c > 90 then - return "jungle" - end + if def.tod > 0.2 and def.tod < 0.8 and c > 79 then return "jungle" end end }) @@ -337,17 +284,17 @@ ambience.add_set("jungle_night", { {name = "jungle_night_1", length = 4, ephemeral = true}, {name = "jungle_night_2", length = 4, ephemeral = true}, {name = "deer", length = 7, ephemeral = true}, - {name = "frog", length = 1, ephemeral = true} + {name = "frog", length = 1, ephemeral = true}, + {name = "frog", length = 1, pitch = 1.3, ephemeral = true} }, sound_check = function(def) -- jungle tree was added in last set, so doesnt need to be added in this one local c = (def.totals["default:jungletree"] or 0) + + (def.totals["mcl_trees:tree_jungle"] or 0) - if (def.tod < 0.2 or def.tod > 0.8) and c > 90 then - return "jungle_night" - end + if (def.tod < 0.2 or def.tod > 0.8) and c > 79 then return "jungle_night" end end }) @@ -362,10 +309,13 @@ ambience.add_set("day", { {name = "craw", length = 3, ephemeral = true}, {name = "bluejay", length = 6, ephemeral = true}, {name = "robin", length = 4, ephemeral = true}, + {name = "robin", length = 4, pitch = 1.2, ephemeral = true}, {name = "bird1", length = 11}, {name = "bird2", length = 6, ephemeral = true}, {name = "crestedlark", length = 6, ephemeral = true}, + {name = "crestedlark", length = 6, pitch = 1.1, ephemeral = true}, {name = "peacock", length = 2, ephemeral = true}, + {name = "peacock", length = 2, pitch = 1.2, ephemeral = true}, {name = "wind", length = 9} }, @@ -373,15 +323,10 @@ ambience.add_set("day", { sound_check = function(def) - -- we used group:leaves but still need to specify actual nodes for total - local c = (def.totals["default:leaves"] or 0) - + (def.totals["default:bush_leaves"] or 0) - + (def.totals["default:pine_needles"] or 0) - + (def.totals["default:aspen_leaves"] or 0) + -- use handy function to count all nodes in group:leaves + local c = ambience.group_total(def.totals, "leaves") - if (def.tod > 0.2 and def.tod < 0.8) - and def.pos.y > -10 - and c > 5 then + if (def.tod > 0.2 and def.tod < 0.8) and def.pos.y > -10 and c > 5 then return "day" end end @@ -395,23 +340,20 @@ ambience.add_set("night", { sounds = { {name = "hornedowl", length = 2, ephemeral = true}, + {name = "hornedowl", length = 2, pitch = 1.1, ephemeral = true}, {name = "wolves", length = 4, gain = 0.4, ephemeral = true}, {name = "cricket", length = 6, ephemeral = true}, {name = "deer", length = 7, ephemeral = true}, - {name = "frog", length = 1, ephemeral = true} + {name = "frog", length = 1, ephemeral = true}, + {name = "frog", length = 1, pitch = 1.2, ephemeral = true} }, sound_check = function(def) - -- leaves were added in last set, so don't need to be added to this one - local c = (def.totals["default:leaves"] or 0) - + (def.totals["default:bush_leaves"] or 0) - + (def.totals["default:pine_needles"] or 0) - + (def.totals["default:aspen_leaves"] or 0) + -- use handy function to count all nodes in group:leaves + local c = ambience.group_total(def.totals, "leaves") - if (def.tod < 0.2 or def.tod > 0.8) - and def.pos.y > -10 - and c > 5 then + if (def.tod < 0.2 or def.tod > 0.8) and def.pos.y > -10 and c > 5 then return "night" end end @@ -425,17 +367,18 @@ ambience.add_set("high_up", { sounds = { {name = "desertwind", length = 8}, - {name = "wind", length = 9} + {name = "desertwind", length = 8, pitch = 1.3}, + {name = "wind", length = 9}, + {name = "wind", length = 9, pitch = 1.4} }, - nodes = {"default:snowblock"}, + nodes = {(mod_mcl and "mcl_core:snowblock" or "default:snowblock")}, sound_check = function(def) local c = (def.totals["default:snowblock"] or 0) + + (def.totals["mcl_core:snowblock"] or 0) - if def.pos.y > 50 or c > 150 then - return "high_up" - end + if def.pos.y > 50 or c > 100 then return "high_up" end end }) diff --git a/mods/anvils/depends.txt b/mods/anvils/depends.txt deleted file mode 100644 index bc6710fa..00000000 --- a/mods/anvils/depends.txt +++ /dev/null @@ -1,9 +0,0 @@ -default -screwdriver? -farming? -ethereal? -moreores? -3d_armor? -shields? -xanadu? -mobs? diff --git a/mods/anvils/init.lua b/mods/anvils/init.lua index 7586d901..6b201120 100644 --- a/mods/anvils/init.lua +++ b/mods/anvils/init.lua @@ -1,9 +1,11 @@ anvils = {} -local MAX_WEAR = 65535 -local SAME_TOOL_REPAIR_BOOST = math.ceil(MAX_WEAR * 0.12) -- 12% +local math_min, math_max = math.min, math.max +local math_ceil, math_random = math.ceil, math.random +local MAX_WEAR = 65535 +local SAME_TOOL_REPAIR_BOOST = math_ceil(MAX_WEAR * 0.12) -- 12% -- Given a tool and material stack, returns how many items of the material stack -- needs to be used up to repair the tool. @@ -16,11 +18,11 @@ local function get_consumed_materials(tool, material) end local tooldef = tool:get_definition() - local slice = math.ceil(MAX_WEAR / tooldef._repair_material_total) + local slice = math_ceil(MAX_WEAR / tooldef._repair_material_total) local matsize = material:get_count() local materials_used = 0 - for m = 1, math.min(tooldef._repair_material_total, matsize) do + for m = 1, math_min(tooldef._repair_material_total, matsize) do materials_used = materials_used + 1 @@ -68,7 +70,7 @@ local function calculate_repair(wear1, wear2, boost) new_health = new_health + boost end - return math.max(0, math.min(MAX_WEAR, MAX_WEAR - new_health)) + return math_max(0, math_min(MAX_WEAR, MAX_WEAR - new_health)) end @@ -138,12 +140,12 @@ local function update_anvil_slots(meta) if has_correct_material and tool:get_wear() > 0 then local materials_used = get_consumed_materials(tool, material) - local slice = math.ceil( + local slice = math_ceil( MAX_WEAR / tooldef._repair_material_total) local wear = tool:get_wear() local new_wear = wear - (materials_used * slice) - tool:set_wear(math.max(0, new_wear)) + tool:set_wear(math_max(0, new_wear)) new_output = tool else @@ -161,7 +163,6 @@ local function update_anvil_slots(meta) -- Set the new output slot if new_output ~= nil then - inv:set_stack("output", 1, new_output) end end @@ -179,9 +180,9 @@ local function drop_anvil_items(pos, meta) if not stack:is_empty() then local p = { - x = pos.x + math.random(-10, 10) / 9, + x = pos.x + math_random(-10, 10) / 9, y = pos.y, - z = pos.z + math.random(-10, 10) / 9} + z = pos.z + math_random(-10, 10) / 9} minetest.add_item(p, stack) end @@ -194,7 +195,7 @@ local anvildef = { description = "Anvil", groups = { - cracky = 1, level = 2, falling_node = 1, falling_node_damage = 4 + cracky = 1, level = 2, falling_node = 1, falling_node_damage = 4, unbreakable = 1 }, tiles = { @@ -299,7 +300,7 @@ local anvildef = { local istack = inv:get_stack("input", i) - istack:set_count(math.max(0, istack:get_count() - count)) + istack:set_count(math_max(0, istack:get_count() - count)) inv:set_stack("input", i, istack) end @@ -389,8 +390,7 @@ local anvildef = { inv:set_size("input", 2) inv:set_size("output", 1) - meta:set_string("formspec", - "size[8,6.5]" + meta:set_string("formspec", "size[8,6.5]" .. "list[context;input;1,1;1,1;]" .. "list[context;input;3.5,1;1,1;1]" .. "list[context;output;6,1;1,1;]" @@ -407,6 +407,8 @@ local anvildef = { .. "listring[current_player;main]" .. "listring[current_player;main]") end, + + on_blast = function() end } diff --git a/mods/anvils/mod.conf b/mods/anvils/mod.conf new file mode 100644 index 00000000..5473e525 --- /dev/null +++ b/mods/anvils/mod.conf @@ -0,0 +1,3 @@ +name = anvils +depends = default +optional_depends = screwdriver, farming, ethereal, moreores, 3d_armor, shields, xanadu, mobs diff --git a/mods/anvils/textures/anvils_anvil_top.png b/mods/anvils/textures/anvils_anvil_top.png index f56572e9..9d73df37 100644 Binary files a/mods/anvils/textures/anvils_anvil_top.png and b/mods/anvils/textures/anvils_anvil_top.png differ diff --git a/mods/anvils/tools.lua b/mods/anvils/tools.lua index d84729e2..d205e91a 100644 --- a/mods/anvils/tools.lua +++ b/mods/anvils/tools.lua @@ -94,86 +94,113 @@ if minetest.get_modpath("ethereal") then add_tool("ethereal:sword_crystal", "ethereal:crystal_ingot", 2, true) end +-- Pigiton tools + +if minetest.get_modpath("pigiron") then + + add_tool("pigiron:pick_iron", "pigiron:iron_ingot", 3, true) + add_tool("pigiron:axe_iron", "pigiron:iron_ingot", 3, true) + add_tool("pigiron:shovel_iron", "pigiron:iron_ingot", 1, true) + add_tool("pigiron:sword_iron", "pigiron:iron_ingot", 2, true) +end + -- 3D armor if minetest.get_modpath("3d_armor") then if armor.materials.steel then - add_tool("3d_armor:helmet_steel", "default:steel_ingot", 5) - add_tool("3d_armor:chestplate_steel", "default:steel_ingot", 8) - add_tool("3d_armor:leggings_steel", "default:steel_ingot", 7) - add_tool("3d_armor:boots_steel", "default:steel_ingot", 4) + add_tool("3d_armor:helmet_steel", "default:steel_ingot", 5) + add_tool("3d_armor:chestplate_steel", "default:steel_ingot", 8) + add_tool("3d_armor:leggings_steel", "default:steel_ingot", 7) + add_tool("3d_armor:boots_steel", "default:steel_ingot", 4) end if armor.materials.bronze then - add_tool("3d_armor:helmet_bronze", "default:bronze_ingot", 5) - add_tool("3d_armor:chestplate_bronze", "default:bronze_ingot", 8) - add_tool("3d_armor:leggings_bronze", "default:bronze_ingot", 7) - add_tool("3d_armor:boots_bronze", "default:bronze_ingot", 4) + add_tool("3d_armor:helmet_bronze", "default:bronze_ingot", 5) + add_tool("3d_armor:chestplate_bronze", "default:bronze_ingot", 8) + add_tool("3d_armor:leggings_bronze", "default:bronze_ingot", 7) + add_tool("3d_armor:boots_bronze", "default:bronze_ingot", 4) end if armor.materials.gold then - add_tool("3d_armor:helmet_gold", "default:gold_ingot", 5) - add_tool("3d_armor:chestplate_gold", "default:gold_ingot", 8) - add_tool("3d_armor:leggings_gold", "default:gold_ingot", 7) - add_tool("3d_armor:boots_gold", "default:gold_ingot", 4) + add_tool("3d_armor:helmet_gold", "default:gold_ingot", 5) + add_tool("3d_armor:chestplate_gold", "default:gold_ingot", 8) + add_tool("3d_armor:leggings_gold", "default:gold_ingot", 7) + add_tool("3d_armor:boots_gold", "default:gold_ingot", 4) end if armor.materials.diamond then - add_tool("3d_armor:helmet_diamond", "default:diamond", 5) - add_tool("3d_armor:chestplate_diamond", "default:diamond", 8) - add_tool("3d_armor:leggings_diamond", "default:diamond", 7) - add_tool("3d_armor:boots_diamond", "default:diamond", 4) + add_tool("3d_armor:helmet_diamond", "default:diamond", 5) + add_tool("3d_armor:chestplate_diamond", "default:diamond", 8) + add_tool("3d_armor:leggings_diamond", "default:diamond", 7) + add_tool("3d_armor:boots_diamond", "default:diamond", 4) end if armor.materials.mithril then - add_tool("3d_armor:helmet_mithril", "moreores:mithril_ingot", 5) - add_tool("3d_armor:chestplate_mithril", "moreores:mithril_ingot", 8) - add_tool("3d_armor:leggings_mithril", "moreores:mithril_ingot", 7) - add_tool("3d_armor:boots_mithril", "moreores:mithril_ingot", 4) + add_tool("3d_armor:helmet_mithril", "moreores:mithril_ingot", 5) + add_tool("3d_armor:chestplate_mithril", "moreores:mithril_ingot", 8) + add_tool("3d_armor:leggings_mithril", "moreores:mithril_ingot", 7) + add_tool("3d_armor:boots_mithril", "moreores:mithril_ingot", 4) end if armor.materials.crystal then - add_tool("3d_armor:helmet_crystal", "ethereal:crystal_ingot", 5) - add_tool("3d_armor:chestplate_crystal", "ethereal:crystal_ingot", 8) - add_tool("3d_armor:leggings_crystal", "ethereal:crystal_ingot", 7) - add_tool("3d_armor:boots_crystal", "ethereal:crystal_ingot", 4) + add_tool("3d_armor:helmet_crystal", "ethereal:crystal_ingot", 5) + add_tool("3d_armor:chestplate_crystal", "ethereal:crystal_ingot", 8) + add_tool("3d_armor:leggings_crystal", "ethereal:crystal_ingot", 7) + add_tool("3d_armor:boots_crystal", "ethereal:crystal_ingot", 4) + end + + if minetest.get_modpath("nether") then + add_tool("3d_armor:helmet_nether", "nether:nether_ingot", 5) + add_tool("3d_armor:chestplate_nether", "nether:nether_ingot", 8) + add_tool("3d_armor:leggings_nether", "nether:nether_ingot", 7) + add_tool("3d_armor:boots_nether", "nether:nether_ingot", 4) end end +-- Shields + if minetest.get_modpath("shields") then if armor.materials.steel then - add_tool("shields:shield_steel", "default:steel_ingot", 7) + add_tool("shields:shield_steel", "default:steel_ingot", 7) end if armor.materials.bronze then - add_tool("shields:shield_bronze", "default:bronze_ingot", 7) + add_tool("shields:shield_bronze", "default:bronze_ingot", 7) end if armor.materials.diamond then - add_tool("shields:shield_diamond", "default:diamond", 7) + add_tool("shields:shield_diamond", "default:diamond", 7) end if armor.materials.gold then - add_tool("shields:shield_gold", "default:gold_ingot", 7) + add_tool("shields:shield_gold", "default:gold_ingot", 7) end if armor.materials.mithril then - add_tool("shields:shield_mithril", "moreores:mithril_ingot", 7) + add_tool("shields:shield_mithril", "moreores:mithril_ingot", 7) end if armor.materials.crystal then - add_tool("shields:shield_crystal", "ethereal:crystal_ingot", 7) + add_tool("shields:shield_crystal", "ethereal:crystal_ingot", 7) + end + + if minetest.get_modpath("nether") then + add_tool("shields:shield_nether", "nether:nether_ingot", 7) end end +-- Mobs Monster + if minetest.get_modpath("mobs_monster") then add_tool("mobs:pick_lava", "mobs:lava_orb", 3, true) end --- Xanadu mod +-- Xanadu + if minetest.get_modpath("xanadu") then + add_tool("xanadu:axe_super", "default:diamond", 18, true) add_tool("mobs:pick_lava", "mobs:lava_orb", 3, true) add_tool("xanadu:helmet_ccrystal", "ethereal:crystal_ingot", 5) diff --git a/mods/bakedclay/README.md b/mods/bakedclay/README.md index 1cf146ac..17983950 100644 --- a/mods/bakedclay/README.md +++ b/mods/bakedclay/README.md @@ -8,6 +8,8 @@ https://forum.minetest.net/viewtopic.php?id=8890 Changelog: +- 1.2 - Add 'stairsplus_clay_compatibility' setting. +- 1.1 - Remove 0.4.x compatibility to better support 5.x mods - 1.0 - Re-Added glazed terracotta blocks when you cook baked clay in furnace (thanks Amara2_MK), added support for sofar's flowerpot mod, missing glazed textures re-coloured by firefox. - 0.9 - Baked clay now works in the technic cnc machine - 0.8 - Cooking clay block in furnace gives natural baked clay which you can dye @@ -23,3 +25,5 @@ Lucky Blocks: 10 Note: Under settings you will find 'colored_clay_compatibility' switch that when enabled will register aliases for the older colored clay mod and it's stairplus stairs. + +You will also find the 'stairsplus_clay_compatibility' setting that is enabled by default for older worlds that switched from default stairs mod to stairsplus. It can be disabled for brand new worlds only using stairsplus mod though. diff --git a/mods/bakedclay/depends.txt b/mods/bakedclay/depends.txt deleted file mode 100644 index 2a83a659..00000000 --- a/mods/bakedclay/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -default -stairs -moreblocks? -lucky_block? -technic_cnc? -flowerpot? diff --git a/mods/bakedclay/description.txt b/mods/bakedclay/description.txt deleted file mode 100644 index b469a1b5..00000000 --- a/mods/bakedclay/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds the ability to bake clay into blocks and colour them with dye. \ No newline at end of file diff --git a/mods/bakedclay/flowers.lua b/mods/bakedclay/flowers.lua new file mode 100644 index 00000000..53a942f7 --- /dev/null +++ b/mods/bakedclay/flowers.lua @@ -0,0 +1,135 @@ + +-- translation support + +local S = minetest.get_translator("bakedclay") + +-- new flowers + +local flowers = { + {"delphinium", S("Blue Delphinium"), + {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}}, + + {"thistle", S("Thistle"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}}, + + {"lazarus", S("Lazarus Bell"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}}, + + {"mannagrass", S("Reed Mannagrass"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}} +} + +-- helper function + +local function add_simple_flower(name, desc, box, f_groups) + + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("bakedclay:" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {"baked_clay_" .. name .. ".png"}, + inventory_image = "baked_clay_" .. name .. ".png", + wield_image = "baked_clay_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = {type = "fixed", fixed = box} + }) +end + +-- register new flowers to fill in missing dye colours + +for _,item in pairs(flowers) do + add_simple_flower(unpack(item)) +end + +-- add new flowers to mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.004, + spread = {x = 100, y = 100, z = 100}, + seed = 7133, + octaves = 3, + persist = 0.6 + }, + y_min = 10, + y_max = 90, + decoration = "bakedclay:delphinium" +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.004, + spread = {x = 100, y = 100, z = 100}, + seed = 7134, + octaves = 3, + persist = 0.6 + }, + y_min = 15, + y_max = 90, + decoration = "bakedclay:thistle" +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 7135, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 90, + decoration = "bakedclay:lazarus", + spawn_by = "default:jungletree", + num_spawn_by = 1 +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.009, + spread = {x = 100, y = 100, z = 100}, + seed = 7136, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 15, + decoration = "bakedclay:mannagrass", + spawn_by = "group:water", + num_spawn_by = 1 +}) + +-- flowerpot mod support + +if minetest.get_modpath("flowerpot") then + flowerpot.register_node("bakedclay:delphinium") + flowerpot.register_node("bakedclay:thistle") + flowerpot.register_node("bakedclay:lazarus") + flowerpot.register_node("bakedclay:mannagrass") +end diff --git a/mods/bakedclay/init.lua b/mods/bakedclay/init.lua index 1aa98130..d34a946c 100644 --- a/mods/bakedclay/init.lua +++ b/mods/bakedclay/init.lua @@ -1,42 +1,52 @@ --- Baked Clay by TenPlus1 +-- translation support + +local S = minetest.get_translator("bakedclay") + +-- list of clay colours local clay = { - {"natural", "Natural"}, - {"white", "White"}, - {"grey", "Grey"}, - {"black", "Black"}, - {"red", "Red"}, - {"yellow", "Yellow"}, - {"green", "Green"}, - {"cyan", "Cyan"}, - {"blue", "Blue"}, - {"magenta", "Magenta"}, - {"orange", "Orange"}, - {"violet", "Violet"}, - {"brown", "Brown"}, - {"pink", "Pink"}, - {"dark_grey", "Dark Grey"}, - {"dark_green", "Dark Green"} + {"natural", S("Natural")}, + {"white", S("White")}, + {"grey", S("Grey")}, + {"black", S("Black")}, + {"red", S("Red")}, + {"yellow", S("Yellow")}, + {"green", S("Green")}, + {"cyan", S("Cyan")}, + {"blue", S("Blue")}, + {"magenta", S("Magenta")}, + {"orange", S("Orange")}, + {"violet", S("Violet")}, + {"brown", S("Brown")}, + {"pink", S("Pink")}, + {"dark_grey", S("Dark Grey")}, + {"dark_green", S("Dark Green")} } +-- check mod support + local techcnc_mod = minetest.get_modpath("technic_cnc") local stairs_mod = minetest.get_modpath("stairs") local stairsplus_mod = minetest.get_modpath("moreblocks") - and minetest.global_exists("stairsplus") + and minetest.global_exists("stairsplus") +local stairsplus_compat = minetest.settings:get_bool("stairsplus_clay_compatibility") ~= false + +-- scroll through colours for _, clay in pairs(clay) do - -- node + -- register node minetest.register_node("bakedclay:" .. clay[1], { - description = clay[2] .. " Baked Clay", + description = clay[2] .. " " .. S("Baked Clay"), tiles = {"baked_clay_" .. clay[1] ..".png"}, groups = {cracky = 3, bakedclay = 1}, - sounds = default.node_sound_stone_defaults() + sounds = default.node_sound_stone_defaults(), + is_ground_content = false }) - -- craft recipe + -- register craft recipe if clay[1] ~= "natural" then @@ -51,56 +61,67 @@ for _, clay in pairs(clay) do end -- stairs plus + if stairsplus_mod then stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1], "bakedclay:" .. clay[1], { - description = clay[2] .. " Baked Clay", + description = clay[2] .. " " .. S("Baked Clay"), tiles = {"baked_clay_" .. clay[1] .. ".png"}, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults() }) - stairsplus:register_alias_all("bakedclay", clay[1], - "bakedclay", "baked_clay_" .. clay[1]) + if stairsplus_compat then - minetest.register_alias("stairs:slab_bakedclay_".. clay[1], - "bakedclay:slab_baked_clay_" .. clay[1]) + stairsplus:register_alias_all("bakedclay", clay[1], + "bakedclay", "baked_clay_" .. clay[1]) - minetest.register_alias("stairs:stair_bakedclay_".. clay[1], - "bakedclay:stair_baked_clay_" .. clay[1]) + minetest.register_alias("stairs:slab_bakedclay_".. clay[1], + "bakedclay:slab_baked_clay_" .. clay[1]) + + minetest.register_alias("stairs:stair_bakedclay_".. clay[1], + "bakedclay:stair_baked_clay_" .. clay[1]) + end -- stairs redo + elseif stairs_mod and stairs.mod then stairs.register_all("bakedclay_" .. clay[1], "bakedclay:" .. clay[1], {cracky = 3}, {"baked_clay_" .. clay[1] .. ".png"}, - clay[2] .. " Baked Clay", + clay[2] .. " " .. S("Baked Clay"), default.node_sound_stone_defaults()) -- default stairs + elseif stairs_mod then stairs.register_stair_and_slab("bakedclay_".. clay[1], "bakedclay:".. clay[1], {cracky = 3}, {"baked_clay_" .. clay[1] .. ".png"}, - clay[2] .. " Baked Clay Stair", - clay[2] .. " Baked Clay Slab", + clay[2] .. " " .. S("Baked Clay Stair"), + clay[2] .. " " .. S("Baked Clay Slab"), default.node_sound_stone_defaults()) end - -- register bakedclay for use in technic_cnc mod + -- register bakedclay for use in technic_cnc mod after all mods loaded + if techcnc_mod then - technic_cnc.register_all("bakedclay:" .. clay[1], - {cracky = 3, not_in_creative_inventory = 1}, - {"baked_clay_" .. clay[1] .. ".png"}, - clay[2] .. " Baked Clay") + minetest.register_on_mods_loaded(function() + + technic_cnc.register_all("bakedclay:" .. clay[1], + {cracky = 3, not_in_creative_inventory = 1}, + {"baked_clay_" .. clay[1] .. ".png"}, + clay[2] .. " Baked Clay") + end) end end --- Terracotta blocks (textures by D3monPixel, thanks for use :) +-- Terracotta blocks + for _, clay in pairs(clay) do if clay[1] ~= "natural" then @@ -108,7 +129,7 @@ for _, clay in pairs(clay) do local texture = "baked_clay_terracotta_" .. clay[1] ..".png" minetest.register_node("bakedclay:terracotta_" .. clay[1], { - description = clay[2] .. " Glazed Terracotta", + description = clay[2] .. " " .. S("Glazed Terracotta"), tiles = { texture .. "", texture .. "", @@ -120,6 +141,7 @@ for _, clay in pairs(clay) do paramtype2 = "facedir", groups = {cracky = 3, terracotta = 1}, sounds = default.node_sound_stone_defaults(), + is_ground_content = false, on_place = minetest.rotate_node }) @@ -133,286 +155,100 @@ end minetest.register_alias("bakedclay:terracotta_light_blue", "bakedclay:terracotta_cyan") --- cook clay block into white baked clay +-- cook clay block into natural baked clay minetest.register_craft({ type = "cooking", output = "bakedclay:natural", - recipe = "default:clay", + recipe = "default:clay" }) -- register a few extra dye colour options -minetest.register_craft( { - type = "shapeless", - output = "dye:dark_grey 3", - recipe = {"dye:black", "dye:black", "dye:white"} -}) - -minetest.register_craft( { - type = "shapeless", +minetest.register_craft({ output = "dye:green 4", - recipe = {"default:cactus"} + recipe = {{"default:cactus"}} }) -minetest.register_craft( { - type = "shapeless", +minetest.register_craft({ output = "dye:brown 4", - recipe = {"default:dry_shrub"} + recipe = {{"default:dry_shrub"}} }) -- only add light grey recipe if unifieddye mod isnt present (conflict) + if not minetest.get_modpath("unifieddyes") then minetest.register_craft( { - type = "shapeless", + output = "dye:dark_grey 3", + recipe = {{"dye:black", "dye:black", "dye:white"}} + }) + + minetest.register_craft( { output = "dye:grey 3", - recipe = {"dye:black", "dye:white", "dye:white"} + recipe = {{"dye:black", "dye:white", "dye:white"}} }) end -- 2x2 red baked clay makes 16x clay brick + minetest.register_craft( { output = "default:clay_brick 16", recipe = { {"bakedclay:red", "bakedclay:red"}, - {"bakedclay:red", "bakedclay:red"}, + {"bakedclay:red", "bakedclay:red"} } }) --- register some new flowers to fill in missing dye colours --- flower registration (borrowed from default game) - -local function add_simple_flower(name, desc, box, f_groups) - - f_groups.snappy = 3 - f_groups.flower = 1 - f_groups.flora = 1 - f_groups.attached_node = 1 - - minetest.register_node("bakedclay:" .. name, { - description = desc, - drawtype = "plantlike", - waving = 1, - tiles = {"baked_clay_" .. name .. ".png"}, - inventory_image = "baked_clay_" .. name .. ".png", - wield_image = "baked_clay_" .. name .. ".png", - sunlight_propagates = true, - paramtype = "light", - walkable = false, - buildable_to = true, - stack_max = 99, - groups = f_groups, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = box - } - }) -end - -local flowers = { - {"delphinium", "Blue Delphinium", - {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}}, - - {"thistle", "Thistle", - {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}}, - - {"lazarus", "Lazarus Bell", - {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}}, - - {"mannagrass", "Reed Mannagrass", - {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}} -} - -for _,item in pairs(flowers) do - add_simple_flower(unpack(item)) -end - --- mapgen for new flowers - -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.004, - spread = {x = 100, y = 100, z = 100}, - seed = 7133, - octaves = 3, - persist = 0.6 - }, - y_min = 10, - y_max = 90, - decoration = "bakedclay:delphinium" -}) - -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.004, - spread = {x = 100, y = 100, z = 100}, - seed = 7134, - octaves = 3, - persist = 0.6 - }, - y_min = 15, - y_max = 90, - decoration = "bakedclay:thistle" -}) - -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.01, - spread = {x = 100, y = 100, z = 100}, - seed = 7135, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 90, - decoration = "bakedclay:lazarus", - spawn_by = "default:jungletree", - num_spawn_by = 1 -}) - -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:sand"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.009, - spread = {x = 100, y = 100, z = 100}, - seed = 7136, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 15, - decoration = "bakedclay:mannagrass", - spawn_by = "group:water", - num_spawn_by = 1 -}) - --- lucky blocks - -if minetest.get_modpath("lucky_block") then - -local p = "bakedclay:" - -lucky_block:add_blocks({ - {"dro", {"bakedclay:"}, 10, true}, - {"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green", - p.."dark_grey", p.."green", p.."grey", p.."magenta", p.."orange", - p.."pink", p.."red", p.."violet", p.."white", p.."yellow", p.."natural"}, 0}, - {"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green", - p.."dark_grey", p.."green", p.."grey", p.."magenta", p.."orange", - p.."pink", p.."red", p.."violet", p.."white", p.."yellow", p.."natural"}, 0, true}, - {"dro", {p.."delphinium"}, 5}, - {"dro", {p.."lazarus"}, 5}, - {"dro", {p.."mannagrass"}, 5}, - {"dro", {p.."thistle"}, 6}, - {"flo", 5, {p.."natural", p.."black", p.."blue", p.."brown", p.."cyan", - p.."dark_green", p.."dark_grey", p.."green", p.."grey", p.."magenta", - p.."orange", p.."pink", p.."red", p.."violet", p.."white", p.."yellow"}, 2}, - {"nod", "default:chest", 0, { - {name = p.."natural", max = 30}, - {name = p.."black", max = 30}, - {name = p.."blue", max = 30}, - {name = p.."brown", max = 30}, - {name = p.."cyan", max = 30}, - {name = p.."dark_green", max = 30}, - {name = p.."dark_grey", max = 30}, - {name = p.."green", max = 30}, - {name = p.."grey", max = 30}, - {name = p.."magenta", max = 30}, - {name = p.."orange", max = 30}, - {name = p.."pink", max = 30}, - {name = p.."red", max = 30}, - {name = p.."violet", max = 30}, - {name = p.."white", max = 30}, - {name = p.."yellow", max = 30} - }}, -}) - -p = "bakedclay:terracotta_" - -lucky_block:add_blocks({ - {"nod", "default:chest", 0, { - {name = p.."black", max = 20}, - {name = p.."blue", max = 20}, - {name = p.."brown", max = 20}, - {name = p.."cyan", max = 20}, - {name = p.."dark_green", max = 20}, - {name = p.."dark_grey", max = 20}, - {name = p.."green", max = 20}, - {name = p.."grey", max = 20}, - {name = p.."magenta", max = 20}, - {name = p.."orange", max = 20}, - {name = p.."pink", max = 20}, - {name = p.."red", max = 20}, - {name = p.."violet", max = 20}, - {name = p.."white", max = 20}, - {name = p.."yellow", max = 20} - }} -}) -end - -- colored clay compatibility if minetest.settings:get_bool("colored_clay_compatibility") == true then -local cc = { - {"black", "black"}, - {"blue", "blue"}, - {"bright", "natural"}, - {"brown", "brown"}, - {"cyan", "cyan"}, - {"dark_green", "dark_green"}, - {"dark_grey", "dark_grey"}, - {"green", "green"}, - {"grey", "grey"}, - {"hardened", "natural"}, - {"magenta", "magenta"}, - {"orange", "orange"}, - {"pink", "pink"}, - {"red", "red"}, - {"violet", "violet"}, - {"white", "white"}, - {"yellow", "yellow"} -} + local cc = { + {"black", "black"}, + {"blue", "blue"}, + {"bright", "natural"}, + {"brown", "brown"}, + {"cyan", "cyan"}, + {"dark_green", "dark_green"}, + {"dark_grey", "dark_grey"}, + {"green", "green"}, + {"grey", "grey"}, + {"hardened", "natural"}, + {"magenta", "magenta"}, + {"orange", "orange"}, + {"pink", "pink"}, + {"red", "red"}, + {"violet", "violet"}, + {"white", "white"}, + {"yellow", "yellow"} + } -for n = 1, #cc do + for n = 1, #cc do - local nod1 = "colored_clay:" .. cc[n][1] - local nod2 = "bakedclay:" .. cc[n][2] + local nod1 = "colored_clay:" .. cc[n][1] + local nod2 = "bakedclay:" .. cc[n][2] - minetest.register_alias(nod1, nod2) + minetest.register_alias(nod1, nod2) - if stairsplus_mod then - stairsplus:register_alias_all("colored_clay", cc[n][1], "bakedclay", cc[n][2]) + if stairsplus_mod then + stairsplus:register_alias_all("colored_clay", cc[n][1], "bakedclay", cc[n][2]) + end end end +-- get mod path + +local path = minetest.get_modpath("bakedclay") + +-- add new flowers + +dofile(path .. "/flowers.lua") + +-- add lucky blocks if mod present + +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") end --- flowerpot mod - -if minetest.get_modpath("flowerpot") then - flowerpot.register_node("bakedclay:delphinium") - flowerpot.register_node("bakedclay:thistle") - flowerpot.register_node("bakedclay:lazarus") - flowerpot.register_node("bakedclay:mannagrass") -end - - print ("[MOD] Baked Clay loaded") diff --git a/mods/bakedclay/license.txt b/mods/bakedclay/license.txt index 532dbe28..9019798c 100644 --- a/mods/bakedclay/license.txt +++ b/mods/bakedclay/license.txt @@ -21,8 +21,16 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Textures by TenPlus1 (CC0) unless listed below + Textures by Amara2_MK (Creative Commons) https://www.curseforge.com/minecraft/texture-packs/glazed-terracotta-revamp baked_clay_terracotta*.png Missing gray, light gray, black and green textures re-coloured by Firefox. + +Textures by Timbits (CC-BY-SA 3.0) + baked_clay_lazarus.png + baked_clay_delphinium.png + baked_clay_mannagrass.png + baked_clay_thistle.png diff --git a/mods/bakedclay/locale/bakedclay.es.tr b/mods/bakedclay/locale/bakedclay.es.tr new file mode 100644 index 00000000..5418a559 --- /dev/null +++ b/mods/bakedclay/locale/bakedclay.es.tr @@ -0,0 +1,25 @@ +# textdomain: bakedclay +Blue Delphinium=Delfinio Azul +Thistle=Cardo +Lazarus Bell=Campana Lázaro +Reed Mannagrass=Césped de caña +Natural=Natural +White=Blanco +Grey=Gris +Black=Negro +Red=Rojo +Yellow=Amarillo +Green=Verde +Cyan=Celeste +Blue=Azul +Magenta=Magenta +Orange=Naranja +Violet=Violeta +Brown=Cáfe +Pink=Rosa +Dark Grey=Gris Oscuro +Dark Green=Verde Oscuro +Baked Clay=Barro Cocido +Baked Clay Stair=Escalera de Barro Cocido +Baked Clay Slab=Losa de Barro Cocido +Glazed Terracotta=Terracota esmaltada. diff --git a/mods/bakedclay/locale/template.txt b/mods/bakedclay/locale/template.txt new file mode 100644 index 00000000..1f426049 --- /dev/null +++ b/mods/bakedclay/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: bakedclay +Blue Delphinium= +Thistle= +Lazarus Bell= +Reed Mannagrass= +Natural= +White= +Grey= +Black= +Red= +Yellow= +Green= +Cyan= +Blue= +Magenta= +Orange= +Violet= +Brown= +Pink= +Dark Grey= +Dark Green= +Baked Clay= +Baked Clay Stair= +Baked Clay Slab= +Glazed Terracotta= diff --git a/mods/bakedclay/lucky_block.lua b/mods/bakedclay/lucky_block.lua new file mode 100644 index 00000000..cec71b94 --- /dev/null +++ b/mods/bakedclay/lucky_block.lua @@ -0,0 +1,65 @@ + +-- helpers + +local p = "bakedclay:" +local p2 = "bakedclay:terracotta_" + +-- add lucky blocks + +lucky_block:add_blocks({ + {"dro", {"bakedclay:"}, 10, true}, + {"fal", { + p .. "black", p .. "blue", p .. "brown", p .. "cyan", p .. "dark_green", + p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", p .. "orange", + p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow", p .. "natural" + }, 0}, + {"fal", { + p .. "black", p .. "blue", p .. "brown", p .. "cyan", p .. "dark_green", + p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", p .. "orange", + p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow", p .. "natural" + }, 0, true}, + {"dro", {p .. "delphinium"}, 5}, + {"dro", {p .. "lazarus"}, 5}, + {"dro", {p .. "mannagrass"}, 5}, + {"dro", {p .. "thistle"}, 6}, + {"flo", 5, { + p .. "natural", p .. "black", p .. "blue", p .. "brown", p .. "cyan", + p .. "dark_green", p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", + p .. "orange", p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow" + }, 2}, + {"nod", "default:chest", 0, { + {name = p .. "natural", max = 20}, + {name = p .. "black", max = 20}, + {name = p .. "blue", max = 20}, + {name = p .. "brown", max = 20}, + {name = p .. "cyan", max = 20}, + {name = p .. "dark_green", max = 20}, + {name = p .. "dark_grey", max = 20}, + {name = p .. "green", max = 20}, + {name = p .. "grey", max = 20}, + {name = p .. "magenta", max = 20}, + {name = p .. "orange", max = 20}, + {name = p .. "pink", max = 20}, + {name = p .. "red", max = 20}, + {name = p .. "violet", max = 20}, + {name = p .. "white", max = 20}, + {name = p .. "yellow", max = 20} + }}, + {"nod", "default:chest", 0, { + {name = p2 .. "black", max = 20}, + {name = p2 .. "blue", max = 20}, + {name = p2 .. "brown", max = 20}, + {name = p2 .. "cyan", max = 20}, + {name = p2 .. "dark_green", max = 20}, + {name = p2 .. "dark_grey", max = 20}, + {name = p2 .. "green", max = 20}, + {name = p2 .. "grey", max = 20}, + {name = p2 .. "magenta", max = 20}, + {name = p2 .. "orange", max = 20}, + {name = p2 .. "pink", max = 20}, + {name = p2 .. "red", max = 20}, + {name = p2 .. "violet", max = 20}, + {name = p2 .. "white", max = 20}, + {name = p2 .. "yellow", max = 20} + }} +}) diff --git a/mods/bakedclay/mod.conf b/mods/bakedclay/mod.conf index d6afa412..e58f6993 100644 --- a/mods/bakedclay/mod.conf +++ b/mods/bakedclay/mod.conf @@ -1,4 +1,5 @@ name = bakedclay +description = Bake clay blocks and colour with dye, also has Terracotta designs. depends = default -optional_depends = stairs, moreblocks, lucky_block, technic_cnc, flowerpot -description = Adds the ability to bake clay into blocks and colour them with dye. +optional_depends = stairs, moreblocks, lucky_block, flowerpot +min_minetest_version = 5.0 diff --git a/mods/bakedclay/settingtypes.txt b/mods/bakedclay/settingtypes.txt index bdd2a132..657f9652 100644 --- a/mods/bakedclay/settingtypes.txt +++ b/mods/bakedclay/settingtypes.txt @@ -1,2 +1,5 @@ # Registers compatibility aliases with the older colored_clay mod colored_clay_compatibility (Colored Clay Compatibility) bool false + +# Registers compatibility aliases in older worlds for StairsPlus mod +stairsplus_clay_compatibility (StairsPlus Stair Compatibility) bool true diff --git a/mods/basic_materials/.luacheckrc b/mods/basic_materials/.luacheckrc index 55879b03..1dabf677 100644 --- a/mods/basic_materials/.luacheckrc +++ b/mods/basic_materials/.luacheckrc @@ -1,30 +1,7 @@ -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", - }, - }, - } +globals = { + "minetest", "basic_materials", "crafting", } read_globals = { - "default", - "moreores", -} + "default", "xcompat", +} \ No newline at end of file diff --git a/mods/basic_materials/README.md b/mods/basic_materials/README.md new file mode 100644 index 00000000..919e4f02 --- /dev/null +++ b/mods/basic_materials/README.md @@ -0,0 +1,23 @@ +# Basic Materials mod + +mod that adds basic material nodes and items + +## Install + +### Option 1: use content tab in minetest + +* click the content tab +* search for basic materials +* click install on basic materials + +### Option 2: download from [ContentDB](https://content.minetest.net/packages/VanessaE/basic_materials/) + +* click the above link or search for basic materials on ContentDB +* select the download button on the basic materials page +* extract the zip downloaded from the previous step +* place in your mods folder + +### Option 3: use git + +* `git clone https://github.com/mt-mods/basic_materials.git` +* `cd basic_materials` \ No newline at end of file diff --git a/mods/basic_materials/aliases.lua b/mods/basic_materials/aliases.lua new file mode 100644 index 00000000..30185f4b --- /dev/null +++ b/mods/basic_materials/aliases.lua @@ -0,0 +1,34 @@ +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") +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") +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("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("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") + +minetest.register_alias_force("mesecons_materials:silicon", "basic_materials:silicon") +minetest.register_alias_force("glooptest:chainlink", "basic_materials:chainlink_steel") +minetest.register_alias_force("homedecor:chainlink_steel", "basic_materials:chainlink_steel") \ No newline at end of file diff --git a/mods/basic_materials/craftitems.lua b/mods/basic_materials/craftitems.lua new file mode 100644 index 00000000..0040c67d --- /dev/null +++ b/mods/basic_materials/craftitems.lua @@ -0,0 +1,188 @@ +local S = minetest.get_translator("basic_materials") + +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" +}) + +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", +}) + +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", +}) + +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:stainless_steel_wire", { + description = S("Spool of stainless steel wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_stainless_steel_wire.png" +}) + +minetest.register_craftitem("basic_materials:aluminum_wire", { + description = S("Spool of aluminum wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_aluminum_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:lead_strip", { + description = S("Lead Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_lead_strip.png" +}) + +minetest.register_craftitem("basic_materials:gold_strip", { + description = S("Gold Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_gold_strip.png" +}) + +minetest.register_craftitem("basic_materials:stainless_steel_strip", { + description = S("Stainless Steel Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_stainless_steel_strip.png" +}) + +minetest.register_craftitem("basic_materials:aluminum_strip", { + description = S("Aluminum Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_aluminum_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:carbon_steel_bar", { + description = S("Carbon Steel Bar"), + inventory_image = "basic_materials_carbon_steel_bar.png", +}) + +minetest.register_craftitem("basic_materials:stainless_steel_bar", { + description = S("Stainless Steel Bar"), + inventory_image = "basic_materials_stainless_steel_bar.png", +}) + +minetest.register_craftitem("basic_materials:aluminum_bar", { + description = S("Aluminum Bar"), + inventory_image = "basic_materials_aluminum_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" +}) + +if minetest.get_modpath("hades_materials") then + minetest.register_alias_force("basic_materials:plastic_sheet", "hades_materials:plastic_sheeting") + minetest.register_alias_force("basic_materials:paraffin", "hades_materials:plastic_base") + minetest.register_alias_force("basic_materials:silicon", "hades_materials:silicon") +end + diff --git a/mods/basic_materials/crafts.lua b/mods/basic_materials/crafts.lua new file mode 100644 index 00000000..0f24e110 --- /dev/null +++ b/mods/basic_materials/crafts.lua @@ -0,0 +1,441 @@ +local materials = xcompat.materials + +local have_hades_materials = minetest.get_modpath("hades_materials") + +local function compress_craft(input) + local buffer = {} + for _, item in pairs(input) do + if type(item)=="table" then + for _, inneritem in pairs(item) do + buffer[inneritem] = (buffer[inneritem] or 0) + 1 + end + elseif item ~= "" then + buffer[item] = (buffer[item] or 0) + 1 + end + end + + local output = {} + for item, count in pairs(buffer) do + output[#output + 1] = item .. " " .. count + end + return output +end + +local function register_craft(input) + if minetest.get_modpath("rp_crafting") then + local rp_craft = compress_craft(input.recipe) + if #rp_craft > crafting.MAX_INPUTS then + minetest.log("error", "[basic_materials] unable to register craft for " .. input.output) + return + end + + crafting.register_craft({ + output = input.output, + items = rp_craft + }) + else + minetest.register_craft(input) + end +end + +-- Craft recipes +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", ""}, + }, +}) + +register_craft({ + output = "basic_materials:chain_steel 2", + recipe = { + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"} + } +}) + +register_craft({ + output = "basic_materials:chain_brass 2", + recipe = { + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"} + } +}) + +register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 9", + recipe = {"basic_materials:brass_block"}, +}) + +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"}, + }, +}) + +register_craft( { + output = "basic_materials:plastic_strip 9", + recipe = { + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"} + }, +}) + +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"} + }, +}) + +if have_hades_materials then + minetest.clear_craft({ + type = "shapeless", + recipe = {"group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves"} + }) +end + +register_craft({ + type = "shapeless", + output = "basic_materials:oil_extract 2", + recipe = {"group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves"} +}) + +-- Cooking recipes +if not have_hades_materials then + minetest.register_craft({ + type = "cooking", + output = "basic_materials:plastic_sheet", + recipe = "basic_materials:paraffin", + }) +end + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:paraffin", + recipe = "basic_materials:oil_extract", +}) + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:cement_block", + recipe = "basic_materials:wet_cement", + cooktime = 8 +}) + +-- Fuel recipes +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:plastic_sheet", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:oil_extract", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:paraffin", + burntime = 30, +}) + +register_craft({ + output = "basic_materials:concrete_block 6", + recipe = { + {"group:sand", "basic_materials:wet_cement", materials.gravel}, + {"basic_materials:steel_bar", "basic_materials:wet_cement", "basic_materials:steel_bar"}, + {materials.gravel, "basic_materials:wet_cement", "group:sand"}, + } +}) + +register_craft( { + output = "basic_materials:motor 2", + recipe = { + {materials.mese_crystal_fragment, "basic_materials:copper_wire", "basic_materials:plastic_sheet"}, + {materials.copper_ingot, materials.steel_ingot, materials.steel_ingot}, + {materials.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"}, + } +}) + +register_craft( { + output = "basic_materials:heating_element 2", + recipe = { + {materials.copper_ingot, materials.mese_crystal_fragment, materials.copper_ingot} + }, +}) + +register_craft({ + --type = "shapeless", + output = "basic_materials:energy_crystal_simple 2", + recipe = { + {materials.mese_crystal_fragment, materials.torch, materials.mese_crystal_fragment}, + {materials.diamond, materials.gold_ingot, materials.diamond} + }, +}) + +register_craft( { + output = "basic_materials:copper_wire 2", + type = "shapeless", + recipe = { + materials.copper_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +register_craft( { + output = "basic_materials:gold_wire 2", + type = "shapeless", + recipe = { + materials.gold_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +register_craft( { + output = "basic_materials:steel_wire 2", + type = "shapeless", + recipe = { + materials.steel_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_wire 2", + type = "shapeless", + recipe = { + materials.stainless_steel_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_wire 2", + type = "shapeless", + recipe = { + materials.aluminum_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) +end + +register_craft( { + output = "basic_materials:steel_strip 12", + recipe = { + {"", materials.steel_ingot, ""}, + {materials.steel_ingot, "", ""}, + }, +}) + +register_craft( { + output = "basic_materials:copper_strip 12", + recipe = { + {"", materials.copper_ingot, ""}, + {materials.copper_ingot, "", ""}, + }, +}) + +register_craft( { + output = "basic_materials:gold_strip 12", + recipe = { + {"", materials.gold_ingot, ""}, + {materials.gold_ingot, "", ""}, + }, +}) + +if materials.lead_ingot then + register_craft( { + output = "basic_materials:lead_strip 12", + recipe = { + {"", materials.lead_ingot, ""}, + {materials.lead_ingot, "", ""}, + }, + }) +end + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_strip 12", + recipe = { + {"", materials.stainless_steel_ingot, ""}, + {materials.stainless_steel_ingot, "", ""}, + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_strip 12", + recipe = { + {"", materials.aluminum_ingot, ""}, + {materials.aluminum_ingot, "", ""}, + }, + }) +end + +register_craft( { + output = "basic_materials:steel_bar 6", + recipe = { + {"", "", materials.steel_ingot}, + {"", materials.steel_ingot, ""}, + {materials.steel_ingot, "", ""}, + }, +}) + +if materials.carbon_steel_ingot then + register_craft( { + output = "basic_materials:carbon_steel_bar 6", + recipe = { + {"", "", materials.carbon_steel_ingot}, + {"", materials.carbon_steel_ingot, ""}, + {materials.carbon_steel_ingot, "", ""}, + }, + }) +end + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_bar 6", + recipe = { + {"", "", materials.stainless_steel_ingot}, + {"", materials.stainless_steel_ingot, ""}, + {materials.stainless_steel_ingot, "", ""}, + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_bar 6", + recipe = { + {"", "", materials.aluminum_ingot}, + {"", materials.aluminum_ingot, ""}, + {materials.aluminum_ingot, "", ""}, + }, + }) +end + +register_craft( { + output = "basic_materials:padlock 2", + recipe = { + {"basic_materials:steel_bar"}, + {materials.steel_ingot}, + {materials.steel_ingot}, + }, +}) + +register_craft({ + output = "basic_materials:chainlink_steel 12", + recipe = { + {"", materials.steel_ingot, materials.steel_ingot}, + {materials.steel_ingot, "", materials.steel_ingot}, + {materials.steel_ingot, materials.steel_ingot, ""}, + }, +}) + +register_craft( { + output = "basic_materials:gear_steel 6", + recipe = { + {"", materials.steel_ingot, ""}, + {materials.steel_ingot,"basic_materials:chainlink_steel", materials.steel_ingot}, + {"", materials.steel_ingot, ""} + }, +}) + +register_craft( { + type = "shapeless", + output = "basic_materials:terracotta_base 8", + recipe = { + materials.water_bucket, + materials.clay_lump, + materials.gravel, + }, + replacements = {{materials.water_bucket, materials.empty_bucket}}, +}) + +register_craft({ + type = "shapeless", + output = "basic_materials:wet_cement 3", + recipe = { + materials.dirt, + materials.dye_dark_grey, + materials.dye_dark_grey, + materials.dye_dark_grey, + materials.water_bucket + }, + replacements = {{materials.water_bucket, materials.empty_bucket}}, +}) + +if not have_hades_materials then + register_craft( { + output = "basic_materials:silicon 4", + recipe = { + {materials.sand, materials.sand}, + {materials.sand, materials.steel_ingot}, + }, + }) +end + +register_craft( { + output = "basic_materials:ic 4", + recipe = { + {"basic_materials:silicon", "basic_materials:silicon"}, + {"basic_materials:silicon", materials.copper_ingot}, + }, +}) + +-- Without moreores, there still should be a way to create brass. +register_craft( { + output = "basic_materials:brass_ingot 9", + recipe = { + {materials.copper_ingot, materials.tin_ingot, materials.copper_ingot}, + {materials.gold_ingot, materials.copper_ingot, materials.tin_ingot}, + {materials.copper_ingot, materials.tin_ingot, materials.copper_ingot}, + }, +}) + +if materials.silver_ingot then + register_craft( { + output = "basic_materials:silver_wire 2", + type = "shapeless", + recipe = { + materials.silver_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) + + register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 3", + recipe = { + materials.copper_ingot, + materials.copper_ingot, + materials.silver_ingot, + }, + }) +end diff --git a/mods/basic_materials/electrical-electronic.lua b/mods/basic_materials/electrical-electronic.lua deleted file mode 100644 index 91fac4e3..00000000 --- a/mods/basic_materials/electrical-electronic.lua +++ /dev/null @@ -1,86 +0,0 @@ --- 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/mods/basic_materials/init.lua b/mods/basic_materials/init.lua index 348c0598..ad5ea101 100644 --- a/mods/basic_materials/init.lua +++ b/mods/basic_materials/init.lua @@ -4,12 +4,11 @@ -- 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" } +basic_materials.modpath = minetest.get_modpath("basic_materials") -dofile(modpath.."/metals.lua") -dofile(modpath.."/plastics.lua") -dofile(modpath.."/electrical-electronic.lua") -dofile(modpath.."/misc.lua") +dofile(basic_materials.modpath .. "/nodes.lua") +dofile(basic_materials.modpath .. "/craftitems.lua") +dofile(basic_materials.modpath .. "/crafts.lua") +dofile(basic_materials.modpath .. "/aliases.lua") \ No newline at end of file diff --git a/mods/basic_materials/metals.lua b/mods/basic_materials/metals.lua deleted file mode 100644 index 0a3243b0..00000000 --- a/mods/basic_materials/metals.lua +++ /dev/null @@ -1,300 +0,0 @@ --- 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/mods/basic_materials/misc.lua b/mods/basic_materials/misc.lua deleted file mode 100644 index 00128972..00000000 --- a/mods/basic_materials/misc.lua +++ /dev/null @@ -1,126 +0,0 @@ --- 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/mods/basic_materials/mod.conf b/mods/basic_materials/mod.conf index 7234bfe9..d14197bc 100644 --- a/mods/basic_materials/mod.conf +++ b/mods/basic_materials/mod.conf @@ -1,4 +1,4 @@ name = basic_materials -depends = default -optional_depends = moreores +depends = xcompat +optional_depends = moreores, default, mesecons_materials, dye, bucket, fl_stone, fl_trees, mcl_sounds, hades_core, hades_sounds, hades_materials, hades_dye, hades_bucket, hades_extraores, hades_mesecons_materials, aloz, rp_crafting, mcl_core, mcl_copper min_minetest_version = 5.2.0 diff --git a/mods/basic_materials/nodes.lua b/mods/basic_materials/nodes.lua new file mode 100644 index 00000000..a40d1f54 --- /dev/null +++ b/mods/basic_materials/nodes.lua @@ -0,0 +1,62 @@ +local S = minetest.get_translator("basic_materials") +local sound_api = xcompat.sounds +local chains_sbox = {type = "fixed",fixed = { -0.1, -0.5, -0.1, 0.1, 0.5, 0.1 }} + +minetest.register_node("basic_materials:cement_block", { + description = S("Cement"), + tiles = {"basic_materials_cement_block.png"}, + is_ground_content = false, + groups = {cracky=2, dig_stone = 1, pickaxey=5}, + _mcl_hardness=1.6, + sounds = sound_api.node_sound_stone_defaults(), +}) + +minetest.register_node("basic_materials:concrete_block", { + description = S("Concrete Block"), + tiles = {"basic_materials_concrete_block.png",}, + is_ground_content = false, + groups = {cracky=1, concrete=1, dig_stone = 1, pickaxey=5}, + _mcl_hardness=1.6, + sounds = sound_api.node_sound_stone_defaults(), +}) + +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", + is_ground_content = false, + groups = {cracky=3, dig_stone = 1, pickaxey=5}, + _mcl_hardness=1.6, + 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", + is_ground_content = false, + groups = {cracky=3, dig_stone = 1, pickaxey=5}, + _mcl_hardness=1.6, + 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, dig_stone = 1, pickaxey=5}, + _mcl_hardness=1.6, + sounds = sound_api.node_sound_metal_defaults() +}) diff --git a/mods/basic_materials/plastics.lua b/mods/basic_materials/plastics.lua deleted file mode 100644 index e29af53e..00000000 --- a/mods/basic_materials/plastics.lua +++ /dev/null @@ -1,56 +0,0 @@ --- 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/mods/basic_materials/textures/basic_materials_aluminum_bar.png b/mods/basic_materials/textures/basic_materials_aluminum_bar.png new file mode 100644 index 00000000..8d3e11e2 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_aluminum_strip.png b/mods/basic_materials/textures/basic_materials_aluminum_strip.png new file mode 100644 index 00000000..8957022b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_aluminum_wire.png b/mods/basic_materials/textures/basic_materials_aluminum_wire.png new file mode 100644 index 00000000..f0b3dc67 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png b/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png new file mode 100644 index 00000000..a8c35310 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_gold_strip.png b/mods/basic_materials/textures/basic_materials_gold_strip.png new file mode 100644 index 00000000..9fe97a2b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_gold_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_lead_strip.png b/mods/basic_materials/textures/basic_materials_lead_strip.png new file mode 100644 index 00000000..675933f7 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_lead_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png b/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png new file mode 100644 index 00000000..7f7425e1 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png b/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png new file mode 100644 index 00000000..3a331462 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png b/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png new file mode 100644 index 00000000..2429bae6 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png differ diff --git a/mods/basic_signs/.luacheckrc b/mods/basic_signs/.luacheckrc new file mode 100644 index 00000000..c48a7f9e --- /dev/null +++ b/mods/basic_signs/.luacheckrc @@ -0,0 +1,9 @@ +read_globals = { + "minetest", + "signs_lib", + "default" +} + +globals = { + "basic_signs" +} \ No newline at end of file diff --git a/mods/basic_signs/crafting.lua b/mods/basic_signs/crafting.lua index 51a3647a..3aca3e6a 100644 --- a/mods/basic_signs/crafting.lua +++ b/mods/basic_signs/crafting.lua @@ -12,172 +12,108 @@ minetest.register_craft({ minetest.register_craft( { output = "basic_signs:sign_wall_steel_green", recipe = { - { "dye:dark_green", "dye:white", "dye:dark_green" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_green 2", - recipe = { - { "dye:dark_green", "dye:white", "dye:dark_green" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:dark_green", "dye:white", "dye:dark_green"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_yellow", recipe = { - { "dye:yellow", "dye:black", "dye:yellow" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_yellow 2", - recipe = { - { "dye:yellow", "dye:black", "dye:yellow" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:yellow", "dye:black", "dye:yellow"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_red", recipe = { - { "dye:red", "dye:white", "dye:red" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_red 2", - recipe = { - { "dye:red", "dye:white", "dye:red" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:red", "dye:white", "dye:red"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_white_red", recipe = { - { "dye:white", "dye:red", "dye:white" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_white_red 2", - recipe = { - { "dye:white", "dye:red", "dye:white" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:white", "dye:red", "dye:white"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_white_black", recipe = { - { "dye:white", "dye:black", "dye:white" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_white_black 2", - recipe = { - { "dye:white", "dye:black", "dye:white" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:white", "dye:black", "dye:white"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_orange", recipe = { - { "dye:orange", "dye:black", "dye:orange" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_orange 2", - recipe = { - { "dye:orange", "dye:black", "dye:orange" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:orange", "dye:black", "dye:orange"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_blue", recipe = { - { "dye:blue", "dye:white", "dye:blue" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_blue 2", - recipe = { - { "dye:blue", "dye:white", "dye:blue" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:blue", "dye:white", "dye:blue"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_steel_brown", recipe = { - { "dye:brown", "dye:white", "dye:brown" }, - { "", "default:sign_wall_steel", "" } - }, -}) - -minetest.register_craft( { - output = "basic_signs:sign_wall_steel_brown 2", - recipe = { - { "dye:brown", "dye:white", "dye:brown" }, - { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + {"dye:brown", "dye:white", "dye:brown"}, + {"", "default:sign_wall_steel", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_glass 8", recipe = { - { "default:glass", "default:glass", "default:glass" }, - { "default:glass", "default:glass", "default:glass" }, - { "", "default:glass", "" } + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "default:glass"}, + {"", "default:glass", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_obsidian_glass 8", recipe = { - { "default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass" }, - { "default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass" }, - { "", "default:obsidian_glass", "" } + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"", "default:obsidian_glass", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_glass 3", recipe = { - { "xpanes:pane_flat", "xpanes:pane_flat", "xpanes:pane_flat" }, - { "xpanes:pane_flat", "xpanes:pane_flat", "xpanes:pane_flat" }, - { "", "xpanes:pane_flat", "" } + {"xpanes:pane_flat", "xpanes:pane_flat", "xpanes:pane_flat"}, + {"xpanes:pane_flat", "xpanes:pane_flat", "xpanes:pane_flat"}, + {"", "xpanes:pane_flat", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_obsidian_glass 3", recipe = { - { "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat" }, - { "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat" }, - { "", "xpanes:obsidian_pane_flat", "" } + {"xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat"}, + {"xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat", "xpanes:obsidian_pane_flat"}, + {"", "xpanes:obsidian_pane_flat", ""} }, }) minetest.register_craft( { output = "basic_signs:sign_wall_plastic 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" }, - { "", "default:steel_ingot", "" } + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}, + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}, + {"", "default:steel_ingot", ""} }, }) diff --git a/mods/basic_signs/depends.txt b/mods/basic_signs/depends.txt deleted file mode 100644 index 0ea619b3..00000000 --- a/mods/basic_signs/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -signs_lib -basic_materials diff --git a/mods/basic_signs/init.lua b/mods/basic_signs/init.lua index c657fa38..6317fd6a 100644 --- a/mods/basic_signs/init.lua +++ b/mods/basic_signs/init.lua @@ -6,8 +6,7 @@ basic_signs.path = minetest.get_modpath(minetest.get_current_modname()) dofile(basic_signs.path .. "/crafting.lua") -local S, NS = dofile(basic_signs.path .. "/intllib.lua") -basic_signs.gettext = S +local S = minetest.get_translator(minetest.get_current_modname()) signs_lib.register_sign("basic_signs:sign_wall_locked", { description = S("Locked Sign"), @@ -30,7 +29,7 @@ signs_lib.register_sign("basic_signs:sign_wall_glass", { description = S("Glass Sign"), yard_mesh = "signs_lib_standard_sign_yard_two_sticks.obj", tiles = { - { name = "basic_signs_sign_wall_glass.png", backface_culling = true}, + {name = "basic_signs_sign_wall_glass.png", backface_culling = true}, "basic_signs_sign_wall_glass_edges.png", "basic_signs_pole_mount_glass.png", nil, @@ -53,7 +52,7 @@ signs_lib.register_sign("basic_signs:sign_wall_obsidian_glass", { description = S("Obsidian Glass Sign"), yard_mesh = "signs_lib_standard_sign_yard_two_sticks.obj", tiles = { - { name = "basic_signs_sign_wall_obsidian_glass.png", backface_culling = true}, + {name = "basic_signs_sign_wall_obsidian_glass.png", backface_culling = true}, "basic_signs_sign_wall_obsidian_glass_edges.png", "basic_signs_pole_mount_obsidian_glass.png", nil, @@ -112,7 +111,7 @@ local sign_colors = { local cbox = signs_lib.make_selection_boxes(35, 25, true, 0, 0, 0, true) -for i, color in ipairs(sign_colors) do +for _, color in ipairs(sign_colors) do signs_lib.register_sign("basic_signs:sign_wall_steel_"..color[1], { description = S("Sign (@1, steel)", color[2]), paramtype2 = "facedir", @@ -141,10 +140,14 @@ for i, color in ipairs(sign_colors) do use_texture_alpha = "clip", }) - minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_onpole", "basic_signs:sign_steel_"..color[1].."_onpole") - minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_onpole_horiz", "basic_signs:sign_steel_"..color[1].."_onpole_horiz") - minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_hanging", "basic_signs:sign_steel_"..color[1].."_hanging") - minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_yard", "basic_signs:sign_steel_"..color[1].."_yard") + minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_onpole", + "basic_signs:sign_steel_"..color[1].."_onpole") + minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_onpole_horiz", + "basic_signs:sign_steel_"..color[1].."_onpole_horiz") + minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_hanging", + "basic_signs:sign_steel_"..color[1].."_hanging") + minetest.register_alias("basic_signs:sign_wall_steel_"..color[1].."_yard", + "basic_signs:sign_steel_"..color[1].."_yard") table.insert(signs_lib.lbm_restore_nodes, "signs:sign_wall_"..color[1]) minetest.register_alias("signs:sign_wall_"..color[1], "basic_signs:sign_wall_steel_"..color[1]) diff --git a/mods/basic_signs/intllib.lua b/mods/basic_signs/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/basic_signs/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/basic_signs/locale/basic_signs.de.tr b/mods/basic_signs/locale/basic_signs.de.tr new file mode 100644 index 00000000..417bd073 --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.de.tr @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign=Abgeschlossenes Schild +Glass Sign=Glasschild +Obsidian Glass Sign=Obsidianglasschild +Plastic Sign=Plastikschild +green=grün +yellow=gelb +red=rot +white_red=weiß-rot +white_black=weiß-schwarz +orange=orange +blue=blau +brown=braun +Sign (@1, steel)=Schild (@1, Stahl) diff --git a/mods/basic_signs/locale/basic_signs.es.tr b/mods/basic_signs/locale/basic_signs.es.tr new file mode 100644 index 00000000..278824a1 --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.es.tr @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign=Cartel privado +Glass Sign=Cartel de vidrio +Obsidian Glass Sign=Cartel de obsidiana +Plastic Sign=Cartel de plástico +green=verde +yellow=amarillo +red=rojo +white_red=blanco y rojo +white_black=blanco y negro +orange=naranja +blue=azul +brown=marrón +Sign (@1, steel)=Cartel (@1, acero) diff --git a/mods/basic_signs/locale/basic_signs.fr.tr b/mods/basic_signs/locale/basic_signs.fr.tr new file mode 100644 index 00000000..7563f411 --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.fr.tr @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign=Panneau (verrouillé) +Glass Sign= +Obsidian Glass Sign= +Plastic Sign= +green=vert +yellow=jaune +red=rouge +white_red=rouge et blanc +white_black=noir et blanc +orange=orange +blue=bleu +brown=marron +Sign (@1, steel)= diff --git a/mods/basic_signs/locale/basic_signs.id.tr b/mods/basic_signs/locale/basic_signs.id.tr new file mode 100644 index 00000000..470fa0c6 --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.id.tr @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign=Penanda Terkunci +Glass Sign=Penanda Kaca +Obsidian Glass Sign=Penanda Kaca Obsidian +Plastic Sign=Penanda Plastik +green=hijau +yellow=kuning +red=merah +white_red=putih_merah +white_black=putih_hitam +orange=oranye +blue=biru +brown=cokelat +Sign (@1, steel)=Penanda (@1, baja) diff --git a/mods/basic_signs/locale/basic_signs.ms.tr b/mods/basic_signs/locale/basic_signs.ms.tr new file mode 100644 index 00000000..8bdf72de --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.ms.tr @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign=Papan Tanda Berkunci +Glass Sign= +Obsidian Glass Sign= +Plastic Sign= +green=hijau +yellow=kuning +red=merah +white_red=putih_merah +white_black=putih_hitam +orange=jingga +blue=biru +brown=perang +Sign (@1, steel)= diff --git a/mods/basic_signs/locale/basic_signs.ru.tr b/mods/basic_signs/locale/basic_signs.ru.tr new file mode 100644 index 00000000..addc014c --- /dev/null +++ b/mods/basic_signs/locale/basic_signs.ru.tr @@ -0,0 +1,15 @@ +# textdomain: basic_signs +Locked Sign=защищенная табличка +Glass Sign= +Obsidian Glass Sign= +Plastic Sign= +green=зеленая +yellow=желтая +red=красная +white_red=краснобелая +white_black=чернобелая +orange=оранжевая +blue=синея +brown=коричневая +Sign (@1, steel)= + diff --git a/mods/basic_signs/locale/de.po b/mods/basic_signs/locale/de.po deleted file mode 100644 index a2f4150f..00000000 --- a/mods/basic_signs/locale/de.po +++ /dev/null @@ -1,97 +0,0 @@ -# German Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# Xanthin, 2017. -# CodeXP , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:31+0200\n" -"PO-Revision-Date: 2018-03-24 22:00+0100\n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: init.lua -msgid "Write" -msgstr "schreiben" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "gesperrter Schild, gehört @1\n" - -#: init.lua -msgid "locked " -msgstr "gesperrt " - -#: init.lua -#, fuzzy -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 schrieb \"@2\" auf das @3Schild bei @4" - -#: init.lua -msgid "Sign" -msgstr "Schild" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Kann alle gesperrte Schilder bearbeiten" - -#: init.lua -msgid "Locked Sign" -msgstr "gesperrter Schild" - -#: init.lua -msgid "green" -msgstr "grün" - -#: init.lua -msgid "yellow" -msgstr "gelb" - -#: init.lua -msgid "red" -msgstr "rot" - -#: init.lua -msgid "white_red" -msgstr "weißrot" - -#: init.lua -msgid "white_black" -msgstr "schwarzweiß" - -#: init.lua -msgid "orange" -msgstr "orange" - -#: init.lua -msgid "blue" -msgstr "blau" - -#: init.lua -msgid "brown" -msgstr "braun" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Schild (@1, Metall)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Versuch ein unbekanntes Element als Zaun zu registrieren" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Registrierte @1 und @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] Schilder-Mod geladen" diff --git a/mods/basic_signs/locale/es.po b/mods/basic_signs/locale/es.po deleted file mode 100644 index 85799370..00000000 --- a/mods/basic_signs/locale/es.po +++ /dev/null @@ -1,95 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:22+0200\n" -"PO-Revision-Date: 2017-07-31 18:30+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: Carlos Barraza\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: es\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "" - -#: init.lua -msgid "locked " -msgstr "bloqueada " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 escribio \"@2\" en el cartel @3en @4" - -#: init.lua -msgid "Sign" -msgstr "Letrero" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "" - -#: init.lua -#, fuzzy -msgid "Locked Sign" -msgstr "Letrero bloqueada" - -#: init.lua -msgid "green" -msgstr "verde" - -#: init.lua -msgid "yellow" -msgstr "amarillo" - -#: init.lua -msgid "red" -msgstr "rojo" - -#: init.lua -#, fuzzy -msgid "white_red" -msgstr "rojo y blanco" - -#: init.lua -#, fuzzy -msgid "white_black" -msgstr "negro y blanco" - -#: init.lua -msgid "orange" -msgstr "naranja" - -#: init.lua -msgid "blue" -msgstr "azul" - -#: init.lua -msgid "brown" -msgstr "marrón" - -#: init.lua -#, fuzzy -msgid "Sign (@1, metal)" -msgstr "Letrero (@1, metal)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Registrado @1 y @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] signs cargados" diff --git a/mods/basic_signs/locale/fr.po b/mods/basic_signs/locale/fr.po deleted file mode 100644 index a5035740..00000000 --- a/mods/basic_signs/locale/fr.po +++ /dev/null @@ -1,91 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:13+0200\n" -"PO-Revision-Date: 2017-07-31 18:22+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: fat115 \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "Panneau verrouillé, appartient à @1\n" - -#: init.lua -msgid "locked " -msgstr "verrouillé " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 a écrit \"@2\" sur le panneau @3en @4" - -#: init.lua -msgid "Sign" -msgstr "Panneau" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Peut modifier les panneaux verrouillés" - -#: init.lua -msgid "Locked Sign" -msgstr "Panneau (verrouillé)" - -#: init.lua -msgid "green" -msgstr "vert" - -#: init.lua -msgid "yellow" -msgstr "jaune" - -#: init.lua -msgid "red" -msgstr "rouge" - -#: init.lua -msgid "white_red" -msgstr "rouge et blanc" - -#: init.lua -msgid "white_black" -msgstr "noir et blanc" - -#: init.lua -msgid "orange" -msgstr "orange" - -#: init.lua -msgid "blue" -msgstr "bleu" - -#: init.lua -msgid "brown" -msgstr "marron" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Panneau (@1, métal)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Tentative d'enregistrer un nœud inconnu comme barrière" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Enregistrement de @1 et @" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] signs chargé" diff --git a/mods/basic_signs/locale/ms.po b/mods/basic_signs/locale/ms.po deleted file mode 100644 index da115120..00000000 --- a/mods/basic_signs/locale/ms.po +++ /dev/null @@ -1,91 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:00+0200\n" -"PO-Revision-Date: 2017-11-17 02:38+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "Papan tanda berkunci, milik @1\n" - -#: init.lua -msgid "locked " -msgstr "berkunci " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 menulis \"@2\" atas papan tanda @3dekat @4" - -#: init.lua -msgid "Sign" -msgstr "Papan Tanda" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Boleh sunting semua papan tanda berkunci" - -#: init.lua -msgid "Locked Sign" -msgstr "Papan Tanda Berkunci" - -#: init.lua -msgid "green" -msgstr "hijau" - -#: init.lua -msgid "yellow" -msgstr "kuning" - -#: init.lua -msgid "red" -msgstr "merah" - -#: init.lua -msgid "white_red" -msgstr "putih_merah" - -#: init.lua -msgid "white_black" -msgstr "putih_hitam" - -#: init.lua -msgid "orange" -msgstr "jingga" - -#: init.lua -msgid "blue" -msgstr "biru" - -#: init.lua -msgid "brown" -msgstr "perang" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Papan Tanda (@1, logam)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Cuba untuk mendaftar nod tidak diketahui sebagai pagar" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Telah daftar @1 dan @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MODS] signs telah dimuatkan" diff --git a/mods/basic_signs/locale/ru.po b/mods/basic_signs/locale/ru.po deleted file mode 100644 index 9cd01aa4..00000000 --- a/mods/basic_signs/locale/ru.po +++ /dev/null @@ -1,94 +0,0 @@ -# Russian Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: signs_lib\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-24 22:23+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Write" -msgstr "записать" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "защищенная табличка, пренадлежит @1\n" - -#: init.lua -msgid "locked " -msgstr "защищенный " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 записал \"@2\" в @3sign на @4" - -#: init.lua -msgid "Sign" -msgstr "табличка" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Может редактировать все защищенные таблички" - -#: init.lua -msgid "Locked Sign" -msgstr "защищенная табличка" - -#: init.lua -msgid "green" -msgstr "зеленая" - -#: init.lua -msgid "yellow" -msgstr "желтая" - -#: init.lua -msgid "red" -msgstr "красная" - -#: init.lua -msgid "white_red" -msgstr "краснобелая" - -#: init.lua -msgid "white_black" -msgstr "чернобелая" - -#: init.lua -msgid "orange" -msgstr "оранжевая" - -#: init.lua -msgid "blue" -msgstr "синея" - -#: init.lua -msgid "brown" -msgstr "коричневая" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Табличка (@1, металл)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Попытка зарегистрировать неизвестный узел как забор" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Зарегистрировано @1 для @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] мод табличек загружен" diff --git a/mods/basic_signs/locale/template.pot b/mods/basic_signs/locale/template.pot deleted file mode 100644 index e277437f..00000000 --- a/mods/basic_signs/locale/template.pot +++ /dev/null @@ -1,94 +0,0 @@ -# LANGUAGE Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: signs_lib\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-24 22:23+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Write" -msgstr "" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "" - -#: init.lua -msgid "locked " -msgstr "" - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "" - -#: init.lua -msgid "Sign" -msgstr "" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "" - -#: init.lua -msgid "Locked Sign" -msgstr "" - -#: init.lua -msgid "green" -msgstr "" - -#: init.lua -msgid "yellow" -msgstr "" - -#: init.lua -msgid "red" -msgstr "" - -#: init.lua -msgid "white_red" -msgstr "" - -#: init.lua -msgid "white_black" -msgstr "" - -#: init.lua -msgid "orange" -msgstr "" - -#: init.lua -msgid "blue" -msgstr "" - -#: init.lua -msgid "brown" -msgstr "" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "" diff --git a/mods/basic_signs/locale/template.txt b/mods/basic_signs/locale/template.txt new file mode 100644 index 00000000..22bef1d2 --- /dev/null +++ b/mods/basic_signs/locale/template.txt @@ -0,0 +1,14 @@ +# textdomain: basic_signs +Locked Sign= +Glass Sign= +Obsidian Glass Sign= +Plastic Sign= +green= +yellow= +red= +white_red= +white_black= +orange= +blue= +brown= +Sign (@1, steel)= diff --git a/mods/basic_signs/mod.conf b/mods/basic_signs/mod.conf index c06e07df..5d48012d 100644 --- a/mods/basic_signs/mod.conf +++ b/mods/basic_signs/mod.conf @@ -1 +1,4 @@ -min_minetest_version = 5.2.0 +name = basic_signs +title = Basic Signs +depends = default, signs_lib, basic_materials +min_minetest_version = 5.2.0 \ No newline at end of file diff --git a/mods/basic_trains/advtrains_train_industrial/init.lua b/mods/basic_trains/advtrains_train_industrial/init.lua index c798e513..fa7fcb50 100755 --- a/mods/basic_trains/advtrains_train_industrial/init.lua +++ b/mods/basic_trains/advtrains_train_industrial/init.lua @@ -94,6 +94,7 @@ advtrains.register_wagon("wagon_tank", { inventory_list_sizes = { box=8*3, }, + techage_liquid_capacity = 1000, }, S("Industrial tank wagon"), "advtrains_wagon_tank_inv.png") advtrains.register_wagon("wagon_wood", { mesh="advtrains_wagon_wood.b3d", diff --git a/mods/basic_trains/advtrains_train_japan/init.lua b/mods/basic_trains/advtrains_train_japan/init.lua index 930ffc83..578e472e 100644 --- a/mods/basic_trains/advtrains_train_japan/init.lua +++ b/mods/basic_trains/advtrains_train_japan/init.lua @@ -3,9 +3,33 @@ local S = attrans -- note: scharfenberg coupler is defined in advtrains core advtrains.register_coupler_type("train_japan_interwagon", attrans("Japanese Train Inter-Wagon Connection")) +local function set_livery(self, puncher, itemstack, data) + local meta = itemstack:get_meta() + local color = meta:get_string("paint_color") + if color and color:find("^#%x%x%x%x%x%x$") then + local alpha = tonumber(meta:get_string("alpha")) + if alpha == 0 then + data.livery = self.base_texture + else + data.livery = self.base_texture.."^("..self.base_livery.."^[colorize:"..color..":255)" + end + self:set_textures(data) + end +end + +local function set_textures(self, data) + if data.livery then + self.object:set_properties({textures={data.livery}}) + end +end + advtrains.register_wagon("engine_japan", { mesh="advtrains_engine_japan.b3d", textures = {"advtrains_engine_japan.png"}, + base_texture = "advtrains_engine_japan.png", + base_livery = "advtrains_engine_japan_livery.png", + set_textures = set_textures, + set_livery = set_livery, drives_on={default=true}, max_speed=20, seats = { @@ -69,6 +93,7 @@ advtrains.register_wagon("engine_japan", { door_entry={-1.7}, visual_size = {x=1, y=1}, wagon_span=2.5, + wheel_positions = {1.5, -2.5}, is_locomotive=true, collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, drops={"default:steelblock 4"}, @@ -78,6 +103,10 @@ advtrains.register_wagon("engine_japan", { advtrains.register_wagon("wagon_japan", { mesh="advtrains_wagon_japan.b3d", textures = {"advtrains_wagon_japan.png"}, + base_texture = "advtrains_wagon_japan.png", + base_livery = "advtrains_wagon_japan_livery.png", + set_textures = set_textures, + set_livery = set_livery, drives_on={default=true}, max_speed=20, seats = { @@ -141,6 +170,7 @@ advtrains.register_wagon("wagon_japan", { door_entry={-1.7, 1.7}, visual_size = {x=1, y=1}, wagon_span=2.3, + wheel_positions = {2.3, -2.3}, collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, drops={"default:steelblock 4"}, }, S("Japanese Train Wagon"), "advtrains_wagon_japan_inv.png") diff --git a/mods/basic_trains/advtrains_train_japan/textures/advtrains_engine_japan_livery.png b/mods/basic_trains/advtrains_train_japan/textures/advtrains_engine_japan_livery.png new file mode 100644 index 00000000..d26e7e3e Binary files /dev/null and b/mods/basic_trains/advtrains_train_japan/textures/advtrains_engine_japan_livery.png differ diff --git a/mods/basic_trains/advtrains_train_japan/textures/advtrains_wagon_japan_livery.png b/mods/basic_trains/advtrains_train_japan/textures/advtrains_wagon_japan_livery.png new file mode 100644 index 00000000..7e0963ab Binary files /dev/null and b/mods/basic_trains/advtrains_train_japan/textures/advtrains_wagon_japan_livery.png differ diff --git a/mods/bees/depends.txt b/mods/bees/depends.txt deleted file mode 100644 index 53a9e751..00000000 --- a/mods/bees/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -intllib? -lucky_block? diff --git a/mods/bees/description.txt b/mods/bees/description.txt deleted file mode 100644 index 76b67a71..00000000 --- a/mods/bees/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds bees and hives to Minetest. diff --git a/mods/bees/init.lua b/mods/bees/init.lua index d8bd4977..e63b7018 100644 --- a/mods/bees/init.lua +++ b/mods/bees/init.lua @@ -1,48 +1,46 @@ + -- Mod: BEES --- Author: Bas080 (Tweaked by TenPlus1) +-- Author: Bas080 (Updated by TenPlus1) -- License: MIT +-- Translation support --- Intllib support -local S -if minetest.get_translator then - S = minetest.get_translator("bees") -elseif minetest.global_exists("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end +local S = minetest.get_translator("bees") + +-- Functions and Formspecs + +local floor, random = math.floor, math.random --- --- FUNCTIONS --- - -local floor = math.floor -local random = math.random - -local hive_wild = function(pos, grafting) +local function hive_wild(pos, grafting) local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]" - .. "list[nodemeta:".. spos .. ";combs;1.5,3;5,1;]" - .. "list[current_player;main;0,5;8,4;]" + .. "label[0,0;" .. S("Wild Bee Hive") .. "]" + .. "list[nodemeta:" .. spos .. ";combs;1.5,3;5,1;]" -- Honey Comb + .. "list[current_player;main;0,5;8,4;]" -- Player Inventory if grafting then - formspec = formspec .."list[nodemeta:".. spos .. ";queen;3.5,1;1,1;]" + formspec = formspec .."list[nodemeta:".. spos .. ";queen;3.5,1;1,1;]" -- Queen + else + formspec = formspec .. "item_image[3.5,1;1,1;bees:queen]" end return formspec end -local hive_artificial = function(pos) +local function hive_artificial(pos) - local spos = pos.x..","..pos.y..","..pos.z + local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" - .. "list[nodemeta:"..spos..";queen;3.5,1;1,1;]" - .. "list[nodemeta:"..spos..";frames;0,3;8,1;]" - .. "list[current_player;main;0,5;8,4;]" + .. "label[0,0;" .. S("Artificial Bee Hive") .. "]" + .. "item_image[2.5,1;1,1;bees:queen]" -- Queen + .. "list[nodemeta:" .. spos .. ";queen;3.5,1;1,1;]" + .. "tooltip[3.5,1;1,1;" .. S("Queen Bee").."]" + .. "list[nodemeta:" .. spos .. ";frames;0,3;8,1;]" -- Frames + .. "tooltip[0,3;8,1;" .. S("Empty Hive Frame") .. "]" + .. "list[current_player;main;0,5;8,4;]" -- Player Inventory return formspec end @@ -65,9 +63,16 @@ local polinate_flower = function(pos, flower) end --- --- NODES --- +local sting_player = function(player, damage) + + minetest.after(0.1, function() + if player and player:get_pos() then + player:set_hp(player:get_hp() - damage) + end + end) +end + +-- Nodes minetest.register_node("bees:extractor", { description = S("Honey Extractor"), @@ -80,6 +85,7 @@ minetest.register_node("bees:extractor", { choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1 }, + is_ground_content = false, on_construct = function(pos) @@ -94,18 +100,41 @@ minetest.register_node("bees:extractor", { inv:set_size("wax", 1) meta:set_string("formspec", "size[8,9]" + .. "label[0,0;" .. S("Honey Extractor") .. "]" -- input - .. "list[nodemeta:"..pos..";frames_filled;2,1;1,1;]" - .. "list[nodemeta:"..pos..";bottles_empty;2,3;1,1;]" + .. "item_image[1,1;1,1;bees:frame_full]" + .. "list[nodemeta:" .. pos .. ";frames_filled;2,1;1,1;]" + .. "tooltip[2,1;1,1;" .. S("Filled Hive Frame") .. "]" + .. "item_image[1,3;1,1;vessels:glass_bottle]" + .. "list[nodemeta:" .. pos .. ";bottles_empty;2,3;1,1;]" + .. "tooltip[2,3;1,1;Empty Bottles]" -- output - .. "list[nodemeta:"..pos..";frames_emptied;5,0.5;1,1;]" - .. "list[nodemeta:"..pos..";wax;5,2;1,1;]" - .. "list[nodemeta:"..pos..";bottles_full;5,3.5;1,1;]" + .. "label[4,2;->]" + .. "list[nodemeta:" .. pos .. ";frames_emptied;5,0.5;1,1;]" + .. "tooltip[5,0.5;1,1;" .. S("Empty Hive Frame") .. "]" + .. "list[nodemeta:" .. pos .. ";wax;5,2;1,1;]" + .. "tooltip[5,2;1,1;" .. S("Bees Wax") .. "]" + .. "list[nodemeta:" .. pos .. ";bottles_full;5,3.5;1,1;]" + .. "tooltip[5,3.5;1,1;" .. S("Honey Bottle") .. "]" -- player inventory .. "list[current_player;main;0,5;8,4;]" ) end, + can_dig = function(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("frames_filled") and inv:is_empty("frames_emptied") + and inv:is_empty("bottles_empty") and inv:is_empty("bottles_full") + and inv:is_empty("wax") then + return true + else + return false + end + end, + on_timer = function(pos) local meta = minetest.get_meta(pos) @@ -233,7 +262,7 @@ minetest.register_node("bees:extractor", { end return stack:get_count() - end, + end }) @@ -254,13 +283,27 @@ minetest.register_node("bees:bees", { selection_box = { type = "fixed", fixed = { - {-0.3, -0.4, -0.3, 0.3, 0.4, 0.3}, + {-0.3, -0.4, -0.3, 0.3, 0.4, 0.3} } }, - on_punch = function(_, _, puncher) - puncher:set_hp(puncher:get_hp() - 2) + on_timer = function(pos) + minetest.remove_node(pos) end, + + on_construct = function(pos) + + local timer = minetest.get_node_timer(pos) + + timer:start(25) + + minetest.sound_play("bees", + {pos = pos, gain = 1.0, max_hear_distance = 10}, true) + end, + + on_punch = function(_, _, puncher) + sting_player(puncher, 2) + end }) @@ -280,14 +323,14 @@ minetest.register_node("bees:hive_wild", { } }, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - --, attached_node = 1}, + is_ground_content = false, node_box = { -- VanessaE's wild hive nodebox contribution type = "fixed", fixed = { {-0.25, -0.5, -0.25, 0.25, 0.375, 0.25}, {-0.3125, -0.375, -0.3125, 0.3125, 0.25, 0.3125}, {-0.375, -0.25, -0.375, 0.375, 0.125, 0.375}, - {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625} } }, @@ -362,9 +405,11 @@ minetest.register_node("bees:hive_wild", { local inv = meta:get_inventory() if inv:contains_item("queen", "bees:queen") then - - puncher:set_hp(puncher:get_hp() - 4) + sting_player(puncher, 4) end + + minetest.sound_play("bees", + {pos = pos, gain = 1.0, max_hear_distance = 10}, true) end, on_metadata_inventory_take = function(pos, listname, _, _, taker) @@ -377,7 +422,7 @@ minetest.register_node("bees:hive_wild", { timer:start(10) - taker:set_hp(taker:get_hp() - 2) + sting_player(taker, 2) end end, @@ -402,6 +447,8 @@ minetest.register_node("bees:hive_wild", { on_rightclick = function(pos, _, clicker, itemstack) + if not itemstack then return end + minetest.show_formspec(clicker:get_player_name(), "bees:hive_artificial", hive_wild(pos, (itemstack:get_name() == "bees:grafting_tool")) @@ -413,10 +460,10 @@ minetest.register_node("bees:hive_wild", { if meta:get_int("agressive") == 1 and inv:contains_item("queen", "bees:queen") then - -- damage inside timer to stop death duplication glitch - minetest.after(0.1, function() - clicker:set_hp(clicker:get_hp() - 4) - end, clicker) + minetest.sound_play("bees", + {pos = pos, gain = 1.0, max_hear_distance = 10}, true) + + sting_player(clicker, 4) else meta:set_int("agressive", 1) end @@ -468,6 +515,7 @@ minetest.register_node("bees:hive_artificial", { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1 }, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), node_box = { type = "fixed", @@ -512,11 +560,7 @@ minetest.register_node("bees:hive_artificial", { if meta:get_int("agressive") == 1 and inv:contains_item("queen", "bees:queen") then - - -- damage inside timer to stop death duplication glitch - minetest.after(0.1, function() - clicker:set_hp(clicker:get_hp() - 4) - end, clicker) + sting_player(clicker, 4) else meta:set_int("agressive", 1) end @@ -628,7 +672,8 @@ minetest.register_node("bees:hive_artificial", { allow_metadata_inventory_put = function(pos, listname, index, stack) - if not minetest.get_meta(pos):get_inventory():get_stack(listname, index):is_empty() then return 0 end + if not minetest.get_meta(pos):get_inventory():get_stack( + listname, index):is_empty() then return 0 end if listname == "queen" then @@ -645,14 +690,24 @@ minetest.register_node("bees:hive_artificial", { return 0 end, + + can_dig = function(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("queen") and inv:is_empty("frames") then + return true + else + return false + end + end }) - --- -- ABMs --- minetest.register_abm({ + label = "spawn bee particles", nodenames = {"bees:hive_artificial", "bees:hive_wild", "bees:hive_industrial"}, interval = 10, chance = 4, @@ -672,30 +727,33 @@ minetest.register_abm({ y = random() - 0.5, z = random() - 0.5 }, - expirationtime = random(2.5), + expirationtime = random(2, 5), size = random(3), collisiondetection = true, texture = "bees_particle_bee.png", }) + minetest.sound_play("bees", + {pos = pos, gain = 0.6, max_hear_distance = 5}, true) + -- floating hive check and removal if node.name == "bees:hive_wild" then local num = #minetest.find_nodes_in_area( {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, - {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, - {"air"}) + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, {"air"}) if num and num > 25 then minetest.remove_node(pos) end end - end, + end }) +-- Hive spawn ABM. This should be changed to a more realistic type of spawning --- spawn ABM. This should be changed to a more realistic type of spawning minetest.register_abm({ + label = "spawn bee hives", nodenames = {"group:leaves"}, neighbors = {"air"}, interval = 300, @@ -723,14 +781,15 @@ minetest.register_abm({ if minetest.find_node_near(p, 5, "group:flora") then minetest.add_node(p, {name = "bees:hive_wild"}) end - end, + end }) +-- Spawning bees around bee hive --- spawning bees around bee hive minetest.register_abm({ + label = "spawn bees around bee hives", nodenames = {"bees:hive_wild", "bees:hive_artificial", "bees:hive_industrial"}, - neighbors = {"group:flowers", "group:leaves"}, + neighbors = {"group:flower", "group:leaves"}, interval = 30, chance = 4, @@ -745,76 +804,78 @@ minetest.register_abm({ if minetest.get_node(p).name == "air" then minetest.add_node(p, {name="bees:bees"}) end - end, + end }) +-- Helper function --- remove bees -minetest.register_abm({ - nodenames = {"bees:bees"}, - interval = 30, - chance = 5, +local function add_eatable(item, hp) - action = function(pos) - minetest.remove_node(pos) - end, -}) + local def = minetest.registered_items[item] + if def then --- --- ITEMS --- + local groups = table.copy(def.groups) or {} + + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end +end + +-- Items minetest.register_craftitem("bees:frame_empty", { - description = S("Empty hive frame"), + description = S("Empty Hive Frame"), inventory_image = "bees_frame_empty.png", - stack_max = 24, + stack_max = 24 }) minetest.register_craftitem("bees:frame_full", { - description = S("Filled hive frame"), + description = S("Filled Hive Frame"), inventory_image = "bees_frame_full.png", - stack_max = 12, + stack_max = 12 }) minetest.register_craftitem("bees:bottle_honey", { - description = S("Honey bottle"), + description = S("Honey Bottle"), inventory_image = "bees_bottle_honey.png", stack_max = 12, on_use = minetest.item_eat(3, "vessels:glass_bottle"), - groups = {vessel = 1}, + groups = {vessel = 1} }) +add_eatable("bees:bottle_honey", 3) + minetest.register_craftitem("bees:wax", { - description = S("Bees wax"), + description = S("Bees Wax"), inventory_image = "bees_wax.png", - stack_max = 48, + stack_max = 48 }) minetest.register_craftitem("bees:honey_comb", { - description = S("honey comb"), + description = S("Honey Comb"), inventory_image = "bees_comb.png", on_use = minetest.item_eat(2), - stack_max = 8, + stack_max = 8 }) +add_eatable("bees:honey_comb", 2) + minetest.register_craftitem("bees:queen", { description = S("Queen Bee"), inventory_image = "bees_particle_bee.png", - stack_max = 1, + stack_max = 1 }) - --- --- CRAFTS --- +-- Crafts minetest.register_craft({ output = "bees:extractor", recipe = { {"", "default:steel_ingot", ""}, {"default:steel_ingot", "default:stick", "default:steel_ingot"}, - {"default:mese_crystal", "default:steel_ingot", "default:mese_crystal"}, + {"default:mese_crystal", "default:steel_ingot", "default:mese_crystal"} } }) @@ -823,7 +884,7 @@ minetest.register_craft({ recipe = { {"default:steel_ingot", "wool:red", ""}, {"", "default:torch", ""}, - {"", "default:steel_ingot",""}, + {"", "default:steel_ingot",""} } }) @@ -832,7 +893,7 @@ minetest.register_craft({ recipe = { {"group:wood", "group:wood", "group:wood"}, {"group:wood", "default:stick", "group:wood"}, - {"group:wood", "default:stick", "group:wood"}, + {"group:wood", "default:stick", "group:wood"} } }) @@ -841,7 +902,7 @@ minetest.register_craft({ recipe = { {"", "", "default:steel_ingot"}, {"", "default:stick", ""}, - {"", "", ""}, + {"", "", ""} } }) @@ -850,7 +911,7 @@ minetest.register_craft({ recipe = { {"group:wood", "group:wood", "group:wood"}, {"default:stick", "default:stick", "default:stick"}, - {"default:stick", "default:stick", "default:stick"}, + {"default:stick", "default:stick", "default:stick"} } }) @@ -860,29 +921,24 @@ if minetest.get_modpath("bushes_classic") then type = "cooking", cooktime = 5, recipe = "bees:bottle_honey", - output = "bushes:sugar", + output = "bushes:sugar" }) end - --- --- TOOLS --- +-- Tools minetest.register_tool("bees:smoker", { - description = S("smoker"), + description = S("Smoker"), inventory_image = "bees_smoker.png", tool_capabilities = { full_punch_interval = 3.0, max_drop_level = 0, - damage_groups = {fleshy = 2}, + damage_groups = {fleshy = 2} }, on_use = function(itemstack, _, pointed_thing) - if pointed_thing.type ~= "node" then - return - end + if pointed_thing.type ~= "node" then return end local pos = pointed_thing.under @@ -899,50 +955,59 @@ minetest.register_tool("bees:smoker", { expirationtime = 2 + random(2.5), size = random(3), collisiondetection = false, - texture = "bees_smoke_particle.png", + texture = "bees_smoke_particle.png" }) end itemstack:add_wear(65535 / 200) - local meta = minetest.get_meta(pos) + local nodename = minetest.get_node(pos).name or "" - meta:set_int("agressive", 0) + if nodename:find("bees:hive_") then + + local meta = minetest.get_meta(pos) + + meta:set_int("agressive", 0) + end return itemstack - end, + end }) minetest.register_tool("bees:grafting_tool", { - description = S("Grafting tool"), + description = S("Grafting Tool"), inventory_image = "bees_grafting_tool.png", tool_capabilities = { full_punch_interval = 3.0, - max_drop_level=0, - damage_groups = {fleshy = 2}, - }, + max_drop_level = 0, + damage_groups = {fleshy = 2} + } }) - --- -- COMPATIBILTY --- remove after all has been updated --- --- ALIASES +-- Aliases + minetest.register_alias("bees:honey_extractor", "bees:extractor") - --- BACKWARDS COMPATIBILITY WITH OLDER VERSION minetest.register_alias("bees:honey_bottle", "bees:bottle_honey") +-- Start hive timers on map load + minetest.register_lbm({ - nodenames = {"bees:hive", "bees:hive_artificial_inhabited"}, + nodenames = {"bees:hive", "bees:hive_artificial_inhabited", "bees:bees"}, name = "bees:replace_old_hives", label = "Replace old hives", run_at_every_load = true, action = function(pos, node) + if node.name == "bees:bees" then + + local timer = minetest.get_node_timer(pos) + + timer:start(20) + end + if node.name == "bees:hive" then minetest.set_node(pos, {name = "bees:hive_wild"}) @@ -969,10 +1034,7 @@ minetest.register_lbm({ end }) - --- --- PIPEWORKS --- +-- Pipeworks if minetest.get_modpath("pipeworks") then @@ -984,6 +1046,7 @@ if minetest.get_modpath("pipeworks") then snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1 }, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), tube = { @@ -1063,6 +1126,18 @@ if minetest.get_modpath("pipeworks") then meta:set_string("infotext", S("Requires Queen bee to function")) end, + can_dig = function(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("queen") and inv:is_empty("frames") then + return true + else + return false + end + end, + on_rightclick = function(pos, _, clicker) local player_name = clicker:get_player_name() @@ -1081,8 +1156,7 @@ if minetest.get_modpath("pipeworks") then if meta:get_int("agressive") == 1 and inv:contains_item("queen", "bees:queen") then - - clicker:set_hp(clicker:get_hp() - 4) + sting_player(clicker, 4) else meta:set_int("agressive", 1) end @@ -1210,23 +1284,20 @@ if minetest.get_modpath("pipeworks") then end return 0 - end, + end }) minetest.register_craft({ output = "bees:hive_industrial", recipe = { - {"default:steel_ingot","homedecor:plastic_sheeting","default:steel_ingot"}, - {"pipeworks:tube_1","bees:hive_artificial","pipeworks:tube_1"}, - {"default:steel_ingot","homedecor:plastic_sheeting","default:steel_ingot"}, + {"default:steel_ingot", "homedecor:plastic_sheeting", "default:steel_ingot"}, + {"pipeworks:tube_1", "bees:hive_artificial", "pipeworks:tube_1"}, + {"default:steel_ingot", "homedecor:plastic_sheeting", "default:steel_ingot"} } }) end - --- --- LUCKY BLOCKS --- +-- Lucky Blocks if minetest.get_modpath("lucky_block") then @@ -1235,7 +1306,7 @@ if minetest.get_modpath("lucky_block") then local objs = minetest.get_objects_inside_radius(pos, 15) minetest.chat_send_player(player:get_player_name(), - minetest.colorize("violet", S("Bees! Bees for all!"))) + minetest.colorize("violet", S("Bees! Bees for all!"))) for n = 1, #objs do @@ -1245,7 +1316,7 @@ if minetest.get_modpath("lucky_block") then player_pos.y = player_pos.y + 1 - minetest.swap_node(player_pos, {name = "bees:bees"}) + minetest.set_node(player_pos, {name = "bees:bees"}) end end end @@ -1259,9 +1330,9 @@ if minetest.get_modpath("lucky_block") then {"dro", {"bees:frame_full"}, 2}, {"dro", {"bees:bottle_honey"}, 3}, {"dro", {"bees:smoker"}, 1}, - {"nod", "bees:hive_artificial"}, + {"nod", "bees:hive_artificial"} }) end -print(S("[MOD] Bees Loaded!")) +print("[MOD] Bees Loaded") diff --git a/mods/bees/license.txt b/mods/bees/license.txt index ab1c816d..62295702 100644 --- a/mods/bees/license.txt +++ b/mods/bees/license.txt @@ -19,3 +19,13 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Textures by Bas80 and Neuromancer are CC BY-SA + +BlockMen (CC BY-SA 3.0): + default_wood.png + +The following are textures based on default_wood.png + bees_hive_artificial.png + bees_frame_empty.png + bees_frame_full.png diff --git a/mods/bees/locale/bees.es.tr b/mods/bees/locale/bees.es.tr new file mode 100644 index 00000000..ed817bab --- /dev/null +++ b/mods/bees/locale/bees.es.tr @@ -0,0 +1,21 @@ +# textdomain: bees +Honey Extractor=Exctrator de miel +Bees=Abejas +Wild Bee Hive=Colmena de Abejas Salvajes +Colony died, not enough flowers in area!=¡La colonia murió, no hay suficientes flores en el área! +Artificial Bee Hive=Colmena de Abejas Artificial +Requires Queen bee to function=Requiere una Abeja Reina para funcionar +progress:=progreso: +Does not have empty frame(s)=No tiene marco(s) vacío(s) +Queen inserted, now for the empty frames=Abeja Reina insertada, ahora para los marcos vacíos +Bees are aclimating=Las Abejas se están aclimatándose +Empty Hive Frame=Marco de Colmena Vacío +Filled Hive Frame=Marco de Colmena Lleno +Honey Bottle=Botella de Miel +Bees Wax=Cera de Abejas +Honey Comb=Panal de Miel +Queen Bee=Abeja Reina +Smoker=Ahumador +Grafting Tool=Herramienta de Injerto +Industrial Bee Hive=Colmena de Abejas Industrial +Bees! Bees for all!=¡Abejas! ¡Abejas para todos! diff --git a/mods/bees/locale/bees.fr.tr b/mods/bees/locale/bees.fr.tr new file mode 100644 index 00000000..e216f8af --- /dev/null +++ b/mods/bees/locale/bees.fr.tr @@ -0,0 +1,21 @@ +# textdomain: bees +Honey Extractor=Extracteur de miel. +Bees=Abeilles. +Wild Bee Hive=Ruche d'abeilles sauvages. +Colony died, not enough flowers in area!=L'essaim est mort, plus assez de fleurs aux alentours ! +Artificial Bee Hive=Ruche artificielle. +Requires Queen bee to function=Nécessite une reine pour produire. +progress:=En cours: +Does not have empty frame(s)=N'a pas de cadres(s) vide(s) +Queen inserted, now for the empty frames=La reine est installée, maintenant besoin de cadres vides +Bees are aclimating=Les abeilles sont apprivoisées. +Empty Hive Frame=Les cadres sont vides. +Filled Hive Frame=Les cadres sont pleins. +Honey Bottle=Pot de miel. +Bees Wax=Cire d'abeilles. +Honey Comb=Alvéoles. +Queen Bee=La reine. +Smoker=Enfumoir. +Grafting Tool=Outil de greffage. +Industrial Bee Hive=Ruche industrielle. +Bees! Bees for all!=Abeilles ! Des abeilles pour tout le monde! diff --git a/mods/bees/locale/template.txt b/mods/bees/locale/template.txt index b9be40c8..07f19885 100644 --- a/mods/bees/locale/template.txt +++ b/mods/bees/locale/template.txt @@ -1,22 +1,21 @@ -# Template - -Bees = -Honey Extractor = -Wild Bee Hive = -Artificial Bee Hive = -Industrial Bee Hive = -Colony died, not enough flowers in area! = -Requires Queen bee to function = -Progress = -Does not have empty frame(s) = -Queen inserted, now for empty frames = -Bees are aclimating = -Empty hive frame = -Filled hive frame = -Honey Bottle = -Bees wax = -Honey comb = -Queen Bee = -Smoker = -Grafting tool = -[MOD] Bees Loaded! = +# textdomain: bees +Honey Extractor= +Bees= +Wild Bee Hive= +Colony died, not enough flowers in area!= +Artificial Bee Hive= +Requires Queen bee to function= +progress:= +Does not have empty frame(s)= +Queen inserted, now for the empty frames= +Bees are aclimating= +Empty Hive Frame= +Filled Hive Frame= +Honey Bottle= +Bees Wax= +Honey Comb= +Queen Bee= +Smoker= +Grafting Tool= +Industrial Bee Hive= +Bees! Bees for all!= diff --git a/mods/bees/mod.conf b/mods/bees/mod.conf index 8d0be1ea..1fe1ff63 100644 --- a/mods/bees/mod.conf +++ b/mods/bees/mod.conf @@ -1,4 +1,5 @@ name = bees -depends = default -optional_depends = intllib, lucky_block description = Adds bees and hives to Minetest. +depends = default, vessels +optional_depends = lucky_block +min_minetest_version = 5.0 diff --git a/mods/bees/readme.txt b/mods/bees/readme.txt index a0668c17..24ccdbc1 100644 --- a/mods/bees/readme.txt +++ b/mods/bees/readme.txt @@ -10,7 +10,7 @@ FEATURES - Intllib support (template added) - Wild hives are removed if found floating in mid air - Change compatibility abm to lbm -- Change from WTFPL to MIT license +- Change from WTFPL to MIT license after rewrite - Make wild hive abm less intensive (thanks VanessaE) - Added 9x Lucky Blocks - Smokers have 200 uses before breaking @@ -62,8 +62,8 @@ https://forum.minetest.net/viewtopic.php?pid=102905 LICENSE ------- -- codes is WTFPL -- textures are CC BY-SA +- codes is MIT +- textures by Bas80 and Neuromancer are CC BY-SA CRAFTS ------ diff --git a/mods/bees/screenshot.jpg b/mods/bees/screenshot.jpg new file mode 100644 index 00000000..f9ca17ba Binary files /dev/null and b/mods/bees/screenshot.jpg differ diff --git a/mods/bees/screenshot.png b/mods/bees/screenshot.png deleted file mode 100644 index 04bbd26d..00000000 Binary files a/mods/bees/screenshot.png and /dev/null differ diff --git a/mods/bees/sounds/bees.1.ogg b/mods/bees/sounds/bees.1.ogg index 62adbfe8..d9419ad0 100644 Binary files a/mods/bees/sounds/bees.1.ogg and b/mods/bees/sounds/bees.1.ogg differ diff --git a/mods/bees/sounds/bees.2.ogg b/mods/bees/sounds/bees.2.ogg index 4bab2a9f..5222a01a 100644 Binary files a/mods/bees/sounds/bees.2.ogg and b/mods/bees/sounds/bees.2.ogg differ diff --git a/mods/bees/sounds/bees.3.ogg b/mods/bees/sounds/bees.3.ogg index f90d8821..ea2080fa 100644 Binary files a/mods/bees/sounds/bees.3.ogg and b/mods/bees/sounds/bees.3.ogg differ diff --git a/mods/biome_lib/README.md b/mods/biome_lib/README.md index 21779e01..a8ac11e4 100644 --- a/mods/biome_lib/README.md +++ b/mods/biome_lib/README.md @@ -14,8 +14,8 @@ It is primarily intended for mapgen v6, but it should work fine when used with m **Dependencies:** nothing, but if you don't use `minetest_game`, you'll need to supply some settings (see API.txt). -**Recommends**: [Plantlife Modpack](https://github.com/minetest-mods/plantlife_modpack), -[More Trees](https://github.com/minetest-mods/moretrees) +**Recommends**: [Plantlife Modpack](https://github.com/mt-mods/plantlife_modpack), +[More Trees](https://github.com/mt-mods/moretrees) **API**: This mod supplies a small number of very powerful functions. They are, briefly: diff --git a/mods/biome_lib/description.txt b/mods/biome_lib/description.txt deleted file mode 100644 index 0412661b..00000000 --- a/mods/biome_lib/description.txt +++ /dev/null @@ -1 +0,0 @@ -The biome spawning and management library for Plantlife, Moretrees, Tiny Trees, and other mods that originally depended on plants_lib from the plantlife modpack. diff --git a/mods/biome_lib/init.lua b/mods/biome_lib/init.lua index 507fc9cb..a92c6327 100644 --- a/mods/biome_lib/init.lua +++ b/mods/biome_lib/init.lua @@ -82,7 +82,7 @@ minetest.after(0.01, function() ..#biome_lib.surfaceslist_aircheck + #biome_lib.surfaceslist_no_aircheck, 0) else biome_lib.dbg("There are no \"handle manually\" items/actions registered,", 0) - biome_lib.dbg("so the mapblock queue will not be not used this session.", 0) + biome_lib.dbg("so the mapblock queue will not be used this session.", 0) end biome_lib.dbg("Items sent to the engine's decorations handler: "..#biome_lib.registered_decorations, 0) diff --git a/mods/biome_lib/mod.conf b/mods/biome_lib/mod.conf index 5de8fe57..790c5cb7 100644 --- a/mods/biome_lib/mod.conf +++ b/mods/biome_lib/mod.conf @@ -1,3 +1,5 @@ name = biome_lib -min_minetest_version = 5.2.0 +title = Biome Library +description = The biome spawning and management library for Plantlife, Moretrees, Tiny Trees, and other mods that originally depended on plants_lib from the plantlife modpack. optional_depends = default +min_minetest_version = 5.2.0 diff --git a/mods/blox/LICENSE.txt b/mods/blox/LICENSE similarity index 100% rename from mods/blox/LICENSE.txt rename to mods/blox/LICENSE diff --git a/mods/blox/depends.txt b/mods/blox/depends.txt deleted file mode 100644 index ad9eeb02..00000000 --- a/mods/blox/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -unifieddyes -moreblocks? -coloredwood? diff --git a/mods/blox/description.txt b/mods/blox/description.txt deleted file mode 100644 index d4e9f90c..00000000 --- a/mods/blox/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds lots of differently colored and textured blocks to Minetest. diff --git a/mods/blox/init.lua b/mods/blox/init.lua index 5b6b67a7..cfe6d50a 100644 --- a/mods/blox/init.lua +++ b/mods/blox/init.lua @@ -10,7 +10,7 @@ by blert2112 blox = {} -local version = "0.8" +local version = "0.9" local BloxColours = { "pink", @@ -52,7 +52,7 @@ minetest.register_node("blox:glowstone", { paramtype = "light", sunlight_propagates = true, light_source = 14, - is_ground_content = true, + is_ground_content = false, groups = {cracky=2}, sounds = default.node_sound_stone_defaults(), }) @@ -65,7 +65,7 @@ minetest.register_node("blox:glowore", { paramtype = "light", sunlight_propagates = false, light_source = 8, - drop = { + drop = { max_items = 1, items = { { @@ -93,7 +93,8 @@ minetest.register_node("blox:glowdust", { light_source = 9, walkable = false, groups = {cracky=3, snappy=3}, - }) + is_ground_content = false, +}) -- param2-colored nodes: standard patterns @@ -112,7 +113,7 @@ for _, nodeclass in ipairs(NodeClass) do palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, stone=1, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -130,7 +131,7 @@ for _, nodeclass in ipairs(NodeClass) do palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, stone=2, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -148,7 +149,7 @@ for _, nodeclass in ipairs(NodeClass) do palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {snappy=2, choppy=2, wood=1, oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), on_construct = unifieddyes.on_construct, @@ -168,7 +169,7 @@ minetest.register_node("blox:wood_tinted", { palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {snappy=2, choppy=2, wood=1, oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), on_construct = unifieddyes.on_construct, @@ -181,7 +182,7 @@ minetest.register_node("blox:stone_square", { palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {snappy=2, choppy=2, stone=1, oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), on_construct = unifieddyes.on_construct, @@ -194,7 +195,7 @@ minetest.register_node("blox:cobble_tinted", { palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {snappy=2, choppy=2, stone=2, oddly_breakable_by_hand=2,flammable=3, not_in_creative_inventory = 1, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), on_construct = unifieddyes.on_construct, @@ -207,7 +208,7 @@ minetest.register_node("blox:stone_tinted", { palette = "unifieddyes_palette_extended.png", paramtype = "light", paramtype2 = "color", - is_ground_content = true, + is_ground_content = false, groups = {snappy=2, choppy=2, stone=1, oddly_breakable_by_hand=2,flammable=3, not_in_creative_inventory = 1, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), on_construct = unifieddyes.on_construct, diff --git a/mods/blox/mod.conf b/mods/blox/mod.conf index bb5b16a8..c6924c19 100644 --- a/mods/blox/mod.conf +++ b/mods/blox/mod.conf @@ -1 +1,4 @@ name = blox +description = Adds lots of differently colored and textured blocks to Minetest. +depends = default, unifieddyes +optional_depends = moreblocks, coloredwood diff --git a/mods/bonemeal/README.md b/mods/bonemeal/README.md index e5d85cf4..9a97f2aa 100644 --- a/mods/bonemeal/README.md +++ b/mods/bonemeal/README.md @@ -1,38 +1,200 @@ -Bonemeal mod [bonemeal] +minetest mod Bonemeal +===================== + +FARM mod that helps and featured the farming to quickly grow samplings, crops, grass, etc + +Information +----------- + +Bonemeal is crushed from bones found in dirt or by using player bones, Mulch is +made from a tree trunk surrounded by leaves and Fertiliser is a mix of both, +each of which can be used to quickly grow saplings, crops and grass/decoration, +papyrus on top of dirt and cactus on sand. + +Support for ethereal saplings/crops, farming redo crops and moretrees saplings are included. + +![](screenshot.jpg) + +## Technical info + +This mod is named `bonemeal` and must be installed with such name. This mod adds four new items into the game, bones which can be dug from normal -dirt which can be made into bonemeal, mulch which is is crafted using a tree and -8x leaves, and fertiliser which is a mixture of them both. +dirt which can be cooked into bonemeal, mulch which is is crafted using a tree +and 8x leaves, and fertiliser which is a mixture of them both. -Each item can be used on saplings and crops for a chance to grow them quicker as -well as dirt which will generate random grass, flowers or whichever decoration -is registered. +Each item can be used on saplings and crops for a chance to grow them quicker +as well as dirt which will generate random grass, flowers or whichever +decoration is registered. -Mulch has a strength of 1, Bonemeal 2 and Fertiliser 3 which means the stronger +Mulch has a strength of 1, Bonemeal 2 and Fertiliser 3. This means the stronger the item, the more chance of growing saplings in low light, making crops sprout quicker or simply decorate a larger area with grass and flowers. -The api.txt document shows how to add your own saplings, crops and grasses to -the list by using one of the 3 commands included and the mod.lua file gives you -many examples by using some of the popular mods available. +#### Dependencies + +Dependencies: default + +Optional Dependencies: farming, ethereal, moretrees, lucky_block, moretrees, flowers, dye, ferns, dryplants, df_trees, df_farming, df_primordial_items, everness + +Lucky Blocks: 6 + +#### API + +The [`api.txt`](api.txt) document shows how to add your own saplings, +crops and grasses to the list by using one of the 3 commands included and +the [`mod.lua`](mod.lua) file gives you many examples by using some of the +popular mods available. https://forum.minetest.net/viewtopic.php?f=9&t=16446 -Changelog: +#### Nodes -- 0.1 - Initial release -- 0.2 - Added global on_use function for bonemeal growth -- 0.3 - Added strength to on_use global for new items (mulch and fertiliser) -- 0.4 - Added Intllib support and fr.txt file -- 0.5 - Added support for default bush and acacia bush saplings -- 0.6 - Using newer functions, Minetest 0.4.16 and above needed to run -- 0.7 - Can be used on papyrus and cactus now, added coral recipe, api addition -- 0.8 - Added support for farming redo's new garlic, pepper and onion crops -- 0.9 - Added support for farming redo's pea and beetroot crops, checks for place_param -- 1.0 - add_deco() now adds to existing item list while set_deco() replaces item list (thanks h-v-smacker) -- 1.1 - Added {can_bonemeal=1} group for special nodes -- 1.2 - Added support for minetest 5.0 cactus seedling, blueberry bush sapling and emergent jungle tree saplings, additional flowers and pine bush sapling. -- 1.3 - Ability to craft dye from mulch, bonemeal and fertiliser (thanks orbea) -- 1.4 - Add support for fern saplings from plantlife mod (thanks nixnoxus) +| Node name | description | notes | +| ----------------------- | ------------ | --------------------------------------------------- | +| bonemeal:mulch | Mulch | fertilizer to make grow plants and seeds faster | +| bonemeal:bonemeal | Bone Meal | 2 x fertilizer to make grow plants and seeds faster | +| bonemeal:fertiliser | Fertiliser | 3 x fertilizer to make grow plants and seeds faster | +| bonemeal:bone | Bone | cook to made fertilizers, found into dirt rarelly | +| bone:bone | Player bones | cook to made fertilizers, found into dirt rarelly | +| bonemeal:gelatin_powder | Gelatin Powder | made from bones | -Lucky Blocks: 6 +#### Crafts + +* bonemeal:gelatin_powder 4 + +``` + {"group:bone", "group:bone", "group:bone"}, + {"bucket:bucket_water", "bucket:bucket_water", "bucket:bucket_water"}, + {"bucket:bucket_water", "default:torch", "bucket:bucket_water"} +``` + +* bonemeal:bonemeal 2 + +``` + {{"group:bone"}} +``` + +* bonemeal:bonemeal 4 + +``` + {{"bones:bones"}} +``` + +* bonemeal:bonemeal 2 + +``` + {{"default:coral_skeleton"}} +``` + +* bonemeal:mulch 4 + +``` + {"group:tree", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} +``` + +* bonemeal:mulch + +``` + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"} +``` + +* fertiliser 2 + +``` + {{"bonemeal:bonemeal", "bonemeal:mulch"}} +``` + +## Changelog + +#### Version 0.1 + +* Initial release + +#### Version 0.2 + +* Added global `on_use` function for bonemeal growth + +#### Version 0.3 + +* Added strength to `on_use` global for new items (mulch and fertiliser) + +#### Version 0.4 + +* Added `Intllib` support and `fr.txt` file for French translation. + +#### Version 0.5 + +* Added support for default bush and acacia bush saplings + +#### Version 0.6 + +* Using newer functions. This means Minetest 0.4.16 and above needed to run + +#### Version 0.7 + +* Can be used on papyrus and cactus now +* Added coral recipe +* API addition + +#### Version 0.8 + +* Added support for farming redo's new garlic +* Added pepper and onion crops + +#### Version 0.9 + +* Added support for farming redo's pea and beetroot crops +* Checks for `place_param` + +#### Version 1.0 + +* `add_deco()` now adds to existing item list while `set_deco()` replaces item + list (thanks `h-v-smacker`) + +#### Version 1.1 + +* Added `{can_bonemeal=1}` group for special nodes + +#### Version 1.2 + +* Added support for Minetest 5.0 cactus seedling, blueberry bush sapling and + emergent jungle tree saplings, additional flowers and pine bush sapling + +#### Version 1.3 + +* Added ability to craft dye from mulch, bonemeal and fertiliser (thanks + `orbea`) + +#### Version 1.4 + +* Added support for fern saplings from `plantlife` mod (thanks `nixnoxus`) + +#### Version 1.5 + +* Added support for farming redo's asparagus, eggplant, spinach + +#### Version 1.6 + +* Added helper function for position and protection check +* Added ginger support +* Added moretrees poplar sapling + +#### Version 1.7 + +* Added farming redo's barley, hemp, rye, oat, mint, sunflower, rice seeds +* Added Everness saplings +* Update readme (thanks mckaygerhard) +* Recipe changes, player bones craft into 2x bones, bones must be cooked to + give bonemeal +* Added bushes_classic support + +## LICENSE + +Licence: Code is MIT, Media is CC0 + +(c) Tenplus1 diff --git a/mods/bonemeal/api.txt b/mods/bonemeal/api.txt index 47b631d6..e1966a22 100644 --- a/mods/bonemeal/api.txt +++ b/mods/bonemeal/api.txt @@ -15,7 +15,7 @@ Adding Crops ------------ bonemeal:add_crop({ - { nodename_start, growing_steps, seed_name } + { nodename_start, growing_steps, seed_name, ignore_light } }) This command is used to add new crops for bonemeal to work on. @@ -25,6 +25,7 @@ e.g. bonemeal:add_crop({ {"farming:cotton_", 8, "farming:seed_cotton"}, {"farming:wheat_", 8, "farming:seed_wheat"}, + {"mymod:dark_wheat_", 8, "mymod:dark_wheat_seed", true}, -- can grow in darkness }) @@ -32,7 +33,7 @@ Adding Saplings --------------- bonemeal:add_sapling({ - { sapling_node, function, soil_type[sand, dirt, nodename] } + { sapling_node, function, soil_type["sand", "dirt", nodename, "group:"], ignore_light } }) This command will add new saplings for bonemeal to grow on sand, soil or a @@ -41,6 +42,7 @@ specified node type. bonemeal:add_sapling({ {"ethereal:palm_sapling", ethereal.grow_palm_tree, "soil"}, {"ethereal:palm_sapling", ethereal.grow_palm_tree, "sand"}, + {"mymod:dark_tree", mymod.dark_tree, "group:soil", true}, -- can grow in darkness }) diff --git a/mods/bonemeal/depends.txt b/mods/bonemeal/depends.txt deleted file mode 100644 index 2ef3ad66..00000000 --- a/mods/bonemeal/depends.txt +++ /dev/null @@ -1,11 +0,0 @@ -default -intllib? -farming? -ethereal? -moretrees? -technic_worldgen? -lucky_block? -flowers? -dye? -ferns? -dryplants? diff --git a/mods/bonemeal/description.txt b/mods/bonemeal/description.txt deleted file mode 100644 index f85f0a20..00000000 --- a/mods/bonemeal/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds bone and bonemeal giving the ability to quickly grow plants and saplings. \ No newline at end of file diff --git a/mods/bonemeal/init.lua b/mods/bonemeal/init.lua index 6066d754..667c290e 100644 --- a/mods/bonemeal/init.lua +++ b/mods/bonemeal/init.lua @@ -1,14 +1,31 @@ -bonemeal = {} +bonemeal = { + item_list = { + bucket_water = "bucket:bucket_water", + bucket_empty = "bucket:bucket_empty", + dirt = "default:dirt", + torch = "default:torch", + coral = "default:coral_skeleton" + } +} + +local a = bonemeal.item_list + +if minetest.get_modpath("mcl_core") then + + a.bucket_water = "mcl_buckets:bucket_water" + a.bucket_empty = "mcl_buckets:bucker_empty" + a.dirt = "mcl_core:dirt" + a.torch = "mcl_torches:torch" + a.coral = "mcl_ocean:dead_horn_coral_block" +end + local path = minetest.get_modpath("bonemeal") local min, max, random = math.min, math.max, math.random - --- Load support for intllib. -local S = minetest.get_translator and minetest.get_translator("bonemeal") or - dofile(path .. "/intllib.lua") - +-- translation support +local S = minetest.get_translator("bonemeal") -- creative check local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -16,99 +33,14 @@ function bonemeal.is_creative(name) return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) end - --- default crops -local crops = { - {"farming:cotton_", 8, "farming:seed_cotton"}, - {"farming:wheat_", 8, "farming:seed_wheat"} -} - - --- special pine check for nearby snow -local function pine_grow(pos) - - if minetest.find_node_near(pos, 1, - {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then - - default.grow_new_snowy_pine_tree(pos) - else - default.grow_new_pine_tree(pos) - end -end - - --- special function for cactus growth -local function cactus_grow(pos) - default.grow_cactus(pos, minetest.get_node(pos)) -end - --- special function for papyrus growth -local function papyrus_grow(pos) - default.grow_papyrus(pos, minetest.get_node(pos)) -end - - --- default saplings -local saplings = { - {"default:sapling", default.grow_new_apple_tree, "soil"}, - {"default:junglesapling", default.grow_new_jungle_tree, "soil"}, - {"default:emergent_jungle_sapling", default.grow_new_emergent_jungle_tree, "soil"}, - {"default:acacia_sapling", default.grow_new_acacia_tree, "soil"}, - {"default:aspen_sapling", default.grow_new_aspen_tree, "soil"}, - {"default:pine_sapling", pine_grow, "soil"}, - {"default:bush_sapling", default.grow_bush, "soil"}, - {"default:acacia_bush_sapling", default.grow_acacia_bush, "soil"}, - {"default:large_cactus_seedling", default.grow_large_cactus, "sand"}, - {"default:blueberry_bush_sapling", default.grow_blueberry_bush, "soil"}, - {"default:pine_bush_sapling", default.grow_pine_bush, "soil"}, - {"default:cactus", cactus_grow, "sand"}, - {"default:papyrus", papyrus_grow, "soil"}, -} - --- helper tables ( "" denotes a blank item ) -local green_grass = { - "default:grass_2", "default:grass_3", "default:grass_4", - "default:grass_5", "", "" -} - -local dry_grass = { - "default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", - "default:dry_grass_5", "", "" -} - --- loads mods then add all in-game flowers except waterlily -local flowers = {} - -minetest.after(0.1, function() - - for node, def in pairs(minetest.registered_nodes) do - - if def.groups - and def.groups.flower - and not node:find("waterlily") - and not node:find("xdecor:potted_") then - flowers[#flowers + 1] = node - end - end -end) - - --- default biomes deco -local deco = { - {"default:dry_dirt", dry_grass, {}}, - {"default:dry_dirt_with_dry_grass", dry_grass, {}}, - {"default:dirt_with_dry_grass", dry_grass, flowers}, - {"default:sand", {}, {"default:dry_shrub", "", "", ""} }, - {"default:desert_sand", {}, {"default:dry_shrub", "", "", ""} }, - {"default:silver_sand", {}, {"default:dry_shrub", "", "", ""} }, -} - +local crops = {} +local saplings = {} +local deco = {} -- -- local functions -- - -- particles local function particle_effect(pos) @@ -125,7 +57,8 @@ local function particle_effect(pos) maxexptime = 1, minsize = 1, maxsize = 3, - texture = "bonemeal_particle.png" + texture = "bonemeal_particle.png", + glow = 5 }) end @@ -134,15 +67,18 @@ end local function grow_tree(pos, object) if type(object) == "table" and object.axiom then + -- grow L-system tree minetest.remove_node(pos) minetest.spawn_tree(pos, object) elseif type(object) == "string" and minetest.registered_nodes[object] then + -- place node minetest.set_node(pos, {name = object}) elseif type(object) == "function" then + -- function object(pos) end @@ -150,7 +86,7 @@ end -- sapling check -local function check_sapling(pos, nodename) +local function check_sapling(pos, sapling_node, strength, light_ok) -- what is sapling placed on? local under = minetest.get_node({ @@ -164,36 +100,38 @@ local function check_sapling(pos, nodename) -- check list for sapling and function for n = 1, #saplings do - if saplings[n][1] == nodename then + if saplings[n][1] == sapling_node then - grow_on = saplings[n][3] + grow_on = saplings[n][3] or "" - -- sapling grows on top of specific node - if grow_on - and grow_on ~= "soil" - and grow_on ~= "sand" - and grow_on == under.name then + -- backwards compatibility, add 'group:' to older grouping + if grow_on == "soil" or grow_on == "sand" then + grow_on = "group:" .. grow_on + end + + -- sapling grows on top of specific node group + if grow_on:find("group:") then + + local group = grow_on:split(":")[2] + + if minetest.get_item_group(under.name, group) > 0 then + can_grow = true + end + + -- sapling grows on specific node + elseif grow_on == under.name then can_grow = true end - -- sapling grows on top of soil (default) - if can_grow == nil - and (grow_on == nil or grow_on == "soil") - and minetest.get_item_group(under.name, "soil") > 0 then - can_grow = true - end + -- check if we can grow sapling at current light level + if can_grow and (light_ok or saplings[n][4] == true) then - -- sapling grows on top of sand - if can_grow == nil - and grow_on == "sand" - and minetest.get_item_group(under.name, "sand") > 0 then - can_grow = true - end - - -- check if we can grow sapling - if can_grow then particle_effect(pos) - grow_tree(pos, saplings[n][2]) + + if math.random(5 - strength) == 1 then + grow_tree(pos, saplings[n][2]) + end + return true end end @@ -202,33 +140,50 @@ end -- crops check -local function check_crops(pos, nodename, strength) +local function check_crops(pos, nodename, strength, light_ok) local mod, crop, stage, nod, def -- grow registered crops for n = 1, #crops do - if nodename:find(crops[n][1]) - or nodename == crops[n][3] then + -- check if crop can grow in current light level + if (light_ok or crops[n][4] == true) + and (nodename:find(crops[n][1]) + or nodename == crops[n][3]) then -- separate mod and node name mod = nodename:split(":")[1] .. ":" crop = nodename:split(":")[2] -- get stage number or set to 0 for seed - stage = tonumber( crop:split("_")[2] ) or 0 + if crop:split("_")[3] then + stage = crop:split("_")[3] + else + stage = crop:split("_")[2] + end + + stage = tonumber(stage) or 0 + stage = min(stage + strength, crops[n][2]) -- check for place_param setting nod = crops[n][1] .. stage def = minetest.registered_nodes[nod] + + -- make sure crop exists or isn't fully grown already + if not def or nod == nodename then + return false + end + def = def and def.place_param2 or 0 minetest.set_node(pos, {name = nod, param2 = def}) particle_effect(pos) + minetest.get_node_timer(pos):start(10) -- restart any timers + return true end end @@ -241,33 +196,21 @@ local function check_soil(pos, nodename, strength) -- set radius according to strength local side = strength - 1 local tall = max(strength - 2, 0) - local floor - local groups = minetest.registered_items[nodename] - and minetest.registered_items[nodename].groups or {} - - -- only place decoration on one type of surface - if groups.soil then - floor = {"group:soil"} - elseif groups.sand then - floor = {"group:sand"} - else - floor = {nodename} - end -- get area of land with free space above local dirt = minetest.find_nodes_in_area_under_air( {x = pos.x - side, y = pos.y - tall, z = pos.z - side}, - {x = pos.x + side, y = pos.y + tall, z = pos.z + side}, floor) + {x = pos.x + side, y = pos.y + tall, z = pos.z + side}, {nodename}) -- set default grass and decoration - local grass = green_grass - local decor = flowers + local grass, decor -- choose grass and decoration to use on dirt patch for n = 1, #deco do -- do we have a grass match? if nodename == deco[n][1] then + grass = deco[n][2] or {} decor = deco[n][3] or {} end @@ -279,15 +222,20 @@ local function check_soil(pos, nodename, strength) for _, n in pairs(dirt) do if random(5) == 5 then + if decor and #decor > 0 then + -- place random decoration (rare) local dnum = #decor or 1 + nod = decor[random(dnum)] or "" end else if grass and #grass > 0 then + -- place random grass (common) local dgra = #grass or 1 + nod = #grass > 0 and grass[random(dgra)] or "" end end @@ -304,7 +252,9 @@ local function check_soil(pos, nodename, strength) -- if param2 not preset then get from existing node if not def then + local node = minetest.get_node_or_nil(pos2) + def = node and node.param2 or 0 end @@ -316,11 +266,44 @@ local function check_soil(pos, nodename, strength) end +-- helper function +local function use_checks(user, pointed_thing) + + -- make sure we use on node + if pointed_thing.type ~= "node" then + return false + end + + -- get position and node info + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + local dirt = def and def.groups + + -- does node have groups set + if not dirt then + return false + end + + -- if we're using on ground, move position up + if dirt.soil or dirt.sand or dirt.can_bonemeal then + pos = pointed_thing.above + end + + -- check if protected + if minetest.is_protected(pos, user:get_player_name()) then + return false + end + + return node +end + + -- global functions -- add to sapling list --- {sapling node, schematic or function name, "soil"|"sand"|specific_node} +-- {sapling node, schematic or function name, "soil"|"sand"|specific_node|"group:"} --e.g. {"default:sapling", default.grow_new_apple_tree, "soil"} function bonemeal:add_sapling(list) @@ -416,9 +399,12 @@ function bonemeal:set_deco(list) -- replace existing entry if list[l][1] == deco[n][1] then + deco[n][2] = list[l][2] deco[n][3] = list[l][3] + list[l] = false + break end end @@ -450,13 +436,25 @@ function bonemeal:on_use(pos, strength, node) if node.name == "default:papyrus" then default.grow_papyrus(pos, node) + particle_effect(pos) + return true elseif node.name == "default:cactus" then default.grow_cactus(pos, node) + particle_effect(pos) + + return true + + elseif node.name == "default:dry_dirt" and strength == 1 then + + minetest.set_node(pos, {name = "default:dry_dirt_with_dry_grass"}) + + particle_effect(pos) + return true end @@ -464,24 +462,26 @@ function bonemeal:on_use(pos, strength, node) if minetest.get_item_group(node.name, "soil") > 0 or minetest.get_item_group(node.name, "sand") > 0 or minetest.get_item_group(node.name, "can_bonemeal") > 0 then + check_soil(pos, node.name, strength) + return true end -- light check depending on strength (strength of 4 = no light needed) + local light_ok = true + if (minetest.get_node_light(pos) or 0) < (12 - (strength * 3)) then - return + light_ok = nil end - -- check for tree growth if pointing at sapling - if minetest.get_item_group(node.name, "sapling") > 0 - and random(5 - strength) == 1 then - check_sapling(pos, node.name) + -- check for sapling growth + if check_sapling(pos, node.name, strength, light_ok) then return true end -- check for crop growth - if check_crops(pos, node.name, strength) then + if check_crops(pos, node.name, strength, light_ok) then return true end end @@ -499,21 +499,16 @@ minetest.register_craftitem("bonemeal:mulch", { on_use = function(itemstack, user, pointed_thing) - -- did we point at a node? - if pointed_thing.type ~= "node" then - return - end + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) - -- is area protected? - if minetest.is_protected(pointed_thing.under, user:get_player_name()) then - return - end + if node then - -- call global on_use function with strength of 1 - if bonemeal:on_use(pointed_thing.under, 1) then + -- call global on_use function with strength of 1 + local used = bonemeal:on_use(pointed_thing.under, 1, node) -- take item if not in creative - if not bonemeal.is_creative(user:get_player_name()) then + if used and not bonemeal.is_creative(user:get_player_name()) then itemstack:take_item() end end @@ -530,21 +525,16 @@ minetest.register_craftitem("bonemeal:bonemeal", { on_use = function(itemstack, user, pointed_thing) - -- did we point at a node? - if pointed_thing.type ~= "node" then - return - end + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) - -- is area protected? - if minetest.is_protected(pointed_thing.under, user:get_player_name()) then - return - end + if node then - -- call global on_use function with strength of 2 - if bonemeal:on_use(pointed_thing.under, 2) then + -- call global on_use function with strength of 2 + local used = bonemeal:on_use(pointed_thing.under, 2, node) -- take item if not in creative - if not bonemeal.is_creative(user:get_player_name()) then + if used and not bonemeal.is_creative(user:get_player_name()) then itemstack:take_item() end end @@ -561,21 +551,16 @@ minetest.register_craftitem("bonemeal:fertiliser", { on_use = function(itemstack, user, pointed_thing) - -- did we point at a node? - if pointed_thing.type ~= "node" then - return - end + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) - -- is area protected? - if minetest.is_protected(pointed_thing.under, user:get_player_name()) then - return - end + if node then - -- call global on_use function with strength of 3 - if bonemeal:on_use(pointed_thing.under, 3) then + -- call global on_use function with strength of 3 + local used = bonemeal:on_use(pointed_thing.under, 3, node) -- take item if not in creative - if not bonemeal.is_creative(user:get_player_name()) then + if used and not bonemeal.is_creative(user:get_player_name()) then itemstack:take_item() end end @@ -604,44 +589,44 @@ minetest.register_craftitem("bonemeal:gelatin_powder", { -- crafting recipes -- - -- gelatin powder minetest.register_craft({ output = "bonemeal:gelatin_powder 4", recipe = { {"group:bone", "group:bone", "group:bone"}, - {"bucket:bucket_water", "bucket:bucket_water", "bucket:bucket_water"}, - {"bucket:bucket_water", "default:torch", "bucket:bucket_water"}, + {a.bucket_water, a.bucket_water, a.bucket_water}, + {a.bucket_water, a.torch, a.bucket_water} }, replacements = { - {"bucket:bucket_water", "bucket:bucket_empty 5"}, + {a.bucket_water, a.bucket_empty .. " 5"} } }) -- bonemeal (from bone) minetest.register_craft({ --- type = "shapeless", + type = "cooking", output = "bonemeal:bonemeal 2", - recipe = {{"group:bone"}} + recipe = "group:bone", + cooktime = 4 }) -- bonemeal (from player bones) -minetest.register_craft({ --- type = "shapeless", - output = "bonemeal:bonemeal 4", - recipe = {{"bones:bones"}} -}) +if minetest.settings:get_bool("bonemeal.disable_deathbones_recipe") ~= true then + + minetest.register_craft({ + output = "bonemeal:bone 2", + recipe = {{"bones:bones"}} + }) +end -- bonemeal (from coral skeleton) minetest.register_craft({ --- type = "shapeless", output = "bonemeal:bonemeal 2", - recipe = {{"default:coral_skeleton"}} + recipe = {{a.coral}} }) -- mulch minetest.register_craft({ --- type = "shapeless", output = "bonemeal:mulch 4", recipe = { {"group:tree", "group:leaves", "group:leaves"}, @@ -651,7 +636,6 @@ minetest.register_craft({ }) minetest.register_craft({ --- type = "shapeless", output = "bonemeal:mulch", recipe = { {"group:seed", "group:seed", "group:seed"}, @@ -662,31 +646,36 @@ minetest.register_craft({ -- fertiliser minetest.register_craft({ --- type = "shapeless", output = "bonemeal:fertiliser 2", recipe = {{"bonemeal:bonemeal", "bonemeal:mulch"}} }) - -- add bones to dirt -minetest.override_item("default:dirt", { - drop = { - max_items = 1, - items = { - { - items = {"bonemeal:bone"}, - rarity = 40 - }, - { - items = {"default:dirt"} +if minetest.registered_items[a.dirt] then + + minetest.override_item(a.dirt, { + drop = { + max_items = 1, + items = { + { + items = {"bonemeal:bone"}, + rarity = 40 + }, + { + items = {a.dirt} + } } } - } -}) + }) +end - --- add support for other mods +-- add support for mods dofile(path .. "/mods.lua") -dofile(path .. "/lucky_block.lua") -print ("[MOD] bonemeal loaded") +-- lucky block support +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end + + +print ("[MOD] Bonemeal loaded") diff --git a/mods/bonemeal/intllib.lua b/mods/bonemeal/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/bonemeal/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/bonemeal/license.txt b/mods/bonemeal/license.txt index fec6f6aa..de42aeb6 100644 --- a/mods/bonemeal/license.txt +++ b/mods/bonemeal/license.txt @@ -19,3 +19,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Textures by TenPlus1 (CC0) diff --git a/mods/bonemeal/locale/bonemeal.de.tr b/mods/bonemeal/locale/bonemeal.de.tr index 2045f67f..d31d3e34 100644 --- a/mods/bonemeal/locale/bonemeal.de.tr +++ b/mods/bonemeal/locale/bonemeal.de.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -[MOD] bonemeal loaded=[MOD] bonemeal geladen Bone=Knochen Bone Meal=Knochenmehl Fertiliser=Dünger diff --git a/mods/bonemeal/locale/bonemeal.en.tr b/mods/bonemeal/locale/bonemeal.en.tr index bdbed19b..c3e9590b 100644 --- a/mods/bonemeal/locale/bonemeal.en.tr +++ b/mods/bonemeal/locale/bonemeal.en.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -#[MOD] bonemeal loaded= #Bone= #Bone Meal= #Fertiliser= diff --git a/mods/bonemeal/locale/bonemeal.es.tr b/mods/bonemeal/locale/bonemeal.es.tr index 964d56ec..3021ae20 100644 --- a/mods/bonemeal/locale/bonemeal.es.tr +++ b/mods/bonemeal/locale/bonemeal.es.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -[MOD] bonemeal loaded=[MOD] bonemeal cargado Bone=Hueso Bone Meal=Comida de hueso Fertiliser=Fertilizante diff --git a/mods/bonemeal/locale/bonemeal.fr.tr b/mods/bonemeal/locale/bonemeal.fr.tr index aba2e617..11bf4091 100644 --- a/mods/bonemeal/locale/bonemeal.fr.tr +++ b/mods/bonemeal/locale/bonemeal.fr.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -[MOD] bonemeal loaded=[MOD] bonemeal chargé Bone=Os Bone Meal=Poudre d'os Fertiliser=Engrais diff --git a/mods/bonemeal/locale/bonemeal.it.tr b/mods/bonemeal/locale/bonemeal.it.tr index 26e0d7d7..7aa373a0 100644 --- a/mods/bonemeal/locale/bonemeal.it.tr +++ b/mods/bonemeal/locale/bonemeal.it.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -[MOD] bonemeal loaded=[MOD] bonemeal caricata Bone=Ossa Bone Meal=Pasto osseo Fertiliser=Fertilizzante diff --git a/mods/bonemeal/locale/bonemeal.ru.tr b/mods/bonemeal/locale/bonemeal.ru.tr index 0f63b089..fc65dc14 100644 --- a/mods/bonemeal/locale/bonemeal.ru.tr +++ b/mods/bonemeal/locale/bonemeal.ru.tr @@ -1,5 +1,4 @@ # textdomain:bonemeal -[MOD] bonemeal loaded=[MOD] костная мука загружена Bone=Кость Bone Meal=Костная Мука Fertiliser=Удобрение diff --git a/mods/bonemeal/locale/es.txt b/mods/bonemeal/locale/es.txt deleted file mode 100644 index 3770d5ee..00000000 --- a/mods/bonemeal/locale/es.txt +++ /dev/null @@ -1,7 +0,0 @@ -# init.lua - -Mulch = Mantillo -Bone Meal = Comida de hueso -Fertiliser = Fertilizante -Bone = Hueso -[MOD] bonemeal loaded = [MOD] bonemeal cargado diff --git a/mods/bonemeal/locale/fr.txt b/mods/bonemeal/locale/fr.txt deleted file mode 100644 index 24475c8f..00000000 --- a/mods/bonemeal/locale/fr.txt +++ /dev/null @@ -1,7 +0,0 @@ -# init.lua - -Mulch = Paillis -Bone Meal = Poudre d'os -Fertiliser = Engrais -Bone = Os -[MOD] bonemeal loaded = [MOD] bonemeal chargé diff --git a/mods/bonemeal/locale/it.txt b/mods/bonemeal/locale/it.txt deleted file mode 100644 index 4626dd82..00000000 --- a/mods/bonemeal/locale/it.txt +++ /dev/null @@ -1,7 +0,0 @@ -# init.lua - -Mulch = Pacciame -Bone Meal = Pasto osseo -Fertiliser = Fertilizzante -Bone = Ossa -[MOD] bonemeal loaded = [MOD] bonemeal caricata diff --git a/mods/bonemeal/locale/ru.txt b/mods/bonemeal/locale/ru.txt deleted file mode 100644 index 4faa2e04..00000000 --- a/mods/bonemeal/locale/ru.txt +++ /dev/null @@ -1,7 +0,0 @@ -# init.lua - -Mulch = Мульча -Bone Meal = Костная Мука -Fertiliser = Удобрение -Bone = Кость -[MOD] bonemeal loaded = [MOD] костная мука загружена diff --git a/mods/bonemeal/locale/template.txt b/mods/bonemeal/locale/template.txt deleted file mode 100644 index c5cb8724..00000000 --- a/mods/bonemeal/locale/template.txt +++ /dev/null @@ -1,7 +0,0 @@ -# init.lua - -Mulch = -Bone Meal = -Fertiliser = -Bone = -[MOD] bonemeal loaded = diff --git a/mods/bonemeal/lucky_block.lua b/mods/bonemeal/lucky_block.lua index 52f272f6..a493ee93 100644 --- a/mods/bonemeal/lucky_block.lua +++ b/mods/bonemeal/lucky_block.lua @@ -11,18 +11,15 @@ local function growy(pos, player) end -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"lig"}, - {"dro", {"bonemeal:mulch"}, 10}, - {"dro", {"bonemeal:bonemeal"}, 10}, - {"dro", {"bonemeal:fertiliser"}, 10}, - {"cus", growy}, - {"nod", "default:chest", 0, { - {name = "bonemeal:mulch", max = 20}, - {name = "bonemeal:bonemeal", max = 15}, - {name = "bonemeal:fertiliser", max = 10} - }} - }) -end +lucky_block:add_blocks({ + {"lig"}, + {"dro", {"bonemeal:mulch"}, 10}, + {"dro", {"bonemeal:bonemeal"}, 10}, + {"dro", {"bonemeal:fertiliser"}, 10}, + {"cus", growy}, + {"nod", "default:chest", 0, { + {name = "bonemeal:mulch", max = 20}, + {name = "bonemeal:bonemeal", max = 15}, + {name = "bonemeal:fertiliser", max = 10} + }} +}) diff --git a/mods/bonemeal/mod.conf b/mods/bonemeal/mod.conf index 650af824..86f78e01 100644 --- a/mods/bonemeal/mod.conf +++ b/mods/bonemeal/mod.conf @@ -1,4 +1,4 @@ name = bonemeal -depends = default -optional_depends = intllib, lucky_block, farming, ethereal, moretrees, technic_worldgen, flowers, dye, ferns, dryplants description = Adds bone and bonemeal giving the ability to quickly grow plants and saplings. +optional_depends = default, mcl_core, lucky_block, farming, ethereal, moretrees, technic_worldgen, flowers, dye, ferns, dryplants, df_trees, df_farming, df_primordial_items, everness +min_minetest_version = 5.0 diff --git a/mods/bonemeal/mods.lua b/mods/bonemeal/mods.lua index be9c0ad3..19d73db3 100644 --- a/mods/bonemeal/mods.lua +++ b/mods/bonemeal/mods.lua @@ -9,6 +9,99 @@ if minetest.get_modpath("animalmaterials") then end +if minetest.get_modpath("default") then + + -- saplings + + local function pine_grow(pos) + + if minetest.find_node_near(pos, 1, + {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then + + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + end + + local function cactus_grow(pos) + default.grow_cactus(pos, minetest.get_node(pos)) + end + + local function papyrus_grow(pos) + default.grow_papyrus(pos, minetest.get_node(pos)) + end + + bonemeal:add_sapling({ + {"default:sapling", default.grow_new_apple_tree, "soil"}, + {"default:junglesapling", default.grow_new_jungle_tree, "soil"}, + {"default:emergent_jungle_sapling", default.grow_new_emergent_jungle_tree, "soil"}, + {"default:acacia_sapling", default.grow_new_acacia_tree, "soil"}, + {"default:aspen_sapling", default.grow_new_aspen_tree, "soil"}, + {"default:pine_sapling", pine_grow, "soil"}, + {"default:bush_sapling", default.grow_bush, "soil"}, + {"default:acacia_bush_sapling", default.grow_acacia_bush, "soil"}, + {"default:large_cactus_seedling", default.grow_large_cactus, "sand"}, + {"default:blueberry_bush_sapling", default.grow_blueberry_bush, "soil"}, + {"default:pine_bush_sapling", default.grow_pine_bush, "soil"}, + {"default:cactus", cactus_grow, "sand"}, + {"default:papyrus", papyrus_grow, "soil"} + }) + + -- decoration + + local green_grass = { + "default:grass_2", "default:grass_3", "default:grass_4", + "default:grass_5", "", "" + } + + local dry_grass = { + "default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", + "default:dry_grass_5", "", "" + } + + local flowers = {} + + minetest.after(0.1, function() + + for node, def in pairs(minetest.registered_nodes) do + + if def.groups + and def.groups.flower + and not node:find("waterlily") + and not node:find("seaweed") + and not node:find("xdecor:potted_") + and not node:find("df_farming:") then + flowers[#flowers + 1] = node + end + end + end) + + bonemeal:add_deco({ + {"default:dirt", bonemeal.green_grass, flowers}, + {"default:dirt_with_grass", green_grass, flowers}, + {"default:dry_dirt", dry_grass, {}}, + {"default:dry_dirt_with_dry_grass", dry_grass, {}}, + {"default:dirt_with_dry_grass", dry_grass, flowers}, + {"default:sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:desert_sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:silver_sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:dirt_with_rainforest_litter", {}, {"default:junglegrass", "", "", ""} }, + {"default:dirt_with_coniferous_litter", {}, {"default:fern_1", "default:fern_2", + "default:fern_3", "", "", ""}} + }) +end + + +if farming then + + bonemeal:add_crop({ + {"farming:cotton_", 8, "farming:seed_cotton"}, + {"farming:wheat_", 8, "farming:seed_wheat"} + }) +end + + if farming and farming.mod and farming.mod == "redo" then bonemeal:add_crop({ @@ -25,9 +118,9 @@ if farming and farming.mod and farming.mod == "redo" then {"farming:cucumber_", 4}, {"farming:potato_", 4}, {"farming:grapes_", 8}, - {"farming:rhubarb_", 3}, - {"farming:barley_", 7}, - {"farming:hemp_", 8}, + {"farming:rhubarb_", 4}, + {"farming:barley_", 8, "farming:seed_barley"}, + {"farming:hemp_", 8, "farming:seed_hemp"}, {"farming:chili_", 8}, {"farming:garlic_", 5}, {"farming:onion_", 5}, @@ -35,10 +128,10 @@ if farming and farming.mod and farming.mod == "redo" then {"farming:pineapple_", 8}, {"farming:pea_", 5}, {"farming:beetroot_", 5}, - {"farming:rye_", 8}, - {"farming:oat_", 8}, - {"farming:rice_", 8}, - {"farming:mint_", 4}, + {"farming:rye_", 8, "farming:seed_rye"}, + {"farming:oat_", 8, "farming:seed_oat"}, + {"farming:rice_", 8, "farming:seed_rice"}, + {"farming:mint_", 4, "farming:seed_mint"}, {"farming:cabbage_", 6}, {"farming:lettuce_", 5}, {"farming:blackberry_", 4}, @@ -46,7 +139,12 @@ if farming and farming.mod and farming.mod == "redo" then {"farming:soy_", 7}, {"farming:artichoke_", 5}, {"farming:parsley_", 3}, - {"farming:sunflower_", 8} + {"farming:sunflower_", 8, "farming:seed_sunflower"}, + {"farming:asparagus_", 5}, + {"farming:eggplant_", 4}, + {"farming:spinach_", 4}, + {"farming:ginger_", 4}, + {"ethereal:strawberry_", 8} }) end @@ -66,6 +164,7 @@ if minetest.get_modpath("ethereal") then {"ethereal:banana_tree_sapling", ethereal.grow_banana_tree, "soil"}, {"ethereal:frost_tree_sapling", ethereal.grow_frost_tree, "soil"}, {"ethereal:mushroom_sapling", ethereal.grow_mushroom_tree, "soil"}, + {"ethereal:mushroom_brown_sapling", ethereal.grow_mushroom_brown_tree, "soil"}, {"ethereal:willow_sapling", ethereal.grow_willow_tree, "soil"}, {"ethereal:redwood_sapling", ethereal.grow_redwood_tree, "soil"}, {"ethereal:giant_redwood_sapling", ethereal.grow_giant_redwood_tree, "soil"}, @@ -74,7 +173,8 @@ if minetest.get_modpath("ethereal") then {"ethereal:birch_sapling", ethereal.grow_birch_tree, "soil"}, {"ethereal:sakura_sapling", ethereal.grow_sakura_tree, "soil"}, {"ethereal:lemon_tree_sapling", ethereal.grow_lemon_tree, "soil"}, - {"ethereal:olive_tree_sapling", ethereal.grow_olive_tree, "soil"} + {"ethereal:olive_tree_sapling", ethereal.grow_olive_tree, "soil"}, + {"ethereal:basandra_bush_sapling", ethereal.grow_basandra_bush, "soil"} }) local grass = {"default:grass_3", "default:grass_4", "default:grass_5", ""} @@ -87,7 +187,8 @@ if minetest.get_modpath("ethereal") then "flowers:tulip", "flowers:viola", "ethereal:strawberry_7"}}, {"ethereal:gray_dirt", {}, {"ethereal:snowygrass", "", ""}}, {"ethereal:cold_dirt", {}, {"ethereal:snowygrass", "", ""}}, - {"ethereal:mushroom_dirt", {}, {"flowers:mushroom_red", "flowers:mushroom_brown", "", "", ""}}, + {"ethereal:mushroom_dirt", {}, {"flowers:mushroom_red", "flowers:mushroom_brown", + "ethereal:spore_grass", "ethereal:spore_grass", "", "", ""}}, {"ethereal:jungle_dirt", grass, {"default:junglegrass", "", "", ""}}, {"ethereal:grove_dirt", grass, {"ethereal:fern", "", "", ""}}, {"ethereal:bamboo_dirt", grass, {}} @@ -122,6 +223,7 @@ if minetest.get_modpath("moretrees") then {"moretrees:spruce_sapling", moretrees.grow_spruce, "soil"}, {"moretrees:cedar_sapling", moretrees.spawn_cedar_object, "soil"}, {"moretrees:poplar_sapling", moretrees.spawn_poplar_object, "soil"}, + {"moretrees:poplar_small_sapling", moretrees.spawn_poplar_small_object, "soil"}, {"moretrees:willow_sapling", moretrees.spawn_willow_object, "soil"}, {"moretrees:rubber_tree_sapling", moretrees.spawn_rubber_tree_object, "soil"}, {"moretrees:fir_sapling", fir_grow, "soil"} @@ -177,8 +279,7 @@ end if minetest.get_modpath("dye") then - local bonemeal_dyes = { - bonemeal = "white", fertiliser = "green", mulch = "brown"} + local bonemeal_dyes = {bonemeal = "white", fertiliser = "green", mulch = "brown"} for mat, dye in pairs(bonemeal_dyes) do @@ -190,3 +291,166 @@ if minetest.get_modpath("dye") then }) end end + + +if minetest.get_modpath("df_trees") then + + local function spore_tree_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_spore_tree(pos) + end + + local function fungiwood_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_fungiwood(pos) + end + + local function tunnel_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_tunnel_tube(pos) + end + + local function black_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_black_cap(pos) + end + + local function goblin_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_goblin_cap(pos) + end + + local function tower_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_tower_cap(pos) + end + + local function nether_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_nether_cap(pos) + end + + bonemeal:add_sapling({ + {"df_trees:black_cap_sapling", black_cap_fix, "soil", true}, + {"df_trees:fungiwood_sapling", fungiwood_fix, "soil", true}, + {"df_trees:goblin_cap_sapling", goblin_cap_fix, "soil", true}, + {"df_trees:spore_tree_sapling", spore_tree_fix, "soil", true}, + {"df_trees:tower_cap_sapling", tower_cap_fix, "soil", true}, + {"df_trees:tunnel_tube_sapling", tunnel_fix, "soil", true}, + {"df_trees:nether_cap_sapling", nether_cap_fix, "group:nether_cap", true}, + {"df_trees:nether_cap_sapling", nether_cap_fix, "group:cools_lava", true} + }) +end + + +if minetest.get_modpath("df_farming") then + + bonemeal:add_crop({ + {"df_farming:cave_wheat_", 8, "df_farming:cave_wheat_seed", true}, + {"df_farming:dimple_cup_", 4, "df_farming:dimple_cup_seed", true}, + {"df_farming:pig_tail_", 8, "df_farming:pig_tail_seed", true}, + {"df_farming:plump_helmet_", 4, "df_farming:plump_helmet_spawn", true}, + {"df_farming:quarry_bush_", 5, "df_farming:quarry_bush_seed", true}, + {"df_farming:sweet_pod_", 6, "df_farming:sweet_pod_seed", true} + }) +end + + +if minetest.get_modpath("df_primordial_items") then + + local function mush_fix(pos) + minetest.set_node(pos, {name = "air"}) + mapgen_helper.place_schematic(pos, + df_primordial_items.get_primordial_mushroom(), (math.random(4) - 1) * 90) + end + + local function fern_fix(pos) + minetest.set_node(pos, {name = "air"}) + local rotations = {0, 90, 180, 270} + mapgen_helper.place_schematic(pos, + df_primordial_items.get_fern_schematic(), rotations[math.random(#rotations)]) + end + + local function blood_fix(pos) + df_trees.grow_blood_thorn(pos, minetest.get_node(pos)) + end + + bonemeal:add_sapling({ + {"df_primordial_items:jungle_mushroom_sapling", + df_primordial_items.spawn_jungle_mushroom, "soil", true}, + {"df_primordial_items:jungletree_sapling", + df_primordial_items.spawn_jungle_tree, "soil", true}, + {"df_primordial_items:mush_sapling", mush_fix, "soil", true}, + {"df_primordial_items:fern_sapling", fern_fix, "soil", true}, + {"df_trees:blood_thorn", blood_fix, "sand", true} + }) + + local jgrass = { + "df_primordial_items:jungle_grass_1", + "df_primordial_items:jungle_grass_2", + "df_primordial_items:jungle_grass_3", + "df_primordial_items:fern_1", + "df_primordial_items:fern_2", + "", "", "", "" + } + + local jdeco = { + "df_primordial_items:jungle_mushroom_1", + "df_primordial_items:jungle_mushroom_2", + "df_primordial_items:glow_plant_1", + "df_primordial_items:glow_plant_2", + "df_primordial_items:glow_plant_3", + "", "", "" + } + + bonemeal:add_deco({ + {"df_primordial_items:dirt_with_jungle_grass", jgrass, jdeco} + }) + + local fgrass = { + "df_primordial_items:fungal_grass_1", + "df_primordial_items:fungal_grass_2", + "", "", "", "" + } + + local fdeco = { + "df_primordial_items:glow_orb_stalks", + "df_primordial_items:glow_pods", + "", "", "" + } + + bonemeal:add_deco({ + {"df_primordial_items:dirt_with_mycelium", fgrass, fdeco} + }) +end + + +if minetest.get_modpath("everness") then + + bonemeal:add_sapling({ + {"everness:baobab_sapling", Everness.grow_baobab_tree, "soil"}, + {"everness:coral_tree_bioluminescent_sapling", + Everness.coral_tree_bioluminescent, "soil"}, + {"everness:coral_tree_sapling", Everness.grow_coral_tree, "soil"}, + {"everness:crystal_bush_sapling", Everness.grow_crystal_bush, "soil"}, + {"everness:crystal_tree_large_sapling", Everness.grow_crystal_large_tree, "soil"}, + {"everness:crystal_tree_sapling", Everness.grow_crystal_tree, "soil"}, + {"everness:cursed_bush_sapling", Everness.grow_cursed_bush, "soil"}, + {"everness:cursed_dream_tree_sapling", Everness.grow_cursed_dream_tree, "soil"}, + {"everness:dry_tree_sapling", Everness.grow_dry_tree, "soil"}, + {"everness:sequoia_tree_sapling", Everness.grow_sequoia_tree, "soil"}, + {"everness:willow_tree_sapling", Everness.grow_willow_tree, "soil"} + }) +end + + +if minetest.get_modpath("bushes_classic") then + + local function grow_bush(pos) + + local meta = minetest.get_meta(pos) + local bush_name = meta:get_string("bush_type") + + -- only change if meta found + if meta and bush_name then + minetest.swap_node(pos, {name = "bushes:" .. bush_name .. "_bush"}) + end + end + + bonemeal:add_sapling({ + {"bushes:fruitless_bush", grow_bush, "soil"}, + }) +end diff --git a/mods/bonemeal/screenshot.jpg b/mods/bonemeal/screenshot.jpg new file mode 100644 index 00000000..6c44743e Binary files /dev/null and b/mods/bonemeal/screenshot.jpg differ diff --git a/mods/bonemeal/screenshot.png b/mods/bonemeal/screenshot.png deleted file mode 100644 index a14caeae..00000000 Binary files a/mods/bonemeal/screenshot.png and /dev/null differ diff --git a/mods/bonemeal/settingtypes.txt b/mods/bonemeal/settingtypes.txt new file mode 100644 index 00000000..816776f2 --- /dev/null +++ b/mods/bonemeal/settingtypes.txt @@ -0,0 +1,2 @@ +# Disable recipe for bones:bones to craft into bonemeal +bonemeal.disable_deathbones_recipe (Disable recipe for death bones into bonemeal) bool false diff --git a/mods/bows/arrow.lua b/mods/bows/arrow.lua index 89e0d0b3..ce27eede 100644 --- a/mods/bows/arrow.lua +++ b/mods/bows/arrow.lua @@ -1,66 +1,26 @@ --- Localise functions -local floor, min, max = math.floor, math.min, math.max +local math_random = math.random ---Should we use new collisionbox detection -local colbox = false -local radius = colbox and 3.0 or 1.0 +-- helper to remove or maybe drop arrow item - ---= Functions inspired from Kaeza's Firearms mod - -local function minmax(x, y) - return min(x, y), max(x, y) -end - - -local function pos_in_box(p, b1, b2) - - local xmin, xmax = minmax(b1.x, b2.x) - local ymin, ymax = minmax(b1.y, b2.y) - local zmin, zmax = minmax(b1.z, b2.z) - - return p.x >= xmin and p.x <= xmax - and p.y >= ymin and p.y <= ymax - and p.z >= zmin and p.z <= zmax -end - - -local function get_obj_box(obj) - - local box - - if obj:is_player() then - box = {-.5, -.5, -.5, .5, 1.5, .5} - else - box = obj:get_luaentity().collisionbox - or {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} - end - - local p = obj:get_pos() - local x1, y1, z1, x2, y2, z2 = unpack(box) - - return {x = x1 + p.x, y = y1 + p.y, z = z1 + p.z}, - {x = x2 + p.x, y = y2 + p.y, z = z2 + p.z} -end - ---= END (Thanks Kaeza :) - - -local on_hit_remove = function(self) +local function on_hit_remove(self) minetest.sound_play( - bows.registed_arrows[self.name].on_hit_sound, { + bows.registered_arrows[self.name].on_hit_sound, { pos = self.object:get_pos(), gain = 1.0, - max_hear_distance = 7 - }) + max_hear_distance = 12 + }, true) -- chance of dropping arrow - local chance = minetest.registered_items[self.name].drop_chance + local chance = minetest.registered_items[self.name].drop_chance or 10 + local pos = self.object:get_pos() - if math.random(chance) == 1 then - minetest.add_item(self.object:get_pos(), self.name) + if pos and math_random(chance) == 1 then + + pos.y = pos.y + 0.5 + + minetest.add_item(pos, self.name) end self.object:remove() @@ -68,18 +28,19 @@ local on_hit_remove = function(self) return self end +-- when arrow hits an entity -local on_hit_object = function(self, target, hp, user, lastpos) +local function on_hit_object(self, target, hp, user, lastpos) - target:punch(user, 0.1, { - full_punch_interval = 0.1, + target:punch(user, 1.0, { + --full_punch_interval = 1.0, damage_groups = {fleshy = hp}, }, nil) - if bows.registed_arrows[self.name].on_hit_object then + if bows.registered_arrows[self.name].on_hit_object then - bows.registed_arrows[self.name].on_hit_object( - self, target, hp, user, lastpos) + bows.registered_arrows[self.name].on_hit_object( + self, target, hp, user, lastpos) end on_hit_remove(self) @@ -87,24 +48,26 @@ local on_hit_object = function(self, target, hp, user, lastpos) return self end +-- arrow entity minetest.register_entity("bows:arrow",{ - hp_max = 10, - visual = "wielditem", - visual_size = {x = .20, y = .20}, - collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, - physical = true, - textures = {"air"}, + initial_properties = { + hp_max = 10, + visual = "wielditem", + visual_size = {x = .20, y = .20}, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + physical = false, + textures = {"air"} + }, + _is_arrow = true, timer = 10, - oldvel = {x = 0, y = 0, z = 0}, on_activate = function(self, staticdata) if not self then - self.object:remove() - return + self.object:remove() ; return end if bows.tmp and bows.tmp.arrow ~= nil then @@ -112,7 +75,7 @@ minetest.register_entity("bows:arrow",{ self.arrow = bows.tmp.arrow self.user = bows.tmp.user self.name = bows.tmp.name - self.dmg = bows.registed_arrows[self.name].damage + self.dmg = bows.registered_arrows[self.name].damage bows.tmp = nil @@ -127,89 +90,68 @@ minetest.register_entity("bows:arrow",{ self.timer = self.timer - dtime if self.timer < 0 then - self.object:remove() - return + self.object:remove() ; return end - local what_is, what_obj, ent + local pos = self.object:get_pos() ; self.oldpos = self.oldpos or pos + local cast = minetest.raycast(self.oldpos, pos, true, true) + local thing = cast:next() + local ok = true - for i, ob in pairs(minetest.get_objects_inside_radius( - self.object:get_pos(), radius)) do + -- loop through things + while thing do - what_obj = nil - what_is = "" + -- ignore the object that is the arrow + if thing.type == "object" and thing.ref ~= self.object then - -- player - if ob - and bows.pvp - and ob:is_player() - and ob:get_player_name() ~= self.user:get_player_name() then - - what_obj = ob - what_is = "player" - end - - -- entity/mob - if ob and not what_obj then - - ent = ob:get_luaentity() - - if ent - and ent.physical - and not ent._is_arrow - and ent.name ~= "__builtin:item" then - what_obj = ob - what_is = "entity" + -- add entity name to thing table (if not player) + if not thing.ref:is_player() then + thing.name = thing.ref:get_luaentity() and thing.ref:get_luaentity().name end - end - if what_obj then + -- check if dropped item or yourself + if thing.name == "__builtin:item" + or (not thing.name + and thing.ref:get_player_name() == self.user:get_player_name()) then + ok = false + end - if colbox then + -- can we hit entity ? + if ok then - -- Object specific collision detection - local p1, p2 = get_obj_box(what_obj) +--print("-- hit entity", thing.name) - if pos_in_box(self.object:get_pos(), p1, p2) then + on_hit_object(self, thing.ref, self.dmg, self.user, pos) - on_hit_object(self, what_obj, self.dmg, self.user, - self.object:get_pos()) + return self + end - return self + -- are we inside a node ? + elseif thing.type == "node" then + + self.node = minetest.get_node(pos) + + local def = minetest.registered_nodes[self.node.name] + + if def and def.walkable then + +--print("-- hit node", self.node.name) + + if bows.registered_arrows[self.name].on_hit_node then + + bows.registered_arrows[self.name].on_hit_node( + self, pos, self.user, self.oldpos) end - else - on_hit_object(self, what_obj, self.dmg, self.user, - self.object:get_pos()) + + on_hit_remove(self) return self end end + + thing = cast:next() end - local vel = self.object:get_velocity() - - if vel.x == 0 or vel.y == 0 or vel.z == 0 then - - if bows.registed_arrows[self.name].on_hit_node then - - local pos = self.object:get_pos() - local lastpos = {x = pos.x, y = pos.y, z = pos.z} - - pos.x = pos.x + (self.oldvel.x / 100) - pos.y = pos.y + (self.oldvel.y / 100) - pos.z = pos.z + (self.oldvel.z / 100) - - self.node = minetest.get_node(pos) - - bows.registed_arrows[self.name].on_hit_node( - self, pos, self.user, lastpos) - end - - on_hit_remove(self) - - return self - end - - self.oldvel = vel - end, + self.oldpos = pos + end }) diff --git a/mods/bows/depends.txt b/mods/bows/depends.txt deleted file mode 100644 index 9db29ecb..00000000 --- a/mods/bows/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -mobs? -lucky_block? diff --git a/mods/bows/description.txt b/mods/bows/description.txt deleted file mode 100644 index 804d9907..00000000 --- a/mods/bows/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a selection of bows and arrows for players to use in-game. diff --git a/mods/bows/init.lua b/mods/bows/init.lua index faf0e1f8..333dd6e0 100644 --- a/mods/bows/init.lua +++ b/mods/bows/init.lua @@ -1,13 +1,13 @@ --- Bows Mod by UjEdwin +-- Bows Mod by UjEdwin (edited by TenPlus1) bows = { pvp = minetest.settings:get_bool("enable_pvp"), - feather = minetest.get_modpath("mobs") and "mobs:chicken_feather" or "default:leaves", - registed_arrows = {}, - registed_bows = {}, + registered_arrows = {}, + registered_bows = {} } +-- creative check local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -15,11 +15,11 @@ function bows.is_creative(name) return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) end +-- register arrow -bows.register_arrow = function(name, def) +function bows.register_arrow(name, def) - if name == nil - or name == "" then + if name == nil or name == "" then return false end @@ -30,7 +30,7 @@ bows.register_arrow = function(name, def) def.on_hit_node = def.on_hit_node def.on_hit_sound = def.on_hit_sound or "default_dig_dig_immediate" - bows.registed_arrows[def.name] = def + bows.registered_arrows[def.name] = def minetest.register_craftitem(":bows:" .. name, { description = def.description or name, @@ -48,11 +48,11 @@ bows.register_arrow = function(name, def) end end +-- register bow -bows.register_bow = function(name, def) +function bows.register_bow(name, def) - if name == nil - or name == "" then + if name == nil or name == "" then return false end @@ -60,20 +60,20 @@ bows.register_bow = function(name, def) def.name = "bows:" .. name def.uses = def.uses - 1 or 49 - bows.registed_bows[def.replace] = def + bows.registered_bows[def.replace] = def minetest.register_tool(":" .. def.name, { description = def.description or name, inventory_image = def.texture or "bows_bow.png", on_use = bows.load, - groups = {bow = 1}, + groups = {bow = 1} }) minetest.register_tool(":" .. def.replace, { description = def.description or name, inventory_image = def.texture_loaded or "bows_bow_loaded.png", on_use = bows.shoot, - groups = {bow = 1, not_in_creative_inventory = 1}, + groups = {bow = 1, not_in_creative_inventory = 1} }) if def.craft then @@ -81,8 +81,9 @@ bows.register_bow = function(name, def) end end +-- load bow -bows.load = function(itemstack, user, pointed_thing) +function bows.load(itemstack, user, pointed_thing) local inv = user:get_inventory() local index = user:get_wield_index() - 1 @@ -110,22 +111,23 @@ bows.load = function(itemstack, user, pointed_thing) return itemstack end +-- shoot bow -bows.shoot = function(itemstack, user, pointed_thing) +function bows.shoot(itemstack, user, pointed_thing) local item = itemstack:to_table() local meta = minetest.deserialize(item.metadata) if (not (meta and meta.arrow)) - or (not bows.registed_arrows[meta.arrow]) then + or (not bows.registered_arrows[meta.arrow]) then return itemstack end local name = itemstack:get_name() - local replace = bows.registed_bows[name].name - local ar = bows.registed_bows[name].uses - local wear = bows.registed_bows[name].uses - local level = 19 + bows.registed_bows[name].level + local replace = bows.registered_bows[name].name + local ar = bows.registered_bows[name].uses + local wear = bows.registered_bows[name].uses + local level = 19 + bows.registered_bows[name].level bows.tmp = {} bows.tmp.arrow = meta.arrow @@ -137,13 +139,21 @@ bows.shoot = function(itemstack, user, pointed_thing) item.name = replace itemstack:replace(item) - local pos = user:get_pos() + local prop = user:get_properties() + local pos = user:get_pos() ; pos.y = pos.y + (prop.eye_height or 1.23) local dir = user:get_look_dir() - local e = minetest.add_entity({ - x = pos.x, - y = pos.y + 1.5, - z = pos.z - }, "bows:arrow") + local is_attached = user:get_attach() + + -- if player riding a mob then increase arrow height so you dont hit mob + if is_attached then + + local prop = is_attached:get_properties() + local height = prop and (-prop.collisionbox[2] + prop.collisionbox[5]) or 1 + + pos.y = pos.y + height + end + + local e = minetest.add_entity({x = pos.x, y = pos.y, z = pos.z}, "bows:arrow") e:set_velocity({x = dir.x * level, y = dir.y * level, z = dir.z * level}) e:set_acceleration({x = dir.x * -3, y = -10, z = dir.z * -3}) @@ -153,17 +163,23 @@ bows.shoot = function(itemstack, user, pointed_thing) itemstack:add_wear(65535 / wear) end - minetest.sound_play("bows_shoot", {pos = pos}) + minetest.sound_play("bows_shoot", {pos = pos, max_hear_distance = 10}, true) return itemstack end +-- register items local path = minetest.get_modpath("bows") dofile(path .. "/arrow.lua") dofile(path .. "/items.lua") -dofile(path .. "/lucky_block.lua") + +-- add lucky blocks + +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end print ("[MOD] Bows loaded") diff --git a/mods/bows/items.lua b/mods/bows/items.lua index 89dcf4dc..befa7e0d 100644 --- a/mods/bows/items.lua +++ b/mods/bows/items.lua @@ -1,6 +1,29 @@ -minetest.register_craft({output = "default:flint",recipe = {{"default:gravel"},}}) -minetest.register_craft({output = "farming:cotton 4",recipe = {{"group:wool"},}}) +-- detect feather item to use + +local feather = "default:leaves" + +if minetest.get_modpath("animalia") then + feather = "animalia:feather" +elseif minetest.get_modpath("mobs_animal") then + feather = "mobs:chicken_feather" +elseif minetest.get_modpath("xanadu") then + feather = "mobs:chicken_feather" +end + +-- helpful recipes + +minetest.register_craft({ + output = "default:flint", + recipe = {{"default:gravel"}} +}) + +minetest.register_craft({ + output = "farming:cotton 4", + recipe = {{"group:wool"}} +}) + +-- wooden bow bows.register_bow("bow_wood",{ description = "Wooden bow", @@ -12,58 +35,67 @@ bows.register_bow("bow_wood",{ {"", "group:stick", "farming:string"}, {"group:stick", "", "farming:string"}, {"", "group:stick", "farming:string"} - }, + } }) minetest.register_craft({ type = "fuel", recipe = "bows:bow_wood", - burntime = 3, + burntime = 3 }) +-- steel bow + bows.register_bow("bow_steel",{ description = "Steel bow", texture = "bows_bow_steel.png", texture_loaded = "bows_bow_loaded_steel.png", - uses = 280, --140, - level = 5, --8, + uses = 280, + level = 5, craft = { {"", "default:steel_ingot", "farming:string"}, {"default:steel_ingot", "", "farming:string"}, {"", "default:steel_ingot", "farming:string"} - }, + } }) +-- bronze bow + bows.register_bow("bow_bronze",{ description = "Bronze bow", texture = "bows_bow_bronze.png", texture_loaded = "bows_bow_loaded_bronze.png", - uses = 140, --280, - level = 3, --10, + uses = 140, + level = 3, craft = { {"", "default:bronze_ingot", "farming:string"}, {"default:bronze_ingot", "", "farming:string"}, {"", "default:bronze_ingot", "farming:string"} - }, + } }) +-- special David BOWie (lucky block drop) + bows.register_bow("bow_bowie",{ description = "David BOWie", texture = "bows_bow_bowie.png", texture_loaded = "bows_bow_loaded_bowie.png", uses = 500, - level = 7, + level = 7 }) +-- wooden arrow + bows.register_arrow("arrow",{ description = "Arrow", texture = "bows_arrow_wood.png", - damage = 5, + damage = 2, craft_count = 4, drop_chance = 10, craft = { - {"default:flint", "group:stick", bows.feather} + {"default:flint", "group:stick", feather} }, + on_hit_sound = "bows_arrow_hit", --[[ on_hit_node = function(self, pos, user, arrow_pos) @@ -77,25 +109,28 @@ bows.register_arrow("arrow",{ vertical = false, texture = "heart.png", }) - end, -]] + end]] }) minetest.register_craft({ type = "fuel", recipe = "bows:arrow", - burntime = 1, + burntime = 1 }) +-- steel arrow + bows.register_arrow("arrow_steel",{ description = "Steel arrow", texture = "bows_arrow_wood.png^[colorize:#FFFFFFcc", - damage = 8, + damage = 6, craft_count = 4, - drop_chance = 8, + drop_chance = 9, craft = { - {"default:steel_ingot", "group:stick", bows.feather} + {"default:steel_ingot", "group:stick", feather} }, + on_hit_sound = "bows_arrow_hit", +--[[ on_hit_object = function(self, target, hp, user, lastpos) if target and target:get_luaentity() @@ -103,18 +138,23 @@ bows.register_arrow("arrow_steel",{ and target:get_luaentity().name == "mob_horse:horse" then print ("--- aww da horsey!!!") end - end, + end,]] + on_hit_node = function(self, pos, user, arrow_pos) + end }) +-- mese arrow (enables node mesecons when hit) + bows.register_arrow("arrow_mese",{ description = "Mese arrow", texture = "bows_arrow_wood.png^[colorize:#e3ff00cc", - damage = 12, + damage = 7, craft_count = 4, - drop_chance = 6, + drop_chance = 8, craft = { - {"default:mese_crystal", "group:stick", bows.feather} + {"default:mese_crystal", "group:stick", feather} }, + on_hit_sound = "bows_arrow_hit", on_hit_node = function(self, pos, user, arrow_pos) if self.node.name == "mesecons_switch:mesecon_switch_on" @@ -127,25 +167,28 @@ bows.register_arrow("arrow_mese",{ def.on_rightclick(vector.round(pos), self.node, user) end end - end, + end }) +-- diamond arrow (breaks glass node when hit) + bows.register_arrow("arrow_diamond",{ description = "Diamond arrow", texture = "bows_arrow_wood.png^[colorize:#15d7c2cc", - damage = 15, + damage = 8, craft_count = 4, - drop_chance = 4, + drop_chance = 7, craft = { - {"default:diamond", "group:stick", bows.feather} + {"default:diamond", "group:stick", feather} }, + on_hit_sound = "bows_arrow_hit", on_hit_node = function(self, pos, user, arrow_pos) if self.node.name == "default:glass" and not minetest.is_protected(pos, user:get_player_name()) then minetest.sound_play("default_break_glass", { - pos = pos, gain = 1.0, max_hear_distance = 10}) + pos = pos, gain = 1.0, max_hear_distance = 10}, true) minetest.remove_node(pos) minetest.add_item(pos, "vessels:glass_fragments") end - end, + end }) diff --git a/mods/bows/license.txt b/mods/bows/license.txt new file mode 100644 index 00000000..0f950067 --- /dev/null +++ b/mods/bows/license.txt @@ -0,0 +1,21 @@ + +Code by AiTechEye and edited by TenPlus1 (LGPL-2.1-only) + +Textures by AiTechEye (CC0) + bows_arrow_wood.png + bows_bow.png + bows_bow_bronze.png + bows_bow_loaded.png + bows_bow_loaded_bronze.png + bows_bow_loaded_steel.png + bows_bow_steel.png + +Textures by TenPlus1 (CC0) + bows_bow_bowie.png + bows_bow_loaded_bowie.png + +Sound by cmusounddesign (Attribution 3.0 license): + bows_shoot.ogg + +Sound by robinhoot76 https://freesound.org (Creative Common License): + bows_arrow_hit.ogg diff --git a/mods/bows/lucky_block.lua b/mods/bows/lucky_block.lua index 58d61ed0..71ffc755 100644 --- a/mods/bows/lucky_block.lua +++ b/mods/bows/lucky_block.lua @@ -1,23 +1,22 @@ -if minetest.get_modpath("lucky_block") then +-- add lucky blocks - lucky_block:add_blocks({ - {"dro", {"bows:bow_wood"}}, - {"dro", {"bows:bow_steel"}}, - {"dro", {"bows:bow_bronze"}}, - {"dro", {"bows:arrow"}, 5}, - {"dro", {"bows:arrow_steel"}, 5}, - {"dro", {"bows:arrow_mese"}, 5}, - {"dro", {"bows:arrow_diamond"}, 5}, - {"nod", "default:chest", 0, { - {name = "default:stick", max = 5}, - {name = "default:flint", max = 5}, - {name = "default:steel_ingot", max = 5}, - {name = "default:bronze_ingot", max = 5}, - {name = "default:mese_crystal_fragment", max = 5}, - {name = "farming:string", max = 5}, - {name = bows.feather, max = 5}, - {name = "bows:bow_bowie", max = 1, chance = 4} - }}, - }) -end +lucky_block:add_blocks({ + {"dro", {"bows:bow_wood"}}, + {"dro", {"bows:bow_steel"}}, + {"dro", {"bows:bow_bronze"}}, + {"dro", {"bows:arrow"}, 10}, + {"dro", {"bows:arrow_steel"}, 8}, + {"dro", {"bows:arrow_mese"}, 7}, + {"dro", {"bows:arrow_diamond"}, 6}, + {"nod", "default:chest", 0, { + {name = "default:stick", max = 5}, + {name = "default:flint", max = 5}, + {name = "default:steel_ingot", max = 5}, + {name = "default:bronze_ingot", max = 5}, + {name = "default:mese_crystal_fragment", max = 5}, + {name = "farming:string", max = 5}, + {name = bows.feather, max = 5}, + {name = "bows:bow_bowie", max = 1, chance = 4} + }}, +}) diff --git a/mods/bows/mod.conf b/mods/bows/mod.conf index a8ff987b..74a230d5 100644 --- a/mods/bows/mod.conf +++ b/mods/bows/mod.conf @@ -1,4 +1,5 @@ name = bows +description = Adds a selection of bows and arrows for players to use. depends = default -optional_depends = mobs, lucky_block -description = Adds a selection of bows and arrows for players to use in-game. +optional_depends = lucky_block +min_minetest_version = 5.0 diff --git a/mods/bows/readme.MD b/mods/bows/readme.MD index fe7a46ca..be00313a 100644 --- a/mods/bows/readme.MD +++ b/mods/bows/readme.MD @@ -7,6 +7,8 @@ This mod allows the player to craft bows and arrows to be used in game that can hurt players and mobs as well as affect nodes hit when using special functions included in the arrow definition. +Stack arrows you wish to use on the left side of the bow. + License: CC0 Lucky blocks: 8 diff --git a/mods/bows/sounds/bows_arrow_hit.ogg b/mods/bows/sounds/bows_arrow_hit.ogg new file mode 100644 index 00000000..8631c334 Binary files /dev/null and b/mods/bows/sounds/bows_arrow_hit.ogg differ diff --git a/mods/bows/sounds/bows_shoot.ogg b/mods/bows/sounds/bows_shoot.ogg index f4f2ff92..08d69f3c 100644 Binary files a/mods/bows/sounds/bows_shoot.ogg and b/mods/bows/sounds/bows_shoot.ogg differ diff --git a/mods/builtin_item/README.md b/mods/builtin_item/README.md index a1699c98..bda2b799 100644 --- a/mods/builtin_item/README.md +++ b/mods/builtin_item/README.md @@ -10,6 +10,7 @@ Features: - Particle effects added - Dropped items slide on nodes with {slippery} groups - Items stuck inside solid nodes move to nearest empty space +- Can use new on_pickup() function if available - Added 'dropped_step(self, pos, dtime, moveresult)' custom on_step for dropped items 'self.node_inside' contains node table that item is inside 'self.def_inside' contains node definition for above @@ -24,7 +25,7 @@ Features: return false to skip further checks by builtin_item -License: MIT +License: LGPLv2.1+ dropped_step() examples: diff --git a/mods/builtin_item/depends.txt b/mods/builtin_item/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/builtin_item/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/builtin_item/init.lua b/mods/builtin_item/init.lua index 0688c633..89dd394c 100644 --- a/mods/builtin_item/init.lua +++ b/mods/builtin_item/init.lua @@ -17,11 +17,12 @@ end local time_to_live = tonumber(core.settings:get("item_entity_ttl")) or 900 local gravity = tonumber(core.settings:get("movement_gravity")) or 9.81 local destroy_item = core.settings:get_bool("destroy_item") ~= false +local source_flow = core.settings:get_bool("builtin_item.source_flow") -- localize some math functions -local abs = math.abs -local sqrt = math.sqrt +local math_abs, math_sqrt = math.abs, math.sqrt +local math_random, math_min = math.random, math.min -- water flow functions by QwertyMine3, edited by TenPlus1 and Gustavo6046 @@ -37,7 +38,7 @@ local function to_unit_vector(dir_vector) invr_sum = inv_roots[sum] else -- not found, compute and save the inverse square root - invr_sum = 1.0 / sqrt(sum) + invr_sum = 1.0 / math_sqrt(sum) inv_roots[sum] = invr_sum end @@ -175,7 +176,7 @@ core.register_entity(":__builtin:item", { local itemname = stack:is_known() and stack:get_name() or "unknown" local max_count = stack:get_stack_max() - local count = math.min(stack:get_count(), max_count) + local count = math_min(stack:get_count(), max_count) local size = 0.2 + 0.1 * (count / max_count) ^ (1 / 3) local col_height = size * 0.75 local def = core.registered_nodes[itemname] @@ -197,7 +198,7 @@ core.register_entity(":__builtin:item", { end -- small random size bias to counter Z-fighting - local bias = math.random() * 1e-3 + local bias = math_random() * 1e-3 self.object:set_properties({ is_visible = true, @@ -267,10 +268,12 @@ core.register_entity(":__builtin:item", { -- Merge the remote stack into this one local pos = object:get_pos() + local self_pos = self.object:get_pos() + local x_diff = (self_pos.x - pos.x) / 2 + local z_diff = (self_pos.z - pos.z) / 2 + local new_pos = vector.offset(pos, x_diff, 0, z_diff) - pos.y = pos.y + ((total_count - count) / max_count) * 0.15 - - self.object:move_to(pos) + self.object:move_to(new_pos) self.age = 0 -- Reset age -- Merge velocities @@ -304,6 +307,8 @@ core.register_entity(":__builtin:item", { return end + self.timer = 0 + self.node_inside = minetest.get_node_or_nil(pos) self.def_inside = self.node_inside and core.registered_nodes[self.node_inside.name] @@ -335,14 +340,12 @@ core.register_entity(":__builtin:item", { }) self.def_under = self.node_under - and core.registered_nodes[self.node_under.name] + and core.registered_nodes[self.node_under.name] -- part of old ground check if self.def_under and self.def_under.walkable then self.falling_state = false end - - self.timer = 0 end, step_node_inside_checks = function(self) @@ -416,7 +419,8 @@ core.register_entity(":__builtin:item", { step_water_physics = function(self) self.waterflow_state = self.def_inside and - self.def_inside.liquidtype == "flowing" + (self.def_inside.liquidtype == "flowing" or (source_flow and + self.def_inside.liquidtype == "source")) if self.waterflow_state then @@ -473,28 +477,29 @@ core.register_entity(":__builtin:item", { self.is_moving = true end + local this_dry_friction = dry_friction + if self.slippery_state then -- apply slip factor (tiny friction that depends on the actual block type) - if abs(vel.x) > 0.2 or abs(vel.z) > 0.2 then + if math_abs(vel.x) > 0.2 or math_abs(vel.z) > 0.2 then local slippery = core.get_item_group(self.node_under.name, "slippery") local slip_factor = 4.0 / (slippery + 4) - self.accel.x = self.accel.x - vel.x * slip_factor - self.accel.z = self.accel.z - vel.z * slip_factor + this_dry_friction = slip_factor end - - else - self.accel.x = self.accel.x - vel.x * dry_friction - self.accel.z = self.accel.z - vel.z * dry_friction end + + self.accel.x = self.accel.x - vel.x * this_dry_friction + self.accel.z = self.accel.z - vel.z * this_dry_friction end, step_apply_forces = function(self) self.object:set_acceleration(self.accel) end, + -- let items die out after enough time step_check_timeout = function(self, dtime) self.age = self.age + dtime @@ -575,8 +580,7 @@ core.register_entity(":__builtin:item", { local vel = self.object:get_velocity() -- apply air drag - if self.falling_state - or (self.slippery_state and not self.waterflow_state) then + if self.falling_state or (self.slippery_state and not self.waterflow_state) then self.accel.x = self.accel.x - vel.x * air_drag self.accel.z = self.accel.z - vel.z * air_drag end @@ -616,23 +620,58 @@ core.register_entity(":__builtin:item", { self:step_try_collect() -- merge end, - on_punch = function(self, hitter) + on_punch = function(self, hitter, ...) - local inv = hitter:get_inventory() + if self.itemstring == "" then - if inv and self.itemstring ~= "" then + self.object:remove() - local left = inv:add_item("main", self.itemstring) - - if left and not left:is_empty() then - - self:set_item(left) - - return - end + return end - self.itemstring = "" - self.object:remove() + if core.item_pickup then + + -- Call on_pickup callback in item definition. + local itemstack = ItemStack(self.itemstring) + local callback = itemstack:get_definition().on_pickup + local ret = callback(itemstack, hitter, + {type = "object", ref = self.object}, ...) + + if not ret then + -- Don't modify (and don't reset rotation) + return + end + + itemstack = ItemStack(ret) + + -- Handle the leftover itemstack + if itemstack:is_empty() then + self.itemstring = "" + self.object:remove() + else + self:set_item(itemstack) + end + else + -- old method of pickup for backwards compatibility + local inv = hitter:get_inventory() + + if inv then + + local left = inv:add_item("main", self.itemstring) + + if left and not left:is_empty() then + + self:set_item(left) + + return + end + end + + self.itemstring = "" + self.object:remove() + end end }) + + +print("[MOD] Built-in Item loaded") diff --git a/mods/builtin_item/license.txt b/mods/builtin_item/license.txt new file mode 100644 index 00000000..357dcc66 --- /dev/null +++ b/mods/builtin_item/license.txt @@ -0,0 +1,5 @@ +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication for audio files (found in sounds folder) + +LGPLv2.1+ license for original code with changes by TenPlus1 + +CC BY-SA 3.0 license for textures diff --git a/mods/builtin_item/mod.conf b/mods/builtin_item/mod.conf index 38975fc7..4936a165 100644 --- a/mods/builtin_item/mod.conf +++ b/mods/builtin_item/mod.conf @@ -1,4 +1,4 @@ name = builtin_item +description = Dropped items can now be pushed by water, slide on ice and have their own custom functions. depends = default -optional_depends = -description = Dropped items can now be pushed by water and have their own custom functions. +min_minetest_version = 5.0 diff --git a/mods/builtin_item/settingtypes.txt b/mods/builtin_item/settingtypes.txt index c35098e7..fc926b6e 100644 --- a/mods/builtin_item/settingtypes.txt +++ b/mods/builtin_item/settingtypes.txt @@ -38,3 +38,7 @@ air_drag (Horizontal drag of air on falling items) float 0.4 # type. By default they can do this even on a slippery floor, like # ice, but this setting allows disabling that. builtin_item.items_collect_on_slippery (Collect items on slippery ground) bool true + +# Allow dropped items to be pushed when inside of source nodes, +# False by default but can be enabled. +builtin_item.source_flow (Allow water source to push items) bool false diff --git a/mods/carpets/api.lua b/mods/carpets/api.lua index 5f1baca3..55d8a17a 100644 --- a/mods/carpets/api.lua +++ b/mods/carpets/api.lua @@ -29,7 +29,7 @@ function carpets.register(material, def) end local material_def = minetest.registered_nodes[material] - node.description = node.description or material_def.description.." Carpet" + node.description = node.description or material_def.description.." carpet" node.sounds = table.copy(node.sounds or material_def.sounds or default.node_sound_defaults()) node.groups = table.copy(node.groups) diff --git a/mods/carpets/init.lua b/mods/carpets/init.lua index 45eb5d2f..b80cc4d3 100644 --- a/mods/carpets/init.lua +++ b/mods/carpets/init.lua @@ -4,21 +4,21 @@ dofile(modpath .. "/api.lua") if minetest.get_modpath("wool") then local nodes = { - {name="wool:black", description=S("Black Carpet")}, - {name="wool:blue", description=S("Blue Carpet")}, - {name="wool:brown", description=S("Brown Carpet")}, - {name="wool:cyan", description=S("Cyan Carpet")}, - {name="wool:dark_green", description=S("Dark Green Carpet")}, - {name="wool:dark_grey", description=S("Dark Grey Carpet")}, - {name="wool:green", description=S("Green Carpet")}, - {name="wool:grey", description=S("Grey Carpet")}, - {name="wool:magenta", description=S("Magenta Carpet")}, - {name="wool:orange", description=S("Orange Carpet")}, - {name="wool:pink", description=S("Pink Carpet")}, - {name="wool:red", description=S("Red Carpet")}, - {name="wool:violet", description=S("Violet Carpet")}, - {name="wool:white", description=S("White Carpet")}, - {name="wool:yellow", description=S("Yellow Carpet")}, + {name="wool:black", description=S("Black carpet")}, + {name="wool:blue", description=S("Blue carpet")}, + {name="wool:brown", description=S("Brown carpet")}, + {name="wool:cyan", description=S("Cyan carpet")}, + {name="wool:dark_green", description=S("Dark green carpet")}, + {name="wool:dark_grey", description=S("Dark grey carpet")}, + {name="wool:green", description=S("Green carpet")}, + {name="wool:grey", description=S("Grey carpet")}, + {name="wool:magenta", description=S("Magenta carpet")}, + {name="wool:orange", description=S("Orange carpet")}, + {name="wool:pink", description=S("Pink carpet")}, + {name="wool:red", description=S("Red carpet")}, + {name="wool:violet", description=S("Violet carpet")}, + {name="wool:white", description=S("White carpet")}, + {name="wool:yellow", description=S("Yellow carpet")}, } for _, node in ipairs(nodes) do carpets.register(node.name, {description=node.description}) diff --git a/mods/carpets/locale/carpets.de.tr b/mods/carpets/locale/carpets.de.tr new file mode 100644 index 00000000..86355584 --- /dev/null +++ b/mods/carpets/locale/carpets.de.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Schwarzer Teppich +Blue carpet=Blauer Teppich +Brown carpet=Brauner Teppich +Cyan carpet=Türkiser Teppich +Dark green carpet=Dunkelgrüner Teppich +Dark grey carpet=Dunkelgrauer Teppich +Green carpet=Grüner Teppich +Grey carpet=Grauer Teppich +Magenta carpet=Magenta Teppich +Orange carpet=Orange Teppich +Pink carpet=Rosa Teppich +Red carpet=Roter Teppich +Violet carpet=Violetter Teppich +White carpet=Weißer Teppich +Yellow carpet=Gelber Teppich diff --git a/mods/carpets/locale/carpets.eo.tr b/mods/carpets/locale/carpets.eo.tr new file mode 100644 index 00000000..2432b37f --- /dev/null +++ b/mods/carpets/locale/carpets.eo.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Nigra tapiŝo +Blue carpet=Blua tapiŝo +Brown carpet=Bruna tapiŝo +Cyan carpet=Bluverda tapiŝo +Dark green carpet=Malhela verda tapiŝo +Dark grey carpet=Malhela griza tapiŝo +Green carpet=Verda tapiŝo +Grey carpet=Griza tapiŝo +Magenta carpet=Fuksina tapiŝo +Orange carpet=Oranĝa tapiŝo +Pink carpet=Rozkolora tapiŝo +Red carpet=Ruĝa tapiŝo +Violet carpet=Violkolora tapiŝo +White carpet=Blanka tapiŝo +Yellow carpet=Flava tapiŝo diff --git a/mods/carpets/locale/carpets.es.tr b/mods/carpets/locale/carpets.es.tr new file mode 100644 index 00000000..67913dbe --- /dev/null +++ b/mods/carpets/locale/carpets.es.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Alfombra negra +Blue carpet=Alfombra azul +Brown carpet=Alfombra marrón +Cyan carpet=Alfombra cian +Dark green carpet=Alfombra verde oscuro +Dark grey carpet=Alfombra gris oscuro +Green carpet=Alfombra verde +Grey carpet=Alfombra gris +Magenta carpet=Alfombra magenta +Orange carpet=Alfombra naranja +Pink carpet=Alfombra rosa +Red carpet=Alfombra roja +Violet carpet=Alfombra violeta +White carpet=Alfombra blanca +Yellow carpet=Alfombra amarilla diff --git a/mods/carpets/locale/carpets.fr.tr b/mods/carpets/locale/carpets.fr.tr index c1b1c6d6..c90196e4 100644 --- a/mods/carpets/locale/carpets.fr.tr +++ b/mods/carpets/locale/carpets.fr.tr @@ -1,20 +1,18 @@ # textdomain: carpets - -### init.lua ### - -Black Carpet=Tapis noir -Blue Carpet=Tapis bleu -Brown Carpet=Tapis marron -Cyan Carpet=Tapis cyan -Dark Green Carpet=Tapis vert foncé -Dark Grey Carpet=Tapis gris foncé -Green Carpet=Tapis vert -Grey Carpet=Tapis gris -Magenta Carpet=Tapis magenta -Orange Carpet=Tapis orange -Pink Carpet=Tapis rose -Red Carpet=Tapis rouge -Violet Carpet=Tapis violet -White Carpet=Tapis blanc -Yellow Carpet=Tapis jaune +##[ init.lua ]## +Black carpet=Tapis noir +Blue carpet=Tapis bleu +Brown carpet=Tapis marron +Cyan carpet=Tapis cyan +Dark green carpet=Tapis vert foncé +Dark grey carpet=Tapis gris foncé +Green carpet=Tapis vert +Grey carpet=Tapis gris +Magenta carpet=Tapis magenta +Orange carpet=Tapis orange +Pink carpet=Tapis rose +Red carpet=Tapis rouge +Violet carpet=Tapis violet +White carpet=Tapis blanc +Yellow carpet=Tapis jaune diff --git a/mods/carpets/locale/carpets.hu.tr b/mods/carpets/locale/carpets.hu.tr new file mode 100644 index 00000000..c79666df --- /dev/null +++ b/mods/carpets/locale/carpets.hu.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Fekete szőnyeg +Blue carpet=Kék szőnyeg +Brown carpet=Barna szőnyeg +Cyan carpet=Égszínkék szőnyeg +Dark green carpet=Sötétzöld szőnyeg +Dark grey carpet=Sötétszürke szőnyeg +Green carpet=Zöld szőnyeg +Grey carpet=Szürke szőnyeg +Magenta carpet=Magenta szőnyeg +Orange carpet=Narancs szőnyeg +Pink carpet=Rózsaszín szőnyeg +Red carpet=Piros szőnyeg +Violet carpet=Lila szőnyeg +White carpet=Fehér szőnyeg +Yellow carpet=Sárga szőnyeg diff --git a/mods/carpets/locale/carpets.it.tr b/mods/carpets/locale/carpets.it.tr new file mode 100644 index 00000000..583986ac --- /dev/null +++ b/mods/carpets/locale/carpets.it.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Tappeto nero +Blue carpet=Tappeto blu +Brown carpet=Tappeto marrone +Cyan carpet=Tappero ciano +Dark green carpet=Tappeto verde scuro +Dark grey carpet=Tappeto grigio scuro +Green carpet=Tappeto verde +Grey carpet=Tappeto grigio +Magenta carpet=Tappeto magenta +Orange carpet=Tappeto arancione +Pink carpet=Tappeto rosa +Red carpet=Tappero rosso +Violet carpet=Tappeto viola +White carpet=Tappeto bianco +Yellow carpet=Tappeto giallo diff --git a/mods/carpets/locale/carpets.pl.tr b/mods/carpets/locale/carpets.pl.tr new file mode 100644 index 00000000..5ecd382e --- /dev/null +++ b/mods/carpets/locale/carpets.pl.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Czarny dywan +Blue carpet=Niebieski dywan +Brown carpet=Brązowy dywan +Cyan carpet=Błękitny dywan +Dark green carpet=Ciemnozielony dywan +Dark grey carpet=Ciemnoszary dywan +Green carpet=Zielony dywan +Grey carpet=Szary dywan +Magenta carpet=Purpurowy dywan +Orange carpet=Pomarańczowy dywan +Pink carpet=Różowy dywan +Red carpet=Czerwony dywan +Violet carpet=Fioletowy dywan +White carpet=Biały dywan +Yellow carpet=Żółty dywan diff --git a/mods/carpets/locale/template.txt b/mods/carpets/locale/template.txt index 292224a5..2cb1ed70 100644 --- a/mods/carpets/locale/template.txt +++ b/mods/carpets/locale/template.txt @@ -1,20 +1,18 @@ # textdomain: carpets - -### init.lua ### - -Black Carpet= -Blue Carpet= -Brown Carpet= -Cyan Carpet= -Dark Green Carpet= -Dark Grey Carpet= -Green Carpet= -Grey Carpet= -Magenta Carpet= -Orange Carpet= -Pink Carpet= -Red Carpet= -Violet Carpet= -White Carpet= -Yellow Carpet= +##[ init.lua ]## +Black carpet= +Blue carpet= +Brown carpet= +Cyan carpet= +Dark green carpet= +Dark grey carpet= +Green carpet= +Grey carpet= +Magenta carpet= +Orange carpet= +Pink carpet= +Red carpet= +Violet carpet= +White carpet= +Yellow carpet= diff --git a/mods/carts/README.md b/mods/carts/README.md new file mode 100644 index 00000000..a28fd4ca --- /dev/null +++ b/mods/carts/README.md @@ -0,0 +1,74 @@ +minetest mod Carts (formerly boost_cart) +========================== + +Carts and rails (formerly boost_cart) + +Information +----------- + +This mod is named `carts`, it features work from `boost_cart` mod. +This is improved rail carts mod and featured boots rails.. + +![screenshot.png](screenshot.png) + + +#### Features + +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key + +#### Additions by TenPlus1 + +- Mesecon detector rail added +- 10 second cart drop when player or item not inside +- Alias' set to replace rails from boost_cart mod + +Technical informaton +-------------------- + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2] +and the model was originally designed by stujones11 [3] (CC-0). + +This mod can (and maybe must) replace the default carts mod of minetest game. + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + +#### Dependencies + +* default +* mesecons (optional) + +#### nodes + +| Name | node | notes | +| ------------ | --------------- | ----- | +| Rail | carts:rail | to use and travel over rails with carts | +| Bracke rails | carts:brakerail | rail to downgrade velocity of carts | +| Powered rail | carts:powerrail | rail to impulse velocity of a cart | +| Detector rail | carts:detectorrail | it depends on mesecons for detection of mese | + +Alias: + +| original | carts alias | +| -------------------- | -------------- | +| default:rail | carts:rail | +| carts:copperrail | default:rail | +| boost_cart:copperrail | default:rail | +| boost_cart:powerrail | carts:powerrail | +| boost_cart:brakerail | carts:brakerail | +| boost_cart:detectorrail | carts:detectorrail | + +Licence +------ + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). + +Check [lisence.txt](lisence.txt) diff --git a/mods/carts/README.txt b/mods/carts/README.txt deleted file mode 100644 index f6e62b88..00000000 --- a/mods/carts/README.txt +++ /dev/null @@ -1,29 +0,0 @@ -Carts (formerly boost_cart) -========================== - -Carts, based almost entirely on the mod boost_cart [1], which -itself is based on (and fully compatible with) the carts mod [2]. - -The model was originally designed by stujones11 [3] (CC-0). - -Cart textures are based on original work from PixelBOX by Gambit (permissive -license). - - -[1] https://github.com/SmallJoker/boost_cart/ -[2] https://github.com/PilzAdam/carts/ -[3] https://github.com/stujones11/railcart/ - - -Features ----------- -- A fast cart for your railway or roller coaster (up to 7 m/s!) -- Boost and brake rails -- Rail junction switching with the 'right-left' walking keys -- Handbrake with the 'back' key - -Additions by TenPlus1 ------------------------ -- Mesecon detector rail added -- 10 second cart drop when player or item not inside -- Alias' set to replace rails from boost_cart mod diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index a72ab72f..a18612d6 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -29,6 +29,20 @@ local cart_entity = { attached_items = {} } + +-- cache creative +local creative = minetest.settings:get_bool("creative_mode") + +function is_creative_enabled_for(name) + + if creative or minetest.check_player_privs(name, {creative = true}) then + return true + end + + return false +end + + function cart_entity:on_rightclick(clicker) if not clicker or not clicker:is_player() then return @@ -53,9 +67,7 @@ function cart_entity:on_activate(staticdata, dtime_s) return end self.railtype = data.railtype - if data.old_dir then - self.old_dir = data.old_dir - end + self.old_dir = data.old_dir or self.old_dir end function cart_entity:get_staticdata() @@ -111,15 +123,18 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, end -- Pick up cart local inv = puncher:get_inventory() - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(puncher:get_player_name())) - or not inv:contains_item("main", "carts:cart") then + + if not is_creative_enabled_for(puncher:get_player_name()) + or not inv:contains_item("main", "carts:cart") then + local leftover = inv:add_item("main", "carts:cart") + -- If no room in inventory add a replacement cart to the world if not leftover:is_empty() then minetest.add_item(self.object:get_pos(), leftover) end end + self.object:remove() return end @@ -222,11 +237,11 @@ local function rail_on_step(self, dtime) end local pos = self.object:get_pos() - local cart_dir = carts:velocity_to_dir(vel) - local same_dir = vector.equals(cart_dir, self.old_dir) + local dir = carts:velocity_to_dir(vel) + local dir_changed = not vector.equals(dir, self.old_dir) local update = {} - if self.old_pos and not self.punched and same_dir then + if self.old_pos and not self.punched and not dir_changed then local flo_pos = vector.round(pos) local flo_old = vector.round(self.old_pos) if vector.equals(flo_pos, flo_old) then @@ -246,7 +261,7 @@ local function rail_on_step(self, dtime) end local stop_wiggle = false - if self.old_pos and same_dir then + if self.old_pos and not dir_changed then -- Detection for "skipping" nodes (perhaps use average dtime?) -- It's sophisticated enough to take the acceleration in account local acc = self.object:get_acceleration() @@ -261,7 +276,7 @@ local function rail_on_step(self, dtime) -- No rail found: set to the expected position pos = new_pos update.pos = true - cart_dir = new_dir + dir = new_dir end elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then -- Stop wiggle @@ -271,21 +286,27 @@ local function rail_on_step(self, dtime) local railparams -- dir: New moving direction of the cart - -- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node - local dir, switch_keys = carts:get_rail_direction( - pos, cart_dir, ctrl, self.old_switch, self.railtype + -- switch_keys: Currently pressed L(1) or R(2) key, + -- used to ignore the key on the next rail node + local switch_keys + dir, switch_keys = carts:get_rail_direction( + pos, dir, ctrl, self.old_switch, self.railtype ) - local dir_changed = not vector.equals(dir, self.old_dir) + dir_changed = not vector.equals(dir, self.old_dir) - local new_acc = {x=0, y=0, z=0} + local acc = 0 if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then + dir = vector.new(self.old_dir) vel = {x = 0, y = 0, z = 0} local pos_r = vector.round(pos) if not carts:is_rail(pos_r, self.railtype) and self.old_pos then pos = self.old_pos elseif not stop_wiggle then + -- End of rail: Smooth out. pos = pos_r + dir_changed = false + dir.y = 0 else pos.y = math.floor(pos.y + 0.5) end @@ -312,7 +333,7 @@ local function rail_on_step(self, dtime) end -- Slow down or speed up.. - local acc = dir.y * -4.0 + acc = dir.y * -4.0 -- Get rail for corrected position railparams = get_railparams(pos) @@ -330,8 +351,6 @@ local function rail_on_step(self, dtime) acc = acc - 0.4 end end - - new_acc = vector.multiply(dir, acc) end -- mesecon detector rail @@ -339,21 +358,20 @@ local function rail_on_step(self, dtime) carts:signal_detector_rail(vector.round(pos)) end - -- Limits - local max_vel = carts.speed_max - for _, v in pairs({"x","y","z"}) do - if math.abs(vel[v]) > max_vel then - vel[v] = carts:get_sign(vel[v]) * max_vel - new_acc[v] = 0 - update.vel = true - end + -- Limit cart speed + local vel_len = vector.length(vel) + if vel_len > carts.speed_max then + vel = vector.multiply(vel, carts.speed_max / vel_len) + update.vel = true + end + if vel_len >= carts.speed_max and acc > 0 then + acc = 0 end - self.object:set_acceleration(new_acc) + self.object:set_acceleration(vector.multiply(dir, acc)) + self.old_pos = vector.round(pos) - if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then - self.old_dir = vector.new(dir) - end + self.old_dir = vector.new(dir) self.old_switch = switch_keys if self.punched then @@ -380,11 +398,11 @@ local function rail_on_step(self, dtime) end local yaw = 0 - if self.old_dir.x < 0 then + if dir.x < 0 then yaw = 0.5 - elseif self.old_dir.x > 0 then + elseif dir.x > 0 then yaw = 1.5 - elseif self.old_dir.z < 0 then + elseif dir.z < 0 then yaw = 1 end self.object:set_yaw(yaw * math.pi) @@ -435,7 +453,7 @@ minetest.register_craftitem("carts:cart", { pointed_thing) or itemstack end - if not pointed_thing.type == "node" then + if pointed_thing.type ~= "node" then return end if carts:is_rail(pointed_thing.under) then @@ -449,8 +467,8 @@ minetest.register_craftitem("carts:cart", { minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, {pos = pointed_thing.above}, true) - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(placer:get_player_name())) then + if not is_creative_enabled_for(placer:get_player_name()) then + itemstack:take_item() end return itemstack diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 36b7e129..bcbbdb9d 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -15,6 +15,7 @@ function carts:manage_attachment(player, obj) if obj and player:get_attach() == obj then return end + player_api.player_attached[player_name] = status if status then @@ -24,6 +25,7 @@ function carts:manage_attachment(player, obj) -- player_api does not update the animation -- when the player is attached, reset to default animation player_api.set_animation(player, "stand") + else player:set_detach() player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) diff --git a/mods/carts/init.lua b/mods/carts/init.lua index 69d59d9f..12ae0084 100644 --- a/mods/carts/init.lua +++ b/mods/carts/init.lua @@ -1,7 +1,17 @@ -- carts/init.lua --- Load support for MT game translation. -local S = minetest.get_translator("carts") +-- translation support +local S +if minetest.get_translator ~= nil then + S = minetest.get_translator("carts") -- 5.x translation function +else -- boilerplate function + S = function(str, ...) + local args = {...} + return str:gsub("@%d+", function(match) + return args[tonumber(match:sub(2))] + end) + end +end carts = {} carts.modpath = minetest.get_modpath("carts") @@ -26,3 +36,5 @@ if minetest.global_exists("dungeon_loot") then name = "carts:rail", chance = 0.35, count = {1, 6} }) end + +print("[MOD] Carts loaded") diff --git a/mods/carts/screenshot.png b/mods/carts/screenshot.png new file mode 100644 index 00000000..8a93793e Binary files /dev/null and b/mods/carts/screenshot.png differ diff --git a/mods/castle/autocraft.lua b/mods/castle/autocraft.lua index b7544f14..dcf10cd8 100644 --- a/mods/castle/autocraft.lua +++ b/mods/castle/autocraft.lua @@ -11,6 +11,7 @@ minetest.register_node("castle:autocraft", { paramtype2 = "facedir", sounds = default.node_sound_wood_defaults(), drop = "pipeworks:autocrafter", +on_blast = function() end })--[[ on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -147,4 +148,4 @@ minetest.register_abm({ end end, }) -]] \ No newline at end of file +]] diff --git a/mods/castle/depends.txt b/mods/castle/depends.txt deleted file mode 100644 index 3b78502b..00000000 --- a/mods/castle/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -farming \ No newline at end of file diff --git a/mods/castle/init.lua b/mods/castle/init.lua index 1b18402f..2a8234e3 100644 --- a/mods/castle/init.lua +++ b/mods/castle/init.lua @@ -197,6 +197,7 @@ minetest.register_node("castle:ironbound_chest",{ ) end end, + on_blast = function() end }) minetest.register_craft({ @@ -213,7 +214,7 @@ minetest.register_node("castle:tapestry_top", { description = "Tapestry Top", tiles = {"default_wood.png"}, sunlight_propagates = true, - groups = {flammable=3,choppy=2,oddly_breakable_by_hand=1}, + groups = {flammable=3,choppy=2,oddly_breakable_by_hand=1,stick=1}, sounds = default.node_sound_defaults(), paramtype = "light", paramtype2 = "facedir", @@ -228,15 +229,65 @@ minetest.register_node("castle:tapestry_top", { }) minetest.register_craft({ - type = "shapeless", + --type = "shapeless", output = "castle:tapestry_top", - recipe = {"default:stick"}, + recipe = {{"default:stick"}} +}) + +if minetest.get_modpath("ethereal") then + +-- mushroom trunk tapestry top +minetest.register_node("castle:tapestry_top2", { + drawtype = "nodebox", + description = "White Tapestry Top", + tiles = {"ethereal_mushroom_trunk.png"}, + sunlight_propagates = true, + groups = {flammable=3,choppy=2,oddly_breakable_by_hand=1,stick=1}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, + selection_box = { + type = "fixed", + fixed = {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, }) minetest.register_craft({ - type = "shapeless", - recipe = {"castle:tapestry_top"}, - output = "default:stick", + --type = "shapeless", + output = "castle:tapestry_top2", + recipe = {{"castle:tapestry_top", "dye:white"}} }) +-- scorched tapestry top +minetest.register_node("castle:tapestry_top3", { + drawtype = "nodebox", + description = "Black Tapestry Top", + tiles = {"ethereal_scorched_tree.png"}, + sunlight_propagates = true, + groups = {flammable=3,choppy=2,oddly_breakable_by_hand=1,stick=1}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, + selection_box = { + type = "fixed", + fixed = {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, +}) + +minetest.register_craft({ + --type = "shapeless", + output = "castle:tapestry_top3", + recipe = {{"castle:tapestry_top", "dye:black"}} +}) + +end + print ("[MOD] Castle loaded") diff --git a/mods/castle/mod.conf b/mods/castle/mod.conf new file mode 100644 index 00000000..b1da515b --- /dev/null +++ b/mods/castle/mod.conf @@ -0,0 +1,2 @@ +name = castle +depends = default, doors, farming diff --git a/mods/castle/town_item.lua b/mods/castle/town_item.lua index b7ff8a95..be6dcdb2 100644 --- a/mods/castle/town_item.lua +++ b/mods/castle/town_item.lua @@ -29,7 +29,6 @@ minetest.register_node("castle:dungeon_stone", { }) minetest.register_craft({ - --type = "shapeless", output = "castle:dungeon_stone", recipe = {{"default:stonebrick", "default:obsidian"}} }) @@ -71,7 +70,8 @@ minetest.register_node("castle:crate", { local inv = meta:get_inventory() return inv:is_empty("main") - end + end, + on_blast = function() end }) minetest.register_craft({ diff --git a/mods/claycrafter/items.lua b/mods/claycrafter/items.lua index 81e47b88..ebfc16c4 100644 --- a/mods/claycrafter/items.lua +++ b/mods/claycrafter/items.lua @@ -7,9 +7,9 @@ else minetest.register_craft({ output = "claycrafter:compressed_dirt", recipe = { - {"default:dirt", "default:dirt", "default:dirt"}, - {"default:dirt", "default:dirt", "default:dirt"}, - {"default:dirt", "default:dirt", "default:dirt"} + {"group:dirt", "group:dirt", "group:dirt"}, + {"group:dirt", "group:dirt", "group:dirt"}, + {"group:dirt", "group:dirt", "group:dirt"} } }) minetest.register_node("claycrafter:compressed_dirt", { @@ -33,7 +33,7 @@ minetest.register_node("claycrafter:glass_of_water", { inventory_image = "claycrafter_glass_of_water_inv.png", wield_image = "claycrafter_glass_of_water.png", paramtype = "light", - use_texture_alpha = true, + use_texture_alpha = "blend", is_ground_content = false, walkable = false, sunlight_propagates = true, @@ -47,12 +47,21 @@ minetest.register_node("claycrafter:glass_of_water", { minetest.register_craft({ output = "claycrafter:glass_of_water 8", recipe = { - {"vessels:drinking_glass", "vessels:drinking_glass", "vessels:drinking_glass"}, - {"vessels:drinking_glass", "bucket:bucket_water", "vessels:drinking_glass"}, - {"vessels:drinking_glass", "vessels:drinking_glass", "vessels:drinking_glass"} + {"group:vessel", "group:vessel", "group:vessel"}, + {"group:vessel", "group:water_bucket", "group:vessel"}, + {"group:vessel", "group:vessel", "group:vessel"} }, replacements = { - {"bucket:bucket_water", "bucket:bucket_empty"}, + {"group:water_bucket", "bucket:bucket_empty"}, + } +}) + +minetest.register_craft({ + output = "claycrafter:glass_of_water 8", + recipe = { + {"group:vessel", "group:vessel", "group:vessel"}, + {"group:vessel", "group:water", "group:vessel"}, + {"group:vessel", "group:vessel", "group:vessel"} } }) @@ -60,7 +69,7 @@ minetest.register_craft({ output = "claycrafter:claycrafter", recipe = { {"group:wood", "default:steel_ingot", "group:wood"}, - {"group:wood", "default:glass", "group:wood"}, - {"default:stick", "bucket:bucket_water", "default:stick"} + {"group:wood", "group:glass", "group:wood"}, + {"group:stick", "group:water_bucket", "group:stick"} } }) diff --git a/mods/cloud_items/LICENSE.md b/mods/cloud_items/LICENSE.md index 6639a3af..40122a57 100644 --- a/mods/cloud_items/LICENSE.md +++ b/mods/cloud_items/LICENSE.md @@ -1,17 +1,17 @@ -# License for textures/media +# License of media (textures, models, and schematics) -Copyright (C) 2019-2021 Panquesito7, David Leal (halfpacho@gmail.com)\ +Copyright (C) 2019-2024 David Leal (halfpacho@gmail.com)\ Copyright (C) Various other Minetest developers/contributors [David Leal](https://github.com/Panquesito7) ([CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)): -- `screenshot.png` - `cloud_items_cloud_ship.obj` - `cloud_items_cloud_ship_inventory.png` +- `schems/cloud_*` [BlockMen](https://github.com/BlockMen) ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): -- `cloud_items_tool_*.png` - [`default_tool_*.png`](https://github.com/minetest/minetest_game/tree/master/mods/default/textures)\ +- `cloud_items_tool_*.png` - [`default_tool_*.png`](https://github.com/minetest/minetest_game/tree/master/mods/default/textures) - `cloud_items_cloud_ingot.png` - [`default_gold_ingot.png`](https://github.com/minetest/minetest_game/blob/master/mods/default/textures/default_gold_ingot.png) [InfinityProject](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=1494) ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): @@ -24,28 +24,32 @@ Copyright (C) Various other Minetest developers/contributors [kilbith](https://github.com/kilbith) ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): -- `cloud_items_cloud_block.png` - [`default_gold_block.png`](https://github.com/minetest/minetest_game/blob/master/mods/default/textures/default_gold_block.png)\ +- `cloud_items_cloud_block.png` - [`default_gold_block.png`](https://github.com/minetest/minetest_game/blob/master/mods/default/textures/default_gold_block.png) - `cloud_items_decorationblock.png` - [`default_gold_block.png`](https://github.com/minetest/minetest_game/blob/master/mods/default/textures/default_gold_block.png) -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/): - -- `cloud_items_multitool_cloud.png` - -Copyright (C) [Melkor](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=301) ([CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/)): - -- `cloud_items_car_cloud.png` - [`car_white.png`](https://github.com/minetest-mods/vehicle_mash/blob/master/textures/car_white.png) -- `cloud_items_car_cloud_inventory.png` - [`inv_car_white.png`](https://github.com/minetest-mods/vehicle_mash/blob/master/textures/inv_car_white.png) - -Copyright (C) [davidthecreator](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=11158) 2017-2019 ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): +[davidthecreator](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=11158) ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): - All [`3d_armor`](https://github.com/stujones11/minetest-3d_armor) [textures](https://github.com/stujones11/minetest-3d_armor/tree/master/3d_armor/textures). - `cloud_items_gloves_cloud.png` - [`3d_armor_gloves_gloves_steel.png`](https://github.com/sirrobzeroone/3d_armor_gloves/blob/main/textures/3d_armor_gloves_gloves_steel.png) - `cloud_items_gloves_cloud_preview.png` - [`3d_armor_gloves_gloves_steel_preview.png`](https://github.com/sirrobzeroone/3d_armor_gloves/blob/main/textures/3d_armor_gloves_gloves_steel_preview.png) - `cloud_items_gloves_inv_gloves_cloud.png` - [`3d_armor_gloves_inv_gloves_steel.png`](https://github.com/sirrobzeroone/3d_armor_gloves/blob/main/textures/3d_armor_gloves_inv_gloves_steel.png) -## License for source code +[KatzPetz](https://github.com/KatzPetz) ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)) from : -Copyright (C) 2019-2021 Panquesito7, David Leal (halfpacho@gmail.com)\ +- `cloud_items_multitool_cloud.png` + +[Melkor](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=301) ([CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/)): + +- `cloud_items_car_cloud.png` - [`car_white.png`](https://github.com/minetest-mods/vehicle_mash/blob/master/textures/car_white.png) +- `cloud_items_car_cloud_inventory.png` - [`inv_car_white.png`](https://github.com/minetest-mods/vehicle_mash/blob/master/textures/inv_car_white.png) + +License of screenshots: + +- The screenshots were taken by me ([Panquesito7](https://github.com/Panquesito7)) on [Minetest Game](https://github.com/minetest/minetest_game) along with [this mod](https://github.com/minetest-mods/cloud_items). All the assets/media shown in the image fall under their respective license and belong to their respective authors. + +## License of source code + +Copyright (C) 2019-2024 David Leal (halfpacho@gmail.com)\ Copyright (C) Various other Minetest developers/contributors GNU LESSER GENERAL PUBLIC LICENSE @@ -551,4 +555,4 @@ necessary. Here is a sample; alter the names: , 1 April 1990 Ty Coon, President of Vice -That's all there is to it! \ No newline at end of file +That's all there is to it! diff --git a/mods/cloud_items/README.md b/mods/cloud_items/README.md index d99880cc..2b641f53 100644 --- a/mods/cloud_items/README.md +++ b/mods/cloud_items/README.md @@ -1,11 +1,9 @@ -# Cloud Items +# Cloud Items ☁ ![Screenshot](https://user-images.githubusercontent.com/51391473/87363638-328a0280-c537-11ea-9e90-f992cbc13ab4.png) [![Build status](https://github.com/minetest-mods/cloud_items/workflows/build/badge.svg)](https://github.com/minetest-mods/cloud_items/actions) [![ContentDB](https://content.minetest.net/packages/Panquesito7/cloud_items/shields/downloads/)](https://content.minetest.net/packages/Panquesito7/cloud_items/) -[![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) -[![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/Panquesito7/donate) Adds powerful cloud tools for Minetest. Stronger than diamond and other materials. @@ -29,10 +27,10 @@ For further information or help, see:\ Take a look at this mod's features.\ Have any questions/comments? Submit an [issue](https://github.com/minetest-mods/cloud_items/issues/new) or [contact me](mailto:halfpacho@gmail.com). -### Difference beetwen normal ores +### Difference between normal ores This "ore", doesn't spawn underground!\ -Instead, it spawns at the sky; that's why it's called "cloud". +Instead, it spawns in the sky; that's why it's called "cloud". An ore will be spawned somewhere in the schematic!\ You'll have certain probabilities to have an ore or not! @@ -69,7 +67,7 @@ This cloud house includes great things such as chests with stuff! ### Types of cloud -There are 4 types of cloud: +There are 4 types of clouds: - Normal cloud - Hard to find. @@ -78,21 +76,21 @@ There are 4 types of cloud: - Damage: 11 - Can kill players with 2 hits. - Spawns at 200 blocks and above. -- Cloud star (comming soon) +- Cloud star (coming soon) - Difficult to find. - You may find from 1 to 4 ores. - Stronger than cloud and diamond. - Damage: 12 - Can kill players with 2 hits. - Spawns at 350 blocks and above. -- Cloud meteor (comming soon) +- Cloud meteor (coming soon) - Very hard to find. - You may find from 1 to 3 ores. - Stronger than cloud (star) and diamond. - Damage: 14 - Can kill players with 2 hits. - Spawns at 500 blocks and above. -- Cloud comet (comming soon) +- Cloud comet (coming soon) - Very difficult to find. - You may find only 1 ore. - Stronger than all materials. @@ -100,37 +98,7 @@ There are 4 types of cloud: - Very strong, can kill a player with 2 hits. - Spawns at 800 blocks and above. -## Dependencies - -- `default` (included in [Minetest Game](https://github.com/minetest/minetest_game)) -- [`worldedit`](https://github.com/Uberi/Minetest-WorldEdit) - - This is required due to the `worldedit.deserialize` function. -- [`vehicle_mash`](https://github.com/minetest-mods/vehicle_mash) - -### Optional dependencies - -- [`3d_armor`](https://github.com/minetest-mods/3d_armor) -- [`toolranks`](https://github.com/lisacvuk/minetest-toolranks) -- [`moreblocks`](https://github.com/minetest-mods/moreblocks) -- [`multitools`](https://github.com/ChimneySwift/multitools) -- [`3d_armor_gloves`](https://github.com/sirrobzeroone/3d_armor_gloves) -- `stairs` (included in [Minetest Game](https://github.com/minetest/minetest_game)) - -## Requirements - -Cloud Items is currently tested with Minetest 5.4.0-dev.\ -Issues may arise if you use older or newer versions. - -It shall work with MT 5.0.0 and above, though. - -## License - -Copyright (C) 2019-2021 Panquesito7, David Leal\ -Copyright (C) Various other Minetest developers/contributors - -See [`LICENSE.md`](https://github.com/minetest-mods/cloud_items/blob/master/LICENSE.md) for more information. - -## Credits +## License and credits Credits to (in no particular order): @@ -138,7 +106,4 @@ Credits to (in no particular order): - [Brett O'Donnell](https://github.com/cornernote) - For the function to load an schematic. -## Issues, suggestions, features & bugfixes - -Report bugs or suggest ideas by [creating an issue](https://github.com/minetest-mods/cloud_items/issues/new).\ -If you know how to fix an issue, or want something to be added, consider opening a [pull request](https://github.com/minetest-mods/cloud_items/compare). +See the [`LICENSE.md`](LICENSE.md) file for full information. diff --git a/mods/cloud_items/init.lua b/mods/cloud_items/init.lua index bd127ed5..1d4e5992 100644 --- a/mods/cloud_items/init.lua +++ b/mods/cloud_items/init.lua @@ -1,7 +1,7 @@ --[[ Adds powerful cloud tools for Minetest. -Copyright (C) 2019-2021 David Leal (halfpacho@gmail.com) +Copyright (C) 2019-2024 David Leal (halfpacho@gmail.com) Copyright (C) Various other Minetest developers/contributors This library is free software; you can redistribute it and/or @@ -18,11 +18,6 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -========================================================================== - -Dependencies: WorldEdit, Vehicle Mash, default (included in Minetest Game) -Optional dependencies: 3D Armor, Tool Ranks, More Blocks, multitools, stairs (included in Minetest Game) --]] -- Translation support diff --git a/mods/cloud_items/screenshot.1.png b/mods/cloud_items/screenshot.1.png new file mode 100644 index 00000000..fc82082a Binary files /dev/null and b/mods/cloud_items/screenshot.1.png differ diff --git a/mods/cloud_items/screenshot.2.png b/mods/cloud_items/screenshot.2.png new file mode 100644 index 00000000..978a8633 Binary files /dev/null and b/mods/cloud_items/screenshot.2.png differ diff --git a/mods/cloud_items/screenshot.3.png b/mods/cloud_items/screenshot.3.png new file mode 100644 index 00000000..0778b198 Binary files /dev/null and b/mods/cloud_items/screenshot.3.png differ diff --git a/mods/cloud_items/screenshot.4.png b/mods/cloud_items/screenshot.4.png new file mode 100644 index 00000000..6483230e Binary files /dev/null and b/mods/cloud_items/screenshot.4.png differ diff --git a/mods/cloud_items/screenshot.5.png b/mods/cloud_items/screenshot.5.png new file mode 100644 index 00000000..bc2105b4 Binary files /dev/null and b/mods/cloud_items/screenshot.5.png differ diff --git a/mods/cloud_items/screenshot.6.png b/mods/cloud_items/screenshot.6.png new file mode 100644 index 00000000..189234ce Binary files /dev/null and b/mods/cloud_items/screenshot.6.png differ diff --git a/mods/cloud_items/screenshot.7.png b/mods/cloud_items/screenshot.7.png new file mode 100644 index 00000000..b4c8d865 Binary files /dev/null and b/mods/cloud_items/screenshot.7.png differ diff --git a/mods/cloud_items/screenshot.8.png b/mods/cloud_items/screenshot.8.png new file mode 100644 index 00000000..f5547b12 Binary files /dev/null and b/mods/cloud_items/screenshot.8.png differ diff --git a/mods/cloud_items/screenshot.9.png b/mods/cloud_items/screenshot.9.png new file mode 100644 index 00000000..44d81801 Binary files /dev/null and b/mods/cloud_items/screenshot.9.png differ diff --git a/mods/coloredwood/.luacheckrc b/mods/coloredwood/.luacheckrc new file mode 100644 index 00000000..9844933b --- /dev/null +++ b/mods/coloredwood/.luacheckrc @@ -0,0 +1,8 @@ + +read_globals = { + "table.copy", + "minetest", + "default", + "unifieddyes", + "stairsplus", +} diff --git a/mods/coloredwood/depends.txt b/mods/coloredwood/depends.txt deleted file mode 100644 index 3ab55ba4..00000000 --- a/mods/coloredwood/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -unifieddyes -moreblocks? -signs_lib? diff --git a/mods/coloredwood/description.txt b/mods/coloredwood/description.txt deleted file mode 100644 index e0b1dd5a..00000000 --- a/mods/coloredwood/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod provides a multitude of colors of wood, sticks, and fences to Minetest, as per the palette outlined by my Unified Dyes mod. diff --git a/mods/coloredwood/init.lua b/mods/coloredwood/init.lua index 54aa708d..d8d8040f 100644 --- a/mods/coloredwood/init.lua +++ b/mods/coloredwood/init.lua @@ -7,11 +7,9 @@ -- All materials are flammable and can be used as fuel. -coloredwood = {} - -coloredwood.enable_stairsplus = true +local enable_stairsplus = true if minetest.settings:get_bool("coloredwood_enable_stairsplus") == false or not minetest.get_modpath("moreblocks") then - coloredwood.enable_stairsplus = false + enable_stairsplus = false end -- helper functions @@ -28,7 +26,6 @@ local function is_stairsplus(name, colorized) local class = string.sub(name, a+1, b-1) -- from colon to underscore is the class local shape = "" - local rest local colorshape if class == "stair" @@ -64,6 +61,7 @@ minetest.register_node("coloredwood:wood_block", { walkable = true, sunlight_propagates = false, groups = groups, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) @@ -71,7 +69,7 @@ for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do -- moreblocks/stairsplus support - if coloredwood.enable_stairsplus then + if enable_stairsplus then -- stairsplus:register_all(modname, subname, recipeitem, {fields}) @@ -85,11 +83,14 @@ for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do paramtype = "light", paramtype2 = "colorfacedir", palette = "unifieddyes_palette_"..color.."s.png", - after_place_node = function(pos, placer, itemstack, pointed_thing) + after_place_node = function(_, placer, itemstack, pointed_thing) minetest.rotate_node(itemstack, placer, pointed_thing) end, on_dig = unifieddyes.on_dig, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2, not_in_creative_inventory=1, ud_param2_colorable = 1}, + groups = { + snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, + not_in_creative_inventory=1, ud_param2_colorable = 1 + }, } ) end @@ -100,7 +101,7 @@ local coloredwood_cuts = {} -- force settings for stairsplus default wood stair/slab/etc nodes -- and fix other stuff for colored versions of stairsplus nodes -if coloredwood.enable_stairsplus then +if enable_stairsplus then local groups2 = table.copy(minetest.registered_items["default:wood"].groups) groups2.wood = nil @@ -171,7 +172,10 @@ default.register_fence("coloredwood:fence", { texture = "coloredwood_fence_base.png", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, ud_param2_colorable = 1, not_in_creative_inventory=1}, + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, + ud_param2_colorable = 1, not_in_creative_inventory=1 + }, sounds = default.node_sound_wood_defaults(), material = "coloredwood:wood_block", on_dig = unifieddyes.on_dig, @@ -226,5 +230,3 @@ if minetest.get_modpath("signs_lib") then check_for_pole = true }) end - -print("[Colored Wood] Loaded!") diff --git a/mods/coloredwood/mod.conf b/mods/coloredwood/mod.conf index f8b96718..e1dd8b56 100644 --- a/mods/coloredwood/mod.conf +++ b/mods/coloredwood/mod.conf @@ -1,2 +1,5 @@ name = coloredwood +description = Provides a multitude of colors of wood, sticks, and fences. +depends = default, unifieddyes +optional_depends = moreblocks, signs_lib min_minetest_version = 5.2.0 diff --git a/mods/compost/init.lua b/mods/compost/init.lua index 6c869f46..97d8a076 100644 --- a/mods/compost/init.lua +++ b/mods/compost/init.lua @@ -36,9 +36,8 @@ local function clear_item_name(itemname) for z in out_itemname:gmatch("[^%s]+") do local item = minetest.registered_aliases[z] or z if minetest.registered_items[item] then - out_itemname = item + return item end - break end end return out_itemname diff --git a/mods/cottages/mod.conf b/mods/cottages/mod.conf new file mode 100644 index 00000000..7ca5444c --- /dev/null +++ b/mods/cottages/mod.conf @@ -0,0 +1,5 @@ +name = cottages +description = Contains a lot of blocks that fit to medieval settlements and small cottages. Comes with hammer & anvil to repair tools. Threshing floor and handmill help process grains etc. +optional_depends = default, farming, stairs, homedecor, intllib, trees, wool, moreblocks +author = Sokomine +title = Blocks for building cottages. diff --git a/mods/cottages/models/feldweg_45.b3d b/mods/cottages/models/feldweg_45.b3d new file mode 100644 index 00000000..3a0be88c Binary files /dev/null and b/mods/cottages/models/feldweg_45.b3d differ diff --git a/mods/cottages/models/feldweg_d_45.b3d b/mods/cottages/models/feldweg_d_45.b3d new file mode 100644 index 00000000..241ef482 Binary files /dev/null and b/mods/cottages/models/feldweg_d_45.b3d differ diff --git a/mods/cottages/models/feldweg_l_45_curve.b3d b/mods/cottages/models/feldweg_l_45_curve.b3d new file mode 100644 index 00000000..0b913c08 Binary files /dev/null and b/mods/cottages/models/feldweg_l_45_curve.b3d differ diff --git a/mods/cottages/models/feldweg_r_45_curve.b3d b/mods/cottages/models/feldweg_r_45_curve.b3d new file mode 100644 index 00000000..37119c32 Binary files /dev/null and b/mods/cottages/models/feldweg_r_45_curve.b3d differ diff --git a/mods/cottages/models/feldweg_s_45.b3d b/mods/cottages/models/feldweg_s_45.b3d new file mode 100644 index 00000000..b080d1a7 Binary files /dev/null and b/mods/cottages/models/feldweg_s_45.b3d differ diff --git a/mods/cottages/nodes_feldweg.lua b/mods/cottages/nodes_feldweg.lua index 92059526..fb516e9e 100644 --- a/mods/cottages/nodes_feldweg.lua +++ b/mods/cottages/nodes_feldweg.lua @@ -19,64 +19,322 @@ local cottages_feldweg_mode = minetest.settings:get("cottages_feldweg_mode") if( cottages_feldweg_mode ~= "mesh" and cottages_feldweg_mode ~= "flat" and cottages_feldweg_mode ~= "nodebox" - and cottages_feldweg_mode ~= "flat") then + and cottages_feldweg_mode ~= "mesh_incl_45") then cottages_feldweg_mode = "mesh"; -- add the setting to the minetest.conf so that the player can set it there minetest.settings:set("cottages_feldweg_mode", "mesh") end -local function register_recipes(include_end) + +-- make sure groups etc. are always the same +cottages.register_feldweg_node = function(node_name, def) + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,crumbly=2} + def.sounds = cottages.sounds.dirt + def.is_ground_content = false + + minetest.register_node(node_name, def) +end + + +local function register_recipes(include_end, postfix, base_craftitem) + if(not(postfix)) then + postfix = "" + end + if(not(base_craftitem)) then + base_craftitem = cottages.craftitem_dirt + end + local base_node = "cottages:feldweg"..postfix + + -- run a wagon wheel over dirt :-) minetest.register_craft({ - output = "cottages:feldweg_crossing 5", + output = base_node.." 4", recipe = { - {"", "cottages:feldweg", "" }, - {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"}, - {"", "cottages:feldweg", "" }, + {"", "cottages:wagon_wheel", "" }, + {base_craftitem, base_craftitem, base_craftitem} + }, + replacements = { {'cottages:wagon_wheel', 'cottages:wagon_wheel'}, } + }) + + + minetest.register_craft({ + output = "cottages:feldweg_crossing"..postfix.." 5", + recipe = { + {"", base_node, "" }, + {base_node, base_node, base_node}, + {"", base_node, "" }, }, }) minetest.register_craft({ - output = "cottages:feldweg_t_junction 5", + output = "cottages:feldweg_t_junction"..postfix.." 5", recipe = { - {"", "cottages:feldweg", "" }, - {"", "cottages:feldweg", "" }, - {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + {"", base_node, "" }, + {"", base_node, "" }, + {base_node, base_node, base_node} }, }) minetest.register_craft({ - output = "cottages:feldweg_curve 5", + output = "cottages:feldweg_curve"..postfix.." 5", recipe = { - {"cottages:feldweg", "", "" }, - {"cottages:feldweg", "", ""}, - {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + {base_node, "", "" }, + {base_node, "", ""}, + {base_node, base_node, base_node} }, }) if include_end then minetest.register_craft({ - output = "cottages:feldweg_end 5", + output = "cottages:feldweg_end"..postfix.." 5", recipe = { - {"cottages:feldweg", "", "cottages:feldweg" }, - {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + {base_node, "", base_node }, + {base_node, base_node, base_node} }, }) end + + -- if the 45 degree version is loaded + if(minetest.registered_nodes["cottages:feldweg_45"..postfix]) then + minetest.register_craft({ + output = "cottages:feldweg_45"..postfix, + recipe = {{base_node}} + }) + minetest.register_craft({ + output = "cottages:feldweg_l_curve"..postfix, + recipe = {{"cottages:feldweg_45"..postfix}} + }) + minetest.register_craft({ + output = "cottages:feldweg_r_curve"..postfix, + recipe = {{"cottages:feldweg_l_curve"..postfix}} + }) + minetest.register_craft({ + output = "cottages:feldweg_s_45"..postfix, + recipe = {{"cottages:feldweg_r_curve"..postfix}} + }) + minetest.register_craft({ + output = "cottages:feldweg_d_45"..postfix, + recipe = {{"cottages:feldweg_s_45"..postfix}} + }) + minetest.register_craft({ + output = "cottages:feldweg"..postfix, + recipe = {{"cottages:feldweg_d_45"..postfix}} + }) + end end +-- ignore_mode is unused here (exists just for compatibility with the _mesh version of the function) +cottages.register_nodes_slope = function(postfix, texture_top, texture_bottom, texture_side, ignore_mode, name_postfix, texture_side_with_dent, texture_edges) + if(not(postfix)) then + postfix = "" + end + local box_slope = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} + }}; + + local box_slope_long = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, -0.10, 0.5}, + {-0.5, -0.25, -1.3, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -1.0, 0.5, 0, 0.5}, + {-0.5, 0, -0.5, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.5, 0.5} + }}; + + cottages.register_feldweg_node("cottages:feldweg_slope"..postfix, { + description = S("dirt road slope"..name_postfix), + tiles = {texture_side_with_dent, + texture_side, texture_bottom, texture_top, + "cottages_feldweg_surface.png", + texture_edges}, + drawtype = "mesh", + mesh = "feldweg_slope.obj", + + collision_box = box_slope, + selection_box = box_slope, + }) + + + cottages.register_feldweg_node("cottages:feldweg_slope_long"..postfix, { + description = S("dirt road slope long"..name_postfix), + tiles = {texture_side_with_dent, + texture_side, texture_bottom, texture_top, + "cottages_feldweg_surface.png", + texture_edges}, + drawtype = "mesh", + mesh = "feldweg_slope_long.obj", + collision_box = box_slope_long, + selection_box = box_slope_long, + }) + + local base_node = "cottages:feldweg"..postfix + + minetest.register_craft({ + output = "cottages:feldweg_slope"..postfix.." 3", + recipe = { + {base_node, "", "" }, + {base_node, base_node, ""} + }, + }) + + minetest.register_craft({ + output = "cottages:feldweg_slope_long"..postfix.." 4", + recipe = { + {base_node, "", "" }, + {base_node, base_node, base_node} + }, + }) +end + +-- those can be offered in diffrent variants... +cottages.register_nodes_mesh = function(postfix, texture_top, texture_bottom, texture_side, cottages_feldweg_mode, name_postfix, texture_side_with_dent, texture_edges) + -- a nice dirt road for small villages or paths to fields + cottages.register_feldweg_node("cottages:feldweg"..postfix, { + description = S("dirt road"..name_postfix), + tiles = {texture_side_with_dent, + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + "cottages_feldweg_surface.png", + texture_edges}, + drawtype = "mesh", + mesh = "feldweg.obj", + }) + + + cottages.register_feldweg_node("cottages:feldweg_crossing"..postfix, { + description = S("dirt road crossing"..name_postfix), + tiles = {texture_side_with_dent, + --"default_dirt.png", "default_grass.png", + texture_bottom, texture_top, + "cottages_feldweg_surface.png", + texture_edges}, + drawtype = "mesh", + mesh = "feldweg-crossing.obj", + }) + + cottages.register_feldweg_node("cottages:feldweg_t_junction"..postfix, { + description = S("dirt road t junction"..name_postfix), + tiles = {texture_side_with_dent, + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + "cottages_feldweg_surface.png", + texture_edges}, + drawtype = "mesh", + mesh = "feldweg-T-junction.obj", + }) + + cottages.register_feldweg_node("cottages:feldweg_curve"..postfix, { + description = S("dirt road curve"..name_postfix), + tiles = { + -- "default_dirt.png^default_grass_side.png","default_grass.png", + texture_side, texture_top, + -- "default_dirt.png^default_grass_side.png", + texture_side, + "cottages_feldweg_surface.png", + -- "default_dirt.png", + texture_bottom, + texture_edges}, + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + drawtype = "mesh", + mesh = "feldweg-curve.obj", + }) + + cottages.register_feldweg_node("cottages:feldweg_end"..postfix, { + description = S("dirt road end"..name_postfix), + tiles = {texture_side_with_dent, + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + texture_edges, + "cottages_feldweg_surface.png"}, + drawtype = "mesh", + mesh = "feldweg_end.obj", + }) + + if( cottages_feldweg_mode ~= "mesh_incl_45" ) then + return + end + + -- new feldweg + cottages.register_feldweg_node("cottages:feldweg_45"..postfix, { + description = S("dirt road 45º"..name_postfix), + tiles = { + "cottages_feldweg_surface.png", + texture_edges, + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + }, + drawtype = "mesh", + mesh = "feldweg_45.b3d", + }) + + cottages.register_feldweg_node("cottages:feldweg_s_45"..postfix, { + description = S("dirt road 45º edge"..name_postfix), + tiles = { + -- "default_grass.png", "default_dirt.png^default_grass_side.png", "default_dirt.png", + texture_top, texture_side, texture_bottom, + "cottages_feldweg_surface.png", + texture_edges, + }, + drawtype = "mesh", + mesh = "feldweg_s_45.b3d", + }) + + cottages.register_feldweg_node("cottages:feldweg_d_45"..postfix, { + description = S("dirt road 45º double edge"..name_postfix), + tiles = { + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + texture_edges, + "cottages_feldweg_surface.png", + }, + drawtype = "mesh", + mesh = "feldweg_d_45.b3d", + }) + + cottages.register_feldweg_node("cottages:feldweg_l_curve"..postfix, { + description = S("dirt road left curve"..name_postfix), + tiles = { + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + texture_edges, + "cottages_feldweg_surface.png", + }, + drawtype = "mesh", + mesh = "feldweg_l_45_curve.b3d", + }) + + cottages.register_feldweg_node("cottages:feldweg_r_curve"..postfix, { + description = S("dirt road right curve"..name_postfix), + tiles = { + -- "default_dirt.png^default_grass_side.png", "default_dirt.png", "default_grass.png", + texture_side, texture_bottom, texture_top, + texture_edges, + "cottages_feldweg_surface.png", + }, + drawtype = "mesh", + mesh = "feldweg_r_45_curve.b3d", + }) +end + + + + --- a nice dirt road for small villages or paths to fields if( cottages_feldweg_mode == "simple" or cottages_feldweg_mode == "flat" ) then - minetest.register_node("cottages:feldweg", { + cottages.register_feldweg_node("cottages:feldweg", { description = S("dirt road"), tiles = {"cottages_feldweg.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, }) end @@ -87,37 +345,20 @@ end -- if( cottages_feldweg_mode == "flat" ) then - minetest.register_node("cottages:feldweg_crossing", { + cottages.register_feldweg_node("cottages:feldweg_crossing", { description = S("dirt road crossing"), tiles = {"cottages_feldweg_kreuzung.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, }) - minetest.register_node("cottages:feldweg_t_junction", { + cottages.register_feldweg_node("cottages:feldweg_t_junction", { description = S("dirt road t junction"), tiles = {"cottages_feldweg_t-kreuzung.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, }) - minetest.register_node("cottages:feldweg_curve", { + cottages.register_feldweg_node("cottages:feldweg_curve", { description = S("dirt road curve"), tiles = {"cottages_feldweg_ecke.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, }) register_recipes(false) @@ -125,15 +366,10 @@ if( cottages_feldweg_mode == "flat" ) then -- cube-style nodebox version -- elseif( cottages_feldweg_mode == "nodebox" ) then - minetest.register_node("cottages:feldweg", { + cottages.register_feldweg_node("cottages:feldweg", { description = S("dirt road"), tiles = {"cottages_feldweg_orig.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, paramtype2 = "facedir", - roups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, drawtype = "nodebox", -- top, bottom, side1, side2, inner, outer paramtype = "light", @@ -157,19 +393,11 @@ elseif( cottages_feldweg_mode == "nodebox" ) then }, }) - minetest.register_node("cottages:feldweg_crossing", { + cottages.register_feldweg_node("cottages:feldweg_crossing", { description = S("dirt road crossing"), tiles = {"cottages_feldweg_kreuzung.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - drawtype = "nodebox", -- top, bottom, side1, side2, inner, outer - paramtype = "light", node_box = { type = "fixed", fixed = { @@ -203,19 +431,11 @@ elseif( cottages_feldweg_mode == "nodebox" ) then }, }) - minetest.register_node("cottages:feldweg_t_junction", { + cottages.register_feldweg_node("cottages:feldweg_t_junction", { description = S("dirt road t junction"), tiles = {"cottages_feldweg_t-kreuzung.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - drawtype = "nodebox", -- top, bottom, side1, side2, inner, outer - paramtype = "light", node_box = { type = "fixed", fixed = { @@ -247,19 +467,10 @@ elseif( cottages_feldweg_mode == "nodebox" ) then }, }) - minetest.register_node("cottages:feldweg_curve", { + cottages.register_feldweg_node("cottages:feldweg_curve", { description = S("dirt road curve"), tiles = {"cottages_feldweg_ecke.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - drawtype = "nodebox", - -- top, bottom, side1, side2, inner, outer - paramtype = "light", node_box = { type = "fixed", fixed = { @@ -297,105 +508,82 @@ elseif( cottages_feldweg_mode == "nodebox" ) then -- -- the mesh version (rounded); provided and created by VanessaE -- -elseif( cottages_feldweg_mode == "mesh" ) then - - -- a nice dirt road for small villages or paths to fields - minetest.register_node("cottages:feldweg", { - description = S("dirt road"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", - "default_dirt.png", "default_grass.png", - "cottages_feldweg_surface.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg.obj", - }) +elseif( cottages_feldweg_mode == "mesh" + or cottages_feldweg_mode == "mesh_incl_45" ) then - minetest.register_node("cottages:feldweg_crossing", { - description = S("dirt road crossing"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png", - "default_grass.png","cottages_feldweg_surface.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg-crossing.obj", - }) + local variants = {} + variants["grass"] = { + "default_grass.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^default_grass_side.png", -- side + "", + "default:dirt", + "", + "cottages_feldweg_end.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png", + } + variants["gravel"] = { + "default_gravel.png", -- grass top + "default_gravel.png", -- bottom + "default_gravel.png", -- side + "_gravel", + "default:gravel", + " on gravel", + "default_gravel.png", + "cottages_feldweg_surface.png^default_gravel.png", + } + variants["coniferous"] = { + "default_coniferous_litter.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^default_coniferous_litter_side.png", -- side + "_coniferous", + "default:dirt_with_coniferous_litter", + " on coniferious litter", + "default_dirt.png^default_coniferous_litter_side.png", -- side with dent + "cottages_feldweg_surface.png^default_coniferous_litter.png", + } + variants["snow"] = { + "default_snow.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^default_snow_side.png", -- side + "_snow", + "default:dirt_with_snow", + " on snow", + "default_dirt.png^default_snow_side.png", -- side + "cottages_feldweg_surface.png^default_snow.png", + } + variants["dry"] = { + "default_dry_grass.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^default_dry_grass_side.png", -- side + "_dry", + "default:dry_dirt", + " on dry dirt", + "default_dirt.png^default_dry_grass_side.png", -- side + "cottages_feldweg_surface.png^default_dry_grass.png", + } + variants["bamboo"] = { + "ethereal_grass_bamboo_top.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^ethereal_grass_bamboo_side.png", -- side + "_bamboo", + "ethereal:bamboo_dirt", + " on bamboo dirt", + "default_dirt.png^ethereal_grass_bamboo_side.png", -- side + "cottages_feldweg_surface.png^ethereal_grass_bamboo_top.png", + } - - - minetest.register_node("cottages:feldweg_t_junction", { - description = S("dirt road t junction"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", "default_dirt.png", - "default_grass.png","cottages_feldweg_surface.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg-T-junction.obj", - }) - - - - minetest.register_node("cottages:feldweg_curve", { - description = S("dirt road curve"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"default_dirt.png^default_grass_side.png","default_grass.png", - "default_dirt.png^default_grass_side.png","cottages_feldweg_surface.png", - "default_dirt.png","cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg-curve.obj", - }) - - - - minetest.register_node("cottages:feldweg_end", { - description = S("dirt road end"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", - "default_dirt.png", "default_grass.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png", - "cottages_feldweg_surface.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg_end.obj", - }) - - - register_recipes(true) - - + for k, v in pairs(variants) do + cottages.register_nodes_mesh(v[4], v[1], v[2], v[3], cottages_feldweg_mode, v[6], v[7], v[8]) + register_recipes(true, v[4], v[5]) + -- register the two slope nodes + cottages.register_nodes_slope(v[4], v[1], v[2], v[3], cottages_feldweg_mode, v[6], v[7], v[8]) + end end + -- create stairs if possible if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab) then stairs.register_stair_and_slab("feldweg", "cottages:feldweg", @@ -406,81 +594,19 @@ if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab cottages.sounds.dirt) end -if( cottages_feldweg_mode == "nodebox" or cottages_feldweg_mode == "mesh" ) then - local box_slope = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, - {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.25, 0.5}, - {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} - }}; - - local box_slope_long = { - type = "fixed", - fixed = { - {-0.5, -0.5, -1.5, 0.5, -0.10, 0.5}, - {-0.5, -0.25, -1.3, 0.5, -0.25, 0.5}, - {-0.5, -0.25, -1.0, 0.5, 0, 0.5}, - {-0.5, 0, -0.5, 0.5, 0.25, 0.5}, - {-0.5, 0.25, 0, 0.5, 0.5, 0.5} - }}; - - minetest.register_node("cottages:feldweg_slope", { - description = S("dirt road slope"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", - "default_dirt.png", "default_grass.png", - "cottages_feldweg_surface.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg_slope.obj", - - collision_box = box_slope, - selection_box = box_slope, - }) - - - - minetest.register_node("cottages:feldweg_slope_long", { - description = S("dirt road slope long"), - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - groups = {crumbly=3}, - sounds = cottages.sounds.dirt, - is_ground_content = false, - tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", - "default_dirt.png", "default_grass.png", - "cottages_feldweg_surface.png", - "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, - paramtype = "light", - drawtype = "mesh", - mesh = "feldweg_slope_long.obj", - collision_box = box_slope_long, - selection_box = box_slope_long, - }) - - - minetest.register_craft({ - output = "cottages:feldweg_slope 3", - recipe = { - {"cottages:feldweg", "", "" }, - {"cottages:feldweg", "cottages:feldweg", ""} - }, - }) - - minetest.register_craft({ - output = "cottages:feldweg_slope_long 4", - recipe = { - {"cottages:feldweg", "", "" }, - {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} - }, - }) +if( cottages_feldweg_mode == "nodebox") then + local variants = {} + variants["grass"] = { + "default_grass.png", -- grass top + "default_dirt.png", -- bottom + "default_dirt.png^default_grass_side.png", -- side + "", + "default:dirt", + "", + "cottages_feldweg_end.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png", + } + for k, v in pairs(variants) do + cottages.register_nodes_slope(v[4], v[1], v[2], v[3], cottages_feldweg_mode, v[6], v[7], v[8]) + end end diff --git a/mods/cottages/nodes_historic.lua b/mods/cottages/nodes_historic.lua index af8aa3a0..f88703f0 100644 --- a/mods/cottages/nodes_historic.lua +++ b/mods/cottages/nodes_historic.lua @@ -82,6 +82,7 @@ minetest.register_node("cottages:glass_pane", { tiles = {"cottages_glass_pane.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, node_box = { type = "fixed", @@ -106,6 +107,7 @@ minetest.register_node("cottages:glass_pane_side", { tiles = {"cottages_glass_pane.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, node_box = { type = "fixed", @@ -202,16 +204,6 @@ minetest.register_craft({ } }) --- run a wagon wheel over dirt :-) -minetest.register_craft({ - output = "cottages:feldweg 4", - recipe = { - {"", "cottages:wagon_wheel", "" }, - {cottages.craftitem_dirt,cottages.craftitem_dirt,cottages.craftitem_dirt } - }, - replacements = { {'cottages:wagon_wheel', 'cottages:wagon_wheel'}, } -}) - minetest.register_craft({ output = "cottages:loam 4", recipe = { diff --git a/mods/currency/.luacheckrc b/mods/currency/.luacheckrc new file mode 100644 index 00000000..1d23b4ad --- /dev/null +++ b/mods/currency/.luacheckrc @@ -0,0 +1,21 @@ +unused = false + +globals = { + "currency", "barter", + "default" +} + +read_globals = { + -- Lua + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + -- Minetest + "minetest", + "PseudoRandom", "ItemStack", + "VoxelArea", "VoxelManip", + "Settings", "vector", + + -- Mods + "loot", "pipeworks" +} diff --git a/mods/currency/barter.lua b/mods/currency/barter.lua index 79b21242..ffc37681 100644 --- a/mods/currency/barter.lua +++ b/mods/currency/barter.lua @@ -47,8 +47,8 @@ barter.chest.check_privilege = function(listname,playername,meta) end barter.chest.update_formspec = function(meta) - formspec = barter.chest.formspec.main - pl_formspec = function (n) + local formspec = barter.chest.formspec.main + local pl_formspec = function (n) if meta:get_int(n.."step")==0 then formspec = formspec .. barter.chest.formspec[n].start else @@ -65,9 +65,9 @@ barter.chest.update_formspec = function(meta) end barter.chest.give_inventory = function(inv,list,playername) - player = minetest.get_player_by_name(playername) + local player = minetest.get_player_by_name(playername) if player then - for k,v in ipairs(inv:get_list(list)) do + for _,v in ipairs(inv:get_list(list)) do if player:get_inventory():room_for_item("main",v) then player:get_inventory():add_item("main",v) else @@ -113,9 +113,11 @@ minetest.register_node("currency:barter", { description = S("Barter Table"), paramtype = "light", paramtype2 = "facedir", - tiles = {"barter_top.png", - "barter_base.png", - "barter_side.png"}, + tiles = { + "barter_top.png", + "barter_base.png", + "barter_side.png" + }, inventory_image = "barter_top.png", node_box = { type = "fixed", @@ -128,6 +130,7 @@ minetest.register_node("currency:barter", { }, }, groups = {choppy=2,oddly_breakable_by_hand=2}, + is_ground_content = false, sounds = currency.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -144,7 +147,7 @@ minetest.register_node("currency:barter", { on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) barter.chest.start_timer(pos, meta) - pl_receive_fields = function(n) + local pl_receive_fields = function(n) if fields[n.."_start"] and meta:get_string(n) == "" then meta:set_string(n,sender:get_player_name()) end diff --git a/mods/currency/income.lua b/mods/currency/income.lua index 8f2354b4..f7012034 100644 --- a/mods/currency/income.lua +++ b/mods/currency/income.lua @@ -41,10 +41,10 @@ if income_enabled then if not player or player.is_fake_player then return end local name = player:get_player_name() - local income_count = players_income[name] - if income_count and income_count > 0 then + local ic = players_income[name] + if ic and ic > 0 then local inv = player:get_inventory() - inv:add_item("main", {name=income_item, count=income_count}) + inv:add_item("main", {name=income_item, count=ic}) players_income[name] = nil minetest.log("info", "[Currency] added basic income for "..name.." to inventory") end diff --git a/mods/currency/locale/currency.id.tr b/mods/currency/locale/currency.id.tr new file mode 100644 index 00000000..13a0dfc4 --- /dev/null +++ b/mods/currency/locale/currency.id.tr @@ -0,0 +1,45 @@ +# textdomain: currency + + +### barter.lua ### + +Barter Table=Meja Barter +Cancel=Batal +Confirm=Sah +Start=Mulai + +### shop.lua ### + +Exchange=Tukar + +### craftitems.lua ### + +@1 Minegeld Note=Uang @1 Minegeld +@1 Minegeld cent coin=Koin @1 Sen Minegeld +Bundle of random Minegeld notes=Bundel Uang Minegeld Acak + +### safe.lua ### + +Safe=Brankas +Safe (owned by @1)=Brankas (dimiliki oleh @1) + +### shop.lua ### + +Customer gets:=Pelanggan dapat: +Customer gives (pay here!)=Pelanggan memberi (bayar di sini!) +Customers gave:=Pelanggan memberi: +Exchange can not be done, check if you put all items!=Penukaran tidak dapat diselesaikan. Periksa bahwa Anda menaruh semua yang pemilik inginkan! +Exchange can not be done, contact the shop owner.=Penukaran tidak dapat diselesaikan. Hubungi pemilik toko. +Exchange shop (owned by @1)=Toko Penukaran (dimiliki oleh @1) +Exchanged!=Ditukar! +In exchange, you give:=Anda memberi: +out of stock=stok habis +Owner gives:=Pemilik memberi: +Owner wants:=Pemilik ingin: + +Owner, Use (E)+Place (right mouse button) for customer interface=Pemilik. Tekan (E) + Taruh (klik kanan) untuk tampilan pelanggan + +Shop=Toko +This is your own shop, you can't exchange to yourself!=Ini toko milik Anda. Anda tidak bisa bertukar dengan diri sendiri! +You want:=Anda ingin: +Your stock:=Stok Anda: diff --git a/mods/currency/shop.lua b/mods/currency/shop.lua index f87cc6d2..154ffa08 100644 --- a/mods/currency/shop.lua +++ b/mods/currency/shop.lua @@ -41,7 +41,7 @@ currency.shop.formspec = { local have_pipeworks = minetest.global_exists("pipeworks") -currency.shop.check_privilege = function(listname,playername,meta) +currency.shop.check_privilege = function(listname, playername, meta) --[[if listname == "pl1" then if playername ~= meta:get_string("pl1") then return false @@ -60,12 +60,12 @@ currency.shop.check_privilege = function(listname,playername,meta) end -currency.shop.give_inventory = function(inv,list,playername) - player = minetest.get_player_by_name(playername) +currency.shop.give_inventory = function(inv, list, playername) + local player = minetest.get_player_by_name(playername) if player then - for k,v in ipairs(inv:get_list(list)) do - player:get_inventory():add_item("main",v) - inv:remove_item(list,v) + for k, v in ipairs(inv:get_list(list)) do + player:get_inventory():add_item("main", v) + inv:remove_item(list, v) end end end @@ -88,87 +88,57 @@ currency.shop.exchange = function(meta) meta:set_int("pl2step",0)]] end -local check_stock = function( - pos -) - local meta = minetest.get_meta( - pos - ) - local minv = meta:get_inventory( - ) - local gives = minv:get_list( - "owner_gives" - ) +local check_stock = function(pos) + local meta = minetest.get_meta(pos) + local minv = meta:get_inventory() + local gives = minv:get_list("owner_gives") local can_exchange = true - for i, item in pairs( - gives - ) do - if not minv:contains_item( - "stock", - item - ) then + for i, item in pairs(gives) do + if not minv:contains_item("stock", item) then can_exchange = false end end - local owner = meta:get_string( - "owner" - ) + local owner = meta:get_string("owner") if can_exchange then - meta:set_string( - "infotext", - S( - "Exchange shop (owned by @1)", - owner - ) + meta:set_string("infotext", + S("Exchange shop (owned by @1)", owner) ) local applicable = "currency:shop" - local node = minetest.get_node( - pos - ) + local node = minetest.get_node(pos) if node.name == applicable then return end node.name = applicable - minetest.swap_node( - pos, - node - ) + minetest.swap_node(pos, node) else - meta:set_string( - "infotext", - S( - "Exchange shop (owned by @1)", - owner - ) .. ", " .. S( - "out of stock" - ) + meta:set_string("infotext", + S("Exchange shop (owned by @1)", owner) + .. ", " .. S("out of stock") ) local applicable = "currency:shop_empty" - local node = minetest.get_node( - pos - ) + local node = minetest.get_node(pos) if node.name == applicable then return end node.name = applicable - minetest.swap_node( - pos, - node - ) + minetest.swap_node(pos, node) end end minetest.register_node("currency:shop", { description = S("Shop"), paramtype2 = "facedir", - tiles = {"shop_top.png", - "shop_top.png", - "shop_side.png", - "shop_side.png", - "shop_side.png", - "shop_front.png"}, + tiles = { + "shop_top.png", + "shop_top.png", + "shop_side.png", + "shop_side.png", + "shop_side.png", + "shop_front.png" + }, inventory_image = "shop_front.png", groups = {choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1}, + is_ground_content = false, sounds = currency.node_sound_wood_defaults(), after_place_node = function(pos, placer, itemstack) local owner = placer:get_player_name() @@ -183,22 +153,18 @@ minetest.register_node("currency:shop", { inv:set_size("owner_wants", 3*2) inv:set_size("owner_gives", 3*2) if have_pipeworks then pipeworks.after_place(pos) end - check_stock( - pos - ) + check_stock(pos) end, after_dig_node = (have_pipeworks and pipeworks and pipeworks.after_dig), tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - local result = inv:add_item("stock",stack) - check_stock( - pos - ) + local result = inv:add_item("stock", stack) + check_stock(pos) return result end, - can_insert = function(pos,node,stack,direction) + can_insert = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() return inv:room_for_item("stock", stack) @@ -238,31 +204,35 @@ minetest.register_node("currency:shop", { can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - return inv:is_empty("stock") and inv:is_empty("customers_gave") and inv:is_empty("owner_wants") and inv:is_empty("owner_gives") + return inv:is_empty("stock") and + inv:is_empty("customers_gave") and + inv:is_empty("owner_wants") and + inv:is_empty("owner_gives") end }) minetest.register_node("currency:shop_empty", { description = S("Shop") .. " (" .. S("out of stock") .. ")", paramtype2 = "facedir", - tiles = {"shop_top.png", - "shop_top.png", - "shop_side_empty.png", - "shop_side_empty.png", - "shop_side_empty.png", - "shop_front_empty.png"}, + tiles = { + "shop_top.png", + "shop_top.png", + "shop_side_empty.png", + "shop_side_empty.png", + "shop_side_empty.png", + "shop_front_empty.png" + }, drop = "currency:shop", groups = {choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1,not_in_creative_inventory=1}, + is_ground_content = false, sounds = currency.node_sound_wood_defaults(), after_dig_node = (have_pipeworks and pipeworks and pipeworks.after_dig), tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - local result = inv:add_item("stock",stack) - check_stock( - pos - ) + local result = inv:add_item("stock", stack) + check_stock(pos) return result end, can_insert = function(pos,node,stack,direction) @@ -305,7 +275,10 @@ minetest.register_node("currency:shop_empty", { can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - return inv:is_empty("stock") and inv:is_empty("customers_gave") and inv:is_empty("owner_wants") and inv:is_empty("owner_gives") + return inv:is_empty("stock") and + inv:is_empty("customers_gave") and + inv:is_empty("owner_wants") and + inv:is_empty("owner_gives") end }) @@ -333,29 +306,28 @@ minetest.register_on_player_receive_fields(function(sender, formname, fields) local can_exchange = true local owners_fault = false for i, item in pairs(wants) do - if not pinv:contains_item("customer_gives",item) then + if not pinv:contains_item("customer_gives", item) then can_exchange = false end end for i, item in pairs(gives) do - if not minv:contains_item("stock",item) then + if not minv:contains_item("stock", item) then can_exchange = false owners_fault = true end end if can_exchange then + local it for i, item in pairs(wants) do - pinv:remove_item("customer_gives",item) - minv:add_item("customers_gave",item) + it = pinv:remove_item("customer_gives", item) + minv:add_item("customers_gave", it) end for i, item in pairs(gives) do - minv:remove_item("stock",item) - pinv:add_item("customer_gets",item) + it = minv:remove_item("stock", item) + pinv:add_item("customer_gets", it) end minetest.chat_send_player(name, S("Exchanged!")) - check_stock( - pos - ) + check_stock(pos) else if owners_fault then minetest.chat_send_player(name, S("Exchange can not be done, contact the shop owner.")) diff --git a/mods/death_compass/locale/death_compass.ru.tr b/mods/death_compass/locale/death_compass.ru.tr new file mode 100644 index 00000000..c381951d --- /dev/null +++ b/mods/death_compass/locale/death_compass.ru.tr @@ -0,0 +1,30 @@ +# textdomain: death_compass + + +### init.lua ### + +# String used for concatenating the "days, hours, minutes" strings together into a duration description. +, =, +1 day=1 день +1 hour=1 час +1 minute=1 минута +1 second=1 секунда +# string used when there's just two elements of the "hours and minutes" duration description +@1 and @2=@1 и @2 +@1 days=@1 дней +@1 hours=@1 часов +@1 minutes=@1 минут +@1 seconds=@1 секунд +# @1 is a numeric distance in meters, @2 is the name of a player, @3 is a duration +@1m to @2's corpse, @3 remaining=@1 м до костей @2, @3 осталось +# @1 is a numeric distance in meters, @2 is the name of a player, @3 is a duration +@1m to @2's corpse, died @3 ago=@1 м до костей @2, умер @3 назад +Death Compass=Компас смерти + +The Death Compass will point toward your corpse until you find it.=Компас смерти будет указывать на кости до тех пор пока вы их не найдете. + +# @1 is a duration +The Death Compass' guidance will only last for @1 after death.=Руководство по компасу смерти будет действовать @1 после смерти + +This does nothing in its current inert state. If you have this in your inventory when you die, however, it will follow you into your next life's inventory and point toward the location of your previous life's end.=Он ничего не делает в текущем состоянии. Если вы имели его в своем инвенторе во время смерти, то он будет в вашем инвенторе после вашего возрождения и будет указывать вам на ваше место смерти. + diff --git a/mods/digilines/.luacheckrc b/mods/digilines/.luacheckrc new file mode 100644 index 00000000..d12836dd --- /dev/null +++ b/mods/digilines/.luacheckrc @@ -0,0 +1,19 @@ + +read_globals = { + "vector", + "screwdriver", + "minetest", + "default", + "pipeworks", + "dump", + "VoxelArea", + "ItemStack", +} + +globals = { + "digilines", + "tubelib", + "tubelib2", + "mcl_sounds", + "mcl_formspec" +} diff --git a/mods/digilines/LICENSE.txt b/mods/digilines/LICENSE.txt new file mode 100644 index 00000000..9569df7d --- /dev/null +++ b/mods/digilines/LICENSE.txt @@ -0,0 +1,188 @@ +The LGPLv3 applies to all code in this project. +The WTFPL applies to textures and any other content in this project which is not source code. + +============================================================= + +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. + + +============================================================= + + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/digilines/README.md b/mods/digilines/README.md new file mode 100644 index 00000000..a6c14054 --- /dev/null +++ b/mods/digilines/README.md @@ -0,0 +1,17 @@ +Digilines +========== + +[![Build status](https://github.com/minetest-mods/digilines/workflows/build/badge.svg)](https://github.com/minetest-mods/digilines/actions) + +- The minetest counterpart for bus systems like i2c, SPI, RS232, USB - +- Minetest 5.0.0+ is required to use this mod. + +This mod adds digiline wires, an RTC (Real Time Clock), a light sensor as well as an LCD Screen. +Can be used together with the luacontroller from mesecons. See the luacontroller manual for more information. + +Send "GET" to RTC or light sensor to retrieve Data, send any text to LCD to display it. +Select channel by right-clicking items. + +License: + Code: LGPL + Textures: WTFPL diff --git a/mods/digilines/characters b/mods/digilines/characters new file mode 100644 index 00000000..b36eea4c --- /dev/null +++ b/mods/digilines/characters @@ -0,0 +1,282 @@ +A +_a_ +7 +B +_b_ +5 +C +_c_ +6 +D +_d_ +6 +E +_e_ +5 +F +_f_ +5 +G +_g_ +6 +H +_h_ +6 +I +_i_ +1 +J +_j_ +4 +K +_k_ +5 +L +_l_ +4 +M +_m_ +7 +N +_n_ +6 +O +_o_ +6 +P +_p_ +5 +Q +_q_ +7 +R +_r_ +5 +S +_s_ +5 +T +_t_ +5 +U +_u_ +6 +V +_v_ +7 +W +_w_ +9 +X +_x_ +5 +Y +_y_ +7 +Z +_z_ +5 +a +_a +5 +b +_b +5 +c +_c +4 +d +_d +5 +e +_e +4 +f +_f +4 +g +_g +5 +h +_h +5 +i +_i +1 +j +_j +1 +k +_k +4 +l +_l +1 +m +_m +7 +n +_n +5 +o +_o +5 +p +_p +5 +q +_q +5 +r +_r +3 +s +_s +4 +t +_t +3 +u +_u +4 +v +_v +5 +w +_w +7 +x +_x +5 +y +_y +4 +z +_z +4 + +_sp +2 +0 +_0 +4 +1 +_1 +2 +2 +_2 +4 +3 +_3 +4 +4 +_4 +4 +5 +_5 +4 +6 +_6 +4 +7 +_7 +4 +8 +_8 +4 +9 +_9 +4 +( +_bl +2 +) +_br +2 +{ +_cl +3 +} +_cr +3 +[ +_sl +2 +] +_sr +2 +' +_ap +1 +! +_ex +1 +? +_qu +4 +@ +_at +5 +# +_hs +5 +$ +_dl +4 +% +_pr +5 +^ +_ca +3 +& +_am +5 +* +_as +3 +_ +_un +3 ++ +_ps +3 +- +_mn +3 += +_eq +3 +; +_sm +1 +: +_co +1 +, +_cm +2 +" +_qo +3 +/ +_dv +5 +~ +_tl +4 +< +_lt +3 +> +_gt +3 +\ +_re +5 +| +_vb +1 +. +_dt +1 diff --git a/mods/digilines/docs/chest.md b/mods/digilines/docs/chest.md new file mode 100644 index 00000000..7632c19f --- /dev/null +++ b/mods/digilines/docs/chest.md @@ -0,0 +1,123 @@ +Digiline Chest is a chest which allows to notify about different inventory actions via Digiline messages. + +## Available messages + +``` +{ + action = "empty" +} +``` +The message is sent when the chest has just become empty. + +---------------------------- + +``` +{ + action = "full", + stack = +} +``` +The message is sent when the chest has become full for a particular item specified in ``. + +---------------------------- + +``` +{ + action = "toverflow", + stack = , + side = +} +``` +The message is sent when the chest cannot accept a `` delivered by tube connected to the `` because the chest is full. + +---------------------------- + +``` +{ + action = "tput", + stack = , + to_slot = , + side = +} +``` +The message is sent when the chest accepts a ``, delivered by tube which is connected to ``, to slot ``. + +---------------------------- + +``` +{ + action = "ttake", + stack = , + from_slot = , + side = +} +``` +The message is sent when a tube connected to the chest to `` extracts a `` from slot ``. + +---------------------------- + +``` +{ + action = "umove", + stack = , + from_slot = , + to_slot = +} +``` +The message is sent when user moves `` from `` to `` within the chest. + +---------------------------- + +``` +{ + action = "uswap", + x_stack = , + x_slot = , + y_stack = , + y_slot = +} +``` +The message is sent when user swaps `` in `` with `` in `` within the chest. + +---------------------------- + +``` +{ + action = "utake", + stack = , + from_slot = +} +``` +The message is sent when user takes `` from `` in the chest. + +---------------------------- + +``` +{ + action = "uput", + stack = , + to_slot = +} +``` +The message is sent when user puts `` to the chest to `` + +### Fields used within the messages + +| Field | Description | +| ----- | ----------- | +| `` | A table which contains data about the stack, and corresponds to the format returned by the :to_table() method of ItemStack (check the Minetest API documentation). | +| ``, ``, ``, `` | The index of the corresponding slot starting from 1. | +| `` | A vector represented as a table of format `{ x = , y = , z = }` which represent the direction from which the tube is connected to the chest. | + +## Additional information + +The inventory is also compatible with [`tubelib`](https://github.com/joe7575/techpack/tree/master/tubelib), which generally works in the same way as [`pipeworks`](https://gitlab.com/VanessaE/pipeworks) but transfers happen immediately and do not "bounce". This means that the messages should be identical to the messages sent by [`pipeworks`](https://gitlab.com/VanessaE/pipeworks), except that items will not send the "toverflow" message when they cannot fit. +One oddity is that "ttake" messages will be asynchronous because, if an item does not fit in the chest, the event will need to be canceled. This means that it is possible (though highly unlikely) to recieve a "tput" message into a slot which you have not yet recieved a "ttake" message for, there will not actually be two stacks in the same slot, though it may briefly appear that way until the "ttake" message is recieved. + +## To do + +- make chest.lua a mixin that gets both default and locked chests +- digiline aware furnaces +- digiline aware technic machines, grinders, alloy furnaces, etc +- the pipes going into the chests don't snap to the pipe holes in the digiline chests. They still act fine as pipeworks destinations though. +- digiline chests seem to be immune to filters. But it's late and I'm shipping this. Someone else can figure out why the chests aren't acting like pipeworks chests, despite cloning the pipeworks chest's object. Oh who am I kidding. I'll do it myself I guess, once I've lost hope of aid again. diff --git a/mods/digilines/init.lua b/mods/digilines/init.lua new file mode 100644 index 00000000..a0ea69cd --- /dev/null +++ b/mods/digilines/init.lua @@ -0,0 +1,101 @@ +digilines = {} +digilines.S = minetest.get_translator("digilines") + +digilines.mcl = minetest.get_modpath("mcl_core") + +-- sounds check +if minetest.get_modpath("default") then digilines.sounds = default end +if digilines.mcl then digilines.sounds = mcl_sounds end + + +-- Backwards compatibility code. +-- We define a proxy table whose methods can be called with the +-- `foo:bar` notation, and it will redirect the call to the +-- real function, dropping the first implicit argument. +local digiline; digiline = setmetatable({}, { + __index = function(_, k) + -- Get method from real table. + local v = digilines[k] + if type(v) == "function" then + -- We need to wrap functions in order to ignore + -- the implicit `self` argument. + local f = v + return function(self, ...) + -- Trap invalid calls of the form `digiline.foo(...)`. + assert(self == digiline) + return f(...) + end + end + return v + end, +}) +rawset(_G, "digiline", digiline) + +-- Let's test our proxy table. +function digilines._testproxy(x) + return x +end + +-- Test using old `digiline:foobar` form. +assert(digiline:_testproxy("foobar") == "foobar") + +-- Test using new `digilines.foobar` form. +assert(digilines._testproxy("foobar") == "foobar") + +-- Test calling incorrect form raises an error. +assert(not pcall(function() digiline._testproxy("foobar") end)) + +local modpath = minetest.get_modpath("digilines") +dofile(modpath .. "/presetrules.lua") +dofile(modpath .. "/util.lua") +dofile(modpath .. "/internal.lua") +dofile(modpath .. "/wires_common.lua") +dofile(modpath .. "/wire_std.lua") + +function digilines.receptor_send(pos, rules, channel, msg) + local checked = {} + checked[minetest.hash_node_position(pos)] = true -- exclude itself + for _,rule in ipairs(rules) do + if digilines.rules_link(pos, digilines.addPosRule(pos, rule)) then + digilines.transmit(digilines.addPosRule(pos, rule), channel, msg, checked) + end + end +end + +local fiber = "mesecons_materials:fiber" +local insulated = "mesecons_insulated:insulated_off" +local gold_ingot = "default:gold_ingot" + +if digilines.mcl then + gold_ingot = "mcl_core:gold_ingot" + -- MCL dont support mesecons insulated + if not minetest.get_modpath("mesecons_insulated") then + insulated = "mesecons:redstone" + end +end + +minetest.register_craft({ + output = 'digilines:wire_std_00000000 2', + recipe = { + {fiber, fiber, fiber}, + {insulated, insulated, gold_ingot}, + {fiber, fiber, fiber}, + } +}) + +-- For minetest 0.4 support returned nil are also tested: ~= false +if minetest.settings:get_bool("digilines_enable_inventory", true) ~= false then + dofile(modpath .. "/inventory.lua") +end + +if minetest.settings:get_bool("digilines_enable_lcd", true) ~= false then + dofile(modpath .. "/lcd.lua") +end + +if minetest.settings:get_bool("digilines_enable_lightsensor", true) ~= false then + dofile(modpath .. "/lightsensor.lua") +end + +if minetest.settings:get_bool("digilines_enable_rtc", true) ~= false then + dofile(modpath .. "/rtc.lua") +end diff --git a/mods/digilines/internal.lua b/mods/digilines/internal.lua new file mode 100644 index 00000000..c9860b6b --- /dev/null +++ b/mods/digilines/internal.lua @@ -0,0 +1,126 @@ +function digilines.getspec(node) + local def = minetest.registered_nodes[node.name] + if not def then return false end + return def.digilines or def.digiline +end + +function digilines.importrules(spec, node) + if type(spec) == 'function' then + return spec(node) + elseif spec then + return spec + else + return digilines.rules.default + end +end + +function digilines.getAnyInputRules(pos) + local node = digilines.get_node_force(pos) + local spec = digilines.getspec(node) + if not spec then return end + + if spec.wire then + return digilines.importrules(spec.wire.rules, node) + end + if spec.effector then + return digilines.importrules(spec.effector.rules, node) + end +end + +function digilines.getAnyOutputRules(pos) + local node = digilines.get_node_force(pos) + local spec = digilines.getspec(node) + if not spec then return end + + if spec.wire then + return digilines.importrules(spec.wire.rules, node) + end + if spec.receptor then + return digilines.importrules(spec.receptor.rules, node) + end +end + +function digilines.rules_link(output, input) + local outputrules = digilines.getAnyOutputRules(output) + local inputrules = digilines.getAnyInputRules (input) + + if not outputrules or not inputrules then return false end + + + for _, orule in ipairs(outputrules) do + if digilines.cmpPos(digilines.addPosRule(output, orule), input) then + for _, irule in ipairs(inputrules) do + if digilines.cmpPos(digilines.addPosRule(input, irule), output) then + return true + end + end + end + end + return false +end + +function digilines.rules_link_anydir(output, input) + return digilines.rules_link(output, input) + or digilines.rules_link(input, output) +end + +local function queue_new() + return {nextRead = 1, nextWrite = 1} +end + +local function queue_empty(queue) + return queue.nextRead == queue.nextWrite +end + +local function queue_enqueue(queue, object) + local nextWrite = queue.nextWrite + queue[nextWrite] = object + queue.nextWrite = nextWrite + 1 +end + +local function queue_dequeue(queue) + local nextRead = queue.nextRead + local object = queue[nextRead] + queue[nextRead] = nil + queue.nextRead = nextRead + 1 + return object +end + +function digilines.transmit(pos, channel, msg, checked) + local checkedID = minetest.hash_node_position(pos) + if checked[checkedID] then + return + end + checked[checkedID] = true + + digilines.vm_begin() + local queue = queue_new() + queue_enqueue(queue, pos) + while not queue_empty(queue) do + local curPos = queue_dequeue(queue) + local node = digilines.get_node_force(curPos) + local spec = digilines.getspec(node) + if spec then + -- Effector actions --> Receive + if spec.effector then + spec.effector.action(curPos, node, channel, msg) + end + + -- Cable actions --> Transmit + if spec.wire then + local rules = digilines.importrules(spec.wire.rules, node) + for _, rule in ipairs(rules) do + local nextPos = digilines.addPosRule(curPos, rule) + if digilines.rules_link(curPos, nextPos) then + local checkedID2 = minetest.hash_node_position(nextPos) + if not checked[checkedID2] then + checked[checkedID2] = true + queue_enqueue(queue, nextPos) + end + end + end + end + end + end + digilines.vm_end() +end diff --git a/mods/digilines/inventory.lua b/mods/digilines/inventory.lua new file mode 100644 index 00000000..0004954f --- /dev/null +++ b/mods/digilines/inventory.lua @@ -0,0 +1,427 @@ +local S = digilines.S + +local pipeworks_enabled = minetest.get_modpath("pipeworks") ~= nil + +-- Sends a message onto the Digilines network. +-- pos: the position of the Digilines chest node. +-- action: the action string indicating what happened. +-- stack: the ItemStack that the action acted on (optional). +-- from_slot: the slot number that is taken from (optional). +-- to_slot: the slot number that is put into (optional). +-- side: which side of the chest the action occurred (optional). +local function send_message(pos, action, stack, from_slot, to_slot, side) + local channel = minetest.get_meta(pos):get_string("channel") + local msg = { + action = action, + stack = stack and stack:to_table(), + from_slot = from_slot, + to_slot = to_slot, + -- Duplicate the vector in case the caller expects it not to change. + side = side and vector.new(side) + } + digilines.receptor_send(pos, digilines.rules.default, channel, msg) +end + +-- Checks if the inventory has become empty and, if so, sends an empty message. +local function check_empty(pos) + if minetest.get_meta(pos):get_inventory():is_empty("main") then + send_message(pos, "empty") + end +end + +-- Checks if the inventory has become full for a particular type of item and, +-- if so, sends a full message. +local function check_full(pos, stack) + local one_item_stack = ItemStack(stack) + one_item_stack:set_count(1) + if not minetest.get_meta(pos):get_inventory():room_for_item("main", one_item_stack) then + send_message(pos, "full", one_item_stack) + end +end + +local tubeconn = pipeworks_enabled and "^pipeworks_tube_connection_wooden.png" or "" +local tubescan = pipeworks_enabled and function(pos) pipeworks.scan_for_tube_objects(pos) end or nil + +-- A place to remember things from allow_metadata_inventory_put to +-- on_metadata_inventory_put. This is a hack due to issue +-- minetest/minetest#6534 that should be removed once that’s fixed. +local last_inventory_put_index +local last_inventory_put_stack + +-- A place to remember things from allow_metadata_inventory_take to +-- tube.remove_items. This is a hack due to issue minetest-mods/pipeworks#205 +-- that should be removed once that’s fixed. +local last_inventory_take_index + +local tube_can_insert = function(pos, _, stack, direction) + local ret = minetest.get_meta(pos):get_inventory():room_for_item("main", stack) + if not ret then + -- The stack cannot be accepted. It will never be passed to + -- insert_object, but it should be reported as a toverflow. + -- Here, direction = direction item is moving, which is into + -- side. + local side = vector.multiply(direction, -1) + send_message(pos, "toverflow", stack, nil, nil, side) + end + return ret +end + +local tube_insert_object = function(pos, _, original_stack, direction) + -- Here, direction = direction item is moving, which is into side. + local side = vector.multiply(direction, -1) + local inv = minetest.get_meta(pos):get_inventory() + local inv_contents = inv:get_list("main") + local any_put = false + local stack = original_stack + local stack_name = stack:get_name() + local stack_count = stack:get_count() + -- Walk the inventory, adding items to existing stacks of the same + -- type. + for i = 1, #inv_contents do + local existing_stack = inv_contents[i] + if not existing_stack:is_empty() and existing_stack:get_name() == stack_name then + local leftover = existing_stack:add_item(stack) + local leftover_count = leftover:get_count() + if leftover_count ~= stack_count then + -- We put some items into the slot. Update the slot in + -- the inventory, tell Digilines listeners about it, + -- and keep looking for the a place to put the + -- leftovers if any. + any_put = true + inv:set_stack("main", i, existing_stack) + local stack_that_was_put + if leftover_count == 0 then + stack_that_was_put = stack + else + stack_that_was_put = ItemStack(stack) + stack_that_was_put:set_count(stack_count - leftover_count) + end + send_message(pos, "tput", stack_that_was_put, nil, i, side) + stack = leftover + stack_count = leftover_count + if stack_count == 0 then + break + end + end + end + end + if stack_count ~= 0 then + -- Walk the inventory, adding items to empty slots. + for i = 1, #inv_contents do + local existing_stack = inv_contents[i] + if existing_stack:is_empty() then + local leftover = existing_stack:add_item(stack) + local leftover_count = leftover:get_count() + if leftover_count ~= stack_count then + -- We put some items into the slot. Update the slot in + -- the inventory, tell Digilines listeners about it, + -- and keep looking for the a place to put the + -- leftovers if any. + any_put = true + inv:set_stack("main", i, existing_stack) + local stack_that_was_put + if leftover_count == 0 then + stack_that_was_put = stack + else + stack_that_was_put = ItemStack(stack) + stack_that_was_put:set_count(stack_count - leftover_count) + end + send_message(pos, "tput", stack_that_was_put, nil, i, side) + stack = leftover + stack_count = leftover_count + if stack_count == 0 then + break + end + end + end + end + end + if any_put then + check_full(pos, original_stack) + end + if stack_count ~= 0 then + -- Some items could not be added and bounced back. Report them. + send_message(pos, "toverflow", stack, nil, nil, side) + end + return stack +end + +local formspec_header = "" + +if minetest.get_modpath("mcl_formspec") then + formspec_header = mcl_formspec.get_itemslot_bg(0,1,8,4).. + mcl_formspec.get_itemslot_bg(0,6,8,4) +end + +minetest.register_alias("digilines_inventory:chest", "digilines:chest") + +minetest.register_node("digilines:chest", { + description = S("Digiline Chest"), + tiles = { + "default_chest_top.png"..tubeconn, + "default_chest_top.png"..tubeconn, + "default_chest_side.png"..tubeconn, + "default_chest_side.png"..tubeconn, + "default_chest_side.png"..tubeconn, + "default_chest_front.png", + }, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {choppy=2, oddly_breakable_by_hand=2, tubedevice=1, tubedevice_receiver=1, axey=1, handy=1}, + is_ground_content = false, + sounds = digilines.sounds.node_sound_wood_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Digiline Chest")) + meta:set_string("formspec", "size[8,10]".. + formspec_header.. + "label[0,0;" .. S("Digiline Chest") .. "]" .. + "list[current_name;main;0,1;8,4;]".. + "field[2,5.5;5,1;channel;" .. S("Channel") .. ";${channel}]".. + ((default and default.get_hotbar_bg) and default.get_hotbar_bg(0,6) or "").. + "list[current_player;main;0,6;8,4;]".. + "listring[]") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + after_place_node = tubescan, + after_dig_node = tubescan, + can_dig = function(pos) + return minetest.get_meta(pos):get_inventory():is_empty("main") + end, + on_receive_fields = function(pos, _, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + return + end + if fields.channel ~= nil then + minetest.get_meta(pos):set_string("channel",fields.channel) + end + end, + digilines = { + receptor = {}, + effector = { + action = function() end + } + }, + tube = { + connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}, + connects = function(i,param2) + return not pipeworks.connects.facingFront(i,param2) + end, + input_inventory = "main", + can_insert = tube_can_insert, + insert_object = tube_insert_object, + remove_items = function(pos, _, stack, dir, count) + -- Here, stack is the ItemStack in our own inventory that is being + -- pulled from, NOT the stack that is actually pulled out. + -- Combining it with count gives the stack that is pulled out. + -- Also, note that Pipeworks doesn’t pass the index to this + -- function, so we use the one recorded in + -- allow_metadata_inventory_take; because we don’t implement + -- tube.can_remove, Pipeworks will call + -- allow_metadata_inventory_take instead and will pass it the + -- index. + local taken = stack:take_item(count) + minetest.get_meta(pos):get_inventory():set_stack("main", last_inventory_take_index, stack) + send_message(pos, "ttake", taken, last_inventory_take_index, nil, dir) + check_empty(pos) + return taken + end, + }, + allow_metadata_inventory_put = function(pos, _, index, stack) + -- Remember what was in the target slot before the put; see + -- on_metadata_inventory_put for why we care. + last_inventory_put_index = index + last_inventory_put_stack = minetest.get_meta(pos):get_inventory():get_stack("main", index) + return stack:get_count() + end, + allow_metadata_inventory_take = function(_, _, index, stack) + -- Remember the index value; see tube.remove_items for why we care. + last_inventory_take_index = index + return stack:get_count() + end, + on_metadata_inventory_move = function(pos, _, from_index, _, to_index, count, player) + -- See what would happen if we were to move the items back from in the + -- opposite direction. In the event of a normal move, this must + -- succeed, because a normal move subtracts some items from the from + -- stack and adds them to the to stack; the two stacks naturally must + -- be compatible and so the reverse operation must succeed. However, if + -- the user *swaps* the two stacks instead, then due to issue + -- minetest/minetest#6534, this function is only called once; however, + -- when it is called, the stack that used to be in the to stack has + -- already been moved to the from stack, so we can detect the situation + -- by the fact that the reverse move will fail due to the from stack + -- being incompatible with its former contents. + local inv = minetest.get_meta(pos):get_inventory() + local from_stack = inv:get_stack("main", from_index) + local to_stack = inv:get_stack("main", to_index) + local reverse_move_stack = ItemStack(to_stack) + reverse_move_stack:set_count(count) + local swapped = from_stack:add_item(reverse_move_stack):get_count() == count + if swapped then + local channel = minetest.get_meta(pos):get_string("channel") + to_stack:set_count(count) + local msg = { + action = "uswap", + -- The slot and stack do not match because this function is + -- called after the action has taken place, but the Digilines + -- message is from the perspective of a viewer who hasn’t + -- observed the movement yet. + x_stack = to_stack:to_table(), + x_slot = from_index, + y_stack = from_stack:to_table(), + y_slot = to_index, + } + digilines.receptor_send(pos, digilines.rules.default, channel, msg) + else + to_stack:set_count(count) + send_message(pos, "umove", to_stack, from_index, to_index) + end + minetest.log("action", player:get_player_name().." moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, _, index, stack, player) + -- Get what was in the target slot before the put; it has disappeared + -- by now (been replaced by the result of the put action) but we saved + -- it in allow_metadata_inventory_put. This should always work + -- (allow_metadata_inventory_put should AFAICT always be called + -- immediately before on_metadata_inventory_put), but in case of + -- something weird happening, just fall back to using an empty + -- ItemStack rather than crashing. + local old_stack + if last_inventory_put_index == index then + old_stack = last_inventory_put_stack + last_inventory_put_index = nil + last_inventory_put_stack = nil + else + old_stack = ItemStack(nil) + end + -- If the player tries to place a stack into an inventory, there’s + -- already a stack there, and the existing stack is either of a + -- different item type or full, then obviously the stacks can’t be + -- merged; instead the stacks are swapped. This information is not + -- reported to mods (Minetest core neither tells us that a particular + -- action was a swap, nor tells us a take followed by a put). In core, + -- the condition for swapping is that you try to add the new stack to + -- the existing stack and the leftovers are as big as the original + -- stack to put. Replicate that logic here using the old stack saved in + -- allow_metadata_inventory_put. If a swap happened, report it to the + -- Digilines network as a utake followed by a uput. + local leftovers = old_stack:add_item(stack) + if leftovers:get_count() == stack:get_count() then + send_message(pos, "utake", old_stack, index) + end + send_message(pos, "uput", stack, nil, index) + check_full(pos, stack) + minetest.log("action", player:get_player_name().." puts stuff into chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, _, index, stack, player) + send_message(pos, "utake", stack, index) + check_empty(pos) + minetest.log("action", player:get_player_name().." takes stuff from chest at "..minetest.pos_to_string(pos)) + end +}) + +if minetest.global_exists("tubelib") then + local speculative_pull = nil + local pull_succeeded = function(passed_speculative_pull) + if passed_speculative_pull.canceled then return end + + send_message(passed_speculative_pull.pos, "ttake", passed_speculative_pull.taken, + passed_speculative_pull.index, nil, vector.multiply(passed_speculative_pull.dir, -1)) + check_empty(passed_speculative_pull.pos) + end + local function tube_side(pos, side) + if side == "U" then return {x=0,y=-1,z=0} + elseif side == "D" then return {x=0,y=1,z=0} + end + local param2 = minetest.get_node(pos).param2 + return vector.multiply( + minetest.facedir_to_dir( + tubelib2.side_to_dir(side, param2) - 1), + -1) + end + tubelib.register_node("digilines:chest", {}, { + on_pull_stack = function(pos, side, _) + local inv = minetest.get_meta(pos):get_inventory() + for i, stack in pairs(inv:get_list("main")) do + if not stack:is_empty() then + speculative_pull = { + canceled = false, + pos = pos, + taken = stack, + index = i, + dir = tube_side(pos, side) + } + minetest.after(0, pull_succeeded, speculative_pull) + inv:set_stack("main", i, nil) + return stack + end + end + return nil + end, + on_pull_item = function(pos, side, _) + local inv = minetest.get_meta(pos):get_inventory() + for i, stack in pairs(inv:get_list("main")) do + if not stack:is_empty() then + local taken = stack:take_item(1) + speculative_pull = { + canceled = false, + pos = pos, + taken = taken, + index = i, + dir = tube_side(pos, side) + } + minetest.after(0, pull_succeeded, speculative_pull) + inv:set_stack("main", i, stack) + return taken + end + end + return nil + end, + on_push_item = function(pos, side, item, _) + local dir_vec = tube_side(pos, side) + if not tube_can_insert(pos, nil, item, dir_vec) then + return false + end + tube_insert_object(pos, nil, item, dir_vec) + return true + end, + on_unpull_item = function(pos, _, item, _) + local inv = minetest.get_meta(pos):get_inventory() + if not inv:room_for_item("main", item) then + return false + end + + local existing_stack = inv:get_stack("main", speculative_pull.index) + local leftover = existing_stack:add_item(item) + if not leftover:is_empty() then + return false + end + + inv:set_stack("main", speculative_pull.index, existing_stack) + + -- Cancel speculative pull + -- this on_unpull_item callback should be called + -- immediately after on_pull_item if it fails + -- so this should be procedural + speculative_pull.canceled = true + speculative_pull = nil + return true + end, + }) +end + +local chest = "default:chest" + +if minetest.get_modpath("mcl_chests") then + chest = "mcl_chests:chest" +end + +minetest.register_craft({ + type = "shapeless", + output = "digilines:chest", + recipe = {chest, "digilines:wire_std_00000000"} +}) diff --git a/mods/digilines/lcd.lua b/mods/digilines/lcd.lua new file mode 100644 index 00000000..1f5f33fc --- /dev/null +++ b/mods/digilines/lcd.lua @@ -0,0 +1,366 @@ +local S = digilines.S + +--* parts are currently not possible because you cannot set the pitch of an entity from lua + +-- Font: 04.jp.org + +-- load characters map +local chars_file = io.open(minetest.get_modpath("digilines").."/characters", "r") +local charmap = {} +if not chars_file then + print("[digilines] E: LCD: character map file not found") +else + while true do + local char = chars_file:read("*l") + if char == nil then + break + end + local img = chars_file:read("*l") + chars_file:read("*l") + charmap[char] = img + end +end + +-- CONSTANTS +local LCD_WIDTH = 100 +local LCD_PADDING = 8 + +local LINE_LENGTH = 12 +local NUMBER_OF_LINES = 5 + +local LINE_HEIGHT = 14 +local CHAR_WIDTH = 5 + + +assert((CHAR_WIDTH+1) * LINE_LENGTH <= LCD_WIDTH - LCD_PADDING*2, "LCD: Lines set too long!") +assert((LINE_HEIGHT+1) * NUMBER_OF_LINES <= LCD_WIDTH - LCD_PADDING*2, "LCD: Too many lines!") + + +local split = function(s, pat) + -- adapted from https://stackoverflow.com/a/1647577/4067384 + -- simplified for our only usecase + local st, g = 1, s:gmatch("()("..pat..")") + local function getter() + if st then + local segs, seps, sep = st, g() + st = sep and seps + #sep + return s:sub(segs, (seps or 0) - 1) + end + end + return getter +end + +local create_lines = function(text) + --[[ + Typeset the lines according to these rules (in order of subjective significance): + - words that fit on the screen but would let the current line overflow are placed on a new line instead + - " | " always forces a linebreak + - spaces are included, except when there is a linebreak anyway + - words with more characters than fit on screen are just chopped up, filling the lines as full as possible + - don't bother typesetting more lines than fit on screen + - if we are on the last line that will fit on screen + ]]-- + local line = "" + local line_num = 1 + local tab = {} + local flush_line_and_check_for_return = function() + table.insert(tab, line) + line_num = line_num+1 + if line_num > NUMBER_OF_LINES then + return true + end + line = "" + end + for par in split(text, " | ") do + for word in split(par, "%s") do + if string.len(word) <= LINE_LENGTH and line_num < NUMBER_OF_LINES then + local line_len = string.len(line) + if line_len > 0 then + -- remember the space + line_len = line_len + 1 + end + if line_len + string.len(word) <= LINE_LENGTH then + if line_len > 0 then + line = line.." "..word + else + line = word + end + else + -- don't add the space since we have a line break + if word ~= " " then + if line_len > 0 then + -- ok, we need the new line + if flush_line_and_check_for_return() then return tab end + end + line = word + end + end + else + -- chop up word to make it fit + local remaining + while true do + remaining = LINE_LENGTH - string.len(line) + if remaining < LINE_LENGTH then + line = line .. " " + remaining = remaining - 1 + end + if remaining < string.len(word) then + line = line .. string.sub(word, 1, remaining) + word = string.sub(word, remaining+1) + if flush_line_and_check_for_return() then return tab end + else + -- used up the word + line = line .. word + break + end + end + end + end + -- end of paragraph + if flush_line_and_check_for_return() then return tab end + line = "" + end + return tab +end + +local generate_line = function(s, ypos) + local i = 1 + local parsed = {} + local width = 0 + local chars = 0 + while chars < LINE_LENGTH and i <= #s do + local file = nil + if charmap[s:sub(i, i)] ~= nil then + file = charmap[s:sub(i, i)] + i = i + 1 + elseif i < #s and charmap[s:sub(i, i + 1)] ~= nil then + file = charmap[s:sub(i, i + 1)] + i = i + 2 + else + print("[digilines] W: LCD: unknown symbol in '"..s.."' at "..i) + if charmap[" "] ~= nil then + file = charmap[" "] + end + i = i + 1 + end + if file ~= nil then + width = width + CHAR_WIDTH + 1 + table.insert(parsed, file) + chars = chars + 1 + end + end + width = width - 1 + + local texture = "" + local xpos = math.floor((LCD_WIDTH - width) / 2) + for ii = 1, #parsed do + texture = texture..":"..xpos..","..ypos.."="..parsed[ii]..".png" + xpos = xpos + CHAR_WIDTH + 1 + end + return texture +end + +local generate_texture = function(lines) + local texture = "[combine:"..LCD_WIDTH.."x"..LCD_WIDTH + local ypos = math.floor((LCD_WIDTH - LINE_HEIGHT*NUMBER_OF_LINES) / 2) + for i = 1, #lines do + texture = texture..generate_line(lines[i], ypos) + ypos = ypos + LINE_HEIGHT + end + return texture +end + +local lcds = { + -- on ceiling + --* [0] = {delta = {x = 0, y = 0.4, z = 0}, pitch = math.pi / -2}, + -- on ground + --* [1] = {delta = {x = 0, y =-0.4, z = 0}, pitch = math.pi / 2}, + -- sides + + -- Note: 0.437 is on the surface but we need some space to avoid + -- z-fighting in distant places (e.g. 30000,10,0) + [2] = {delta = {x = 0.43, y = 0, z = 0}, yaw = math.pi / -2}, + [3] = {delta = {x = -0.43, y = 0, z = 0}, yaw = math.pi / 2}, + [4] = {delta = {x = 0, y = 0, z = 0.43}, yaw = 0}, + [5] = {delta = {x = 0, y = 0, z = -0.43}, yaw = math.pi}, +} + +local reset_meta = function(pos) + minetest.get_meta(pos):set_string("formspec", "field[channel;Channel;${channel}]") +end + +local clearscreen = function(pos) + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, o in ipairs(objects) do + local o_entity = o:get_luaentity() + if o_entity and o_entity.name == "digilines_lcd:text" then + o:remove() + end + end +end + +local set_texture = function(ent) + local meta = minetest.get_meta(ent.object:get_pos()) + local text = meta:get_string("text") + ent.object:set_properties({ + textures = { + generate_texture(create_lines(text)) + } + }) +end + +local get_entity = function(pos) + local lcd_entity + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, o in ipairs(objects) do + local o_entity = o:get_luaentity() + if o_entity and o_entity.name == "digilines_lcd:text" then + if not lcd_entity then + lcd_entity = o_entity + else + -- Remove extras, if any + o:remove() + end + end + end + return lcd_entity +end + +local rotate_text = function(pos, param) + local entity = get_entity(pos) + if not entity then + return + end + local lcd_info = lcds[param or minetest.get_node(pos).param2] + if not lcd_info then + return + end + entity.object:set_pos(vector.add(pos, lcd_info.delta)) + entity.object:set_yaw(lcd_info.yaw or 0) +end + +local prepare_writing = function(pos) + local entity = get_entity(pos) + if entity then + set_texture(entity) + rotate_text(pos) + end +end + +local spawn_entity = function(pos) + if not get_entity(pos) then + minetest.add_entity(pos, "digilines_lcd:text") + rotate_text(pos) + end +end + +local on_digiline_receive = function(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + if setchan ~= channel then return end + + if type(msg) ~= "string" and type(msg) ~= "number" then return end + + meta:set_string("text", msg) + meta:set_string("infotext", msg) + + if msg ~= "" then + prepare_writing(pos) + end +end + +local lcd_box = { + type = "wallmounted", + wall_top = {-8/16, 7/16, -8/16, 8/16, 8/16, 8/16} +} + +minetest.register_alias("digilines_lcd:lcd", "digilines:lcd") +minetest.register_node("digilines:lcd", { + drawtype = "nodebox", + description = S("Digiline LCD"), + inventory_image = "lcd_lcd.png", + wield_image = "lcd_lcd.png", + tiles = {"lcd_anyside.png"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 6, + paramtype2 = "wallmounted", + node_box = lcd_box, + selection_box = lcd_box, + groups = {choppy = 3, dig_immediate = 2}, + is_ground_content = false, + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, + after_place_node = function(pos) + local param2 = minetest.get_node(pos).param2 + if param2 == 0 or param2 == 1 then + minetest.add_node(pos, {name = "digilines:lcd", param2 = 3}) + end + spawn_entity(pos) + prepare_writing(pos) + end, + on_construct = reset_meta, + on_destruct = clearscreen, + on_punch = function(pos, _, puncher, _) + if minetest.is_player(puncher) then + spawn_entity(pos) + end + end, + on_rotate = function(pos, _, _, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end + rotate_text(pos, new_param2) + end, + on_receive_fields = function(pos, _, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + return + end + if (fields.channel) then + minetest.get_meta(pos):set_string("channel", fields.channel) + end + end, + digilines = { + receptor = {}, + effector = { + action = on_digiline_receive + }, + }, +}) + +minetest.register_lbm({ + label = "Replace Missing Text Entities", + name = "digilines:replace_text", + nodenames = {"digilines:lcd"}, + run_at_every_load = true, + action = spawn_entity, +}) + +minetest.register_entity(":digilines_lcd:text", { + initial_properties = { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + }, + on_activate = set_texture, +}) + +local steel_ingot = "default:steel_ingot" +local glass = "default:glass" +local lightstone = "mesecons_lightstone:lightstone_green_off" + +if digilines.mcl then + steel_ingot = "mcl_core:iron_ingot" + glass = "mcl_core:glass" + lightstone = "mesecons_lightstone:lightstone_off" +end + +minetest.register_craft({ + output = "digilines:lcd 2", + recipe = { + {steel_ingot, "digilines:wire_std_00000000", steel_ingot}, + {lightstone, lightstone, lightstone}, + {glass, glass, glass} + } +}) diff --git a/mods/digilines/lightsensor.lua b/mods/digilines/lightsensor.lua new file mode 100644 index 00000000..b39871c4 --- /dev/null +++ b/mods/digilines/lightsensor.lua @@ -0,0 +1,83 @@ +local S = digilines.S + +local GET_COMMAND = "GET" + +local lsensor_nodebox = +{ + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + + { -7/16, -7/16, -7/16, -4/16, -5/16, 7/16 }, -- bonds + { 4/16, -7/16, -7/16, 7/16, -5/16, 7/16 }, + { -7/16, -7/16, -7/16, 7/16, -5/16, -4/16 }, + { -7/16, -7/16, 4/16, 7/16, -5/16, 7/16 }, + + { -1/16, -7/16, -1/16, 1/16, -5/16, 1/16 }, -- pin thing in the middle + } +} + +local lsensor_selbox = +{ + type = "fixed", + fixed = {{ -8/16, -8/16, -8/16, 8/16, -3/16, 8/16 }} +} + +local on_digiline_receive = function (pos, _, channel, msg) + local setchan = minetest.get_meta(pos):get_string("channel") + if channel == setchan and msg == GET_COMMAND then + local lightval = minetest.get_node_light(pos) + digilines.receptor_send(pos, digilines.rules.default, channel, lightval) + end +end + +minetest.register_alias("digilines_lightsensor:lightsensor", "digilines:lightsensor") +minetest.register_node("digilines:lightsensor", { + description = S("Digiline Lightsensor"), + drawtype = "nodebox", + tiles = {"digilines_lightsensor.png"}, + + paramtype = "light", + groups = {dig_immediate=2}, + is_ground_content = false, + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, + selection_box = lsensor_selbox, + node_box = lsensor_nodebox, + digilines = + { + receptor = {}, + effector = { + action = on_digiline_receive + }, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[channel;Channel;${channel}]") + end, + on_receive_fields = function(pos, _, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + return + end + if (fields.channel) then + minetest.get_meta(pos):set_string("channel", fields.channel) + end + end, +}) + +local steel_ingot = "default:steel_ingot" +local glass = "default:glass" + +if digilines.mcl then + steel_ingot = "mcl_core:iron_ingot" + glass = "mcl_core:glass" +end + +minetest.register_craft({ + output = "digilines:lightsensor", + recipe = { + {glass, glass, glass}, + {steel_ingot, "digilines:wire_std_00000000", steel_ingot}, + } +}) diff --git a/mods/digilines/locale/digilines.es.tr b/mods/digilines/locale/digilines.es.tr new file mode 100644 index 00000000..849ed46a --- /dev/null +++ b/mods/digilines/locale/digilines.es.tr @@ -0,0 +1,23 @@ +# textdomain: digilines + + +### inventory.lua ### + +Channel=Canal +Digiline Chest=Cofre Digiline + +### lcd.lua ### + +Digiline LCD=LCD Digiline + +### lightsensor.lua ### + +Digiline Lightsensor=Sensor de Luz Digiline + +### rtc.lua ### + +Digiline Real Time Clock (RTC)=Reloj de Tiempo Real Digiline + +### wire_std.lua ### + +Digiline=Digiline diff --git a/mods/digilines/locale/digilines.zh_TW.tr b/mods/digilines/locale/digilines.zh_TW.tr new file mode 100644 index 00000000..6e10ae7c --- /dev/null +++ b/mods/digilines/locale/digilines.zh_TW.tr @@ -0,0 +1,17 @@ +# textdomain: digilines + +### inventory.lua ### +Digiline Chest=訊纜儲物箱 +Channel=頻道 + +### lcd.lua ### +Digiline LCD=訊纜 LCD + +### lightsensor.lua ### +Digiline Lightsensor=訊纜光感應器 + +### rtc.lua ### +Digiline Real Time Clock (RTC)=訊纜實時時鐘 + +### wire_std.lua ### +Digiline=訊纜 diff --git a/mods/digilines/locale/diglines.fr.tr b/mods/digilines/locale/diglines.fr.tr new file mode 100644 index 00000000..701a993f --- /dev/null +++ b/mods/digilines/locale/diglines.fr.tr @@ -0,0 +1,23 @@ +# textdomain: digilines + + +### inventory.lua ### + +Channel=Canal +Digiline Chest=Coffre de digiline + +### lcd.lua ### + +Digiline LCD=Ecran à cristaux liquides Digiline + +### lightsensor.lua ### + +Digiline Lightsensor=Capteur de lumière Digiline + +### rtc.lua ### + +Digiline Real Time Clock (RTC)=Horloge du temps réel Digiline (Rtc) + +### wire_std.lua ### + +Digiline=Digiline diff --git a/mods/digilines/locale/template.txt b/mods/digilines/locale/template.txt new file mode 100644 index 00000000..2333a0de --- /dev/null +++ b/mods/digilines/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: digilines + + +### inventory.lua ### + +Channel= +Digiline Chest= + +### lcd.lua ### + +Digiline LCD= + +### lightsensor.lua ### + +Digiline Lightsensor= + +### rtc.lua ### + +Digiline Real Time Clock (RTC)= + +### wire_std.lua ### + +Digiline= diff --git a/mods/digilines/mod.conf b/mods/digilines/mod.conf new file mode 100644 index 00000000..18d8cd8b --- /dev/null +++ b/mods/digilines/mod.conf @@ -0,0 +1,7 @@ +name = digilines +depends = +optional_depends = mcl_core, mcl_sounds, default, tubelib, tubelib2 +description = """ +This mod adds digiline wires, an RTC (Real Time Clock), a light sensor as well as an LCD Screen. +Can be used together with the luacontroller from mesecons. +""" diff --git a/mods/digilines/presetrules.lua b/mods/digilines/presetrules.lua new file mode 100644 index 00000000..a0ab508a --- /dev/null +++ b/mods/digilines/presetrules.lua @@ -0,0 +1,15 @@ +digilines.rules = {} + +digilines.rules.default = +{{x=0, y=0, z=-1}, +{x=1, y=0, z=0}, +{x=-1, y=0, z=0}, +{x=0, y=0, z=1}, +{x=1, y=1, z=0}, +{x=1, y=-1, z=0}, +{x=-1, y=1, z=0}, +{x=-1, y=-1, z=0}, +{x=0, y=1, z=1}, +{x=0, y=-1, z=1}, +{x=0, y=1, z=-1}, +{x=0, y=-1, z=-1}} diff --git a/mods/digilines/rtc.lua b/mods/digilines/rtc.lua new file mode 100644 index 00000000..07add3ed --- /dev/null +++ b/mods/digilines/rtc.lua @@ -0,0 +1,88 @@ +local S = digilines.S + +local GET_COMMAND = "GET" + +local rtc_nodebox = +{ + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + + { -7/16, -7/16, -7/16, 7/16, -5/16, 7/16 }, + } +} + +local rtc_selbox = +{ + type = "fixed", + fixed = {{ -8/16, -8/16, -8/16, 8/16, -3/16, 8/16 }} +} + +local on_digiline_receive = function (pos, _, channel, msg) + local setchan = minetest.get_meta(pos):get_string("channel") + if channel == setchan and msg == GET_COMMAND then + local timeofday = minetest.get_timeofday() + digilines.receptor_send(pos, digilines.rules.default, channel, timeofday) + end +end + +minetest.register_alias("digilines_rtc:rtc", "digilines:rtc") +minetest.register_node("digilines:rtc", { + description = S("Digiline Real Time Clock (RTC)"), + drawtype = "nodebox", + tiles = { + "digilines_rtc.png", "digilines_rtc_bottom.png", "digilines_rtc.png", + "digilines_rtc.png", "digilines_rtc.png", "digilines_rtc.png" + }, + + paramtype = "light", + paramtype2 = "facedir", + groups = {dig_immediate=2}, + is_ground_content = false, + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, + selection_box = rtc_selbox, + node_box = rtc_nodebox, + digilines = + { + receptor = {}, + effector = { + action = on_digiline_receive + }, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[channel;Channel;${channel}]") + end, + on_receive_fields = function(pos, _, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + return + end + if (fields.channel) then + minetest.get_meta(pos):set_string("channel", fields.channel) + end + end, +}) + +local steel_ingot = "default:steel_ingot" +local mese_crystal = "default:mese_crystal_fragment" +local dye_black = "dye:black" + +if digilines.mcl then + steel_ingot = "mcl_core:iron_ingot" + mese_crystal = "mesecons:redstone" +end + +if minetest.get_modpath("mcl_dye") then + dye_black = "mcl_dye:black" +end + +minetest.register_craft({ + output = "digilines:rtc", + recipe = { + {"", dye_black, ""}, + {steel_ingot, mese_crystal, steel_ingot}, + {"", "digilines:wire_std_00000000", ""} + } +}) diff --git a/mods/digilines/screenshot.png b/mods/digilines/screenshot.png new file mode 100644 index 00000000..e699cea8 Binary files /dev/null and b/mods/digilines/screenshot.png differ diff --git a/mods/digilines/settingtypes.txt b/mods/digilines/settingtypes.txt new file mode 100644 index 00000000..ad16ac82 --- /dev/null +++ b/mods/digilines/settingtypes.txt @@ -0,0 +1,13 @@ + +# If enabled, makes some nodes with inventories (like chests) send signals +# when items are moved in the inventory. +digilines_enable_inventory (Enable inventory signals) bool true + +# Enable or disable the LCD panel with visible text. +digilines_enable_lcd (Enable LCD) bool true + +# Enable or disable the light sensor component. +digilines_enable_lightsensor (Enable light sensor) bool true + +# Enable or disable the real time clock component. +digilines_enable_rtc (Enable RTC) bool true diff --git a/mods/digilines/textures/_0.png b/mods/digilines/textures/_0.png new file mode 100644 index 00000000..b0308799 Binary files /dev/null and b/mods/digilines/textures/_0.png differ diff --git a/mods/digilines/textures/_1.png b/mods/digilines/textures/_1.png new file mode 100644 index 00000000..ae28369c Binary files /dev/null and b/mods/digilines/textures/_1.png differ diff --git a/mods/digilines/textures/_2.png b/mods/digilines/textures/_2.png new file mode 100644 index 00000000..7375c680 Binary files /dev/null and b/mods/digilines/textures/_2.png differ diff --git a/mods/digilines/textures/_3.png b/mods/digilines/textures/_3.png new file mode 100644 index 00000000..d7248116 Binary files /dev/null and b/mods/digilines/textures/_3.png differ diff --git a/mods/digilines/textures/_4.png b/mods/digilines/textures/_4.png new file mode 100644 index 00000000..0fff433c Binary files /dev/null and b/mods/digilines/textures/_4.png differ diff --git a/mods/digilines/textures/_5.png b/mods/digilines/textures/_5.png new file mode 100644 index 00000000..43010df0 Binary files /dev/null and b/mods/digilines/textures/_5.png differ diff --git a/mods/digilines/textures/_6.png b/mods/digilines/textures/_6.png new file mode 100644 index 00000000..1eba38ca Binary files /dev/null and b/mods/digilines/textures/_6.png differ diff --git a/mods/digilines/textures/_7.png b/mods/digilines/textures/_7.png new file mode 100644 index 00000000..dbcd2d18 Binary files /dev/null and b/mods/digilines/textures/_7.png differ diff --git a/mods/digilines/textures/_8.png b/mods/digilines/textures/_8.png new file mode 100644 index 00000000..edf6ef52 Binary files /dev/null and b/mods/digilines/textures/_8.png differ diff --git a/mods/digilines/textures/_9.png b/mods/digilines/textures/_9.png new file mode 100644 index 00000000..c276c11a Binary files /dev/null and b/mods/digilines/textures/_9.png differ diff --git a/mods/digilines/textures/_a.png b/mods/digilines/textures/_a.png new file mode 100644 index 00000000..8f3f59ce Binary files /dev/null and b/mods/digilines/textures/_a.png differ diff --git a/mods/digilines/textures/_a_.png b/mods/digilines/textures/_a_.png new file mode 100644 index 00000000..4da193c4 Binary files /dev/null and b/mods/digilines/textures/_a_.png differ diff --git a/mods/digilines/textures/_am.png b/mods/digilines/textures/_am.png new file mode 100644 index 00000000..75d0287b Binary files /dev/null and b/mods/digilines/textures/_am.png differ diff --git a/mods/digilines/textures/_ap.png b/mods/digilines/textures/_ap.png new file mode 100644 index 00000000..5dd3325e Binary files /dev/null and b/mods/digilines/textures/_ap.png differ diff --git a/mods/digilines/textures/_as.png b/mods/digilines/textures/_as.png new file mode 100644 index 00000000..3c7a25a0 Binary files /dev/null and b/mods/digilines/textures/_as.png differ diff --git a/mods/digilines/textures/_at.png b/mods/digilines/textures/_at.png new file mode 100644 index 00000000..4f9841cd Binary files /dev/null and b/mods/digilines/textures/_at.png differ diff --git a/mods/digilines/textures/_b.png b/mods/digilines/textures/_b.png new file mode 100644 index 00000000..baf4eaa9 Binary files /dev/null and b/mods/digilines/textures/_b.png differ diff --git a/mods/digilines/textures/_b_.png b/mods/digilines/textures/_b_.png new file mode 100644 index 00000000..b00a3783 Binary files /dev/null and b/mods/digilines/textures/_b_.png differ diff --git a/mods/digilines/textures/_bl.png b/mods/digilines/textures/_bl.png new file mode 100644 index 00000000..546ca4e3 Binary files /dev/null and b/mods/digilines/textures/_bl.png differ diff --git a/mods/digilines/textures/_br.png b/mods/digilines/textures/_br.png new file mode 100644 index 00000000..5700fa61 Binary files /dev/null and b/mods/digilines/textures/_br.png differ diff --git a/mods/digilines/textures/_c.png b/mods/digilines/textures/_c.png new file mode 100644 index 00000000..eedd6391 Binary files /dev/null and b/mods/digilines/textures/_c.png differ diff --git a/mods/digilines/textures/_c_.png b/mods/digilines/textures/_c_.png new file mode 100644 index 00000000..cab6518a Binary files /dev/null and b/mods/digilines/textures/_c_.png differ diff --git a/mods/digilines/textures/_ca.png b/mods/digilines/textures/_ca.png new file mode 100644 index 00000000..d359c88d Binary files /dev/null and b/mods/digilines/textures/_ca.png differ diff --git a/mods/digilines/textures/_cl.png b/mods/digilines/textures/_cl.png new file mode 100644 index 00000000..55396b94 Binary files /dev/null and b/mods/digilines/textures/_cl.png differ diff --git a/mods/digilines/textures/_cm.png b/mods/digilines/textures/_cm.png new file mode 100644 index 00000000..28beedf3 Binary files /dev/null and b/mods/digilines/textures/_cm.png differ diff --git a/mods/digilines/textures/_co.png b/mods/digilines/textures/_co.png new file mode 100644 index 00000000..b1618193 Binary files /dev/null and b/mods/digilines/textures/_co.png differ diff --git a/mods/digilines/textures/_cr.png b/mods/digilines/textures/_cr.png new file mode 100644 index 00000000..ac466a95 Binary files /dev/null and b/mods/digilines/textures/_cr.png differ diff --git a/mods/digilines/textures/_d.png b/mods/digilines/textures/_d.png new file mode 100644 index 00000000..a5f06997 Binary files /dev/null and b/mods/digilines/textures/_d.png differ diff --git a/mods/digilines/textures/_d_.png b/mods/digilines/textures/_d_.png new file mode 100644 index 00000000..9a0e3ed5 Binary files /dev/null and b/mods/digilines/textures/_d_.png differ diff --git a/mods/digilines/textures/_dl.png b/mods/digilines/textures/_dl.png new file mode 100644 index 00000000..72184adc Binary files /dev/null and b/mods/digilines/textures/_dl.png differ diff --git a/mods/digilines/textures/_dt.png b/mods/digilines/textures/_dt.png new file mode 100644 index 00000000..61c1e4a4 Binary files /dev/null and b/mods/digilines/textures/_dt.png differ diff --git a/mods/digilines/textures/_dv.png b/mods/digilines/textures/_dv.png new file mode 100644 index 00000000..996d7cd7 Binary files /dev/null and b/mods/digilines/textures/_dv.png differ diff --git a/mods/digilines/textures/_e.png b/mods/digilines/textures/_e.png new file mode 100644 index 00000000..29e32e68 Binary files /dev/null and b/mods/digilines/textures/_e.png differ diff --git a/mods/digilines/textures/_e_.png b/mods/digilines/textures/_e_.png new file mode 100644 index 00000000..c7f19c12 Binary files /dev/null and b/mods/digilines/textures/_e_.png differ diff --git a/mods/digilines/textures/_eq.png b/mods/digilines/textures/_eq.png new file mode 100644 index 00000000..daf84241 Binary files /dev/null and b/mods/digilines/textures/_eq.png differ diff --git a/mods/digilines/textures/_ex.png b/mods/digilines/textures/_ex.png new file mode 100644 index 00000000..b5da8e94 Binary files /dev/null and b/mods/digilines/textures/_ex.png differ diff --git a/mods/digilines/textures/_f.png b/mods/digilines/textures/_f.png new file mode 100644 index 00000000..68359126 Binary files /dev/null and b/mods/digilines/textures/_f.png differ diff --git a/mods/digilines/textures/_f_.png b/mods/digilines/textures/_f_.png new file mode 100644 index 00000000..3698ed25 Binary files /dev/null and b/mods/digilines/textures/_f_.png differ diff --git a/mods/digilines/textures/_g.png b/mods/digilines/textures/_g.png new file mode 100644 index 00000000..5a85cde2 Binary files /dev/null and b/mods/digilines/textures/_g.png differ diff --git a/mods/digilines/textures/_g_.png b/mods/digilines/textures/_g_.png new file mode 100644 index 00000000..cc7bbc54 Binary files /dev/null and b/mods/digilines/textures/_g_.png differ diff --git a/mods/digilines/textures/_gt.png b/mods/digilines/textures/_gt.png new file mode 100644 index 00000000..f30855a7 Binary files /dev/null and b/mods/digilines/textures/_gt.png differ diff --git a/mods/digilines/textures/_h.png b/mods/digilines/textures/_h.png new file mode 100644 index 00000000..1a66a9e5 Binary files /dev/null and b/mods/digilines/textures/_h.png differ diff --git a/mods/digilines/textures/_h_.png b/mods/digilines/textures/_h_.png new file mode 100644 index 00000000..87beafcb Binary files /dev/null and b/mods/digilines/textures/_h_.png differ diff --git a/mods/digilines/textures/_ha.png b/mods/digilines/textures/_ha.png new file mode 100644 index 00000000..4618ced4 Binary files /dev/null and b/mods/digilines/textures/_ha.png differ diff --git a/mods/digilines/textures/_hs.png b/mods/digilines/textures/_hs.png new file mode 100644 index 00000000..6f12becb Binary files /dev/null and b/mods/digilines/textures/_hs.png differ diff --git a/mods/digilines/textures/_i.png b/mods/digilines/textures/_i.png new file mode 100644 index 00000000..f0011425 Binary files /dev/null and b/mods/digilines/textures/_i.png differ diff --git a/mods/digilines/textures/_i_.png b/mods/digilines/textures/_i_.png new file mode 100644 index 00000000..fc658b85 Binary files /dev/null and b/mods/digilines/textures/_i_.png differ diff --git a/mods/digilines/textures/_j.png b/mods/digilines/textures/_j.png new file mode 100644 index 00000000..87d2f26d Binary files /dev/null and b/mods/digilines/textures/_j.png differ diff --git a/mods/digilines/textures/_j_.png b/mods/digilines/textures/_j_.png new file mode 100644 index 00000000..c0d9ac20 Binary files /dev/null and b/mods/digilines/textures/_j_.png differ diff --git a/mods/digilines/textures/_k.png b/mods/digilines/textures/_k.png new file mode 100644 index 00000000..34f93368 Binary files /dev/null and b/mods/digilines/textures/_k.png differ diff --git a/mods/digilines/textures/_k_.png b/mods/digilines/textures/_k_.png new file mode 100644 index 00000000..86b623d1 Binary files /dev/null and b/mods/digilines/textures/_k_.png differ diff --git a/mods/digilines/textures/_l.png b/mods/digilines/textures/_l.png new file mode 100644 index 00000000..defe7ec8 Binary files /dev/null and b/mods/digilines/textures/_l.png differ diff --git a/mods/digilines/textures/_l_.png b/mods/digilines/textures/_l_.png new file mode 100644 index 00000000..3fe1de2f Binary files /dev/null and b/mods/digilines/textures/_l_.png differ diff --git a/mods/digilines/textures/_lt.png b/mods/digilines/textures/_lt.png new file mode 100644 index 00000000..ec7219d2 Binary files /dev/null and b/mods/digilines/textures/_lt.png differ diff --git a/mods/digilines/textures/_m.png b/mods/digilines/textures/_m.png new file mode 100644 index 00000000..e0fe0398 Binary files /dev/null and b/mods/digilines/textures/_m.png differ diff --git a/mods/digilines/textures/_m_.png b/mods/digilines/textures/_m_.png new file mode 100644 index 00000000..9164da6a Binary files /dev/null and b/mods/digilines/textures/_m_.png differ diff --git a/mods/digilines/textures/_mn.png b/mods/digilines/textures/_mn.png new file mode 100644 index 00000000..935a2fee Binary files /dev/null and b/mods/digilines/textures/_mn.png differ diff --git a/mods/digilines/textures/_n.png b/mods/digilines/textures/_n.png new file mode 100644 index 00000000..ac10fd94 Binary files /dev/null and b/mods/digilines/textures/_n.png differ diff --git a/mods/digilines/textures/_n_.png b/mods/digilines/textures/_n_.png new file mode 100644 index 00000000..d4355c12 Binary files /dev/null and b/mods/digilines/textures/_n_.png differ diff --git a/mods/digilines/textures/_o.png b/mods/digilines/textures/_o.png new file mode 100644 index 00000000..080e99d2 Binary files /dev/null and b/mods/digilines/textures/_o.png differ diff --git a/mods/digilines/textures/_o_.png b/mods/digilines/textures/_o_.png new file mode 100644 index 00000000..2d190519 Binary files /dev/null and b/mods/digilines/textures/_o_.png differ diff --git a/mods/digilines/textures/_p.png b/mods/digilines/textures/_p.png new file mode 100644 index 00000000..30509590 Binary files /dev/null and b/mods/digilines/textures/_p.png differ diff --git a/mods/digilines/textures/_p_.png b/mods/digilines/textures/_p_.png new file mode 100644 index 00000000..0cca0110 Binary files /dev/null and b/mods/digilines/textures/_p_.png differ diff --git a/mods/digilines/textures/_pr.png b/mods/digilines/textures/_pr.png new file mode 100644 index 00000000..b835141e Binary files /dev/null and b/mods/digilines/textures/_pr.png differ diff --git a/mods/digilines/textures/_ps.png b/mods/digilines/textures/_ps.png new file mode 100644 index 00000000..1f4b5c11 Binary files /dev/null and b/mods/digilines/textures/_ps.png differ diff --git a/mods/digilines/textures/_q.png b/mods/digilines/textures/_q.png new file mode 100644 index 00000000..945b6cf0 Binary files /dev/null and b/mods/digilines/textures/_q.png differ diff --git a/mods/digilines/textures/_q_.png b/mods/digilines/textures/_q_.png new file mode 100644 index 00000000..f3bf455a Binary files /dev/null and b/mods/digilines/textures/_q_.png differ diff --git a/mods/digilines/textures/_qo.png b/mods/digilines/textures/_qo.png new file mode 100644 index 00000000..5d261e34 Binary files /dev/null and b/mods/digilines/textures/_qo.png differ diff --git a/mods/digilines/textures/_qu.png b/mods/digilines/textures/_qu.png new file mode 100644 index 00000000..5eb597a5 Binary files /dev/null and b/mods/digilines/textures/_qu.png differ diff --git a/mods/digilines/textures/_r.png b/mods/digilines/textures/_r.png new file mode 100644 index 00000000..39e9fce5 Binary files /dev/null and b/mods/digilines/textures/_r.png differ diff --git a/mods/digilines/textures/_r_.png b/mods/digilines/textures/_r_.png new file mode 100644 index 00000000..6c71c1e1 Binary files /dev/null and b/mods/digilines/textures/_r_.png differ diff --git a/mods/digilines/textures/_re.png b/mods/digilines/textures/_re.png new file mode 100644 index 00000000..16148371 Binary files /dev/null and b/mods/digilines/textures/_re.png differ diff --git a/mods/digilines/textures/_s.png b/mods/digilines/textures/_s.png new file mode 100644 index 00000000..a0ada1ac Binary files /dev/null and b/mods/digilines/textures/_s.png differ diff --git a/mods/digilines/textures/_s_.png b/mods/digilines/textures/_s_.png new file mode 100644 index 00000000..9b018bbd Binary files /dev/null and b/mods/digilines/textures/_s_.png differ diff --git a/mods/digilines/textures/_sl.png b/mods/digilines/textures/_sl.png new file mode 100644 index 00000000..08c95477 Binary files /dev/null and b/mods/digilines/textures/_sl.png differ diff --git a/mods/digilines/textures/_sm.png b/mods/digilines/textures/_sm.png new file mode 100644 index 00000000..385c64fe Binary files /dev/null and b/mods/digilines/textures/_sm.png differ diff --git a/mods/digilines/textures/_sp.png b/mods/digilines/textures/_sp.png new file mode 100644 index 00000000..7fa97490 Binary files /dev/null and b/mods/digilines/textures/_sp.png differ diff --git a/mods/digilines/textures/_sr.png b/mods/digilines/textures/_sr.png new file mode 100644 index 00000000..bc9c0a24 Binary files /dev/null and b/mods/digilines/textures/_sr.png differ diff --git a/mods/digilines/textures/_t.png b/mods/digilines/textures/_t.png new file mode 100644 index 00000000..c55731a0 Binary files /dev/null and b/mods/digilines/textures/_t.png differ diff --git a/mods/digilines/textures/_t_.png b/mods/digilines/textures/_t_.png new file mode 100644 index 00000000..773e666c Binary files /dev/null and b/mods/digilines/textures/_t_.png differ diff --git a/mods/digilines/textures/_tl.png b/mods/digilines/textures/_tl.png new file mode 100644 index 00000000..059fe681 Binary files /dev/null and b/mods/digilines/textures/_tl.png differ diff --git a/mods/digilines/textures/_u.png b/mods/digilines/textures/_u.png new file mode 100644 index 00000000..98bf8e69 Binary files /dev/null and b/mods/digilines/textures/_u.png differ diff --git a/mods/digilines/textures/_u_.png b/mods/digilines/textures/_u_.png new file mode 100644 index 00000000..35ce9154 Binary files /dev/null and b/mods/digilines/textures/_u_.png differ diff --git a/mods/digilines/textures/_un.png b/mods/digilines/textures/_un.png new file mode 100644 index 00000000..01f547ad Binary files /dev/null and b/mods/digilines/textures/_un.png differ diff --git a/mods/digilines/textures/_v.png b/mods/digilines/textures/_v.png new file mode 100644 index 00000000..b692d118 Binary files /dev/null and b/mods/digilines/textures/_v.png differ diff --git a/mods/digilines/textures/_v_.png b/mods/digilines/textures/_v_.png new file mode 100644 index 00000000..8049771b Binary files /dev/null and b/mods/digilines/textures/_v_.png differ diff --git a/mods/digilines/textures/_vb.png b/mods/digilines/textures/_vb.png new file mode 100644 index 00000000..7fed7dc5 Binary files /dev/null and b/mods/digilines/textures/_vb.png differ diff --git a/mods/digilines/textures/_w.png b/mods/digilines/textures/_w.png new file mode 100644 index 00000000..6a58b07e Binary files /dev/null and b/mods/digilines/textures/_w.png differ diff --git a/mods/digilines/textures/_w_.png b/mods/digilines/textures/_w_.png new file mode 100644 index 00000000..64904dec Binary files /dev/null and b/mods/digilines/textures/_w_.png differ diff --git a/mods/digilines/textures/_x.png b/mods/digilines/textures/_x.png new file mode 100644 index 00000000..b769e136 Binary files /dev/null and b/mods/digilines/textures/_x.png differ diff --git a/mods/digilines/textures/_x_.png b/mods/digilines/textures/_x_.png new file mode 100644 index 00000000..2f6d0671 Binary files /dev/null and b/mods/digilines/textures/_x_.png differ diff --git a/mods/digilines/textures/_y.png b/mods/digilines/textures/_y.png new file mode 100644 index 00000000..777b55e5 Binary files /dev/null and b/mods/digilines/textures/_y.png differ diff --git a/mods/digilines/textures/_y_.png b/mods/digilines/textures/_y_.png new file mode 100644 index 00000000..0c40de91 Binary files /dev/null and b/mods/digilines/textures/_y_.png differ diff --git a/mods/digilines/textures/_z.png b/mods/digilines/textures/_z.png new file mode 100644 index 00000000..ae010fe1 Binary files /dev/null and b/mods/digilines/textures/_z.png differ diff --git a/mods/digilines/textures/_z_.png b/mods/digilines/textures/_z_.png new file mode 100644 index 00000000..1c3e0539 Binary files /dev/null and b/mods/digilines/textures/_z_.png differ diff --git a/mods/digilines/textures/digiline_std.png b/mods/digilines/textures/digiline_std.png new file mode 100644 index 00000000..39246634 Binary files /dev/null and b/mods/digilines/textures/digiline_std.png differ diff --git a/mods/digilines/textures/digiline_std_bump.png b/mods/digilines/textures/digiline_std_bump.png new file mode 100644 index 00000000..1e94d313 Binary files /dev/null and b/mods/digilines/textures/digiline_std_bump.png differ diff --git a/mods/digilines/textures/digiline_std_inv.png b/mods/digilines/textures/digiline_std_inv.png new file mode 100644 index 00000000..1cedb0cc Binary files /dev/null and b/mods/digilines/textures/digiline_std_inv.png differ diff --git a/mods/digilines/textures/digiline_std_vertical.png b/mods/digilines/textures/digiline_std_vertical.png new file mode 100644 index 00000000..293b3ec5 Binary files /dev/null and b/mods/digilines/textures/digiline_std_vertical.png differ diff --git a/mods/digilines/textures/digilines_lightsensor.png b/mods/digilines/textures/digilines_lightsensor.png new file mode 100644 index 00000000..94fda764 Binary files /dev/null and b/mods/digilines/textures/digilines_lightsensor.png differ diff --git a/mods/digilines/textures/digilines_rtc.png b/mods/digilines/textures/digilines_rtc.png new file mode 100644 index 00000000..afd51cb0 Binary files /dev/null and b/mods/digilines/textures/digilines_rtc.png differ diff --git a/mods/digilines/textures/digilines_rtc_bottom.png b/mods/digilines/textures/digilines_rtc_bottom.png new file mode 100644 index 00000000..2c453ea0 Binary files /dev/null and b/mods/digilines/textures/digilines_rtc_bottom.png differ diff --git a/mods/digilines/textures/lcd_anyside.png b/mods/digilines/textures/lcd_anyside.png new file mode 100644 index 00000000..768b3d40 Binary files /dev/null and b/mods/digilines/textures/lcd_anyside.png differ diff --git a/mods/digilines/textures/lcd_lcd.png b/mods/digilines/textures/lcd_lcd.png new file mode 100644 index 00000000..86ed59bf Binary files /dev/null and b/mods/digilines/textures/lcd_lcd.png differ diff --git a/mods/digilines/util.lua b/mods/digilines/util.lua new file mode 100644 index 00000000..ac15fab2 --- /dev/null +++ b/mods/digilines/util.lua @@ -0,0 +1,156 @@ +function digilines.addPosRule(p, r) + return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z} +end + +function digilines.cmpPos(p1, p2) + return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z) +end + +--Rules rotation Functions: +function digilines.rotate_rules_right(rules) + local nr={} + for i, rule in ipairs(rules) do + nr[i]={} + nr[i].z=rule.x + nr[i].x=-rule.z + nr[i].y=rule.y + end + return nr +end + +function digilines.rotate_rules_left(rules) + local nr={} + for i, rule in ipairs(rules) do + nr[i]={} + nr[i].z=-rule.x + nr[i].x=rule.z + nr[i].y=rule.y + end + return nr +end + +function digilines.rotate_rules_down(rules) + local nr={} + for i, rule in ipairs(rules) do + nr[i]={} + nr[i].y=rule.x + nr[i].x=-rule.y + nr[i].z=rule.z + end + return nr +end + +function digilines.rotate_rules_up(rules) + local nr={} + for i, rule in ipairs(rules) do + nr[i]={} + nr[i].y=-rule.x + nr[i].x=rule.y + nr[i].z=rule.z + end + return nr +end + +function digilines.tablecopy(table) -- deep table copy + if type(table) ~= "table" then return table end -- no need to copy + local newtable = {} + + for idx, item in pairs(table) do + if type(item) == "table" then + newtable[idx] = digilines.tablecopy(item) + else + newtable[idx] = item + end + end + + return newtable +end + + + +-- VoxelManipulator-based node access functions: + +-- Maps from a hashed mapblock position (as returned by hash_blockpos) to a +-- table. +-- +-- Contents of the table are: +-- “va” → the VoxelArea +-- “data” → the data array +-- “param1” → the param1 array +-- “param2” → the param2 array +-- +-- Nil if no bulk-VM operation is in progress. +local vm_cache = nil + +-- Starts a bulk-VoxelManipulator operation. +-- +-- During a bulk-VoxelManipulator operation, calls to get_node_force operate +-- directly on VM-loaded arrays, which should be faster for reading many nodes +-- in rapid succession. However, the cache must be flushed with vm_end once the +-- scan is finished, to avoid using stale data in future. +function digilines.vm_begin() + vm_cache = {} +end + +-- Ends a bulk-VoxelManipulator operation, freeing the cached data. +function digilines.vm_end() + vm_cache = nil +end + +-- The dimension of a mapblock in nodes. +local MAPBLOCKSIZE = 16 + +-- Converts a node position into a hash of a mapblock position. +local function vm_hash_blockpos(pos) + return minetest.hash_node_position({ + x = math.floor(pos.x / MAPBLOCKSIZE), + y = math.floor(pos.y / MAPBLOCKSIZE), + z = math.floor(pos.z / MAPBLOCKSIZE) + }) +end + +-- Gets the cache entry covering a position, populating it if necessary. +local function vm_get_or_create_entry(pos) + local hash = vm_hash_blockpos(pos) + local tbl = vm_cache[hash] + if not tbl then + local vm = minetest.get_voxel_manip(pos, pos) + local min_pos, max_pos = vm:get_emerged_area() + local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos} + tbl = {va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data()} + vm_cache[hash] = tbl + end + return tbl +end + +-- Gets the node at a position during a bulk-VoxelManipulator operation. +local function vm_get_node(pos) + local tbl = vm_get_or_create_entry(pos) + local index = tbl.va:indexp(pos) + local node_value = tbl.data[index] + local node_param1 = tbl.param1[index] + local node_param2 = tbl.param2[index] + return {name = minetest.get_name_from_content_id(node_value), param1 = node_param1, param2 = node_param2} +end + +-- Gets the node at a given position, regardless of whether it is loaded or +-- not. +-- +-- Outside a bulk-VoxelManipulator operation, if the mapblock is not loaded, it +-- is pulled into the server’s main map data cache and then accessed from +-- there. +-- +-- Inside a bulk-VoxelManipulator operation, the operation’s VM cache is used. +function digilines.get_node_force(pos) + if vm_cache then + return vm_get_node(pos) + end + local node = minetest.get_node(pos) + if node.name == "ignore" then + -- Node is not currently loaded; use a VoxelManipulator to prime + -- the mapblock cache and try again. + minetest.get_voxel_manip(pos, pos) + node = minetest.get_node(pos) + end + return node +end diff --git a/mods/digilines/wire_std.lua b/mods/digilines/wire_std.lua new file mode 100644 index 00000000..5ba8b277 --- /dev/null +++ b/mods/digilines/wire_std.lua @@ -0,0 +1,124 @@ +local S = digilines.S + +-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off +-- The conditions in brackets define whether there is a digiline at that place or not +-- 1 = there is one; 0 = there is none +-- y always means y+ + +local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} +local box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 } +local box_bump2 = { -3/32, -13/32, -3/32, 3/32, -12/32, 3/32 } + +local box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} +local box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16} +local box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16} +local box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16} + +local box_xpy = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16} +local box_zpy = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5} +local box_xmy = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16} +local box_zmy = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16} + +for xp=0, 1 do +for zp=0, 1 do +for xm=0, 1 do +for zm=0, 1 do +for xpy=0, 1 do +for zpy=0, 1 do +for xmy=0, 1 do +for zmy=0, 1 do + if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0) + or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end + + local groups + local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. + tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) + + local wiredesc + + if nodeid == "00000000" then + groups = {dig_immediate = 3} + wiredesc = S("Digiline") + else + groups = {dig_immediate = 3, not_in_creative_inventory = 1} + end + + local nodebox = {} + local adjx = false + local adjz = false + if xp == 1 then table.insert(nodebox, box_xp) adjx = true end + if zp == 1 then table.insert(nodebox, box_zp) adjz = true end + if xm == 1 then table.insert(nodebox, box_xm) adjx = true end + if zm == 1 then table.insert(nodebox, box_zm) adjz = true end + if xpy == 1 then table.insert(nodebox, box_xpy) end + if zpy == 1 then table.insert(nodebox, box_zpy) end + if xmy == 1 then table.insert(nodebox, box_xmy) end + if zmy == 1 then table.insert(nodebox, box_zmy) end + + local tiles + if adjx and adjz and (xp + zp + xm + zm > 2) then + table.insert(nodebox, box_bump1) + table.insert(nodebox, box_bump2) + tiles = { + "digiline_std_bump.png", + "digiline_std_bump.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png" + } + else + table.insert(nodebox, box_center) + tiles = { + "digiline_std.png", + "digiline_std.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png", + "digiline_std_vertical.png" + } + end + + if nodeid == "00000000" then + nodebox = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} + end + + minetest.register_node("digilines:wire_std_"..nodeid, { + description = wiredesc, + drawtype = "nodebox", + tiles = tiles, + inventory_image = "digiline_std_inv.png", + wield_image = "digiline_std_inv.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + digilines = + { + wire = + { + basename = "digilines:wire_std_", + use_autoconnect = true + } + }, + selection_box = { + type = "fixed", + fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5} + }, + node_box = { + type = "fixed", + fixed = nodebox + }, + groups = groups, + is_ground_content = false, + walkable = false, + stack_max = 99, + drop = "digilines:wire_std_00000000" + }) +end +end +end +end +end +end +end +end diff --git a/mods/digilines/wires_common.lua b/mods/digilines/wires_common.lua new file mode 100644 index 00000000..b42153dc --- /dev/null +++ b/mods/digilines/wires_common.lua @@ -0,0 +1,84 @@ + +local function check_and_update(pos, node) + if digilines.getspec(node) then + digilines.update_autoconnect(pos) + end +end + +minetest.register_on_placenode(check_and_update) +minetest.register_on_dignode(check_and_update) + +function digilines.update_autoconnect(pos, secondcall) + local xppos = {x=pos.x+1, y=pos.y, z=pos.z} + local zppos = {x=pos.x, y=pos.y, z=pos.z+1} + local xmpos = {x=pos.x-1, y=pos.y, z=pos.z} + local zmpos = {x=pos.x, y=pos.y, z=pos.z-1} + local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z} + local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1} + local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z} + local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1} + local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z} + local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1} + local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z} + local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1} + + if secondcall == nil then + digilines.update_autoconnect(xppos, true) + digilines.update_autoconnect(zppos, true) + digilines.update_autoconnect(xmpos, true) + digilines.update_autoconnect(zmpos, true) + + digilines.update_autoconnect(xpypos, true) + digilines.update_autoconnect(zpypos, true) + digilines.update_autoconnect(xmypos, true) + digilines.update_autoconnect(zmypos, true) + + digilines.update_autoconnect(xpympos, true) + digilines.update_autoconnect(zpympos, true) + digilines.update_autoconnect(xmympos, true) + digilines.update_autoconnect(zmympos, true) + end + + local digilinespec = digilines.getspec(minetest.get_node(pos)) + if not (digilinespec and digilinespec.wire and + digilinespec.wire.use_autoconnect) then + return nil + end + + local zmg = digilines.rules_link_anydir(pos, zmpos) + local zmymg = digilines.rules_link_anydir(pos, zmympos) + local xmg = digilines.rules_link_anydir(pos, xmpos) + local xmymg = digilines.rules_link_anydir(pos, xmympos) + local zpg = digilines.rules_link_anydir(pos, zppos) + local zpymg = digilines.rules_link_anydir(pos, zpympos) + local xpg = digilines.rules_link_anydir(pos, xppos) + local xpymg = digilines.rules_link_anydir(pos, xpympos) + + + local xpyg = digilines.rules_link_anydir(pos, xpypos) + local zpyg = digilines.rules_link_anydir(pos, zpypos) + local xmyg = digilines.rules_link_anydir(pos, xmypos) + local zmyg = digilines.rules_link_anydir(pos, zmypos) + + local zm, xm, zp, xp, xpy, zpy, xmy, zmy + if zmg or zmymg then zm = 1 else zm = 0 end + if xmg or xmymg then xm = 1 else xm = 0 end + if zpg or zpymg then zp = 1 else zp = 0 end + if xpg or xpymg then xp = 1 else xp = 0 end + + if xpyg then xpy = 1 else xpy = 0 end + if zpyg then zpy = 1 else zpy = 0 end + if xmyg then xmy = 1 else xmy = 0 end + if zmyg then zmy = 1 else zmy = 0 end + + if xpy == 1 then xp = 1 end + if zpy == 1 then zp = 1 end + if xmy == 1 then xm = 1 end + if zmy == 1 then zm = 1 end + + local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. + tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) + + + minetest.set_node(pos, {name = digilinespec.wire.basename..nodeid}) +end diff --git a/mods/display_modpack/boards/depends.txt b/mods/display_modpack/boards/depends.txt deleted file mode 100644 index 8c807e3a..00000000 --- a/mods/display_modpack/boards/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -signs_api diff --git a/mods/display_modpack/boards/mod.conf b/mods/display_modpack/boards/mod.conf index 2343d07b..66433fc0 100644 --- a/mods/display_modpack/boards/mod.conf +++ b/mods/display_modpack/boards/mod.conf @@ -1,3 +1,4 @@ -name=boards -description=Writable school boards using sign_api -depends=default,signs_api +name = boards +title = Black boards +description = Writable school boards using sign_api +depends = default,signs_api diff --git a/mods/display_modpack/display_api/mod.conf b/mods/display_modpack/display_api/mod.conf index d0b1da7c..295b5eb7 100644 --- a/mods/display_modpack/display_api/mod.conf +++ b/mods/display_modpack/display_api/mod.conf @@ -1,2 +1,3 @@ -name=display_api -description=A library for adding dynamic textures on nodes +name = display_api +title = Display API +description = A library for adding dynamic textures on nodes diff --git a/mods/display_modpack/font_api/depends.txt b/mods/display_modpack/font_api/depends.txt deleted file mode 100644 index 88fa963c..00000000 --- a/mods/display_modpack/font_api/depends.txt +++ /dev/null @@ -1 +0,0 @@ -display_api? diff --git a/mods/display_modpack/font_api/mod.conf b/mods/display_modpack/font_api/mod.conf index 1aaccc0d..92ab193a 100644 --- a/mods/display_modpack/font_api/mod.conf +++ b/mods/display_modpack/font_api/mod.conf @@ -1,3 +1,4 @@ -name=font_api -description=A library for rendernig text on textures -optional_depends=display_api +name = font_api +title = Font API +description = A library for rendernig text on textures +optional_depends = display_api diff --git a/mods/display_modpack/font_metro/depends.txt b/mods/display_modpack/font_metro/depends.txt deleted file mode 100644 index 7372f0d9..00000000 --- a/mods/display_modpack/font_metro/depends.txt +++ /dev/null @@ -1 +0,0 @@ -font_api diff --git a/mods/display_modpack/font_metro/mod.conf b/mods/display_modpack/font_metro/mod.conf index d84ad8c6..64074a94 100644 --- a/mods/display_modpack/font_metro/mod.conf +++ b/mods/display_modpack/font_metro/mod.conf @@ -1,3 +1,4 @@ -name=font_metro -description=Metro font (latin, accents, cyrillic, greek) for font_api -depends=font_api +name = font_metro +title = Metro Font +description = Metro font (latin, accents, cyrillic, greek) for font_api +depends = font_api diff --git a/mods/display_modpack/ontime_clocks/depends.txt b/mods/display_modpack/ontime_clocks/depends.txt deleted file mode 100644 index 07a2ec14..00000000 --- a/mods/display_modpack/ontime_clocks/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -dye -display_api - -intllib? diff --git a/mods/display_modpack/ontime_clocks/mod.conf b/mods/display_modpack/ontime_clocks/mod.conf index 9c1a2e61..f6afbdec 100644 --- a/mods/display_modpack/ontime_clocks/mod.conf +++ b/mods/display_modpack/ontime_clocks/mod.conf @@ -1,4 +1,5 @@ -name=ontime_clocks -description=Clocks displaing real ingame time -depends=default,dye,display_api -optional_depends=intllib +name = ontime_clocks +title = Ontime Clocks +description = Clocks displaing real ingame time +depends = default,dye,display_api +optional_depends = intllib diff --git a/mods/display_modpack/signs/depends.txt b/mods/display_modpack/signs/depends.txt deleted file mode 100644 index afeb8380..00000000 --- a/mods/display_modpack/signs/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -dye -signs_api -intllib? diff --git a/mods/display_modpack/signs/mod.conf b/mods/display_modpack/signs/mod.conf index 81d1358a..1ef5d398 100644 --- a/mods/display_modpack/signs/mod.conf +++ b/mods/display_modpack/signs/mod.conf @@ -1,4 +1,5 @@ -name=signs -description=Basic signs and posters with text display using signs_api -depends=default,dye,signs_api -optional_depends=intllib +name = signs +title = Signs +description = Basic signs and posters with text display using signs_api +depends = default,dye,signs_api +optional_depends = intllib diff --git a/mods/display_modpack/signs_api/depends.txt b/mods/display_modpack/signs_api/depends.txt deleted file mode 100644 index f75ffcc2..00000000 --- a/mods/display_modpack/signs_api/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -intllib? -display_api -font_api diff --git a/mods/display_modpack/signs_api/mod.conf b/mods/display_modpack/signs_api/mod.conf index 94ebf6a0..f4f91b7c 100644 --- a/mods/display_modpack/signs_api/mod.conf +++ b/mods/display_modpack/signs_api/mod.conf @@ -1,4 +1,5 @@ -name=signs_api -description=A library providing various helper functions for registereing signs with text display -depends=default,display_api,font_api -optional_depends=intllib +name = signs_api +title = Signs API +description = A library providing various helper functions for registereing signs with text display +depends = default,display_api,font_api +optional_depends = intllib diff --git a/mods/display_modpack/signs_road/depends.txt b/mods/display_modpack/signs_road/depends.txt deleted file mode 100644 index 38a5f41a..00000000 --- a/mods/display_modpack/signs_road/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -intllib? -dye -signs_api diff --git a/mods/display_modpack/signs_road/mod.conf b/mods/display_modpack/signs_road/mod.conf index 83ae2319..ae93f5a8 100644 --- a/mods/display_modpack/signs_road/mod.conf +++ b/mods/display_modpack/signs_road/mod.conf @@ -1,4 +1,5 @@ -name=signs_road -description=Various road signs with text display using signs_api -depends=default,dye,signs_api -optional_depends=intllib +name = signs_road +title = Signs Road +description = Various road signs with text display using signs_api +depends = default,dye,signs_api +optional_depends = intllib diff --git a/mods/display_modpack/steles/depends.txt b/mods/display_modpack/steles/depends.txt deleted file mode 100644 index ba432237..00000000 --- a/mods/display_modpack/steles/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -intllib? -display_api -font_api -technic? diff --git a/mods/display_modpack/steles/mod.conf b/mods/display_modpack/steles/mod.conf index 2b29f050..b3d5264a 100644 --- a/mods/display_modpack/steles/mod.conf +++ b/mods/display_modpack/steles/mod.conf @@ -1,4 +1,5 @@ -name=steles -description=Stone steles with text display on them -depends=default,display_api,font_api -optional_depends=intllib,technic +name = steles +title = Steles +description = Stone steles with text display on them +depends = default,display_api,font_api +optional_depends = intllib,technic diff --git a/mods/doors/README.txt b/mods/doors/README.md similarity index 51% rename from mods/doors/README.txt rename to mods/doors/README.md index 4ec907b2..2dc01aca 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.md @@ -1,44 +1,77 @@ -Doors Redo (Edited by TenPlus1) +minetest mod Doors Redo +========================= -Based on - -Minetest Game mod: doors -======================== -See license.txt for license information. - - -Usage ------ - -Doors Redo allows the player to craft a key tool which can be used on any of the -registered doors to flip between states (open, owned, protected) - - -Key Tool --------- - -The key tool is crafted using 5x steel ingots (2x2 box in lower left and 1 in -top right). When held in players hand you can punch a door to flip between each -state to open, lock (own) and protect the door. - - -Door States +Information ----------- -OPEN - Doors can be opened by any player or dug up. +This mod replaces the default `doors` mod and adds a new tool that can flip +between (open, locked, protected) states of any door or trapdoor. Master keys +can still be used to give players access to your locked doors. -OWNED - This locks the door so that only the owner can open or dig the door. +![screenshot.jpg](screenshot.jpg) -PROTECTED - This also locks the door so that only the players listed for the -protected area the door sits inside can open the door. +Tech information +---------------- + +#### Door States + +* OPEN - This is like default Doors mod, can be opened by any player or dug up. +* OWNED - This locks the door so that only the owner can open or dig the door. +* PROTECTED - This locks the door but based on protected area the door sits inside. Note: A protection mod must be installed to use Protected mode so that it works properly, not having one running will mean all protected doors will open for anyone who uses them. +#### Dependencies + +* default + +Optional dependences: + +* screwdriver +* protector + +#### Mesecons Support + +Each door has mesecons support baked in so that switches and pressure plates can open +doors, trapdoors and fence gates. Please disable 'mesecons_doors' mod so that it works +properly. + +#### Nodes + +| Node name | Description name | +| ----------------------- | --------------------- | +| doors:hidden | Hidden Door Segment | +| doors:trapdoor | Trapdoor | +| doors:trapdoor_steel | Steel Trapdoor | +| doors:trapdoor_oak | Oak Trapdoor | +| doors:door_steel | Steel Door | +| doors:door_glass | Glass Door | +| doors:door_obsidian_glass | Obsidian Glass Door | +| doors:door_phiwari | Phiwari's Wooden Door | +| doors:door_iceage | IceAge's Wooden Door | +| doors:gate_wood | Wooden Fence Gate | +| doors:gate_acacia_wood | Acacia Fence Gate | +| doors:gate_junglewood | Junglewood Fence Gate | +| doors:gate_pine_wood | Pine Fence Gate | +| doors:gate_aspen_wood | Aspen Fence Gate | + +#### Items tools + +The lock tool can be crafted (top middle is 1x gold ingot, 4x steel ingots either side of +middle and bottom rows). When held in players hand you can punch a door to flip between +each state to open, lock (own) and protect the door. + +| Node item | Description name | +| --------------------- | --------------------- | +| doors:lock_tool | Lock Tool | + +License +------- + +#### Authors of source code -Authors of source code ----------------------- Originally by PilzAdam (MIT) Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. @@ -51,9 +84,10 @@ Added Fence Gate model, code, and sounds. Various Minetest developers and contributors (MIT) +Finally featured by TenPlus1 + +#### Authors of media (textures) -Authors of media (textures) ---------------------------- Following textures created by Fernando Zapata (CC BY-SA 3.0): door_wood.png door_wood_a.png @@ -65,6 +99,10 @@ Following textures created by BlockMen (CC BY-SA 3.0): door_trapdoor.png door_obsidian_glass_side.png +Following textures created by sorcerykid (CC BY-SA 3.0): + door_trapdoor_oak.png + door_trapdoor_oak_side.png + Following textures created by celeron55 (CC BY-SA 3.0): door_glass_a.png door_glass_b.png @@ -88,16 +126,15 @@ Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA doors_item_glass.png TenPlus1 (CC-BY-SA-3.0): - doors_key.png + doors_lock_tool.png All other textures (created by PilzAdam) (CC BY-SA 3.0): Door textures were converted to the new texture map by sofar, paramat and red-001, under the same license as the originals. +#### Authors of media (models) -Authors of media (models) -------------------------- Door 3d models by sofar (CC-BY-SA-3.0) - door_a.obj - door_b.obj @@ -106,8 +143,8 @@ Fence gate models by sofar (CC-BY-SA-3.0) - fencegate_closed.obj -Authors of media (sounds) -------------------------- +#### Authors of media (sounds) + Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen door_open.ogg Closing-Sound created by bennstir (CC BY 3.0) @@ -123,3 +160,6 @@ Steel door sounds open & close (CC-BY-3.0) by HazMatt doors_steel_door_close.ogg doors_glass_door_open.ogg, doors_glass_door_close.ogg: https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) + + +Check [license.txt](license.txt) diff --git a/mods/doors/depends.txt b/mods/doors/depends.txt deleted file mode 100644 index 5e28beeb..00000000 --- a/mods/doors/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -screwdriver? diff --git a/mods/doors/init.lua b/mods/doors/init.lua index d4870c62..d8b3417e 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,16 +1,20 @@ --- our API object +-- global + doors = { mod = "redo", registered_doors = {}, registered_trapdoors = {} } +local S = minetest.get_translator("doors") -- translation support + +-- replace old doors_owner with new owner local function replace_old_owner_information(pos) local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") + local owner = meta and meta:get_string("doors_owner") if owner and owner ~= "" then meta:set_string("owner", owner) @@ -18,8 +22,8 @@ local function replace_old_owner_information(pos) end end - -- returns an object to a door object or nil + function doors.get(pos) local node_name = minetest.get_node(pos).name @@ -33,18 +37,14 @@ function doors.get(pos) open = function(self, player) - if self:state() then - return false - end + if self:state() then return false end return doors.door_toggle(self.pos, nil, player) end, close = function(self, player) - if not self:state() then - return false - end + if not self:state() then return false end return doors.door_toggle(self.pos, nil, player) end, @@ -70,18 +70,14 @@ function doors.get(pos) open = function(self, player) - if self:state() then - return false - end + if self:state() then return false end return doors.trapdoor_toggle(self.pos, nil, player) end, close = function(self, player) - if not self:state() then - return false - end + if not self:state() then return false end return doors.trapdoor_toggle(self.pos, nil, player) end, @@ -94,16 +90,109 @@ function doors.get(pos) return minetest.get_node(self.pos).name:sub(-5) == "_open" end } - else - return nil end + + return nil end +-- node can_dig function + +local can_dig_door = function(pos, digger) + + if not (digger and digger:is_player()) then return false end + + if minetest.check_player_privs(digger, "protection_bypass") then + return true + end + + replace_old_owner_information(pos) + + local meta = minetest.get_meta(pos) ; if not meta then return false end + local owner = meta:get_string("owner") + local prot = meta:get_string("doors_protected") + local pname = digger:get_player_name() + + if prot ~= "" and ( prot == pname or not minetest.is_protected(pos, pname) ) then + return true + elseif prot ~= "" then + return false + end + + if owner ~= "" and pname == owner then + return true + elseif owner ~= "" then + return false + end + + if not minetest.is_protected(pos, pname) then return true end + + return false +end + +-- can we open door helper function + +local can_toggle = function(clicker, pos) + + -- check for fake player + if clicker and clicker.is_fake_player then return true end + + if not clicker then return end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local prot = meta:get_string("doors_protected") + local pname = clicker:get_player_name() + + if minetest.check_player_privs(clicker, "protection_bypass") then + return true + end + + -- is door open for all + if owner == "" and prot == "" then return true end + + -- do we own door + if owner == pname then return true end + + -- check if door protected and we have permission + if prot ~= "" and not minetest.is_protected(pos, pname) then return true end + + -- get what's in our hand + local item = clicker and clicker:get_wielded_item() + + -- do we have a key + if not item or minetest.get_item_group(item:get_name(), "key") ~= 1 then + return false + end + + local key_meta = item:get_meta() + + -- does key have a secret code + if key_meta:get_string("secret") == "" then + + local key_oldmeta = item:get_metadata() + + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) + + item:set_metadata("") + end + + -- does secret code match our key code + if meta:get_string("key_lock_secret") == key_meta:get_string("secret") then + return true + end + + return false +end -- this hidden node is placed on top of the bottom, and prevents -- nodes from being placed in the top half of the door. + minetest.register_node("doors:hidden", { - description = "Hidden Door Segment", + description = S("Hidden Door Segment"), -- can't use airlike otherwise falling nodes will turn to entities -- and will be forever stuck until door is removed. drawtype = "nodebox", @@ -133,39 +222,34 @@ minetest.register_node("doors:hidden", { } }) - -- table used to aid door opening/closing + local transform = { { - { v = "_a", param2 = 3 }, - { v = "_a", param2 = 0 }, - { v = "_a", param2 = 1 }, - { v = "_a", param2 = 2 } + { v = "_a", param2 = 3 }, { v = "_a", param2 = 0 }, + { v = "_a", param2 = 1 }, { v = "_a", param2 = 2 } }, { - { v = "_b", param2 = 1 }, - { v = "_b", param2 = 2 }, - { v = "_b", param2 = 3 }, - { v = "_b", param2 = 0 } + { v = "_b", param2 = 1 }, { v = "_b", param2 = 2 }, + { v = "_b", param2 = 3 }, { v = "_b", param2 = 0 } }, { - { v = "_b", param2 = 1 }, - { v = "_b", param2 = 2 }, - { v = "_b", param2 = 3 }, - { v = "_b", param2 = 0 } + { v = "_b", param2 = 1 }, { v = "_b", param2 = 2 }, + { v = "_b", param2 = 3 }, { v = "_b", param2 = 0 } }, { - { v = "_a", param2 = 3 }, - { v = "_a", param2 = 0 }, - { v = "_a", param2 = 1 }, - { v = "_a", param2 = 2 } + { v = "_a", param2 = 3 }, { v = "_a", param2 = 0 }, + { v = "_a", param2 = 1 }, { v = "_a", param2 = 2 } } } +-- door node on_rightclick function function doors.door_toggle(pos, node, clicker) - local meta = minetest.get_meta(pos) ; if not meta then return false end + local meta = minetest.get_meta(pos) + + if not meta then return false end node = node or minetest.get_node(pos) @@ -187,26 +271,7 @@ function doors.door_toggle(pos, node, clicker) replace_old_owner_information(pos) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - - local owner = meta:get_string("owner") - local prot = meta:get_string("doors_protected") - - if prot ~= "" then - - if minetest.is_protected(pos, clicker:get_player_name()) then - return false - end - - elseif owner ~= "" then - - if clicker:get_player_name() ~= owner then - return false - end - end - end - - local old = state + if not can_toggle(clicker, pos) then return false end -- until Lua-5.2 we have no bitwise operators :( if state % 2 == 1 then @@ -227,10 +292,10 @@ function doors.door_toggle(pos, node, clicker) if state % 2 == 0 then minetest.sound_play(def.door.sounds[1], - {pos = pos, gain = 0.3, max_hear_distance = 10}, true) + {pos = pos, gain = def.door.gains[1], max_hear_distance = 10}, true) else minetest.sound_play(def.door.sounds[2], - {pos = pos, gain = 0.3, max_hear_distance = 10}, true) + {pos = pos, gain = def.door.gains[2], max_hear_distance = 10}, true) end minetest.swap_node(pos, { @@ -243,13 +308,12 @@ function doors.door_toggle(pos, node, clicker) return true end +-- door on_place helper function local function on_place_node(place_to, newnode, placer, oldnode, itemstack, pointed_thing) -- Run script hook - local _, callback - - for _, callback in pairs(minetest.registered_on_placenodes) do + for _, callback in ipairs(minetest.registered_on_placenodes) do -- Deepcopy pos, node and pointed_thing because callback can modify them local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} @@ -269,25 +333,11 @@ local function on_place_node(place_to, newnode, placer, oldnode, itemstack, poin end end - -local function can_dig_door(pos, digger) - - replace_old_owner_information(pos) - - local digger_name = digger and digger:get_player_name() - - if digger_name and minetest.get_player_privs(digger_name).protection_bypass then - return true - end - - return minetest.get_meta(pos):get_string("owner") == digger_name -end +-- register door function function doors.register(name, def) - if not name:find(":") then - name = "doors:" .. name - end + if not name:find(":") then name = "doors:" .. name end -- replace old doors of this type automatically minetest.register_lbm({ @@ -328,7 +378,7 @@ function doors.register(name, def) -- wipe meta on top node as it's unused minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, - {name = "doors:hidden", param2 = p3}) + {name = "doors:hidden", param2 = p3}) end }) @@ -341,16 +391,13 @@ function doors.register(name, def) local pos - if not pointed_thing.type == "node" then - return itemstack - end + if pointed_thing.type ~= "node" then return itemstack end local doorname = itemstack:get_name() local node = minetest.get_node(pointed_thing.under) local pdef = minetest.registered_nodes[node.name] - if pdef - and pdef.on_rightclick + if pdef and pdef.on_rightclick and not (placer and placer:is_player() and placer:get_player_control().sneak) then @@ -365,18 +412,14 @@ function doors.register(name, def) node = minetest.get_node(pos) pdef = minetest.registered_nodes[node.name] - if not pdef or not pdef.buildable_to then - return itemstack - end + if not pdef or not pdef.buildable_to then return itemstack end end local above = {x = pos.x, y = pos.y + 1, z = pos.z} local top_node = minetest.get_node_or_nil(above) local topdef = top_node and minetest.registered_nodes[top_node.name] - if not topdef or not topdef.buildable_to then - return itemstack - end + if not topdef or not topdef.buildable_to then return itemstack end local pn = placer and placer:get_player_name() or "" @@ -416,10 +459,8 @@ function doors.register(name, def) if def.protected then - local pn = placer:get_player_name() - meta:set_string("owner", pn) - meta:set_string("infotext", "Owned by " .. pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) end if not minetest.is_creative_enabled(pn) then @@ -446,23 +487,17 @@ function doors.register(name, def) end def.recipe = nil - - if not def.sounds then - def.sounds = default.node_sound_wood_defaults() - end - - if not def.sound_open then - def.sound_open = "doors_door_open" - end - - if not def.sound_close then - def.sound_close = "doors_door_close" - end - + def.sounds = def.sounds or default.node_sound_wood_defaults() + def.sound_open = def.sound_open or "doors_door_open" + def.sound_close = def.sound_close or "doors_door_close" def.groups.not_in_creative_inventory = 1 def.groups.door = 1 def.drop = name - def.door = {name = name, sounds = {def.sound_close, def.sound_open}} + def.door = { + name = name, + sounds = {def.sound_close, def.sound_open}, + gains = {def.gain_close or 0.2, def.gain_open or 0.2} + } if not def.on_rightclick then @@ -485,19 +520,59 @@ function doors.register(name, def) return false end - if def.protected then - def.can_dig = can_dig_door - def.on_blast = function() end - else - def.on_blast = function(pos, intensity) + def.can_dig = can_dig_door - minetest.remove_node(pos) + def.on_key_use = function(pos, player) - -- hidden node doesn't get blasted away. - minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + local door = doors.get(pos) - return {name} + door:toggle(player) + end + + def.on_skeleton_key_use = function(pos, player, newsecret) + + replace_old_owner_information(pos) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + local prot = meta:get_string("doors_protected") + + -- Door is neither owned not protected + if owner == "" and prot == "" then return nil end + + -- verify placer is owner of lockable door + if owner ~= pname and prot ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this locked door.")) + return nil end + + local secret = meta:get_string("key_lock_secret") + + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked door"), owner + end + + def.node_dig_prediction = "" + + def.on_blast = function(pos, intensity) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") or "" + + if owner ~= "" or minetest.is_protected(pos, "") then return end + + minetest.remove_node(pos) + + -- hidden node doesn't get blasted away. + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + + return {name} end def.on_destruct = function(pos) @@ -512,8 +587,21 @@ function doors.register(name, def) def.walkable = true def.is_ground_content = false def.buildable_to = false - def.selection_box = {type = "fixed", fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}} - def.collision_box = {type = "fixed", fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + + -- mesecons support + if minetest.get_modpath("mesecons") then + + local function door_switch(pos, node) + doors.door_toggle(pos, node, {is_fake_player = true}) + end + + def.mesecons = {effector = { + action_on = door_switch, + action_off = door_switch + }} + end def.mesh = "door_a.b3d" minetest.register_node(":" .. name .. "_a", table.copy(def)) @@ -529,12 +617,15 @@ function doors.register(name, def) doors.registered_doors[name .. "_b"] = true end +-- register doors doors.register("door_wood", { tiles = {{name = "doors_door_wood.png", backface_culling = true}}, - description = "Wooden Door", + description = S("Wooden Door"), inventory_image = "doors_item_wood.png", groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, recipe = { {"group:wood", "group:wood"}, {"group:wood", "group:wood"}, @@ -542,16 +633,17 @@ doors.register("door_wood", { } }) - doors.register("door_steel", { tiles = {{name = "doors_door_steel.png", backface_culling = true}}, - description = "Steel Door", + description = S("Steel Door"), inventory_image = "doors_item_steel.png", protected = true, groups = {node = 1, cracky = 1, level = 2}, sounds = default.node_sound_stone_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, recipe = { {"default:steel_ingot", "default:steel_ingot"}, {"default:steel_ingot", "default:steel_ingot"}, @@ -559,15 +651,16 @@ doors.register("door_steel", { } }) - doors.register("door_glass", { tiles = { "doors_door_glass.png"}, - description = "Glass Door", + description = S("Glass Door"), inventory_image = "doors_item_glass.png", groups = {node = 1, cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), sound_open = "doors_glass_door_open", sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, recipe = { {"default:glass", "default:glass"}, {"default:glass", "default:glass"}, @@ -575,15 +668,16 @@ doors.register("door_glass", { } }) - doors.register("door_obsidian_glass", { tiles = { "doors_door_obsidian_glass.png" }, - description = "Obsidian Glass Door", + description = S("Obsidian Glass Door"), inventory_image = "doors_item_obsidian_glass.png", groups = {node = 1, cracky = 3}, sounds = default.node_sound_glass_defaults(), sound_open = "doors_glass_door_open", sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, recipe = { {"default:obsidian_glass", "default:obsidian_glass"}, {"default:obsidian_glass", "default:obsidian_glass"}, @@ -591,13 +685,15 @@ doors.register("door_obsidian_glass", { } }) - -- special doors (CC0 textures by Phiwari123 and IceAgeComing) + doors.register("door_phiwari", { tiles = {{name = "doors_door_phiwari.png", backface_culling = true}}, - description = "Phiwari's Wooden Door", + description = "Phiwari: " .. S("Wooden Door"), inventory_image = "doors_item_phiwari.png", groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, recipe = { {"group:wood", "default:obsidian_glass"}, {"group:wood", "group:wood"}, @@ -605,12 +701,13 @@ doors.register("door_phiwari", { } }) - doors.register("door_iceage", { tiles = {{name = "doors_door_iceage.png", backface_culling = true}}, - description = "IceAge's Wooden Door", + description = "IceAge: " .. S("Wooden Door"), inventory_image = "doors_item_iceage.png", groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, recipe = { {"group:wood", "default:iron_lump"}, {"group:wood", "group:wood"}, @@ -618,13 +715,11 @@ doors.register("door_iceage", { } }) - -- Capture mods using the old API as best as possible. + function doors.register_door(name, def) - if def.only_placer_can_open then - def.protected = true - end + if def.only_placer_can_open then def.protected = true end def.only_placer_can_open = nil @@ -648,7 +743,7 @@ function doors.register_door(name, def) doors.register(name, def) end -----trapdoor---- +-- trapdoor node on_rightclick function function doors.trapdoor_toggle(pos, node, clicker) @@ -656,32 +751,14 @@ function doors.trapdoor_toggle(pos, node, clicker) node = node or minetest.get_node(pos) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - - local meta = minetest.get_meta(pos) ; if not meta then return false end - local owner = meta:get_string("owner") - local prot = meta:get_string("doors_protected") - - if prot ~= "" then - - if minetest.is_protected(pos, clicker:get_player_name()) then - return false - end - - elseif owner ~= "" then - - if clicker:get_player_name() ~= owner then - return false - end - end - end + if not can_toggle(clicker, pos) then return false end local def = minetest.registered_nodes[node.name] if string.sub(node.name, -5) == "_open" then minetest.sound_play(def.sound_close, - {pos = pos, gain = 0.3, max_hear_distance = 10}, true) + {pos = pos, gain = def.gain_close, max_hear_distance = 10}, true) minetest.swap_node(pos, { name = string.sub(node.name, 1, string.len(node.name) - 5), @@ -689,7 +766,7 @@ function doors.trapdoor_toggle(pos, node, clicker) }) else minetest.sound_play(def.sound_open, - {pos = pos, gain = 0.3, max_hear_distance = 10}, true) + {pos = pos, gain = def.gain_open, max_hear_distance = 10}, true) minetest.swap_node(pos, { name = node.name .. "_open", @@ -698,12 +775,11 @@ function doors.trapdoor_toggle(pos, node, clicker) end end +-- register trapdoor function function doors.register_trapdoor(name, def) - if not name:find(":") then - name = "doors:" .. name - end + if not name:find(":") then name = "doors:" .. name end local name_closed = name local name_opened = name.."_open" @@ -722,53 +798,105 @@ function doors.register_trapdoor(name, def) def.use_texture_alpha = def.use_texture_alpha or "clip" def.is_ground_content = false - if def.protected then + def.can_dig = can_dig_door - def.can_dig = can_dig_door - def.after_place_node = function(pos, placer, itemstack, pointed_thing) + def.after_place_node = function(pos, placer, itemstack, pointed_thing) - local pn = placer:get_player_name() - local meta = minetest.get_meta(pos) + if not def.protected then return end - meta:set_string("owner", pn) - meta:set_string("infotext", "Owned by "..pn) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) - return minetest.is_creative_enabled(pn) + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + + return minetest.is_creative_enabled(pn) + end + + def.on_key_use = function(pos, player) + + local door = doors.get(pos) + + door:toggle(player) + end + + def.on_skeleton_key_use = function(pos, player, newsecret) + + replace_old_owner_information(pos) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + local prot = meta:get_string("doors_protected") + + -- Door is neither owned not protected + if owner == "" and prot == "" then return nil end + + -- verify placer is owner of lockable door + if owner ~= pname and prot ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this trapdoor.")) + return nil end - def.on_blast = function() end - else - def.on_blast = function(pos, intensity) + local secret = meta:get_string("key_lock_secret") - minetest.remove_node(pos) - - return {name} + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) end + + return secret, S("a locked trapdoor"), owner end - if not def.sounds then - def.sounds = default.node_sound_wood_defaults() + def.node_dig_prediction = "" + + def.on_blast = function(pos, intensity) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") or "" + + if owner ~= "" or minetest.is_protected(pos, "") then return end + + minetest.remove_node(pos) + + return {name} end - if not def.sound_open then - def.sound_open = "doors_door_open" - end + def.sounds = def.sounds or default.node_sound_wood_defaults() + def.sound_open = def.sound_open or "doors_door_open" + def.sound_close = def.sound_clode or "doors_door_close" + def.gain_open = def.gain_open or 0.2 + def.gain_close = def.gain_close or 0.2 - if not def.sound_close then - def.sound_close = "doors_door_close" + -- mesecons support + if minetest.get_modpath("mesecons") then + + local function trapdoor_switch(pos, node) + doors.trapdoor_toggle(pos, node, {is_fake_player = true}) + end + + def.mesecons = {effector = { + action_on = trapdoor_switch, + action_off = trapdoor_switch + }} end local def_opened = table.copy(def) local def_closed = table.copy(def) - def_closed.node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} - } + if def.nodebox_closed and def.nodebox_opened then + def_closed.node_box = def.nodebox_closed + else + def_closed.node_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + end + def_closed.selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } + def_closed.tiles = { def.tile_front, def.tile_front .. "^[transformFY", @@ -777,14 +905,19 @@ function doors.register_trapdoor(name, def) def.tile_side, def.tile_side } - def_opened.node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} - } + + if def.nodebox_opened and def.nodebox_closed then + def_opened.node_box = def.nodebox_opened + else + def_opened.node_box = { + type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + end + def_opened.selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } + def_opened.tiles = { def.tile_side, def.tile_side .. "^[transform2", @@ -804,28 +937,19 @@ function doors.register_trapdoor(name, def) doors.registered_trapdoors[name_closed] = true end +-- register trapdoors with recipes doors.register_trapdoor("doors:trapdoor", { - description = "Trapdoor", + description = S("Wooden Trapdoor"), inventory_image = "doors_trapdoor.png", wield_image = "doors_trapdoor.png", tile_front = "doors_trapdoor.png", tile_side = "doors_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1} }) -doors.register_trapdoor("doors:trapdoor_steel", { - description = "Steel Trapdoor", - inventory_image = "doors_trapdoor_steel.png", - wield_image = "doors_trapdoor_steel.png", - tile_front = "doors_trapdoor_steel.png", - tile_side = "doors_trapdoor_steel_side.png", - protected = true, - sound_open = "doors_steel_door_open", - sound_close = "doors_steel_door_close", - groups = {cracky = 1, level = 2, door = 1} -}) - minetest.register_craft({ output = "doors:trapdoor 2", recipe = { @@ -835,6 +959,20 @@ minetest.register_craft({ } }) +doors.register_trapdoor("doors:trapdoor_steel", { + description = S("Steel Trapdoor"), + inventory_image = "doors_trapdoor_steel.png", + wield_image = "doors_trapdoor_steel.png", + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", + protected = true, + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + groups = {cracky = 1, level = 2, door = 1} +}) + minetest.register_craft({ output = "doors:trapdoor_steel", recipe = { @@ -843,18 +981,39 @@ minetest.register_craft({ } }) ------key tool----- +-- based on castle_2 texture by sorcerykid's extra_doors mod -minetest.register_tool("doors:key", { - description = "Key Tool", - inventory_image = "doors_key.png", +doors.register_trapdoor("doors:trapdoor_oak", { + description = S("Oak Trapdoor"), + inventory_image = "doors_trapdoor_oak.png", + wield_image = "doors_trapdoor_oak.png", + tile_front = "doors_trapdoor_oak.png", + tile_side = "doors_trapdoor_oak_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2, door = 1} +}) + +minetest.register_craft({ + output = "doors:trapdoor_oak 3", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "default:tree", "group:wood"}, + {"", "", ""} + } +}) + +-- lock tool and recipe (use on doors to set to open, lock or protect) + +minetest.register_tool("doors:lock_tool", { + description = S("Lock Tool"), + inventory_image = "doors_lock_tool.png", on_use = function(itemstack, user, pointed_thing) local pos = pointed_thing.under - if pointed_thing.type ~= "node" - or not doors.get(pos) then + if pointed_thing.type ~= "node" or not doors.get(pos) then return end @@ -867,32 +1026,31 @@ minetest.register_tool("doors:key", { local ok = 0 local infotext = "" - if prot == "" - and owner == "" then + if prot == "" and owner == "" then -- flip normal to owned if minetest.is_protected(pos, player_name) then minetest.record_protection_violation(pos, player_name) else - infotext = "Owned by " .. player_name + infotext = ItemStack(minetest.get_node(pos).name):get_description() + .. "\n" .. S("Owned by @1", player_name) owner = player_name prot = "" ok = 1 end - elseif prot == "" - and owner ~= "" then + elseif prot == "" and owner ~= "" then -- flip owned to protected if player_name == owner then - infotext = "Protected by " .. player_name + infotext = ItemStack(minetest.get_node(pos).name):get_description() + .. "\n" .. S("Protected by @1", player_name) owner = "" prot = player_name ok = 1 end - elseif prot ~= "" - and owner == "" then + elseif prot ~= "" and owner == "" then -- flip protected to normal if player_name == prot then @@ -914,27 +1072,42 @@ minetest.register_tool("doors:key", { end end + minetest.sound_play("doors_fencegate_open", {pos = pos, gain = 0.15, + max_hear_distance = 8, pitch = 1.5}, true) + return itemstack end }) minetest.register_craft({ - output = "doors:key", + output = "doors:lock_tool", recipe = { - {"", "", "default:steel_ingot"}, - {"default:steel_ingot", "default:steel_ingot", ""}, - {"default:steel_ingot", "default:steel_ingot", ""} + {"", "default:steel_ingot", ""}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:gold_ingot", "default:steel_ingot"} } }) --- remove default key ---if minetest.registered_craftitems["default:skeleton_key"] then --- minetest.clear_craft({output = "default:skeleton_key"}) ---end +minetest.register_alias("doors:key", "doors:lock_tool") + +-- fence gate tall collision box setting -----fence gate---- local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 +-- fence gate node on_rightclick function + +function doors.fencegate_toggle(pos, node, clicker) + + local node_def = minetest.registered_nodes[node.name] + + minetest.swap_node(pos, {name = node_def._gate, param2 = node.param2}) + + minetest.sound_play(node_def._gate_sound, {pos = pos, gain = 0.15, + max_hear_distance = 8}, true) +end + +-- register fence gate function + function doors.register_fencegate(name, def) local fence = { @@ -952,19 +1125,13 @@ function doors.register_fencegate(name, def) on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - local node_def = minetest.registered_nodes[node.name] - - minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) - - minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, - max_hear_distance = 8}, true) + doors.fencegate_toggle(pos, node, clicker) return itemstack end, selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4} + type = "fixed", fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4} } } @@ -983,21 +1150,34 @@ function doors.register_fencegate(name, def) fence.groups.fence = 1 + -- mesecons support + if minetest.get_modpath("mesecons") then + + local function fencegate_switch(pos, node) + doors.fencegate_toggle(pos, node, {is_fake_player = true}) + end + + fence.mesecons = {effector = { + action_on = fencegate_switch, + action_off = fencegate_switch + }} + end + local fence_closed = table.copy(fence) fence_closed.mesh = "doors_fencegate_closed.obj" - fence_closed.gate = name .. "_open" - fence_closed.sound = "doors_fencegate_open" + fence_closed._gate = name .. "_open" + fence_closed._gate_sound = "doors_fencegate_open" fence_closed.collision_box = { type = "fixed", - fixed = {-1/2, -1/2, -1/4, 1/2, 1/2 + fence_collision_extra, 1/4} + fixed = {-1/2, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} } local fence_open = table.copy(fence) fence_open.mesh = "doors_fencegate_open.obj" - fence_open.gate = name .. "_closed" - fence_open.sound = "doors_fencegate_close" + fence_open._gate = name .. "_closed" + fence_open._gate_sound = "doors_fencegate_close" fence_open.groups.not_in_creative_inventory = 1 fence_open.collision_box = { type = "fixed", @@ -1017,82 +1197,71 @@ function doors.register_fencegate(name, def) }) end +-- register fence gates doors.register_fencegate("doors:gate_wood", { - description = "Wooden Fence Gate", + description = S("Apple Wood Fence Gate"), texture = "default_wood.png", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_acacia_wood", { - description = "Acacia Fence Gate", + description = S("Acacia Wood Fence Gate"), texture = "default_acacia_wood.png", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_junglewood", { - description = "Junglewood Fence Gate", + description = S("Jungle Wood Fence Gate"), texture = "default_junglewood.png", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_pine_wood", { - description = "Pine Fence Gate", + description = S("Pine Wood Fence Gate"), texture = "default_pine_wood.png", material = "default:pine_wood", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} }) doors.register_fencegate("doors:gate_aspen_wood", { - description = "Aspen Fence Gate", + description = S("Aspen Wood Fence Gate"), texture = "default_aspen_wood.png", material = "default:aspen_wood", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} }) -----fuels---- +-- burnable items + +minetest.register_craft({type = "fuel", recipe = "doors:trapdoor", burntime = 7}) + +minetest.register_craft({type = "fuel", recipe = "doors:trapdoor_oak", burntime = 10}) + +minetest.register_craft({type = "fuel", recipe = "doors:door_wood", burntime = 14}) + +minetest.register_craft({type = "fuel", recipe = "doors:gate_wood_closed", burntime = 7}) + +minetest.register_craft({type = "fuel", recipe = "doors:gate_acacia_wood_closed", + burntime = 8}) + +minetest.register_craft({type = "fuel", recipe = "doors:gate_junglewood_closed", + burntime = 9}) + +minetest.register_craft({type = "fuel", recipe = "doors:gate_pine_wood_closed", + burntime = 6}) + +minetest.register_craft({type = "fuel", recipe = "doors:gate_aspen_wood_closed", + burntime = 5}) + +-- old key into iron recipe minetest.register_craft({ - type = "fuel", - recipe = "doors:trapdoor", - burntime = 7 + output = "default:iron_lump", + recipe = {{"default:key"}} }) -minetest.register_craft({ - type = "fuel", - recipe = "doors:door_wood", - burntime = 14 -}) -minetest.register_craft({ - type = "fuel", - recipe = "doors:gate_wood_closed", - burntime = 7 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "doors:gate_acacia_wood_closed", - burntime = 8 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "doors:gate_junglewood_closed", - burntime = 9 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "doors:gate_pine_wood_closed", - burntime = 6 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "doors:gate_aspen_wood_closed", - burntime = 5 -}) +print("[MOD] Doors Redo loaded") diff --git a/mods/doors/license.txt b/mods/doors/license.txt index 8ce73c49..6d65d18b 100644 --- a/mods/doors/license.txt +++ b/mods/doors/license.txt @@ -162,3 +162,11 @@ affirmer. For more details: https://creativecommons.org/publicdomain/zero/1.0/ + +Textures by Phiwari (CC0) + doors_door_phiwari.png + doors_item_phiwari.png + +Textures by IceAgeComing (CC0) + doors_door_iceage.png + doors_item.iceage.png diff --git a/mods/doors/locale/doors.de.tr b/mods/doors/locale/doors.de.tr new file mode 100644 index 00000000..31f3752f --- /dev/null +++ b/mods/doors/locale/doors.de.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Verborgenes Türsegment +Owned by @1=Eigentum von @1 +You do not own this locked door.=Diese abgeschlossene Tür gehört Ihnen nicht. +a locked door=eine abgeschlossene Tür +Wooden Door=Holztür +Steel Door=Stahltür +Glass Door=Glastür +Obsidian Glass Door=Obsidianglastür +You do not own this trapdoor.=Diese Falltür gehört Ihnen nicht. +a locked trapdoor=eine abgeschlossene Falltür +Wooden Trapdoor=Holzfalltür +Steel Trapdoor=Stahlfalltür +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Apfelholzzauntor +Acacia Wood Fence Gate=Akazienholzzauntor +Jungle Wood Fence Gate=Dschungelholzzauntor +Pine Wood Fence Gate=Kiefernholzzauntor +Aspen Wood Fence Gate=Espenholzzauntor diff --git a/mods/doors/locale/doors.eo.tr b/mods/doors/locale/doors.eo.tr new file mode 100644 index 00000000..4257691d --- /dev/null +++ b/mods/doors/locale/doors.eo.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Kaŝita porda segmento +Owned by @1=Posedita de @1 +You do not own this locked door.=Vi ne posedas ĉi tiun ŝlositan pordon. +a locked door=ŝlosita pordo +Wooden Door=Ligna pordo +Steel Door=Ŝtala pordo +Glass Door=Vitra pordo +Obsidian Glass Door=Obsidiana vitra pordo +You do not own this trapdoor.=Vi ne posedas ĉi tiun plankpordon. +a locked trapdoor=ŝlosita plankpordo +Wooden Trapdoor=Ligna plankpordo +Steel Trapdoor=Ŝtala plankpordo +Oak Trapdoor=Kverka ligna plankpordo +Lock Tool=Ŝlosagordilo +Protected by @1=Protektita de @1 +Apple Wood Fence Gate=Poma ligna barila pordo +Acacia Wood Fence Gate=Akacia ligna barila pordo +Jungle Wood Fence Gate=Ĝangala ligna barila pordo +Pine Wood Fence Gate=Pina ligna barila pordo +Aspen Wood Fence Gate=Tremola ligna barila pordo diff --git a/mods/doors/locale/doors.es.tr b/mods/doors/locale/doors.es.tr new file mode 100644 index 00000000..74e32c75 --- /dev/null +++ b/mods/doors/locale/doors.es.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Segmento de puerta oculta +Owned by @1=Propiedad de @1 +You do not own this locked door.=Esta puerta cerrada no te pertenece. +a locked door=una puerta cerrada +Wooden Door=Puerta de madera +Steel Door=Puerta de acero +Glass Door=Puerta de vidrio +Obsidian Glass Door=Puerta de vidrio de obsidiana +You do not own this trapdoor.=Esta trampilla no te pertenece. +a locked trapdoor=una trampilla cerrada +Wooden Trapdoor=Trampilla de madera +Steel Trapdoor=Trampilla de acero +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Puerta de cerca de manzano +Acacia Wood Fence Gate=Puerta de cerca de acacia +Jungle Wood Fence Gate=Puerta de cerca de madera tropical +Pine Wood Fence Gate=Puerta de cerca de pino +Aspen Wood Fence Gate=Puerta de cerca de álamo diff --git a/mods/doors/locale/doors.fr.tr b/mods/doors/locale/doors.fr.tr new file mode 100644 index 00000000..cd89894e --- /dev/null +++ b/mods/doors/locale/doors.fr.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Segment de porte cachée +Owned by @1=Possédée par @1 +You do not own this locked door.=Cette porte vérouillée ne vous appartient pas. +a locked door=une porte verouillée +Wooden Door=Porte en bois +Steel Door=Porte en acier +Glass Door=Porte en verre +Obsidian Glass Door=Porte en verre d'obsidienne +You do not own this trapdoor.=Vous ne possédez pas cette trappe. +a locked trapdoor=une trappe verouillée +Wooden Trapdoor=Trappe en bois +Steel Trapdoor=Trappe en acier +Oak Trapdoor=Trappe en bois de chêne +Lock Tool=Outil de verrouillage +Protected by @1=Protégée par @1 +Apple Wood Fence Gate=Porte de clôture en bois de pommier +Acacia Wood Fence Gate=Porte de clôture en bois d'acacia +Jungle Wood Fence Gate=Porte de clôture en bois de la jungle +Pine Wood Fence Gate=Porte de clôture en bois de pin +Aspen Wood Fence Gate=Porte de clôture en bois de tremble diff --git a/mods/doors/locale/doors.id.tr b/mods/doors/locale/doors.id.tr new file mode 100644 index 00000000..3a5776a3 --- /dev/null +++ b/mods/doors/locale/doors.id.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Bagian Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu terkunci ini. +a locked door=pintu terkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Baja +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidian +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong terkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Baja +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Gerbang Kayu Pohon Apel +Acacia Wood Fence Gate=Gerbang Kayu Akasia +Jungle Wood Fence Gate=Gerbang Kayu Pohon Rimba +Pine Wood Fence Gate=Gerbang Kayu Pinus +Aspen Wood Fence Gate=Gerbang Kayu Aspen diff --git a/mods/doors/locale/doors.it.tr b/mods/doors/locale/doors.it.tr new file mode 100644 index 00000000..83651c0f --- /dev/null +++ b/mods/doors/locale/doors.it.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Segmento di porta nascosto +Owned by @1=Di proprietà di @1 +You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. +a locked door=una porta chiusa a chiave +Wooden Door=Porta di legno +Steel Door=Porta d'acciaio +Glass Door=Porta di vetro +Obsidian Glass Door=Porta di vetro d'ossidiana +You do not own this trapdoor.=Non sei il proprietario di questa botola. +a locked trapdoor=una botola chiusa a chiave +Wooden Trapdoor=Botola di legno +Steel Trapdoor=Botola d'acciaio +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Cancello della recinzione di legno di melo +Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia +Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla +Pine Wood Fence Gate=Cancello della recinzione di legno di pino +Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo diff --git a/mods/doors/locale/doors.ja.tr b/mods/doors/locale/doors.ja.tr new file mode 100644 index 00000000..9ad7db7a --- /dev/null +++ b/mods/doors/locale/doors.ja.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=隠しドアの区切り +Owned by @1=所有者 @1 +You do not own this locked door.=あなたはこのロックされたドアの所有者ではありません。 +a locked door=ロックされたドア +Wooden Door=木のドア +Steel Door=鉄のドア +Glass Door=ガラスのドア +Obsidian Glass Door=黒曜石のガラスのドア +You do not own this trapdoor.=あなたはこのトラップドアの所有者ではありません。 +a locked trapdoor=ロックされたトラップドア +Wooden Trapdoor=木のトラップドア +Steel Trapdoor=鉄のトラップドア +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=リンゴのフェンスゲート +Acacia Wood Fence Gate=アカシアのフェンスゲート +Jungle Wood Fence Gate=ジャングルのフェンスゲート +Pine Wood Fence Gate=マツのフェンスゲート +Aspen Wood Fence Gate=ポプラのフェンスゲート diff --git a/mods/doors/locale/doors.jbo.tr b/mods/doors/locale/doors.jbo.tr new file mode 100644 index 00000000..e8b5137a --- /dev/null +++ b/mods/doors/locale/doors.jbo.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=lo se mipri pagbu be lo vrogai +Owned by @1=.i ti ponse zoi zo'i.@1.zo'i +You do not own this locked door.=.i do na ponse lo ti selstela vrogai +a locked door=lo selstela vrogai +Wooden Door=lo mudri vrogai +Steel Door=lo gasta vrogai +Glass Door=lo blaci vrogai +Obsidian Glass Door=lo je'erma'ablaci blaci vrogai +You do not own this trapdoor.=.i do na ponse lo ti selstela lolvrogai +a locked trapdoor=lo selstela lolvrogai +Wooden Trapdoor=lo mudri lolvrogai +Steel Trapdoor=lo gasta lolvrogai +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=lo plisymudri garbimvrogai +Acacia Wood Fence Gate=lo atkaci,ia mudri garbimvrogai +Jungle Wood Fence Gate=lo glatimdemricfoi mudri garbimvrogai +Pine Wood Fence Gate=lo ku'urmudri garbimvrogai +Aspen Wood Fence Gate=lo mudrpopulu garbimvrogai diff --git a/mods/doors/locale/doors.ms.tr b/mods/doors/locale/doors.ms.tr new file mode 100644 index 00000000..e0b6aeff --- /dev/null +++ b/mods/doors/locale/doors.ms.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Segmen Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu berkunci ini. +a locked door=pintu berkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Keluli +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidia +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong berkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Keluli +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Pintu Pagar Kayu Epal +Acacia Wood Fence Gate=Pintu Pagar Kayu Akasia +Jungle Wood Fence Gate=Pintu Pagar Kayu Hutan +Pine Wood Fence Gate=Pintu Pagar Kayu Pain +Aspen Wood Fence Gate=Pintu Pagar Kayu Aspen diff --git a/mods/doors/locale/doors.pl.tr b/mods/doors/locale/doors.pl.tr new file mode 100644 index 00000000..a6c7321e --- /dev/null +++ b/mods/doors/locale/doors.pl.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Ukryty segment drzwi +Owned by @1=Właściciel: @1 +You do not own this locked door.=Nie jesteś właścicielem tych zablokowanych drzwi. +a locked door=zablokowane drzwi +Wooden Door=Drewniane drzwi +Steel Door=Stalowe drzwi +Glass Door=Szklane drzwi +Obsidian Glass Door=Drzwi z obsydianowego szkła +You do not own this trapdoor.=Nie jesteś właścicielem tego włazu. +a locked trapdoor=zablokowany właz +Wooden Trapdoor=Drewniany właz +Steel Trapdoor=Stalowy właz +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Furtka z jabłkowego drzewa +Acacia Wood Fence Gate=Furtka z akacjowego drzewa +Jungle Wood Fence Gate=Furtka z dżunglowego drzewa +Pine Wood Fence Gate=Furtka z sosnowego drzewa +Aspen Wood Fence Gate=Furtka z brzozowego drzewa diff --git a/mods/doors/locale/doors.pt_BR.tr b/mods/doors/locale/doors.pt_BR.tr new file mode 100644 index 00000000..d0412c44 --- /dev/null +++ b/mods/doors/locale/doors.pt_BR.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Segmento de Porta Oculto +Owned by @1=Propriedade de @1 +You do not own this locked door.=Você não é dono desta porta trancada. +a locked door=uma porta trancada +Wooden Door=Porta de Madeira +Steel Door=Porta de Aço +Glass Door=Porta de Vidro +Obsidian Glass Door=Porta de Vidro de Obsidiana +You do not own this trapdoor.=Você não é dono deste alçapão. +a locked trapdoor=um alçapão trancado +Wooden Trapdoor=Alçapão de Madeira +Steel Trapdoor=Alçapão de Aço +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Portão de Cerca de Macieira +Acacia Wood Fence Gate=Portão de Cerca de Acácia +Jungle Wood Fence Gate=Portão de Cerca de Madeira da Selva +Pine Wood Fence Gate=Portão de Cerca de Pinheiro +Aspen Wood Fence Gate=Portão de Cerca de Álamo diff --git a/mods/doors/locale/doors.ru.tr b/mods/doors/locale/doors.ru.tr new file mode 100644 index 00000000..0e9fa38a --- /dev/null +++ b/mods/doors/locale/doors.ru.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Спрятанная Часть Двери +Owned by @1=Владелец: @1 +You do not own this locked door.=Вы не владелец этой заблокированной двери. +a locked door=заблокированная дверь +Wooden Door=Деревянная Дверь +Steel Door=Стальная Дверь +Glass Door=Стеклянная Дверь +Obsidian Glass Door=Дверь Из Обсидианового Стекла +You do not own this trapdoor.=Вы не владелец этого люка. +a locked trapdoor=заблокированный люк +Wooden Trapdoor=Деревянный Люк +Steel Trapdoor=Стальной Люк +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Яблоневая Деревянная Калитка +Acacia Wood Fence Gate=Деревянная Калитка Из Акации +Jungle Wood Fence Gate=Деревянная Калитка Из Тропического Дерева +Pine Wood Fence Gate=Сосновая Деревянная Калитка +Aspen Wood Fence Gate=Осиновая Деревянная Калитка diff --git a/mods/doors/locale/doors.sk.tr b/mods/doors/locale/doors.sk.tr new file mode 100644 index 00000000..32b5daeb --- /dev/null +++ b/mods/doors/locale/doors.sk.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Skrytá časť dverí +Owned by @1=Vlastník - @1 +You do not own this locked door.=Nevlastníš tieto uzamknuté dvere. +a locked door=uzamknuté dvere +Wooden Door=Drevené dvere +Steel Door=Oceľové dvere +Glass Door=Sklenené dvere +Obsidian Glass Door=Obsidiánové sklenené dvere +You do not own this trapdoor.=Nevlastníš tieto padacie dvere. +a locked trapdoor=uzamknuté padacie dvere +Wooden Trapdoor=Drevené padacie dvere +Steel Trapdoor=Oceľové padacie dvere +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Drevený plot z jablone +Acacia Wood Fence Gate=Drevený plot z akácie +Jungle Wood Fence Gate=Drevený plot z džungľového dreva +Pine Wood Fence Gate=Drevený plot z borovice +Aspen Wood Fence Gate=Drevený plot z osiky diff --git a/mods/doors/locale/doors.sv.tr b/mods/doors/locale/doors.sv.tr new file mode 100644 index 00000000..d892a9d1 --- /dev/null +++ b/mods/doors/locale/doors.sv.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Dolt dörrsegment +Owned by @1=Ägd av @1 +You do not own this locked door.=Du äger inte denna låsta dörr. +a locked door=en låst dörr +Wooden Door=Trädörr +Steel Door=Ståldörr +Glass Door=Glasdörr +Obsidian Glass Door=Obsidianglasdörr +You do not own this trapdoor.=Du äger inte denna fallucka +a locked trapdoor=en låst fallucka +Wooden Trapdoor=Träfallucka +Steel Trapdoor=Stålfallucka +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Äppleträfallucka +Acacia Wood Fence Gate=Akaciaträfallucka +Jungle Wood Fence Gate=Djungelträfallucka +Pine Wood Fence Gate=Tallträfallucka +Aspen Wood Fence Gate=Aspträfallucka diff --git a/mods/doors/locale/doors.uk.tr b/mods/doors/locale/doors.uk.tr new file mode 100644 index 00000000..f4cd7be7 --- /dev/null +++ b/mods/doors/locale/doors.uk.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=Захована Частина Дверей +Owned by @1=Власник: @1 +You do not own this locked door.=Ви не власник цих заблокованих дверей. +a locked door=заблоковані двері +Wooden Door=Дерев'яні двері +Steel Door=Сталеві Двері +Glass Door=Скляні двері +Obsidian Glass Door=Двері З Обсидіанового Скла +You do not own this trapdoor.=Ви не є власником цього люка. +a locked trapdoor=заблокований люк +Wooden Trapdoor=Дерев'яний Люк +Steel Trapdoor=Сталевий Люк +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=Яблунева Дерев'яна Хвіртка +Acacia Wood Fence Gate=Дерев'яна Хвіртка З Акації +Jungle Wood Fence Gate=Дерев'яна Хвіртка З Тропічного Дерева +Pine Wood Fence Gate=Соснова Дерев'яна Хвіртка +Aspen Wood Fence Gate=Осикова Дерев'яна Хвіртка diff --git a/mods/doors/locale/doors.zh_CN.tr b/mods/doors/locale/doors.zh_CN.tr new file mode 100644 index 00000000..828fc4f2 --- /dev/null +++ b/mods/doors/locale/doors.zh_CN.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=隐藏门段 +Owned by @1=由@1所有 +You do not own this locked door.=这个门不属于你。 +a locked door=一扇已上锁的门 +Wooden Door=木门 +Steel Door=铁门 +Glass Door=玻璃门 +Obsidian Glass Door=黑曜石玻璃门 +You do not own this trapdoor.=这个活板门不属于你。 +a locked trapdoor=一扇已上锁的活板门 +Wooden Trapdoor=木活板门 +Steel Trapdoor=铁活板门 +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=苹果木栅栏门 +Acacia Wood Fence Gate=相思木栅栏门 +Jungle Wood Fence Gate=丛林木栅栏门 +Pine Wood Fence Gate=松木栅栏门 +Aspen Wood Fence Gate=白杨木栅栏门 diff --git a/mods/doors/locale/doors.zh_TW.tr b/mods/doors/locale/doors.zh_TW.tr new file mode 100644 index 00000000..c12778cb --- /dev/null +++ b/mods/doors/locale/doors.zh_TW.tr @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment=隱藏門段 +Owned by @1=由@1擁有 +You do not own this locked door.=這個門不屬於你所有。 +a locked door=一扇已上鎖的門 +Wooden Door=木門 +Steel Door=鐵門 +Glass Door=玻璃門 +Obsidian Glass Door=黑曜石玻璃門 +You do not own this trapdoor.=這個活板門不屬於你所有。 +a locked trapdoor=一扇已上鎖的活板門 +Wooden Trapdoor=木活板門 +Steel Trapdoor=鐵活板門 +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate=蘋果木柵欄門 +Acacia Wood Fence Gate=相思木柵欄門 +Jungle Wood Fence Gate=叢林木柵欄門 +Pine Wood Fence Gate=松木柵欄門 +Aspen Wood Fence Gate=白楊木柵欄門 diff --git a/mods/doors/locale/template.txt b/mods/doors/locale/template.txt new file mode 100644 index 00000000..c4aace46 --- /dev/null +++ b/mods/doors/locale/template.txt @@ -0,0 +1,21 @@ +# textdomain: doors +Hidden Door Segment= +Owned by @1= +You do not own this locked door.= +a locked door= +Wooden Door= +Steel Door= +Glass Door= +Obsidian Glass Door= +You do not own this trapdoor.= +a locked trapdoor= +Wooden Trapdoor= +Steel Trapdoor= +Oak Trapdoor= +Lock Tool= +Protected by @1= +Apple Wood Fence Gate= +Acacia Wood Fence Gate= +Jungle Wood Fence Gate= +Pine Wood Fence Gate= +Aspen Wood Fence Gate= diff --git a/mods/doors/mod.conf b/mods/doors/mod.conf index bde5a52b..461de43b 100644 --- a/mods/doors/mod.conf +++ b/mods/doors/mod.conf @@ -1,4 +1,5 @@ name = doors +description = Replaces default doors and adds protection support with lock tool. depends = default optional_depends = screwdriver -description = Replaces default doors and adds protection support with switching key. +min_minetest_version = 5.0 diff --git a/mods/doors/screenshot.jpg b/mods/doors/screenshot.jpg index e3e7f40b..6b1daa9b 100644 Binary files a/mods/doors/screenshot.jpg and b/mods/doors/screenshot.jpg differ diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index afc36edb..d102f84c 100644 Binary files a/mods/doors/textures/doors_door_glass.png and b/mods/doors/textures/doors_door_glass.png differ diff --git a/mods/doors/textures/doors_door_obsidian_glass.png b/mods/doors/textures/doors_door_obsidian_glass.png index 6229c94d..8f0cfc42 100644 Binary files a/mods/doors/textures/doors_door_obsidian_glass.png and b/mods/doors/textures/doors_door_obsidian_glass.png differ diff --git a/mods/doors/textures/doors_key.png b/mods/doors/textures/doors_key.png deleted file mode 100644 index e69a71ce..00000000 Binary files a/mods/doors/textures/doors_key.png and /dev/null differ diff --git a/mods/doors/textures/doors_lock_tool.png b/mods/doors/textures/doors_lock_tool.png new file mode 100644 index 00000000..02e9fbaf Binary files /dev/null and b/mods/doors/textures/doors_lock_tool.png differ diff --git a/mods/doors/textures/doors_trapdoor_oak.png b/mods/doors/textures/doors_trapdoor_oak.png new file mode 100644 index 00000000..fd0edf89 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_oak.png differ diff --git a/mods/doors/textures/doors_trapdoor_oak_side.png b/mods/doors/textures/doors_trapdoor_oak_side.png new file mode 100644 index 00000000..4c23c6a2 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_oak_side.png differ diff --git a/mods/drinks/depends.txt b/mods/drinks/depends.txt index f28d1a64..313233d8 100644 --- a/mods/drinks/depends.txt +++ b/mods/drinks/depends.txt @@ -9,5 +9,5 @@ farming_plus? crops? farming? minetest_doc_modpack? -fruits? +fruit? ethereal? diff --git a/mods/drinks/init.lua b/mods/drinks/init.lua index 987c341c..b344b884 100644 --- a/mods/drinks/init.lua +++ b/mods/drinks/init.lua @@ -141,6 +141,9 @@ if minetest.get_modpath('farming') then drinks.juiceable['blueberries'] = true drinks.juiceable['pineapple'] = true drinks.juiceable['pineapple_ring'] = true + drinks.juiceable['blueberries'] = true + drinks.juiceable['blackberry'] = true + drinks.juiceable['strawberry'] = true table.insert(drinks.drink_table, {'melon', 'Melon', '#ef4646'}) table.insert(drinks.drink_table, {'tomato', 'Tomato', '#990000'}) table.insert(drinks.drink_table, {'carrot', 'Carrot', '#ed9121'}) @@ -151,6 +154,9 @@ if minetest.get_modpath('farming') then table.insert(drinks.drink_table, {'rhubarb', 'Rhubarb', '#fb8461'}) table.insert(drinks.drink_table, {'blueberries', 'Blueberry', '#521dcb'}) table.insert(drinks.drink_table, {'pineapple', 'Pineapple', '#dcd611'}) + table.insert(drinks.drink_table, {'blueberries', 'Blueberry', '#521dcb'}) + table.insert(drinks.drink_table, {'blackberry', 'Blackberry', '#581845'}) + table.insert(drinks.drink_table, {'strawberry', 'Strawberry', '#ff3636'}) minetest.register_alias_force('farming:carrot_juice', 'drinks:jcu_carrot') minetest.register_alias_force('farming:pineapple_juice', 'drinks:jcu_pineapple') end diff --git a/mods/drinks/mod.conf b/mods/drinks/mod.conf index 78743915..03766ce4 100644 --- a/mods/drinks/mod.conf +++ b/mods/drinks/mod.conf @@ -2,5 +2,5 @@ name = drinks depends= bucket,default,vessels,stairs description = Adds a juice press and two juice storage containers. Most fruits and several veggies can be juiced. The resulting drinks can be 'ate' to gain health, or if you are using the thirsty mod, to regain hydration. author = Nathan, Napiophelios -optional_depends = hunger,thirsty,plantlife,farming_plus,crops,farming,minetest_doc_modpack,fruits,ethereal +optional_depends = hunger,thirsty,plantlife,farming_plus,crops,farming,minetest_doc_modpack,fruit,ethereal title = Drinks diff --git a/mods/farming/README.md b/mods/farming/README.md index 6c7b1a88..ec4143e1 100644 --- a/mods/farming/README.md +++ b/mods/farming/README.md @@ -1,18 +1,225 @@ -# Farming Redo Mod -### by TenPlus1 +Farming Redo mod for Minetest +============================= + +Information +----------- + +This mod replaces the default `farming` mod with a fully compatible API that allows +players to grow crops even when they are not nearby. It also includes many new foods +and crops which can be planted directly onto tilled soil without seeds. Crops that do +require seeds like wheat and cotton are found when digging in long grasses, and will +require player to stay nearby until they germinate before growing normally. + +![screenshot.png](screenshot.png) + +Tech information +---------------- + +Crops grow by adding your new plant to the {growing = 1} group and numbering the stages from _1 to as many stages as you like, but the underscore MUST be used only once in the node name to separate plant from stage number e.g. + +* "farming:cotton_1" through to "farming:cotton_8" +* "farming:wheat_1" through to "farming:wheat_8" +* "farming:cucumber_1" through to "farming:cucumber_4" https://forum.minetest.net/viewtopic.php?id=9019 -Farming Redo is a simplified version of the built-in farming mod in minetest and comes with wheat, cotton, carrot, cucumber, potato and tomato to start out with which spawn throughout the map... new foods need only be planted on tilled soil so no seeds are required, original wheat and cotton will require seeds which are found inside normal and jungle grass... +Farming Redo also works with Bonemeal mod for quick growing crops and saplings which can +be found at https://notabug.org/TenPlus1/bonemeal -This mod works by adding your new plant to the {growing=1} group and numbering the stages from _1 to as many stages as you like, but the underscore MUST be used only once in the node name to separate plant from stage number e.g. +#### Optional dependences: -"farming:cotton_1" through to "farming:cotton_8" -"farming:wheat_1" through to "farming:wheat_8" -"farming:cucumber_4" through to "farming:cucumber_4" +* default +* mcl_core, mcl_sounds, mcl_farming, mcl_stairs +* stairs +* lucky_block (adds 47 lucky blocks) +* toolranks + +#### Configuration + +`farming.conf` is used to load custom settings for each crop and can be found in either the +farming mod folder or the world folder. Also `minetest.conf` contains a setting for crop growth speed. + + +| Configuration | type | default | file | Notes | +| -------------------- | ----- | ------- | ------------ | ----------------------------------------- | +| farming_stage_length | float | 160.0 | minetest.conf | Contains a value used for speed of crop growth in seconds | +| farming.min_light | int | 12 | farming.conf | default minimum light levels crops need to grow | +| farming.max_light | int | 15 | farming.conf | default maximum light levels crops need to grow | +| farming_use_utensils | bool | True | farming.conf | When True uses utensils in craft recipes | +| farming.carrot | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.potato | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.tomato | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cucumber | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.corn | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.coffee | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.melon | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pumpkin | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cocoa | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.raspberry | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.blueberry | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.rhubarb | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.beans | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.grapes | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.barley | bool | true | farming.conf | true to enable crop/food, false to disable | +| farming.chili | float | 0.003 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.hemp | float | 0.003 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.garlic | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.onion | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pepper | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pineapple | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.peas | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.beetroot | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.mint | float | 0.005 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cabbage | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.blackberry | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.lettuce | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.soy | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.vanilla | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.artichoke | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.parsley | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.sunflower | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.grains | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.rice | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.asparagus | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.eggplant | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.spinach | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.strawberry | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | + +#### Nodes and food + +This farming mod provides a large selection of craftable food and items: + +| Node name | Description name | +| ----------------------- | --------------------- | +| farming:salt | Salt | +| farming:salt_crystal | Salt Crystal | +| farming:chili_powder | Chili Powder | +| farming:rose_water | Rose Water | +| farming:glass_water | Glass of Water | +| farming:sugar | Sugar | +| farming:sugar_cube | Sugar Cube | +| farming:caramel | Caramel | +| farming:turkish_delight | Turkish Delight | +| farming:garlic_bread | Garlic Bread | +| farming:donut | Donut | +| farming:donut_chocolate | Chocolate Donut | +| farming:donut_apple | Apple Donut | +| farming:porridge | Porridge | +| farming:jaffa_cake | Jaffa Cake | +| farming:apple_pie | Apple Pie | +| farming:cactus_juice | Cactus Juice | +| farming:pasta | Pasta | +| farming:mac_and_cheese | Mac & Cheese | +| farming:spaghetti | Spaghetti | +| farming:bibimbap | Bibimbap | +| farming:burger | Burger | +| farming:salad | Salad | +| farming:smoothie_berry | Triple Berry Smoothie | +| farming:spanish_potatoes | Spanish Potatoes | +| farming:potato_omelet | Potato omelet | +| farming:paella | Paella | +| farming:flan | Vanilla Flan | +| farming:cheese_vegan | Vegan Cheese | +| farming:onigiri | Onigiri | +| farming:gyoza | Gyoza | +| farming:mochi | Mochi | +| farming:beetroot_soup | Beetroot Soup | +| farming:muffin_blueberry | Blueberry Muffin | +| farming:blueberry_pie | Blueberry Pie | +| farming:carrot_juice | Carrot Juice | +| farming:carrot_gold | Golden Carrot (revives) | +| farming:chili_bowl | Bowl or Chili | +| farming:cocoa_beans | Cocoa Beans | +| farming:cookie | Chocolate Cookie | +| farming:chocolate_dark | Bar of Dark Chocolate | +| farming:chocolate_block | Chocolate Block | +| farming:coffee_cup | Cup of Coffee | +| farming:corn_cob | Corn on the Cob | +| farming:popcorn | Popcorn | +| farming:cornstarch | Cornstarch | +| farming:ethanol | Bottle of Ethanol (fuel) | +| farming:string | String | +| farming:garlic_braid | Garlic Braid | +| farming:garlic_clove | Garlic Clove | +| farming:hemp_oil | Hemp Oil | +| farming:hemp_fibre | Hemp Fibre | +| farming:hemp_block | Hemp Block | +| farming:hemp_rope | Hemp Rope | +| farming:mint_tea | Mint Tea | +| farming:onion_soup | Onion Soup | +| farming:pea_soup | Pea Soup | +| farming:pepper_ground | Ground Pepper | +| farming:pineapple_ring | Pineapple Ring | +| farming:pineapple_juice | Pineapple Juice | +| farming:baked_potato | Baked Potato | +| farming:potato_salad | Cucumber & Potato Salad | +| farming:jackolantern | Jack 'O Lantern | +| farming:scarecrow_bottom | Scarecrow Bottom | +| farming:pumpkin_dough | Pumpkin Dough | +| farming:pumpkin_bread | Pumpkin Bread | +| farming:smoothie_raspberry | Raspberry Smoothie | +| farming:rhubarb_pie | Rhybarb Pie | +| farming:rice_flour | Rice Flour | +| farming:rice_bread | Rice Bread | +| farming:flour_multigrain | Multigrain Rice | +| farming:bread_multigrain | Multigrain Bread | +| farming:soy_sauce | Soy Sauce | +| farming:soy_milk | Soy Milk | +| farming:tofu | Tofu | +| farming:tofu_cooked | Cooked Tofu | +| farming:sunflower_seeds_toasted | Toasted Sunflower Seeds | +| farming:sunflower_oil | Sunflower Oil | +| farming:sunflower_bread | Sunflower Bread | +| farming:tomato_soup | Tomato Soup | +| farming:vanilla_extract | Vanilla Extract | +| farming:flour | Flour | +| farming:bread | Bread | +| farming:straw | Straw Block | +| farming:bread_slice | Bread Slice | +| farming:toast | Toast | +| farming:toast_sandwich | Toast Sandwich | + +#### Item and Tools + +| node name | Description | +| ----------------------- | --------------------- | +| farming:trellis | Trellis (for growing grapes) | +| farming:beanpole | Bean Pole (for growing beans) | +| farming:scythe_mithril | Mithril Scythe (Use to harvest and replant crops) | +| farming:hoe_bomb | Hoe Bomb (use or throw on grassy areas to hoe land) | +| farming:hoe_wood | Wooden Hoe | +| farming:hoe_stone | Stone Hoe | +| farming:hoe_steel | Steel Hoe | +| farming:hoe_bronze | Bronze Hoe | +| farming:hoe_mese | Mese Hoe | +| farming:hoe_diamond | Diamond Hoe | +| farming:bowl | Wooden Bowl | +| farming:saucepan | Saucepan | +| farming:pot | Cooking Pot | +| farming:baking_tray | Baking Tray | +| farming:skillet | Skillet | +| farming:mortar_pestle | Mortar and Pestle | +| farming:cutting_board | Cutting Board | +| farming:juicer | Juicer | +| farming:mixing_bowl | Glass Mixing Bowl | +| moreores:hoe_silver | Silver Hoe | +| moreores:hoe_mithril | Mitril Hoe | + +#### Nodes and Aliasing + +This mod is also a direct replacement for the older Farming Plus mod and will replace all +of it's nodes and items with one's found within Farming Redo. + +#### ABM + +The ABM checks every 5 minutes to make sure crops in `group:growing` that were planted +on an older map are enabled and growing properly. ### Changelog: +- 1.49 - Added {eatable=1} groups to food items with the value giving HP when eaten, improved mineclone support, separated foods from crop files., hoes can deal damage. +- 1.48 - added 'farming_use_utensils' setting to enable/disable utensils in recipes, added mayonnaise (thx felfa), added gingerbread man, Added MineClone2 compatibility +- 1.47 - Now blueberries can make blue dye, tweak soil types to work better with older 0.4.x clients and add spanish translation (thx mckaygerhard), add trellis setting to registered_crops and fix pea and soy crop names (thx nixnoxus), add strawberries if ethereal mod not active, added asparagus; spinach; eggplant (thx Atlante for new textures), Sugar Cube - 1.46 - Added min/max default light settings, added lettuce and blackberries with food items (thanks OgelGames), added soya, vanilla and sunflowers (thanks Felfa), added tofu, added salt crystals (thanks gorlock) - 1.45 - Dirt and Hoes are more in line with default by using dry/wet/base, added cactus juice, added pasta, spaghetti, cabbage, korean bibimbap, code tidy options, onion soup added (thanks edcrypt), Added apple pie, added wild cotton to savanna @@ -67,5 +274,3 @@ options, onion soup added (thanks edcrypt), Added apple pie, added wild cotton t - 0.2 - Fixed check for wet soil - 0.1 - Fixed growing bug - 0.0 - Initial release - -### Lucky Blocks: 39 diff --git a/mods/farming/textures/farming_banana_leaf.png b/mods/farming/alt_textures/ethereal_banana_leaf_32px.png similarity index 100% rename from mods/farming/textures/farming_banana_leaf.png rename to mods/farming/alt_textures/ethereal_banana_leaf_32px.png diff --git a/mods/farming/alt_textures/ethereal_strawberry.png b/mods/farming/alt_textures/ethereal_strawberry.png new file mode 100644 index 00000000..5b43e6bc Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_1.png b/mods/farming/alt_textures/ethereal_strawberry_1.png new file mode 100644 index 00000000..3fa21edc Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_1.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_2.png b/mods/farming/alt_textures/ethereal_strawberry_2.png new file mode 100644 index 00000000..751115e9 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_2.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_3.png b/mods/farming/alt_textures/ethereal_strawberry_3.png new file mode 100644 index 00000000..8b7a7b8c Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_3.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_4.png b/mods/farming/alt_textures/ethereal_strawberry_4.png new file mode 100644 index 00000000..dcf00175 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_4.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_5.png b/mods/farming/alt_textures/ethereal_strawberry_5.png new file mode 100644 index 00000000..a2decaae Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_5.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_6.png b/mods/farming/alt_textures/ethereal_strawberry_6.png new file mode 100644 index 00000000..a4d0d603 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_6.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_7.png b/mods/farming/alt_textures/ethereal_strawberry_7.png new file mode 100644 index 00000000..ace223cd Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_7.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_8.png b/mods/farming/alt_textures/ethereal_strawberry_8.png new file mode 100644 index 00000000..6d7280b6 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_8.png differ diff --git a/mods/farming/alt_textures/farming_burger_32px.png b/mods/farming/alt_textures/farming_burger_32px.png new file mode 100644 index 00000000..43ab6d49 Binary files /dev/null and b/mods/farming/alt_textures/farming_burger_32px.png differ diff --git a/mods/farming/alt_textures/farming_mayo_32px.png b/mods/farming/alt_textures/farming_mayo_32px.png new file mode 100644 index 00000000..c8e773b9 Binary files /dev/null and b/mods/farming/alt_textures/farming_mayo_32px.png differ diff --git a/mods/farming/alt_textures/farming_paella_32px.png b/mods/farming/alt_textures/farming_paella_32px.png new file mode 100644 index 00000000..1362ac74 Binary files /dev/null and b/mods/farming/alt_textures/farming_paella_32px.png differ diff --git a/mods/farming/alt_textures/farming_popcorn_32px.png b/mods/farming/alt_textures/farming_popcorn_32px.png new file mode 100644 index 00000000..846399e3 Binary files /dev/null and b/mods/farming/alt_textures/farming_popcorn_32px.png differ diff --git a/mods/farming/alt_textures/farming_potato_omelet_32px.png b/mods/farming/alt_textures/farming_potato_omelet_32px.png new file mode 100644 index 00000000..abdacada Binary files /dev/null and b/mods/farming/alt_textures/farming_potato_omelet_32px.png differ diff --git a/mods/farming/alt_textures/farming_potato_salad_32px.png b/mods/farming/alt_textures/farming_potato_salad_32px.png new file mode 100644 index 00000000..0028c91e Binary files /dev/null and b/mods/farming/alt_textures/farming_potato_salad_32px.png differ diff --git a/mods/farming/alt_textures/farming_spaghetti_24px.png b/mods/farming/alt_textures/farming_spaghetti_24px.png new file mode 100644 index 00000000..a401281b Binary files /dev/null and b/mods/farming/alt_textures/farming_spaghetti_24px.png differ diff --git a/mods/farming/alt_textures/farming_spanish_potatoes_32px.png b/mods/farming/alt_textures/farming_spanish_potatoes_32px.png new file mode 100644 index 00000000..198b50e4 Binary files /dev/null and b/mods/farming/alt_textures/farming_spanish_potatoes_32px.png differ diff --git a/mods/farming/alt_textures/farming_sunflower_32px.png b/mods/farming/alt_textures/farming_sunflower_32px.png new file mode 100644 index 00000000..06b9387d Binary files /dev/null and b/mods/farming/alt_textures/farming_sunflower_32px.png differ diff --git a/mods/farming/alt_textures/farming_sunflower_bread_32px.png b/mods/farming/alt_textures/farming_sunflower_bread_32px.png new file mode 100644 index 00000000..112e8c63 Binary files /dev/null and b/mods/farming/alt_textures/farming_sunflower_bread_32px.png differ diff --git a/mods/farming/alt_textures/farming_vanilla_flan_32px.png b/mods/farming/alt_textures/farming_vanilla_flan_32px.png new file mode 100644 index 00000000..c8b9ff06 Binary files /dev/null and b/mods/farming/alt_textures/farming_vanilla_flan_32px.png differ diff --git a/mods/farming/api.txt b/mods/farming/api.txt index 81092c69..19481f44 100644 --- a/mods/farming/api.txt +++ b/mods/farming/api.txt @@ -16,10 +16,10 @@ The farming API allows you to easily register plants and hoes. 'minlight' min light level needed to grow 'maxlight' max light level needed to grow 'steps' number of steps crop has in growth cycle + 'trellis' name of trellis node (e.g. "farming:trellis"), default: nil ### Hoe Definition - { description = "My Hoe", -- Description for tooltip inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image @@ -40,7 +40,8 @@ The farming API allows you to easily register plants and hoes. steps = 8, -- How many steps the plant has to grow, until it can be harvested -- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) minlight = 13, -- Minimum light to grow - maxlight = default.LIGHT_MAX -- Maximum light to grow + maxlight = minetest.LIGHT_MAX -- Maximum light to grow + can_grow = function(pos) -- Called every growth tick to check if plant can grow returning True if needs are met (optional, defaults to checking for wet soil below plant). } Note: Any crops registered with the above function will use the new growing routines, also if crops are manually added with the {growing=1} group they will also grow. @@ -49,12 +50,12 @@ Note: Any crops registered with the above function will use the new growing rout If a mod registers nodes to be used as crops using the {growing=1} group then an additional function can be used for custom growth checks instead of the standard 'are we above wet soil'. -growth_check = function(pos, node_name) +growth_check = function(pos, [node_name]) [DEPRECATED for above can_grow function] -- check surrounding for jungle tree if minetest.find_node_near(pos, 1, {"default:jungletree"}) then - return false -- place next growth stage + return true -- place next growth stage end - return true -- condition not met, skip next growth stage until next check + return false -- condition not met, skip next growth stage until next check end, ### Scythe items that will not drop @@ -62,3 +63,31 @@ end, This is a function to add items to a list that scythes will not drop, e.g. farming:trellis or farming:beanpole. farming.add_to_scythe_not_drops(item_name) + +### Start timer function + +A handy function that starts a crops timer with a randomly selected time set by using +stage_length setting. This is mostly used for special functions or 3rd party mods. + +farming.start_seed_timer(pos) + + +Node Sounds +----------- + +Farming Redo will detect wether the Default mod or MineClone/VoxeLibre mod is active and +store whichever sound set is available inside the following to save any other farming +mods from having to detect it themselves: + +farming.node_sound_defaults() +farming.node_sound_stone_defaults() +farming.node_sound_dirt_defaults() +farming.node_sound_sand_defaults() +farming.node_sound_gravel_defaults() +farming.node_sound_wood_defaults() +farming.node_sound_leaves_defaults() +farming.node_sound_ice_defaults() +farming.node_sound_metal_defaults() +farming.node_sound_water_defaults() +farming.node_sound_snow_defaults() +farming.node_sound_glass_defaults() diff --git a/mods/farming/compatibility.lua b/mods/farming/compatibility.lua index 1fdf6203..6895326e 100644 --- a/mods/farming/compatibility.lua +++ b/mods/farming/compatibility.lua @@ -1,5 +1,5 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") --= Helpers @@ -8,16 +8,17 @@ local alias = function(orig, new) minetest.register_alias(orig, new) end ---= Overrides (add food_* group to apple and brown mushroom) +--= Add {eatable} group to default food items if found -minetest.override_item("default:apple", { - groups = {food_apple = 1, fleshy = 3, dig_immediate = 3, flammable = 2, - leafdecay = 3, leafdecay_drop = 1} -}) +farming.add_eatable("default:apple", 2) +farming.add_eatable("default:blueberries", 1) +farming.add_eatable("flowers:mushroom_brown", 1) +farming.add_eatable("flowers:mushroom_red", -5) --= Aliases -- Banana + if eth then alias("farming_plus:banana_sapling", "ethereal:banana_tree_sapling") alias("farming_plus:banana_leaves", "ethereal:bananaleaves") @@ -36,20 +37,26 @@ else type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0.2, 0.2} }, - groups = {food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2}, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3 + }, + is_ground_content = false, on_use = minetest.item_eat(2), - sounds = default.node_sound_leaves_defaults() + sounds = farming.node_sound_leaves_defaults() }) + farming.add_eatable("ethereal:banana", 2) + minetest.register_node(":ethereal:bananaleaves", { description = S("Banana Leaves"), - tiles = {"farming_banana_leaf.png"}, - inventory_image = "farming_banana_leaf.png", - wield_image = "farming_banana_leaf.png", + tiles = {"ethereal_banana_leaf.png"}, + inventory_image = "ethereal_banana_leaf.png", + wield_image = "ethereal_banana_leaf.png", paramtype = "light", waving = 1, groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, - sounds = default.node_sound_leaves_defaults() + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() }) alias("farming_plus:banana_sapling", "default:sapling") @@ -58,6 +65,7 @@ else end -- Carrot + alias("farming_plus:carrot_seed", "farming:carrot") alias("farming_plus:carrot_1", "farming:carrot_1") alias("farming_plus:carrot_2", "farming:carrot_4") @@ -66,12 +74,14 @@ alias("farming_plus:carrot", "farming:carrot_8") alias("farming_plus:carrot_item", "farming:carrot") -- Cocoa + alias("farming_plus:cocoa_sapling", "farming:cocoa_beans") alias("farming_plus:cocoa_leaves", "default:leaves") alias("farming_plus:cocoa", "default:apple") alias("farming_plus:cocoa_bean", "farming:cocoa_beans") -- Orange + alias("farming_plus:orange_1", "farming:tomato_1") alias("farming_plus:orange_2", "farming:tomato_4") alias("farming_plus:orange_3", "farming:tomato_6") @@ -94,17 +104,23 @@ else type = "fixed", fixed = {-0.2, -0.3, -0.2, 0.2, 0.2, 0.2} }, - groups = {food_orange = 1, fleshy = 3, dig_immediate = 3, flammable = 2}, + groups = { + food_orange = 1, fleshy = 3, dig_immediate = 3, flammable = 2 + }, + is_ground_content = false, on_use = minetest.item_eat(4), - sounds = default.node_sound_leaves_defaults() + sounds = farming.node_sound_leaves_defaults() }) + farming.add_eatable("ethereal:orange", 4) + alias("farming_plus:orange_item", "ethereal:orange") alias("farming_plus:orange", "ethereal:orange") alias("farming_plus:orange_seed", "default:sapling") end -- Potato + alias("farming_plus:potato_item", "farming:potato") alias("farming_plus:potato_1", "farming:potato_1") alias("farming_plus:potato_2", "farming:potato_2") @@ -112,6 +128,7 @@ alias("farming_plus:potato", "farming:potato_3") alias("farming_plus:potato_seed", "farming:potato") -- Pumpkin + alias("farming:pumpkin_seed", "farming:pumpkin_slice") alias("farming:pumpkin_face", "farming:jackolantern") alias("farming:pumpkin_face_light", "farming:jackolantern_on") @@ -124,6 +141,7 @@ alias("farming:scarecrow_light", "farming:jackolantern_on") alias("farming:pumpkin_flour", "farming:pumpkin_dough") -- Rhubarb + alias("farming_plus:rhubarb_seed", "farming:rhubarb") alias("farming_plus:rhubarb_1", "farming:rhubarb_1") alias("farming_plus:rhubarb_2", "farming:rhubarb_2") @@ -131,31 +149,16 @@ alias("farming_plus:rhubarb", "farming:rhubarb_3") alias("farming_plus:rhubarb_item", "farming:rhubarb") -- Strawberry -if eth then - alias("farming_plus:strawberry_item", "ethereal:strawberry") - alias("farming_plus:strawberry_seed", "ethereal:strawberry") - alias("farming_plus:strawberry_1", "ethereal:strawberry_1") - alias("farming_plus:strawberry_2", "ethereal:strawberry_3") - alias("farming_plus:strawberry_3", "ethereal:strawberry_5") - alias("farming_plus:strawberry", "ethereal:strawberry_7") -else - minetest.register_craftitem(":ethereal:strawberry", { - description = S("Strawberry"), - inventory_image = "farming_strawberry.png", - wield_image = "farming_strawberry.png", - groups = {food_strawberry = 1, flammable = 2}, - on_use = minetest.item_eat(1) - }) - alias("farming_plus:strawberry_item", "ethereal:strawberry") - alias("farming_plus:strawberry_seed", "ethereal:strawberry") - alias("farming_plus:strawberry_1", "farming:raspberry_1") - alias("farming_plus:strawberry_2", "farming:raspberry_2") - alias("farming_plus:strawberry_3", "farming:raspberry_3") - alias("farming_plus:strawberry", "farming:raspberry_4") -end +alias("farming_plus:strawberry_item", "ethereal:strawberry") +alias("farming_plus:strawberry_seed", "ethereal:strawberry") +alias("farming_plus:strawberry_1", "ethereal:strawberry_1") +alias("farming_plus:strawberry_2", "ethereal:strawberry_3") +alias("farming_plus:strawberry_3", "ethereal:strawberry_5") +alias("farming_plus:strawberry", "ethereal:strawberry_7") -- Tomato + alias("farming_plus:tomato_seed", "farming:tomato") alias("farming_plus:tomato_item", "farming:tomato") alias("farming_plus:tomato_1", "farming:tomato_2") @@ -163,5 +166,6 @@ alias("farming_plus:tomato_2", "farming:tomato_4") alias("farming_plus:tomato_3", "farming:tomato_6") alias("farming_plus:tomato", "farming:tomato_8") --- Weed +-- Weeds + alias("farming:weed", "default:grass_2") diff --git a/mods/farming/crops/artichoke.lua b/mods/farming/crops/artichoke.lua index 92143f62..cb9d7a70 100644 --- a/mods/farming/crops/artichoke.lua +++ b/mods/farming/crops/artichoke.lua @@ -1,51 +1,67 @@ -local S = farming.intllib --- item definition +local S = minetest.get_translator("farming") + +-- item/seed + minetest.register_craftitem("farming:artichoke", { description = S("Artichoke"), inventory_image = "farming_artichoke.png", - groups = {seed = 2, food_artichoke = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_artichoke = 1}, + on_use = minetest.item_eat(4), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:artichoke_1") - end, - on_use = minetest.item_eat(4) + end }) +farming.add_eatable("farming:artichoke", 4) + -- crop definition + local def = { + description = S("Artichoke") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_artichoke_1.png"}, paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, - drop = "", + drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:artichoke_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_artichoke_2.png"} minetest.register_node("farming:artichoke_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_artichoke_3.png"} minetest.register_node("farming:artichoke_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_artichoke_4.png"} minetest.register_node("farming:artichoke_4", table.copy(def)) -- stage 5 (final) + def.tiles = {"farming_artichoke_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:artichoke 2"}, rarity = 1}, @@ -55,6 +71,7 @@ def.drop = { minetest.register_node("farming:artichoke_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:artichoke"] = { crop = "farming:artichoke", seed = "farming:artichoke", @@ -62,3 +79,24 @@ farming.registered_plants["farming:artichoke"] = { maxlight = 15, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:grove_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.artichoke, + spread = {x = 100, y = 100, z = 100}, + seed = 123, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 13, + decoration = "farming:artichoke_5", + spawn_by = "group:tree", num_spawn_by = 1 +}) diff --git a/mods/farming/crops/asparagus.lua b/mods/farming/crops/asparagus.lua new file mode 100644 index 00000000..10ae3bad --- /dev/null +++ b/mods/farming/crops/asparagus.lua @@ -0,0 +1,108 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:asparagus", { + description = S("Asparagus"), + inventory_image = "farming_asparagus.png", + groups = {compostability = 48, seed = 2, food_asparagus = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:asparagus_1") + end +}) + +farming.add_eatable("farming:asparagus", 1) + +-- crop definition + +local def = { + description = S("Asparagus") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_asparagus_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:asparagus_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_asparagus_2.png"} +minetest.register_node("farming:asparagus_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_asparagus_3.png"} +minetest.register_node("farming:asparagus_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_asparagus_4.png"} +def.drop = { + items = { + {items = {"farming:asparagus"}, rarity = 2} + } +} +minetest.register_node("farming:asparagus_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_asparagus_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:asparagus"}, rarity = 1}, + {items = {"farming:asparagus 2"}, rarity = 2} + } +} +minetest.register_node("farming:asparagus_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:asparagus"] = { + crop = "farming:asparagus", + seed = "farming:asparagus", + minlight = 7, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen + +minetest.register_decoration({ + name = "farming:asparagus_5", + deco_type = "simple", + place_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.asparagus, + spread = {x = 100, y = 100, z = 100}, + seed = 234, + octaves = 3, + persist = 0.6 + }, + y_min = 8, y_max = 32, + decoration = "farming:asparagus_5", + param2 = 3 +}) diff --git a/mods/farming/crops/barley.lua b/mods/farming/crops/barley.lua index e7f38408..ca654565 100644 --- a/mods/farming/crops/barley.lua +++ b/mods/farming/crops/barley.lua @@ -1,43 +1,48 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- seed --- barley seeds minetest.register_node("farming:seed_barley", { description = S("Barley Seed"), tiles = {"farming_barley_seed.png"}, inventory_image = "farming_barley_seed.png", wield_image = "farming_barley_seed.png", drawtype = "signlike", - groups = {seed = 1, snappy = 3, attached_node = 1}, + groups = { + handy = 1, compostability = 48, seed = 1, snappy = 3, attached_node = 1, + growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, paramtype = "light", paramtype2 = "wallmounted", walkable = false, sunlight_propagates = true, + next_plant = "farming:barley_1", selection_box = farming.select, + on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:barley_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_barley") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:barley_1", param2 = 3}) end }) --- harvested barley +-- item + minetest.register_craftitem("farming:barley", { description = S("Barley"), inventory_image = "farming_barley.png", - groups = {food_barley = 1, flammable = 2} + groups = {food_barley = 1, flammable = 2, compostability = 65} }) --- flour -minetest.register_craft({ - output = "farming:flour", - recipe = { - {"farming:barley", "farming:barley", "farming:barley"}, - {"farming:barley", "farming:mortar_pestle", ""} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) +-- crop definition --- barley definition local def = { + description = S("Barley") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_barley_1.png"}, paramtype = "light", @@ -47,52 +52,68 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:barley_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_barley_2.png"} minetest.register_node("farming:barley_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_barley_3.png"} minetest.register_node("farming:barley_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_barley_4.png"} minetest.register_node("farming:barley_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_barley_5.png"} +minetest.register_node("farming:barley_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_barley_6.png"} def.drop = { items = { {items = {"farming:barley"}, rarity = 2}, {items = {"farming:seed_barley"}, rarity = 2} } } -minetest.register_node("farming:barley_5", table.copy(def)) +minetest.register_node("farming:barley_6", table.copy(def)) --- stage 6 -def.tiles = {"farming_barley_6.png"} +-- stage 7 + +def.tiles = {"farming_barley_7.png"} def.drop = { items = { {items = {"farming:barley"}, rarity = 2}, {items = {"farming:seed_barley"}, rarity = 1} } } -minetest.register_node("farming:barley_6", table.copy(def)) +minetest.register_node("farming:barley_7", table.copy(def)) --- stage 7 (final) -def.tiles = {"farming_barley_7.png"} +-- stage 8 (final) + +def.tiles = {"farming_barley_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:barley"}, rarity = 1}, @@ -101,20 +122,14 @@ def.drop = { {items = {"farming:seed_barley"}, rarity = 3} } } -minetest.register_node("farming:barley_7", table.copy(def)) +minetest.register_node("farming:barley_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:barley"] = { crop = "farming:barley", seed = "farming:seed_barley", minlight = farming.min_light, maxlight = farming.max_light, - steps = 7 + steps = 8 } - --- Fuel -minetest.register_craft({ - type = "fuel", - recipe = "farming:barley", - burntime = 1 -}) diff --git a/mods/farming/crops/beans.lua b/mods/farming/crops/beans.lua index f1a6e16b..0ebba69c 100644 --- a/mods/farming/crops/beans.lua +++ b/mods/farming/crops/beans.lua @@ -1,31 +1,27 @@ ---[[ - All textures by - (C) Auke Kok - CC-BY-SA-3.0 -]] -local S = farming.intllib +-- All textures by (C) Auke Kok CC-BY-SA-3.0 + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- place beans helper --- place beans local function place_beans(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- return if any of the nodes are not registered - if not minetest.registered_nodes[under.name] then - return - end + if not minetest.registered_nodes[under.name] then return end -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if placer and itemstack and def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end @@ -34,19 +30,15 @@ local function place_beans(itemstack, placer, pointed_thing, plantname) local name = placer and placer:get_player_name() or "" -- check for protection - if minetest.is_protected(pt.under, name) then - return - end + if minetest.is_protected(pt.under, name) then return end -- check if pointing at bean pole - if under.name ~= "farming:beanpole" then - return - end + if under.name ~= "farming:beanpole" then return end -- add the node and remove 1 item from the itemstack minetest.set_node(pt.under, {name = plantname}) - minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}) + minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}, true) if placer or not farming.is_creative(placer:get_player_name()) then @@ -56,35 +48,30 @@ local function place_beans(itemstack, placer, pointed_thing, plantname) if itemstack:get_count() == 0 then minetest.after(0.20, - farming.refill_plant, - placer, - "farming:beans", - placer:get_wield_index() - ) + farming.refill_plant, placer, "farming:beans", placer:get_wield_index()) end end return itemstack end --- beans +-- item/seed + minetest.register_craftitem("farming:beans", { description = S("Green Beans"), inventory_image = "farming_beans.png", - groups = {seed = 2, food_beans = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_beans = 1}, on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return place_beans(itemstack, placer, pointed_thing, "farming:beanpole_1") end }) --- beans can be used for green dye -minetest.register_craft({ - output = "dye:green", - recipe = {{"farming:beans"}} -}) +farming.add_eatable("farming:beans", 1) -- beanpole + minetest.register_node("farming:beanpole", { description = S("Bean Pole (place on soil before planting beans)"), drawtype = "plantlike", @@ -97,28 +84,26 @@ minetest.register_node("farming:beanpole", { sunlight_propagates = true, drop = "farming:beanpole", selection_box = farming.select, - groups = {snappy = 3, flammable = 2, attached_node = 1}, - sounds = default.node_sound_leaves_defaults(), + groups = {handy = 1, snappy = 3, flammable = 2, attached_node = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- return if any of the nodes are not registered - if not minetest.registered_nodes[under.name] then - return - end + if not minetest.registered_nodes[under.name] then return end -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end @@ -129,9 +114,7 @@ minetest.register_node("farming:beanpole", { local nodename = under.name - if minetest.get_item_group(nodename, "soil") < 2 then - return - end + if minetest.get_item_group(nodename, "soil") < 2 then return end local top = { x = pointed_thing.above.x, @@ -141,9 +124,7 @@ minetest.register_node("farming:beanpole", { nodename = minetest.get_node(top).name - if nodename ~= "air" then - return - end + if nodename ~= "air" then return end minetest.set_node(pointed_thing.above, {name = "farming:beanpole"}) @@ -155,23 +136,10 @@ minetest.register_node("farming:beanpole", { end }) -minetest.register_craft({ - output = "farming:beanpole", - recipe = { - {"", "", ""}, - {"default:stick", "", "default:stick"}, - {"default:stick", "", "default:stick"} - } -}) +-- crop definition -minetest.register_craft({ - type = "fuel", - recipe = "farming:beanpole", - burntime = 10 -}) - --- green bean definition local def = { + description = S("Green Beans") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_beanpole_1.png"}, visual_scale = 1.90, @@ -186,30 +154,38 @@ local def = { }, selection_box = farming.select, groups = { - snappy = 3, flammable = 3, not_in_creative_inventory = 1, + handy = 1, snappy = 3, flammable = 3, not_in_creative_inventory = 1, attached_node = 1, growing = 1, plant = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:beanpole_1", table.copy(def)) -- stage2 + def.tiles = {"farming_beanpole_2.png"} minetest.register_node("farming:beanpole_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_beanpole_3.png"} minetest.register_node("farming:beanpole_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_beanpole_4.png"} minetest.register_node("farming:beanpole_4", table.copy(def)) -- stage 5 (final) + def.tiles = {"farming_beanpole_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:beanpole"}, rarity = 1}, @@ -221,7 +197,9 @@ def.drop = { minetest.register_node("farming:beanpole_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:beans"] = { + trellis = "farming:beanpole", crop = "farming:beanpole", seed = "farming:beans", minlight = farming.min_light, @@ -230,6 +208,7 @@ farming.registered_plants["farming:beans"] = { } -- wild green bean bush (this is what you find on the map) + minetest.register_node("farming:beanbush", { drawtype = "plantlike", tiles = {"farming_beanbush.png"}, @@ -247,8 +226,27 @@ minetest.register_node("farming:beanbush", { }, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, - not_in_creative_inventory = 1 + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + compostability = 35, not_in_creative_inventory = 1 }, - sounds = default.node_sound_leaves_defaults() + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +}) + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.beans, + spread = {x = 100, y = 100, z = 100}, + seed = 345, + octaves = 3, + persist = 0.6 + }, + y_min = 18, y_max = 38, + decoration = "farming:beanbush" }) diff --git a/mods/farming/crops/beetroot.lua b/mods/farming/crops/beetroot.lua index 05e0b3a9..179e796c 100644 --- a/mods/farming/crops/beetroot.lua +++ b/mods/farming/crops/beetroot.lua @@ -1,40 +1,26 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed --- beetroot minetest.register_craftitem("farming:beetroot", { description = S("Beetroot"), inventory_image = "farming_beetroot.png", - groups = {seed = 2, food_beetroot = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_beetroot = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:beetroot_1") - end, - on_use = minetest.item_eat(1) + end }) --- beetroot soup -minetest.register_craftitem("farming:beetroot_soup", { - description = S("Beetroot Soup"), - inventory_image = "farming_beetroot_soup.png", - groups = {flammable = 2}, - on_use = minetest.item_eat(6, "farming:bowl") -}) +farming.add_eatable("farming:beetroot", 1) -minetest.register_craft({ - output = "farming:beetroot_soup", - recipe = { - {"group:food_beetroot", "group:food_beetroot", "group:food_beetroot"}, - {"group:food_beetroot", "group:food_bowl", "group:food_beetroot"} - } -}) - --- red dye -minetest.register_craft({ - output = "dye:red", - recipe = {{"group:food_beetroot"}} -}) +-- crop definition local def = { + description = S("Beetroot") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_beetroot_1.png"}, paramtype = "light", @@ -45,30 +31,38 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:beetroot_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_beetroot_2.png"} minetest.register_node("farming:beetroot_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_beetroot_3.png"} minetest.register_node("farming:beetroot_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_beetroot_4.png"} minetest.register_node("farming:beetroot_4", table.copy(def)) --- stage 5 +-- stage 5 (final) + def.tiles = {"farming_beetroot_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { max_items = 4, items = { {items = {"farming:beetroot"}, rarity = 1}, @@ -80,6 +74,7 @@ def.drop = { minetest.register_node("farming:beetroot_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:beetroot"] = { crop = "farming:beetroot", seed = "farming:beetroot", @@ -87,3 +82,27 @@ farming.registered_plants["farming:beetroot"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +local spawn_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"} + +if farming.eth then + spawn_on = {"ethereal:prairie_dirt"} +end + +minetest.register_decoration({ + deco_type = "simple", + place_on = spawn_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.beetroot, + spread = {x = 100, y = 100, z = 100}, + seed = 456, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 20, + decoration = "farming:beetroot_5" +}) diff --git a/mods/farming/crops/blackberry.lua b/mods/farming/crops/blackberry.lua index e2122fde..d21c3baf 100644 --- a/mods/farming/crops/blackberry.lua +++ b/mods/farming/crops/blackberry.lua @@ -1,19 +1,28 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- blackberries minetest.register_craftitem("farming:blackberry", { description = S("Blackberries"), inventory_image = "farming_blackberry.png", - groups = {seed = 2, food_blackberries = 1, food_blackberry = 1, - food_berry = 1, flammable = 2}, + groups = { + compostability = 48, seed = 2, food_blackberries = 1, food_blackberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:blackberry_1") - end, - on_use = minetest.item_eat(1), + end }) +farming.add_eatable("farming:blackberry", 1) + +-- crop definition + local def = { + description = S("Blackberry") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_blackberry_1.png"}, paramtype = "light", @@ -23,26 +32,33 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:blackberry_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_blackberry_2.png"} minetest.register_node("farming:blackberry_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_blackberry_3.png"} minetest.register_node("farming:blackberry_3", table.copy(def)) --- stage 4 +-- stage 4 (final) + def.tiles = {"farming_blackberry_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {'farming:blackberry 2'}, rarity = 1}, @@ -53,6 +69,7 @@ def.drop = { minetest.register_node("farming:blackberry_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:blackberry"] = { crop = "farming:blackberry", seed = "farming:blackberry", @@ -60,3 +77,23 @@ farming.registered_plants["farming:blackberry"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.blackberry, + spread = {x = 100, y = 100, z = 100}, + seed = 567, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 20, + decoration = "farming:blackberry_4" +}) diff --git a/mods/farming/crops/blueberry.lua b/mods/farming/crops/blueberry.lua index 9ec14b62..f4f3b3a2 100644 --- a/mods/farming/crops/blueberry.lua +++ b/mods/farming/crops/blueberry.lua @@ -1,50 +1,27 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- blueberries minetest.register_craftitem("farming:blueberries", { description = S("Wild Blueberries"), inventory_image = "farming_blueberries.png", - groups = {seed = 2, food_blueberries = 1, food_blueberry = 1, - food_berry = 1, flammable = 2}, + groups = { + compostability = 48,seed = 2, food_blueberries = 1, food_blueberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:blueberry_1") - end, - on_use = minetest.item_eat(1) + end }) --- blueberry muffin (thanks to sosogirl123 @ deviantart.com for muffin image) -minetest.register_craftitem("farming:muffin_blueberry", { - description = S("Blueberry Muffin"), - inventory_image = "farming_blueberry_muffin.png", - on_use = minetest.item_eat(2) -}) +farming.add_eatable("farming:blueberries", 1) -minetest.register_craft({ - output = "farming:muffin_blueberry 2", - recipe = { - {"group:food_blueberries", "group:food_bread", "group:food_blueberries"} - } -}) - --- Blueberry Pie -minetest.register_craftitem("farming:blueberry_pie", { - description = S("Blueberry Pie"), - inventory_image = "farming_blueberry_pie.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:blueberry_pie", - recipe = { - {"group:food_flour", "group:food_sugar", "group:food_blueberries"}, - {"group:food_baking_tray", "", ""} - }, - replacements = {{"group:food_baking_tray", "farming:baking_tray"}} -}) - --- blueberry definition +-- ctop definition local def = { + description = S("Blueberry") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_blueberry_1.png"}, paramtype = "light", @@ -54,26 +31,33 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:blueberry_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_blueberry_2.png"} minetest.register_node("farming:blueberry_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_blueberry_3.png"} minetest.register_node("farming:blueberry_3", table.copy(def)) -- stage 4 (final) + def.tiles = {"farming_blueberry_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:blueberries 2"}, rarity = 1}, @@ -84,6 +68,7 @@ def.drop = { minetest.register_node("farming:blueberry_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:blueberries"] = { crop = "farming:blueberry", seed = "farming:blueberries", @@ -91,3 +76,23 @@ farming.registered_plants["farming:blueberries"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.blueberry, + spread = {x = 100, y = 100, z = 100}, + seed = 678, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 15, + decoration = "farming:blueberry_4" +}) diff --git a/mods/farming/crops/cabbage.lua b/mods/farming/crops/cabbage.lua index b57ac007..b42eda7e 100644 --- a/mods/farming/crops/cabbage.lua +++ b/mods/farming/crops/cabbage.lua @@ -1,18 +1,25 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- cabbage minetest.register_craftitem("farming:cabbage", { description = S("Cabbage"), inventory_image = "farming_cabbage.png", - groups = {seed = 2, food_cabbage = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_cabbage = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:cabbage_1") - end, - on_use = minetest.item_eat(1) + end }) +farming.add_eatable("farming:cabbage", 1) + +-- crop definition + local def = { + description = S("Cabbage") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_cabbage_1.png"}, paramtype = "light", @@ -23,34 +30,43 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:cabbage_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_cabbage_2.png"} minetest.register_node("farming:cabbage_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_cabbage_3.png"} minetest.register_node("farming:cabbage_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_cabbage_4.png"} minetest.register_node("farming:cabbage_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_cabbage_5.png"} minetest.register_node("farming:cabbage_5", table.copy(def)) --- stage 6 +-- stage 6 (final) + def.tiles = {"farming_cabbage_6.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { max_items = 2, items = { {items = {"farming:cabbage 2"}, rarity = 1}, @@ -60,6 +76,7 @@ def.drop = { minetest.register_node("farming:cabbage_6", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:cabbage"] = { crop = "farming:cabbage", seed = "farming:cabbage", @@ -67,3 +84,21 @@ farming.registered_plants["farming:cabbage"] = { maxlight = farming.max_light, steps = 6 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.cabbage, + spread = {x = 100, y = 100, z = 100}, + seed = 789, + octaves = 3, + persist = 0.6 + }, + y_min = 2, y_max = 15, + decoration = "farming:cabbage_6" +}) diff --git a/mods/farming/crops/carrot.lua b/mods/farming/crops/carrot.lua index 2dd45f3c..41911a26 100644 --- a/mods/farming/crops/carrot.lua +++ b/mods/farming/crops/carrot.lua @@ -1,60 +1,29 @@ ---[[ - Original textures from PixelBox texture pack - https://forum.minetest.net/viewtopic.php?id=4990 -]] +-- Original textures from PixelBox texture pack +-- https://forum.minetest.net/viewtopic.php?id=4990 -local S = farming.intllib +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed --- carrot minetest.register_craftitem("farming:carrot", { description = S("Carrot"), inventory_image = "farming_carrot.png", - groups = {seed = 2, food_carrot = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_carrot = 1}, + on_use = minetest.item_eat(4), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:carrot_1") - end, - on_use = minetest.item_eat(4) + end }) --- carrot juice -minetest.register_craftitem("farming:carrot_juice", { - description = S("Carrot Juice"), - inventory_image = "farming_carrot_juice.png", - on_use = minetest.item_eat(4, "vessels:drinking_glass"), - groups = {vessel = 1, drink = 1} -}) +farming.add_eatable("farming:carrot", 4) -minetest.register_craft({ - output = "farming:carrot_juice", - recipe = { - {"group:food_carrot"}, - {"farming:juicer"}, - {"vessels:drinking_glass"} - }, - replacements = { - {"group:food_juicer", "farming:juicer"} - } -}) +-- crop definition --- golden carrot -minetest.register_craftitem("farming:carrot_gold", { - description = S("Golden Carrot"), - inventory_image = "farming_carrot_gold.png", - on_use = minetest.item_eat(10) -}) - -minetest.register_craft({ - output = "farming:carrot_gold", - recipe = { - {"", "default:gold_lump", ""}, - {"default:gold_lump", "group:food_carrot", "default:gold_lump"}, - {"", "default:gold_lump", ""} - } -}) - --- carrot definition local def = { + description = S("Carrot") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_carrot_1.png"}, paramtype = "light", @@ -62,39 +31,48 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } - -- stage 1 + minetest.register_node("farming:carrot_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_carrot_2.png"} minetest.register_node("farming:carrot_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_carrot_3.png"} minetest.register_node("farming:carrot_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_carrot_4.png"} minetest.register_node("farming:carrot_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_carrot_5.png"} minetest.register_node("farming:carrot_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_carrot_6.png"} minetest.register_node("farming:carrot_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_carrot_7.png"} def.drop = { items = { @@ -105,8 +83,10 @@ def.drop = { minetest.register_node("farming:carrot_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_carrot_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:carrot 2"}, rarity = 1}, @@ -116,6 +96,7 @@ def.drop = { minetest.register_node("farming:carrot_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:carrot"] = { crop = "farming:carrot", seed = "farming:carrot", @@ -123,3 +104,23 @@ farming.registered_plants["farming:carrot"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.carrot, + spread = {x = 100, y = 100, z = 100}, + seed = 890, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 30, + decoration = "farming:carrot_7" +}) diff --git a/mods/farming/crops/chili.lua b/mods/farming/crops/chili.lua index 95f3a30e..98ad0439 100644 --- a/mods/farming/crops/chili.lua +++ b/mods/farming/crops/chili.lua @@ -1,40 +1,26 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed --- chili pepper minetest.register_craftitem("farming:chili_pepper", { description = S("Chili Pepper"), inventory_image = "farming_chili_pepper.png", - groups = {seed = 2, food_chili_pepper = 1, flammable = 4}, + groups = {compostability = 48, seed = 2, food_chili_pepper = 1}, + on_use = minetest.item_eat(2), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:chili_1") - end, - on_use = minetest.item_eat(2) + end }) --- bowl of chili -minetest.register_craftitem("farming:chili_bowl", { - description = S("Bowl of Chili"), - inventory_image = "farming_chili_bowl.png", - on_use = minetest.item_eat(8, "farming:bowl") -}) +farming.add_eatable("farming:chili_pepper", 2) -minetest.register_craft({ - output = "farming:chili_bowl", - recipe = { - {"group:food_chili_pepper", "group:food_rice", "group:food_tomato"}, - {"group:food_beans", "group:food_bowl", ""} - } -}) +-- crop definition --- chili can be used for red dye -minetest.register_craft({ - output = "dye:red", - recipe = {{"farming:chili_pepper"}} -}) - --- chili definition local def = { + description = S("Chili Pepper") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_chili_1.png"}, paramtype = "light", @@ -42,44 +28,56 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 4, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:chili_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_chili_2.png"} minetest.register_node("farming:chili_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_chili_3.png"} minetest.register_node("farming:chili_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_chili_4.png"} minetest.register_node("farming:chili_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_chili_5.png"} minetest.register_node("farming:chili_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_chili_6.png"} minetest.register_node("farming:chili_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_chili_7.png"} minetest.register_node("farming:chili_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_chili_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:chili_pepper 3"}, rarity = 1}, @@ -89,6 +87,7 @@ def.drop = { minetest.register_node("farming:chili_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:chili_pepper"] = { crop = "farming:chili", seed = "farming:chili_pepper", @@ -96,3 +95,25 @@ farming.registered_plants["farming:chili_pepper"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_rainforest_litter", + "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.chili, + spread = {x = 100, y = 100, z = 100}, + seed = 901, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 45, + decoration = "farming:chili_8", + spawn_by = "group:tree", num_spawn_by = 1 +}) diff --git a/mods/farming/crops/cocoa.lua b/mods/farming/crops/cocoa.lua index 74132d52..ee1cfce4 100644 --- a/mods/farming/crops/cocoa.lua +++ b/mods/farming/crops/cocoa.lua @@ -1,5 +1,5 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") -- place cocoa local function place_cocoa(itemstack, placer, pointed_thing, plantname) @@ -7,26 +7,23 @@ local function place_cocoa(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- return if any of the nodes are not registered - if not minetest.registered_nodes[under.name] then - return - end + if not minetest.registered_nodes[under.name] then return end -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if placer and itemstack and def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end -- check if pointing at jungletree - if under.name ~= "default:jungletree" + if (under.name ~= "default:jungletree" and under.name ~= "mcl_core:jungletree") or minetest.get_node(pt.above).name ~= "air" then return end @@ -35,14 +32,12 @@ local function place_cocoa(itemstack, placer, pointed_thing, plantname) local name = placer and placer:get_player_name() or "" -- check for protection - if minetest.is_protected(pt.above, name) then - return - end + if minetest.is_protected(pt.above, name) then return end -- add the node and remove 1 item from the itemstack minetest.set_node(pt.above, {name = plantname}) - minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}) + minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}, true) if placer and not farming.is_creative(placer:get_player_name()) then @@ -51,99 +46,30 @@ local function place_cocoa(itemstack, placer, pointed_thing, plantname) -- check for refill if itemstack:get_count() == 0 then - minetest.after(0.20, - farming.refill_plant, - placer, - "farming:cocoa_beans_raw", - placer:get_wield_index() - ) + minetest.after(0.20, farming.refill_plant, placer, + "farming:cocoa_beans_raw", placer:get_wield_index()) end end return itemstack end --- cocoa beans +-- item/seed + minetest.register_craftitem("farming:cocoa_beans_raw", { description = S("Raw Cocoa Beans"), inventory_image = "farming_cocoa_beans.png^[brighten", - groups = {seed = 1, flammable = 2}, + groups = {compostability = 48, seed = 1, flammable = 2}, + on_place = function(itemstack, placer, pointed_thing) return place_cocoa(itemstack, placer, pointed_thing, "farming:cocoa_1") end }) -minetest.register_craftitem("farming:cocoa_beans", { - description = S("Cocoa Beans"), - inventory_image = "farming_cocoa_beans.png", - groups = {food_cocoa = 1, flammable = 2} -}) +-- crop definition -minetest.register_craft({ - type = "cooking", - cooktime = 5, - output = "farming:cocoa_beans", - recipe = "farming:cocoa_beans_raw" -}) - -minetest.register_craft( { - output = "dye:brown 2", - recipe = {{"farming:cocoa_beans"}} -}) - --- chocolate cookie -minetest.register_craftitem("farming:cookie", { - description = S("Cookie"), - inventory_image = "farming_cookie.png", - on_use = minetest.item_eat(2) -}) - -minetest.register_craft( { - output = "farming:cookie 8", - recipe = { - {"group:food_wheat", "group:food_cocoa", "group:food_wheat" } - } -}) - --- bar of dark chocolate (thanks to Ice Pandora for her deviantart.com chocolate tutorial) -minetest.register_craftitem("farming:chocolate_dark", { - description = S("Bar of Dark Chocolate"), - inventory_image = "farming_chocolate_dark.png", - on_use = minetest.item_eat(3) -}) - -minetest.register_craft( { - output = "farming:chocolate_dark", - recipe = { - {"group:food_cocoa", "group:food_cocoa", "group:food_cocoa"} - } -}) - --- chocolate block -minetest.register_node("farming:chocolate_block", { - description = S("Chocolate Block"), - tiles = {"farming_chocolate_block.png"}, - is_ground_content = false, - groups = {cracky = 2, oddly_breakable_by_hand = 2}, - sounds = default.node_sound_stone_defaults() -}) - -minetest.register_craft({ - output = "farming:chocolate_block", - recipe = { - {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, - {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, - {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"} - } -}) - -minetest.register_craft({ - output = "farming:chocolate_dark 9", - recipe = {{"farming:chocolate_block"}} -}) - --- cocoa definition local def = { + description = S("Cocoa Beans") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_cocoa_1.png"}, paramtype = "light", @@ -154,28 +80,36 @@ local def = { }, drop = {}, groups = { - snappy = 3, flammable = 2, plant = 1, growing = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, growing = 1, not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1 }, - sounds = default.node_sound_leaves_defaults(), + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + + -- custom function that returns True when conditions are met growth_check = function(pos, node_name) - if minetest.find_node_near(pos, 1, {"default:jungletree"}) then - return false -- can grow + if minetest.find_node_near(pos, 1, + {"default:jungletree", "mcl_core:jungletree"}) then + return true -- place next growth stage end - return true -- cannot grow + return false -- condition not met, skip growth stage until next check end } -- stage 1 + minetest.register_node("farming:cocoa_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_cocoa_2.png"} minetest.register_node("farming:cocoa_2", table.copy(def)) -- stage3 + def.tiles = {"farming_cocoa_3.png"} def.drop = { items = { @@ -185,6 +119,7 @@ def.drop = { minetest.register_node("farming:cocoa_3", table.copy(def)) -- stage 4 (final) + def.tiles = {"farming_cocoa_4.png"} def.groups.growing = nil def.growth_check = nil @@ -198,7 +133,9 @@ def.drop = { minetest.register_node("farming:cocoa_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:cocoa_beans"] = { + trellis = "default:jungletree", crop = "farming:cocoa", seed = "farming:cocoa_beans_raw", minlight = farming.min_light, @@ -207,28 +144,31 @@ farming.registered_plants["farming:cocoa_beans"] = { } -- add random cocoa pods to jungle tree's + +local random = math.random -- localise for speed + minetest.register_on_generated(function(minp, maxp) - if maxp.y < 0 then - return - end + if maxp.y < 0 then return end local pos, dir - local cocoa = minetest.find_nodes_in_area(minp, maxp, "default:jungletree") + local cocoa = minetest.find_nodes_in_area(minp, maxp, + {"default:jungletree", "mcl_core:jungletree"}) for n = 1, #cocoa do pos = cocoa[n] if minetest.find_node_near(pos, 1, - {"default:jungleleaves", "moretrees:jungletree_leaves_green"}) then + {"default:jungleleaves", "moretrees:jungletree_leaves_green", + "mcl_core:jungleleaves"}) then - dir = math.random(1, 80) + dir = random(80) if dir == 1 then pos.x = pos.x + 1 elseif dir == 2 then pos.x = pos.x - 1 elseif dir == 3 then pos.z = pos.z + 1 - elseif dir == 4 then pos.z = pos.z -1 + elseif dir == 4 then pos.z = pos.z - 1 end if dir < 5 @@ -237,8 +177,8 @@ minetest.register_on_generated(function(minp, maxp) --print ("Cocoa Pod added at " .. minetest.pos_to_string(pos)) - minetest.swap_node(pos, { - name = "farming:cocoa_" .. tostring(math.random(4)) + minetest.set_node(pos, { + name = "farming:cocoa_" .. tostring(random(4)) }) end end diff --git a/mods/farming/crops/coffee.lua b/mods/farming/crops/coffee.lua index 490547ea..6b9f024b 100644 --- a/mods/farming/crops/coffee.lua +++ b/mods/farming/crops/coffee.lua @@ -1,50 +1,22 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- coffee minetest.register_craftitem("farming:coffee_beans", { description = S("Coffee Beans"), inventory_image = "farming_coffee_beans.png", - groups = {seed = 2, food_coffee = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_coffee = 1, flammable = 2}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:coffee_1") end }) --- cup of coffee -minetest.register_node("farming:coffee_cup", { - description = S("Cup of Coffee"), - drawtype = "torchlike", - tiles = {"farming_coffee_cup.png"}, - inventory_image = "farming_coffee_cup.png", - wield_image = "farming_coffee_cup.png", - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} - }, - groups = {vessel = 1, dig_immediate = 3, attached_node = 1, drink = 1}, - on_use = minetest.item_eat(2, "vessels:drinking_glass"), - sounds = default.node_sound_glass_defaults() -}) +-- crop definition -minetest.register_alias("farming:coffee_cup_hot", "farming:coffee_cup") -minetest.register_alias("farming:drinking_cup", "vessels:drinking_glass") - -minetest.register_craft( { - output = "farming:coffee_cup", - recipe = { - {"group:food_saucepan", "group:food_coffee", "group:food_water_glass"} - }, - replacements = { - {"group:food_saucepan", "farming:saucepan"} - } -}) - - --- coffee definition local def = { + description = S("Coffee") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_coffee_1.png"}, paramtype = "light", @@ -52,32 +24,41 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:coffee_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_coffee_2.png"} minetest.register_node("farming:coffee_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_coffee_3.png"} minetest.register_node("farming:coffee_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_coffee_4.png"} minetest.register_node("farming:coffee_4", table.copy(def)) -- stage 5 (final) + def.tiles = {"farming_coffee_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:coffee_beans 2"}, rarity = 1}, @@ -88,6 +69,7 @@ def.drop = { minetest.register_node("farming:coffee_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:coffee"] = { crop = "farming:coffee", seed = "farming:coffee_beans", @@ -95,3 +77,31 @@ farming.registered_plants["farming:coffee"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +local spawn_on = { + "default:dirt_with_dry_grass", "default:dirt_with_rainforest_litter", + "default:dry_dirt_with_dry_grass", "mcl_core:dirt_with_grass", + "ethereal:prairie_dirt" +} + +if farming.mapgen == "v6" then + spawn_on = {"default:dirt_with_grass"} +end + +minetest.register_decoration({ + deco_type = "simple", + place_on = spawn_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.coffee, + spread = {x = 100, y = 100, z = 100}, + seed = 12, + octaves = 3, + persist = 0.6 + }, + y_min = 20, y_max = 55, + decoration = "farming:coffee_5" +}) diff --git a/mods/farming/crops/corn.lua b/mods/farming/crops/corn.lua index 97bb86a8..7dcbbb24 100644 --- a/mods/farming/crops/corn.lua +++ b/mods/farming/crops/corn.lua @@ -4,108 +4,27 @@ http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/1440575-1-2-5-generation-minecraft-beta-1-2-farming-and ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- corn minetest.register_craftitem("farming:corn", { description = S("Corn"), inventory_image = "farming_corn.png", - groups = {seed = 2, food_corn = 1, flammable = 2}, + groups = {compostability = 45, seed = 2, food_corn = 1}, + on_use = minetest.item_eat(3), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:corn_1") - end, - on_use = minetest.item_eat(3) + end }) --- corn on the cob (texture by TenPlus1) -minetest.register_craftitem("farming:corn_cob", { - description = S("Corn on the Cob"), - inventory_image = "farming_corn_cob.png", - groups = {food_corn_cooked = 1, flammable = 2}, - on_use = minetest.item_eat(5) -}) +farming.add_eatable("farming:corn", 3) -minetest.register_craft({ - type = "cooking", - cooktime = 10, - output = "farming:corn_cob", - recipe = "group:food_corn" -}) +-- crop definition --- popcorn -minetest.register_craftitem("farming:popcorn", { - description = S("Popcorn"), - inventory_image = "farming_popcorn.png", - groups = {food_popcorn = 1, flammable = 2}, - on_use = minetest.item_eat(4) -}) - -minetest.register_craft({ - output = "farming:popcorn", - recipe = { - {"group:food_pot", "group:food_oil", "group:food_corn"} - }, - replacements = { - {"group:food_pot", "farming:pot"}, - {"group:food_oil", "vessels:glass_bottle"} - } -}) - --- cornstarch -minetest.register_craftitem("farming:cornstarch", { - description = S("Cornstarch"), - inventory_image = "farming_cornstarch.png", - groups = {food_cornstarch = 1, food_gelatin = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:cornstarch", - recipe = { - {"group:food_mortar_pestle", "group:food_corn_cooked", "group:food_baking_tray"}, - {"", "group:food_bowl", ""}, - }, - replacements = { - {"group:food_mortar_pestle", "farming:mortar_pestle"}, - {"group:food_baking_tray", "farming:baking_tray"} - } -}) - --- ethanol (thanks to JKMurray for this idea) -minetest.register_node("farming:bottle_ethanol", { - description = S("Bottle of Ethanol"), - drawtype = "plantlike", - tiles = {"farming_bottle_ethanol.png"}, - inventory_image = "farming_bottle_ethanol.png", - wield_image = "farming_bottle_ethanol.png", - paramtype = "light", - is_ground_content = false, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, - groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_glass_defaults() -}) - -minetest.register_craft( { - output = "farming:bottle_ethanol", - recipe = { - {"group:food_corn", "group:food_corn", "group:food_corn"}, - {"group:food_corn", "vessels:glass_bottle", "group:food_corn"}, - {"group:food_corn", "group:food_corn", "group:food_corn"} - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:bottle_ethanol", - burntime = 80, - replacements = {{"farming:bottle_ethanol", "vessels:glass_bottle"}} -}) - --- corn definition local def = { + description = S("Corn") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_corn_1.png"}, paramtype = "light", @@ -113,39 +32,49 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:corn_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_corn_2.png"} minetest.register_node("farming:corn_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_corn_3.png"} minetest.register_node("farming:corn_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_corn_4.png"} minetest.register_node("farming:corn_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_corn_5.png"} minetest.register_node("farming:corn_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_corn_6.png"} def.visual_scale = 1.9 minetest.register_node("farming:corn_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_corn_7.png"} def.drop = { items = { @@ -157,8 +86,10 @@ def.drop = { minetest.register_node("farming:corn_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_corn_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:corn 2"}, rarity = 1}, @@ -169,6 +100,7 @@ def.drop = { minetest.register_node("farming:corn_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:corn"] = { crop = "farming:corn", seed = "farming:corn", @@ -176,3 +108,23 @@ farming.registered_plants["farming:corn"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.corn, + spread = {x = 100, y = 100, z = 100}, + seed = 134, + octaves = 3, + persist = 0.6 + }, + y_min = 12, y_max = 27, + decoration = "farming:corn_7" +}) diff --git a/mods/farming/crops/cotton.lua b/mods/farming/crops/cotton.lua index 6ea2e6fe..1dc2ae4e 100644 --- a/mods/farming/crops/cotton.lua +++ b/mods/farming/crops/cotton.lua @@ -1,97 +1,48 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") --- wild cotton as a source of cotton seed and a chance of cotton itself -minetest.register_node("farming:cotton_wild", { - description = S("Wild Cotton"), - drawtype = "plantlike", - waving = 1, - tiles = {"farming_cotton_wild.png"}, - inventory_image = "farming_cotton_wild.png", - wield_image = "farming_cotton_wild.png", - paramtype = "light", - sunlight_propagates = true, - walkable = false, - buildable_to = true, - groups = {snappy = 3, attached_node = 1, flammable = 4}, - drop = { - items = { - {items = {"farming:cotton"}, rarity = 2}, - {items = {"farming:seed_cotton"}, rarity = 1} - } - }, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16} - } -}) +-- seed --- cotton seeds minetest.register_node("farming:seed_cotton", { description = S("Cotton Seed"), tiles = {"farming_cotton_seed.png"}, inventory_image = "farming_cotton_seed.png", wield_image = "farming_cotton_seed.png", drawtype = "signlike", - groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 4}, + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, + flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, paramtype = "light", paramtype2 = "wallmounted", walkable = false, sunlight_propagates = true, selection_box = farming.select, + next_plant = "farming:cotton_1", + on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:cotton_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_cotton") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:cotton_1", param2 = 1}) end }) --- cotton +-- item + minetest.register_craftitem("farming:cotton", { description = S("Cotton"), inventory_image = "farming_cotton.png", - groups = {flammable = 4} + groups = {flammable = 4, compostability = 50} }) --- string -minetest.register_craftitem("farming:string", { - description = S("String"), - inventory_image = "farming_string.png", - groups = {flammable = 2} -}) +-- crop definition --- cotton to wool -minetest.register_craft({ - output = "wool:white", - recipe = { - {"farming:cotton", "farming:cotton"}, - {"farming:cotton", "farming:cotton"} - } -}) - --- cotton to string -minetest.register_craft({ - output = "farming:string 2", - recipe = { - {"farming:cotton"}, - {"farming:cotton"} - } -}) - --- can be used as fuel -minetest.register_craft({ - type = "fuel", - recipe = "farming:string", - burntime = 1 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:cotton", - burntime = 1 -}) - --- cotton definition local def = { + description = S("Cotton") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_cotton_1.png"}, paramtype = "light", @@ -99,30 +50,38 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 4, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:cotton_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_cotton_2.png"} minetest.register_node("farming:cotton_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_cotton_3.png"} minetest.register_node("farming:cotton_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_cotton_4.png"} minetest.register_node("farming:cotton_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_cotton_5.png"} def.drop = { items = { @@ -132,6 +91,7 @@ def.drop = { minetest.register_node("farming:cotton_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_cotton_6.png"} def.drop = { items = { @@ -142,6 +102,7 @@ def.drop = { minetest.register_node("farming:cotton_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_cotton_7.png"} def.drop = { items = { @@ -154,8 +115,10 @@ def.drop = { minetest.register_node("farming:cotton_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_cotton_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:cotton"}, rarity = 1}, @@ -169,6 +132,7 @@ def.drop = { minetest.register_node("farming:cotton_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:cotton"] = { crop = "farming:cotton", seed = "farming:seed_cotton", @@ -177,6 +141,63 @@ farming.registered_plants["farming:cotton"] = { steps = 8 } +-- wild cotton (this is what you find on the map) + +minetest.register_node("farming:cotton_wild", { + description = S("Wild Cotton"), + drawtype = "plantlike", + waving = 1, + tiles = {"farming_cotton_wild.png"}, + inventory_image = "farming_cotton_wild.png", + wield_image = "farming_cotton_wild.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {handy = 1, snappy = 3, attached_node = 1, flammable = 4, compostability = 60}, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + drop = { + items = { + {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 1} + } + }, + sounds = farming.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16} + } +}) + +-- mapgen + +local spawn_on = { + "default:dry_dirt_with_dry_grass", "default:dirt_with_dry_grass", + "mcl_core:dirt_with_grass" +} + +if farming.mapgen == "v6" then + spawn_on = {"default:dirt_with_grass"} +end + +minetest.register_decoration({ + name = "farming:cotton_wild", + deco_type = "simple", + place_on = spawn_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.cotton, + spread = {x = 100, y = 100, z = 100}, + seed = 4242, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 120, + decoration = "farming:cotton_wild" +}) + --[[ Cotton using api farming.register_plant("farming:cotton", { description = "Cotton seed", diff --git a/mods/farming/crops/cucumber.lua b/mods/farming/crops/cucumber.lua index c5e70def..871eb43f 100644 --- a/mods/farming/crops/cucumber.lua +++ b/mods/farming/crops/cucumber.lua @@ -4,21 +4,27 @@ https://forum.minetest.net/viewtopic.php?id=3948 ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- cucumber minetest.register_craftitem("farming:cucumber", { description = S("Cucumber"), inventory_image = "farming_cucumber.png", - groups = {seed = 2, food_cucumber = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_cucumber = 1}, + on_use = minetest.item_eat(4), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:cucumber_1") - end, - on_use = minetest.item_eat(4) + end }) --- cucumber definition +farming.add_eatable("farming:cucumber", 4) + +-- crop definition + local def = { + description = S("Cucumber") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_cucumber_1.png"}, paramtype = "light", @@ -27,26 +33,33 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:cucumber_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_cucumber_2.png"} minetest.register_node("farming:cucumber_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_cucumber_3.png"} minetest.register_node("farming:cucumber_3", table.copy(def)) -- stage 4 (final) + def.tiles = {"farming_cucumber_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:cucumber 2"}, rarity = 1}, @@ -56,6 +69,7 @@ def.drop = { minetest.register_node("farming:cucumber_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:cucumber"] = { crop = "farming:cucumber", seed = "farming:cucumber", @@ -63,3 +77,24 @@ farming.registered_plants["farming:cucumber"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.cucumber, + spread = {x = 100, y = 100, z = 100}, + seed = 245, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 20, + decoration = "farming:cucumber_4", + spawn_by = {"group:water", "group:sand"}, num_spawn_by = 1 +}) diff --git a/mods/farming/crops/eggplant.lua b/mods/farming/crops/eggplant.lua new file mode 100644 index 00000000..a6877fb8 --- /dev/null +++ b/mods/farming/crops/eggplant.lua @@ -0,0 +1,102 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:eggplant", { + description = S("Eggplant"), + inventory_image = "farming_eggplant.png", + groups = {compostability = 48, seed = 2, food_eggplant = 1}, + on_use = minetest.item_eat(3), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:eggplant_1") + end +}) + +farming.add_eatable("farming:eggplant", 3) + +-- crop definition + +local def = { + description = S("Eggplant") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_eggplant_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:eggplant_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_eggplant_2.png"} +minetest.register_node("farming:eggplant_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_eggplant_3.png"} +def.drop = { + items = { + {items = {"farming:eggplant"}, rarity = 1}, + {items = {"farming:eggplant"}, rarity = 3} + } +} +minetest.register_node("farming:eggplant_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_eggplant_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:eggplant 2"}, rarity = 1}, + {items = {"farming:eggplant 2"}, rarity = 2} + } +} +minetest.register_node("farming:eggplant_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:eggplant"] = { + crop = "farming:eggplant", + seed = "farming:eggplant", + minlight = 7, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.eggplant, + spread = {x = 100, y = 100, z = 100}, + seed = 356, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 40, + decoration = "farming:eggplant_3", + param2 = 3 +}) diff --git a/mods/farming/crops/garlic.lua b/mods/farming/crops/garlic.lua index e1414791..350e1f0f 100644 --- a/mods/farming/crops/garlic.lua +++ b/mods/farming/crops/garlic.lua @@ -1,86 +1,22 @@ ---[[ - Original textures from Crops Plus mod - Copyright (C) 2018 Grizzly Adam - https://forum.minetest.net/viewtopic.php?f=9&t=19488 -]] +local S = minetest.get_translator("farming") -local S = farming.intllib +-- item/seed --- potato minetest.register_craftitem("farming:garlic_clove", { description = S("Garlic clove"), inventory_image = "crops_garlic_clove.png", - groups = {seed = 2, food_garlic_clove = 1, flammable = 3}, + groups = {compostability = 35, seed = 2, food_garlic_clove = 1, flammable = 3}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:garlic_1") end }) --- garlic bulb -minetest.register_craftitem("farming:garlic", { - description = S("Garlic"), - inventory_image = "crops_garlic.png", - on_use = minetest.item_eat(1), - groups = {food_garlic = 1, flammable = 3} -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:garlic_clove 8", - recipe = {"farming:garlic"} -}) - -minetest.register_craft({ - output = "farming:garlic", - recipe = { - {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"}, - {"farming:garlic_clove", "", "farming:garlic_clove"}, - {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"} - } -}) - --- garlic braid -minetest.register_node("farming:garlic_braid", { - description = S("Garlic Braid"), - inventory_image = "crops_garlic_braid.png", - wield_image = "crops_garlic_braid.png", - drawtype = "nodebox", - use_texture_alpha = "clip", - paramtype = "light", - paramtype2 = "facedir", - tiles = { - "crops_garlic_braid_side.png","crops_garlic_braid.png", - "crops_garlic_braid_side.png^[transformFx","crops_garlic_braid_side.png", - "crops_garlic_braid.png","crops_garlic_braid.png" - }, - groups = {vessel = 1, dig_immediate = 3, flammable = 3}, - sounds = default.node_sound_leaves_defaults(), - node_box = { - type = "fixed", - fixed = { - {-0.13, -0.45, 0.5, 0.13, 0.45, 0.24} - } - } -}) - -minetest.register_craft({ - output = "farming:garlic_braid", - recipe = { - {"farming:garlic", "farming:garlic", "farming:garlic"}, - {"farming:garlic", "farming:garlic", "farming:garlic"}, - {"farming:garlic", "farming:garlic", "farming:garlic"} - } -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:garlic 9", - recipe = {"farming:garlic_braid"} -}) - -- crop definition + local def = { + description = S("Garlic") .. S(" Crop"), drawtype = "plantlike", tiles = {"crops_garlic_plant_1.png"}, paramtype = "light", @@ -93,30 +29,38 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 3, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:garlic_1", table.copy(def)) -- stage 2 + def.tiles = {"crops_garlic_plant_2.png"} minetest.register_node("farming:garlic_2", table.copy(def)) -- stage 3 + def.tiles = {"crops_garlic_plant_3.png"} minetest.register_node("farming:garlic_3", table.copy(def)) -- stage 4 + def.tiles = {"crops_garlic_plant_4.png"} minetest.register_node("farming:garlic_4", table.copy(def)) -- stage 5 + def.tiles = {"crops_garlic_plant_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:garlic 3"}, rarity = 1}, @@ -127,6 +71,7 @@ def.drop = { minetest.register_node("farming:garlic_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:garlic"] = { crop = "farming:garlic", seed = "farming:garlic_clove", @@ -134,3 +79,25 @@ farming.registered_plants["farming:garlic"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt", + "default:dirt_with_rainforest_litter" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.garlic, + spread = {x = 100, y = 100, z = 100}, + seed = 467, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 45, + decoration = "farming:garlic_5", + spawn_by = "group:tree", num_spawn_by = 1 +}) diff --git a/mods/farming/crops/ginger.lua b/mods/farming/crops/ginger.lua new file mode 100644 index 00000000..7bc6ff54 --- /dev/null +++ b/mods/farming/crops/ginger.lua @@ -0,0 +1,105 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:ginger", { + description = S("Ginger"), + inventory_image = "farming_ginger.png", + groups = {compostability = 48, seed = 2, food_ginger = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:ginger_1") + end +}) + +farming.add_eatable("farming:ginger", 1) + +-- crop definition + +local def = { + description = S("Ginger") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_ginger_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:ginger_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_ginger_2.png"} +minetest.register_node("farming:ginger_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_ginger_3.png"} +def.drop = { + items = { + {items = {"farming:ginger"}, rarity = 1}, + {items = {"farming:ginger"}, rarity = 3} + } +} +minetest.register_node("farming:ginger_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_ginger_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:ginger 2"}, rarity = 1}, + {items = {"farming:ginger 2"}, rarity = 2} + } +} +minetest.register_node("farming:ginger_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:ginger"] = { + crop = "farming:ginger", + seed = "farming:ginger", + minlight = 5, + maxlight = minetest.LIGHT_MAX, + steps = 4 +} + +-- mapgen + +minetest.register_decoration({ + name = "farming:ginger_4", + deco_type = "simple", + place_on = { + "default:dirt_with_rainforest_litter", "mcl_core:dirt_with_grass", + "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.ginger, + spread = {x = 100, y = 100, z = 100}, + seed = 999, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 80, + decoration = "farming:ginger_3", + param2 = 3 +}) diff --git a/mods/farming/crops/grapes.lua b/mods/farming/crops/grapes.lua index 47d64e03..55104d71 100644 --- a/mods/farming/crops/grapes.lua +++ b/mods/farming/crops/grapes.lua @@ -1,26 +1,24 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- place trellis helper --- place trellis local function place_grapes(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- return if any of the nodes are not registered - if not minetest.registered_nodes[under.name] then - return - end + if not minetest.registered_nodes[under.name] then return end -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if placer and itemstack and def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end @@ -29,19 +27,15 @@ local function place_grapes(itemstack, placer, pointed_thing, plantname) local name = placer and placer:get_player_name() or "" -- check for protection - if minetest.is_protected(pt.under, name) then - return - end + if minetest.is_protected(pt.under, name) then return end -- check if pointing at trellis - if under.name ~= "farming:trellis" then - return - end + if under.name ~= "farming:trellis" then return end -- add the node and remove 1 item from the itemstack minetest.set_node(pt.under, {name = plantname}) - minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}) + minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}, true) if placer and not farming.is_creative(placer:get_player_name()) then @@ -50,11 +44,8 @@ local function place_grapes(itemstack, placer, pointed_thing, plantname) -- check for refill if itemstack:get_count() == 0 then - minetest.after(0.20, - farming.refill_plant, - placer, - "farming:grapes", - placer:get_wield_index() + minetest.after(0.20, farming.refill_plant, placer, + "farming:grapes", placer:get_wield_index() ) end end @@ -62,24 +53,23 @@ local function place_grapes(itemstack, placer, pointed_thing, plantname) return itemstack end --- grapes +-- item/seed + minetest.register_craftitem("farming:grapes", { description = S("Grapes"), inventory_image = "farming_grapes.png", + groups = {compostability = 48, seed = 2, food_grapes = 1}, on_use = minetest.item_eat(2), - groups = {seed = 2, food_grapes = 1, flammable = 3}, + on_place = function(itemstack, placer, pointed_thing) return place_grapes(itemstack, placer, pointed_thing, "farming:grapes_1") end }) --- grapes can be used for violet dye -minetest.register_craft({ - output = "dye:violet", - recipe = {{"farming:grapes"}} -}) +farming.add_eatable("farming:grapes", 2) -- trellis + minetest.register_node("farming:trellis", { description = S("Trellis (place on soil before planting grapes)"), drawtype = "plantlike", @@ -92,28 +82,26 @@ minetest.register_node("farming:trellis", { sunlight_propagates = true, drop = "farming:trellis", selection_box = farming.select, - groups = {snappy = 3, flammable = 2, attached_node = 1}, - sounds = default.node_sound_leaves_defaults(), + groups = {handy = 1, snappy = 3, flammable = 2, attached_node = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- return if any of the nodes are not registered - if not minetest.registered_nodes[under.name] then - return - end + if not minetest.registered_nodes[under.name] then return end -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end @@ -124,9 +112,7 @@ minetest.register_node("farming:trellis", { local nodename = under.name - if minetest.get_item_group(nodename, "soil") < 2 then - return - end + if minetest.get_item_group(nodename, "soil") < 2 then return end local top = { x = pointed_thing.above.x, @@ -136,9 +122,7 @@ minetest.register_node("farming:trellis", { nodename = minetest.get_node(top).name - if nodename ~= "air" then - return - end + if nodename ~= "air" then return end minetest.set_node(pointed_thing.above, {name = "farming:trellis"}) @@ -150,23 +134,10 @@ minetest.register_node("farming:trellis", { end }) -minetest.register_craft({ - output = "farming:trellis", - recipe = { - {"default:stick", "default:stick", "default:stick"}, - {"default:stick", "default:stick", "default:stick"}, - {"default:stick", "default:stick", "default:stick"} - } -}) +-- crop definition -minetest.register_craft({ - type = "fuel", - recipe = "farming:trellis", - burntime = 15 -}) - --- grapes definition local def = { + description = S("Grapes") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_grapes_1.png"}, visual_scale = 1.9, @@ -181,42 +152,53 @@ local def = { }, selection_box = farming.select, groups = { - snappy = 3, flammable = 3, not_in_creative_inventory = 1, + handy = 1, snappy = 3, flammable = 3, not_in_creative_inventory = 1, attached_node = 1, growing = 1, plant = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:grapes_1", table.copy(def)) -- stage2 + def.tiles = {"farming_grapes_2.png"} minetest.register_node("farming:grapes_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_grapes_3.png"} minetest.register_node("farming:grapes_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_grapes_4.png"} minetest.register_node("farming:grapes_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_grapes_5.png"} minetest.register_node("farming:grapes_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_grapes_6.png"} minetest.register_node("farming:grapes_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_grapes_7.png"} minetest.register_node("farming:grapes_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_grapes_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:trellis"}, rarity = 1}, @@ -228,7 +210,9 @@ def.drop = { minetest.register_node("farming:grapes_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:grapes"] = { + trellis = "farming:trellis", crop = "farming:grapes", seed = "farming:grapes", minlight = farming.min_light, @@ -237,6 +221,7 @@ farming.registered_plants["farming:grapes"] = { } -- wild grape vine (this is what you find on the map) + minetest.register_node("farming:grapebush", { drawtype = "plantlike", tiles = {"farming_grapebush.png"}, @@ -254,8 +239,29 @@ minetest.register_node("farming:grapebush", { }, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, - not_in_creative_inventory = 1 + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, compostability = 35 }, - sounds = default.node_sound_leaves_defaults() + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +}) + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.grapes, + spread = {x = 100, y = 100, z = 100}, + seed = 578, + octaves = 3, + persist = 0.6 + }, + y_min = 25, y_max = 50, + decoration = "farming:grapebush" }) diff --git a/mods/farming/crops/hemp.lua b/mods/farming/crops/hemp.lua index 4cc05e5f..f36ef14f 100644 --- a/mods/farming/crops/hemp.lua +++ b/mods/farming/crops/hemp.lua @@ -1,188 +1,48 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- seed --- hemp seeds minetest.register_node("farming:seed_hemp", { description = S("Hemp Seed"), tiles = {"farming_hemp_seed.png"}, inventory_image = "farming_hemp_seed.png", wield_image = "farming_hemp_seed.png", drawtype = "signlike", - groups = {seed = 1, snappy = 3, attached_node = 1}, + groups = { + handy = 1, compostability = 38, seed = 1, snappy = 3, attached_node = 1, + growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, paramtype = "light", paramtype2 = "wallmounted", walkable = false, sunlight_propagates = true, selection_box = farming.select, + next_plant = "farming:hemp_1", + on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:hemp_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_hemp") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:hemp_1", param2 = 1}) end }) --- harvested hemp +-- item + minetest.register_craftitem("farming:hemp_leaf", { description = S("Hemp Leaf"), - inventory_image = "farming_hemp_leaf.png" + inventory_image = "farming_hemp_leaf.png", + groups = {compostability = 35} }) --- hemp oil -minetest.register_node("farming:hemp_oil", { - description = S("Bottle of Hemp Oil"), - drawtype = "plantlike", - tiles = {"farming_hemp_oil.png"}, - inventory_image = "farming_hemp_oil.png", - wield_image = "farming_hemp_oil.png", - paramtype = "light", - is_ground_content = false, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, - groups = {food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_glass_defaults() -}) +-- crop definition -minetest.register_craft( { - output = "farming:hemp_oil", - recipe = { - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, - {"", "vessels:glass_bottle", ""} - } -}) - -minetest.register_craft( { - output = "farming:hemp_oil", - recipe = { - {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, - {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, - {"farming:seed_hemp", "vessels:glass_bottle", "farming:seed_hemp"} - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:hemp_oil", - burntime = 20, - replacements = {{"farming:hemp_oil", "vessels:glass_bottle"}} -}) - --- hemp fibre -minetest.register_craftitem("farming:hemp_fibre", { - description = S("Hemp Fibre"), - inventory_image = "farming_hemp_fibre.png" -}) - -minetest.register_craft( { - output = "farming:hemp_fibre 8", - recipe = { - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, - {"farming:hemp_leaf", "group:water_bucket", "farming:hemp_leaf"}, - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} - }, - replacements = {{"group:water_bucket", "bucket:bucket_empty"}} -}) - -if minetest.get_modpath("bucket_wooden") then - minetest.register_craft( { - output = "farming:hemp_fibre 8", - recipe = { - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, - {"farming:hemp_leaf", "group:water_bucket_wooden", "farming:hemp_leaf"}, - {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} - }, - replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} - }) -end - --- hemp block -minetest.register_node("farming:hemp_block", { - description = S("Hemp Block"), - tiles = {"farming_hemp_block.png"}, - paramtype = "light", - groups = {snappy = 1, oddly_breakable_by_hand = 1, flammable = 2} -}) - -minetest.register_craft( { - output = "farming:hemp_block", - recipe = { - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} - } -}) - --- check and register stairs -if minetest.global_exists("stairs") then - - if stairs.mod and stairs.mod == "redo" then - - stairs.register_all("hemp_block", "farming:hemp_block", - {snappy = 1, flammable = 2}, - {"farming_hemp_block.png"}, - "Hemp Block", - default.node_sound_leaves_defaults()) - else - - stairs.register_stair_and_slab("hemp_block", "farming:hemp_block", - {snappy = 1, flammable = 2}, - {"farming_hemp_block.png"}, - "Hemp Block Stair", - "Hemp Block Slab", - default.node_sound_leaves_defaults()) - end -end - --- paper -minetest.register_craft( { - output = "default:paper 3", - recipe = { - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} - } -}) - --- string -minetest.register_craft( { - output = "farming:cotton 3", - recipe = { - {"farming:hemp_fibre"}, - {"farming:hemp_fibre"}, - {"farming:hemp_fibre"} - } -}) - --- hemp rope -minetest.register_node("farming:hemp_rope", { - description = S("Hemp Rope"), - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - tiles = {"farming_hemp_rope.png"}, - wield_image = "farming_hemp_rope.png", - inventory_image = "farming_hemp_rope.png", - drawtype = "plantlike", - groups = {flammable = 2, choppy = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7} - } -}) - --- string -minetest.register_craft( { - output = "farming:hemp_rope 6", - recipe = { - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, - {"farming:cotton", "farming:cotton", "farming:cotton"}, - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} - } -}) - --- hemp definition local def = { + description = S("Hemp") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_hemp_1.png"}, paramtype = "light", @@ -190,34 +50,43 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:hemp_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_hemp_2.png"} minetest.register_node("farming:hemp_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_hemp_3.png"} minetest.register_node("farming:hemp_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_hemp_4.png"} minetest.register_node("farming:hemp_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_hemp_5.png"} minetest.register_node("farming:hemp_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_hemp_6.png"} def.drop = { items = { @@ -228,6 +97,7 @@ def.drop = { minetest.register_node("farming:hemp_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_hemp_7.png"} def.drop = { items = { @@ -240,8 +110,10 @@ def.drop = { minetest.register_node("farming:hemp_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_hemp_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:hemp_leaf 2"}, rarity = 1}, @@ -253,10 +125,33 @@ def.drop = { minetest.register_node("farming:hemp_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:hemp"] = { crop = "farming:hemp", seed = "farming:seed_hemp", - mminlight = farming.min_light, + minlight = farming.min_light, maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_rainforest_litter", + "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.hemp, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 45, + decoration = "farming:hemp_7", + spawn_by = "group:tree", num_spawn_by = 1 +}) diff --git a/mods/farming/crops/lettuce.lua b/mods/farming/crops/lettuce.lua index bbd7138d..43c6e6d3 100644 --- a/mods/farming/crops/lettuce.lua +++ b/mods/farming/crops/lettuce.lua @@ -1,17 +1,25 @@ -local S = farming.intllib --- lettuce +local S = minetest.get_translator("farming") + +-- item/seed + minetest.register_craftitem("farming:lettuce", { description = S("Lettuce"), inventory_image = "farming_lettuce.png", - groups = {seed = 2, food_lettuce = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_lettuce = 1}, + on_use = minetest.item_eat(2), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:lettuce_1") - end, - on_use = minetest.item_eat(2), + end }) +farming.add_eatable("farming:lettuce", 2) + +-- crop definition + local def = { + description = S("Lettuce") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_lettuce_1.png"}, paramtype = "light", @@ -21,39 +29,48 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:lettuce_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_lettuce_2.png"} minetest.register_node("farming:lettuce_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_lettuce_3.png"} minetest.register_node("farming:lettuce_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_lettuce_4.png"} minetest.register_node("farming:lettuce_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_lettuce_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { - {items = {'farming:lettuce 2'}, rarity = 1}, - {items = {'farming:lettuce 1'}, rarity = 2} + {items = {"farming:lettuce 2"}, rarity = 1}, + {items = {"farming:lettuce 1"}, rarity = 2} } } minetest.register_node("farming:lettuce_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:lettuce"] = { crop = "farming:lettuce", seed = "farming:lettuce", @@ -61,3 +78,23 @@ farming.registered_plants["farming:lettuce"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.lettuce, + spread = {x = 100, y = 100, z = 100}, + seed = 689, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 35, + decoration = "farming:lettuce_5" +}) diff --git a/mods/farming/crops/melon.lua b/mods/farming/crops/melon.lua index 66decdc4..83d4451e 100644 --- a/mods/farming/crops/melon.lua +++ b/mods/farming/crops/melon.lua @@ -1,33 +1,25 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- melon minetest.register_craftitem("farming:melon_slice", { description = S("Melon Slice"), inventory_image = "farming_melon_slice.png", - groups = {seed = 2, food_melon_slice = 1, flammable = 3}, + groups = {compostability = 48, seed = 2, food_melon_slice = 1}, + on_use = minetest.item_eat(2), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:melon_1") - end, - on_use = minetest.item_eat(2) + end }) -minetest.register_craft({ - output = "farming:melon_8", - recipe = { - {"farming:melon_slice", "farming:melon_slice"}, - {"farming:melon_slice", "farming:melon_slice"} - } -}) +farming.add_eatable("farming:melon_slice", 2) -minetest.register_craft({ - output = "farming:melon_slice 4", - recipe = {{"farming:cutting_board", "farming:melon_8"}}, - replacements = {{"farming:cutting_board", "farming:cutting_board"}} -}) +-- crop definition --- melon definition local def = { + description = S("Melon") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_melon_1.png"}, paramtype = "light", @@ -37,40 +29,50 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:melon_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_melon_2.png"} minetest.register_node("farming:melon_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_melon_3.png"} minetest.register_node("farming:melon_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_melon_4.png"} minetest.register_node("farming:melon_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_melon_5.png"} minetest.register_node("farming:melon_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_melon_6.png"} minetest.register_node("farming:melon_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_melon_7.png"} minetest.register_node("farming:melon_7", table.copy(def)) -- stage 8 (final) + minetest.register_node("farming:melon_8", { description = S("Melon"), tiles = { @@ -79,16 +81,20 @@ minetest.register_node("farming:melon_8", { "farming_melon_side.png" }, groups = { - food_melon = 1, snappy = 2, oddly_breakable_by_hand = 1, - flammable = 2, plant = 1 + food_melon = 1, handy = 1, snappy = 3, choppy = 3, oddly_breakable_by_hand = 2, + flammable = 2, plant = 1, compostability = 65 }, + is_ground_content = false, drop = "farming:melon_8", - sounds = default.node_sound_wood_defaults(), + sounds = farming.node_sound_wood_defaults(), paramtype2 = "facedir", - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 }) -- add to registered_plants + farming.registered_plants["farming:melon"] = { crop = "farming:melon", seed = "farming:melon_slice", @@ -96,3 +102,25 @@ farming.registered_plants["farming:melon"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", "mcl_core:dirt_with_grass" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.melon, + spread = {x = 100, y = 100, z = 100}, + seed = 790, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 3, + decoration = "farming:melon_8", + spawn_by = {"group:water", "group:sand"}, num_spawn_by = 1 +}) diff --git a/mods/farming/crops/mint.lua b/mods/farming/crops/mint.lua index de4b6b32..00a99c05 100644 --- a/mods/farming/crops/mint.lua +++ b/mods/farming/crops/mint.lua @@ -1,74 +1,84 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") --- mint seed -minetest.register_craftitem("farming:seed_mint", { +-- seed + +minetest.register_node("farming:seed_mint", { description = S("Mint Seeds"), + tiles = {"farming_mint_seeds.png"}, inventory_image = "farming_mint_seeds.png", - groups = {seed = 2, flammable = 2}, + wield_image = "farming_mint_seeds.png", + drawtype = "signlike", + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, growing = 1, + handy = 1, flammable = 2 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:mint_1", + on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed( - itemstack, placer, pointed_thing, "farming:mint_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_mint") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:mint_1", param2 = 1}) end }) --- mint leaf +-- item + minetest.register_craftitem("farming:mint_leaf", { description = S("Mint Leaf"), inventory_image = "farming_mint_leaf.png", - groups = {food_mint = 1, flammable = 4} + groups = {food_mint = 1, flammable = 4, compostability = 48} }) --- mint tea -minetest.register_craftitem("farming:mint_tea", { - description = S("Mint Tea"), - inventory_image = "farming_mint_tea.png", - on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = {flammable = 4} -}) +-- crop definition -minetest.register_craft({ - output = "farming:mint_tea", - recipe = { - {"group:food_mint", "group:food_mint", "group:food_mint"}, - {"group:food_water_glass", "farming:juicer", ""} - }, - replacements = { - {"group:food_juicer", "farming:juicer"} - } -}) - - --- mint definition local def = { + description = S("Mint") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_mint_1.png"}, paramtype = "light", walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:mint_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_mint_2.png"} minetest.register_node("farming:mint_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_mint_3.png"} minetest.register_node("farming:mint_3", table.copy(def)) -- stage 4 (final) + def.tiles = {"farming_mint_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:mint_leaf 2"}, rarity = 1}, @@ -80,6 +90,7 @@ def.drop = { minetest.register_node("farming:mint_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:mint"] = { crop = "farming:mint", seed = "farming:seed_mint", @@ -87,3 +98,25 @@ farming.registered_plants["farming:mint"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_coniferous_litter", + "mcl_core:dirt_with_grass", "ethereal:bamboo_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.mint, + spread = {x = 100, y = 100, z = 100}, + seed = 801, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 75, + decoration = "farming:mint_4", + spawn_by = {"group:water", "group:sand"}, num_spawn_by = 1 +}) diff --git a/mods/farming/crops/onion.lua b/mods/farming/crops/onion.lua index 63cdbe53..e62eb445 100644 --- a/mods/farming/crops/onion.lua +++ b/mods/farming/crops/onion.lua @@ -5,39 +5,27 @@ https://forum.minetest.net/viewtopic.php?f=9&t=19488 ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- onion minetest.register_craftitem("farming:onion", { description = S("Onion"), inventory_image = "crops_onion.png", - groups = {seed = 2, food_onion = 1, flammable = 3}, + groups = {compostability = 48, seed = 2, food_onion = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:onion_1") - end, - on_use = minetest.item_eat(1) + end }) --- onion soup -minetest.register_craftitem("farming:onion_soup", { - description = S("Onion Soup"), - inventory_image = "farming_onion_soup.png", - groups = {flammable = 2}, - on_use = minetest.item_eat(6, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:onion_soup", - recipe = { - {"group:food_onion", "group:food_onion", "group:food_onion"}, - {"group:food_onion", "group:food_pot", "group:food_onion"}, - {"", "group:food_bowl", ""} - }, - replacements = {{"farming:pot", "farming:pot"}} -}) +farming.add_eatable("farming:onion", 1) -- crop definition + local def = { + description = S("Onion") .. S(" Crop"), drawtype = "plantlike", tiles = {"crops_onion_plant_1.png"}, paramtype = "light", @@ -48,32 +36,41 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 3, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:onion_1", table.copy(def)) -- stage 2 + def.tiles = {"crops_onion_plant_2.png"} minetest.register_node("farming:onion_2", table.copy(def)) -- stage 3 + def.tiles = {"crops_onion_plant_3.png"} minetest.register_node("farming:onion_3", table.copy(def)) -- stage 4 + def.tiles = {"crops_onion_plant_4.png"} minetest.register_node("farming:onion_4", table.copy(def)) -- stage 5 + def.tiles = {"crops_onion_plant_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { max_items = 5, items = { {items = {"farming:onion"}, rarity = 1}, @@ -86,6 +83,7 @@ def.drop = { minetest.register_node("farming:onion_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:onion"] = { crop = "farming:onion", seed = "farming:onion", @@ -93,3 +91,23 @@ farming.registered_plants["farming:onion"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.onion, + spread = {x = 100, y = 100, z = 100}, + seed = 912, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 28, + decoration = "farming:onion_5" +}) diff --git a/mods/farming/crops/parsley.lua b/mods/farming/crops/parsley.lua index 0bc20eba..b63b96a3 100644 --- a/mods/farming/crops/parsley.lua +++ b/mods/farming/crops/parsley.lua @@ -1,17 +1,25 @@ -local S = farming.intllib --- item definition +local S = minetest.get_translator("farming") + +-- item/seed + minetest.register_craftitem("farming:parsley", { description = S("Parsley"), inventory_image = "farming_parsley.png", - groups = {seed = 2, food_parsley = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_parsley = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:parsley_1") end }) +farming.add_eatable("farming:parsley", 1) + -- crop definition + local def = { + description = S("Parsley") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_parsley_1.png"}, paramtype = "light", @@ -19,24 +27,31 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:parsley_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_parsley_2.png"} minetest.register_node("farming:parsley_2", table.copy(def)) -- stage 3 (final) + def.tiles = {"farming_parsley_3.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:parsley 2"}, rarity = 1}, @@ -47,6 +62,7 @@ def.drop = { minetest.register_node("farming:parsley_3", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:parsley"] = { crop = "farming:parsley", seed = "farming:parsley", @@ -54,3 +70,24 @@ farming.registered_plants["farming:parsley"] = { maxlight = 15, steps = 3 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt", + "ethereal:grove_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.parsley, + spread = {x = 100, y = 100, z = 100}, + seed = 23, + octaves = 3, + persist = 0.6 + }, + y_min = 10, y_max = 40, + decoration = "farming:parsley_3" +}) diff --git a/mods/farming/crops/peas.lua b/mods/farming/crops/peas.lua index 50b8234e..4dc1ec35 100644 --- a/mods/farming/crops/peas.lua +++ b/mods/farming/crops/peas.lua @@ -1,40 +1,31 @@ -local S = farming.intllib +-- Textures for peas and their crop were done by Andrey01 --- Textures for Pea crop and Peas were done by Andrey01 +local S = minetest.get_translator("farming") + +-- item/seed --- pea pod minetest.register_craftitem("farming:pea_pod", { description = S("Pea Pod"), inventory_image = "farming_pea_pod.png", - groups = {seed = 2, food_peas = 1, food_pea_pod = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_peas = 1, food_pea_pod = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pea_1") - end, - on_use = minetest.item_eat(1) + end }) +farming.add_eatable("farming:pea_pod", 1) + -- replacement for separate peas item that was removed + minetest.register_alias("farming:peas", "farming:pea_pod") --- pea soup -minetest.register_craftitem("farming:pea_soup", { - description = S("Pea Soup"), - inventory_image = "farming_pea_soup.png", - groups = {flammable = 2}, - on_use = minetest.item_eat(4, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:pea_soup", - recipe = { - {"group:food_peas"}, - {"group:food_peas"}, - {"group:food_bowl"} - } -}) +-- crop definition local def = { + description = S("Pea") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_pea_1.png"}, paramtype = "light", @@ -47,30 +38,38 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:pea_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_pea_2.png"} minetest.register_node("farming:pea_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_pea_3.png"} minetest.register_node("farming:pea_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_pea_4.png"} minetest.register_node("farming:pea_4", table.copy(def)) --- stage 5 +-- stage 5 (final) + def.tiles = {"farming_pea_5.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { max_items = 5, items = { {items = {"farming:pea_pod"}, rarity = 1}, @@ -82,10 +81,31 @@ def.drop = { minetest.register_node("farming:pea_5", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:pea_pod"] = { - crop = "farming:pea_pod", + crop = "farming:pea", seed = "farming:pea_pod", minlight = farming.min_light, maxlight = farming.max_light, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.peas, + spread = {x = 100, y = 100, z = 100}, + seed = 132, + octaves = 3, + persist = 0.6 + }, + y_min = 25, y_max = 55, + decoration = "farming:pea_5" +}) diff --git a/mods/farming/crops/pepper.lua b/mods/farming/crops/pepper.lua index bdf6287a..df24ac86 100644 --- a/mods/farming/crops/pepper.lua +++ b/mods/farming/crops/pepper.lua @@ -5,79 +5,64 @@ https://forum.minetest.net/viewtopic.php?f=9&t=19488 ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- seed --- peppercorn (seed) minetest.register_craftitem("farming:peppercorn", { description = S("Peppercorn"), inventory_image = "crops_peppercorn.png", - groups = {seed = 1, food_peppercorn = 1, flammable = 3}, + groups = {compostability = 48, seed = 1, food_peppercorn = 1, flammable = 3}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pepper_1") end }) -- green pepper + minetest.register_craftitem("farming:pepper", { description = S("Green Pepper"), inventory_image = "crops_pepper.png", on_use = minetest.item_eat(2), - groups = {food_pepper = 1, flammable = 3} + groups = {food_pepper = 1, compostability = 55} }) +farming.add_eatable("farming:pepper", 2) + -- yellow pepper + minetest.register_craftitem("farming:pepper_yellow", { description = S("Yellow Pepper"), inventory_image = "crops_pepper_yellow.png", on_use = minetest.item_eat(3), - groups = {food_pepper = 1, flammable = 3} + groups = {food_pepper = 1, compostability = 55} }) +farming.add_eatable("farming:pepper_yellow", 3) + -- red pepper + minetest.register_craftitem("farming:pepper_red", { description = S("Red Pepper"), inventory_image = "crops_pepper_red.png", on_use = minetest.item_eat(4), - groups = {food_pepper = 1, flammable = 3} + groups = {food_pepper = 1, compostability = 55} }) +farming.add_eatable("farming:pepper_red", 4) + +-- pepper to peppercorn recipe + minetest.register_craft({ output = "farming:peppercorn", recipe = {{"group:food_pepper"}} }) --- ground pepper -minetest.register_node("farming:pepper_ground", { - description = S("Ground Pepper"), - inventory_image = "crops_pepper_ground.png", - wield_image = "crops_pepper_ground.png", - drawtype = "plantlike", - visual_scale = 0.8, - paramtype = "light", - tiles = {"crops_pepper_ground.png"}, - groups = { - vessel = 1, food_pepper_ground = 1, - dig_immediate = 3, attached_node = 1 - }, - sounds = default.node_sound_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - } -}) - -minetest.register_craft( { - output = "farming:pepper_ground", - recipe = { - {"group:food_peppercorn"}, - {"farming:mortar_pestle"}, - {"vessels:glass_bottle"} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) - -- crop definition + local def = { + description = S("Pepper") .. S(" Crop"), drawtype = "plantlike", tiles = {"crops_pepper_plant_1.png"}, paramtype = "light", @@ -90,29 +75,37 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 3, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:pepper_1", table.copy(def)) -- stage 2 + def.tiles = {"crops_pepper_plant_2.png"} minetest.register_node("farming:pepper_2", table.copy(def)) -- stage 3 + def.tiles = {"crops_pepper_plant_3.png"} minetest.register_node("farming:pepper_3", table.copy(def)) -- stage 4 + def.tiles = {"crops_pepper_plant_4.png"} minetest.register_node("farming:pepper_4", table.copy(def)) -- stage 5 (green pepper) + def.tiles = {"crops_pepper_plant_5.png"} +def.selection_box = farming.select_final def.drop = { max_items = 2, items = { {items = {"farming:pepper 2"}, rarity = 1}, @@ -123,6 +116,7 @@ def.drop = { minetest.register_node("farming:pepper_5", table.copy(def)) -- stage 6 (yellow pepper) + def.tiles = {"crops_pepper_plant_6.png"} def.drop = { max_items = 2, items = { @@ -133,7 +127,8 @@ def.drop = { } minetest.register_node("farming:pepper_6", table.copy(def)) --- stage 7 (red pepper) +-- stage 7 (red pepper - final) + def.tiles = {"crops_pepper_plant_7.png"} def.groups.growing = nil def.drop = { @@ -146,6 +141,7 @@ def.drop = { minetest.register_node("farming:pepper_7", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:pepper"] = { crop = "farming:pepper", seed = "farming:peppercorn", @@ -153,3 +149,25 @@ farming.registered_plants["farming:pepper"] = { maxlight = farming.max_light, steps = 5 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_rainforest_litter", + "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.pepper, + spread = {x = 100, y = 100, z = 100}, + seed = 243, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 35, + decoration = {"farming:pepper_5", "farming:pepper_6", "farming:pepper_7"}, + spawn_by = "group:tree", num_spawn_by = 1 +}) diff --git a/mods/farming/crops/pineapple.lua b/mods/farming/crops/pineapple.lua index 6bb1918e..f4076ff4 100644 --- a/mods/farming/crops/pineapple.lua +++ b/mods/farming/crops/pineapple.lua @@ -1,17 +1,20 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- seed --- pineapple top minetest.register_craftitem("farming:pineapple_top", { description = S("Pineapple Top"), inventory_image = "farming_pineapple_top.png", - groups = {seed = 2, flammable = 2}, + groups = {compostability = 48, seed = 2, flammable = 2}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pineapple_1") end }) --- pineapple +-- item + minetest.register_node("farming:pineapple", { description = S("Pineapple"), drawtype = "plantlike", @@ -22,61 +25,20 @@ minetest.register_node("farming:pineapple", { sunlight_propagates = true, walkable = false, selection_box = { - type = "fixed", - fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} + type = "fixed", fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} }, - groups = {food_pineapple = 1, fleshy = 3, dig_immediate = 3, flammable = 2} -}) - --- pineapple -minetest.register_craftitem("farming:pineapple_ring", { - description = S("Pineapple Ring"), - inventory_image = "farming_pineapple_ring.png", - groups = {food_pineapple_ring = 1, flammable = 2}, - on_use = minetest.item_eat(1) -}) - -minetest.register_craft( { - output = "farming:pineapple_ring 5", - recipe = {{"group:food_pineapple"}}, - replacements = {{"farming:pineapple", "farming:pineapple_top"}} -}) - --- pineapple juice -minetest.register_craftitem("farming:pineapple_juice", { - description = S("Pineapple Juice"), - inventory_image = "farming_pineapple_juice.png", - on_use = minetest.item_eat(4, "vessels:drinking_glass"), - groups = {vessel = 1, drink = 1} -}) - -minetest.register_craft({ - output = "farming:pineapple_juice", - recipe = { - {"group:food_pineapple_ring", "group:food_pineapple_ring", - "group:food_pineapple_ring"}, - {"", "farming:juicer", ""}, - {"", "vessels:drinking_glass", ""} + groups = { + food_pineapple = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + compostability = 65 }, - replacements = { - {"group:food_juicer", "farming:juicer"} - } -}) - -minetest.register_craft({ - output = "farming:pineapple_juice 2", - recipe = { - {"group:food_pineapple", ""}, - {"farming:juicer", ""}, - {"vessels:drinking_glass", "vessels:drinking_glass"} - }, - replacements = { - {"group:food_juicer", "farming:juicer"} - } + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false }) -- crop definition + local def = { + description = S("Pineapple") .. S(" Crop"), drawtype = "plantlike", visual_scale = 1.5, tiles = {"farming_pineapple_1.png"}, @@ -85,53 +47,66 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:pineapple_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_pineapple_2.png"} minetest.register_node("farming:pineapple_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_pineapple_3.png"} minetest.register_node("farming:pineapple_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_pineapple_4.png"} minetest.register_node("farming:pineapple_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_pineapple_5.png"} minetest.register_node("farming:pineapple_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_pineapple_6.png"} minetest.register_node("farming:pineapple_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_pineapple_7.png"} minetest.register_node("farming:pineapple_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_pineapple_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:pineapple"}, rarity = 1}, - {items = {"farming:pineapple"}, rarity = 10} + {items = {"farming:pineapple"}, rarity = 2} } } minetest.register_node("farming:pineapple_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:pineapple"] = { crop = "farming:pineapple", seed = "farming:pineapple_top", @@ -139,3 +114,30 @@ farming.registered_plants["farming:pineapple"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +local spawn_on = { + "default:dirt_with_dry_grass", "default:dry_dirt_with_dry_grass", + "mcl_core:dirt_with_grass" +} + +if farming.mapgen == "v6" then + spawn_on = {"default:dirt_with_grass"} +end + +minetest.register_decoration({ + deco_type = "simple", + place_on = spawn_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.pineapple, + spread = {x = 100, y = 100, z = 100}, + seed = 354, + octaves = 3, + persist = 0.6 + }, + y_min = 11, y_max = 30, + decoration = "farming:pineapple_8" +}) diff --git a/mods/farming/crops/potato.lua b/mods/farming/crops/potato.lua index a55ab298..f32ca939 100644 --- a/mods/farming/crops/potato.lua +++ b/mods/farming/crops/potato.lua @@ -4,19 +4,24 @@ https://forum.minetest.net/viewtopic.php?id=3948 ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- potato minetest.register_craftitem("farming:potato", { description = S("Potato"), inventory_image = "farming_potato.png", - groups = {seed = 2, food_potato = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_potato = 1}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:potato_1") end, + -- 1 in 3 chance of being poisoned on_use = function(itemstack, user, pointed_thing) + if user then + if math.random(3) == 1 then return minetest.do_item_eat(-1, nil, itemstack, user, pointed_thing) else @@ -26,38 +31,12 @@ minetest.register_craftitem("farming:potato", { end }) --- baked potato -minetest.register_craftitem("farming:baked_potato", { - description = S("Baked Potato"), - inventory_image = "farming_baked_potato.png", - on_use = minetest.item_eat(6) -}) +farming.add_eatable("farming:potato", 1) -minetest.register_craft({ - type = "cooking", - cooktime = 10, - output = "farming:baked_potato", - recipe = "group:food_potato" -}) +-- crop definition --- Potato and cucumber Salad -minetest.register_craftitem("farming:potato_salad", { - description = S("Cucumber and Potato Salad"), - inventory_image = "farming_potato_salad.png", - on_use = minetest.item_eat(10, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:potato_salad", - recipe = { - {"group:food_cucumber"}, - {"farming:baked_potato"}, - {"group:food_bowl"} - } -}) - --- potato definition local def = { + description = S("Potato") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_potato_1.png"}, paramtype = "light", @@ -68,20 +47,25 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:potato_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_potato_2.png"} minetest.register_node("farming:potato_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_potato_3.png"} def.drop = { items = { @@ -91,9 +75,11 @@ def.drop = { } minetest.register_node("farming:potato_3", table.copy(def)) --- stage 4 +-- stage 4 (final) + def.tiles = {"farming_potato_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:potato 2"}, rarity = 1}, @@ -103,6 +89,7 @@ def.drop = { minetest.register_node("farming:potato_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:potato"] = { crop = "farming:potato", seed = "farming:potato", @@ -110,3 +97,24 @@ farming.registered_plants["farming:potato"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_rainforest_litter", + "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.potato, + spread = {x = 100, y = 100, z = 100}, + seed = 465, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 40, + decoration = "farming:potato_3" +}) diff --git a/mods/farming/crops/pumpkin.lua b/mods/farming/crops/pumpkin.lua index 2829d47c..d133dfec 100644 --- a/mods/farming/crops/pumpkin.lua +++ b/mods/farming/crops/pumpkin.lua @@ -1,140 +1,25 @@ ---[[ - Big thanks to PainterlyPack.net for allowing me to use these textures -]] +local S = minetest.get_translator("farming") -local S = farming.intllib +-- seed --- pumpkin slice minetest.register_craftitem("farming:pumpkin_slice", { description = S("Pumpkin Slice"), inventory_image = "farming_pumpkin_slice.png", - groups = {seed = 2, food_pumpkin_slice = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_pumpkin_slice = 1}, + on_use = minetest.item_eat(2), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pumpkin_1") - end, - on_use = minetest.item_eat(2) -}) - -minetest.register_craft({ - output = "farming:pumpkin", - recipe = { - {"farming:pumpkin_slice", "farming:pumpkin_slice"}, - {"farming:pumpkin_slice", "farming:pumpkin_slice"} - } -}) - -minetest.register_craft({ - output = "farming:pumpkin_slice 4", - recipe = {{"farming:cutting_board", "farming:pumpkin"}}, - replacements = {{"farming:cutting_board", "farming:cutting_board"}} -}) - --- jack 'o lantern -minetest.register_node("farming:jackolantern", { - description = S("Jack 'O Lantern (punch to turn on and off)"), - tiles = { - "farming_pumpkin_top.png", "farming_pumpkin_top.png", - "farming_pumpkin_side.png", "farming_pumpkin_side.png", - "farming_pumpkin_side.png", "farming_pumpkin_face_off.png" - }, - paramtype2 = "facedir", - groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - on_punch = function(pos, node, puncher) - local name = puncher:get_player_name() or "" - if minetest.is_protected(pos, name) then return end - node.name = "farming:jackolantern_on" - minetest.swap_node(pos, node) end }) -minetest.register_node("farming:jackolantern_on", { - tiles = { - "farming_pumpkin_top.png", "farming_pumpkin_top.png", - "farming_pumpkin_side.png", "farming_pumpkin_side.png", - "farming_pumpkin_side.png", "farming_pumpkin_face_on.png" - }, - light_source = default.LIGHT_MAX - 1, - paramtype2 = "facedir", - groups = { - choppy = 1, oddly_breakable_by_hand = 1, flammable = 2, - not_in_creative_inventory = 1 - }, - sounds = default.node_sound_wood_defaults(), - drop = "farming:jackolantern", - on_punch = function(pos, node, puncher) - local name = puncher:get_player_name() or "" - if minetest.is_protected(pos, name) then return end - node.name = "farming:jackolantern" - minetest.swap_node(pos, node) - end -}) +farming.add_eatable("farming:pumpkin_slice", 2) -minetest.register_craft({ - output = "farming:jackolantern", - recipe = { - {"default:torch"}, - {"group:food_pumpkin"} - } -}) +-- crop definition ---- wooden scarecrow base -minetest.register_node("farming:scarecrow_bottom", { - description = S("Scarecrow Bottom"), - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - tiles = {"default_wood.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}, - {-12/16, 4/16, -1/16, 12/16, 2/16, 1/16}, - } - }, - groups = {snappy = 3, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:scarecrow_bottom", - recipe = { - {"", "group:stick", ""}, - {"group:stick", "group:stick", "group:stick"}, - {"", "group:stick", ""} - } -}) - --- pumpkin bread -minetest.register_craftitem("farming:pumpkin_bread", { - description = S("Pumpkin Bread"), - inventory_image = "farming_pumpkin_bread.png", - on_use = minetest.item_eat(8), - groups = {food_bread = 1, flammable = 2} -}) - -minetest.register_craftitem("farming:pumpkin_dough", { - description = S("Pumpkin Dough"), - inventory_image = "farming_pumpkin_dough.png" -}) - -minetest.register_craft({ - output = "farming:pumpkin_dough", - recipe = { - {"group:food_pumpkin_slice", "group:food_flour", "group:food_pumpkin_slice"} - } -}) - -minetest.register_craft({ - type = "cooking", - output = "farming:pumpkin_bread", - recipe = "farming:pumpkin_dough", - cooktime = 10 -}) - --- pumpkin definition local def = { + description = S("Pumpkin") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_pumpkin_1.png"}, paramtype = "light", @@ -145,60 +30,74 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:pumpkin_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_pumpkin_2.png"} minetest.register_node("farming:pumpkin_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_pumpkin_3.png"} minetest.register_node("farming:pumpkin_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_pumpkin_4.png"} minetest.register_node("farming:pumpkin_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_pumpkin_5.png"} minetest.register_node("farming:pumpkin_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_pumpkin_6.png"} minetest.register_node("farming:pumpkin_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_pumpkin_7.png"} minetest.register_node("farming:pumpkin_7", table.copy(def)) -- stage 8 (final) + minetest.register_node("farming:pumpkin_8", { description = S("Pumpkin"), tiles = { - "farming_pumpkin_top.png", + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", "farming_pumpkin_bottom.png", "farming_pumpkin_side.png" }, groups = { - food_pumpkin = 1, choppy = 2, oddly_breakable_by_hand = 1, - flammable = 2, plant = 1 + food_pumpkin = 1, snappy = 3, choppy = 3, oddly_breakable_by_hand = 2, + flammable = 2, plant = 1, handy = 1 }, + is_ground_content = false, drop = "farming:pumpkin_8", - sounds = default.node_sound_wood_defaults(), + sounds = farming.node_sound_wood_defaults(), paramtype2 = "facedir", - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 }) minetest.register_alias("farming:pumpkin", "farming:pumpkin_8") -- add to registered_plants + farming.registered_plants["farming:pumpkin"] = { crop = "farming:pumpkin", seed = "farming:pumpkin_slice", @@ -206,3 +105,25 @@ farming.registered_plants["farming:pumpkin"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_rainforest_litter", + "mcl_core:dirt_with_grass" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.pumpkin, + spread = {x = 100, y = 100, z = 100}, + seed = 576, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 3, + decoration = "farming:pumpkin_8", + spawn_by = {"group:water", "group:sand"}, num_spawn_by = 1 +}) diff --git a/mods/farming/crops/raspberry.lua b/mods/farming/crops/raspberry.lua index df1d3d94..6e04e6bf 100644 --- a/mods/farming/crops/raspberry.lua +++ b/mods/farming/crops/raspberry.lua @@ -1,37 +1,28 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- raspberries minetest.register_craftitem("farming:raspberries", { description = S("Raspberries"), inventory_image = "farming_raspberries.png", - groups = {seed = 2, food_raspberries = 1, food_raspberry = 1, - food_berry = 1, flammable = 2}, + groups = { + compostability = 48, seed = 2, food_raspberries = 1, food_raspberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:raspberry_1") - end, - on_use = minetest.item_eat(1) + end }) --- raspberry smoothie -minetest.register_craftitem("farming:smoothie_raspberry", { - description = S("Raspberry Smoothie"), - inventory_image = "farming_raspberry_smoothie.png", - on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = {vessel = 1, drink = 1} -}) +farming.add_eatable("farming:raspberries", 1) -minetest.register_craft({ - output = "farming:smoothie_raspberry", - recipe = { - {"default:snow"}, - {"group:food_raspberries"}, - {"vessels:drinking_glass"} - } -}) +-- crop definition --- raspberries definition local def = { + description = S("Raspberry") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_raspberry_1.png"}, paramtype = "light", @@ -41,26 +32,33 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:raspberry_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_raspberry_2.png"} minetest.register_node("farming:raspberry_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_raspberry_3.png"} minetest.register_node("farming:raspberry_3", table.copy(def)) -- stage 4 (final) + def.tiles = {"farming_raspberry_4.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:raspberries 2"}, rarity = 1}, @@ -71,6 +69,7 @@ def.drop = { minetest.register_node("farming:raspberry_4", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:raspberries"] = { crop = "farming:raspberry", seed = "farming:raspberries", @@ -78,3 +77,23 @@ farming.registered_plants["farming:raspberries"] = { maxlight = farming.max_light, steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.raspberry, + spread = {x = 100, y = 100, z = 100}, + seed = 687, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 15, + decoration = "farming:raspberry_4" +}) diff --git a/mods/farming/crops/rhubarb.lua b/mods/farming/crops/rhubarb.lua index d0ac58af..afbffc1c 100644 --- a/mods/farming/crops/rhubarb.lua +++ b/mods/farming/crops/rhubarb.lua @@ -1,36 +1,25 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- rhubarb minetest.register_craftitem("farming:rhubarb", { description = S("Rhubarb"), inventory_image = "farming_rhubarb.png", - groups = {seed = 2, food_rhubarb = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_rhubarb = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:rhubarb_1") - end, - on_use = minetest.item_eat(1) + end }) --- rhubarb pie -minetest.register_craftitem("farming:rhubarb_pie", { - description = S("Rhubarb Pie"), - inventory_image = "farming_rhubarb_pie.png", - on_use = minetest.item_eat(6) -}) +farming.add_eatable("farming:rhubarb", 1) -minetest.register_craft({ - output = "farming:rhubarb_pie", - recipe = { - {"farming:baking_tray", "group:food_sugar", ""}, - {"group:food_rhubarb", "group:food_rhubarb", "group:food_rhubarb"}, - {"group:food_wheat", "group:food_wheat", "group:food_wheat"} - }, - replacements = {{"group:food_baking_tray", "farming:baking_tray"}} -}) +-- crop definition --- rhubarb definition local def = { + description = S("Rhubarb") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_rhubarb_1.png"}, paramtype = "light", @@ -38,40 +27,78 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults(), + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), minlight = 10, maxlight = 12 } -- stage 1 + minetest.register_node("farming:rhubarb_1", table.copy(def)) -- stage2 + def.tiles = {"farming_rhubarb_2.png"} minetest.register_node("farming:rhubarb_2", table.copy(def)) --- stage 3 (final) +-- stage3 + def.tiles = {"farming_rhubarb_3.png"} -def.groups.growing = nil def.drop = { items = { - {items = {"farming:rhubarb 2"}, rarity = 1}, - {items = {"farming:rhubarb"}, rarity = 2}, - {items = {"farming:rhubarb"}, rarity = 3} + {items = {"farming:rhubarb"}, rarity = 1}, } } minetest.register_node("farming:rhubarb_3", table.copy(def)) +-- stage 4 (final) + +def.tiles = {"farming_rhubarb_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:rhubarb 2"}, rarity = 1}, + {items = {"farming:rhubarb"}, rarity = 2}, + {items = {"farming:rhubarb"}, rarity = 3} + } +} +minetest.register_node("farming:rhubarb_4", table.copy(def)) + -- add to registered_plants + farming.registered_plants["farming:rhubarb"] = { crop = "farming:rhubarb", seed = "farming:rhubarb", minlight = 10, maxlight = 12, - steps = 3 + steps = 4 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.rhubarb, + spread = {x = 100, y = 100, z = 100}, + seed = 798, + octaves = 3, + persist = 0.6 + }, + y_min = 3, y_max = 20, + decoration = "farming:rhubarb_3" +}) diff --git a/mods/farming/crops/rice.lua b/mods/farming/crops/rice.lua index 6b8e2be3..66c0c045 100644 --- a/mods/farming/crops/rice.lua +++ b/mods/farming/crops/rice.lua @@ -1,50 +1,57 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- rice seed + +minetest.register_node("farming:seed_rice", { + description = S("Rice Seed"), + tiles = {"farming_rice_seed.png"}, + inventory_image = "farming_rice_seed.png", + wield_image = "farming_rice_seed.png", + drawtype = "signlike", + groups = { + handy = 1, compostability = 48, seed = 1, snappy = 3, attached_node = 1, + flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:rice_1", --- rice -minetest.register_craftitem("farming:rice", { - description = S("Rice"), - inventory_image = "farming_rice.png", - groups = {seed = 2, food_rice = 1, flammable = 2}, on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:rice_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_rice") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:rice_1", param2 = 3}) end }) --- replacement for rice seeds that was removed -minetest.register_alias("farming:seed_rice", "farming:rice") +-- rice item -minetest.register_craftitem("farming:rice_bread", { - description = S("Rice Bread"), - inventory_image = "farming_rice_bread.png", - on_use = minetest.item_eat(5), - groups = {food_rice_bread = 1, flammable = 2} +minetest.register_craftitem("farming:rice", { + description = S("Rice"), + inventory_image = "farming_rice.png", + groups = {seed = 2, food_rice = 1, flammable = 2, compostability = 65}, }) -minetest.register_craftitem("farming:rice_flour", { - description = S("Rice Flour"), - inventory_image = "farming_rice_flour.png", - groups = {food_rice_flour = 1, flammable = 1} -}) - -minetest.register_craft({ - output = "farming:rice_flour", - recipe = { - {"farming:rice", "farming:rice", "farming:rice"}, - {"farming:rice", "farming:mortar_pestle", ""} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) +-- dry rice seed to give edible rice minetest.register_craft({ type = "cooking", - cooktime = 15, - output = "farming:rice_bread", - recipe = "farming:rice_flour" + cooktime = 1, + output = "farming:rice", + recipe = "farming:seed_rice" }) --- rice definition +-- crop definition + local def = { + description = S("Rice") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_rice_1.png"}, paramtype = "light", @@ -54,30 +61,38 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 4, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:rice_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_rice_2.png"} minetest.register_node("farming:rice_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_rice_3.png"} minetest.register_node("farming:rice_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_rice_4.png"} minetest.register_node("farming:rice_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_rice_5.png"} def.drop = { items = { @@ -87,6 +102,7 @@ def.drop = { minetest.register_node("farming:rice_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_rice_6.png"} def.drop = { items = { @@ -96,44 +112,37 @@ def.drop = { minetest.register_node("farming:rice_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_rice_7.png"} def.drop = { items = { - {items = {"farming:rice"}, rarity = 1}, - {items = {"farming:rice"}, rarity = 3} + {items = {"farming:seed_rice"}, rarity = 1}, + {items = {"farming:seed_rice"}, rarity = 2}, + {items = {"farming:seed_rice"}, rarity = 3} } } minetest.register_node("farming:rice_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_rice_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { - {items = {"farming:rice 2"}, rarity = 1}, - {items = {"farming:rice"}, rarity = 2} + {items = {"farming:seed_rice 2"}, rarity = 1}, + {items = {"farming:seed_rice 2"}, rarity = 2}, + {items = {"farming:seed_rice"}, rarity = 3} } } minetest.register_node("farming:rice_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:rice"] = { crop = "farming:rice", - seed = "farming:rice", + seed = "farming:seed_rice", minlight = farming.min_light, maxlight = farming.max_light, steps = 8 } - --- fuels -minetest.register_craft({ - type = "fuel", - recipe = "farming:rice", - burntime = 1 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:rice_bread", - burntime = 1 -}) diff --git a/mods/farming/crops/rye_oat.lua b/mods/farming/crops/rye_oat.lua new file mode 100644 index 00000000..3fd93c14 --- /dev/null +++ b/mods/farming/crops/rye_oat.lua @@ -0,0 +1,50 @@ + +local S = minetest.get_translator("farming") + +--= A nice addition from Ademant's grain mod :) + +-- Rye + +farming.register_plant("farming:rye", { + description = S("Rye seed"), + paramtype2 = "meshoptions", + inventory_image = "farming_rye_seed.png", + steps = 8, + place_param2 = 3 +}) + +-- override rye item + +minetest.override_item("farming:rye", { + description = S("Rye"), + groups = {food_rye = 1, flammable = 4, compostability = 65} +}) + +-- override rye crop + +minetest.override_item("farming:rye_1", {drop = {}}) +minetest.override_item("farming:rye_2", {drop = {}}) +minetest.override_item("farming:rye_3", {drop = {}}) + +-- Oats + +farming.register_plant("farming:oat", { + description = S("Oat seed"), + paramtype2 = "meshoptions", + inventory_image = "farming_oat_seed.png", + steps = 8, + place_param2 = 3 +}) + +-- override oat item + +minetest.override_item("farming:oat", { + description = S("Oats"), + groups = {food_oats = 1, flammable = 4, compostability = 65} +}) + +-- override oat crop + +minetest.override_item("farming:oat_1", {drop = {}}) +minetest.override_item("farming:oat_2", {drop = {}}) +minetest.override_item("farming:oat_3", {drop = {}}) diff --git a/mods/farming/crops/ryeoatrice.lua b/mods/farming/crops/ryeoatrice.lua deleted file mode 100644 index ad2d5bc7..00000000 --- a/mods/farming/crops/ryeoatrice.lua +++ /dev/null @@ -1,114 +0,0 @@ - -local S = farming.intllib - ---= A nice addition from Ademant's grain mod :) - --- Rye - -farming.register_plant("farming:rye", { - description = S("Rye seed"), - paramtype2 = "meshoptions", - inventory_image = "farming_rye_seed.png", - steps = 8, - place_param2 = 3 -}) - -minetest.override_item("farming:rye", { - description = S("Rye"), - groups = {food_rye = 1, flammable = 4} -}) - -minetest.override_item("farming:rye_1", {drop = {}}) -minetest.override_item("farming:rye_2", {drop = {}}) -minetest.override_item("farming:rye_3", {drop = {}}) - -minetest.register_craft({ - output = "farming:flour", - recipe = { - {"farming:rye", "farming:rye", "farming:rye"}, - {"farming:rye", "farming:mortar_pestle", ""} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) - --- Oats - -farming.register_plant("farming:oat", { - description = S("Oat seed"), - paramtype2 = "meshoptions", - inventory_image = "farming_oat_seed.png", - steps = 8, - place_param2 = 3 -}) - -minetest.override_item("farming:oat", { - description = S("Oats"), - groups = {food_oats = 1, flammable = 4} -}) - -minetest.override_item("farming:oat_1", {drop = {}}) -minetest.override_item("farming:oat_2", {drop = {}}) -minetest.override_item("farming:oat_3", {drop = {}}) - -minetest.register_craft({ - output = "farming:flour", - recipe = { - {"farming:oat", "farming:oat", "farming:oat"}, - {"farming:oat", "farming:mortar_pestle", ""} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) - --- Multigrain flour - -minetest.register_craftitem("farming:flour_multigrain", { - description = S("Multigrain Flour"), - inventory_image = "farming_flour_multigrain.png", - groups = {food_flour = 1, flammable = 1}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:flour_multigrain", - recipe = { - "farming:wheat", "farming:barley", "farming:oat", - "farming:rye", "farming:mortar_pestle" - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) - --- Multigrain bread - -minetest.register_craftitem("farming:bread_multigrain", { - description = S("Multigrain Bread"), - inventory_image = "farming_bread_multigrain.png", - on_use = minetest.item_eat(7), - groups = {food_bread = 1, flammable = 2} -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 15, - output = "farming:bread_multigrain", - recipe = "farming:flour_multigrain" -}) - --- Fuels - -minetest.register_craft({ - type = "fuel", - recipe = "farming:bread_multigrain", - burntime = 1 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:rye", - burntime = 1 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:oat", - burntime = 1 -}) diff --git a/mods/farming/crops/soy.lua b/mods/farming/crops/soy.lua index 97c71bef..194243cc 100644 --- a/mods/farming/crops/soy.lua +++ b/mods/farming/crops/soy.lua @@ -1,120 +1,26 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- soy pod minetest.register_craftitem("farming:soy_pod", { description = S("Soy Pod"), inventory_image = "farming_soy_pod.png", - groups = {seed = 2, food_soy = 1, food_soy_pod = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_soy = 1, food_soy_pod = 1, flammable = 2}, + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:soy_1") end }) -- replacement for soy beans that was removed + minetest.register_alias("farming:soy_beans", "farming:soy_pod") --- soy sauce -minetest.register_node("farming:soy_sauce", { - description = S("Soy Sauce"), - drawtype = "plantlike", - tiles = {"farming_soy_sauce.png"}, - inventory_image = "farming_soy_sauce.png", - wield_image = "farming_soy_sauce.png", - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} - }, - groups = { - vessel = 1, food_soy_sauce = 1, dig_immediate = 3, attached_node = 1 - }, - sounds = default.node_sound_glass_defaults() -}) - --- soy sauce recipe -minetest.register_craft( { - output = "farming:soy_sauce", - recipe = { - {"group:food_soy", "group:food_salt", "group:food_soy"}, - {"", "group:food_juicer", ""}, - {"", "bucket:bucket_water", "vessels:glass_bottle"} - }, - replacements = { - {"bucket:bucket_water", "bucket:bucket_empty"}, - {"group:food_juicer", "farming:juicer"} - } -}) - --- soy milk -minetest.register_node("farming:soy_milk", { - description = S("Soy Milk"), - drawtype = "plantlike", - tiles = {"farming_soy_milk_glass.png"}, - inventory_image = "farming_soy_milk_glass.png", - wield_image = "farming_soy_milk_glass.png", - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} - }, - on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = { - vessel = 1, food_milk_glass = 1, dig_immediate = 3, - attached_node = 1, drink = 1 - }, - sounds = default.node_sound_glass_defaults() -}) - -minetest.register_craft( { - output = "farming:soy_milk", - recipe = { - {"group:food_soy", "group:food_soy", "group:food_soy"}, - {"farming:vanilla_extract", "bucket:bucket_water", "vessels:drinking_glass"} - }, - replacements = { - {"bucket:bucket_water", "bucket:bucket_empty"}, - {"farming:vanilla_extract", "vessels:glass_bottle"} - } -}) - --- tofu -minetest.register_craftitem("farming:tofu", { - description = S("Tofu"), - inventory_image = "farming_tofu.png", - groups = {food_tofu = 1, food_meat_raw = 1, flammable = 2}, - on_use = minetest.item_eat(3) -}) - -minetest.register_craft({ - output = "farming:tofu", - recipe = { - {"farming:baking_tray", "group:food_soy", "group:food_soy"}, - {"group:food_soy", "group:food_soy", "group:food_soy"} - }, - replacements = {{"farming:baking_tray", "farming:baking_tray"}} -}) - --- cooked tofu -minetest.register_craftitem("farming:tofu_cooked", { - description = S("Cooked Tofu"), - inventory_image = "farming_tofu_cooked.png", - groups = {food_meat = 1, flammable = 2}, - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - type = "cooking", - output = "farming:tofu_cooked", - recipe = "farming:tofu", - cooktime = 5 -}) - -- crop definition local def = { + description = S("Soy") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_soy_1.png"}, paramtype = "light", @@ -127,28 +33,35 @@ local def = { drop = "", selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:soy_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_soy_2.png"} minetest.register_node("farming:soy_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_soy_3.png"} minetest.register_node("farming:soy_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_soy_4.png"} minetest.register_node("farming:soy_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_soy_5.png"} def.drop = { max_items = 1, items = { @@ -158,6 +71,7 @@ def.drop = { minetest.register_node("farming:soy_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_soy_6.png"} def.drop = { max_items = 3, items = { @@ -168,9 +82,11 @@ def.drop = { } minetest.register_node("farming:soy_6", table.copy(def)) --- stage 7 +-- stage 7 (final) + def.tiles = {"farming_soy_7.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { max_items = 5, items = { {items = {"farming:soy_pod"}, rarity = 1}, @@ -183,10 +99,33 @@ def.drop = { minetest.register_node("farming:soy_7", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:soy_pod"] = { - crop = "farming:soy_pod", + crop = "farming:soy", seed = "farming:soy_pod", minlight = farming.min_light, maxlight = farming.max_light, steps = 7 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", "default:dry_dirt_with_dry_grass", + "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.soy, + spread = {x = 100, y = 100, z = 100}, + seed = 809, + octaves = 3, + persist = 0.6 + }, + y_min = 20, y_max = 50, + decoration = "farming:soy_5" +}) diff --git a/mods/farming/crops/spinach.lua b/mods/farming/crops/spinach.lua new file mode 100644 index 00000000..56a8455d --- /dev/null +++ b/mods/farming/crops/spinach.lua @@ -0,0 +1,102 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:spinach", { + description = S("Spinach"), + inventory_image = "farming_spinach.png", + groups = {compostability = 48, seed = 2, food_spinach = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:spinach_1") + end +}) + +farming.add_eatable("farming:spinach", 1) + +-- crop definition + +local def = { + description = S("Spinach") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_spinach_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:spinach_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_spinach_2.png"} +minetest.register_node("farming:spinach_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_spinach_3.png"} +def.drop = { + items = { + {items = {"farming:spinach"}, rarity = 1}, + {items = {"farming:spinach"}, rarity = 3} + } +} +minetest.register_node("farming:spinach_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_spinach_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:spinach 2"}, rarity = 1}, + {items = {"farming:spinach 2"}, rarity = 2}, + {items = {"farming:spinach 2"}, rarity = 3} + } +} +minetest.register_node("farming:spinach_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:spinach"] = { + crop = "farming:spinach", + seed = "farming:spinach", + minlight = 7, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.spinach, + spread = {x = 100, y = 100, z = 100}, + seed = 910, + octaves = 3, + persist = 0.6 + }, + y_min = 1, y_max = 100, + decoration = "farming:spinach_4", + param2 = 3 +}) diff --git a/mods/farming/crops/strawberry.lua b/mods/farming/crops/strawberry.lua new file mode 100644 index 00000000..8c95ff5b --- /dev/null +++ b/mods/farming/crops/strawberry.lua @@ -0,0 +1,131 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem(":ethereal:strawberry", { + description = S("Strawberry"), + inventory_image = "ethereal_strawberry.png", + groups = {compostability = 48, seed = 2, food_strawberry = 1, food_berry = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "ethereal:strawberry_1") + end, +}) + +farming.add_eatable("ethereal:strawberry", 1) + +-- crop definition + +local def = { + description = S("Strawberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"ethereal_strawberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} + }, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +--stage 1 + +minetest.register_node(":ethereal:strawberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"ethereal_strawberry_2.png"} +minetest.register_node(":ethereal:strawberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"ethereal_strawberry_3.png"} +minetest.register_node(":ethereal:strawberry_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"ethereal_strawberry_4.png"} +minetest.register_node(":ethereal:strawberry_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"ethereal_strawberry_5.png"} +minetest.register_node(":ethereal:strawberry_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"ethereal_strawberry_6.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 2}, + {items = {"ethereal:strawberry 2"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"ethereal_strawberry_7.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 1}, + {items = {"ethereal:strawberry 2"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"ethereal_strawberry_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"ethereal:strawberry 2"}, rarity = 1}, + {items = {"ethereal:strawberry 3"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["ethereal:strawberry"] = { + crop = "ethereal:strawberry", + seed = "ethereal:strawberry", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.strawberry, + spread = {x = 100, y = 100, z = 100}, + seed = 143, + octaves = 3, + persist = 0.6 + }, + y_min = 15, y_max = 55, + decoration = "ethereal:strawberry_7" +}) diff --git a/mods/farming/crops/sunflower.lua b/mods/farming/crops/sunflower.lua index 1a450549..55e0fdb3 100644 --- a/mods/farming/crops/sunflower.lua +++ b/mods/farming/crops/sunflower.lua @@ -1,96 +1,57 @@ -local S = farming.intllib --- sunflower +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_sunflower", { + description = S("Sunflower Seeds"), + tiles = {"farming_sunflower_seeds.png"}, + inventory_image = "farming_sunflower_seeds.png", + wield_image = "farming_sunflower_seeds.png", + drawtype = "signlike", + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, growing = 1, + handy = 1, food_sunflower_seeds = 1, flammable = 2 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:sunflower_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_sunflower") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:sunflower_1", param2 = 1}) + end +}) + +minetest.register_alias("farming:sunflower_seeds", "farming:seed_sunflower") + +-- item + minetest.register_craftitem("farming:sunflower", { description = S("Sunflower"), inventory_image = "farming_sunflower.png", groups = {flammable = 2} }) --- sunflower seeds -minetest.register_craftitem("farming:seed_sunflower", { - description = S("Sunflower Seeds"), - inventory_image = "farming_sunflower_seeds.png", - groups = {seed = 2, food_sunflower_seeds = 1, flammable = 2}, - on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:sunflower_1") - end -}) - -minetest.register_alias("farming:sunflower_seeds", "farming:seed_sunflower") +-- turn item into seeds minetest.register_craft({ output = "farming:seed_sunflower 5", recipe = {{"farming:sunflower"}} }) --- sunflower seeds (toasted) -minetest.register_craftitem("farming:sunflower_seeds_toasted", { - description = S("Toasted Sunflower Seeds"), - inventory_image = "farming_sunflower_seeds_toasted.png", - groups = {food_sunflower_seeds_toasted = 1, flammable = 2}, - on_use = minetest.item_eat(1) -}) +-- crop definition -minetest.register_craft({ - type = "cooking", - cooktime = 10, - output = "farming:sunflower_seeds_toasted", - recipe = "farming:seed_sunflower" -}) - --- sunflower oil -minetest.register_node("farming:sunflower_oil", { - description = S("Bottle of Sunflower Oil"), - drawtype = "plantlike", - tiles = {"farming_sunflower_oil.png"}, - inventory_image = "farming_sunflower_oil.png", - wield_image = "farming_sunflower_oil.png", - paramtype = "light", - is_ground_content = false, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, - groups = { - food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1, - flammable = 2 - }, - sounds = default.node_sound_glass_defaults() -}) - -minetest.register_craft( { - output = "farming:sunflower_oil", - recipe = { - {"group:food_sunflower_seeds", "group:food_sunflower_seeds", "group:food_sunflower_seeds"}, - {"group:food_sunflower_seeds", "group:food_sunflower_seeds", "group:food_sunflower_seeds"}, - {"group:food_sunflower_seeds", "vessels:glass_bottle", "group:food_sunflower_seeds"} - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:sunflower_oil", - burntime = 30, - replacements = {{"farming:sunflower_oil", "vessels:glass_bottle"}} -}) - --- sunflower seed bread -minetest.register_craftitem("farming:sunflower_bread", { - description = S("Sunflower Seed Bread"), - inventory_image = "farming_sunflower_bread.png", - on_use = minetest.item_eat(8), - groups = {food_bread = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:sunflower_bread", - recipe = {{"group:food_sunflower_seeds_toasted", "group:food_bread", "group:food_sunflower_seeds_toasted"}} -}) - --- sunflower definition local def = { + description = S("Sunflower") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_sunflower_1.png"}, paramtype = "light", @@ -98,45 +59,57 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:sunflower_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_sunflower_2.png"} minetest.register_node("farming:sunflower_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_sunflower_3.png"} minetest.register_node("farming:sunflower_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_sunflower_4.png"} minetest.register_node("farming:sunflower_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_sunflower_5.png"} minetest.register_node("farming:sunflower_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_sunflower_6.png"} def.visual_scale = 1.9 minetest.register_node("farming:sunflower_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_sunflower_7.png"} minetest.register_node("farming:sunflower_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_sunflower_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:sunflower"}, rarity = 1}, @@ -146,6 +119,7 @@ def.drop = { minetest.register_node("farming:sunflower_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:sunflower"] = { crop = "farming:sunflower", seed = "farming:seed_sunflower", @@ -153,3 +127,23 @@ farming.registered_plants["farming:sunflower"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.sunflower, + spread = {x = 100, y = 100, z = 100}, + seed = 254, + octaves = 3, + persist = 0.6 + }, + y_min = 10, y_max = 40, + decoration = "farming:sunflower_8" +}) diff --git a/mods/farming/crops/tomato.lua b/mods/farming/crops/tomato.lua index 6eff7c63..a53b8bf5 100644 --- a/mods/farming/crops/tomato.lua +++ b/mods/farming/crops/tomato.lua @@ -4,38 +4,27 @@ http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1288375-food-plus-mod-more-food-than-you-can-imagine-v2-9) ]] -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- item/seed --- tomato minetest.register_craftitem("farming:tomato", { description = S("Tomato"), inventory_image = "farming_tomato.png", - groups = {seed = 2, food_tomato = 1, flammable = 2}, + groups = {compostability = 45, seed = 2, food_tomato = 1}, + on_use = minetest.item_eat(4), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:tomato_1") - end, - on_use = minetest.item_eat(4) + end }) --- tomato soup -minetest.register_craftitem("farming:tomato_soup", { - description = S("Tomato Soup"), - inventory_image = "farming_tomato_soup.png", - groups = {flammable = 2}, - on_use = minetest.item_eat(8, "farming:bowl") -}) +farming.add_eatable("farming:tomato", 4) -minetest.register_craft({ - output = "farming:tomato_soup", - recipe = { - {"group:food_tomato"}, - {"group:food_tomato"}, - {"group:food_bowl"} - } -}) +-- crop definition --- tomato definition local def = { + description = S("Tomato") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_tomato_1.png"}, paramtype = "light", @@ -43,38 +32,48 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:tomato_1", table.copy(def)) -- stage2 + def.tiles = {"farming_tomato_2.png"} minetest.register_node("farming:tomato_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_tomato_3.png"} minetest.register_node("farming:tomato_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_tomato_4.png"} minetest.register_node("farming:tomato_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_tomato_5.png"} minetest.register_node("farming:tomato_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_tomato_6.png"} minetest.register_node("farming:tomato_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_tomato_7.png"} def.drop = { items = { @@ -85,8 +84,10 @@ def.drop = { minetest.register_node("farming:tomato_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_tomato_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:tomato 3"}, rarity = 1}, @@ -97,6 +98,7 @@ def.drop = { minetest.register_node("farming:tomato_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:tomato"] = { crop = "farming:tomato", seed = "farming:tomato", @@ -104,3 +106,23 @@ farming.registered_plants["farming:tomato"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.tomato, + spread = {x = 100, y = 100, z = 100}, + seed = 365, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 25, + decoration = "farming:tomato_7" +}) diff --git a/mods/farming/crops/vanilla.lua b/mods/farming/crops/vanilla.lua index f014a8d1..d07680cc 100644 --- a/mods/farming/crops/vanilla.lua +++ b/mods/farming/crops/vanilla.lua @@ -1,18 +1,25 @@ -local S = farming.intllib --- vanilla +local S = minetest.get_translator("farming") + +-- item/seed + minetest.register_craftitem("farming:vanilla", { description = S("Vanilla"), inventory_image = "farming_vanilla.png", - groups = {seed = 2, food_vanilla = 1, flammable = 2}, + groups = {compostability = 48, seed = 2, food_vanilla = 1}, + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:vanilla_1") - end, - on_use = minetest.item_eat(1) + end }) +farming.add_eatable("farming:vanilla", 1) + -- crop definition + local def = { + description = S("Vanilla") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_vanilla_1.png"}, paramtype = "light", @@ -20,75 +27,49 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { - snappy = 3, flammable = 2, plant = 1, attached_node = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } --- vanilla extract -minetest.register_node("farming:vanilla_extract", { - description = S("Vanilla Extract"), - drawtype = "plantlike", - tiles = {"farming_vanilla_extract.png"}, - inventory_image = "farming_vanilla_extract.png", - wield_image = "farming_vanilla_extract.png", - paramtype = "light", - is_ground_content = false, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, - groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_craft( { - output = "farming:vanilla_extract", - recipe = { - {"group:food_vanilla", "group:food_vanilla", "group:food_vanilla"}, - {"group:food_vanilla", "farming:bottle_ethanol", "group:food_water_glass"}, - }, - replacements = { - {"group:food_water_glass", "vessels:drinking_glass"} - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:vanilla_extract", - burntime = 25, - replacements = {{"farming:vanilla_extract", "vessels:glass_bottle"}} -}) - -- stage 1 + minetest.register_node("farming:vanilla_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_vanilla_2.png"} minetest.register_node("farming:vanilla_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_vanilla_3.png"} minetest.register_node("farming:vanilla_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_vanilla_4.png"} minetest.register_node("farming:vanilla_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_vanilla_5.png"} minetest.register_node("farming:vanilla_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_vanilla_6.png"} def.visual_scale = 1.9 minetest.register_node("farming:vanilla_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_vanilla_7.png"} def.drop = { items = { @@ -100,8 +81,10 @@ def.drop = { minetest.register_node("farming:vanilla_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_vanilla_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:vanilla 2"}, rarity = 1}, @@ -113,6 +96,7 @@ def.drop = { minetest.register_node("farming:vanilla_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:vanilla"] = { crop = "farming:vanilla", seed = "farming:vanilla", @@ -120,3 +104,23 @@ farming.registered_plants["farming:vanilla"] = { maxlight = farming.max_light, steps = 8 } + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:grove_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.vanilla, + spread = {x = 100, y = 100, z = 100}, + seed = 476, + octaves = 3, + persist = 0.6 + }, + y_min = 5, y_max = 35, + decoration = "farming:vanilla_7" +}) diff --git a/mods/farming/crops/wheat.lua b/mods/farming/crops/wheat.lua index 1a7de8ac..c00208b1 100644 --- a/mods/farming/crops/wheat.lua +++ b/mods/farming/crops/wheat.lua @@ -1,154 +1,47 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- seed --- wheat seeds minetest.register_node("farming:seed_wheat", { description = S("Wheat Seed"), tiles = {"farming_wheat_seed.png"}, inventory_image = "farming_wheat_seed.png", wield_image = "farming_wheat_seed.png", drawtype = "signlike", - groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 4}, + groups = { + handy = 1, seed = 1, snappy = 3, attached_node = 1, flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, paramtype = "light", paramtype2 = "wallmounted", walkable = false, sunlight_propagates = true, selection_box = farming.select, + next_plant = "farming:wheat_1", + on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, pointed_thing, "farming:wheat_1") + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_wheat") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:wheat_1", param2 = 3}) end }) --- harvested wheat +-- item + minetest.register_craftitem("farming:wheat", { description = S("Wheat"), inventory_image = "farming_wheat.png", groups = {food_wheat = 1, flammable = 4} }) --- straw -minetest.register_node("farming:straw", { - description = S("Straw"), - tiles = {"farming_straw.png"}, - is_ground_content = false, - groups = {snappy = 3, flammable = 4, fall_damage_add_percent = -30}, - sounds = default.node_sound_leaves_defaults() -}) +-- crop definition -minetest.register_craft({ - output = "farming:straw 3", - recipe = { - {"farming:wheat", "farming:wheat", "farming:wheat"}, - {"farming:wheat", "farming:wheat", "farming:wheat"}, - {"farming:wheat", "farming:wheat", "farming:wheat"} - } -}) - -minetest.register_craft({ - output = "farming:wheat 3", - recipe = {{"farming:straw"}} -}) - --- check and register stairs -if minetest.global_exists("stairs") then - - if stairs.mod and stairs.mod == "redo" then - - stairs.register_all("straw", "farming:straw", - {snappy = 3, flammable = 4}, - {"farming_straw.png"}, - "Straw", - default.node_sound_leaves_defaults()) - else - - stairs.register_stair_and_slab("straw", "farming:straw", - {snappy = 3, flammable = 4}, - {"farming_straw.png"}, - "Straw Stair", - "Straw Slab", - default.node_sound_leaves_defaults()) - end -end - --- flour -minetest.register_craftitem("farming:flour", { - description = S("Flour"), - inventory_image = "farming_flour.png", - groups = {food_flour = 1, flammable = 1} -}) - -minetest.register_craft({ - output = "farming:flour", - recipe = { - {"farming:wheat", "farming:wheat", "farming:wheat"}, - {"farming:wheat", "farming:mortar_pestle", ""} - }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} -}) - --- bread -minetest.register_craftitem("farming:bread", { - description = S("Bread"), - inventory_image = "farming_bread.png", - on_use = minetest.item_eat(5), - groups = {food_bread = 1, flammable = 2} -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 15, - output = "farming:bread", - recipe = "farming:flour" -}) - --- sliced bread -minetest.register_craftitem("farming:bread_slice", { - description = S("Sliced Bread"), - inventory_image = "farming_bread_slice.png", - on_use = minetest.item_eat(1), - groups = {food_bread_slice = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:bread_slice 5", - recipe = {{"group:food_cutting_board", "farming:bread"}}, - replacements = {{"group:food_cutting_board", "farming:cutting_board"}} -}) - --- toast -minetest.register_craftitem("farming:toast", { - description = S("Toast"), - inventory_image = "farming_toast.png", - on_use = minetest.item_eat(1), - groups = {food_toast = 1, flammable = 2} -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 3, - output = "farming:toast", - recipe = "farming:bread_slice" -}) - --- toast sandwich -minetest.register_craftitem("farming:toast_sandwich", { - description = S("Toast Sandwich"), - inventory_image = "farming_toast_sandwich.png", - on_use = minetest.item_eat(4), - groups = {flammable = 2} -}) - -minetest.register_craft({ - output = "farming:toast_sandwich", - recipe = { - {"farming:bread_slice"}, - {"farming:toast"}, - {"farming:bread_slice"} - } -}) - --- wheat definition local def = { + description = S("Wheat") .. S(" Crop"), drawtype = "plantlike", tiles = {"farming_wheat_1.png"}, paramtype = "light", @@ -158,30 +51,38 @@ local def = { walkable = false, buildable_to = true, drop = "", + waving = 1, selection_box = farming.select, groups = { snappy = 3, flammable = 4, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() } -- stage 1 + minetest.register_node("farming:wheat_1", table.copy(def)) -- stage 2 + def.tiles = {"farming_wheat_2.png"} minetest.register_node("farming:wheat_2", table.copy(def)) -- stage 3 + def.tiles = {"farming_wheat_3.png"} minetest.register_node("farming:wheat_3", table.copy(def)) -- stage 4 + def.tiles = {"farming_wheat_4.png"} minetest.register_node("farming:wheat_4", table.copy(def)) -- stage 5 + def.tiles = {"farming_wheat_5.png"} def.drop = { items = { @@ -192,6 +93,7 @@ def.drop = { minetest.register_node("farming:wheat_5", table.copy(def)) -- stage 6 + def.tiles = {"farming_wheat_6.png"} def.drop = { items = { @@ -202,6 +104,7 @@ def.drop = { minetest.register_node("farming:wheat_6", table.copy(def)) -- stage 7 + def.tiles = {"farming_wheat_7.png"} def.drop = { items = { @@ -214,8 +117,10 @@ def.drop = { minetest.register_node("farming:wheat_7", table.copy(def)) -- stage 8 (final) + def.tiles = {"farming_wheat_8.png"} def.groups.growing = nil +def.selection_box = farming.select_final def.drop = { items = { {items = {"farming:wheat"}, rarity = 1}, @@ -227,6 +132,7 @@ def.drop = { minetest.register_node("farming:wheat_8", table.copy(def)) -- add to registered_plants + farming.registered_plants["farming:wheat"] = { crop = "farming:wheat", seed = "farming:seed_wheat", @@ -234,16 +140,3 @@ farming.registered_plants["farming:wheat"] = { maxlight = farming.max_light, steps = 8 } - --- fuels -minetest.register_craft({ - type = "fuel", - recipe = "farming:straw", - burntime = 3 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:wheat", - burntime = 1 -}) diff --git a/mods/farming/depends.txt b/mods/farming/depends.txt deleted file mode 100644 index 650885b5..00000000 --- a/mods/farming/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -stairs? -intllib? -lucky_block? -toolranks? diff --git a/mods/farming/description.txt b/mods/farming/description.txt deleted file mode 100644 index 58bdc810..00000000 --- a/mods/farming/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds many plants and food to Minetest \ No newline at end of file diff --git a/mods/farming/farming.conf_example b/mods/farming/farming.conf_example index 7f103cd6..d22ba2e9 100644 --- a/mods/farming/farming.conf_example +++ b/mods/farming/farming.conf_example @@ -6,44 +6,47 @@ --]] -- true to enable crop/food in-game and on mapgen set spawn rarety -farming.carrot = 0.001 -farming.potato = 0.001 -farming.tomato = 0.001 -farming.cucumber = 0.001 -farming.corn = 0.001 -farming.coffee = 0.001 -farming.melon = 0.001 -farming.pumpkin = 0.001 +farming.asparagus = 0.002 +farming.eggplant = 0.002 +farming.spinach = 0.002 +farming.carrot = 0.002 +farming.potato = 0.002 +farming.tomato = 0.002 +farming.cucumber = 0.002 +farming.corn = 0.002 +farming.coffee = 0.002 +farming.melon = 0.009 +farming.pumpkin = 0.009 farming.cocoa = true -- true or false only -farming.raspberry = 0.001 -farming.blueberry = 0.001 -farming.rhubarb = 0.001 -farming.beans = 0.001 -farming.grapes = 0.001 +farming.raspberry = 0.002 +farming.blueberry = 0.002 +farming.rhubarb = 0.002 +farming.beans = 0.002 +farming.grapes = 0.002 farming.barley = true -- true or false only farming.chili = 0.003 farming.hemp = 0.003 -farming.garlic = 0.001 -farming.onion = 0.001 +farming.garlic = 0.002 +farming.onion = 0.002 farming.pepper = 0.002 -farming.pineapple = 0.001 -farming.peas = 0.001 -farming.beetroot = 0.001 +farming.pineapple = 0.003 +farming.peas = 0.002 +farming.beetroot = 0.002 farming.mint = 0.005 -farming.cabbage = 0.001 +farming.cabbage = 0.002 farming.blackberry = 0.002 -farming.lettuce = 0.001 -farming.soy = 0.001 -farming.vanilla = 0.001 -farming.artichoke = 0.001 +farming.lettuce = 0.002 +farming.soy = 0.002 +farming.vanilla = 0.002 +farming.artichoke = 0.002 farming.parsley = 0.002 -farming.sunflower = 0.001 +farming.sunflower = 0.002 +farming.ginger = 0.002 +farming.cotton = 0.003 +farming.strawberry = 0.002 farming.grains = true -- true or false only farming.rice = true --- default rarety of crops on map (higher number = more crops) -farming.rarety = 0.002 - -- default minimum and maximum light levels crops need to grow farming.min_light = 12 farming.max_light = 15 diff --git a/mods/farming/food.lua b/mods/farming/food.lua deleted file mode 100644 index 86656257..00000000 --- a/mods/farming/food.lua +++ /dev/null @@ -1,689 +0,0 @@ - -local S = farming.intllib - ---= filter sea water into river water -minetest.register_craft({ - output = "bucket:bucket_river_water", - recipe = { - {"farming:hemp_fibre"}, - {"farming:hemp_fibre"}, - {"bucket:bucket_water"} - } -}) - ---= glass of water - -minetest.register_craftitem("farming:glass_water", { - description = S("Glass of Water"), - inventory_image = "farming_water_glass.png", - groups = {food_water_glass = 1, flammable = 3, vessel = 1} -}) - -minetest.register_craft({ - output = "farming:glass_water 4", - recipe = { - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"bucket:bucket_river_water", ""} - }, - replacements = {{"bucket:bucket_river_water", "bucket:bucket_empty"}} -}) - -minetest.register_craft({ - output = "farming:glass_water 4", - recipe = { - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"bucket:bucket_water", "farming:hemp_fibre"} - }, - replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}} -}) - -if minetest.get_modpath("bucket_wooden") then - - minetest.register_craft({ - output = "farming:glass_water 4", - recipe = { - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"vessels:drinking_glass", "vessels:drinking_glass"}, - {"group:water_bucket_wooden", "farming:hemp_fibre"} - }, - replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} - }) -end - ---= Sugar - -minetest.register_craftitem("farming:sugar", { - description = S("Sugar"), - inventory_image = "farming_sugar.png", - groups = {food_sugar = 1, flammable = 3} -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 3, - output = "farming:sugar 2", - recipe = "default:papyrus" -}) - ---= Sugar caramel - -minetest.register_craftitem("farming:caramel", { - description = S("Caramel"), - inventory_image = "farming_caramel.png", -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 6, - output = "farming:caramel", - recipe = "group:food_sugar", -}) - ---= Salt - -minetest.register_node("farming:salt", { - description = S("Salt"), - inventory_image = "farming_salt.png", - wield_image = "farming_salt.png", - drawtype = "plantlike", - visual_scale = 0.8, - paramtype = "light", - tiles = {"farming_salt.png"}, - groups = {food_salt = 1, vessel = 1, dig_immediate = 3, - attached_node = 1}, - sounds = default.node_sound_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, - -- special function to make salt crystals form inside water - dropped_step = function(self, pos, dtime) - - self.ctimer = (self.ctimer or 0) + dtime - if self.ctimer < 15.0 then return end - self.ctimer = 0 - - local needed - - if self.node_inside - and self.node_inside.name == "default:water_source" then - needed = 8 - - elseif self.node_inside - and self.node_inside.name == "default:river_water_source" then - needed = 9 - end - - if not needed then return end - - local objs = core.get_objects_inside_radius(pos, 0.5) - - if not objs or #objs ~= 1 then return end - - local salt, ent = nil, nil - - for k, obj in pairs(objs) do - - ent = obj:get_luaentity() - - if ent and ent.name == "__builtin:item" - and ent.itemstring == "farming:salt " .. needed then - - obj:remove() - - core.add_item(pos, "farming:salt_crystal") - - return false -- return with no further action - end - end - end -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 15, - output = "farming:salt", - recipe = "bucket:bucket_water", - replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}} -}) - ---= Salt Crystal - -minetest.register_node("farming:salt_crystal", { - description = ("Salt crystal"), - inventory_image = "farming_salt_crystal.png", - wield_image = "farming_salt_crystal.png", - drawtype = "plantlike", - visual_scale = 0.8, - paramtype = "light", - light_source = 1, - tiles = {"farming_salt_crystal.png"}, - groups = { dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, -}) -minetest.register_craft({ - output = "farming:salt 9", - recipe = { - {"farming:salt_crystal", "farming:mortar_pestle"} - }, - replacements = {{"farming:mortar_pestle", "farming:mortar_pestle"}} -}) - -minetest.register_craft({ - output = "farming:salt_crystal", - recipe = { - {"farming:salt", "farming:salt", "farming:salt"}, - {"farming:salt", "farming:salt", "farming:salt"}, - {"farming:salt", "farming:salt", "farming:salt"} - } -}) - ---= Rose Water - -minetest.register_node("farming:rose_water", { - description = S("Rose Water"), - inventory_image = "farming_rose_water.png", - wield_image = "farming_rose_water.png", - drawtype = "plantlike", - visual_scale = 0.8, - paramtype = "light", - tiles = {"farming_rose_water.png"}, - groups = {food_rose_water = 1, vessel = 1, dig_immediate = 3, - attached_node = 1}, - sounds = default.node_sound_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - } -}) - -minetest.register_craft({ - output = "farming:rose_water", - recipe = { - {"flowers:rose", "flowers:rose", "flowers:rose"}, - {"flowers:rose", "flowers:rose", "flowers:rose"}, - {"group:food_water_glass", "group:food_pot", "vessels:glass_bottle"} - }, - replacements = { - {"group:food_water_glass", "vessels:drinking_glass"}, - {"group:food_pot", "farming:pot"} - } -}) - ---= Turkish Delight - -minetest.register_craftitem("farming:turkish_delight", { - description = S("Turkish Delight"), - inventory_image = "farming_turkish_delight.png", - groups = {flammable = 3}, - on_use = minetest.item_eat(2) -}) - -minetest.register_craft({ - output = "farming:turkish_delight 4", - recipe = { - {"group:food_gelatin", "group:food_sugar", "group:food_gelatin"}, - {"group:food_sugar", "group:food_rose_water", "group:food_sugar"}, - {"group:food_sugar", "dye:pink", "group:food_sugar"} - }, - replacements = { - {"group:food_cornstarch", "farming:bowl"}, - {"group:food_rose_water", "vessels:glass_bottle"} - } -}) - ---= Garlic Bread - -minetest.register_craftitem("farming:garlic_bread", { - description = S("Garlic Bread"), - inventory_image = "farming_garlic_bread.png", - groups = {flammable = 3}, - on_use = minetest.item_eat(2) -}) - -minetest.register_craft({ - output = "farming:garlic_bread", - recipe = { - {"group:food_toast", "group:food_garlic_clove", "group:food_garlic_clove"} - } -}) - ---= Donuts (thanks to Bockwurst for making the donut images) - -minetest.register_craftitem("farming:donut", { - description = S("Donut"), - inventory_image = "farming_donut.png", - on_use = minetest.item_eat(4) -}) - -minetest.register_craft({ - output = "farming:donut 3", - recipe = { - {"", "group:food_wheat", ""}, - {"group:food_wheat", "group:food_sugar", "group:food_wheat"}, - {"", "group:food_wheat", ""} - } -}) - -minetest.register_craftitem("farming:donut_chocolate", { - description = S("Chocolate Donut"), - inventory_image = "farming_donut_chocolate.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:donut_chocolate", - recipe = { - {"group:food_cocoa"}, - {"farming:donut"} - } -}) - -minetest.register_craftitem("farming:donut_apple", { - description = S("Apple Donut"), - inventory_image = "farming_donut_apple.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:donut_apple", - recipe = { - {"default:apple"}, - {"farming:donut"} - } -}) - ---= Porridge Oats - -minetest.register_craftitem("farming:porridge", { - description = S("Porridge"), - inventory_image = "farming_porridge.png", - on_use = minetest.item_eat(6, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:porridge", - recipe = { - {"group:food_oats", "group:food_oats", "group:food_oats"}, - {"group:food_oats", "group:food_bowl", "group:food_milk_glass"} - }, - replacements = { - {"mobs:glass_milk", "vessels:drinking_glass"}, - {"farming:soy_milk", "vessels:drinking_glass"} - } -}) - ---= Jaffa Cake - -minetest.register_craftitem("farming:jaffa_cake", { - description = S("Jaffa Cake"), - inventory_image = "farming_jaffa_cake.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:jaffa_cake", - recipe = { - {"farming:baking_tray", "group:food_egg", "group:food_sugar"}, - {"group:food_flour", "group:food_cocoa", "group:food_orange"}, - {"group:food_milk", "", ""} - }, - replacements = { - {"farming:baking_tray", "farming:baking_tray"}, - {"mobs:bucket_milk", "bucket:bucket_empty"}, - {"farming:soy_milk", "vessels:drining_glass"} - } -}) - --- Apple Pie - -minetest.register_craftitem("farming:apple_pie", { - description = S("Apple Pie"), - inventory_image = "farming_apple_pie.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:apple_pie", - recipe = { - {"group:food_flour", "group:food_sugar", "group:food_apple"}, - {"", "group:food_baking_tray", ""} - }, - replacements = {{"group:food_baking_tray", "farming:baking_tray"}} -}) - --- Cactus Juice - -minetest.register_craftitem("farming:cactus_juice", { - description = S("Cactus Juice"), - inventory_image = "farming_cactus_juice.png", - groups = {vessel = 1, drink = 1}, - on_use = function(itemstack, user, pointed_thing) - if user then - if math.random(5) == 1 then - return minetest.do_item_eat(-1, "vessels:drinking_glass", - itemstack, user, pointed_thing) - else - return minetest.do_item_eat(2, "vessels:drinking_glass", - itemstack, user, pointed_thing) - end - end - end -}) - -minetest.register_craft({ - output = "farming:cactus_juice", - recipe = { - {"default:cactus"}, - {"farming:juicer"}, - {"vessels:drinking_glass"} - }, - replacements = { - {"group:food_juicer", "farming:juicer"} - } -}) - --- Pasta - -minetest.register_craftitem("farming:pasta", { - description = S("Pasta"), - inventory_image = "farming_pasta.png", - groups = {food_pasta = 1} -}) - -minetest.register_craft({ - output = "farming:pasta", - recipe = { - {"group:food_flour", "group:food_butter", "group:food_mixing_bowl"} - }, - replacements = {{"group:food_mixing_bowl", "farming:mixing_bowl"}} -}) - -minetest.register_craft({ - output = "farming:pasta", - recipe = { - {"group:food_flour", "group:food_oil", "group:food_mixing_bowl"} - }, - replacements = { - {"group:food_mixing_bowl", "farming:mixing_bowl"}, - {"group:food_oil", "vessels:glass_bottle"} - } -}) - --- Spaghetti - -minetest.register_craftitem("farming:spaghetti", { - description = S("Spaghetti"), - inventory_image = "farming_spaghetti.png", - on_use = minetest.item_eat(8) -}) - -minetest.register_craft({ - output = "farming:spaghetti", - recipe = { - {"group:food_pasta", "group:food_saucepan", "group:food_tomato"}, - {"group:food_garlic_clove", "group:food_garlic_clove", ""} - }, - replacements = {{"group:food_saucepan", "farming:saucepan"}} -}) - --- Korean Bibimbap - -minetest.register_craftitem("farming:bibimbap", { - description = S("Bibimbap"), - inventory_image = "farming_bibimbap.png", - on_use = minetest.item_eat(8, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:bibimbap", - recipe = { - {"group:food_skillet", "group:food_bowl", "group:food_egg"}, - {"group:food_rice", "group:food_chicken_raw", "group:food_cabbage"}, - {"group:food_carrot", "group:food_chili_pepper", ""} - }, - replacements = {{"group:food_skillet", "farming:skillet"}} -}) - -minetest.register_craft({ - output = "farming:bibimbap", - type = "shapeless", - recipe = { - "group:food_skillet", "group:food_bowl", "group:food_mushroom", - "group:food_rice", "group:food_cabbage", "group:food_carrot", - "group:food_mushroom", "group:food_chili_pepper" - }, - replacements = {{"group:food_skillet", "farming:skillet"}} -}) - --- Burger - -minetest.register_craftitem("farming:burger", { - description = S("Burger"), - inventory_image = "farming_burger.png", - on_use = minetest.item_eat(16), -}) - -minetest.register_craft({ - output = "farming:burger", - recipe = { - {"farming:bread", "group:food_meat", "group:food_cheese"}, - {"group:food_tomato", "group:food_cucumber", "group:food_onion"}, - {"group:food_lettuce", "", ""} - } -}) - --- Salad - -minetest.register_craftitem("farming:salad", { - description = S("Salad"), - inventory_image = "farming_salad.png", - on_use = minetest.item_eat(8, "farming:bowl") -}) - -minetest.register_craft({ - output = "farming:salad", - type = "shapeless", - recipe = { - "group:food_bowl", "group:food_tomato", "group:food_cucumber", - "group:food_lettuce", "group:food_oil" - } -}) - --- Triple Berry Smoothie - -minetest.register_craftitem("farming:smoothie_berry", { - description = S("Triple Berry Smoothie"), - inventory_image = "farming_berry_smoothie.png", - on_use = minetest.item_eat(6, "vessels:drinking_glass"), - groups = {vessel = 1, drink = 1} -}) - -minetest.register_craft({ - output = "farming:smoothie_berry", - type = "shapeless", - recipe = { - "group:food_raspberries", "group:food_blackberries", - "group:food_strawberry", "group:food_banana", - "vessels:drinking_glass" - } -}) - --- Patatas a la importancia - -minetest.register_craftitem("farming:spanish_potatoes", { - description = S("Spanish Potatoes"), - inventory_image = "farming_spanish_potatoes.png", - on_use = minetest.item_eat(8, "farming:bowl"), -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:spanish_potatoes", - recipe = { - "farming:potato", "group:food_parsley", "farming:potato", - "group:food_egg", "group:food_flour", "farming:onion", - "farming:garlic_clove", "group:food_bowl", "group:food_skillet" - }, - replacements = {{"group:food_skillet", "farming:skillet"}} -}) - --- Potato omelet - -minetest.register_craftitem("farming:potato_omelet", { - description = S("Potato omelet"), - inventory_image = "farming_potato_omelet.png", - on_use = minetest.item_eat(6, "farming:bowl") -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:potato_omelet", - recipe = { - "group:food_egg", "farming:potato", "group:food_onion", - "group:food_skillet", "group:food_bowl"}, - replacements = {{"group:food_skillet", "farming:skillet"}} -}) - --- Paella - -minetest.register_craftitem("farming:paella", { - description = S("Paella"), - inventory_image = "farming_paella.png", - on_use = minetest.item_eat(8, "farming:bowl") -}) - -minetest.register_craft({ - type = "shapeless", - output = "farming:paella", - recipe = { - "group:food_rice", "dye:orange", "farming:pepper_red", - "group:food_peas", "group:food_chicken", "group:food_bowl", "group:food_skillet" - }, - replacements = {{"group:food_skillet", "farming:skillet"}} -}) - --- Flan - -minetest.register_craftitem("farming:flan", { - description = S("Vanilla Flan"), - inventory_image = "farming_vanilla_flan.png", - on_use = minetest.item_eat(6) -}) - -minetest.register_craft({ - output = "farming:flan", - recipe = { - {"group:food_sugar", "group:food_milk", "farming:caramel"}, - {"group:food_egg", "group:food_egg", "farming:vanilla_extract"} - }, - replacements = { - {"cucina_vegana:soy_milk", "vessels:drinking_glass"}, - {"group:food_milk", "bucket:bucket_empty"}, - {"farming:vanilla_extract", "vessels:glass_bottle"} - } -}) - --- Vegan Cheese - -minetest.register_craftitem("farming:cheese_vegan", { - description = S("Vegan Cheese"), - inventory_image = "farming_cheese_vegan.png", - on_use = minetest.item_eat(2), - groups = {food_cheese = 1, flammable = 2} -}) - - -minetest.register_craft({ - output = "farming:cheese_vegan", - recipe = { - {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, - {"group:food_salt", "group:food_peppercorn", "farming:bottle_ethanol"}, - {"group:food_gelatin", "group:food_pot", ""} - }, - replacements = { - {"farming:soy_milk", "vessels:drinking_glass 3"}, - {"farming:pot", "farming:pot"}, - {"farming:bottle_ethanol", "vessels:glass_bottle"} - } -}) - -minetest.register_craft({ - output = "farming:cheese_vegan", - recipe = { - {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, - {"group:food_salt", "group:food_peppercorn", "group:food_lemon"}, - {"group:food_gelatin", "group:food_pot", ""} - }, - replacements = { - {"farming:soy_milk", "vessels:drinking_glass 3"}, - {"farming:pot", "farming:pot"} - } -}) - --- Onigiri - -minetest.register_craftitem("farming:onigiri", { - description = S("Onirigi"), - inventory_image = "farming_onigiri.png", - on_use = minetest.item_eat(2), - groups = {flammable = 2} -}) - -minetest.register_craft({ - output = "farming:onigiri", - recipe = { - {"group:food_rice", "group:food_salt", "group:food_rice"}, - {"", "group:food_seaweed", ""} - } -}) - --- Gyoza - -minetest.register_craftitem("farming:gyoza", { - description = S("Gyoza"), - inventory_image = "farming_gyoza.png", - on_use = minetest.item_eat(4), - groups = {flammable = 2} -}) - -minetest.register_craft({ - output = "farming:gyoza 4", - recipe = { - {"group:food_cabbage", "group:food_garlic_clove", "group:food_onion"}, - {"group:food_meat_raw", "group:food_salt", "group:food_flour"}, - {"", "group:food_skillet", ""} - - }, - replacements = { - {"group:food_skillet", "farming:skillet"} - } -}) - --- Mochi - -minetest.register_craftitem("farming:mochi", { - description = S("Mochi"), - inventory_image = "farming_mochi.png", - on_use = minetest.item_eat(3), - groups = {flammable = 2} -}) - -minetest.register_craft({ - output = "farming:mochi", - recipe = { - {"group:food_rice", "group:food_sugar", "group:food_rice"}, - {"", "group:food_mortar_pestle", ""}, - {"", "farming:glass_water", ""} - }, - replacements = { - {"group:food_mortar_pestle", "farming:mortar_pestle"}, - {"farming:glass_water", "vessels:drinking_glass"} - } -}) diff --git a/mods/farming/grass.lua b/mods/farming/grass.lua index a52ace94..2e607c2a 100644 --- a/mods/farming/grass.lua +++ b/mods/farming/grass.lua @@ -1,46 +1,76 @@ -for i = 4, 5 do +-- Override grass to drop wheat and oat seeds - -- Override default grass and have it drop Wheat and Oat Seeds +local rarity_lookup = {[1] = 50, [2] = 50, [3] = 50, [4] = 5, [5] = 5} - minetest.override_item("default:grass_" .. i, { - drop = { - max_items = 1, - items = { - {items = {"farming:seed_wheat"}, rarity = 5}, - {items = {"farming:seed_oat"},rarity = 5}, - {items = {"default:grass_1"}} +if minetest.registered_nodes["default:grass_1"] then + + for i = 1, 5 do + + minetest.override_item("default:grass_" .. i, { + drop = { + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = rarity_lookup[i]}, + {items = {"farming:seed_oat"},rarity = rarity_lookup[i]}, + {items = {"default:grass_1"}} + } } - } - }) + }) + end +end - -- Override default dry grass and have it drop Barley and Rye Seeds +-- override dry grass to drop barley and rye seeds - if minetest.registered_nodes["default:dry_grass_1"] then +if minetest.registered_nodes["default:dry_grass_1"] then + + for i = 1, 5 do minetest.override_item("default:dry_grass_" .. i, { drop = { max_items = 1, items = { - {items = {"farming:seed_barley"}, rarity = 5}, - {items = {"farming:seed_rye"},rarity = 5}, + {items = {"farming:seed_barley"}, rarity = rarity_lookup[i]}, + {items = {"farming:seed_rye"}, rarity = rarity_lookup[i]}, {items = {"default:dry_grass_1"}} } } }) end - end --- Override default Jungle Grass and have it drop Cotton and Rice Seeds +-- override jungle grass to drop cotton and rice seeds -minetest.override_item("default:junglegrass", { - drop = { - max_items = 1, - items = { - {items = {"farming:seed_cotton"}, rarity = 8}, - {items = {"farming:rice"},rarity = 8}, - {items = {"default:junglegrass"}} +if minetest.registered_nodes["default:junglegrass"] then + + minetest.override_item("default:junglegrass", { + drop = { + max_items = 1, + items = { + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"farming:seed_rice"}, rarity = 8}, + {items = {"default:junglegrass"}} + } } - } -}) + }) +end + +-- override mineclone tallgrass to drop all sof the above seeds + +if farming.mcl then + + minetest.override_item("mcl_flowers:tallgrass", { + drop = { + max_items = 1, + items = { + {items = {"mcl_farming:wheat_seeds"}, rarity = 5}, + {items = {"farming:seed_oat"},rarity = 5}, + {items = {"farming:seed_barley"}, rarity = 5}, + {items = {"farming:seed_rye"},rarity = 5}, + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"farming:seed_rice"},rarity = 8} + } + } + }) +end + diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua index 9340d55c..e6865754 100644 --- a/mods/farming/hoes.lua +++ b/mods/farming/hoes.lua @@ -1,28 +1,22 @@ -local S = farming.intllib -local tr = minetest.get_modpath("toolranks") +-- translation and mod check + +local S = minetest.get_translator("farming") +local mod_tr = minetest.get_modpath("toolranks") -- Hoe registration function farming.register_hoe = function(name, def) -- Check for : prefix (register new hoes in your mod's namespace) - if name:sub(1,1) ~= ":" then - name = ":" .. name - end + if name:sub(1,1) ~= ":" then name = ":" .. name end -- Check def table - if def.description == nil then - def.description = S("Hoe") - end + if def.description == nil then def.description = S("Hoe") end - if def.inventory_image == nil then - def.inventory_image = "unknown_item.png" - end + if def.inventory_image == nil then def.inventory_image = "unknown_item.png" end - if def.max_uses == nil then - def.max_uses = 30 - end + if def.max_uses == nil then def.max_uses = 30 end -- add hoe group def.groups = def.groups or {} @@ -32,20 +26,24 @@ farming.register_hoe = function(name, def) minetest.register_tool(name, { description = def.description, inventory_image = def.inventory_image, + groups = def.groups, + sound = {breaks = "default_tool_breaks"}, + damage_groups = def.damage_groups or {fleshy = 1}, + on_use = function(itemstack, user, pointed_thing) return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) - end, - groups = def.groups, - sound = {breaks = "default_tool_breaks"} + end }) -- Register its recipe if def.recipe then + minetest.register_craft({ output = name:sub(2), recipe = def.recipe }) elseif def.material then + minetest.register_craft({ output = name:sub(2), recipe = { @@ -61,77 +59,87 @@ end function farming.hoe_on_use(itemstack, user, pointed_thing, uses) - local pt = pointed_thing + local pt = pointed_thing or {} + local is_used = false -- am I going to hoe the top of a dirt node? - if not pt or pt.type ~= "node" - or pt.above.y ~= pt.under.y + 1 then - return + if pt.type == "node" and pt.above.y == pt.under.y + 1 then + + local under = minetest.get_node(pt.under) + local upos = pointed_thing.under + + if minetest.is_protected(upos, user:get_player_name()) then + minetest.record_protection_violation(upos, user:get_player_name()) + return + end + + local p = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then return end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then return end + + -- check if pointing at dirt + if minetest.get_item_group(under.name, "soil") ~= 1 then return end + + -- check if (wet) soil defined + local ndef = minetest.registered_nodes[under.name] + + if ndef.soil == nil or ndef.soil.wet == nil or ndef.soil.dry == nil then + return + end + + if minetest.is_protected(pt.under, user:get_player_name()) then + minetest.record_protection_violation(pt.under, user:get_player_name()) + return + end + + -- turn the node into soil, wear out item and play sound + minetest.set_node(pt.under, {name = ndef.soil.dry}) ; is_used = true + + minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}, true) end - local under = minetest.get_node(pt.under) - local upos = pointed_thing.under - - if minetest.is_protected(upos, user:get_player_name()) then - minetest.record_protection_violation(upos, user:get_player_name()) - return - end - - local p = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} - local above = minetest.get_node(p) - - -- return if any of the nodes is not registered - if not minetest.registered_nodes[under.name] - or not minetest.registered_nodes[above.name] then - return - end - - -- check if the node above the pointed thing is air - if above.name ~= "air" then - return - end - - -- check if pointing at dirt - if minetest.get_item_group(under.name, "soil") ~= 1 then - return - end - - -- check if (wet) soil defined - local ndef = minetest.registered_nodes[under.name] - if ndef.soil == nil or ndef.soil.wet == nil or ndef.soil.dry == nil then - return - end - - if minetest.is_protected(pt.under, user:get_player_name()) then - minetest.record_protection_violation(pt.under, user:get_player_name()) - return - end - - -- turn the node into soil, wear out item and play sound - minetest.set_node(pt.under, {name = ndef.soil.dry}) - - minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}) - local wdef = itemstack:get_definition() local wear = 65535 / (uses - 1) - if farming.is_creative(user:get_player_name()) then - if tr then - wear = 1 - else - wear = 0 + -- using hoe as weapon + if pt.type == "object" then + + local ent = pt.ref and pt.ref:get_luaentity() + local dir = user:get_look_dir() + + if (ent and ent.name ~= "__builtin:item" + and ent.name ~= "__builtin:falling_node") or pt.ref:is_player() then + + pt.ref:punch(user, nil, {full_punch_interval = 1.0, + damage_groups = wdef.damage_groups}, dir) + + is_used = true end end - if tr then - itemstack = toolranks.new_afteruse(itemstack, user, under, {wear = wear}) - else - itemstack:add_wear(wear) - end + -- only when used on soil top or external entity + if is_used then - if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, {pos = pt.above, - gain = 0.5}, true) + -- cretive doesnt wear tools but toolranks registers uses with wear so set to 1 + if farming.is_creative(user:get_player_name()) then + if mod_tr then wear = 1 else wear = 0 end + end + + if mod_tr then + itemstack = toolranks.new_afteruse(itemstack, user, under, {wear = wear}) + else + itemstack:add_wear(wear) + end + + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5}, true) + end end return itemstack @@ -163,14 +171,17 @@ farming.register_hoe(":farming:hoe_steel", { description = S("Steel Hoe"), inventory_image = "farming_tool_steelhoe.png", max_uses = 200, - material = "default:steel_ingot" + material = "default:steel_ingot", + damage_groups = {fleshy = 2} }) farming.register_hoe(":farming:hoe_bronze", { description = S("Bronze Hoe"), inventory_image = "farming_tool_bronzehoe.png", - max_uses = 500, - groups = {not_in_creative_inventory = 1} + max_uses = 250, + groups = {not_in_creative_inventory = 1}, + material = "default:bronze_ingot", + damage_groups = {fleshy = 2} }) farming.register_hoe(":farming:hoe_mese", { @@ -178,45 +189,48 @@ farming.register_hoe(":farming:hoe_mese", { inventory_image = "farming_tool_mesehoe.png", max_uses = 350, groups = {not_in_creative_inventory = 1}, + damage_groups = {fleshy = 3} }) farming.register_hoe(":farming:hoe_diamond", { description = S("Diamond Hoe"), inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, - groups = {not_in_creative_inventory = 1} + groups = {not_in_creative_inventory = 1}, + damage_groups = {fleshy = 3} }) -- Toolranks support -if tr then -minetest.override_item("farming:hoe_wood", { - original_description = "Wood Hoe", - description = toolranks.create_description("Wood Hoe")}) +if mod_tr then -minetest.override_item("farming:hoe_stone", { - original_description = "Stone Hoe", - description = toolranks.create_description("Stone Hoe")}) + minetest.override_item("farming:hoe_wood", { + original_description = S("Wood Hoe"), + description = toolranks.create_description(S("Wood Hoe"))}) -minetest.override_item("farming:hoe_steel", { - original_description = "Steel Hoe", - description = toolranks.create_description("Steel Hoe")}) + minetest.override_item("farming:hoe_stone", { + original_description = S("Stone Hoe"), + description = toolranks.create_description(S("Stone Hoe"))}) -minetest.override_item("farming:hoe_bronze", { - original_description = "Bronze Hoe", - description = toolranks.create_description("Bronze Hoe")}) + minetest.override_item("farming:hoe_steel", { + original_description = S("Steel Hoe"), + description = toolranks.create_description(S("Steel Hoe"))}) -minetest.override_item("farming:hoe_mese", { - original_description = "Mese Hoe", - description = toolranks.create_description("Mese Hoe")}) + minetest.override_item("farming:hoe_bronze", { + original_description = S("Bronze Hoe"), + description = toolranks.create_description(S("Bronze Hoe"))}) -minetest.override_item("farming:hoe_diamond", { - original_description = "Diamond Hoe", - description = toolranks.create_description("Diamond Hoe")}) + minetest.override_item("farming:hoe_mese", { + original_description = S("Mese Hoe"), + description = toolranks.create_description(S("Mese Hoe"))}) + + minetest.override_item("farming:hoe_diamond", { + original_description = S("Diamond Hoe"), + description = toolranks.create_description(S("Diamond Hoe"))}) end - -- hoe bomb function + local function hoe_area(pos, player) -- check for protection @@ -229,16 +243,14 @@ local function hoe_area(pos, player) -- remove flora (grass, flowers etc.) local res = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, - {x = pos.x + r, y = pos.y + 2, z = pos.z + r}, - {"group:flora"}) + {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, + {x = pos.x + r, y = pos.y + 2, z = pos.z + r}, {"group:flora"}) for n = 1, #res do minetest.swap_node(res[n], {name = "air"}) end -- replace dirt with tilled soil - res = nil res = minetest.find_nodes_in_area_under_air( {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, {x = pos.x + r, y = pos.y + 2, z = pos.z + r}, @@ -249,14 +261,18 @@ local function hoe_area(pos, player) end end +-- throwable hoe bomb entity --- throwable hoe bomb minetest.register_entity("farming:hoebomb_entity", { - physical = true, - visual = "sprite", - visual_size = {x = 1.0, y = 1.0}, - textures = {"farming_hoe_bomb.png"}, - collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, + + initial_properties = { + physical = true, + visual = "sprite", + visual_size = {x = 1.0, y = 1.0}, + textures = {"farming_hoe_bomb.png"}, + collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1} + }, + lastpos = {}, player = "", @@ -273,12 +289,10 @@ minetest.register_entity("farming:hoebomb_entity", { if self.lastpos.x ~= nil then - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() -- only when potion hits something physical - if vel.x == 0 - or vel.y == 0 - or vel.z == 0 then + if vel.x == 0 or vel.y == 0 or vel.z == 0 then if self.player ~= "" then @@ -299,42 +313,34 @@ minetest.register_entity("farming:hoebomb_entity", { end }) - -- actual throwing function + local function throw_potion(itemstack, player) - local playerpos = player:get_pos() + local pos = player:get_pos() local obj = minetest.add_entity({ - x = playerpos.x, - y = playerpos.y + 1.5, - z = playerpos.z - }, "farming:hoebomb_entity") + x = pos.x, y = pos.y + 1.5, z = pos.z}, "farming:hoebomb_entity") + + if not obj then return end local dir = player:get_look_dir() local velocity = 20 - obj:setvelocity({ - x = dir.x * velocity, - y = dir.y * velocity, - z = dir.z * velocity - }) + obj:set_velocity({x = dir.x * velocity, y = dir.y * velocity, z = dir.z * velocity}) - obj:setacceleration({ - x = dir.x * -3, - y = -9.5, - z = dir.z * -3 - }) + obj:set_acceleration({x = dir.x * -3, y = -9.5, z = dir.z * -3}) obj:get_luaentity().player = player end - -- hoe bomb item + minetest.register_craftitem("farming:hoe_bomb", { description = S("Hoe Bomb (use or throw on grassy areas to hoe land)"), inventory_image = "farming_hoe_bomb.png", groups = {flammable = 2, not_in_creative_inventory = 1}, + on_use = function(itemstack, user, pointed_thing) if pointed_thing.type == "node" then @@ -352,7 +358,21 @@ minetest.register_craftitem("farming:hoe_bomb", { end, }) --- Mithril Scythe (special item) +-- helper function + +local function node_not_num(nodename) + + local num = #nodename:split("_") + local str = "" + + if not num or num == 1 then return end + + for v = 1, (num - 1) do + str = str .. nodename:split("_")[v] .. "_" + end + + return str +end farming.scythe_not_drops = {"farming:trellis", "farming:beanpole"} @@ -360,6 +380,8 @@ farming.add_to_scythe_not_drops = function(item) table.insert(farming.scythe_not_drops, item) end +-- Mithril Scythe (special item) + minetest.register_tool("farming:scythe_mithril", { description = S("Mithril Scythe (Use to harvest and replant crops)"), inventory_image = "farming_scythe_mithril.png", @@ -367,55 +389,34 @@ minetest.register_tool("farming:scythe_mithril", { on_use = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return - end + if pointed_thing.type ~= "node" then return end local pos = pointed_thing.under local name = placer:get_player_name() - if minetest.is_protected(pos, name) then - return - end + if minetest.is_protected(pos, name) then return end local node = minetest.get_node_or_nil(pos) - if not node then - return - end + if not node then return end local def = minetest.registered_nodes[node.name] - if not def then - return - end - - if not def.drop then - return - end - - if not def.groups - or not def.groups.plant then + if not def or not def.drop or not def.groups or not def.groups.plant then return end local drops = minetest.get_node_drops(node.name, "") - if not drops - or #drops == 0 - or (#drops == 1 and drops[1] == "") then + if not drops or #drops == 0 or (#drops == 1 and drops[1] == "") then return end -- get crop name local mname = node.name:split(":")[1] - local pname = node.name:split(":")[2] - local sname = tonumber(pname:split("_")[2]) - pname = pname:split("_")[1] + local pname = node_not_num(node.name:split(":")[2]) - if not sname then - return - end + if not pname then return end -- add dropped items for _, dropped_item in pairs(drops) do @@ -435,10 +436,7 @@ minetest.register_tool("farming:scythe_mithril", { if obj then obj:set_velocity({ - x = math.random(-10, 10) / 9, - y = 3, - z = math.random(-10, 10) / 9 - }) + x = math.random() - 0.5, y = 3, z = math.random() - 0.5}) end end end @@ -449,9 +447,10 @@ minetest.register_tool("farming:scythe_mithril", { end -- play sound - minetest.sound_play("default_grass_footstep", {pos = pos, gain = 1.0}) + minetest.sound_play("default_grass_footstep", {pos = pos, gain = 1.0}, true) - local replace = mname .. ":" .. pname .. "_1" + -- replace with seed or crop_1 + local replace = mname .. ":" .. pname .. "1" if minetest.registered_nodes[replace] then @@ -464,13 +463,15 @@ minetest.register_tool("farming:scythe_mithril", { if not farming.is_creative(name) then - itemstack:add_wear(65535 / 150) -- 150 uses + itemstack:add_wear(65535 / 350) -- 350 uses return itemstack end - end, + end }) +-- if moreores found add mithril scythe recipe + if minetest.get_modpath("moreores") then minetest.register_craft({ @@ -481,34 +482,4 @@ if minetest.get_modpath("moreores") then {"", "", "group:stick"} } }) ---[[ - farming.register_hoe(":moreores:hoe_silver", { - description = S("%s Hoe"):format(S("Silver")), - inventory_image = "moreores_tool_silverhoe.png", - max_uses = 300, - material = "moreores:silver_ingot" - }) - - farming.register_hoe(":moreores:hoe_mithril", { - description = S("%s Hoe"):format(S("Mithril")), - inventory_image = "moreores_tool_mithrilhoe.png", - max_uses = 1000, - material = "moreores:mithril_ingot" - }) - - -- Toolranks support - if tr then - - local desc = S("%s Hoe"):format(S("Silver")) - - minetest.override_item("moreores:hoe_silver", { - original_description = desc, - description = toolranks.create_description(desc)}) - - desc = S("%s Hoe"):format(S("Mithril")) - - minetest.override_item("moreores:hoe_mithril", { - original_description = desc, - description = toolranks.create_description(desc)}) - end]] end diff --git a/mods/farming/init.lua b/mods/farming/init.lua index 94878de7..8ff4fe46 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -1,23 +1,54 @@ --[[ - Farming Redo Mod - by TenPlus1 + Farming Redo Mod by TenPlus1 NEW growing routine by prestidigitator auto-refill by crabman77 ]] +-- Translation support + +local S = minetest.get_translator("farming") + +-- global + farming = { mod = "redo", - version = "20211204", + version = "20240924", path = minetest.get_modpath("farming"), - select = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} - }, + select = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}}, + select_final = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -2.5/16, 0.5}}, registered_plants = {}, - min_light = 12, - max_light = 15 + min_light = 12, max_light = 15, + mapgen = minetest.get_mapgen_setting("mg_name"), + use_utensils = minetest.settings:get_bool("farming_use_utensils") ~= false, + mtg = minetest.get_modpath("default"), + eth = minetest.get_modpath("ethereal"), + mcl = minetest.get_modpath("mcl_core"), + mcl_hardness = 0.01, + translate = S } +-- determine which sounds to use, default or mcl_sounds + +local function sound_helper(snd) + + farming[snd] = (farming.mtg and default[snd]) or (farming.mcl and mcl_sounds[snd]) + or function() return {} end +end + +sound_helper("node_sound_defaults") +sound_helper("node_sound_stone_defaults") +sound_helper("node_sound_dirt_defaults") +sound_helper("node_sound_sand_defaults") +sound_helper("node_sound_gravel_defaults") +sound_helper("node_sound_wood_defaults") +sound_helper("node_sound_leaves_defaults") +sound_helper("node_sound_ice_defaults") +sound_helper("node_sound_metal_defaults") +sound_helper("node_sound_water_defaults") +sound_helper("node_sound_snow_defaults") +sound_helper("node_sound_glass_defaults") + +-- check for creative mode or priv local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -25,26 +56,17 @@ function farming.is_creative(name) return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) end +-- stats, locals, settings, function helper local statistics = dofile(farming.path .. "/statistics.lua") - --- Intllib -local S = minetest.get_translator and minetest.get_translator("farming") or - dofile(farming.path .. "/intllib.lua") - -farming.intllib = S - - --- Utility Function +local random, floor = math.random, math.floor local time_speed = tonumber(minetest.settings:get("time_speed")) or 72 local SECS_PER_CYCLE = (time_speed > 0 and (24 * 60 * 60) / time_speed) or 0 -local function clamp(x, min, max) - return (x < min and min) or (x > max and max) or x -end - +local function clamp(x, min, max) return (x < min and min) or (x > max and max) or x end -- return amount of day or night that has elapsed -- dt is time elapsed, count_day if true counts day, otherwise night + local function day_or_night_time(dt, count_day) local t_day = minetest.get_timeofday() @@ -73,7 +95,9 @@ local function day_or_night_time(dt, count_day) local dt_c = clamp(t2_c, 0, 0.5) - clamp(t1_c, 0, 0.5) -- this cycle if t1_c < -0.5 then - local nc = math.floor(-t1_c) + + local nc = floor(-t1_c) + t1_c = t1_c + nc dt_c = dt_c + 0.5 * nc + clamp(-t1_c - 0.5, 0, 0.5) end @@ -81,22 +105,30 @@ local function day_or_night_time(dt, count_day) return dt_c * SECS_PER_CYCLE end - -- Growth Logic -local STAGE_LENGTH_AVG = tonumber( - minetest.settings:get("farming_stage_length")) or 200 -- 160 + +local STAGE_LENGTH_AVG = tonumber(minetest.settings:get("farming_stage_length")) or 200 local STAGE_LENGTH_DEV = STAGE_LENGTH_AVG / 6 +-- quick start seed timer + +farming.start_seed_timer = function(pos) + + local timer = minetest.get_node_timer(pos) + local grow_time = floor(random(STAGE_LENGTH_DEV, STAGE_LENGTH_AVG)) + + timer:start(grow_time) +end -- return plant name and stage from node provided + local function plant_name_stage(node) local name if type(node) == "table" then - if node.name then - name = node.name + if node.name then name = node.name elseif node.x and node.y and node.z then node = minetest.get_node_or_nil(node) name = node and node.name @@ -105,9 +137,7 @@ local function plant_name_stage(node) name = tostring(node) end - if not name or name == "ignore" then - return nil - end + if not name or name == "ignore" then return nil end local sep_pos = name:find("_[^_]+$") @@ -123,7 +153,6 @@ local function plant_name_stage(node) return name, 0 end - -- Map from node name to -- { plant_name = ..., name = ..., stage = n, stages_left = { node_name, ... } } @@ -132,30 +161,22 @@ local plant_stages = {} farming.plant_stages = plant_stages --- Registers the stages of growth of a (possible plant) node. - -- - -- @param node - -- Node or position table, or node name. - -- @return - -- The (possibly zero) number of stages of growth the plant will go through - -- before being fully grown, or nil if not a plant. - -local register_plant_node + -- @param node - Node or position table, or node name. + -- @return - The (possibly zero) number of stages of growth the plant will go through + -- before being fully grown, or nil if not a plant. -- Recursive helper + local function reg_plant_stages(plant_name, stage, force_last) local node_name = plant_name and plant_name .. "_" .. stage local node_def = node_name and minetest.registered_nodes[node_name] - if not node_def then - return nil - end + if not node_def then return nil end local stages = plant_stages[node_name] - if stages then - return stages - end + if stages then return stages end if minetest.get_item_group(node_name, "growing") > 0 then @@ -174,30 +195,26 @@ local function reg_plant_stages(plant_name, stage, force_last) local old_constr = node_def.on_construct local old_destr = node_def.on_destruct - minetest.override_item(node_name, - { - on_construct = function(pos) + minetest.override_item(node_name, { - if old_constr then - old_constr(pos) - end + on_construct = function(pos) - farming.handle_growth(pos) - end, + if old_constr then old_constr(pos) end - on_destruct = function(pos) + farming.handle_growth(pos) + end, - minetest.get_node_timer(pos):stop() + on_destruct = function(pos) - if old_destr then - old_destr(pos) - end - end, + minetest.get_node_timer(pos):stop() - on_timer = function(pos, elapsed) - return farming.plant_growth_timer(pos, elapsed, node_name) - end, - }) + if old_destr then old_destr(pos) end + end, + + on_timer = function(pos, elapsed) + return farming.plant_growth_timer(pos, elapsed, node_name) + end, + }) end elseif force_last then @@ -217,26 +234,25 @@ local function reg_plant_stages(plant_name, stage, force_last) return stages end +-- split name and stage and register crop -local register_plant_node = function(node) +local function register_plant_node(node) local plant_name, stage = plant_name_stage(node) if plant_name then local stages = reg_plant_stages(plant_name, stage, false) + return stages and #stages.stages_left - else - return nil end end +-- check for further growth and set or stop timer local function set_growing(pos, stages_left) - if not stages_left then - return - end + if not stages_left then return end local timer = minetest.get_node_timer(pos) @@ -248,7 +264,7 @@ local function set_growing(pos, stages_left) stage_length = clamp(stage_length, 0.5 * STAGE_LENGTH_AVG, 3.0 * STAGE_LENGTH_AVG) - timer:set(stage_length, -0.5 * math.random() * STAGE_LENGTH_AVG) + timer:set(stage_length, -0.5 * random() * STAGE_LENGTH_AVG) end elseif timer:is_started() then @@ -256,21 +272,18 @@ local function set_growing(pos, stages_left) end end - -- detects a crop at given position, starting or stopping growth timer when needed + function farming.handle_growth(pos, node) - if not pos then - return - end + if not pos then return end local stages_left = register_plant_node(node or pos) - if stages_left then - set_growing(pos, stages_left) - end + if stages_left then set_growing(pos, stages_left) end end +-- register crops nodes and add timer functions minetest.after(0, function() @@ -279,60 +292,89 @@ minetest.after(0, function() end end) - -- Just in case a growing type or added node is missed (also catches existing -- nodes added to map before timers were incorporated). + minetest.register_abm({ + label = "Start crop timer", nodenames = {"group:growing"}, interval = 300, chance = 1, catch_up = false, + action = function(pos, node) - farming.handle_growth(pos, node) + + -- skip if node timer already active + if minetest.get_node_timer(pos):is_started() then return end + + -- check if group:growing node is a seed + local def = minetest.registered_nodes[node.name] + + if def and def.groups and def.groups.seed then + + if def.on_timer then -- start node timer if found + + farming.start_seed_timer(pos) + + return + end + + local next_stage = def.next_plant + + def = minetest.registered_nodes[next_stage] + + if def then -- switch seed without timer to stage_1 of crop + + local p2 = def.place_param2 or 1 + + minetest.set_node(pos, {name = next_stage, param2 = p2}) + end + else + farming.handle_growth(pos, node) -- start normal crop timer + end end }) +-- default check crop is on wet soil + +farming.can_grow = function(pos) + + local below = minetest.get_node({x = pos.x, y = pos.y -1, z = pos.z}) + + return minetest.get_item_group(below.name, "soil") >= 3 +end -- Plant timer function that grows plants under the right conditions. + function farming.plant_growth_timer(pos, elapsed, node_name) local stages = plant_stages[node_name] - if not stages then - return false - end + if not stages then return false end local max_growth = #stages.stages_left - if max_growth <= 0 then - return false - end + if max_growth <= 0 then return false end - -- custom growth check - local chk = minetest.registered_nodes[node_name].growth_check + local chk1 = minetest.registered_nodes[node_name].growth_check -- old + local chk2 = minetest.registered_nodes[node_name].can_grow -- new - if chk then + if chk1 then -- custom farming redo growth_check function - if chk(pos, node_name) then - return true - end + if not chk1(pos, node_name) then return true end - -- otherwise check for wet soil beneath crop - else - local under = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}) + elseif chk2 then -- custom mt 5.9x farming can_grow function - if minetest.get_item_group(under.name, "soil") < 3 then - return true - end - end + if not chk2(pos) then return true end + + -- default mt 5.9x farming.can_grow function + elseif not farming.can_grow(pos) then return true end local growth local light_pos = {x = pos.x, y = pos.y, z = pos.z} local lambda = elapsed / STAGE_LENGTH_AVG - if lambda < 0.1 then - return true - end + if lambda < 0.1 then return true end local MIN_LIGHT = minetest.registered_nodes[node_name].minlight or farming.min_light local MAX_LIGHT = minetest.registered_nodes[node_name].maxlight or farming.max_light @@ -341,22 +383,18 @@ function farming.plant_growth_timer(pos, elapsed, node_name) local light = (minetest.get_node_light(light_pos) or 0) - if light < MIN_LIGHT or light > MAX_LIGHT then - return true - end + if light < MIN_LIGHT or light > MAX_LIGHT then return true end growth = 1 else - local night_light = (minetest.get_node_light(light_pos, 0) or 0) - local day_light = (minetest.get_node_light(light_pos, 0.5) or 0) + local night_light = (minetest.get_node_light(light_pos, 0) or 0) + local day_light = (minetest.get_node_light(light_pos, 0.5) or 0) local night_growth = night_light >= MIN_LIGHT and night_light <= MAX_LIGHT local day_growth = day_light >= MIN_LIGHT and day_light <= MAX_LIGHT if not night_growth then - if not day_growth then - return true - end + if not day_growth then return true end lambda = day_or_night_time(elapsed, true) / STAGE_LENGTH_AVG @@ -367,16 +405,14 @@ function farming.plant_growth_timer(pos, elapsed, node_name) growth = statistics.poisson(lambda, max_growth) - if growth < 1 then - return true - end + if growth < 1 then return true end end if minetest.registered_nodes[stages.stages_left[growth]] then local p2 = minetest.registered_nodes[stages.stages_left[growth] ].place_param2 or 1 - minetest.swap_node(pos, {name = stages.stages_left[growth], param2 = p2}) + minetest.set_node(pos, {name = stages.stages_left[growth], param2 = p2}) else return true end @@ -384,16 +420,15 @@ function farming.plant_growth_timer(pos, elapsed, node_name) return growth ~= max_growth end - -- refill placed plant by crabman (26/08/2015) updated by TenPlus1 + function farming.refill_plant(player, plantname, index) - local inv = player:get_inventory() + local inv = player and player:get_inventory() ; if not inv then return end + local old_stack = inv:get_stack("main", index) - if old_stack:get_name() ~= "" then - return - end + if old_stack:get_name() ~= "" then return end for i, stack in ipairs(inv:get_list("main")) do @@ -408,22 +443,21 @@ function farming.refill_plant(player, plantname, index) end end - -- Place Seeds on Soil + function farming.place_seed(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing -- check if pointing at a node - if not pt or pt.type ~= "node" then - return - end + if not itemstack or not pt or pt.type ~= "node" then return end local under = minetest.get_node(pt.under) -- am I right-clicking on something that has a custom on_place set? -- thanks to Krock for helping with this issue :) local def = minetest.registered_nodes[under.name] + if placer and itemstack and def and def.on_rightclick then return def.on_rightclick(pt.under, under, placer, itemstack, pt) end @@ -431,23 +465,16 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname) local above = minetest.get_node(pt.above) -- check if pointing at the top of the node - if pt.above.y ~= pt.under.y + 1 then - return - end + if pt.above.y ~= pt.under.y + 1 then return end -- return if any of the nodes is not registered if not minetest.registered_nodes[under.name] - or not minetest.registered_nodes[above.name] then - return - end + or not minetest.registered_nodes[above.name] then return end - -- can I replace above node, and am I pointing at soil + -- can I replace above node, and am I pointing directly at soil if not minetest.registered_nodes[above.name].buildable_to or minetest.get_item_group(under.name, "soil") < 2 - -- avoid multiple seed placement bug - or minetest.get_item_group(above.name, "plant") ~= 0 then - return - end + or minetest.get_item_group(above.name, "plant") ~= 0 then return end -- is player planting seed? local name = placer and placer:get_player_name() or "" @@ -459,11 +486,15 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname) minetest.set_node(pt.above, {name = plantname, param2 = p2}) ---minetest.get_node_timer(pt.above):start(1) ---farming.handle_growth(pt.above)--, node) + farming.start_seed_timer(pt.above) minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}) + minetest.log("action", string.format("%s planted %s at %s", + (placer and placer:is_player() and placer:get_player_name() or "A mod"), + itemstack:get_name(), minetest.pos_to_string(pt.above) + )) + if placer and itemstack and not farming.is_creative(placer:get_player_name()) then @@ -474,12 +505,8 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname) -- check for refill if itemstack:get_count() == 0 then - minetest.after(0.10, - farming.refill_plant, - placer, - name, - placer:get_wield_index() - ) + minetest.after(0.2, farming.refill_plant, + placer, name, placer:get_wield_index()) end end @@ -487,13 +514,11 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname) end end - -- Function to register plants (default farming compatibility) + farming.register_plant = function(name, def) - if not def.steps then - return nil - end + if not def.steps then return nil end local mname = name:split(":")[1] local pname = name:split(":")[2] @@ -512,19 +537,34 @@ farming.register_plant = function(name, def) inventory_image = def.inventory_image, wield_image = def.inventory_image, drawtype = "signlike", - groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 2}, + groups = { + seed = 1, snappy = 3, attached_node = 1, flammable = 2, growing = 1, + compostability = 65, handy = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, paramtype = "light", paramtype2 = "wallmounted", walkable = false, sunlight_propagates = true, selection_box = farming.select, - place_param2 = def.place_param2 or nil, + place_param2 = 1, -- place seed flat next_plant = mname .. ":" .. pname .. "_1", - on_place = function(itemstack, placer, pointed_thing) - return farming.place_seed(itemstack, placer, - pointed_thing, mname .. ":" .. pname .. "_1") + on_timer = function(pos, elapsed) + + local def = minetest.registered_nodes[mname .. ":" .. pname .. "_1"] + + if def then + minetest.swap_node(pos, {name = def.next_plant, param2 = def.place_param2}) + end end, + + on_place = function(itemstack, placer, pointed_thing) + + return farming.place_seed(itemstack, placer, pointed_thing, + mname .. ":seed_" .. pname) + end }) -- Register harvest @@ -538,9 +578,11 @@ farming.register_plant = function(name, def) for i = 1, def.steps do local base_rarity = 1 + if def.steps ~= 1 then base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) end + local drop = { items = { {items = {mname .. ":" .. pname}, rarity = base_rarity}, @@ -550,13 +592,16 @@ farming.register_plant = function(name, def) } } + local sel = farming.select local g = { - snappy = 3, flammable = 2, plant = 1, growing = 1, + handy = 1, snappy = 3, flammable = 2, plant = 1, growing = 1, attached_node = 1, not_in_creative_inventory = 1, } -- Last step doesn't need growing=1 so Abm never has to check these + -- also increase selection box for visual indication plant has matured if i == def.steps then + sel = farming.select_final g.growing = 0 end @@ -568,7 +613,10 @@ farming.register_plant = function(name, def) next_plant = mname .. ":" .. pname .. "_" .. (i + 1) end + local desc = pname:gsub("^%l", string.upper) + minetest.register_node(node_name, { + description = S(desc) .. S(" Crop"), drawtype = "plantlike", waving = 1, tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, @@ -579,100 +627,137 @@ farming.register_plant = function(name, def) buildable_to = true, sunlight_propagates = true, drop = drop, - selection_box = farming.select, + selection_box = sel, groups = g, - sounds = default.node_sound_leaves_defaults(), + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), minlight = def.minlight, maxlight = def.maxlight, next_plant = next_plant }) end --- add to farming.registered_plants -farming.registered_plants[mname .. ":" .. pname] = { - crop = mname .. ":" .. pname, - seed = mname .. ":seed_" .. pname, - steps = def.steps, - minlight = def.minlight, - maxlight = def.maxlight -} ---print(dump(farming.registered_plants[mname .. ":" .. pname])) - -- Return info + -- add to farming.registered_plants + farming.registered_plants[mname .. ":" .. pname] = { + crop = mname .. ":" .. pname, + seed = mname .. ":seed_" .. pname, + steps = def.steps, + minlight = def.minlight, + maxlight = def.maxlight + } +-- print(dump(farming.registered_plants[mname .. ":" .. pname])) + return {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname} end - -- default settings -farming.carrot = 0.001 -farming.potato = 0.001 -farming.tomato = 0.001 -farming.cucumber = 0.001 -farming.corn = 0.001 -farming.coffee = 0.001 -farming.melon = 0.001 -farming.pumpkin = 0.001 + +farming.asparagus = 0.002 +farming.eggplant = 0.002 +farming.spinach = 0.002 +farming.carrot = 0.002 +farming.potato = 0.002 +farming.tomato = 0.002 +farming.cucumber = 0.002 +farming.corn = 0.002 +farming.coffee = 0.002 +farming.melon = 0.009 +farming.pumpkin = 0.009 farming.cocoa = true -farming.raspberry = 0.001 -farming.blueberry = 0.001 -farming.rhubarb = 0.001 -farming.beans = 0.001 -farming.grapes = 0.001 +farming.raspberry = 0.002 +farming.blueberry = 0.002 +farming.rhubarb = 0.002 +farming.beans = 0.002 +farming.grapes = 0.002 farming.barley = true farming.chili = 0.003 farming.hemp = 0.003 -farming.garlic = 0.001 -farming.onion = 0.001 +farming.garlic = 0.002 +farming.onion = 0.002 farming.pepper = 0.002 -farming.pineapple = 0.001 -farming.peas = 0.001 -farming.beetroot = 0.001 +farming.pineapple = 0.003 +farming.peas = 0.002 +farming.beetroot = 0.002 farming.mint = 0.005 -farming.cabbage = 0.001 +farming.cabbage = 0.002 farming.blackberry = 0.002 -farming.soy = 0.001 -farming.vanilla = 0.001 -farming.lettuce = 0.001 -farming.artichoke = 0.001 +farming.soy = 0.002 +farming.vanilla = 0.002 +farming.lettuce = 0.002 +farming.artichoke = 0.002 farming.parsley = 0.002 -farming.sunflower = 0.001 +farming.sunflower = 0.002 +farming.ginger = 0.002 +farming.strawberry = 0.002 +farming.cotton = 0.003 farming.grains = true farming.rice = true -farming.rarety = 0.002 - -- Load new global settings if found inside mod folder -local input = io.open(farming.path.."/farming.conf", "r") -if input then - dofile(farming.path .. "/farming.conf") - input:close() -end + +local input = io.open(farming.path .. "/farming.conf", "r") + +if input then dofile(farming.path .. "/farming.conf") ; input:close() end -- load new world-specific settings if found inside world folder + local worldpath = minetest.get_worldpath() -input = io.open(worldpath.."/farming.conf", "r") -if input then - dofile(worldpath .. "/farming.conf") - input:close() + +input = io.open(worldpath .. "/farming.conf", "r") + +if input then dofile(worldpath .. "/farming.conf") ; input:close() end + +-- helper function to add {eatable} group to food items, also {flammable} + +function farming.add_eatable(item, hp) + + local def = minetest.registered_items[item] + + if def then + + local groups = table.copy(def.groups) or {} + + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end end +-- recipe item list and alternatives + +dofile(farming.path .. "/item_list.lua") + +-- setup soil, register hoes, override grass + +if minetest.get_modpath("default") then + dofile(farming.path .. "/soil.lua") + dofile(farming.path .. "/hoes.lua") +end --- important items -dofile(farming.path.."/soil.lua") -dofile(farming.path.."/hoes.lua") dofile(farming.path.."/grass.lua") -dofile(farming.path.."/utensils.lua") --- default crops -dofile(farming.path.."/crops/wheat.lua") -dofile(farming.path.."/crops/cotton.lua") +-- disable crops Mineclone already has +if farming.mcl then + farming.carrot = nil + farming.potato = nil + farming.melon = nil + farming.cocoa = nil + farming.beetroot = nil + farming.sunflower = nil + farming.pumpkin = nil +else + dofile(farming.path.."/crops/wheat.lua") -- default crop outwith mineclone +end + +dofile(farming.path.."/crops/cotton.lua") -- default crop -- helper function + local function ddoo(file, check) - if check then - dofile(farming.path .. "/crops/" .. file) - end + if check then dofile(farming.path .. "/crops/" .. file) end end -- add additional crops and food (if enabled) @@ -699,7 +784,7 @@ ddoo("pineapple.lua", farming.pineapple) ddoo("peas.lua", farming.peas) ddoo("beetroot.lua", farming.beetroot) ddoo("chili.lua", farming.chili) -ddoo("ryeoatrice.lua", farming.grains) +ddoo("rye_oat.lua", farming.grains) ddoo("rice.lua", farming.rice) ddoo("mint.lua", farming.mint) ddoo("cabbage.lua", farming.cabbage) @@ -710,8 +795,25 @@ ddoo("lettuce.lua", farming.lettuce) ddoo("artichoke.lua", farming.artichoke) ddoo("parsley.lua", farming.parsley) ddoo("sunflower.lua", farming.sunflower) +ddoo("strawberry.lua", farming.strawberry) +ddoo("asparagus.lua", farming.asparagus) +ddoo("eggplant.lua", farming.eggplant) +ddoo("spinach.lua", farming.eggplant) +ddoo("ginger.lua", farming.ginger) -dofile(farming.path .. "/food.lua") -dofile(farming.path .. "/mapgen.lua") -dofile(farming.path .. "/compatibility.lua") -- Farming Plus compatibility -dofile(farming.path .. "/lucky_block.lua") +-- register food items, non-food items, recipes and stairs + +dofile(farming.path .. "/item_non_food.lua") +dofile(farming.path .. "/item_food.lua") +dofile(farming.path .. "/item_recipes.lua") +dofile(farming.path .. "/item_stairs.lua") + +if not farming.mcl then + dofile(farming.path .. "/compatibility.lua") -- Farming Plus compatibility +end + +if minetest.get_modpath("lucky_block") then + dofile(farming.path .. "/lucky_block.lua") +end + +print("[MOD] Farming Redo loaded") diff --git a/mods/farming/intllib.lua b/mods/farming/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/farming/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/farming/item_food.lua b/mods/farming/item_food.lua new file mode 100644 index 00000000..36ae280e --- /dev/null +++ b/mods/farming/item_food.lua @@ -0,0 +1,1035 @@ + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- Flour + +minetest.register_craftitem("farming:flour", { + description = S("Flour"), + inventory_image = "farming_flour.png", + groups = {food_flour = 1, flammable = 1} +}) + +-- Garlic bulb + +minetest.register_craftitem("farming:garlic", { + description = S("Garlic"), + inventory_image = "crops_garlic.png", + on_use = minetest.item_eat(1), + groups = {food_garlic = 1, compostability = 55} +}) + +farming.add_eatable("farming:garlic", 1) + +-- Garlic braid + +minetest.register_node("farming:garlic_braid", { + description = S("Garlic Braid"), + inventory_image = "crops_garlic_braid.png", + wield_image = "crops_garlic_braid.png", + drawtype = "nodebox", + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "crops_garlic_braid_top.png", + "crops_garlic_braid.png", + "crops_garlic_braid_side.png^[transformFx", + "crops_garlic_braid_side.png", + "crops_garlic_braid.png", + "crops_garlic_braid.png" + }, + groups = {vessel = 1, dig_immediate = 3, flammable = 3, compostability = 65, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + node_box = { + type = "fixed", fixed = {{-0.1875, -0.5, 0.5, 0.1875, 0.5, 0.125}} + } +}) + +-- Corn on the cob (texture by TenPlus1) + +minetest.register_craftitem("farming:corn_cob", { + description = S("Corn on the Cob"), + inventory_image = "farming_corn_cob.png", + groups = {compostability = 65, food_corn_cooked = 1}, + on_use = minetest.item_eat(5) +}) + +farming.add_eatable("farming:corn_cob", 5) + +-- Popcorn + +minetest.register_craftitem("farming:popcorn", { + description = S("Popcorn"), + inventory_image = "farming_popcorn.png", + groups = {compostability = 55, food_popcorn = 1}, + on_use = minetest.item_eat(4) +}) + +farming.add_eatable("farming:popcorn", 4) + +-- Cornstarch + +minetest.register_craftitem("farming:cornstarch", { + description = S("Cornstarch"), + inventory_image = "farming_cornstarch.png", + groups = {food_cornstarch = 1, food_gelatin = 1, flammable = 2, compostability = 65} +}) + +-- Cup of coffee + +minetest.register_node("farming:coffee_cup", { + description = S("Cup of Coffee"), + drawtype = "torchlike", + tiles = {"farming_coffee_cup.png"}, + inventory_image = "farming_coffee_cup.png", + wield_image = "farming_coffee_cup.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, drink = 1, handy = 1}, + is_ground_content = false, + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + sounds = farming.node_sound_glass_defaults() +}) + +farming.add_eatable("farming:coffee_cup", 2) + +minetest.register_alias("farming:coffee_cup_hot", "farming:coffee_cup") +minetest.register_alias("farming:drinking_cup", "vessels:drinking_glass") + +-- Bar of of dark chocolate (thx to Ice Pandora for her deviantart.com chocolate tutorial) + +minetest.register_craftitem("farming:chocolate_dark", { + description = S("Bar of Dark Chocolate"), + inventory_image = "farming_chocolate_dark.png", + on_use = minetest.item_eat(3) +}) + +farming.add_eatable("farming:chocolate_dark", 3) + +-- Chocolate block (not edible) + +minetest.register_node("farming:chocolate_block", { + description = S("Chocolate Block"), + tiles = {"farming_chocolate_block.png"}, + is_ground_content = false, + groups = {cracky = 2, oddly_breakable_by_hand = 2, handy = 1}, + sounds = farming.node_sound_stone_defaults() +}) + +-- Bowl of chili + +minetest.register_craftitem("farming:chili_bowl", { + description = S("Bowl of Chili"), + inventory_image = "farming_chili_bowl.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:chili_bowl", 8) + +-- Chili powder + +minetest.register_craftitem("farming:chili_powder", { + description = S("Chili Powder"), + on_use = minetest.item_eat(-1), + inventory_image = "farming_chili_powder.png", + groups = {compostability = 45} +}) + +-- Carrot juice + +minetest.register_craftitem("farming:carrot_juice", { + description = S("Carrot Juice"), + inventory_image = "farming_carrot_juice.png", + on_use = minetest.item_eat(4, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1} +}) + +farming.add_eatable("farming:carrot_juice", 4) + +-- Blueberry Pie + +minetest.register_craftitem("farming:blueberry_pie", { + description = S("Blueberry Pie"), + inventory_image = "farming_blueberry_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 75} +}) + +farming.add_eatable("farming:blueberry_pie", 6) + +-- Blueberry muffin (thanks to sosogirl123 @ deviantart.com for muffin image) + +minetest.register_craftitem("farming:muffin_blueberry", { + description = S("Blueberry Muffin"), + inventory_image = "farming_blueberry_muffin.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:muffin_blueberry", 2) + +-- Tomato soup + +minetest.register_craftitem("farming:tomato_soup", { + description = S("Tomato Soup"), + inventory_image = "farming_tomato_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(8, "farming:bowl") +}) + +farming.add_eatable("farming:tomato_soup", 8) + +-- sliced bread + +minetest.register_craftitem("farming:bread_slice", { + description = S("Sliced Bread"), + inventory_image = "farming_bread_slice.png", + on_use = minetest.item_eat(1), + groups = {food_bread_slice = 1, compostability = 65} +}) + +farming.add_eatable("farming:bread_slice", 1) + +-- toast + +minetest.register_craftitem("farming:toast", { + description = S("Toast"), + inventory_image = "farming_toast.png", + on_use = minetest.item_eat(1), + groups = {food_toast = 1, compostability = 65} +}) + +farming.add_eatable("farming:toast", 1) + +-- toast sandwich + +minetest.register_craftitem("farming:toast_sandwich", { + description = S("Toast Sandwich"), + inventory_image = "farming_toast_sandwich.png", + on_use = minetest.item_eat(4), + groups = {compostability = 85} +}) + +farming.add_eatable("farming:toast_sandwich", 4) + +-- glass of water + +minetest.register_craftitem("farming:glass_water", { + description = S("Glass of Water"), + inventory_image = "farming_water_glass.png", + groups = {food_glass_water = 1, flammable = 3, vessel = 1} +}) + +-- Sugar cube + +minetest.register_node("farming:sugar_cube", { + description = S("Sugar Cube"), + tiles = {"farming_sugar_cube.png"}, + groups = {shovely = 1, handy = 1, crumbly = 2}, + is_ground_content = false, + floodable = true, + sounds = farming.node_sound_gravel_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- Sugar caramel + +minetest.register_craftitem("farming:caramel", { + description = S("Caramel"), + inventory_image = "farming_caramel.png", + groups = {compostability = 40} +}) + +-- Salt + +minetest.register_node("farming:salt", { + description = S("Salt"), + inventory_image = "farming_salt.png", + wield_image = "farming_salt.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"farming_salt.png"}, + groups = {food_salt = 1, vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + -- special function to make salt crystals form inside water + dropped_step = function(self, pos, dtime) + + self.ctimer = (self.ctimer or 0) + dtime + if self.ctimer < 15.0 then return end + self.ctimer = 0 + + local needed + + if self.node_inside and self.node_inside.name == a.water_source then + needed = 8 + + elseif self.node_inside and self.node_inside.name == a.river_water_source then + needed = 9 + end + + if not needed then return end + + local objs = core.get_objects_inside_radius(pos, 0.5) + + if not objs or #objs ~= 1 then return end + + local salt, ent = nil, nil + + for k, obj in pairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name == "__builtin:item" + and ent.itemstring == "farming:salt " .. needed then + + obj:remove() + + core.add_item(pos, "farming:salt_crystal") + + return false -- return with no further action + end + end + end +}) + +-- Salt Crystal + +minetest.register_node("farming:salt_crystal", { + description = S("Salt crystal"), + inventory_image = "farming_salt_crystal.png", + wield_image = "farming_salt_crystal.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + light_source = 1, + tiles = {"farming_salt_crystal.png"}, + groups = {dig_immediate = 3, attached_node = 1, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- Mayonnaise + +minetest.register_node("farming:mayonnaise", { + description = S("Mayonnaise"), + drawtype = "plantlike", + tiles = {"farming_mayo.png"}, + inventory_image = "farming_mayo.png", + wield_image = "farming_mayo.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + on_use = minetest.item_eat(3), + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.45, 0.25} + }, + groups = { + compostability = 65, food_mayonnaise = 1, vessel = 1, dig_immediate = 3, + attached_node = 1, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +farming.add_eatable("farming:mayonnaise", 3) + +-- Rose Water + +minetest.register_node("farming:rose_water", { + description = S("Rose Water"), + inventory_image = "farming_rose_water.png", + wield_image = "farming_rose_water.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"farming_rose_water.png"}, + groups = { + food_rose_water = 1, vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + } +}) + +-- Turkish Delight + +minetest.register_craftitem("farming:turkish_delight", { + description = S("Turkish Delight"), + inventory_image = "farming_turkish_delight.png", + groups = {compostability = 85}, + on_use = minetest.item_eat(2) +}) + +farming.add_eatable("farming:turkish_delight", 2) + +-- Garlic Bread + +minetest.register_craftitem("farming:garlic_bread", { + description = S("Garlic Bread"), + inventory_image = "farming_garlic_bread.png", + groups = {compostability = 65}, + on_use = minetest.item_eat(2) +}) + +farming.add_eatable("farming:garlic_bread", 2) + +-- Donuts (thanks to Bockwurst for making the donut images) + +minetest.register_craftitem("farming:donut", { + description = S("Donut"), + inventory_image = "farming_donut.png", + on_use = minetest.item_eat(4), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:donut", 4) + +minetest.register_craftitem("farming:donut_chocolate", { + description = S("Chocolate Donut"), + inventory_image = "farming_donut_chocolate.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:donut_chocolate", 6) + +minetest.register_craftitem("farming:donut_apple", { + description = S("Apple Donut"), + inventory_image = "farming_donut_apple.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:donut_apple", 6) + +-- Porridge Oats + +minetest.register_craftitem("farming:porridge", { + description = S("Porridge"), + inventory_image = "farming_porridge.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:porridge", 6) + +-- Jaffa Cake + +minetest.register_craftitem("farming:jaffa_cake", { + description = S("Jaffa Cake"), + inventory_image = "farming_jaffa_cake.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:jaffa_cake", 6) + +-- Apple Pie + +minetest.register_craftitem("farming:apple_pie", { + description = S("Apple Pie"), + inventory_image = "farming_apple_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 75} +}) + +farming.add_eatable("farming:apple_pie", 6) + +-- Cactus Juice + +minetest.register_craftitem("farming:cactus_juice", { + description = S("Cactus Juice"), + inventory_image = "farming_cactus_juice.png", + groups = {vessel = 1, drink = 1, compostability = 55}, + + on_use = function(itemstack, user, pointed_thing) + + if user then + + local num = math.random(5) == 1 and -1 or 2 + + return minetest.do_item_eat(num, "vessels:drinking_glass", + itemstack, user, pointed_thing) + end + end +}) + +farming.add_eatable("farming:cactus_juice", 1) + +-- Pasta + +minetest.register_craftitem("farming:pasta", { + description = S("Pasta"), + inventory_image = "farming_pasta.png", + groups = {compostability = 65, food_pasta = 1} +}) + +-- Mac & Cheese + +minetest.register_craftitem("farming:mac_and_cheese", { + description = S("Mac & Cheese"), + inventory_image = "farming_mac_and_cheese.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:mac_and_cheese", 6) + +-- Spaghetti + +minetest.register_craftitem("farming:spaghetti", { + description = S("Spaghetti"), + inventory_image = "farming_spaghetti.png", + on_use = minetest.item_eat(8), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:spaghetti", 8) + +-- Korean Bibimbap + +minetest.register_craftitem("farming:bibimbap", { + description = S("Bibimbap"), + inventory_image = "farming_bibimbap.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:bibimbap", 8) + +-- Burger + +minetest.register_craftitem("farming:burger", { + description = S("Burger"), + inventory_image = "farming_burger.png", + on_use = minetest.item_eat(16), + groups = {compostability = 95} +}) + +farming.add_eatable("farming:burger", 16) + +-- Salad + +minetest.register_craftitem("farming:salad", { + description = S("Salad"), + inventory_image = "farming_salad.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 45} +}) + +farming.add_eatable("farming:salad", 8) + +-- Triple Berry Smoothie + +minetest.register_craftitem("farming:smoothie_berry", { + description = S("Triple Berry Smoothie"), + inventory_image = "farming_berry_smoothie.png", + on_use = minetest.item_eat(6, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 65} +}) + +farming.add_eatable("farming:smoothie_berry", 6) + +-- Patatas a la importancia + +minetest.register_craftitem("farming:spanish_potatoes", { + description = S("Spanish Potatoes"), + inventory_image = "farming_spanish_potatoes.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:spanish_potatoes", 8) + +-- Potato omelette + +minetest.register_craftitem("farming:potato_omelet", { + description = S("Potato omelette"), + inventory_image = "farming_potato_omelet.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:potato_omelet", 6) + +-- Paella + +minetest.register_craftitem("farming:paella", { + description = S("Paella"), + inventory_image = "farming_paella.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:paella", 8) + +-- Vanilla Flan + +minetest.register_craftitem("farming:flan", { + description = S("Vanilla Flan"), + inventory_image = "farming_vanilla_flan.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:flan", 6) + +-- Vegan Cheese + +minetest.register_craftitem("farming:cheese_vegan", { + description = S("Vegan Cheese"), + inventory_image = "farming_cheese_vegan.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65, food_cheese = 1} +}) + +farming.add_eatable("farming:cheese_vegan", 2) + +-- Vegan Butter + +minetest.register_craftitem("farming:butter_vegan", { + description = S("Vegan Butter"), + inventory_image = "farming_vegan_butter.png", + groups = {food_butter = 1} +}) + +-- Onigiri + +minetest.register_craftitem("farming:onigiri", { + description = S("Onigiri"), + inventory_image = "farming_onigiri.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:onigiri", 2) + +-- Gyoza + +minetest.register_craftitem("farming:gyoza", { + description = S("Gyoza"), + inventory_image = "farming_gyoza.png", + on_use = minetest.item_eat(4), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:gyoza", 4) + +-- Mochi + +minetest.register_craftitem("farming:mochi", { + description = S("Mochi"), + inventory_image = "farming_mochi.png", + on_use = minetest.item_eat(3), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:mochi", 3) + +-- Gingerbread Man + +minetest.register_craftitem("farming:gingerbread_man", { + description = S("Gingerbread Man"), + inventory_image = "farming_gingerbread_man.png", + on_use = minetest.item_eat(2), + groups = {compostability = 85} +}) + +farming.add_eatable("farming:gingerbread_man", 2) + +-- Mint tea +minetest.register_craftitem("farming:mint_tea", { + description = S("Mint Tea"), + inventory_image = "farming_mint_tea.png", + on_use = minetest.item_eat(2, a.drinking_glass), + groups = {drink = 1} +}) + +farming.add_eatable("farming:mint_tea", 2) + +-- Onion soup +minetest.register_craftitem("farming:onion_soup", { + description = S("Onion Soup"), + inventory_image = "farming_onion_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(6, a.bowl) +}) + +farming.add_eatable("farming:onion_soup", 6) + +-- Pea soup + +minetest.register_craftitem("farming:pea_soup", { + description = S("Pea Soup"), + inventory_image = "farming_pea_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(4, a.bowl) +}) + +farming.add_eatable("farming:pea_soup", 4) + +-- Ground pepper + +minetest.register_node("farming:pepper_ground", { + description = S("Ground Pepper"), + inventory_image = "crops_pepper_ground.png", + wield_image = "crops_pepper_ground.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"crops_pepper_ground.png"}, + groups = { + vessel = 1, food_pepper_ground = 1, handy = 1, + dig_immediate = 3, attached_node = 1, compostability = 30 + }, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + } +}) + +-- pineapple ring + +minetest.register_craftitem("farming:pineapple_ring", { + description = S("Pineapple Ring"), + inventory_image = "farming_pineapple_ring.png", + groups = {food_pineapple_ring = 1, compostability = 45}, + on_use = minetest.item_eat(1) +}) + +farming.add_eatable("farming:pineapple_ring", 1) + +-- Pineapple juice + +minetest.register_craftitem("farming:pineapple_juice", { + description = S("Pineapple Juice"), + inventory_image = "farming_pineapple_juice.png", + on_use = minetest.item_eat(4, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 35} +}) + +farming.add_eatable("farming:pineapple_juice", 4) + +-- Potato & cucumber Salad + +minetest.register_craftitem("farming:potato_salad", { + description = S("Cucumber and Potato Salad"), + inventory_image = "farming_potato_salad.png", + on_use = minetest.item_eat(10, "farming:bowl") +}) + +farming.add_eatable("farming:potato_salad", 10) + +-- Pumpkin dough + +minetest.register_craftitem("farming:pumpkin_dough", { + description = S("Pumpkin Dough"), + inventory_image = "farming_pumpkin_dough.png" +}) + +-- Pumpkin bread + +minetest.register_craftitem("farming:pumpkin_bread", { + description = S("Pumpkin Bread"), + inventory_image = "farming_pumpkin_bread.png", + on_use = minetest.item_eat(8), + groups = {food_bread = 1} +}) + +farming.add_eatable("farming:pumpkin_bread", 8) + +-- Raspberry smoothie + +minetest.register_craftitem("farming:smoothie_raspberry", { + description = S("Raspberry Smoothie"), + inventory_image = "farming_raspberry_smoothie.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 65} +}) + +farming.add_eatable("farming:smoothie_raspberry", 2) + +-- Rhubarb pie + +minetest.register_craftitem("farming:rhubarb_pie", { + description = S("Rhubarb Pie"), + inventory_image = "farming_rhubarb_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +farming.add_eatable("farming:rhubarb_pie", 6) + +-- Rice flour + +minetest.register_craftitem("farming:rice_flour", { + description = S("Rice Flour"), + inventory_image = "farming_rice_flour.png", + groups = {food_rice_flour = 1, flammable = 1, compostability = 65} +}) + +-- Rice bread + +minetest.register_craftitem("farming:rice_bread", { + description = S("Rice Bread"), + inventory_image = "farming_rice_bread.png", + on_use = minetest.item_eat(5), + groups = {food_rice_bread = 1, compostability = 65} +}) + +farming.add_eatable("farming:rice_bread", 5) + +-- Multigrain flour + +minetest.register_craftitem("farming:flour_multigrain", { + description = S("Multigrain Flour"), + inventory_image = "farming_flour_multigrain.png", + groups = {food_flour = 1, flammable = 1}, +}) + + +-- Multigrain bread + +minetest.register_craftitem("farming:bread_multigrain", { + description = S("Multigrain Bread"), + inventory_image = "farming_bread_multigrain.png", + on_use = minetest.item_eat(7), + groups = {food_bread = 1, compostability = 65} +}) + +farming.add_eatable("farming:bread_multigrain", 7) + +-- Soy sauce + +minetest.register_node("farming:soy_sauce", { + description = S("Soy Sauce"), + drawtype = "plantlike", + tiles = {"farming_soy_sauce.png"}, + inventory_image = "farming_soy_sauce.png", + wield_image = "farming_soy_sauce.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = { + vessel = 1, food_soy_sauce = 1, dig_immediate = 3, attached_node = 1, + compostability = 65, handy = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_glass_defaults() +}) + +-- Soy milk + +minetest.register_node("farming:soy_milk", { + description = S("Soy Milk"), + drawtype = "plantlike", + tiles = {"farming_soy_milk_glass.png"}, + inventory_image = "farming_soy_milk_glass.png", + wield_image = "farming_soy_milk_glass.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = { + vessel = 1, food_milk_glass = 1, dig_immediate = 3, handy = 1, + attached_node = 1, drink = 1, compostability = 65 + }, + is_ground_content = false, + sounds = farming.node_sound_glass_defaults() +}) + +farming.add_eatable("farming:soy_milk", 2) + +-- Tofu + +minetest.register_craftitem("farming:tofu", { + description = S("Tofu"), + inventory_image = "farming_tofu.png", + groups = { + food_tofu = 1, food_meat_raw = 1, compostability = 65, + }, + on_use = minetest.item_eat(3) +}) + +farming.add_eatable("farming:tofu", 3) + +-- Cooked tofu + +minetest.register_craftitem("farming:tofu_cooked", { + description = S("Cooked Tofu"), + inventory_image = "farming_tofu_cooked.png", + groups = {food_meat = 1, compostability = 65}, + on_use = minetest.item_eat(6) +}) + +farming.add_eatable("farming:tofu_cooked", 6) + +-- Toasted sunflower seeds + +minetest.register_craftitem("farming:sunflower_seeds_toasted", { + description = S("Toasted Sunflower Seeds"), + inventory_image = "farming_sunflower_seeds_toasted.png", + groups = {food_sunflower_seeds_toasted = 1, compostability = 65}, + on_use = minetest.item_eat(1) +}) + +farming.add_eatable("farming:sunflower_seeds_toasted", 1) + +-- Sunflower oil + +minetest.register_node("farming:sunflower_oil", { + description = S("Bottle of Sunflower Oil"), + drawtype = "plantlike", + tiles = {"farming_sunflower_oil.png"}, + inventory_image = "farming_sunflower_oil.png", + wield_image = "farming_sunflower_oil.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = { + food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1, + flammable = 2, compostability = 65, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +-- Sunflower seed bread + +minetest.register_craftitem("farming:sunflower_bread", { + description = S("Sunflower Seed Bread"), + inventory_image = "farming_sunflower_bread.png", + on_use = minetest.item_eat(8), + groups = {food_bread = 1} +}) + +farming.add_eatable("farming:sunflower_bread", 8) + +-- Vanilla extract + +minetest.register_node("farming:vanilla_extract", { + description = S("Vanilla Extract"), + drawtype = "plantlike", + tiles = {"farming_vanilla_extract.png"}, + inventory_image = "farming_vanilla_extract.png", + wield_image = "farming_vanilla_extract.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + sounds = farming.node_sound_glass_defaults(), +}) + +-- Jerusalem Artichokes with miso butter + +minetest.register_craftitem("farming:jerusalem_artichokes", { + description = S("Jerusalem Artichokes"), + inventory_image = "farming_jerusalem_artichokes.png", + on_use = minetest.item_eat(11, a.bowl) +}) + +farming.add_eatable("ethereal:jerusalem_artichokes", 11) + +--= Foods we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Bread + + minetest.register_craftitem("farming:bread", { + description = S("Bread"), + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), + groups = {food_bread = 1} + }) + + farming.add_eatable("farming:bread", 5) + + -- Cocoa beans + + minetest.register_craftitem("farming:cocoa_beans", { + description = S("Cocoa Beans"), + inventory_image = "farming_cocoa_beans.png", + groups = {compostability = 65, food_cocoa = 1, flammable = 2} + }) + + -- Chocolate cookie + + minetest.register_craftitem("farming:cookie", { + description = S("Cookie"), + inventory_image = "farming_cookie.png", + on_use = minetest.item_eat(2) + }) + + farming.add_eatable("farming:cookie", 2) + + -- Golden carrot + + minetest.register_craftitem("farming:carrot_gold", { + description = S("Golden Carrot"), + inventory_image = "farming_carrot_gold.png", + on_use = minetest.item_eat(10) + }) + + farming.add_eatable("farming:carrot_gold", 10) + + -- Beetroot soup + + minetest.register_craftitem("farming:beetroot_soup", { + description = S("Beetroot Soup"), + inventory_image = "farming_beetroot_soup.png", + on_use = minetest.item_eat(6, "farming:bowl"), + groups = {drink = 1} + }) + + farming.add_eatable("farming:beetroot_soup", 6) + + -- Sugar + + minetest.register_craftitem("farming:sugar", { + description = S("Sugar"), + inventory_image = "farming_sugar.png", + groups = {food_sugar = 1, flammable = 3} + }) + + -- Baked potato + + minetest.register_craftitem("farming:baked_potato", { + description = S("Baked Potato"), + inventory_image = "farming_baked_potato.png", + on_use = minetest.item_eat(6) + }) + + farming.add_eatable("farming:baked_potato", 6) +end diff --git a/mods/farming/item_list.lua b/mods/farming/item_list.lua new file mode 100644 index 00000000..078c440f --- /dev/null +++ b/mods/farming/item_list.lua @@ -0,0 +1,126 @@ + +-- add group helper + +local function add_groups(item, groups) + + local def = minetest.registered_items[item] + + if def then + + local grps = table.copy(def.groups) or {} + + for k, v in pairs(groups) do + grps[k] = v + end + + minetest.override_item(item, {groups = grps}) + end +end + +-- default recipe items + +farming.recipe_items = { + + -- if utensils are disabled then use blank item + saucepan = farming.use_utensils and "farming:saucepan" or "", + pot = farming.use_utensils and "farming:pot" or "", + baking_tray = farming.use_utensils and "farming:baking_tray" or "", + skillet = farming.use_utensils and "farming:skillet" or "", + mortar_pestle = farming.use_utensils and "farming:mortar_pestle" or "", + cutting_board = farming.use_utensils and "farming:cutting_board" or "", + juicer = farming.use_utensils and "farming:juicer" or "", + mixing_bowl = farming.use_utensils and "farming:mixing_bowl" or "", + + water_source = "default:water_source", + river_water_source = "default:river_water_source", + bucket_empty = "bucket:bucket_empty", + bucket_water = "bucket:bucket_water", + bucket_river_water = "bucket:bucket_river_water", + drinking_glass = "vessels:drinking_glass", + glass_bottle = "vessels:glass_bottle", + sugar = "farming:sugar", + rose = "flowers:rose", + dye_red = "dye:red", + dye_pink = "dye:pink", + dye_orange = "dye:orange", + dye_green = "dye:green", + dye_brown = "dye:brown", + dye_blue = "dye:blue", + dye_violet = "dye:violet", + dye_yellow = "dye:yellow", + bowl = "farming:bowl", + flour = "group:food_flour", + bread = "farming:bread", + cactus = "default:cactus", + paper = "default:paper", + snow = "default:snow", + string = "farming:string", + wool = "wool:white", + steel_ingot = "default:steel_ingot", + clay_brick = "default:clay_brick", + stone = "default:stone", + glass = "default:glass", +} + +add_groups("default:apple", {food_apple = 1}) + + +-- if mineclone found then change recipe items + +if farming.mcl then + + local a = farming.recipe_items + + a.water_source = "mcl_core:water_source" + a.river_water_source = "mclx_core:river_water_source" + a.bucket_empty = "mcl_buckets:bucket_empty" + a.bucket_water = "mcl_buckets:bucket_water" + a.bucket_river_water = "mcl_buckets:bucket_river_water" + a.drinking_glass = "mcl_potions:glass_bottle" + a.glass_bottle = "mcl_potions:glass_bottle" + a.sugar = "mcl_core:sugar" + a.rose = "mcl_flowers:rose_bush" + a.dye_red = "mcl_dye:red" + a.dye_pink = "mcl_dye:pink" + a.dye_orange = "mcl_dye:orange" + a.dye_green = "mcl_dye:green" + a.dye_brown = "mcl_dye:brown" + a.dye_blue = "mcl_dye:blue" + a.dye_violet = "mcl_dye:violet" + a.dye_yellow = "mcl_dye:yellow" + a.bowl = "mcl_core:bowl" +-- a.flour = "mcl_farming:bread" + a.bread = "mcl_farming:bread" + a.cactus = "mcl_core:cactus" + a.paper = "mcl_core:paper" + a.snow = "mcl_throwing:snowball" + a.string = "mcl_mobitems:string" + a.wool = "mcl_wool:white" + a.steel_ingot = "mcl_core:iron_ingot" + a.clay_brick = "mcl_core:clay_lump" + a.stone = "mcl_core:stone" + a.glass = "mcl_core:glass" + + -- add missing groups for recipes to work properly + + add_groups("mcl_core:sugar", {food_sugar = 1}) + add_groups("mcl_throwing:egg", {food_egg = 1}) + add_groups("mcl_farming:wheat_item", {food_wheat = 1}) + add_groups("mcl_cocoas:cocoa_beans", {food_cocoa = 1}) + add_groups("mcl_core:apple", {food_apple = 1}) + add_groups("mcl_core:bowl", {food_bowl = 1}) + add_groups("mcl_mobitems:chicken", {food_chicken_raw = 1}) + add_groups("mcl_mobitems:cooked_chicken", {food_chicken = 1}) + add_groups("mcl_mushrooms:mushroom_brown", {food_mushroom = 1}) + add_groups("mcl_farming:carrot_item", {food_carrot = 1}) + add_groups("mcl_mobitems:cooked_beef", {food_meat = 1}) + add_groups("mcl_mobitems:beef", {food_meat_raw = 1}) + add_groups("mcl_farming:potato_item", {food_potato = 1}) + add_groups("mcl_farming:bread", {food_bread = 1}) + add_groups("mcl_mobitems:milk_bucket", {food_milk = 1}) + add_groups("mcl_ocean:dried_kelp", {food_seaweed = 1}) + add_groups("mcl_potions:river_water", {food_glass_water = 1}) + add_groups("mcl_dye:yellow", {food_lemon = 1, food_banana = 1}) + add_groups("mcl_dye:orange", {food_orange = 1}) + add_groups("mcl_flowers:sunflower", {food_olive_oil = 1, food_butter = 1}) +end diff --git a/mods/farming/item_non_food.lua b/mods/farming/item_non_food.lua new file mode 100644 index 00000000..99b4f3ae --- /dev/null +++ b/mods/farming/item_non_food.lua @@ -0,0 +1,270 @@ + +local S = minetest.get_translator("farming") + +-- saucepan + +minetest.register_craftitem("farming:saucepan", { + description = S("Saucepan"), + inventory_image = "farming_saucepan.png", + groups = {food_saucepan = 1, flammable = 2} +}) + +-- cooking pot + +minetest.register_craftitem("farming:pot", { + description = S("Cooking Pot"), + inventory_image = "farming_pot.png", + groups = {food_pot = 1, flammable = 2} +}) + +-- baking tray + +minetest.register_craftitem("farming:baking_tray", { + description = S("Baking Tray"), + inventory_image = "farming_baking_tray.png", + groups = {food_baking_tray = 1, flammable = 2} +}) + +-- skillet + +minetest.register_craftitem("farming:skillet", { + description = S("Skillet"), + inventory_image = "farming_skillet.png", + groups = {food_skillet = 1, flammable = 2} +}) + +-- mortar & pestle + +minetest.register_craftitem("farming:mortar_pestle", { + description = S("Mortar and Pestle"), + inventory_image = "farming_mortar_pestle.png", + groups = {food_mortar_pestle = 1, flammable = 2} +}) + +-- cutting board + +minetest.register_craftitem("farming:cutting_board", { + description = S("Cutting Board"), + inventory_image = "farming_cutting_board.png", + groups = {food_cutting_board = 1, flammable = 2} +}) + +-- juicer + +minetest.register_craftitem("farming:juicer", { + description = S("Juicer"), + inventory_image = "farming_juicer.png", + groups = {food_juicer = 1, flammable = 2} +}) + +-- glass mixing bowl + +minetest.register_craftitem("farming:mixing_bowl", { + description = S("Glass Mixing Bowl"), + inventory_image = "farming_mixing_bowl.png", + groups = {food_mixing_bowl = 1, flammable = 2} +}) + +-- Ethanol (thanks to JKMurray for this idea) + +minetest.register_node("farming:bottle_ethanol", { + description = S("Bottle of Ethanol"), + drawtype = "plantlike", + tiles = {"farming_bottle_ethanol.png"}, + inventory_image = "farming_bottle_ethanol.png", + wield_image = "farming_bottle_ethanol.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + sounds = farming.node_sound_glass_defaults() +}) + +-- straw + +minetest.register_node("farming:straw", { + description = S("Straw"), + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {handy = 1, snappy = 3, flammable = 4, fall_damage_add_percent = -30}, + sounds = farming.node_sound_leaves_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- hemp oil + +minetest.register_node("farming:hemp_oil", { + description = S("Bottle of Hemp Oil"), + drawtype = "plantlike", + tiles = {"farming_hemp_oil.png"}, + inventory_image = "farming_hemp_oil.png", + wield_image = "farming_hemp_oil.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = { + food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1, + compostability = 45, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +-- hemp fibre + +minetest.register_craftitem("farming:hemp_fibre", { + description = S("Hemp Fibre"), + inventory_image = "farming_hemp_fibre.png", + groups = {compostability = 55} +}) + +-- hemp block + +minetest.register_node("farming:hemp_block", { + description = S("Hemp Block"), + tiles = {"farming_hemp_block.png"}, + paramtype = "light", + groups = { + axey = 1, handy = 1, snappy = 2, oddly_breakable_by_hand = 1, flammable = 2, + compostability = 85 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- hemp rope + +minetest.register_node("farming:hemp_rope", { + description = S("Hemp Rope"), + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + tiles = {"farming_hemp_rope.png"}, + wield_image = "farming_hemp_rope.png", + inventory_image = "farming_hemp_rope.png", + drawtype = "plantlike", + groups = { + handy = 1, axey = 1, swordy = 1, flammable = 2, choppy = 3, + oddly_breakable_by_hand = 3, compostability = 55 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7} + }, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +--- Wooden scarecrow base + +minetest.register_node("farming:scarecrow_bottom", { + description = S("Scarecrow Bottom"), + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + tiles = {"default_wood.png"}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}, + {-12/16, 4/16, -1/16, 12/16, 2/16, 1/16}, + } + }, + groups = {axey = 1, handy = 1, snappy = 3, flammable = 2}, + is_ground_content = false, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +--= Items we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Wooden bowl + + minetest.register_craftitem("farming:bowl", { + description = S("Wooden Bowl"), + inventory_image = "farming_bowl.png", + groups = {food_bowl = 1, flammable = 2} + }) + + -- String + + minetest.register_craftitem("farming:string", { + description = S("String"), + inventory_image = "farming_string.png", + groups = {flammable = 2} + }) + + -- Jack 'O Lantern + + minetest.register_node("farming:jackolantern", { + description = S("Jack 'O Lantern (punch to turn on and off)"), + tiles = { + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", + "farming_pumpkin_bottom.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png^farming_pumpkin_face_off.png" + }, + paramtype2 = "facedir", + groups = { + handy = 1, snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 + }, + is_ground_content = false, + sounds = farming.node_sound_wood_defaults(), + + on_punch = function(pos, node, puncher) + local name = puncher:get_player_name() or "" + if minetest.is_protected(pos, name) then return end + node.name = "farming:jackolantern_on" + minetest.swap_node(pos, node) + end, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 + }) + + minetest.register_node("farming:jackolantern_on", { + tiles = { + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", + "farming_pumpkin_bottom.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png^farming_pumpkin_face_on.png" + }, + light_source = minetest.LIGHT_MAX - 1, + paramtype2 = "facedir", + groups = { + handy = 1, snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, + not_in_creative_inventory = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_wood_defaults(), + drop = "farming:jackolantern", + + on_punch = function(pos, node, puncher) + local name = puncher:get_player_name() or "" + if minetest.is_protected(pos, name) then return end + node.name = "farming:jackolantern" + minetest.swap_node(pos, node) + end, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 + }) +end diff --git a/mods/farming/item_recipes.lua b/mods/farming/item_recipes.lua new file mode 100644 index 00000000..8cb77ad5 --- /dev/null +++ b/mods/farming/item_recipes.lua @@ -0,0 +1,1421 @@ + +local a = farming.recipe_items + +-- flour recipes + +minetest.register_craft({ + output = "farming:flour", + recipe = { + {"farming:rye", "farming:rye", "farming:rye"}, + {"farming:rye", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +minetest.register_craft({ + output = "farming:flour", + recipe = { + {"farming:barley", "farming:barley", "farming:barley"}, + {"farming:barley", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +minetest.register_craft({ + output = "farming:flour", + recipe = { + {"farming:oat", "farming:oat", "farming:oat"}, + {"farming:oat", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- multigrain flour + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour_multigrain", + recipe = { + "group:food_wheat", "group:food_barley", "group:food_oats", + "group:food_rye", a.mortar_pestle + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- multigrain bread + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread_multigrain", + recipe = "farming:flour_multigrain" +}) + +-- sliced bread + +minetest.register_craft({ + output = "farming:bread_slice 5", + recipe = {{"group:food_bread", a.cutting_board}}, + replacements = {{"group:food_cutting_board", "farming:cutting_board"}} +}) + +-- toast + +minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "farming:toast", + recipe = "farming:bread_slice" +}) + +-- toast sandwich + +minetest.register_craft({ + output = "farming:toast_sandwich", + recipe = { + {"farming:bread_slice"}, + {"farming:toast"}, + {"farming:bread_slice"} + } +}) + +-- garlic bulb + +minetest.register_craft({ + output = "farming:garlic_clove 8", + recipe = {{"farming:garlic"}} +}) + +minetest.register_craft({ + output = "farming:garlic", + recipe = { + {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"}, + {"farming:garlic_clove", "", "farming:garlic_clove"}, + {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"} + } +}) + +-- garlic braid + +minetest.register_craft({ + output = "farming:garlic_braid", + recipe = { + {"farming:garlic", "farming:garlic", "farming:garlic"}, + {"farming:garlic", "farming:garlic", "farming:garlic"}, + {"farming:garlic", "farming:garlic", "farming:garlic"} + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:garlic 9", + recipe = {"farming:garlic_braid"} +}) + +-- corn on the cob + +minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "farming:corn_cob", + recipe = "group:food_corn" +}) + +-- popcorn + +minetest.register_craft({ + output = "farming:popcorn", + recipe = { + {"group:food_oil", "group:food_corn", a.pot} + }, + replacements = { + {"group:food_pot", "farming:pot"}, + {"group:food_oil", "vessels:glass_bottle"} + } +}) + +-- cornstarch + +minetest.register_craft({ + output = "farming:cornstarch", + recipe = { + {a.mortar_pestle, "group:food_corn_cooked", a.baking_tray}, + {"", "group:food_bowl", ""}, + }, + replacements = { + {"group:food_mortar_pestle", "farming:mortar_pestle"}, + {"group:food_baking_tray", "farming:baking_tray"} + } +}) + +-- ethanol + +minetest.register_craft( { + output = "farming:bottle_ethanol", + recipe = { + {"group:food_corn", "group:food_corn", "group:food_corn"}, + {"group:food_corn", a.glass_bottle, "group:food_corn"}, + {"group:food_corn", "group:food_corn", "group:food_corn"} + } +}) + +-- cup of coffee + +minetest.register_craft( { + output = "farming:coffee_cup", + recipe = { + {"group:food_coffee", "group:food_glass_water", a.saucepan} + }, + replacements = { + {"group:food_saucepan", "farming:saucepan"} + } +}) + +-- bar of dark chocolate + +minetest.register_craft( { + output = "farming:chocolate_dark", + recipe = { + {"group:food_cocoa", "group:food_cocoa", "group:food_cocoa"} + } +}) + +-- chocolate block + +minetest.register_craft({ + output = "farming:chocolate_block", + recipe = { + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"} + } +}) + +minetest.register_craft({ + output = "farming:chocolate_dark 9", + recipe = {{"farming:chocolate_block"}} +}) + +-- chili powder + +minetest.register_craft({ + output = "farming:chili_powder", + recipe = { + {"farming:chili_pepper", a.mortar_pestle} + }, + replacements = {{"farming:mortar_pestle", "farming:mortar_pestle"}} +}) + +-- bowl of chili + +minetest.register_craft({ + output = "farming:chili_bowl", + recipe = { + {"group:food_chili_pepper", "group:food_rice", "group:food_tomato"}, + {"group:food_beans", "group:food_bowl", ""} + } +}) + +-- carrot juice + +minetest.register_craft({ + output = "farming:carrot_juice", + recipe = { + {a.juicer}, + {"group:food_carrot"}, + {"vessels:drinking_glass"} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- blueberry pie + +minetest.register_craft({ + output = "farming:blueberry_pie", + recipe = { + {"group:food_flour", "group:food_sugar", "group:food_blueberries"}, + {"", a.baking_tray, ""} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- blueberry muffin + +minetest.register_craft({ + output = "farming:muffin_blueberry 2", + recipe = { + {"group:food_blueberries", "group:food_bread", "group:food_blueberries"} + } +}) + +-- tomato soup + +minetest.register_craft({ + output = "farming:tomato_soup", + recipe = { + {"group:food_tomato"}, + {"group:food_tomato"}, + {"group:food_bowl"} + } +}) + +-- filter sea water into river water + +minetest.register_craft({ + output = a.bucket_river_water, + recipe = { + {"farming:hemp_fibre"}, + {"farming:hemp_fibre"}, + {a.bucket_water} + } +}) + +if farming.mcl then + + minetest.register_craft({ + output = "mcl_potions:river_water", + recipe = { + {"farming:hemp_fibre"}, + {"mcl_potions:water"} + } + }) +end + +-- glass of water + +minetest.register_craft({ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {a.bucket_river_water, ""} + }, + replacements = {{a.bucket_river_water, a.bucket_empty}} +}) + +minetest.register_craft({ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {a.bucket_water, "farming:hemp_fibre"} + }, + replacements = {{a.bucket_water, a.bucket_empty}} +}) + +if minetest.get_modpath("bucket_wooden") then + + minetest.register_craft({ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {"group:water_bucket_wooden", "farming:hemp_fibre"} + }, + replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} + }) +end + +-- sugar cube + +minetest.register_craft({ + output = "farming:sugar_cube", + recipe = { + {a.sugar, a.sugar, a.sugar}, + {a.sugar, a.sugar, a.sugar}, + {a.sugar, a.sugar, a.sugar} + } +}) + +minetest.register_craft({ + output = a.sugar .. " 9", + recipe = {{"farming:sugar_cube"}} +}) + +-- caramel + +minetest.register_craft({ + type = "cooking", + cooktime = 6, + output = "farming:caramel", + recipe = "group:food_sugar" +}) + +-- salt + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:salt", + recipe = a.bucket_water, + replacements = {{a.bucket_water, a.bucket_empty}} +}) + +-- salt crystal + +minetest.register_craft({ + output = "farming:salt 9", + recipe = { + {"farming:salt_crystal", a.mortar_pestle} + }, + replacements = {{"farming:mortar_pestle", "farming:mortar_pestle"}} +}) + +minetest.register_craft({ + output = "farming:salt_crystal", + recipe = { + {"farming:salt", "farming:salt", "farming:salt"}, + {"farming:salt", "farming:salt", "farming:salt"}, + {"farming:salt", "farming:salt", "farming:salt"} + } +}) + +-- mayonnaise + +minetest.register_craft({ + output = "farming:mayonnaise", + recipe = { + {"group:food_olive_oil", "group:food_lemon"}, + {"group:food_egg", "farming:salt"} + }, + replacements = {{"farming:olive_oil", a.glass_bottle}} +}) + +-- rose water + +minetest.register_craft({ + output = "farming:rose_water", + recipe = { + {a.rose, a.rose, a.rose}, + {a.rose, a.rose, a.rose}, + {"group:food_glass_water", a.pot, a.glass_bottle} + }, + replacements = { + {"group:food_glass_water", a.drinking_glass}, + {"group:food_pot", "farming:pot"} + } +}) + +-- turkish delight + +minetest.register_craft({ + output = "farming:turkish_delight 4", + recipe = { + {"group:food_gelatin", "group:food_sugar", "group:food_gelatin"}, + {"group:food_sugar", "group:food_rose_water", "group:food_sugar"}, + {"group:food_sugar", a.dye_pink, "group:food_sugar"} + }, + replacements = { + {"group:food_cornstarch", a.bowl}, + {"group:food_cornstarch", a.bowl}, + {"group:food_rose_water", a.glass_bottle} + } +}) + +-- garlic bread + +minetest.register_craft({ + output = "farming:garlic_bread", + recipe = { + {"group:food_toast", "group:food_garlic_clove", "group:food_garlic_clove"} + } +}) + +-- donuts + +minetest.register_craft({ + output = "farming:donut 3", + recipe = { + {"", "group:food_wheat", ""}, + {"group:food_wheat", "group:food_sugar", "group:food_wheat"}, + {"", "group:food_wheat", ""} + } +}) + +minetest.register_craft({ + output = "farming:donut_chocolate", + recipe = { + {"group:food_cocoa"}, + {"farming:donut"} + } +}) + +minetest.register_craft({ + output = "farming:donut_apple", + recipe = { + {"group:food_apple"}, + {"farming:donut"} + } +}) + +-- porridge oats + +minetest.register_craft({ + output = "farming:porridge", + recipe = { + {"group:food_oats", "group:food_oats", "group:food_oats"}, + {"group:food_oats", "group:food_bowl", "group:food_milk_glass"} + }, + replacements = { + {"mobs:glass_milk", a.drinking_glass}, + {"farming:soy_milk", a.drinking_glass} + } +}) + +-- jaffa cake + +minetest.register_craft({ + output = "farming:jaffa_cake 3", + recipe = { + {a.baking_tray, "group:food_egg", "group:food_sugar"}, + {a.flour, "group:food_cocoa", "group:food_orange"}, + {"group:food_milk", "", ""} + }, + replacements = { + {"farming:baking_tray", "farming:baking_tray"}, + {"mobs:bucket_milk", a.bucket_empty}, + {"mobs:wooden_bucket_milk", "wooden_bucket:bucket_wood_empty"}, + {"farming:soy_milk", a.drinking_glass} + } +}) + +-- apple pie + +minetest.register_craft({ + output = "farming:apple_pie", + recipe = { + {a.flour, "group:food_sugar", "group:food_apple"}, + {"", a.baking_tray, ""} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- cactus juice + +minetest.register_craft({ + output = "farming:cactus_juice", + recipe = { + {a.juicer}, + {a.cactus}, + {a.drinking_glass} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- pasta + +minetest.register_craft({ + output = "farming:pasta", + recipe = { + {a.flour, "group:food_butter", a.mixing_bowl} + }, + replacements = {{"group:food_mixing_bowl", "farming:mixing_bowl"}} +}) + +minetest.register_craft({ + output = "farming:pasta", + recipe = { + {a.flour, "group:food_oil", a.mixing_bowl} + }, + replacements = { + {"group:food_mixing_bowl", "farming:mixing_bowl"}, + {"group:food_oil", a.glass_bottle} + } +}) + +-- mac & cheese + +minetest.register_craft({ + output = "farming:mac_and_cheese", + recipe = { + {"group:food_pasta", "group:food_cheese", "group:food_bowl"} + } +}) + +-- spaghetti + +minetest.register_craft({ + output = "farming:spaghetti", + recipe = { + {"group:food_pasta", "group:food_tomato", a.saucepan}, + {"group:food_garlic_clove", "group:food_garlic_clove", ""} + }, + replacements = {{"group:food_saucepan", "farming:saucepan"}} +}) + +-- korean bibimbap + +minetest.register_craft({ + output = "farming:bibimbap", + recipe = { + {a.skillet, "group:food_bowl", "group:food_egg"}, + {"group:food_rice", "group:food_chicken_raw", "group:food_cabbage"}, + {"group:food_carrot", "group:food_chili_pepper", ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +minetest.register_craft({ + output = "farming:bibimbap", + type = "shapeless", + recipe = { + a.skillet, "group:food_bowl", "group:food_mushroom", + "group:food_rice", "group:food_cabbage", "group:food_carrot", + "group:food_mushroom", "group:food_chili_pepper" + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- burger + +minetest.register_craft({ + output = "farming:burger", + recipe = { + {a.bread, "group:food_meat", "group:food_cheese"}, + {"group:food_tomato", "group:food_cucumber", "group:food_onion"}, + {"group:food_lettuce", "", ""} + } +}) + +-- salad + +minetest.register_craft({ + output = "farming:salad", + type = "shapeless", + recipe = { + "group:food_bowl", "group:food_tomato", "group:food_cucumber", + "group:food_lettuce", "group:food_oil" + } +}) + +-- triple berry smoothie + +minetest.register_craft({ + output = "farming:smoothie_berry", + type = "shapeless", + recipe = { + "group:food_raspberries", "group:food_blackberries", + "group:food_strawberry", "group:food_banana", + a.drinking_glass + } +}) + +-- patatas a la importancia + +minetest.register_craft({ + output = "farming:spanish_potatoes", + recipe = { + {"group:food_potato", "group:food_parsley", "group:food_potato"}, + {"group:food_egg", a.flour, "group:food_onion"}, + {"farming:garlic_clove", "group:food_bowl", a.skillet} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- potato omelette + +minetest.register_craft({ + output = "farming:potato_omelet", + recipe = { + {"group:food_egg", "group:food_potato", "group:food_onion"}, + {a.skillet, "group:food_bowl", ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- paella + +minetest.register_craft({ + output = "farming:paella", + recipe = { + {"group:food_rice", a.dye_orange, "farming:pepper_red"}, + {"group:food_peas", "group:food_chicken", "group:food_bowl"}, + {"", a.skillet, ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- vanilla flan + +minetest.register_craft({ + output = "farming:flan", + recipe = { + {"group:food_sugar", "group:food_milk", "farming:caramel"}, + {"group:food_egg", "group:food_egg", "farming:vanilla_extract"} + }, + replacements = { + {"cucina_vegana:soy_milk", a.drinking_glass}, + {"mobs:bucket_milk", "bucket:bucket_empty"}, + {"mobs:wooden_bucket_milk", "wooden_bucket:bucket_wood_empty"}, + {"farming:vanilla_extract", a.glass_bottle} + } +}) + +-- vegan cheese + +minetest.register_craft({ + output = "farming:cheese_vegan", + recipe = { + {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, + {"group:food_salt", "group:food_peppercorn", "farming:bottle_ethanol"}, + {"group:food_gelatin", a.pot, ""} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 3"}, + {"farming:pot", "farming:pot"}, + {"farming:bottle_ethanol", a.glass_bottle} + } +}) + +minetest.register_craft({ + output = "farming:cheese_vegan", + recipe = { + {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, + {"group:food_salt", "group:food_peppercorn", "group:food_lemon"}, + {"group:food_gelatin", a.pot, ""} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 3"}, + {"farming:pot", "farming:pot"} + } +}) + +-- vegan butter + +minetest.register_craft({ + output = "farming:butter_vegan", + recipe = { + {"farming:soy_milk", "farming:sunflower_oil", "farming:soy_milk"}, + {"group:food_salt", a.dye_yellow, "farming:mixing_bowl"} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 2"}, + {"farming:sunflower_oil", a.glass_bottle}, + {"farming:mixing_bowl", "farming:mixing_bowl"} + } +}) + +-- onigiri + +minetest.register_craft({ + output = "farming:onigiri", + recipe = { + {"group:food_rice", "group:food_salt", "group:food_rice"}, + {"", "group:food_seaweed", ""} + } +}) + +-- gyoza + +minetest.register_craft({ + output = "farming:gyoza 4", + recipe = { + {"group:food_cabbage", "group:food_garlic_clove", "group:food_onion"}, + {"group:food_meat_raw", "group:food_salt", a.flour}, + {"", a.skillet, ""} + + }, + replacements = { + {"group:food_skillet", "farming:skillet"} + } +}) + +-- mochi + +minetest.register_craft({ + output = "farming:mochi", + recipe = { + {"", a.mortar_pestle, ""}, + {"group:food_rice", "group:food_sugar", "group:food_rice"}, + {"", "group:food_glass_water", ""} + }, + replacements = { + {"group:food_mortar_pestle", "farming:mortar_pestle"}, + {"group:food_glass_water", a.drinking_glass} + } +}) + +-- gingerbread man + +minetest.register_craft({ + output = "farming:gingerbread_man 3", + recipe = { + {"", "group:food_egg", ""}, + {"group:food_wheat", "group:food_ginger", "group:food_wheat"}, + {"group:food_sugar", "", "group:food_sugar"} + } +}) + +-- mint tea + +minetest.register_craft({ + output = "farming:mint_tea", + recipe = { + {"group:food_mint", "group:food_mint", "group:food_mint"}, + {"group:food_glass_water", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- onion soup + +minetest.register_craft({ + output = "farming:onion_soup", + recipe = { + {"group:food_onion", "group:food_onion", "group:food_onion"}, + {"group:food_onion", "group:food_bowl", "group:food_onion"}, + {"", a.pot, ""} + }, + replacements = {{"farming:pot", "farming:pot"}} +}) + +-- pea soup + +minetest.register_craft({ + output = "farming:pea_soup", + recipe = { + {"group:food_peas"}, + {"group:food_peas"}, + {"group:food_bowl"} + } +}) + +-- ground pepper + +minetest.register_craft( { + output = "farming:pepper_ground", + recipe = { + {"group:food_peppercorn"}, + {a.glass_bottle}, + {a.mortar_pestle} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- pineapple ring + +minetest.register_craft( { + output = "farming:pineapple_ring 5", + recipe = {{"group:food_pineapple"}}, + replacements = {{"farming:pineapple", "farming:pineapple_top"}} +}) + +-- pineapple juice + +minetest.register_craft({ + output = "farming:pineapple_juice", + recipe = { + {"group:food_pineapple_ring", "group:food_pineapple_ring", + "group:food_pineapple_ring"}, + {"", a.drinking_glass, ""}, + {"", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +minetest.register_craft({ + output = "farming:pineapple_juice 2", + recipe = { + {a.drinking_glass, "group:food_pineapple", a.drinking_glass}, + {"", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- potato & cucumber salad + +minetest.register_craft({ + output = "farming:potato_salad", + recipe = { + {"group:food_cucumber"}, + {"farming:baked_potato"}, + {"group:food_bowl"} + } +}) + +-- melon slice / block + +minetest.register_craft({ + output = "farming:melon_8", + recipe = { + {"farming:melon_slice", "farming:melon_slice"}, + {"farming:melon_slice", "farming:melon_slice"} + } +}) + +minetest.register_craft({ + output = "farming:melon_slice 4", + recipe = {{"farming:melon_8", a.cutting_board}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- pumpkin slice / block + +minetest.register_craft({ + output = "farming:pumpkin", + recipe = { + {"farming:pumpkin_slice", "farming:pumpkin_slice"}, + {"farming:pumpkin_slice", "farming:pumpkin_slice"} + } +}) + +minetest.register_craft({ + output = "farming:pumpkin_slice 4", + recipe = {{"farming:pumpkin", a.cutting_board}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- pumpkin dough + +minetest.register_craft({ + output = "farming:pumpkin_dough", + recipe = { + {"group:food_pumpkin_slice", "group:food_flour", "group:food_pumpkin_slice"} + } +}) + +-- pumpkin bread + +minetest.register_craft({ + type = "cooking", + output = "farming:pumpkin_bread", + recipe = "farming:pumpkin_dough", + cooktime = 10 +}) + +-- raspberry smoothie + +minetest.register_craft({ + output = "farming:smoothie_raspberry", + recipe = { + {a.snow}, + {"group:food_raspberries"}, + {a.drinking_glass} + } +}) + +-- rhubarb pie + +minetest.register_craft({ + output = "farming:rhubarb_pie", + recipe = { + {a.baking_tray, "group:food_sugar", ""}, + {"group:food_rhubarb", "group:food_rhubarb", "group:food_rhubarb"}, + {"group:food_wheat", "group:food_wheat", "group:food_wheat"} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- rice flour + +minetest.register_craft({ + output = "farming:rice_flour", + recipe = { + {"farming:rice", "farming:rice", "farming:rice"}, + {"farming:rice", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- rice bread + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:rice_bread", + recipe = "farming:rice_flour" +}) + +-- soy sauce + +minetest.register_craft( { + output = "farming:soy_sauce", + recipe = { + {"group:food_soy", "group:food_salt", "group:food_soy"}, + {a.juicer, a.bucket_water, a.glass_bottle} + }, + replacements = { + {a.bucket_water, a.bucket_empty}, + {"group:food_juicer", "farming:juicer"} + } +}) + +-- soy milk + +minetest.register_craft( { + output = "farming:soy_milk", + recipe = { + {"group:food_soy", "group:food_soy", "group:food_soy"}, + {"farming:vanilla_extract", "bucket:bucket_water", a.drinking_glass} + }, + replacements = { + {a.bucket_water, a.bucket_empty}, + {"farming:vanilla_extract", a.glass_bottle} + } +}) + +-- tofu + +minetest.register_craft({ + output = "farming:tofu", + recipe = { + {"group:food_soy", "group:food_soy", "group:food_soy"}, + {"group:food_soy", "group:food_soy", a.baking_tray} + }, + replacements = {{"farming:baking_tray", "farming:baking_tray"}} +}) + +-- cooked tofu + +minetest.register_craft({ + type = "cooking", + output = "farming:tofu_cooked", + recipe = "farming:tofu", + cooktime = 5 +}) + +-- vanilla extract + +minetest.register_craft( { + output = "farming:vanilla_extract", + recipe = { + {"group:food_vanilla", "group:food_vanilla", "group:food_vanilla"}, + {"group:food_vanilla", "farming:bottle_ethanol", "group:food_glass_water"}, + }, + replacements = { + {"group:food_glass_water", a.drinking_glass} + } +}) + +-- jerusalem artichokes + +minetest.register_craft({ + output = "farming:jerusalem_artichokes", + recipe = { + {"group:food_artichoke", "group:food_garlic_clove", "group:food_artichoke"}, + {"group:food_soy", "group:food_salt", "group:food_soy"}, + {"group:food_butter", "group:food_skillet", "group:food_bowl"} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- wooden scarecrow base + +minetest.register_craft({ + output = "farming:scarecrow_bottom", + recipe = { + {"", "group:stick", ""}, + {"group:stick", "group:stick", "group:stick"}, + {"", "group:stick", ""} + } +}) + +-- beanpole + +minetest.register_craft({ + output = "farming:beanpole", + recipe = { + {"", "", ""}, + {"group:stick", "", "group:stick"}, + {"group:stick", "", "group:stick"} + } +}) + +-- trellis + +minetest.register_craft({ + output = "farming:trellis", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +-- cotton to wool + +minetest.register_craft({ + output = a.wool, + recipe = { + {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"} + } +}) + +-- string + +minetest.register_craft({ + output = a.string .. " 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"} + } +}) + +minetest.register_craft( { + output = "farming:cotton 3", + recipe = { + {"farming:hemp_fibre"}, + {"farming:hemp_fibre"}, + {"farming:hemp_fibre"} + } +}) + +-- saucepan + +minetest.register_craft({ + output = "farming:saucepan", + recipe = { + {a.steel_ingot, "", ""}, + {"", "group:stick", ""} + } +}) + +-- cooking pot + +minetest.register_craft({ + output = "farming:pot", + recipe = { + {"group:stick", a.steel_ingot, a.steel_ingot}, + {"", a.steel_ingot, a.steel_ingot} + } +}) + +-- baking tray + +minetest.register_craft({ + output = "farming:baking_tray", + recipe = { + {a.clay_brick, a.clay_brick, a.clay_brick}, + {a.clay_brick, "", a.clay_brick}, + {a.clay_brick, a.clay_brick, a.clay_brick} + } +}) + +-- skillet + +minetest.register_craft({ + output = "farming:skillet", + recipe = { + {a.steel_ingot, "", ""}, + {"", a.steel_ingot, ""}, + {"", "", "group:stick"} + } +}) + +-- mortar & pestle + +minetest.register_craft({ + output = "farming:mortar_pestle", + recipe = { + {"group:stone", "group:stick", "group:stone"}, + {"", "group:stone", ""} + } +}) + +-- cutting board + +minetest.register_craft({ + output = "farming:cutting_board", + recipe = { + {a.steel_ingot, "", ""}, + {"", "group:stick", ""}, + {"", "", "group:wood"} + } +}) + +-- juicer + +minetest.register_craft({ + output = "farming:juicer", + recipe = { + {"", "group:stone", ""}, + {"group:stone", "", "group:stone"} + } +}) + +-- glass mixing bowl + +minetest.register_craft({ + output = "farming:mixing_bowl", + recipe = { + {a.glass, "group:stick", a.glass}, + {"", a.glass, ""} + } +}) + +minetest.register_craft( { + output = "vessels:glass_fragments", + recipe = {{"farming:mixing_bowl"}} +}) + +-- hemp oil + +minetest.register_craft( { + output = "farming:hemp_oil", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"", a.glass_bottle, ""} + } +}) + +minetest.register_craft( { + output = "farming:hemp_oil", + recipe = { + {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, + {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, + {"farming:seed_hemp", a.glass_bottle, "farming:seed_hemp"} + } +}) + +-- hemp fibre + +minetest.register_craft( { + output = "farming:hemp_fibre 8", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "group:water_bucket", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} + }, + replacements = {{"group:water_bucket", a.bucket_empty}} +}) + +if minetest.get_modpath("bucket_wooden") then + + minetest.register_craft( { + output = "farming:hemp_fibre 8", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "group:water_bucket_wooden", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} + }, + replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} + }) +end + +-- hemp block + +minetest.register_craft( { + output = "farming:hemp_block", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- hemp rope + +minetest.register_craft( { + output = "farming:hemp_rope 6", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:cotton", "farming:cotton", "farming:cotton"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- paper + +minetest.register_craft( { + output = a.paper .. " 3", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- straw + +local tmp = farming.mcl and "farming:rye" or "farming:wheat" + +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {tmp, tmp, tmp}, + {tmp, tmp, tmp}, + {tmp, tmp, tmp} + } +}) + +minetest.register_craft({ + output = tmp .. " 3", + recipe = {{"farming:straw"}} +}) + +--= Recipes we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Wheat flour + + minetest.register_craft({ + output = "farming:flour", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} + }) + + -- Bread + + minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" + }) + + -- Cocoa beans + + minetest.register_craft({ + type = "cooking", + cooktime = 5, + output = "farming:cocoa_beans", + recipe = "farming:cocoa_beans_raw" + }) + + -- Chocolate cookie + + minetest.register_craft( { + output = "farming:cookie 8", + recipe = { + {"group:food_wheat", "group:food_cocoa", "group:food_wheat" } + } + }) + + -- Golden carrot + + minetest.register_craft({ + output = "farming:carrot_gold", + recipe = {{"group:food_carrot", "default:gold_lump"}} + }) + + -- Beetroot soup + + minetest.register_craft({ + output = "farming:beetroot_soup", + recipe = { + {"group:food_beetroot", "group:food_beetroot", "group:food_beetroot"}, + {"group:food_beetroot", "group:food_bowl", "group:food_beetroot"} + } + }) + + -- Sugar + + minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "farming:sugar 2", + recipe = "default:papyrus" + }) + + -- Baked potato + + minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "farming:baked_potato", + recipe = "group:food_potato" + }) + + -- Toasted sunflower seeds + + minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "farming:sunflower_seeds_toasted", + recipe = "farming:seed_sunflower" + }) + + -- Sunflower oil + + local tmp = "group:food_sunflower_seeds" + + minetest.register_craft( { + output = "farming:sunflower_oil", + recipe = { + {tmp, tmp, tmp}, + {tmp, tmp, tmp}, + {tmp, a.glass_bottle, tmp} + } + }) + + -- Sunflower seed bread + + minetest.register_craft({ + output = "farming:sunflower_bread", + recipe = { + { + "group:food_sunflower_seeds_toasted", + "group:food_bread", + "group:food_sunflower_seeds_toasted" + } + } + }) + + -- Jack 'o lantern + + minetest.register_craft({ + output = "farming:jackolantern", + recipe = { + {"default:torch"}, + {"group:food_pumpkin"} + } + }) + + -- Wooden bowl + + minetest.register_craft({ + output = "farming:bowl 4", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } + }) +end + +-- dye recipes + +minetest.register_craft({output = a.dye_green, recipe = {{"farming:beans"}}}) +minetest.register_craft({output = a.dye_red, recipe = {{"group:food_beetroot"}}}) +minetest.register_craft({output = a.dye_blue, recipe = {{"farming:blueberries"}}}) +minetest.register_craft({output = a.dye_red, recipe = {{"farming:chili_pepper"}}}) +minetest.register_craft({output = a.dye_brown, recipe = {{"farming:cocoa_beans"}}}) +minetest.register_craft({output = a.dye_violet, recipe = {{"farming:grapes"}}}) +minetest.register_craft({output = a.dye_yellow, recipe = {{"group:food_onion"}}}) + +-- fuel items + +minetest.register_craft({type = "fuel", recipe = "farming:straw", burntime = 3}) +minetest.register_craft({type = "fuel", recipe = "farming:wheat", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:bowl",burntime = 10}) +minetest.register_craft({type = "fuel", recipe = "farming:string", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:cotton", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:barley", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:beanpole", burntime = 10}) +minetest.register_craft({type = "fuel", recipe = "farming:trellis", burntime = 15}) +minetest.register_craft({type = "fuel", recipe = "farming:rice", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:rice_bread", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:bread_multigrain", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:rye", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:oat", burntime = 1}) +minetest.register_craft({type = "fuel", recipe = "farming:hemp_oil", + burntime = 20, replacements = {{"farming:hemp_oil", a.glass_bottle}}}) +minetest.register_craft({type = "fuel", recipe = "farming:bottle_ethanol", + burntime = 80, replacements = {{"farming:bottle_ethanol", a.glass_bottle}}}) +minetest.register_craft({type = "fuel", recipe = "farming:sunflower_oil", + burntime = 30, replacements = {{"farming:sunflower_oil", a.glass_bottle}}}) +minetest.register_craft({type = "fuel", recipe = "farming:vanilla_extract", + burntime = 25, replacements = {{"farming:vanilla_extract", a.glass_bottle}}}) diff --git a/mods/farming/item_stairs.lua b/mods/farming/item_stairs.lua new file mode 100644 index 00000000..6bfe6243 --- /dev/null +++ b/mods/farming/item_stairs.lua @@ -0,0 +1,35 @@ + +-- check and register stairs + +if minetest.global_exists("stairs") then + + if stairs.mod and stairs.mod == "redo" then + + stairs.register_all("straw", "farming:straw", + {snappy = 3, flammable = 4}, + {"farming_straw.png"}, + "Straw", + farming.node_sound_leaves_defaults()) + + stairs.register_all("hemp_block", "farming:hemp_block", + {snappy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"farming_hemp_block.png"}, + "Hemp Block", + farming.node_sound_leaves_defaults()) + else + + stairs.register_stair_and_slab("straw", "farming:straw", + {snappy = 3, flammable = 4}, + {"farming_straw.png"}, + "Straw Stair", + "Straw Slab", + farming.node_sound_leaves_defaults()) + + stairs.register_stair_and_slab("hemp_block", "farming:hemp_block", + {snappy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"farming_hemp_block.png"}, + "Hemp Block Stair", + "Hemp Block Slab", + farming.node_sound_leaves_defaults()) + end +end diff --git a/mods/farming/license.txt b/mods/farming/license.txt index 961a49fe..b3e9b074 100644 --- a/mods/farming/license.txt +++ b/mods/farming/license.txt @@ -23,6 +23,28 @@ THE SOFTWARE. License of media (textures): ---------------------------- + +Created by TenPlus1 (CC0): + alt_textures/ethereal_strawberry*.png + farming_spanish_potatoes.png + +Created by Hugues Ross (CC BY-SA 4.0): + ethereal_strawberry*.png + +Created by NameNotQuality (CC0): + farming_vanilla_flan.png + farming_spaghetti.png + +Created by Oz-tal (license: CC BY-SA 3.0): + crops_garlic_*.png + crops_onion.png + farming_cookie.png + farming_grapes.png + farming_vanilla.png + +Created by Shadall (CC0): + farming_burger.png + Created by PilzAdam (License: CC BY 3.0): farming_bread.png farming_soil.png @@ -63,10 +85,15 @@ Created by VanessaE (License: CC BY 3.0): farming_cotton_7.png farming_cotton_8.png -Created by 7eventy7 (https://www.planetminecraft.com/member/7eventy7/) +Created by alerikaisattera (License: CC-BY-SA 4.0) farming_melon_top.png farming_melon_side.png farming_melon_bottom.png + farming_pumpkin_bottom.png + farming_pumpkin_top.png + farming_pumpkin_side.png + farming_pumpkin_face_on.png + farming_pumpkin_face_off.png Created by Doc (License: CC BY 3.0): farming_cucumber.png @@ -125,15 +152,14 @@ Created by TenPlus1 (CC BY 3.0) farming_cocoa_2.png farming_cocoa_3.png farming_cocoa_beans.png - farming_cookie.png farming_raspberry_smoothie.png farming_rhubarb_1.png farming_rhubarb_2.png farming_rhubarb_3.png farming_rhubarb.png - farming_rhubarb_pie.png farming_hemp*.png farming_tofu*.png + farming_gingerbread_man.png Created by ademant (CC-BY-3.0) farming_rye*.png @@ -149,24 +175,27 @@ Created by VanessaE and edited by SpaghettiToastBook (CC0): Created by mDiyo (Natura), modified by TenPlus1 (License: CC BY-SA 3.0): farming_barley.png -Created by OgelGames (CC BY-SA 4.0) +Created by OgelGames (CC BY-SA 4.0): farming_berry_smoothie.png farming_cactus_juice.png farming_salad.png +Created by Huhues Ross (CC BY-SA 4.0): + farming_sunflower_bread.png + Created by Felfa (CC0) farming_blackberry*.png farming_lettuce*.png - farming_burger.png farming_soy*.png - farming_vanilla*.png + farming_vanilla_*.png farming_artichoke*.png farming_parsley*.png - farming_paella.png + farming_paella*.png farming_potato_omelette.png - farming_spanish_potatoes.png - farming_vanilla_flan.png - farming_sunflower*.png + farming_spanish_potatoes_32px.png + farming_vanilla_flan_32px.png + farming_sunflower*.png [except sunflower_bread.png] + farming_mayo*.png Created by gorlock (CC0) farming_salt_crystal.png @@ -175,8 +204,38 @@ Created by sirrobzeroone (CC0) farming_gyoza.png farming_pineapple_ring.png -Created by TechM8 (https://www.deviantart.com/techm8) - farming_popcorn.png +Created by smoke_th (CC0 - https://opengameart.org/content/popcorn-icon) + farming_popcorn_32px.png + farming_popcorn.png [resized and edited by TenPlus1] -Created by RZR0 (CC-BY-NC-SA) - farming_blueberry_pie.png +Created by DMBuce (MIT - https://github.com/DMBuce/hatchling-snacks) + farming_mac_and_cheese.png + +Created by XSSheep (CC BY-SA 4.0 - https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated) + farming_coffee_1.png + farming_coffee_2.png + farming_coffee_3.png + farming_coffee_4.png + farming_coffee_5.png + farming_coffee_beans.png + farming_apple_pie.png (edited by TenPlus1) + farming_blueberry_pie.png (edited by TenPlus1) + farming_rhubarb_pie.png (edited by TenPlus1) + +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + farming_asparagus* + farming_eggplant* + farming_spinach* + farming_ginger* diff --git a/mods/farming/locale/de.txt b/mods/farming/locale/de.txt deleted file mode 100644 index a18f79e5..00000000 --- a/mods/farming/locale/de.txt +++ /dev/null @@ -1,195 +0,0 @@ -# German translation of the farming mod by TenPlus1 -# textdomain: farming -# author: Xanthin -# author: TheDarkTiger -# last update: 2020/Apr/26 - -###### folder . ###### - -### init.lua ### -Seed=Saatgut - -### compatibility.lua ### -Banana= -Banana Leaves= -Orange= -Strawberry= - -### food.lua ### -Sugar=Zucker -Salt= -Rose Water= -Turkish Delight= -Garlic Bread= -Donut=Donut -Chocolate Donut=Schokodonut -Apple Donut=Apfeldonut -Porridge= -Jaffa Cake= - -### hoes.lua ### -Hoe=Hacke -Wooden Hoe=Holzhacke -Stone Hoe=Steinhacke -Steel Hoe=Stahlhacke -Bronze Hoe=Bronzehacke -Mese Hoe=Mesehacke -Diamond Hoe=Diamanthacke -# Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)= -Mithril Scythe (Right-click to harvest and replant crops)= -# Surcharge du mod [Toolranks] à faire # - -### soil.lua ### -Soil=Ackerboden -Wet Soil=Bewässerter Ackerboden - -### utensils.lua ### -Wooden Bowl= -Saucepan= -Cooking Pot= -Baking Tray= -Skillet= -Mortar and Pestle= -Cutting Board= -Juicer= -Glass Mixing Bowl= - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed=Gerstenkörner -Barley=Gerste - -### beans.lua ### -Green Beans=Grüne Bohnen -Bean Pole (place on soil before planting beans)=Bohnenstange (vor dem Pflanzen der Bohnen auf den\nAckerboden stellen) - -### beetroot.lua ### -Beetroot= -Beetroot Soup= - -### blueberry.lua ### -Blueberries=Blaubeeren -Blueberry Muffin=Blaubeermuffin -Blueberry Pie= - -### carrot.lua ## -Carrot=Möhre -Carrot Juice= -Golden Carrot=Goldene Möhre - -### chili.lua ### -Chili Pepper= -Bowl of Chili= - -### cocoa.lua ### -Cocoa Beans=Kakaobohne -Cookie=Keks -Bar of Dark Chocolate=Tafel Zartbitterschokolade -Chocolate Block= - -### coffee.lua ### -Coffee Beans=Kaffeebohnen -Cup of Coffee=Tasse Kaffee - -### corn.lua ### -Corn=Mais -Corn on the Cob=Maiskolben -Cornstarch= -Bottle of Ethanol=Flasche Ethanol - -### cotton.lua ### -Cotton Seed=Baumwollsamen -Cotton=Baumwolle -String= - -### cucumber.lua ### -Cucumber=Gurke - -### garlic.lua ### -Garlic clove= -Garlic= -Garlic Braid= - -### grapes.lua ### -Grapes=Weintrauben -Trellis (place on soil before planting grapes)=Spalier (vor dem Pflanzen der Weintrauben auf den\nAckerboden stellen) - -### hemp.lua ### -Hemp Seed=Hanfsamen -Hemp Leaf=Hanfblatt -Bottle of Hemp Oil=Flasche mit Hanföl -Hemp Fibre=Hanffaser -Hemp Block= -Hemp Rope=Hanfseil - -### melon.lua ### -Melon Slice=Melonenscheibe -Melon=Melone - -### onion.lua ### -Onion= - -### peas.lua ### -Pea Pod= -Peas= -Pea Soup= - -### pepper.lua ### -Peppercorn= -Pepper= -Ground Pepper= - -### pinapple.lua ### -Pineapple Top= -Pineapple= -Pineapple Ring= -Pineapple Juice= - -### potato.lua ### -Potato=Kartoffel -Baked Potato=Ofenkartoffel -Cucumber and Potato Salad= - -### pumpkin.lua ### -Pumpkin Slice=Kürbisscheibe -Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Punch zum Ein- und Ausschalten) -Scarecrow Bottom= -Pumpkin Bread=Kürbisbrot -Pumpkin Dough=Kürbisteig -Pumpkin=Kürbis - -### raspberry.lua ### -Raspberries=Himbeeren -Raspberry Smoothie=Himbeersmoothie - -### rhubarb.lua ### -Rhubarb=Rhabarber -Rhubarb Pie=Rhabarberkuchen - -### ryeoatrice.lua ### -Rye= -Rye seed= -Oat= -Oat seed= -Rice= -Rice grains= -Rice Bread= -Rice Flour= -Multigrain Flour= -Multigrain Bread= - -### tomato.lua ### -Tomato=Tomate - -### wheat.lua ### -Wheat Seed=Weizenkörner -Wheat=Weizen -Straw=Stroh -Flour=Mehl -Bread=Brot -Sliced Bread= -Toast= -Toast Sandwich= diff --git a/mods/farming/locale/farming.de.tr b/mods/farming/locale/farming.de.tr index 175990ec..f2da0c63 100644 --- a/mods/farming/locale/farming.de.tr +++ b/mods/farming/locale/farming.de.tr @@ -1,134 +1,189 @@ -# textdomain:farming -%s Hoe=%s Hacke -Apple Donut=Apfeldonut -Apple Pie=Apfelkuchen -Baked Potato=Ofenkartoffel -Baking Tray=Kuchenblech +# textdomain: farming Banana=Banane -Banana Leaves=Bananenblatt -Bar of Dark Chocolate=Tafel Zartbitterschokolade +Banana Leaves=Bananenblätter +Orange=Orange +Artichoke=Artischocke + Crop=-Pflanze +Asparagus=Spargel +Barley Seed=Gerstensamen Barley=Gerste -Barley Seed=Gerstenkörner -Bean Pole (place on soil before planting beans)=Bohnenstange (vor dem Pflanzen der Bohnen auf den\nAckerboden stellen) -Beetroot=Rote Beete -Beetroot Soup=Rote Beete Suppe -Bibimbap=Bibimbap -Wild Blueberries=Wilde Blaubeeren -Blueberry Muffin=Blaubeermuffin -Blueberry Pie=Blaubeerkuchen -Bottle of Ethanol=Flasche Ethanol -Bottle of Hemp Oil=Flasche mit Hanföl -Bowl of Chili=Chili Schale -Bread=Brot -Bronze Hoe=Bronzehacke -Cabbage=Weißkohl -Cactus Juice=Kaktussaft -Carrot=Möhre -Carrot Juice=Möhrensaft -Chili Pepper=Chili -Chocolate Block=Schokoladenstück -Chocolate Donut=Schokodonut -Cocoa Beans=Kakaobohne -Coffee Beans=Kaffeebohnen -Cookie=Keks -Cooking Pot=Kochtopf -Corn=Mais -Corn on the Cob=Maiskolben -Cornstarch=Speisestärke -Cotton=Baumwolle -Cotton Seed=Baumwollsamen -Cucumber=Gurke -Cucumber and Potato Salad=Gurken und Tomatensalat -Cup of Coffee=Tasse Kaffee -Cutting Board=Schneidebrett -Diamond Hoe=Diamanthacke -Donut=Donut -Flour=Mehl -Garlic=Knoblauch -Garlic Braid=Knoblauchzopf -Garlic Bread=Knoblauchbrot -Garlic clove=Knoblauchzehe -Glass Mixing Bowl=Glasschlüssel -Golden Carrot=Goldene Möhre -Grapes=Weintrauben Green Beans=Grüne Bohnen -Ground Pepper=Gemahlener Pfeffer -Hemp Block=Hanfblock -Hemp Fibre=Hanffaser -Hemp Leaf=Hanfblatt -Hemp Rope=Hanfseil +Bean Pole (place on soil before planting beans)=Bohnenstange (vor dem Pflanzen der Bohnen auf den@nAckerboden stellen) +Beetroot=Rote Beete +Blackberries=Brombeeren +Blackberry=Brombeere +Wild Blueberries=Wilde Blaubeeren +Blueberry=Blaubeere +Cabbage=Kohl +Carrot=Möhre +Chili Pepper=Chili +Raw Cocoa Beans=Rohe Kakaobohnen +Cocoa Beans=Kakaobohnen +Coffee Beans=Kaffeebohnen +Coffee=Kaffee +Corn=Mais +Cotton Seed=Baumwollsamen +Cotton=Baumwolle +Wild Cotton=Wilde Baumwolle +Cucumber=Gurke +Eggplant=Aubergine +Garlic clove=Knoblauchzehe +Garlic=Knoblauch +Ginger=Lebkuchen +Grapes=Weintrauben +Trellis (place on soil before planting grapes)=Spalier (vor dem Pflanzen der Weintrauben auf den@nAckerboden stellen) Hemp Seed=Hanfsamen -Hoe=Hacke -Hoe Bomb (use or throw on grassy areas to hoe land)=Hackbombe (Auf Grasland werfen oder benutzen) -Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Punch zum Ein- und Ausschalten) -Jaffa Cake=Jaffakeks -Juicer=Entsafter -Melon=Melone +Hemp Leaf=Hanfblatt +Hemp=Hanf +Lettuce=Kopfsalat Melon Slice=Melonenscheibe -Mese Hoe=Mesehacke -Mint Leaf=Minzblatt +Melon=Melone Mint Seeds=Minzsamen -Mint Tea=Minztee -Mithril Scythe (Right-click to harvest and replant crops)=Mithril-Sense (Rechts-Klick zum Ernten und Wiedereinpflanzen) -Mortar and Pestle=Mörser und Stößel -Multigrain Bread=Mehrkornbrot -Multigrain Flour=Mehrkornmehl +Mint Leaf=Minzblatt +Mint=Minze +Onion=Zwiebel +Parsley=Petersilie +Pea Pod=Erbsenschote +Pea=Erbse +Peppercorn=Pfefferkorn +Green Pepper=Grüne Paprika +Yellow Pepper=Gelbe Paprika +Red Pepper=Rote Paprika +Pepper=Paprika +Pineapple Top=Ananasdeckel +Pineapple=Ananas +Potato=Kartoffel +Pumpkin Slice=Kürbisscheibe +Pumpkin=Kürbis +Raspberries=Himbeeren +Raspberry=Himbeere +Rhubarb=Rhabarber +Rice Seed=Reissamen +Rice=Reis +Rye seed=Roggensamen +Rye=Roggen Oat seed=Hafersamen Oats=Hafer -Onion=Zwiebel -Onion Soup=Zwiebelsuppe -Orange=Apfelsine -Pasta=Pasta -Pea Pod=Erbsenschote -Pea Soup=Erbsensuppe -Peas=Erbsen -Pepper=Pfeffer -Peppercorn=Pfefferkorn -Pineapple=Ananas -Pineapple Juice=Ananassaft -Pineapple Ring=Ananasscheibe -Pineapple Top=Ananasdeckel -Porridge=Haferbrei -Potato=Kartoffel -Pumpkin=Kürbis -Pumpkin Bread=Kürbisbrot -Pumpkin Dough=Kürbisteig -Pumpkin Slice=Kürbisscheibe -Raspberries=Himbeeren -Raspberry Smoothie=Himbeersmoothie -Rhubarb=Rhabarber -Rhubarb Pie=Rhabarberkuchen -Rice=Reis -Rice Bread=Reiswaffel -Rice Flour=Reismehl -Rice grains=Reissaat -Rose Water=Rosenwasser -Rye=Roggen -Rye seed=Roggensaat -Salt=Salz -Saucepan=Kasserolle -Savanna Soil=Savannaerde -Scarecrow Bottom=Vogelscheuchengestell -Seed=Saatgut -Skillet=Bratpfanne -Sliced Bread=Geschnittenes Brot -Soil=Ackerboden -Spaghetti=Spaghetti -Steel Hoe=Stahlhacke -Stone Hoe=Steinhacke -Straw=Stroh +Soy Pod=Sojaschote +Soy=Soja +Spinach=Spinat Strawberry=Erdbeere -String=Faden -Sugar=Zucker -Toast=Toast -Toast Sandwich=Toast Sandwich +Sunflower Seeds=Sonnenblumensamen +Sunflower=Sonnenblume Tomato=Tomate -Trellis (place on soil before planting grapes)=Spalier (vor dem Pflanzen der Weintrauben auf den\nAckerboden stellen) -Turkish Delight=Lokum -Wet Savanna Soil=Feuchte Savannaerde -Wet Soil=Bewässerter Ackerboden +Vanilla=Vanille +Wheat Seed=Weizensamen Wheat=Weizen -Wheat Seed=Weizenkörner -Wild Cotton=Wilde Baumwolle -Wooden Bowl=Holzschale +Hoe=Hacke Wooden Hoe=Holzhacke +Stone Hoe=Steinhacke +Steel Hoe=Stahlhacke +Bronze Hoe=Bronzehacke +Mese Hoe=Mesehacke +Diamond Hoe=Diamanthacke +Wood Hoe=Holzhacke +Hoe Bomb (use or throw on grassy areas to hoe land)=Hackenbombe (Auf Grasland werfen oder benutzen,@num Land zu bestellen) +Mithril Scythe (Use to harvest and replant crops)=Mithrilsichel (Benutzen, um Nutzpflanzen zu ernten und neu zu pflanzen) +Seed=Saatgut +Flour=Mehl +Garlic Braid=Knoblauchzopf +Corn on the Cob=Maiskolben +Popcorn=Popcorn +Cornstarch=Speisestärke +Cup of Coffee=Tasse Kaffee +Bar of Dark Chocolate=Tafel Zartbitterschokolade +Chocolate Block=Schokoladenblock +Bowl of Chili=Schüssel mit Chili +Chili Powder=Chilipulver +Carrot Juice=Möhrensaft +Blueberry Pie=Blaubeerkuchen +Blueberry Muffin=Blaubeermuffin +Tomato Soup=Tomatensuppe +Sliced Bread=Geschnittenes Brot +Toast=Toast +Toast Sandwich=Toast-Sandwich +Glass of Water=Glas Wasser +Sugar Cube=Zuckerwürfel +Caramel=Karamell +Salt=Salz +Salt crystal=Salzkristall +Mayonnaise=Mayonnaise +Rose Water=Rosenwasser +Turkish Delight=Lokum +Garlic Bread=Knoblauchbrot +Donut=Donut +Chocolate Donut=Schokodonut +Apple Donut=Apfeldonut +Porridge=Haferbrei +Jaffa Cake=Jaffa +Apple Pie=Apfelkuchen +Cactus Juice=Kaktussaft +Pasta=Pasta +Mac & Cheese=Makkaroni mit Käse +Spaghetti=Spaghetti +Bibimbap=Bibimbap +Burger=Burger +Salad=Salat +Triple Berry Smoothie=Dreibeersmoothie +Spanish Potatoes=Spanische Kartoffeln +Potato omelette=Kartoffelomelette +Paella=Paella +Vanilla Flan=Vanilletorte +Vegan Cheese=Veganer Käse +Vegan Butter=Vegane Butter +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Lebkuchenmann +Mint Tea=Minztee +Onion Soup=Zwiebelsuppe +Pea Soup=Erbsensuppe +Ground Pepper=Gemahlener Pfeffer +Pineapple Ring=Ananasscheibe +Pineapple Juice=Ananassaft +Cucumber and Potato Salad=Gurken-Kartoffelsalat +Pumpkin Dough=Kürbisteig +Pumpkin Bread=Kürbisbrot +Raspberry Smoothie=Himbeersmoothie +Rhubarb Pie=Rhabarberkuchen +Rice Flour=Reismehl +Rice Bread=Reiswaffel +Multigrain Flour=Mehrkornmehl +Multigrain Bread=Mehrkornbrot +Soy Sauce=Sojasoße +Soy Milk=Sojamilch +Tofu=Tofu +Cooked Tofu=Gekochter Tofu +Toasted Sunflower Seeds=Geröstete Sonnenblumensamen +Bottle of Sunflower Oil=Flasche Sonnenblumenöl +Sunflower Seed Bread=Sonnenblumensamenbrot +Vanilla Extract=Vanilleextrakt +Jerusalem Artichokes=Jerusalemartischocken +Bread=Brot +Cookie=Keks +Golden Carrot=Goldene Möhre +Beetroot Soup=Rote-Beete-Suppe +Sugar=Zucker +Baked Potato=Ofenkartoffel +Saucepan=Kasserolle +Cooking Pot=Kochtopf +Baking Tray=Kuchenblech +Skillet=Bratpfanne +Mortar and Pestle=Mörser und Stößel +Cutting Board=Schneidebrett +Juicer=Entsafter +Glass Mixing Bowl=Glasschüssel +Bottle of Ethanol=Flasche Ethanol +Straw=Stroh +Bottle of Hemp Oil=Flasche mit Hanföl +Hemp Fibre=Hanffaser +Hemp Block=Hanfblock +Hemp Rope=Hanfseil +Scarecrow Bottom=Vogelscheuchengestell +Wooden Bowl=Holzschale +String=Faden +Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Hauen zum Ein- und Ausschalten) +Savanna Soil=Savannenerde +Wet Savanna Soil=Feuchte Savannenerde +Soil=Ackerboden +Wet Soil=Feuchter Ackerboden diff --git a/mods/farming/locale/farming.en.tr b/mods/farming/locale/farming.en.tr index 22df74a8..6f83b3e4 100644 --- a/mods/farming/locale/farming.en.tr +++ b/mods/farming/locale/farming.en.tr @@ -1,134 +1,186 @@ -# textdomain:farming -#%s Hoe= -#Apple Donut= -#Apple Pie= -#Baked Potato= -#Baking Tray= -#Banana= -#Banana Leaves= -#Bar of Dark Chocolate= -#Barley= -#Barley Seed= -#Bean Pole (place on soil before planting beans)= -#Beetroot= -#Beetroot Soup= -#Bibimbap= -#Wild Blueberries= -#Blueberry Muffin= -#Blueberry Pie= -#Bottle of Ethanol= -#Bottle of Hemp Oil= -#Bowl of Chili= -#Bread= -#Bronze Hoe= -#Cabbage= -#Cactus Juice= -#Carrot= -#Carrot Juice= -#Chili Pepper= -#Chocolate Block= -#Chocolate Donut= -#Cocoa Beans= -#Coffee Beans= -#Cookie= -#Cooking Pot= -#Corn= -#Corn on the Cob= -#Cornstarch= -#Cotton= -#Cotton Seed= -#Cucumber= -#Cucumber and Potato Salad= -#Cup of Coffee= -#Cutting Board= -#Diamond Hoe= -#Donut= -#Flour= -#Garlic= -#Garlic Braid= -#Garlic Bread= -#Garlic clove= -#Glass Mixing Bowl= -#Golden Carrot= -#Grapes= -#Green Beans= -#Ground Pepper= -#Hemp Block= -#Hemp Fibre= -#Hemp Leaf= -#Hemp Rope= -#Hemp Seed= -#Hoe= -#Hoe Bomb (use or throw on grassy areas to hoe land)= -#Jack 'O Lantern (punch to turn on and off)= -#Jaffa Cake= -#Juicer= -#Melon= -#Melon Slice= -#Mese Hoe= -#Mint Leaf= -#Mint Seeds= -#Mint Tea= -#Mithril Scythe (Right-click to harvest and replant crops)= -#Mortar and Pestle= -#Multigrain Bread= -#Multigrain Flour= -#Oat seed= -#Oats= -#Onion= -#Onion Soup= -#Orange= -#Pasta= -#Pea Pod= -#Pea Soup= -#Peas= -#Pepper= -#Peppercorn= -#Pineapple= -#Pineapple Juice= -#Pineapple Ring= -#Pineapple Top= -#Porridge= -#Potato= -#Pumpkin= -#Pumpkin Bread= -#Pumpkin Dough= -#Pumpkin Slice= -#Raspberries= -#Raspberry Smoothie= -#Rhubarb= -#Rhubarb Pie= -#Rice= -#Rice Bread= -#Rice Flour= -#Rice grains= -#Rose Water= -#Rye= -#Rye seed= -#Salt= -#Saucepan= -#Savanna Soil= -#Scarecrow Bottom= -#Seed= -#Skillet= -#Sliced Bread= -#Soil= -#Spaghetti= -#Steel Hoe= -#Stone Hoe= -#Straw= -#Strawberry= -#String= -#Sugar= -#Toast= -#Toast Sandwich= -#Tomato= -#Trellis (place on soil before planting grapes)= -#Turkish Delight= -#Wet Savanna Soil= -#Wet Soil= -#Wheat= -#Wheat Seed= -#Wild Cotton= -#Wooden Bowl= -#Wooden Hoe= +# textdomain: farming + Crop= +Artichoke= +Asparagus= +Barley Seed= +Barley= +Green Beans= +Bean Pole (place on soil before planting beans)= +Beetroot= +Beetroot Soup= +Blackberry= +Blackberries= +Wild Blueberries= +Blueberry= +Blueberry Muffin= +Blueberry Pie= +Cabbage= +Carrot= +Carrot Juice= +Golden Carrot= +Chili Pepper= +Bowl of Chili= +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans= +Cookie= +Bar of Dark Chocolate= +Chocolate Block= +Coffee= +Coffee Beans= +Cup of Coffee= +Banana= +Banana Leaves= +Orange= +Corn= +Corn on the Cob= +Popcorn= +Cornstarch= +Bottle of Ethanol= +Wild Cotton= +Cotton Seed= +Cotton= +String= +Cucumber= +Eggplant= +Glass of Water= +Sugar= +Sugar Cube= +Caramel= +Salt= +Mayonnaise= +Rose Water= +Turkish Delight= +Garlic Bread= +Donut= +Chocolate Donut= +Apple Donut= +Porridge= +Jaffa Cake= +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove= +Garlic= +Garlic Braid= +Ginger= +Grapes= +Trellis (place on soil before planting grapes)= +Hemp= +Hemp Seed= +Hemp Leaf= +Bottle of Hemp Oil= +Hemp Fibre= +Hemp Block= +Hemp Rope= +Hoe= +Wooden Hoe= +Stone Hoe= +Steel Hoe= +Bronze Hoe= +Mese Hoe= +Diamond Hoe= +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed= +Lettuce= +Melon Slice= +Melon= +Mint= +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion= +Onion Soup= +Parsley= +Pea= +Pea Pod= +Pea Soup= +Pepper= +Peppercorn= +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper= +Pineapple Top= +Pineapple= +Pineapple Ring= +Pineapple Juice= +Potato= +Baked Potato= +Cucumber and Potato Salad= +Pumpkin Slice= +Jack 'O Lantern (punch to turn on and off)= +Scarecrow Bottom= +Pumpkin Bread= +Pumpkin Dough= +Pumpkin= +Raspberry= +Raspberries= +Raspberry Smoothie= +Rhubarb= +Rhubarb Pie= +Rice Seed= +Rice= +Rice Bread= +Rice Flour= +Rye seed= +Rye= +Oat seed= +Oats= +Multigrain Flour= +Multigrain Bread= +Savanna Soil= +Wet Savanna Soil= +Soil= +Wet Soil= +Soy= +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry= +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato= +Tomato Soup= +Wooden Bowl= +Saucepan= +Cooking Pot= +Baking Tray= +Skillet= +Mortar and Pestle= +Cutting Board= +Juicer= +Glass Mixing Bowl= +Vanilla= +Vanilla Extract= +Wheat Seed= +Wheat= +Straw= +Flour= +Bread= +Sliced Bread= +Toast= +Toast Sandwich= diff --git a/mods/farming/locale/farming.eo.tr b/mods/farming/locale/farming.eo.tr new file mode 100644 index 00000000..75f8bd4b --- /dev/null +++ b/mods/farming/locale/farming.eo.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=Hordea Semo +Barley=Hordeo +Green Beans=Verdaj Fazeoloj +Bean Pole (place on soil before planting beans)=Fazeola Poluso (metu sur grundo antaŭ planti fabojn) +Beetroot=Betoto +Beetroot Soup=Betota Supo +Blackberries= +Wild Blueberries= +Blueberry Muffin=Mirtila Mufino +Blueberry Pie=Mirtila Torto +Cabbage= +Carrot=Karoto +Carrot Juice=Karota Suko +Golden Carrot=Ora Karoto +Chili Pepper=Kapsiketo +Bowl of Chili=Bovlo da Kapsiketo +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=Kakaa Faboj +Cookie=Kuketo +Bar of Dark Chocolate=Stango de Malhela Ĉokolado +Chocolate Block=Bloko de Ĉokolado +Coffee Beans=Kafaj Seboj +Cup of Coffee=Taso da Kafo +Banana=Banano +Banana Leaves=Bananaj Folioj +Orange=Oranĝo +Corn=Maizo +Corn on the Cob=Maiza sur la Spadiko +Popcorn= +Cornstarch=Maizamelo +Bottle of Ethanol=Botelo da Etanolo +Wild Cotton= +Cotton Seed=Kotona Semo +Cotton=Kotono +String=Ŝnuro +Cucumber=Kukumo +Eggplant= +Glass of Water= +Sugar=Sukero +Sugar Cube= +Caramel= +Salt=Salo +Mayonnaise= +Rose Water=Roza Akvo +Turkish Delight=Turka Delico +Garlic Bread=Ajla Pano +Donut=Benjeto +Chocolate Donut=Ĉokolada Benjeto +Apple Donut=Poma Benjeto +Porridge=Kaĉo +Jaffa Cake=Jafa Kuko +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=Ajlokloko +Garlic=Ajlo +Garlic Braid=Ajla Plektaĵo +Ginger= +Grapes=Vinberoj +Trellis (place on soil before planting grapes)=Trellis (meti sur grundo antaŭ planti vinberojn) +Hemp Seed=Kanaba Semo +Hemp Leaf=Kanaba Folio +Bottle of Hemp Oil=Botelo da Kanaba Oleo +Hemp Fibre=Kanaba Fibro +Hemp Block=Kanaba Bloko +Hemp Rope=Kanaba Ŝnuro +Hoe=Sarkilo +Wooden Hoe=Ligna Sarkilo +Stone Hoe=Ŝtona Sarkilo +Steel Hoe=Ŝtala Sarkilo +Bronze Hoe=Bronza Sarkilo +Mese Hoe=Mesea Sarkilo +Diamond Hoe=Diamanta Sarkilo +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed=Semo +Lettuce= +Melon Slice=Tranĉaĵo de Melono +Melon=Melono +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion=Cepo +Onion Soup= +Parsley= +Pea Pod=Pizujo +Pea Soup=Piza Supo +Peppercorn=Piprograjno +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=Muelita Pipro +Pineapple Top=Pinto de Ananaso +Pineapple=Ananaso +Pineapple Ring=Ananasa Ringo +Pineapple Juice=Ananasa Suko +Potato=Terpomo +Baked Potato=Bakita Terpomo +Cucumber and Potato Salad=Salato de Kukumo kaj Terpomo +Pumpkin Slice=Tranĉaĵo de Kukurbo +Jack 'O Lantern (punch to turn on and off)=Kukurba Lanterno (punu por ŝalti kaj malŝalti) +Scarecrow Bottom=Birdotimigilo Fundo +Pumpkin Bread=Kukurba Pano +Pumpkin Dough=Kukurba Pasto +Pumpkin=Kukurbo +Raspberries=Framboj +Raspberry Smoothie=Fraba Glataĵo +Rhubarb=Rabarbo +Rhubarb Pie=Rabarba Torto +Rice Seed= +Rice=Rizo +Rice Bread=Riza Pano +Rice Flour=Riza Faruno +Rye seed=Sekala Semo +Rye=Sekalo +Oat seed=Avena Semo +Oats= +Multigrain Flour=Multgrajna Faruno +Multigrain Bread=Multgrajna Pano +Savanna Soil= +Wet Savanna Soil= +Soil=Tero +Wet Soil=Malseka Tero +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry=Frago +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Tomato +Tomato Soup= +Wooden Bowl=Ligna Bovlo +Saucepan=Kaserolo +Cooking Pot=Kuirpoto +Baking Tray=Baka Pleto +Skillet=Pato +Mortar and Pestle=Pistujo +Cutting Board=Tranĉa Tabulo +Juicer=Spremilo +Glass Mixing Bowl=Vitra Miksa Bovlo +Vanilla= +Vanilla Extract= +Wheat Seed=Tritika Semo +Wheat=Tritiko +Straw=Pajlo +Flour=Faruno +Bread=Pano +Sliced Bread=Tranĉita Pano +Toast=Toasto +Toast Sandwich=Toasta Sandviĉo diff --git a/mods/farming/locale/farming.es.tr b/mods/farming/locale/farming.es.tr new file mode 100644 index 00000000..e3d989a0 --- /dev/null +++ b/mods/farming/locale/farming.es.tr @@ -0,0 +1,177 @@ +# textdomain: farming +Banana=Banana +Banana Leaves=Hojas de Banana +Orange=Naranja +Artichoke=Alcachofa +Asparagus=Esparragos +Barley Seed=Semillas de Cebada +Barley=Cebada +Green Beans=Frijoles +Bean Pole (place on soil before planting beans)=Varas para frijoles (colocar antes de plantar frijoles) +Beetroot=Remolacha +Beetroot Soup=Sopa de Remolacha +Blackberries=Zarzamoras +Wild Blueberries=Arándanos +Blueberry Muffin=Bizcocho de Arándanos +Blueberry Pie=Pastel de Arándanos +Cabbage=Coliflor +Carrot=Zanahoria +Carrot Juice=Zumo de Zanahoria +Golden Carrot=Zanahoria Dorada +Chili Pepper=Guindilla +Bowl of Chili=Tazón de chile +Chili Powder=Chile en polvo +Raw Cocoa Beans=Granos de Cacao Verde +Cocoa Beans=Granos de Cacao +Cookie=Galleta +Bar of Dark Chocolate=Barra de Chocolate amargo +Chocolate Block=Bloque de Chocolate +Coffee Beans=Granos de Café +Cup of Coffee=Taza de Café +Corn=Mazorca de Maiz +Corn on the Cob=Mazorca Frita +Popcorn=Palomitas +Cornstarch=Maicena +Bottle of Ethanol=Botella de Etanol +Wild Cotton=Algodón silvestre +Cotton Seed=Semillas de Algodón +Cotton=Algodón +String=Cuerda +Cucumber=Pepino +Eggplant=Berenjena +Garlic clove=Diente de Ajo +Garlic=Ajo +Garlic Braid=Ristra de Ajos +Ginger=Jengibre +Grapes=Uvas +Trellis (place on soil before planting grapes)=Emparrado (colocar antes de sembrar uvas) +Hemp Seed=Semillas de Cáñamo +Hemp Leaf=Hoja de Cáñamo +Bottle of Hemp Oil=Aceite de Cáñamo +Hemp Fibre=Fibra de Cáñamo +Hemp Block=Bloque de Cáñamo +Hemp Rope=Cuerda de Cáñamo +Lettuce=Lechuga +Melon Slice=Rodaja de Sandia +Melon=Sandia +Mint Seeds=Semillas de Menta +Mint Leaf=Hoja de Menta +Mint Tea=Té de Menta +Onion=Cebolla +Onion Soup=Sopa de Cebolla +Parsley=Perejil +Pea Pod=Vaina de Guisantes +Pea Soup=Sopa de Guisantes +Peppercorn=Pimienta en Grano +Green Pepper=Pimiento Verde +Yellow Pepper=Pimiento Amarillo +Red Pepper=Pimiento Rojo +Ground Pepper=Pimienta Molida +Pineapple Top=Semilla de Piña +Pineapple=Piña +Pineapple Ring=Rodaja de Piña +Pineapple Juice=Zumito de Piña +Potato=Patata +Baked Potato=Papa Asada +Cucumber and Potato Salad=Ensalada de Pepino y Patatas +Pumpkin Slice=Trozo de Calabaza +Jack 'O Lantern (punch to turn on and off)=Linterna Calabaza (golpear para encender o apagar) +Scarecrow Bottom=Cuerpo de Espantapájaros +Pumpkin Bread=Pan de Calabaza +Pumpkin Dough=Pasta de Calabaza +Pumpkin=Calabaza +Raspberries=Frambuesas +Raspberry Smoothie=Crema de Frambuesas +Rhubarb=Ruibarbo +Rhubarb Pie=Bizcocho de Ruibarbo +Rice Seed=Granos de Arroz +Rice=Arroz +Rice Bread=Pan de Arroz +Rice Flour=Harina de Arroz +Rye seed=Semillas de Centeno +Rye=Centeno +Oat seed=Semillas de Avena +Oats=Avena +Multigrain Flour=Harina Multigrano +Multigrain Bread=Pan Multigrano +Soy Pod=Vaina de Soja +Soy Sauce=Aceite de Soja +Soy Milk=Leche de Soja +Tofu=Tofu +Cooked Tofu=Tofu Cocinado +Spinach=Espinacas +Strawberry=Fresa +Sunflower=Girasol +Sunflower Seeds=Semillas de Girasol +Toasted Sunflower Seeds=Pipas de Girasol +Bottle of Sunflower Oil=Aceite de Girasol +Sunflower Seed Bread=Pan con Pipas +Tomato=Tomate +Tomato Soup=Sopa de Tomate +Vanilla=Vainilla +Vanilla Extract=Extracto de Vainilla +Wheat Seed=Semillas de Trigo +Wheat=Trigo +Straw=Heno +Flour=Harina +Bread=Pan +Sliced Bread=Rebanada de Pan +Toast=Tostada +Toast Sandwich=Bocadillo de Pan +Glass of Water=Vaso de Agua +Sugar=Azucar +Sugar Cube=Bloque de Azucar +Caramel=Caramelo +Salt=Sal +Salt crystal=Cristal de Sal +Mayonnaise=Mayonesa +Rose Water=Agua de Rosas +Turkish Delight=Delicias Turcas +Garlic Bread=Pan con Ajito +Donut=Rosquilla +Chocolate Donut=Rosquilla de Chocolate +Apple Donut=Rosquilla de Manzana +Porridge=Gachas +Jaffa Cake=Galleta Jaffa +Apple Pie=Pastel de Manzana +Cactus Juice=Zumo de Cactus +Pasta=Pasta +Mac & Cheese=Pasta con queso +Spaghetti=Espaguetis +Bibimbap=Bibimbap +Burger=Hamburguesa +Salad=Ensalada +Triple Berry Smoothie=Helado Multifrutas +Spanish Potatoes=Tortilla Española +Potato omelet=Tortilla de Patatas +Paella=Paella +Vanilla Flan=Flan de Vainilla +Vegan Cheese=Queso Vegano +Onigiri=Onigiri +Gyoza=Empanadilla Japonesa +Mochi=Mochi +Gingerbread Man=Moñequito de Jengibre +Hoe=Azada +Wooden Hoe=Azada de Madera +Stone Hoe=Azada de Piedra +Steel Hoe=Azada de Acero +Bronze Hoe=Azada de Bronce +Mese Hoe=Azada de Mese +Diamond Hoe=Azada de Diamante +Wood Hoe=Azada de Madera +Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba Azada (usar o lanzar a tierra para ararla) +Mithril Scythe (Use to harvest and replant crops)=Guadaña de Mithril +Seed=Semilla +Savanna Soil=Tierra de Cultivo de Sabana +Wet Savanna Soil=Tierra de Cultivo de Sabana Humeda +Soil=Tierra de Cultivo +Wet Soil=Tierra de Cultivo Humeda +Wooden Bowl=Cuenco de Madera +Saucepan=Cazo +Cooking Pot=Olla +Baking Tray=Bandeja para Hornear +Skillet=Sartén +Mortar and Pestle=Mortero +Cutting Board=Tabla de cortar +Juicer=Exprimidor +Glass Mixing Bowl=Bol de Mezcla diff --git a/mods/farming/locale/farming.fr.tr b/mods/farming/locale/farming.fr.tr index 528ba215..532e234b 100644 --- a/mods/farming/locale/farming.fr.tr +++ b/mods/farming/locale/farming.fr.tr @@ -1,134 +1,177 @@ -# textdomain:farming -%s Hoe=Binette de %s -Apple Donut=Beignet aux pommes -Apple Pie=Tarte aux pommes -Baked Potato=Pomme de terre cuite -Baking Tray=Lèche-frite +# textdomain: farming Banana=Banane Banana Leaves=Feuilles de banane -Bar of Dark Chocolate=Tablette de chocolat noir -Barley=Orge +Orange=Orange +Artichoke=Artichaut +Asparagus=Asperge Barley Seed=Graine d'orge +Barley=Orge +Green Beans=Haricots verts Bean Pole (place on soil before planting beans)=Tuteur pour haricots (placer sur le sol avant de planter des haricots) Beetroot=Betterave Beetroot Soup=Soupe de betterave -Bibimbap=Bibimbap -Wild Blueberries=Myrtilles Sauvages +Blackberries=Mûres +Wild Blueberries=Myrtilles sauvages Blueberry Muffin=Muffin aux myrtilles Blueberry Pie=Tarte aux myrtilles -Bottle of Ethanol=Bouteille d'éthanol -Bottle of Hemp Oil=Bouteille d'huile de chanvre -Bowl of Chili=Bol de chilli -Bread=Pain -Bronze Hoe=Binette en bronze Cabbage=Chou -Cactus Juice=Jus de cactus Carrot=Carotte Carrot Juice=Jus de carotte +Golden Carrot=Carotte dorée Chili Pepper=Piment fort -Chocolate Block=Bloc de chocolat -Chocolate Donut=Beignet au chocolat +Bowl of Chili=Bol de chilli +Chili Powder=Poudre de piment +Raw Cocoa Beans=Fèves de cacao brutes Cocoa Beans=Fèves de cacao -Coffee Beans=Grains de café Cookie=Biscuit -Cooking Pot=Marmitte -Corn=Maïs -Corn on the Cob=Maïs cuit -Cornstarch=Fécule de maïs -Cotton=Coton -Cotton Seed=Graines de coton -Cucumber=Concombre -Cucumber and Potato Salad=Salade de pomme de terre et concombre +Bar of Dark Chocolate=Tablette de chocolat noir +Chocolate Block=Bloc de chocolat +Coffee Beans=Grains de café Cup of Coffee=Tasse de café -Cutting Board=Planche à découper -Diamond Hoe=Binette en diamant -Donut=Beignet -Flour=Farine +Corn=Maïs +Corn on the Cob=Cobette (maïs cuit) +Popcorn=Popcorn +Cornstarch=Fécule de maïs +Bottle of Ethanol=Bouteille d'éthanol +Wild Cotton=Coton sauvage +Cotton Seed=Graines de coton +Cotton=Coton +String=Ficelle +Cucumber=Concombre +Eggplant=Aubergine +Garlic clove=Gousse d'ail Garlic=Tête d'ail Garlic Braid=Ail tressé -Garlic Bread=Pain à l'ail -Garlic clove=Gousse d'ail -Glass Mixing Bowl=Terrine en verre -Golden Carrot=Carotte dorée +Ginger=Gingembre Grapes=Raisins -Green Beans=Haricots verts -Ground Pepper=Poivre moulu -Hemp Block=Bloc de chanvre -Hemp Fibre=Fibre de chanvre -Hemp Leaf=Feuille de chanvre -Hemp Rope=Corde de chanvre +Trellis (place on soil before planting grapes)=Treillis (placer sur le sol avant de planter la vigne) Hemp Seed=Graines de chanvre -Hoe=Binette -Hoe Bomb (use or throw on grassy areas to hoe land)=Bombe à binnage (Actionner ou lancer sur une zone herbeuse pour la binner) -Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Frapper pour allumer et éteindre) -Jaffa Cake=Petit gâteau à l'orange "Jaffa" -Juicer=Presse-agrumes -Melon=Melon +Hemp Leaf=Feuille de chanvre +Bottle of Hemp Oil=Bouteille d'huile de chanvre +Hemp Fibre=Fibre de chanvre +Hemp Block=Bloc de chanvre +Hemp Rope=Corde de chanvre +Lettuce=Laitue Melon Slice=Tranche de melon -Mese Hoe=Binette en mese -Mint Leaf=Feuille de menthe +Melon=Melon Mint Seeds=Graine de menthe +Mint Leaf=Feuille de menthe Mint Tea=Thé à la menthe -Mithril Scythe (Right-click to harvest and replant crops)=Faux en mithril (Récolte et replante des graines) -Mortar and Pestle=Mortier et pilon -Multigrain Bread=Pain aux céréales -Multigrain Flour=Farine multi-céréales -Oat seed=Grains d'orge -Oats=Avoine Onion=Oignon Onion Soup=Soupe à l'oignon -Orange=Orange -Pasta=Pâtes +Parsley=Persil Pea Pod=Cosse de petit-pois Pea Soup=Soupe de petit-pois -Peas=Petit-pois -Pepper=Poivron Peppercorn=Grain de poivre -Pineapple=Ananas -Pineapple Juice=Jus d'ananas -Pineapple Ring=Tranche d'ananas +Green Pepper=Poivron vert +Yellow Pepper=Poivron jaune +Red Pepper=Poivron rouge +Ground Pepper=Poivre moulu Pineapple Top=Pousse d'ananas -Porridge=Gruau de céréales +Pineapple=Ananas +Pineapple Ring=Tranche d'ananas +Pineapple Juice=Jus d'ananas Potato=Pomme de terre -Pumpkin=Citrouille +Baked Potato=Pomme de terre cuite +Cucumber and Potato Salad=Salade de pomme de terre et concombre +Pumpkin Slice=Tranche de citrouille +Jack 'O Lantern (punch to turn on and off)=Citrouille d'halloween (Frapper pour allumer et éteindre) +Scarecrow Bottom=Base d'épouventail Pumpkin Bread=Pain à la citrouille Pumpkin Dough=Pâton de pain à la citrouille -Pumpkin Slice=Tranche de citrouille +Pumpkin=Citrouille Raspberries=Framboises Raspberry Smoothie=Smoothie aux framboises Rhubarb=Rhubarbe Rhubarb Pie=Tarte à la rhubarbe +Rice Seed=Riz Rice=Riz Rice Bread=Pain de riz Rice Flour=Farine de riz -Rice grains=Grain de riz -Rose Water=Eau de rose -Rye=Seigle Rye seed=Grains de seigle -Salt=Sel -Saucepan=Casserole -Savanna Soil=Terre de la savane binnée -Scarecrow Bottom=Base d'épouventail -Seed=Graine -Skillet=Poêle -Sliced Bread=Tranche de Pain -Soil=Terre binnée -Spaghetti=Spaghetti -Steel Hoe=Binette en acier -Stone Hoe=Binette en pierre -Straw=Paille +Rye=Seigle +Oat seed=Grains d'orge +Oats=Avoine +Multigrain Flour=Farine multi-céréales +Multigrain Bread=Pain aux céréales +Soy Pod=Cosse de soja +Soy Sauce=Sauce de soja +Soy Milk=Lait de soja +Tofu=Tofu +Cooked Tofu=Tofu cuit +Spinach=Épinard Strawberry=Fraise -String=Ficelle -Sugar=Sucre +Sunflower=Tournesol +Sunflower Seeds=Graines de tournesol +Toasted Sunflower Seeds=Graines de tournesol grillées +Bottle of Sunflower Oil=Bouteille d'huile de tournesol +Sunflower Seed Bread=Pain de graines de tournesol +Tomato=Tomate +Tomato Soup=Soupe de tomate +Vanilla=Vanille +Vanilla Extract=Extrait de vanille +Wheat Seed=Grain de blé +Wheat=Blé +Straw=Paille +Flour=Farine +Bread=Pain +Sliced Bread=Tranche de pain Toast=Pain grillé Toast Sandwich=Sandwich au pain grillé -Tomato=Tomate -Trellis (place on soil before planting grapes)=Treillis (placer sur le sol avant de planter la vigne) +Glass of Water=Verre d'eau +Sugar=Sucre +Sugar Cube=Morceau de sucre +Caramel=Caramel +Salt=Sel +Salt crystal=Cristaux de sel +Mayonnaise=Mayonnaise +Rose Water=Eau de rose Turkish Delight=Douceur turque -Wet Savanna Soil=Terre humide et binnée de la savane -Wet Soil=Terre humide et binnée -Wheat=Blé -Wheat Seed=Grain de blé -Wild Cotton=Coton sauvage -Wooden Bowl=Bol en bois +Garlic Bread=Pain à l'ail +Donut=Beignet +Chocolate Donut=Beignet au chocolat +Apple Donut=Beignet aux pommes +Porridge=Gruau de céréales +Jaffa Cake=Petit gâteau à l'orange "Jaffa" +Apple Pie=Tarte aux pommes +Cactus Juice=Jus de cactus +Pasta=Pâtes +Mac & Cheese=Grâtin de pâtes +Spaghetti=Spaghetti +Bibimbap=Bibimbap +Burger=Hamburger +Salad=Salade verte +Triple Berry Smoothie=Smoothie aux trois baies +Spanish Potatoes=Patates sautées à l'Espagnole +Potato omelet=Omelette aux pommes de terre +Paella=Paëlla +Vanilla Flan=Flan +Vegan Cheese=Faumage végan +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Bonhomme en pain d'épice +Hoe=Binette Wooden Hoe=Binette en bois +Stone Hoe=Binette en pierre +Steel Hoe=Binette en acier +Bronze Hoe=Binette en bronze +Mese Hoe=Binette en mese +Diamond Hoe=Binette en diamant +Wood Hoe=Binette en bois +Hoe Bomb (use or throw on grassy areas to hoe land)=Bombe à binnage (Actionner ou lancer sur une zone herbeuse pour la binner) +Mithril Scythe (Use to harvest and replant crops)=Faux de mithril (Utiliser pour récolter et replanter les cultures) +Seed=Graine +Savanna Soil=Terre de la savane binnée +Wet Savanna Soil=Terre humide et binnée de la savane +Soil=Terre binnée +Wet Soil=Terre humide et binnée +Wooden Bowl=Bol en bois +Saucepan=Casserole +Cooking Pot=Marmitte +Baking Tray=Lèche-frite +Skillet=Poêle +Mortar and Pestle=Mortier et pilon +Cutting Board=Planche à découper +Juicer=Presse-agrumes +Glass Mixing Bowl=Terrine en verre diff --git a/mods/farming/locale/farming.hu.tr b/mods/farming/locale/farming.hu.tr new file mode 100644 index 00000000..9cf75c9f --- /dev/null +++ b/mods/farming/locale/farming.hu.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke=Articsóka +Asparagus=Spárga +Barley Seed=Árpamag +Barley=Árpa +Green Beans=Zöldbab +Bean Pole (place on soil before planting beans)=Karó babhoz (szúrd a földbe és oda vess babot) +Beetroot=cékla +Beetroot Soup=céklaleves +Blackberries=Szeder +Wild Blueberries=Vadáfonya +Blueberry Muffin=Áfonyamuffin +Blueberry Pie=Áfonyatorta +Cabbage=Káposzta +Carrot=Répa +Carrot Juice=Répalé +Golden Carrot=Aranyrépa +Chili Pepper=Chilipaprika +Bowl of Chili=Chilis tál +Chili Powder=Chilipor +Raw Cocoa Beans=Nyers kakaóbab +Cocoa Beans=Kakaóbab +Cookie=Süti +Bar of Dark Chocolate=Rúd étcsoki +Chocolate Block=Csokiblokk +Coffee Beans=Kávébab +Cup of Coffee=Csésze kávé +Banana=Banán +Banana Leaves=Banánlevél +Orange=Narancs +Corn=Kukorica +Corn on the Cob=Főtt kukorica +Popcorn=Pattogatott kukorica +Cornstarch=Keményítő +Bottle of Ethanol=Üveg etanol +Wild Cotton=Vadgyapot +Cotton Seed=Gyapotmag +Cotton=Gyapot +String=Madzag +Cucumber=Uborka +Eggplant=Padlizsán +Glass of Water=Pohár víz +Sugar=Cukor +Sugar Cube=Kockacukor +Caramel=Karamell +Salt=Só +Mayonnaise=Majonéz +Rose Water=Rózsavíz +Turkish Delight=Török desszert +Garlic Bread=Fokhagymás kenyér +Donut=Fánk +Chocolate Donut=Csokis fánk +Apple Donut=Almás fánk +Porridge=Zabkása +Jaffa Cake=Jaffatorta +Apple Pie=Almáspita +Cactus Juice=Kaktuszlé +Pasta=Tészta +Mac & Cheese=Sajtos makaróni +Spaghetti=Spagetti +Bibimbap=Bibimbap +Burger=Burger +Salad=Saláta +Triple Berry Smoothie=Hárombogyós smoothie +Spanish Potatoes=Tepsis krumpli +Potato omelet=Krumplis rántotta +Paella=Paella +Vanilla Flan=Vaníliás gyümölcstorta +Vegan Cheese=Vegán sajt +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Mézeskalács-emberke +Garlic clove=Gerezd fokhagyma +Garlic=Fokhagyma +Garlic Braid=Fokhagymafüzér +Ginger=Gyömbér +Grapes=Szőlő +Trellis (place on soil before planting grapes)=Karó szőlőhöz (szúrd a földbe és oda vess babot) +Hemp Seed=Kendermag +Hemp Leaf=Kenderlevél +Bottle of Hemp Oil=Üveg kenderolaj +Hemp Fibre=Kenderrost +Hemp Block=Kenderblokk +Hemp Rope=Kenderkötél +Hoe=Kapa +Wooden Hoe=Fakapa +Stone Hoe=Kőkapa +Steel Hoe=Acélkapa +Bronze Hoe=Bronzkapa +Mese Hoe=Mesekapa +Diamond Hoe=Gyémántkapa +Wood Hoe=Fakapa (2) +Hoe Bomb (use or throw on grassy areas to hoe land)=Kapabomba (használd vagy dobd füves területre) +Mithril Scythe (Use to harvest and replant crops)=Mithrilkasza (használd termények begyűjtéséhez és újravetéséhez) +Seed=Mag +Lettuce=Saláta +Melon Slice=Szelet dinnye +Melon=Dinnye +Mint Seeds=Mentamag +Mint Leaf=Mentalevél +Mint Tea=Mentatea +Onion=Hagyma +Onion Soup=Hagymaleves +Parsley=Petrezselyem +Pea Pod=Hüvelyes borsó +Pea Soup=Borsóleves +Peppercorn=Borsszemek +Green Pepper=Zöldpaprika +Yellow Pepper=Sárga paprika +Red Pepper=Pirospaprika +Ground Pepper=Őrölt bors +Pineapple Top=Ananászüstök +Pineapple=Ananász +Pineapple Ring=Szelet ananász +Pineapple Juice=Ananászlé +Potato=Krumpli +Baked Potato=Sült krumpli +Cucumber and Potato Salad=Uborkás krumplisaláta +Pumpkin Slice=Szelet tök +Jack 'O Lantern (punch to turn on and off)=Töklámpás (ütéssel kapcsold ki és be) +Scarecrow Bottom=Madárijesztő alja +Pumpkin Bread=Tökkenyér +Pumpkin Dough=Töktészta +Pumpkin=Tök +Raspberries=Málna +Raspberry Smoothie=Málnasmoothie +Rhubarb=Rebarbara +Rhubarb Pie=Rebarbaratorta +Rice Seed=Rizsmag +Rice=Rizs +Rice Bread=Rizskenyér +Rice Flour=Rizsliszt +Rye seed=Rozsmag +Rye=Rozs +Oat seed=Zabmag +Oats=Zab +Multigrain Flour=Vegyesliszt +Multigrain Bread=Vegyesliszt-kenyér +Savanna Soil=Szavannatalaj +Wet Savanna Soil=Nedves szavannatalaj +Soil=Talaj +Wet Soil=Nedves talaj +Soy Pod=Hüvelyes szója +Soy Sauce=Szójaszósz +Soy Milk=Szójatej +Tofu=Tofu +Cooked Tofu=Főtt tofu +Spinach=Spenót +Strawberry=Eper +Sunflower=Napraforgó +Sunflower Seeds=Napraforgómag +Toasted Sunflower Seeds=Szotyi +Bottle of Sunflower Oil=Üveg napraforgó-olaj +Sunflower Seed Bread=Napraforgómagos kenyér +Tomato=Paradicsom +Tomato Soup=Paradicsomleves +Wooden Bowl=Fatál +Saucepan=Szószostál +Cooking Pot=Főzőedény +Baking Tray=Sütőtál +Skillet=Serpenyő +Mortar and Pestle=Mozsár +Cutting Board=Vágódeszka +Juicer=Facsaró +Glass Mixing Bowl=Üver keverőedény +Vanilla=Vanília +Vanilla Extract=Vaníliakivonat +Wheat Seed=Búzamag +Wheat=Búza +Straw=Szívószál +Flour=Liszt +Bread=Kenyér +Sliced Bread=Szeletelt kenyér +Toast=Pirítós +Toast Sandwich=Pirítósszendvics diff --git a/mods/farming/locale/farming.it.tr b/mods/farming/locale/farming.it.tr index d041ac2b..694b2e62 100644 --- a/mods/farming/locale/farming.it.tr +++ b/mods/farming/locale/farming.it.tr @@ -1,134 +1,176 @@ -# textdomain:farming -#%s Hoe= -Apple Donut=Ciambella alla mela -#Apple Pie= -Baked Potato=Patata arrostita -Baking Tray=Teglia da forno -Banana=Banana -Banana Leaves=Foglie di banano -Bar of Dark Chocolate=Barra di cioccolato fondente -Barley=Orzo +# textdomain: farming +Artichoke= +Asparagus= Barley Seed=Seme d'orzo +Barley=Orzo +Green Beans=Fagiolini Bean Pole (place on soil before planting beans)=Palina per fagiolini (mettila sul terreno coltivabile prima di piantare i fagiolini) Beetroot=Barbabietola Beetroot Soup=Zuppa di barbabietola -#Bibimbap= +Blackberries= Wild Blueberries=Mirtilli Selvatici Blueberry Muffin=Focaccina di mirtilli Blueberry Pie=Tortino di mirtilli -Bottle of Ethanol=Bottiglia di alcol etilico -Bottle of Hemp Oil=Bottiglia d'olio di canapa -Bowl of Chili=Ciotola di peperoncino -Bread=Pane -Bronze Hoe=Zappa di bronzo -#Cabbage= -#Cactus Juice= +Cabbage= Carrot=Carota Carrot Juice=Succo di carota +Golden Carrot=Carota d'oro Chili Pepper=Peperoncino -Chocolate Block=Blocco di cioccolato -Chocolate Donut=Ciambella al cioccolato +Bowl of Chili=Ciotola di peperoncino +Chili Powder= +Raw Cocoa Beans= Cocoa Beans=Chicchi di cacao -Coffee Beans=Chicchi di caffè Cookie=Biscotto -Cooking Pot=Pentola da cottura +Bar of Dark Chocolate=Barra di cioccolato fondente +Chocolate Block=Blocco di cioccolato +Coffee Beans=Chicchi di caffè +Cup of Coffee=Tazza di caffè +Banana=Banana +Banana Leaves=Foglie di banano +Orange=Arancia Corn=Mais Corn on the Cob=Pannocchia arrostita +Popcorn= Cornstarch=Amido di mais -Cotton=Cotone +Bottle of Ethanol=Bottiglia di alcol etilico +Wild Cotton= Cotton Seed=Seme di cotone +Cotton=Cotone +String=Filo Cucumber=Cetriolo -Cucumber and Potato Salad=Insalata di patate e cetrioli -Cup of Coffee=Tazza di caffè -Cutting Board=Tagliere -Diamond Hoe=Zappa di diamante +Eggplant= +Glass of Water= +Sugar=Zucchero +Sugar Cube= +Caramel= +Salt=Sale +Mayonnaise= +Rose Water=Acqua di rose +Turkish Delight=Lokum +Garlic Bread=Pane all'aglio Donut=Ciambella -Flour=Farina +Chocolate Donut=Ciambella al cioccolato +Apple Donut=Ciambella alla mela +Porridge=Porridge +Jaffa Cake=Torta di jaffa +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=Spicchio d'aglio Garlic=Aglio Garlic Braid=Treccia d'aglio -Garlic Bread=Pane all'aglio -Garlic clove=Spicchio d'aglio -Glass Mixing Bowl=Terrina di vetro -Golden Carrot=Carota d'oro +Ginger= Grapes=Chicchi d'uva -Green Beans=Fagiolini -Ground Pepper=Pepe macinato -Hemp Block=Blocco di canapa -Hemp Fibre=Fibra di canapa -Hemp Leaf=Foglia di canapa -Hemp Rope=Corda di canapa +Trellis (place on soil before planting grapes)=Graticcio (mettilo sul terreno coltivabile prima di piantare i chicchi d'uva) Hemp Seed=Seme di canapa +Hemp Leaf=Foglia di canapa +Bottle of Hemp Oil=Bottiglia d'olio di canapa +Hemp Fibre=Fibra di canapa +Hemp Block=Blocco di canapa +Hemp Rope=Corda di canapa Hoe=Zappa -Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba zappa (usala o lanciala sulle aree erbose per zappare il terreno) -Jack 'O Lantern (punch to turn on and off)=Jack Lanterna (colpirlo per accenderlo e spegnerlo) -Jaffa Cake=Torta di jaffa -Juicer=Spremiagrumi -Melon=Anguria -Melon Slice=Fetta d'anguria +Wooden Hoe=Zappa di legno +Stone Hoe=Zappa di pietra +Steel Hoe=Zappa d'acciaio +Bronze Hoe=Zappa di bronzo Mese Hoe=Zappa di mese -#Mint Leaf= -#Mint Seeds= -#Mint Tea= -Mithril Scythe (Right-click to harvest and replant crops)=Falce di mithril (clicca col destro per raccogliere e ripiantare le prose) -Mortar and Pestle=Mortaio e pestello -Multigrain Bread=Pane multicereale -Multigrain Flour=Farina multicereale -Oat seed=Seme d'avena -#Oats= +Diamond Hoe=Zappa di diamante +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba zappa (usala o lanciala sulle aree erbose per zappare il terreno) +Mithril Scythe (Use to harvest and replant crops)= +Seed=Seme +Lettuce= +Melon Slice=Fetta d'anguria +Melon=Anguria +Mint Seeds= +Mint Leaf= +Mint Tea= Onion=Cipolla -#Onion Soup= -Orange=Arancia -#Pasta= +Onion Soup= +Parsley= Pea Pod=Baccello di piselli Pea Soup=Zuppa di piselli -Peas=Piselli -Pepper=Pepe Peppercorn=Grano di pepe -Pineapple=Ananas -Pineapple Juice=Succo d'ananas -Pineapple Ring=Anello d'ananas +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=Pepe macinato Pineapple Top=Cima d'ananas -Porridge=Porridge +Pineapple=Ananas +Pineapple Ring=Anello d'ananas +Pineapple Juice=Succo d'ananas Potato=Patata -Pumpkin=Zucca +Baked Potato=Patata arrostita +Cucumber and Potato Salad=Insalata di patate e cetrioli +Pumpkin Slice=Fetta di zucca +Jack 'O Lantern (punch to turn on and off)=Jack Lanterna (colpirlo per accenderlo e spegnerlo) +Scarecrow Bottom=Fondo dello spaventapasseri Pumpkin Bread=Pane alla zucca Pumpkin Dough=Pasta di zucca -Pumpkin Slice=Fetta di zucca +Pumpkin=Zucca Raspberries=Lamponi Raspberry Smoothie=Purea di lamponi Rhubarb=Rabarbaro Rhubarb Pie=Tortino al rabarbaro +Rice Seed= Rice=Riso Rice Bread=Pane di riso Rice Flour=Farina di riso -Rice grains=Chicchi di riso -Rose Water=Acqua di rose -Rye=Segale Rye seed=Seme di segale -Salt=Sale -Saucepan=Casseruola -#Savanna Soil= -Scarecrow Bottom=Fondo dello spaventapasseri -Seed=Seme -Skillet=Padella -Sliced Bread=Pane a fette +Rye=Segale +Oat seed=Seme d'avena +Oats= +Multigrain Flour=Farina multicereale +Multigrain Bread=Pane multicereale +Savanna Soil= +Wet Savanna Soil= Soil=Terreno coltivabile -#Spaghetti= -Steel Hoe=Zappa d'acciaio -Stone Hoe=Zappa di pietra -Straw=Paglia +Wet Soil=Terreno coltivabile bagnato +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= Strawberry=Fragola -String=Filo -Sugar=Zucchero +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Pomodoro +Tomato Soup= +Wooden Bowl=Ciotola di legno +Saucepan=Casseruola +Cooking Pot=Pentola da cottura +Baking Tray=Teglia da forno +Skillet=Padella +Mortar and Pestle=Mortaio e pestello +Cutting Board=Tagliere +Juicer=Spremiagrumi +Glass Mixing Bowl=Terrina di vetro +Vanilla= +Vanilla Extract= +Wheat Seed=Seme di grano +Wheat=Grano +Straw=Paglia +Flour=Farina +Bread=Pane +Sliced Bread=Pane a fette Toast=Pane tostato Toast Sandwich=Panino di pane tostato -Tomato=Pomodoro -Trellis (place on soil before planting grapes)=Graticcio (mettilo sul terreno coltivabile prima di piantare i chicchi d'uva) -Turkish Delight=Lokum -#Wet Savanna Soil= -Wet Soil=Terreno coltivabile bagnato -Wheat=Grano -Wheat Seed=Seme di grano -#Wild Cotton= -Wooden Bowl=Ciotola di legno -Wooden Hoe=Zappa di legno diff --git a/mods/farming/locale/farming.pt.tr b/mods/farming/locale/farming.pt.tr index c2c22485..95afd02a 100644 --- a/mods/farming/locale/farming.pt.tr +++ b/mods/farming/locale/farming.pt.tr @@ -1,134 +1,176 @@ -# textdomain:farming -#%s Hoe= -Apple Donut=Donut de Maça -#Apple Pie= -Baked Potato=Batata Cozida -#Baking Tray= -#Banana= -#Banana Leaves= -Bar of Dark Chocolate=Barra de Chocolate Preto -Barley=Cevada +# textdomain: farming +Artichoke= +Asparagus= Barley Seed=Sementes de Cevada +Barley=Cevada +Green Beans=Feijoes Verdes Bean Pole (place on soil before planting beans)=Apoio de feijao (coloque no solo antes de plantar feijao) -#Beetroot= -#Beetroot Soup= -#Bibimbap= +Beetroot= +Beetroot Soup= +Blackberries= Wild Blueberries=Mirtilos Selvagens Blueberry Muffin=Muffin de Mirtilos -#Blueberry Pie= -Bottle of Ethanol=Garrafa de Etanol -Bottle of Hemp Oil=Garrafa de Oleo de Canhamo -#Bowl of Chili= -Bread=Pao -Bronze Hoe=Enxada de Bronze -#Cabbage= -#Cactus Juice= +Blueberry Pie= +Cabbage= Carrot=Cenoura -#Carrot Juice= -#Chili Pepper= -#Chocolate Block= -Chocolate Donut=Donut de Chocolate +Carrot Juice= +Golden Carrot=Cenoura Dourada +Chili Pepper= +Bowl of Chili= +Chili Powder= +Raw Cocoa Beans= Cocoa Beans=Amendoas de Cacau -Coffee Beans=Grao de Cafe Cookie=Cookie -#Cooking Pot= +Bar of Dark Chocolate=Barra de Chocolate Preto +Chocolate Block= +Coffee Beans=Grao de Cafe +Cup of Coffee=Xicara de Cafe +Banana= +Banana Leaves= +Orange= Corn=Milho Corn on the Cob=Espiga de Milho -#Cornstarch= -Cotton=Algodao +Popcorn= +Cornstarch= +Bottle of Ethanol=Garrafa de Etanol +Wild Cotton= Cotton Seed=Sementes de Algodao +Cotton=Algodao +String= Cucumber=Pepino -#Cucumber and Potato Salad= -Cup of Coffee=Xicara de Cafe -#Cutting Board= -Diamond Hoe=Enxada de Diamante +Eggplant= +Glass of Water= +Sugar=Açucar +Sugar Cube= +Caramel= +Salt= +Mayonnaise= +Rose Water= +Turkish Delight= +Garlic Bread= Donut=Donut -Flour=Farinha -#Garlic= -#Garlic Braid= -#Garlic Bread= -#Garlic clove= -#Glass Mixing Bowl= -Golden Carrot=Cenoura Dourada +Chocolate Donut=Donut de Chocolate +Apple Donut=Donut de Maça +Porridge= +Jaffa Cake= +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove= +Garlic= +Garlic Braid= +Ginger= Grapes=Uvas -Green Beans=Feijoes Verdes -#Ground Pepper= -#Hemp Block= -Hemp Fibre=Fibra de Canhamo -Hemp Leaf=Folha de Canhamo -Hemp Rope=Corda de Canhamo +Trellis (place on soil before planting grapes)=Grade de Ripas (colocar no solo antes de plantar uvas) Hemp Seed=Sementes de Canhamo +Hemp Leaf=Folha de Canhamo +Bottle of Hemp Oil=Garrafa de Oleo de Canhamo +Hemp Fibre=Fibra de Canhamo +Hemp Block= +Hemp Rope=Corda de Canhamo Hoe=Enxada -#Hoe Bomb (use or throw on grassy areas to hoe land)= -Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Socos para ligar e desligar) -#Jaffa Cake= -#Juicer= -Melon=Melancia -Melon Slice=Sementes de Melancia +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze Mese Hoe=Enxada de Mese -#Mint Leaf= -#Mint Seeds= -#Mint Tea= -#Mithril Scythe (Right-click to harvest and replant crops)= -#Mortar and Pestle= -#Multigrain Bread= -#Multigrain Flour= -#Oat seed= -#Oats= -#Onion= -#Onion Soup= -#Orange= -#Pasta= -#Pea Pod= -#Pea Soup= -#Peas= -#Pepper= -#Peppercorn= -#Pineapple= -#Pineapple Juice= -#Pineapple Ring= -#Pineapple Top= -#Porridge= +Diamond Hoe=Enxada de Diamante +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed=Sementes +Lettuce= +Melon Slice=Sementes de Melancia +Melon=Melancia +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion= +Onion Soup= +Parsley= +Pea Pod= +Pea Soup= +Peppercorn= +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper= +Pineapple Top= +Pineapple= +Pineapple Ring= +Pineapple Juice= Potato=Batata -Pumpkin=Abobora +Baked Potato=Batata Cozida +Cucumber and Potato Salad= +Pumpkin Slice=Pedaço de Abobora +Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Socos para ligar e desligar) +Scarecrow Bottom= Pumpkin Bread=Pao de Abobora Pumpkin Dough=Massa de Abobora -Pumpkin Slice=Pedaço de Abobora +Pumpkin=Abobora Raspberries=Framboesa Raspberry Smoothie=Batida de Framboesa Rhubarb=Ruibarbo Rhubarb Pie=Torta de Ruibarbo -#Rice= -#Rice Bread= -#Rice Flour= -#Rice grains= -#Rose Water= -#Rye= -#Rye seed= -#Salt= -#Saucepan= -#Savanna Soil= -#Scarecrow Bottom= -Seed=Sementes -#Skillet= -#Sliced Bread= +Rice Seed= +Rice= +Rice Bread= +Rice Flour= +Rye seed= +Rye= +Oat seed= +Oats= +Multigrain Flour= +Multigrain Bread= +Savanna Soil= +Wet Savanna Soil= Soil=Solo -#Spaghetti= -Steel Hoe=Enxada de Aço -Stone Hoe=Enxada de Pedra -Straw=Palha -#Strawberry= -#String= -Sugar=Açucar -#Toast= -#Toast Sandwich= -Tomato=Tomate -Trellis (place on soil before planting grapes)=Grade de Ripas (colocar no solo antes de plantar uvas) -#Turkish Delight= -#Wet Savanna Soil= Wet Soil=Solo Seco -Wheat=Trigo +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry= +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Tomate +Tomato Soup= +Wooden Bowl= +Saucepan= +Cooking Pot= +Baking Tray= +Skillet= +Mortar and Pestle= +Cutting Board= +Juicer= +Glass Mixing Bowl= +Vanilla= +Vanilla Extract= Wheat Seed=Sementes de Trigo -#Wild Cotton= -#Wooden Bowl= -Wooden Hoe=Enxada de Madeira +Wheat=Trigo +Straw=Palha +Flour=Farinha +Bread=Pao +Sliced Bread= +Toast= +Toast Sandwich= diff --git a/mods/farming/locale/farming.ru.tr b/mods/farming/locale/farming.ru.tr index dce5eb1c..e78e043a 100644 --- a/mods/farming/locale/farming.ru.tr +++ b/mods/farming/locale/farming.ru.tr @@ -1,134 +1,186 @@ -# textdomain:farming -%s Hoe=%s мотыга -Apple Donut=Яблочный пончик -Apple Pie=Яблочный пирог -Baked Potato=Печеный картофель -Baking Tray=Противень -Banana=Банан -Banana Leaves=Листья банана -Bar of Dark Chocolate=Плитка темного шоколада -Barley=Ячмень +# textdomain: farming + Crop=. +Artichoke=Артишок +Asparagus=Спаржа Barley Seed=Семена ячменя +Barley=Ячмень +Green Beans=Зеленая фасоль Bean Pole (place on soil before planting beans)=Жердь для бобовых (установите на почву перед посадкой бобовых) Beetroot=Свекла Beetroot Soup=Борщ -#Bibimbap= +Blackberry=Ежевика +Blackberries=Ежевика Wild Blueberries=Голубика +Blueberry=Голубика Blueberry Muffin=Кекс с голубикой Blueberry Pie=Пирог с голубикой -Bottle of Ethanol=Бутылка спирта -Bottle of Hemp Oil=Бутылка конопляного масла -Bowl of Chili=Миска чили -Bread=Хлеб -Bronze Hoe=Бронзовая мотыга -#Cabbage= -Cactus Juice=Кактусовый сок +Cabbage=Капуста Carrot=Морковь Carrot Juice=Морковный сок +Golden Carrot=Золотая морковь Chili Pepper=Перец чили -Chocolate Block=Шоколадный блок -Chocolate Donut=Шоколадный пончик +Bowl of Chili=Миска чили +Chili Powder=Порошок чили +Raw Cocoa Beans=Сырые какао-бобы Cocoa Beans=Какао-бобы -Coffee Beans=Кофейные зерна Cookie=Печенье -Cooking Pot=Котел +Bar of Dark Chocolate=Плитка темного шоколада +Chocolate Block=Шоколадный блок +Coffee=Кофе +Coffee Beans=Кофейные зерна +Cup of Coffee=Чашка кофе +Banana=Банан +Banana Leaves=Листья банана +Orange=Апельсин Corn=Кукуруза Corn on the Cob=Початок кукурузы +Popcorn=Попкорн Cornstarch=Кукурузный крахмал -Cotton=Хлопок +Bottle of Ethanol=Бутылка спирта +Wild Cotton=Дикорастущий хлопок Cotton Seed=Семена хлопка +Cotton=Хлопок +String=Нить Cucumber=Огурец -Cucumber and Potato Salad=Салат из огурцов и картофеля -Cup of Coffee=Чашка кофе -Cutting Board=Разделочная доска -Diamond Hoe=Алмазная мотыга +Eggplant=Баклажан +Glass of Water=Стакан воды +Sugar=Сахар +Sugar Cube=Кусочек сахара +Caramel=Карамель +Salt=Соль +Mayonnaise=Майонез +Rose Water=Розовая вода +Turkish Delight=Рахат-лукум +Garlic Bread=Чесночный хлеб Donut=Пончик -Flour=Мука +Chocolate Donut=Шоколадный пончик +Apple Donut=Яблочный пончик +Porridge=Каша +Jaffa Cake=Яффский пирог +Apple Pie=Яблочный пирог +Cactus Juice=Кактусовый сок +Pasta=Паста +Mac & Cheese=Макароны с сыром +Spaghetti=Спагетти +Bibimbap=Бибимпап +Burger=Бургер +Salad=Салат +Triple Berry Smoothie=Тройной ягодный смузи +Spanish Potatoes=Испанский картофель +Potato omelet=Картофельный омлет +Paella=Паэлья +Vanilla Flan=Ванильный флан +Vegan Cheese=Веганский сыр +Onigiri=Онигири +Gyoza=Гёдза +Mochi=Моти +Gingerbread Man=Пряничный человечек +Garlic clove=Зубчик чеснока Garlic=Чеснок Garlic Braid=Связка чеснока -Garlic Bread=Чесночный хлеб -Garlic clove=Зубчик чеснока -Glass Mixing Bowl=Стеклянная чаша -Golden Carrot=Золотая морковь +Ginger=Имбирь Grapes=Виноград -Green Beans=Зеленая фасоль -Ground Pepper=Молотый перец -Hemp Block=Блок конопли -Hemp Fibre=Конопляное волокно -Hemp Leaf=Лист конопли -Hemp Rope=Пеньковая веревка +Trellis (place on soil before planting grapes)=Решетка (поставьте на почву перед посадкой винограда) +Hemp=Конопля Hemp Seed=Семена конопли +Hemp Leaf=Лист конопли +Bottle of Hemp Oil=Бутылка конопляного масла +Hemp Fibre=Конопляное волокно +Hemp Block=Блок конопли +Hemp Rope=Пеньковая веревка Hoe=Мотыга -Hoe Bomb (use or throw on grassy areas to hoe land)=Мотыгобомба (используйте или бросьте на траву для ее обработки) -Jack 'O Lantern (punch to turn on and off)=Светильник джека (удар для включения и выключения) -Jaffa Cake=Яффский пирог -Juicer=Соковыжималка -Melon=Арбуз -Melon Slice=Долька арбуза +Wooden Hoe=Деревянная мотыга +Stone Hoe=Каменная мотыга +Steel Hoe=Стальная мотыга +Bronze Hoe=Бронзовая мотыга Mese Hoe=Магическая мотыга -Mint Leaf=Лист мяты +Diamond Hoe=Алмазная мотыга +Wood Hoe=Деревянная мотыга +Hoe Bomb (use or throw on grassy areas to hoe land)=Мотыгобомба (используйте или бросьте на траву для ее обработки) +Mithril Scythe (Use to harvest and replant crops)=Мифриловая коса (используется для сбора и пересадки урожая) +Seed=Семена +Lettuce=Латук +Melon Slice=Долька арбуза +Melon=Арбуз +Mint=Мята Mint Seeds=Семена мяты +Mint Leaf=Лист мяты Mint Tea=Чай с мятой -Mithril Scythe (Right-click to harvest and replant crops)=Мифриловая коса (Щелкните правой кнопкой мыши для сбора и пересадки растений) -Mortar and Pestle=Ступка и пестик -Multigrain Bread=Мультизерновой хлеб -Multigrain Flour=Мультизерновая мука -Oat seed=Семена овса -#Oats= Onion=Лук Onion Soup=Луковый суп -Orange=Апельсин -#Pasta= +Parsley=Петрушка +Pea=Горох Pea Pod=Стручок гороха Pea Soup=Гороховый суп -Peas=Горох Pepper=Перец Peppercorn=Перчинка -Pineapple=Ананас -Pineapple Juice=Ананасовый сок -Pineapple Ring=Кольцо ананаса +Green Pepper=Зеленый перец +Yellow Pepper=Желтый перец +Red Pepper=Красный перец +Ground Pepper=Молотый перец Pineapple Top=Верхушка ананаса -Porridge=Каша +Pineapple=Ананас +Pineapple Ring=Кольцо ананаса +Pineapple Juice=Ананасовый сок Potato=Картофель -Pumpkin=Тыква +Baked Potato=Печеный картофель +Cucumber and Potato Salad=Салат из огурцов и картофеля +Pumpkin Slice=Ломтик тыквы +Jack 'O Lantern (punch to turn on and off)=Светильник джека (удар для включения и выключения) +Scarecrow Bottom=Основание пугала Pumpkin Bread=Тыквенный хлеб Pumpkin Dough=Тыквенное тесто -Pumpkin Slice=Ломтик тыквы +Pumpkin=Тыква +Raspberry=Малина Raspberries=Малина Raspberry Smoothie=Малиновый смузи Rhubarb=Ревень Rhubarb Pie=Пирог с ревенем +Rice Seed=Семена риса Rice=Рис Rice Bread=Рисовый хлеб Rice Flour=Рисовая мука -Rice grains=Зёрна риса -Rose Water=Розовая вода -Rye=Рожь Rye seed=Зёрна ржи -Salt=Соль -Saucepan=Кастрюля +Rye=Рожь +Oat seed=Семена овса +Oats=Овес +Multigrain Flour=Мультизерновая мука +Multigrain Bread=Мультизерновой хлеб Savanna Soil=Земля саванны -Scarecrow Bottom=Основание пугала -Seed=Семена -Skillet=Сковорода -Sliced Bread=Нарезанный хлеб +Wet Savanna Soil=Увлажненная земля саванны Soil=Земля -#Spaghetti= -Steel Hoe=Стальная мотыга -Stone Hoe=Каменная мотыга -Straw=Солома +Wet Soil=Увлажненная земля +Soy=Соя +Soy Pod=Соевый стручок +Soy Sauce=Соевый соус +Soy Milk=Соевое молоко +Tofu=Тофу +Cooked Tofu=Вареный тофу +Spinach=Шпинат Strawberry=Земляника -String=Нить -Sugar=Сахар +Sunflower=Подсолнечник +Sunflower Seeds=Семена подсолнечника +Toasted Sunflower Seeds=Жаренные семена подсолнечника +Bottle of Sunflower Oil=Бутылка подсолнечного масла +Sunflower Seed Bread=Хлеб из семян подсолнечника +Tomato=Помидор +Tomato Soup=Томатный суп +Wooden Bowl=Деревянная миска +Saucepan=Кастрюля +Cooking Pot=Котел +Baking Tray=Противень +Skillet=Сковорода +Mortar and Pestle=Ступка и пестик +Cutting Board=Разделочная доска +Juicer=Соковыжималка +Glass Mixing Bowl=Стеклянная чаша +Vanilla=Ваниль +Vanilla Extract=Экстракт ванили +Wheat Seed=Зёрна пшеницы +Wheat=Пшеница +Straw=Солома +Flour=Мука +Bread=Хлеб +Sliced Bread=Нарезанный хлеб Toast=Тост Toast Sandwich=Сэндвич -Tomato=Помидор -Trellis (place on soil before planting grapes)=Решетка (поставьте на почву перед посадкой винограда) -Turkish Delight=Рахат-лукум -Wet Savanna Soil=Увлажненная земля саванны -Wet Soil=Увлажненная земля -Wheat=Пшеница -Wheat Seed=Зёрна пшеницы -Wild Cotton=Дикорастущий хлопок -Wooden Bowl=Деревянная миска -Wooden Hoe=Деревянная мотыга diff --git a/mods/farming/locale/farming.zh_CN.tr b/mods/farming/locale/farming.zh_CN.tr index 88207055..b773d32f 100644 --- a/mods/farming/locale/farming.zh_CN.tr +++ b/mods/farming/locale/farming.zh_CN.tr @@ -1,134 +1,176 @@ -# textdomain:farming -#%s Hoe= -Apple Donut=苹果甜甜圈 -#Apple Pie= -Baked Potato=焗马铃薯 -Baking Tray=烤盘 -Banana=香蕉 -Banana Leaves=香蕉叶 -Bar of Dark Chocolate=黑巧克力条 -Barley=大麦 +# textdomain: farming +Artichoke= +Asparagus= Barley Seed=大麦种子 +Barley=大麦 +Green Beans=青豆 Bean Pole (place on soil before planting beans)=豆杆(种豆前先放在土上) Beetroot=甜菜根 Beetroot Soup=甜菜根汤 -#Bibimbap= +Blackberries= Wild Blueberries=蓝莓 Blueberry Muffin=蓝莓松糕 Blueberry Pie=蓝莓派 -Bottle of Ethanol=一瓶乙醇 -Bottle of Hemp Oil=一瓶大麻油 -Bowl of Chili=一碗辣椒 -Bread=面包 -Bronze Hoe=青铜锄头 -#Cabbage= -#Cactus Juice= +Cabbage= Carrot=胡萝卜 Carrot Juice=胡萝卜汁 +Golden Carrot=金萝卜 Chili Pepper=辣椒 -Chocolate Block=巧克力块 -Chocolate Donut=巧克力甜甜圈 +Bowl of Chili=一碗辣椒 +Chili Powder= +Raw Cocoa Beans= Cocoa Beans=可可豆 -Coffee Beans=咖啡豆 Cookie=曲奇 -Cooking Pot=锅 +Bar of Dark Chocolate=黑巧克力条 +Chocolate Block=巧克力块 +Coffee Beans=咖啡豆 +Cup of Coffee=一杯咖啡 +Banana=香蕉 +Banana Leaves=香蕉叶 +Orange=橙色 Corn=玉米 Corn on the Cob=玉米棒 +Popcorn= Cornstarch=玉米淀粉 -Cotton=棉花 +Bottle of Ethanol=一瓶乙醇 +Wild Cotton= Cotton Seed=棉籽 +Cotton=棉花 +String=线 Cucumber=黄瓜 -Cucumber and Potato Salad=黄瓜土豆沙拉 -Cup of Coffee=一杯咖啡 -Cutting Board=砧板 -Diamond Hoe=钻石锄 +Eggplant= +Glass of Water= +Sugar=糖 +Sugar Cube= +Caramel= +Salt=盐 +Mayonnaise= +Rose Water=玫瑰汁 +Turkish Delight=土耳其软糖 +Garlic Bread=蒜香面包 Donut=甜甜圈 -Flour=面粉 +Chocolate Donut=巧克力甜甜圈 +Apple Donut=苹果甜甜圈 +Porridge=粥 +Jaffa Cake=佳发饼 +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=蒜瓣 Garlic=大蒜 Garlic Braid=蒜辫 -Garlic Bread=蒜香面包 -Garlic clove=蒜瓣 -Glass Mixing Bowl=搅拌杯 -Golden Carrot=金萝卜 +Ginger= Grapes=葡萄 -Green Beans=青豆 -Ground Pepper=胡椒粉 -Hemp Block=麻块 -Hemp Fibre=大麻纤维 -Hemp Leaf=大麻叶 -Hemp Rope=麻绳 +Trellis (place on soil before planting grapes)=棚架(种植葡萄前先放在土壤上) Hemp Seed=大麻籽 +Hemp Leaf=大麻叶 +Bottle of Hemp Oil=一瓶大麻油 +Hemp Fibre=大麻纤维 +Hemp Block=麻块 +Hemp Rope=麻绳 Hoe=锄头 -Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在草地上使用或扔在锄地上) -Jack 'O Lantern (punch to turn on and off)=南瓜灯(按一下开关) -Jaffa Cake=佳发饼 -Juicer=榨汁机 -Melon=甜瓜 -Melon Slice=西瓜片 +Wooden Hoe=木锄 +Stone Hoe=石锄 +Steel Hoe=钢锄头 +Bronze Hoe=青铜锄头 Mese Hoe=黄石锄头 -#Mint Leaf= -#Mint Seeds= -#Mint Tea= -Mithril Scythe (Right-click to harvest and replant crops)=秘银镰刀(右击可收获并重新种植作物) -Mortar and Pestle=研钵 -Multigrain Bread=杂粮面包 -Multigrain Flour=多粒面粉 -Oat seed=燕麦籽 -#Oats= +Diamond Hoe=钻石锄 +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在草地上使用或扔在锄地上) +Mithril Scythe (Use to harvest and replant crops)= +Seed=种子 +Lettuce= +Melon Slice=西瓜片 +Melon=甜瓜 +Mint Seeds= +Mint Leaf= +Mint Tea= Onion=洋葱 -#Onion Soup= -Orange=橙色 -#Pasta= +Onion Soup= +Parsley= Pea Pod=豌豆荚 Pea Soup=豌豆汤 -Peas=豌豆 -Pepper=胡椒粉 Peppercorn=胡椒粉 -Pineapple=菠萝 -Pineapple Juice=菠萝汁 -Pineapple Ring=菠萝圈 +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=胡椒粉 Pineapple Top=菠萝上衣 -Porridge=粥 +Pineapple=菠萝 +Pineapple Ring=菠萝圈 +Pineapple Juice=菠萝汁 Potato=土豆 -Pumpkin=南瓜 +Baked Potato=焗马铃薯 +Cucumber and Potato Salad=黄瓜土豆沙拉 +Pumpkin Slice=南瓜片 +Jack 'O Lantern (punch to turn on and off)=杰克灯(按一下开关) +Scarecrow Bottom=稻草人屁股 Pumpkin Bread=南瓜面包 Pumpkin Dough=南瓜面团 -Pumpkin Slice=南瓜片 +Pumpkin=南瓜 Raspberries=覆盆子 Raspberry Smoothie=覆盆子冰沙 Rhubarb=大黄 Rhubarb Pie=大黄派 +Rice Seed= Rice=大米 Rice Bread=米饭面包 Rice Flour=米粉 -Rice grains=稻谷 -Rose Water=玫瑰汁 -Rye=黑麦 Rye seed=黑麦种子 -Salt=盐 -Saucepan=平底锅 -#Savanna Soil= -Scarecrow Bottom=稻草人屁股 -Seed=种子 -Skillet=平底锅 -Sliced Bread=切片面包 +Rye=黑麦 +Oat seed=燕麦籽 +Oats= +Multigrain Flour=多粒面粉 +Multigrain Bread=杂粮面包 +Savanna Soil= +Wet Savanna Soil= Soil=土壤 -#Spaghetti= -Steel Hoe=钢锄头 -Stone Hoe=石锄 -Straw=稻草 +Wet Soil=湿土 +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= Strawberry=草莓 -String=线 -Sugar=糖 +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=番茄 +Tomato Soup= +Wooden Bowl=木碗 +Saucepan=平底锅 +Cooking Pot=锅 +Baking Tray=烤盘 +Skillet=平底锅 +Mortar and Pestle=研钵 +Cutting Board=砧板 +Juicer=榨汁机 +Glass Mixing Bowl=搅拌杯 +Vanilla= +Vanilla Extract= +Wheat Seed=小麦种子 +Wheat=小麦 +Straw=稻草 +Flour=面粉 +Bread=面包 +Sliced Bread=切片面包 Toast=烤面包片 Toast Sandwich=三明治面包 -Tomato=番茄 -Trellis (place on soil before planting grapes)=棚架(种植葡萄前先放在土壤上) -Turkish Delight=土耳其软糖 -#Wet Savanna Soil= -Wet Soil=湿土 -Wheat=小麦 -Wheat Seed=小麦种子 -#Wild Cotton= -Wooden Bowl=木碗 -Wooden Hoe=木锄 diff --git a/mods/farming/locale/farming.zh_TW.tr b/mods/farming/locale/farming.zh_TW.tr index a72f7397..07a874a9 100644 --- a/mods/farming/locale/farming.zh_TW.tr +++ b/mods/farming/locale/farming.zh_TW.tr @@ -1,134 +1,176 @@ -# textdomain:farming -#%s Hoe= -Apple Donut=蘋果甜甜圈 -#Apple Pie= -Baked Potato=焗馬鈴薯 -Baking Tray=烤盤 -Banana=香蕉 -Banana Leaves=香蕉葉 -Bar of Dark Chocolate=黑巧克力條 -Barley=大麥 +# textdomain: farming +Artichoke= +Asparagus= Barley Seed=大麥種子 +Barley=大麥 +Green Beans=青豆 Bean Pole (place on soil before planting beans)=豆杆(種豆前先放在土上) Beetroot=甜菜根 Beetroot Soup=甜菜根湯 -#Bibimbap= +Blackberries= Wild Blueberries=藍莓 Blueberry Muffin=藍莓鬆糕 Blueberry Pie=藍莓派 -Bottle of Ethanol=一瓶乙醇 -Bottle of Hemp Oil=一瓶大麻油 -Bowl of Chili=一碗辣椒 -Bread=麵包 -Bronze Hoe=青銅鋤頭 -#Cabbage= -#Cactus Juice= +Cabbage= Carrot=胡蘿蔔 Carrot Juice=胡蘿蔔汁 +Golden Carrot=金蘿蔔 Chili Pepper=辣椒 -Chocolate Block=巧克力塊 -Chocolate Donut=巧克力甜甜圈 +Bowl of Chili=一碗辣椒 +Chili Powder= +Raw Cocoa Beans= Cocoa Beans=可可豆 -Coffee Beans=咖啡豆 Cookie=曲奇 -Cooking Pot=鍋 +Bar of Dark Chocolate=黑巧克力條 +Chocolate Block=巧克力塊 +Coffee Beans=咖啡豆 +Cup of Coffee=一杯咖啡 +Banana=香蕉 +Banana Leaves=香蕉葉 +Orange=橙色 Corn=玉米 Corn on the Cob=玉米棒 +Popcorn= Cornstarch=玉米澱粉 -Cotton=棉花 +Bottle of Ethanol=一瓶乙醇 +Wild Cotton= Cotton Seed=棉籽 +Cotton=棉花 +String=字符串 Cucumber=黃瓜 -Cucumber and Potato Salad=黃瓜土豆沙拉 -Cup of Coffee=一杯咖啡 -Cutting Board=砧板 -Diamond Hoe=鑽石鋤 +Eggplant= +Glass of Water= +Sugar=糖 +Sugar Cube= +Caramel= +Salt=鹽 +Mayonnaise= +Rose Water=玫瑰汁 +Turkish Delight=土耳其軟糖 +Garlic Bread=蒜香麵包 Donut=甜甜圈 -Flour=麵粉 +Chocolate Donut=巧克力甜甜圈 +Apple Donut=蘋果甜甜圈 +Porridge=粥 +Jaffa Cake=佳發餅 +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=蒜瓣 Garlic=大蒜 Garlic Braid=蒜辮 -Garlic Bread=蒜香麵包 -Garlic clove=蒜瓣 -Glass Mixing Bowl=攪拌杯 -Golden Carrot=金蘿蔔 +Ginger= Grapes=葡萄 -Green Beans=青豆 -Ground Pepper=胡椒粉 -Hemp Block=麻塊 -Hemp Fibre=大麻纖維 -Hemp Leaf=大麻葉 -Hemp Rope=麻繩 +Trellis (place on soil before planting grapes)=棚架(種植葡萄前先放在土壤上) Hemp Seed=大麻籽 +Hemp Leaf=大麻葉 +Bottle of Hemp Oil=一瓶大麻油 +Hemp Fibre=大麻纖維 +Hemp Block=麻塊 +Hemp Rope=麻繩 Hoe=鋤頭 -Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在草地上使用或扔在鋤地上) -Jack 'O Lantern (punch to turn on and off)=南瓜燈(按一下開關) -Jaffa Cake=佳發餅 -Juicer=榨汁機 -Melon=甜瓜 -Melon Slice=西瓜片 +Wooden Hoe=木鋤 +Stone Hoe=石鋤 +Steel Hoe=鋼鋤頭 +Bronze Hoe=青銅鋤頭 Mese Hoe=黃石鋤頭 -#Mint Leaf= -#Mint Seeds= -#Mint Tea= -Mithril Scythe (Right-click to harvest and replant crops)=祕銀鐮刀(右擊可收穫並重新種植作物) -Mortar and Pestle=研缽 -Multigrain Bread=雜糧麵包 -Multigrain Flour=多粒麵粉 -Oat seed=燕麥籽 -#Oats= +Diamond Hoe=鑽石鋤 +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在草地上使用或扔在鋤地上) +Mithril Scythe (Use to harvest and replant crops)= +Seed=種子 +Lettuce= +Melon Slice=西瓜片 +Melon=甜瓜 +Mint Seeds= +Mint Leaf= +Mint Tea= Onion=洋蔥 -#Onion Soup= -Orange=橙色 -#Pasta= +Onion Soup= +Parsley= Pea Pod=豌豆莢 Pea Soup=豌豆湯 -Peas=豌豆 -Pepper=胡椒粉 Peppercorn=胡椒粉 -Pineapple=菠蘿 -Pineapple Juice=菠蘿汁 -Pineapple Ring=菠蘿圈 +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=胡椒粉 Pineapple Top=菠蘿上衣 -Porridge=粥 +Pineapple=菠蘿 +Pineapple Ring=菠蘿圈 +Pineapple Juice=菠蘿汁 Potato=土豆 -Pumpkin=南瓜 +Baked Potato=焗馬鈴薯 +Cucumber and Potato Salad=黃瓜土豆沙拉 +Pumpkin Slice=南瓜片 +Jack 'O Lantern (punch to turn on and off)=南瓜燈(按一下開關) +Scarecrow Bottom=稻草人屁股 Pumpkin Bread=南瓜麵包 Pumpkin Dough=南瓜麵糰 -Pumpkin Slice=南瓜片 +Pumpkin=南瓜 Raspberries=覆盆子 Raspberry Smoothie=覆盆子冰沙 Rhubarb=大黃 Rhubarb Pie=大黃派 +Rice Seed= Rice=大米 Rice Bread=米飯麵包 Rice Flour=米粉 -Rice grains=稻穀 -Rose Water=玫瑰汁 -Rye=黑麥 Rye seed=黑麥種子 -Salt=鹽 -Saucepan=平底鍋 -#Savanna Soil= -Scarecrow Bottom=稻草人屁股 -Seed=種子 -Skillet=平底鍋 -Sliced Bread=切片面包 +Rye=黑麥 +Oat seed=燕麥籽 +Oats= +Multigrain Flour=多粒麵粉 +Multigrain Bread=雜糧麵包 +Savanna Soil= +Wet Savanna Soil= Soil=土壤 -#Spaghetti= -Steel Hoe=鋼鋤頭 -Stone Hoe=石鋤 -Straw=稻草 +Wet Soil=溼土 +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= Strawberry=草莓 -String=線 -Sugar=糖 +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=番茄 +Tomato Soup= +Wooden Bowl=木碗 +Saucepan=平底鍋 +Cooking Pot=鍋 +Baking Tray=烤盤 +Skillet=平底鍋 +Mortar and Pestle=研缽 +Cutting Board=砧板 +Juicer=榨汁機 +Glass Mixing Bowl=攪拌杯 +Vanilla= +Vanilla Extract= +Wheat Seed=小麥種子 +Wheat=小麥 +Straw=稻草 +Flour=麵粉 +Bread=麵包 +Sliced Bread=切片面包 Toast=烤麵包片 Toast Sandwich=三明治麵包 -Tomato=番茄 -Trellis (place on soil before planting grapes)=棚架(種植葡萄前先放在土壤上) -Turkish Delight=土耳其軟糖 -#Wet Savanna Soil= -Wet Soil=溼土 -Wheat=小麥 -Wheat Seed=小麥種子 -#Wild Cotton= -Wooden Bowl=木碗 -Wooden Hoe=木鋤 diff --git a/mods/farming/locale/fr.txt b/mods/farming/locale/fr.txt deleted file mode 100644 index 04a5b1be..00000000 --- a/mods/farming/locale/fr.txt +++ /dev/null @@ -1,195 +0,0 @@ -# Traduction Française du mod farming par TenPlus1 -# textdomain: farming -# author: Papaou30 -# author: TheDarkTiger -# last update: 2020/Apr/26 - -###### folder . ###### - -### init.lua ### -Seed=Graine - -### compatibility.lua ### -Banana=Banane -Banana Leaves=Feuilles de Banane -Orange=Orange -Strawberry=Fraise - -### food.lua ### -Sugar=Sucre -Salt=Sel -Rose Water=Eau de Rose -Turkish Delight=Douceur Turque -Garlic Bread=Pain à l'Ail -Donut=Beignet -Chocolate Donut=Beignet au chocolat -Apple Donut=Beignet aux pommes -Porridge=Gruau de céréales -Jaffa Cake=Petit gâteau à l'orange "Jaffa" - -### hoes.lua ### -Hoe=Binette -Wooden Hoe=Binette en Bois -Stone Hoe=Binette en Pierre -Steel Hoe=Binette en Acier -Bronze Hoe=Binette en Bronze -Mese Hoe=Binette en Mese -Diamond Hoe=Binette en Diamant -# Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)=Bombe à binnage (Actionner ou lancer sur une zone herbeuse pour la binner) -Mithril Scythe (Right-click to harvest and replant crops)=Faux en Mithril (Récolte et replante des graines) -# Surcharge du mod [Toolranks] à faire # - -### soil.lua ### -Soil=Sol binné -Wet Soil=Sol binné humide - -### utensils.lua ### -Wooden Bowl=Bol en Bois -Saucepan=Casserole -Cooking Pot=Fait-tout -Baking Tray=Lèche-frite -Skillet=Poêle -Mortar and Pestle=Mortier et Pilon -Cutting Board=Planche à découper -Juicer=Presse-agrumes -Glass Mixing Bowl=Terrine en Verre - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed=Graine d'Orge -Barley=Orge - -### beans.lua ### -Green Beans=Haricots verts -Bean Pole (place on soil before planting beans)=Tuteur pour haricots (placer sur le sol avant de planter des haricots) - -### beetroot.lua ### -Beetroot=Betrave -Beetroot Soup=Soupe de Betrave - -### blueberry.lua ### -Blueberries=Myrtilles -Blueberry Muffin=Muffin aux Myrtilles -Blueberry Pie=Tarte aux Myrtilles - -### carrot.lua ## -Carrot=Carotte -Carrot Juice=Jus de Carotte -Golden Carrot=Carotte dorée - -### chili.lua ### -Chili Pepper=Piment Rouge -Bowl of Chili=Assiette de Chilli - -### cocoa.lua ### -Cocoa Beans=Fèves de Cacao -Cookie=Cookie -Bar of Dark Chocolate=Tablette de Chocolat noir -Chocolate Block=Block de Chocolat - -### coffee.lua ### -Coffee Beans=Grains de café -Cup of Coffee=Tasse de café - -### corn.lua ### -Corn=Maïs -Corn on the Cob=Cobette (Maïs cuit) -Cornstarch=Fécule de Maïs -Bottle of Ethanol=Bouteille d'Éthanol - -### cotton.lua ### -Cotton Seed=Graines de Coton -Cotton=Coton -String=Ficelle - -### cucumber.lua ### -Cucumber=Concombre - -### garlic.lua ### -Garlic clove=Gousse d'Ail -Garlic=Tête d'Ail -Garlic Braid=Ail tressé - -### grapes.lua ### -Grapes=Raisins -Trellis (place on soil before planting grapes)=Treillis (placer sur le sol avant de planter la vigne) - -### hemp.lua ### -Hemp Seed=Graines de Chanvre -Hemp Leaf=Feuille de Chanvre -Bottle of Hemp Oil=Bouteille d'huile de Chanvre -Hemp Fibre=Fibre de Chanvre -Hemp Block=Bloc de Chanvre -Hemp Rope=Corde de Chanvre - -### melon.lua ### -Melon Slice=Tranche de Melon -Melon=Melon - -### onion.lua ### -Onion=Oignon - -### peas.lua ### -Pea Pod=Cosse de Petit-poids -Peas=Petit-poids -Pea Soup=Soupe de Petit-poids - -### pepper.lua ### -Peppercorn=Grain de Poivre -Pepper=Poivron -Ground Pepper=Poivre moulu - -### pinapple.lua ### -Pineapple Top=Pousse d'Ananas -Pineapple=Ananas -Pineapple Ring=Tranche d'Ananas -Pineapple Juice=Jus d'Ananas - -### potato.lua ### -Potato=Pomme de terre -Baked Potato=Pomme de terre cuite -Cucumber and Potato Salad=Salade de Pomme de terre au Concombre - -### pumpkin.lua ### -Pumpkin Slice=Tranche de Citrouille -Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Frapper pour allumer et éteindre) -Scarecrow Bottom=Base d'Epouventail -Pumpkin Bread=Pain à la Citrouille -Pumpkin Dough=Pâton de pain à la Citrouille -Pumpkin=Citrouille - -### raspberry.lua ### -Raspberries=Framboises -Raspberry Smoothie=Smoothie aux Framboises - -### rhubarb.lua ### -Rhubarb=Rhubarbe -Rhubarb Pie=Tarte à la rhubarbe - -### ryeoatrice.lua ### -Rye=Seigle -Rye seed=Grains de Seigle -Oat=Orge -Oat seed=Grains d'Orge -Rice=Riz -Rice grains=Grain de Riz -Rice Bread=Pain de Riz -Rice Flour=Farine de Riz -Multigrain Flour=Farine Multi-céréales -Multigrain Bread=Pain aux Céréales - -### tomato.lua ### -Tomato=Tomate - -### wheat.lua ### -Wheat Seed=Grain de blé -Wheat=Blé -Straw=Paille -Flour=Farine -Bread=Pain -Sliced Bread=Tranche de Pain -Toast=Pain Grillé -Toast Sandwich=Sandwich au Pain diff --git a/mods/farming/locale/it.txt b/mods/farming/locale/it.txt deleted file mode 100644 index cbb6a2de..00000000 --- a/mods/farming/locale/it.txt +++ /dev/null @@ -1,194 +0,0 @@ -# Translation of the farming mod by TenPlus1 -# textdomain: farming -# author: (Hamlet) -# last update: 2020/Jun/02 - -###### folder . ###### - -### init.lua ### -Seed=Seme - -### compatibility.lua ### -Banana=Banana -Banana Leaves=Foglie di banano -Orange=Arancia -Strawberry=Fragola - -### food.lua ### -Sugar=Zucchero -Salt=Sale -Rose Water=Acqua di rose -Turkish Delight=Lokum -Garlic Bread=Pane all'aglio -Donut=Ciambella -Chocolate Donut=Ciambella al cioccolato -Apple Donut=Ciambella alla mela -Porridge=Porridge -Jaffa Cake=Torta di jaffa - -### hoes.lua ### -Hoe=Zappa -Wooden Hoe=Zappa di legno -Stone Hoe=Zappa di pietra -Steel Hoe=Zappa d'acciaio -Bronze Hoe=Zappa di bronzo -Mese Hoe=Zappa di mese -Diamond Hoe=Zappa di diamante -# Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba zappa (usala o lanciala sulle aree erbose per zappare il terreno) -Mithril Scythe (Right-click to harvest and replant crops)=Falce di mithril (clicca col destro per raccogliere e ripiantare le prose) -# Surcharge du mod [Toolranks] à faire # - -### soil.lua ### -Soil=Terreno coltivabile -Wet Soil=Terreno coltivabile bagnato - -### utensils.lua ### -Wooden Bowl=Ciotola di legno -Saucepan=Casseruola -Cooking Pot=Pentola da cottura -Baking Tray=Teglia da forno -Skillet=Padella -Mortar and Pestle=Mortaio e pestello -Cutting Board=Tagliere -Juicer=Spremiagrumi -Glass Mixing Bowl=Terrina di vetro - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed=Seme d'orzo -Barley=Orzo - -### beans.lua ### -Green Beans=Fagiolini -Bean Pole (place on soil before planting beans)=Palina per fagiolini (mettila sul terreno coltivabile prima di piantare i fagiolini) - -### beetroot.lua ### -Beetroot=Barbabietola -Beetroot Soup=Zuppa di barbabietola - -### blueberry.lua ### -Blueberries=Mirtilli -Blueberry Muffin=Focaccina di mirtilli -Blueberry Pie=Tortino di mirtilli - -### carrot.lua ## -Carrot=Carota -Carrot Juice=Succo di carota -Golden Carrot=Carota d'oro - -### chili.lua ### -Chili Pepper=Peperoncino -Bowl of Chili=Ciotola di peperoncino - -### cocoa.lua ### -Cocoa Beans=Chicchi di cacao -Cookie=Biscotto -Bar of Dark Chocolate=Barra di cioccolato fondente -Chocolate Block=Blocco di cioccolato - -### coffee.lua ### -Coffee Beans=Chicchi di caffè -Cup of Coffee=Tazza di caffè - -### corn.lua ### -Corn=Mais -Corn on the Cob=Pannocchia arrostita -Cornstarch=Amido di mais -Bottle of Ethanol=Bottiglia di alcol etilico - -### cotton.lua ### -Cotton Seed=Seme di cotone -Cotton=Cotone -String=Filo - -### cucumber.lua ### -Cucumber=Cetriolo - -### garlic.lua ### -Garlic clove=Spicchio d'aglio -Garlic=Aglio -Garlic Braid=Treccia d'aglio - -### grapes.lua ### -Grapes=Chicchi d'uva -Trellis (place on soil before planting grapes)=Graticcio (mettilo sul terreno coltivabile prima di piantare i chicchi d'uva) - -### hemp.lua ### -Hemp Seed=Seme di canapa -Hemp Leaf=Foglia di canapa -Bottle of Hemp Oil=Bottiglia d'olio di canapa -Hemp Fibre=Fibra di canapa -Hemp Block=Blocco di canapa -Hemp Rope=Corda di canapa - -### melon.lua ### -Melon Slice=Fetta d'anguria -Melon=Anguria - -### onion.lua ### -Onion=Cipolla - -### peas.lua ### -Pea Pod=Baccello di piselli -Peas=Piselli -Pea Soup=Zuppa di piselli - -### pepper.lua ### -Peppercorn=Grano di pepe -Pepper=Pepe -Ground Pepper=Pepe macinato - -### pinapple.lua ### -Pineapple Top=Cima d'ananas -Pineapple=Ananas -Pineapple Ring=Anello d'ananas -Pineapple Juice=Succo d'ananas - -### potato.lua ### -Potato=Patata -Baked Potato=Patata arrostita -Cucumber and Potato Salad=Insalata di patate e cetrioli - -### pumpkin.lua ### -Pumpkin Slice=Fetta di zucca -Jack 'O Lantern (punch to turn on and off)=Jack Lanterna (colpirlo per accenderlo e spegnerlo) -Scarecrow Bottom=Fondo dello spaventapasseri -Pumpkin Bread=Pane alla zucca -Pumpkin Dough=Pasta di zucca -Pumpkin=Zucca - -### raspberry.lua ### -Raspberries=Lamponi -Raspberry Smoothie=Purea di lamponi - -### rhubarb.lua ### -Rhubarb=Rabarbaro -Rhubarb Pie=Tortino al rabarbaro - -### ryeoatrice.lua ### -Rye=Segale -Rye seed=Seme di segale -Oat=Avena -Oat seed=Seme d'avena -Rice=Riso -Rice grains=Chicchi di riso -Rice Bread=Pane di riso -Rice Flour=Farina di riso -Multigrain Flour=Farina multicereale -Multigrain Bread=Pane multicereale - -### tomato.lua ### -Tomato=Pomodoro - -### wheat.lua ### -Wheat Seed=Seme di grano -Wheat=Grano -Straw=Paglia -Flour=Farina -Bread=Pane -Sliced Bread=Pane a fette -Toast=Pane tostato -Toast Sandwich=Panino di pane tostato diff --git a/mods/farming/locale/pt.txt b/mods/farming/locale/pt.txt deleted file mode 100644 index a4c504cd..00000000 --- a/mods/farming/locale/pt.txt +++ /dev/null @@ -1,195 +0,0 @@ -# Portuguese translation of the farming mod by TenPlus1 -# textdomain: farming -# author: BrunoMine -# author: TheDarkTiger -# last update: 2020/Apr/26 - -###### folder . ###### - -### init.lua ### -Seed=Sementes - -### compatibility.lua ### -Banana= -Banana Leaves= -Orange= -Strawberry= - -### food.lua ### -Sugar=Açucar -Salt= -Rose Water= -Turkish Delight= -Garlic Bread= -Donut=Donut -Chocolate Donut=Donut de Chocolate -Apple Donut=Donut de Maça -Porridge= -Jaffa Cake= - -### hoes.lua ### -Hoe=Enxada -Wooden Hoe=Enxada de Madeira -Stone Hoe=Enxada de Pedra -Steel Hoe=Enxada de Aço -Bronze Hoe=Enxada de Bronze -Mese Hoe=Enxada de Mese -Diamond Hoe=Enxada de Diamante -# Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)= -Mithril Scythe (Right-click to harvest and replant crops)= -# Surcharge du mod [Toolranks] à faire # - -### soil.lua ### -Soil=Solo -Wet Soil=Solo Seco - -### utensils.lua ### -Wooden Bowl= -Saucepan= -Cooking Pot= -Baking Tray= -Skillet= -Mortar and Pestle= -Cutting Board= -Juicer= -Glass Mixing Bowl= - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed=Sementes de Cevada -Barley=Cevada - -### beans.lua ### -Green Beans=Feijoes Verdes -Bean Pole (place on soil before planting beans)=Apoio de feijao (coloque no solo antes de plantar feijao) - -### beetroot.lua ### -Beetroot= -Beetroot Soup= - -### blueberry.lua ### -Blueberries=Mirtilos -Blueberry Muffin=Muffin de Mirtilos -Blueberry Pie= - -### carrot.lua ## -Carrot=Cenoura -Carrot Juice= -Golden Carrot=Cenoura Dourada - -### chili.lua ### -Chili Pepper= -Bowl of Chili= - -### cocoa.lua ### -Cocoa Beans=Amendoas de Cacau -Cookie=Cookie -Bar of Dark Chocolate=Barra de Chocolate Preto -Chocolate Block= - -### coffee.lua ### -Coffee Beans=Grao de Cafe -Cup of Coffee=Xicara de Cafe - -### corn.lua ### -Corn=Milho -Corn on the Cob=Espiga de Milho -Cornstarch= -Bottle of Ethanol=Garrafa de Etanol - -### cotton.lua ### -Cotton Seed=Sementes de Algodao -Cotton=Algodao -String= - -### cucumber.lua ### -Cucumber=Pepino - -### garlic.lua ### -Garlic clove= -Garlic= -Garlic Braid= - -### grapes.lua ### -Grapes=Uvas -Trellis (place on soil before planting grapes)=Grade de Ripas (colocar no solo antes de plantar uvas) - -### hemp.lua ### -Hemp Seed=Sementes de Canhamo -Hemp Leaf=Folha de Canhamo -Bottle of Hemp Oil=Garrafa de Oleo de Canhamo -Hemp Fibre=Fibra de Canhamo -Hemp Block= -Hemp Rope=Corda de Canhamo - -### melon.lua ### -Melon Slice=Sementes de Melancia -Melon=Melancia - -### onion.lua ### -Onion= - -### peas.lua ### -Pea Pod= -Peas= -Pea Soup= - -### pepper.lua ### -Peppercorn= -Pepper= -Ground Pepper= - -### pinapple.lua ### -Pineapple Top= -Pineapple= -Pineapple Ring= -Pineapple Juice= - -### potato.lua ### -Potato=Batata -Baked Potato=Batata Cozida -Cucumber and Potato Salad= - -### pumpkin.lua ### -Pumpkin Slice=Pedaço de Abobora -Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Socos para ligar e desligar) -Scarecrow Bottom= -Pumpkin Bread=Pao de Abobora -Pumpkin Dough=Massa de Abobora -Pumpkin=Abobora - -### raspberry.lua ### -Raspberries=Framboesa -Raspberry Smoothie=Batida de Framboesa - -### rhubarb.lua ### -Rhubarb=Ruibarbo -Rhubarb Pie=Torta de Ruibarbo - -### ryeoatrice.lua ### -Rye= -Rye seed= -Oat= -Oat seed= -Rice= -Rice grains= -Rice Bread= -Rice Flour= -Multigrain Flour= -Multigrain Bread= - -### tomato.lua ### -Tomato=Tomate - -### wheat.lua ### -Wheat Seed=Sementes de Trigo -Wheat=Trigo -Straw=Palha -Flour=Farinha -Bread=Pao -Sliced Bread= -Toast= -Toast Sandwich= diff --git a/mods/farming/locale/ru.txt b/mods/farming/locale/ru.txt deleted file mode 100644 index 8a181f54..00000000 --- a/mods/farming/locale/ru.txt +++ /dev/null @@ -1,212 +0,0 @@ -# Russian translation of the farming mod by TenPlus1 -# textdomain: farming -# author: codexp -# author: TheDarkTiger -# author: YELLOW -# last update: 2020/Jun/20 - -###### folder . ###### - -### init.lua ### -Seed=Семена - -### compatibility.lua ### -Banana=Банан -Banana Leaves=Листья банана -Orange=Апельсин -Strawberry=Земляника - -### food.lua ### -Sugar=Сахар -Salt=Соль -Rose Water=Розовая вода -Turkish Delight=Рахат-лукум -Garlic Bread=Чесночный хлеб -Donut=Пончик -Chocolate Donut=Шоколадный пончик -Apple Donut=Яблочный пончик -Porridge=Каша -Jaffa Cake=Яффский пирог -Apple Pie=Яблочный пирог -Cactus Juice=Кактусовый сок - -### hoes.lua ### -Hoe=Мотыга -Wooden Hoe=Деревянная мотыга -Stone Hoe=Каменная мотыга -Steel Hoe=Стальная мотыга -Bronze Hoe=Бронзовая мотыга -Mese Hoe=Магическая мотыга -Diamond Hoe=Алмазная мотыга -# Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)=Мотыгобомба (используйте или бросьте на траву для ее обработки) -Mithril Scythe (Right-click to harvest and replant crops)=Мифриловая коса (Щелкните правой кнопкой мыши для сбора и пересадки растений) -# Surcharge du mod [Toolranks] à faire # -%s Hoe=%s мотыга -Silver=Серебряная -Mithril=Мифриловая -Silver Hoe=Серебряная -Mithril Hoe=Мифриловая - -### soil.lua ### -Soil=Земля -Wet Soil=Увлажненная земля -Savanna Soil=Земля саванны -Wet Savanna Soil=Увлажненная земля саванны - -### utensils.lua ### -Wooden Bowl=Деревянная миска -Saucepan=Кастрюля -Cooking Pot=Котел -Baking Tray=Противень -Skillet=Сковорода -Mortar and Pestle=Ступка и пестик -Cutting Board=Разделочная доска -Juicer=Соковыжималка -Glass Mixing Bowl=Стеклянная чаша - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed=Семена ячменя -Barley=Ячмень - -### beans.lua ### -Green Beans=Зеленая фасоль -Bean Pole (place on soil before planting beans)=Жердь для бобовых (установите на почву перед посадкой бобовых) - -### beetroot.lua ### -Beetroot=Свекла -Beetroot Soup=Борщ - -### blueberry.lua ### -Blueberries=Голубика -Blueberry Muffin=Кекс с голубикой -Blueberry Pie=Пирог с голубикой - -### carrot.lua ## -Carrot=Морковь -Carrot Juice=Морковный сок -Golden Carrot=Золотая морковь - -### chili.lua ### -Chili Pepper=Перец чили -Bowl of Chili=Миска чили - -### cocoa.lua ### -Cocoa Beans=Какао-бобы -Cookie=Печенье -Bar of Dark Chocolate=Плитка темного шоколада -Chocolate Block=Шоколадный блок - -### coffee.lua ### -Coffee Beans=Кофейные зерна -Cup of Coffee=Чашка кофе - -### corn.lua ### -Corn=Кукуруза -Corn on the Cob=Початок кукурузы -Cornstarch=Кукурузный крахмал -Bottle of Ethanol=Бутылка спирта - -### cotton.lua ### -Wild Cotton=Дикорастущий хлопок -Cotton Seed=Семена хлопка -Cotton=Хлопок -String=Нить - -### cucumber.lua ### -Cucumber=Огурец - -### garlic.lua ### -Garlic clove=Зубчик чеснока -Garlic=Чеснок -Garlic Braid=Связка чеснока - -### grapes.lua ### -Grapes=Виноград -Trellis (place on soil before planting grapes)=Решетка (поставьте на почву перед посадкой винограда) - -### hemp.lua ### -Hemp Seed=Семена конопли -Hemp Leaf=Лист конопли -Bottle of Hemp Oil=Бутылка конопляного масла -Hemp Fibre=Конопляное волокно -Hemp Block=Блок конопли -Hemp Rope=Пеньковая веревка - -### melon.lua ### -Melon Slice=Долька арбуза -Melon=Арбуз - -### mint.lua ### -Mint Seeds=Семена мяты -Mint Leaf=Лист мяты -Mint Tea=Чай с мятой - -### onion.lua ### -Onion=Лук -Onion Soup=Луковый суп - -### peas.lua ### -Pea Pod=Стручок гороха -Peas=Горох -Pea Soup=Гороховый суп - -### pepper.lua ### -Peppercorn=Перчинка -Pepper=Перец -Ground Pepper=Молотый перец - -### pinapple.lua ### -Pineapple Top=Верхушка ананаса -Pineapple=Ананас -Pineapple Ring=Кольцо ананаса -Pineapple Juice=Ананасовый сок - -### potato.lua ### -Potato=Картофель -Baked Potato=Печеный картофель -Cucumber and Potato Salad=Салат из огурцов и картофеля - -### pumpkin.lua ### -Pumpkin Slice=Ломтик тыквы -Jack 'O Lantern (punch to turn on and off)=Светильник джека (удар для включения и выключения) -Scarecrow Bottom=Основание пугала -Pumpkin Bread=Тыквенный хлеб -Pumpkin Dough=Тыквенное тесто -Pumpkin=Тыква - -### raspberry.lua ### -Raspberries=Малина -Raspberry Smoothie=Малиновый смузи - -### rhubarb.lua ### -Rhubarb=Ревень -Rhubarb Pie=Пирог с ревенем - -### ryeoatrice.lua ### -Rye=Рожь -Rye seed=Зёрна ржи -Oat=Овес -Oat seed=Семена овса -Rice grains=Зёрна риса -Rice=Рис -Rice Bread=Рисовый хлеб -Rice Flour=Рисовая мука -Multigrain Flour=Мультизерновая мука -Multigrain Bread=Мультизерновой хлеб - -### tomato.lua ### -Tomato=Помидор - -### wheat.lua ### -Wheat Seed=Зёрна пшеницы -Wheat=Пшеница -Straw=Солома -Flour=Мука -Bread=Хлеб -Sliced Bread=Нарезанный хлеб -Toast=Тост -Toast Sandwich=Сэндвич diff --git a/mods/farming/locale/template.txt b/mods/farming/locale/template.txt deleted file mode 100644 index 905d9e00..00000000 --- a/mods/farming/locale/template.txt +++ /dev/null @@ -1,194 +0,0 @@ -# Translation of the farming mod by TenPlus1 -# textdomain: farming -# author: (you) -# last update: 2020/Apr/26 - -###### folder . ###### - -### init.lua ### -Seed= - -### compatibility.lua ### -Banana= -Banana Leaves= -Orange= -Strawberry= - -### food.lua ### -Sugar= -Salt= -Rose Water= -Turkish Delight= -Garlic Bread= -Donut= -Chocolate Donut= -Apple Donut= -Porridge= -Jaffa Cake= - -### hoes.lua ### -Hoe= -Wooden Hoe= -Stone Hoe= -Steel Hoe= -Bronze Hoe= -Mese Hoe= -Diamond Hoe= -# Surcharge du mod [Toolranks] faire # -Hoe Bomb (use or throw on grassy areas to hoe land)= -Mithril Scythe (Right-click to harvest and replant crops)= -# Surcharge du mod [Toolranks] faire # - -### soil.lua ### -Soil= -Wet Soil= - -### utensils.lua ### -Wooden Bowl= -Saucepan= -Cooking Pot= -Baking Tray= -Skillet= -Mortar and Pestle= -Cutting Board= -Juicer= -Glass Mixing Bowl= - - -###### folder ./crops ###### - -### barley.lua ### -Barley Seed= -Barley= - -### beans.lua ### -Green Beans= -Bean Pole (place on soil before planting beans)= - -### beetroot.lua ### -Beetroot= -Beetroot Soup= - -### blueberry.lua ### -Blueberries= -Blueberry Muffin= -Blueberry Pie= - -### carrot.lua ## -Carrot= -Carrot Juice= -Golden Carrot= - -### chili.lua ### -Chili Pepper= -Bowl of Chili= - -### cocoa.lua ### -Cocoa Beans= -Cookie= -Bar of Dark Chocolate= -Chocolate Block= - -### coffee.lua ### -Coffee Beans= -Cup of Coffee= - -### corn.lua ### -Corn= -Corn on the Cob= -Cornstarch= -Bottle of Ethanol= - -### cotton.lua ### -Cotton Seed= -Cotton= -String= - -### cucumber.lua ### -Cucumber= - -### garlic.lua ### -Garlic clove= -Garlic= -Garlic Braid= - -### grapes.lua ### -Grapes= -Trellis (place on soil before planting grapes)= - -### hemp.lua ### -Hemp Seed= -Hemp Leaf= -Bottle of Hemp Oil= -Hemp Fibre= -Hemp Block= -Hemp Rope= - -### melon.lua ### -Melon Slice= -Melon= - -### onion.lua ### -Onion= - -### peas.lua ### -Pea Pod= -Peas= -Pea Soup= - -### pepper.lua ### -Peppercorn= -Pepper= -Ground Pepper= - -### pinapple.lua ### -Pineapple Top= -Pineapple= -Pineapple Ring= -Pineapple Juice= - -### potato.lua ### -Potato= -Baked Potato= -Cucumber and Potato Salad= - -### pumpkin.lua ### -Pumpkin Slice= -Jack 'O Lantern (punch to turn on and off)= -Scarecrow Bottom= -Pumpkin Bread= -Pumpkin Dough= -Pumpkin= - -### raspberry.lua ### -Raspberries= -Raspberry Smoothie= - -### rhubarb.lua ### -Rhubarb= -Rhubarb Pie= - -### ryeoatrice.lua ### -Rye= -Rye seed= -Oat= -Oat seed= -Rice= -Rice grains= -Rice Bread= -Rice Flour= -Multigrain Flour= -Multigrain Bread= - -### tomato.lua ### -Tomato= - -### wheat.lua ### -Wheat Seed= -Wheat= -Straw= -Flour= -Bread= -Sliced Bread= -Toast= -Toast Sandwich= diff --git a/mods/farming/locale/zh_CN.txt b/mods/farming/locale/zh_CN.txt deleted file mode 100644 index 2ec4e554..00000000 --- a/mods/farming/locale/zh_CN.txt +++ /dev/null @@ -1,119 +0,0 @@ -Seed=种子 -Banana=香蕉 -Banana Leaves=香蕉叶 -Orange=橙色 -Strawberry=草莓 -Sugar=糖 -Salt=盐 -Rose Water=玫瑰汁 -Turkish Delight=土耳其软糖 -Garlic Bread=蒜香面包 -Donut=甜甜圈 -Chocolate Donut=巧克力甜甜圈 -Apple Donut=苹果甜甜圈 -Porridge=粥 -Jaffa Cake=佳发饼 -Hoe=锄头 -Wooden Hoe=木锄 -Stone Hoe=石锄 -Steel Hoe=钢锄头 -Bronze Hoe=青铜锄头 -Mese Hoe=黄石锄头 -Diamond Hoe=钻石锄 -Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在草地上使用或扔在锄地上) -Mithril Scythe (Right-click to harvest and replant crops)=秘银镰刀(右击可收获并重新种植作物) -Soil=土壤 -Wet Soil=湿土 -Wooden Bowl=木碗 -Saucepan=平底锅 -Cooking Pot=锅 -Baking Tray=烤盘 -Skillet=平底锅 -Mortar and Pestle=研钵 -Cutting Board=砧板 -Juicer=榨汁机 -Glass Mixing Bowl=搅拌杯 -Barley Seed=大麦种子 -Barley=大麦 -Green Beans=青豆 -Bean Pole (place on soil before planting beans)=豆杆(种豆前先放在土上) -Beetroot=甜菜根 -Beetroot Soup=甜菜根汤 -Blueberries=蓝莓 -Blueberry Muffin=蓝莓松糕 -Blueberry Pie=蓝莓派 -Carrot=胡萝卜 -Carrot Juice=胡萝卜汁 -Golden Carrot=金萝卜 -Chili Pepper=辣椒 -Bowl of Chili=一碗辣椒 -Cocoa Beans=可可豆 -Cookie=曲奇 -Bar of Dark Chocolate=黑巧克力条 -Chocolate Block=巧克力块 -Coffee Beans=咖啡豆 -Cup of Coffee=一杯咖啡 -Corn=玉米 -Corn on the Cob=玉米棒 -Cornstarch=玉米淀粉 -Bottle of Ethanol=一瓶乙醇 -Cotton Seed=棉籽 -Cotton=棉花 -String=线 -Cucumber=黄瓜 -Garlic clove=蒜瓣 -Garlic=大蒜 -Garlic Braid=蒜辫 -Grapes=葡萄 -Trellis (place on soil before planting grapes)=棚架(种植葡萄前先放在土壤上) -Hemp Seed=大麻籽 -Hemp Leaf=大麻叶 -Bottle of Hemp Oil=一瓶大麻油 -Hemp Fibre=大麻纤维 -Hemp Block=麻块 -Hemp Rope=麻绳 -Melon Slice=西瓜片 -Melon=甜瓜 -Onion=洋葱 -Pea Pod=豌豆荚 -Peas=豌豆 -Pea Soup=豌豆汤 -Peppercorn=胡椒粉 -Pepper=胡椒粉 -Ground Pepper=胡椒粉 -Pineapple Top=菠萝上衣 -Pineapple=菠萝 -Pineapple Ring=菠萝圈 -Pineapple Juice=菠萝汁 -Potato=土豆 -Baked Potato=焗马铃薯 -Cucumber and Potato Salad=黄瓜土豆沙拉 -Pumpkin Slice=南瓜片 -Jack 'O Lantern (punch to turn on and off)=杰克灯(按一下开关) -Scarecrow Bottom=稻草人屁股 -Pumpkin Bread=南瓜面包 -Pumpkin Dough=南瓜面团 -Pumpkin=南瓜 -Raspberries=覆盆子 -Raspberry Smoothie=覆盆子冰沙 -Rhubarb=大黄 -Rhubarb Pie=大黄派 -Rye=黑麦 -Rye seed=黑麦种子 -Oat=燕麦 -Oat seed=燕麦籽 -Rice=大米 -Rice grains=稻谷 -Rice Bread=米饭面包 -Rice Flour=米粉 -Multigrain Flour=多粒面粉 -Multigrain Bread=杂粮面包 -Tomato=番茄 -Wheat Seed=小麦种子 -Wheat=小麦 -Straw=稻草 -Flour=面粉 -Bread=面包 -Sliced Bread=切片面包 -Toast=烤面包片 -Toast Sandwich=三明治面包 diff --git a/mods/farming/locale/zh_TW.txt b/mods/farming/locale/zh_TW.txt deleted file mode 100644 index 5bd109bc..00000000 --- a/mods/farming/locale/zh_TW.txt +++ /dev/null @@ -1,119 +0,0 @@ -Seed=種子 -Banana=香蕉 -Banana Leaves=香蕉葉 -Orange=橙色 -Strawberry=草莓 -Sugar=糖 -Salt=鹽 -Rose Water=玫瑰汁 -Turkish Delight=土耳其軟糖 -Garlic Bread=蒜香麵包 -Donut=甜甜圈 -Chocolate Donut=巧克力甜甜圈 -Apple Donut=蘋果甜甜圈 -Porridge=粥 -Jaffa Cake=佳發餅 -Hoe=鋤頭 -Wooden Hoe=木鋤 -Stone Hoe=石鋤 -Steel Hoe=鋼鋤頭 -Bronze Hoe=青銅鋤頭 -Mese Hoe=黃石鋤頭 -Diamond Hoe=鑽石鋤 -Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在草地上使用或扔在鋤地上) -Mithril Scythe (Right-click to harvest and replant crops)=祕銀鐮刀(右擊可收穫並重新種植作物) -Soil=土壤 -Wet Soil=溼土 -Wooden Bowl=木碗 -Saucepan=平底鍋 -Cooking Pot=鍋 -Baking Tray=烤盤 -Skillet=平底鍋 -Mortar and Pestle=研缽 -Cutting Board=砧板 -Juicer=榨汁機 -Glass Mixing Bowl=攪拌杯 -Barley Seed=大麥種子 -Barley=大麥 -Green Beans=青豆 -Bean Pole (place on soil before planting beans)=豆杆(種豆前先放在土上) -Beetroot=甜菜根 -Beetroot Soup=甜菜根湯 -Blueberries=藍莓 -Blueberry Muffin=藍莓鬆糕 -Blueberry Pie=藍莓派 -Carrot=胡蘿蔔 -Carrot Juice=胡蘿蔔汁 -Golden Carrot=金蘿蔔 -Chili Pepper=辣椒 -Bowl of Chili=一碗辣椒 -Cocoa Beans=可可豆 -Cookie=曲奇 -Bar of Dark Chocolate=黑巧克力條 -Chocolate Block=巧克力塊 -Coffee Beans=咖啡豆 -Cup of Coffee=一杯咖啡 -Corn=玉米 -Corn on the Cob=玉米棒 -Cornstarch=玉米澱粉 -Bottle of Ethanol=一瓶乙醇 -Cotton Seed=棉籽 -Cotton=棉花 -String=字符串 -Cucumber=黃瓜 -Garlic clove=蒜瓣 -Garlic=大蒜 -Garlic Braid=蒜辮 -Grapes=葡萄 -Trellis (place on soil before planting grapes)=棚架(種植葡萄前先放在土壤上) -Hemp Seed=大麻籽 -Hemp Leaf=大麻葉 -Bottle of Hemp Oil=一瓶大麻油 -Hemp Fibre=大麻纖維 -Hemp Block=麻塊 -Hemp Rope=麻繩 -Melon Slice=西瓜片 -Melon=甜瓜 -Onion=洋蔥 -Pea Pod=豌豆莢 -Peas=豌豆 -Pea Soup=豌豆湯 -Peppercorn=胡椒粉 -Pepper=胡椒粉 -Ground Pepper=胡椒粉 -Pineapple Top=菠蘿上衣 -Pineapple=菠蘿 -Pineapple Ring=菠蘿圈 -Pineapple Juice=菠蘿汁 -Potato=土豆 -Baked Potato=焗馬鈴薯 -Cucumber and Potato Salad=黃瓜土豆沙拉 -Pumpkin Slice=南瓜片 -Jack 'O Lantern (punch to turn on and off)=傑克燈(按一下開關) -Scarecrow Bottom=稻草人屁股 -Pumpkin Bread=南瓜麵包 -Pumpkin Dough=南瓜麵糰 -Pumpkin=南瓜 -Raspberries=覆盆子 -Raspberry Smoothie=覆盆子冰沙 -Rhubarb=大黃 -Rhubarb Pie=大黃派 -Rye=黑麥 -Rye seed=黑麥種子 -Oat=燕麥 -Oat seed=燕麥籽 -Rice=大米 -Rice grains=稻穀 -Rice Bread=米飯麵包 -Rice Flour=米粉 -Multigrain Flour=多粒麵粉 -Multigrain Bread=雜糧麵包 -Tomato=番茄 -Wheat Seed=小麥種子 -Wheat=小麥 -Straw=稻草 -Flour=麵粉 -Bread=麵包 -Sliced Bread=切片面包 -Toast=烤麵包片 -Toast Sandwich=三明治麵包 \ No newline at end of file diff --git a/mods/farming/lucky_block.lua b/mods/farming/lucky_block.lua index c6a2000d..5aa5f4c9 100644 --- a/mods/farming/lucky_block.lua +++ b/mods/farming/lucky_block.lua @@ -1,79 +1,109 @@ +local mcl = farming.mcl + -- add lucky blocks -if minetest.get_modpath("lucky_block") then +lucky_block:add_blocks({ - lucky_block:add_blocks({ - {"dro", {"farming:corn"}, 5}, - {"dro", {"farming:coffee_cup_hot"}, 1}, - {"dro", {"farming:bread"}, 5}, - {"nod", "farming:jackolantern", 0}, - {"tro", "farming:jackolantern_on"}, - {"nod", "default:river_water_source", 1}, - {"tel"}, - {"dro", {"farming:trellis", "farming:grapes"}, 5}, - {"dro", {"farming:bottle_ethanol"}, 1}, - {"nod", "farming:melon", 0}, - {"dro", {"farming:donut", "farming:donut_chocolate", "farming:donut_apple"}, 5}, - {"dro", {"farming:hemp_leaf", "farming:hemp_fibre", "farming:seed_hemp"}, 10}, - {"nod", "fire:permanent_flame", 1}, - {"dro", {"farming:chili_pepper", "farming:chili_bowl"}, 5}, - {"dro", {"farming:bowl"}, 3}, - {"dro", {"farming:saucepan"}, 1}, - {"dro", {"farming:pot"}, 1}, - {"dro", {"farming:baking_tray"}, 1}, - {"dro", {"farming:skillet"}, 1}, - {"exp", 4}, - {"dro", {"farming:mortar_pestle"}, 1}, - {"dro", {"farming:cutting_board"}, 1}, - {"dro", {"farming:juicer"}, 1}, - {"dro", {"farming:mixing_bowl"}, 1}, - {"dro", {"farming:hoe_bronze"}, 1}, - {"dro", {"farming:hoe_mese"}, 1}, - {"dro", {"farming:hoe_diamond"}, 1}, - {"dro", {"farming:hoe_bomb"}, 10}, - {"dro", {"farming:turkish_delight"}, 5}, - {"lig"}, - {"dro", {"farming:scythe_mithril"}, 1}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:carrot_8"}, - {"farming:cotton_8", "farming:rhubarb_3"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:pepper_5"}, - {"farming:cotton_8", "farming:onion_5"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:beetroot_5"}, - {"farming:cotton_8", "farming:barley_7"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:corn_8"}, - {"farming:cotton_8", "farming:grapes_8"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:pea_5"}, - {"farming:cotton_8", "farming:coffee_5"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:raspberry_4"}, - {"farming:cotton_8", "farming:tomato_8"}, - }}, - {"sch", "instafarm", 0, true, { - {"farming:wheat_8", "farming:chili_8"}, - {"farming:cotton_8", "farming:cucumber_4"}, - }}, - {"nod", "default:chest", 0, { - {name = "farming:seed_wheat", max = 15}, - {name = "farming:seed_barley", max = 15}, - {name = "farming:seed_barley", max = 15}, - {name = "farming:seed_hemp", max = 15}, - {name = "farming:seed_rye", max = 15}, - {name = "farming:seed_rice", max = 15}, - {name = "farming:seed_oat", max = 15}, - {name = "farming:soil_wet", max = 10}, - {name = "farming:cotton_wild", max = 5}, - {name = "farming:grapebush", max = 5}, - }}, - }) -end + {"dro", {"farming:corn"}, 5}, + {"dro", {"farming:coffee_cup_hot"}, 1}, + {"dro", {(mcl and "mcl_farming:bread" or "farming:bread")}, 5}, + {"nod", (mcl and "mcl_farming:pumpkin_face_light" or "farming:jackolantern"), 0}, + {"tro", (mcl and "mcl_farming:pumpkin_face_light" or "farming:jackolantern_on")}, + {"nod", (mcl and "mcl_core:water_source" or "default:river_water_source"), 1}, + {"tel"}, + {"dro", {"farming:trellis", "farming:grapes"}, 5}, + {"dro", {"farming:bottle_ethanol"}, 1}, + {"nod", (mcl and "mcl_farming:melon" or "farming:melon"), 0}, + {"dro", {"farming:donut", "farming:donut_chocolate", "farming:donut_apple"}, 5}, + {"dro", {"farming:hemp_leaf", "farming:hemp_fibre", "farming:seed_hemp"}, 10}, + {"nod", (mcl and "mcl_fire:fire" or "fire:permanent_flame"), 1}, + {"dro", {"farming:chili_pepper", "farming:chili_bowl"}, 5}, + {"dro", {(mcl and "mcl_core:bowl" or "farming:bowl")}, 3}, + {"dro", {"farming:saucepan"}, 1}, + {"dro", {"farming:pot"}, 1}, + {"dro", {"farming:baking_tray"}, 1}, + {"dro", {"farming:skillet"}, 1}, + {"exp", 4}, + {"dro", {"farming:mortar_pestle"}, 1}, + {"dro", {"farming:cutting_board"}, 1}, + {"dro", {"farming:juicer"}, 1}, + {"dro", {"farming:mixing_bowl"}, 1}, + {"dro", {"farming:sunflower_oil"}, 5}, + {"dro", {(mcl and "mcl_farming:hoe_stone" or "farming:hoe_bronze")}, 1}, + {"dro", {(mcl and "mcl_farming:hoe_gold" or "farming:hoe_mese")}, 1}, + {"dro", {(mcl and "mcl_farming:hoe_diamond" or "farming:hoe_diamond")}, 1}, + {"dro", {"farming:hoe_bomb"}, 10}, + {"dro", {"farming:turkish_delight"}, 5}, + {"lig"}, + {"dro", {(mcl and "mcl_farming:hoe_netherite" or "farming:scythe_mithril")}, 1}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:carrot_8"}, + {"farming:cotton_8", "farming:rhubarb_3"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:pepper_5"}, + {"farming:cotton_8", "farming:onion_5"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", (mcl and "mcl_farming:beetroot" or "farming:beetroot_5")}, + {"farming:cotton_8", "farming:barley_7"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:corn_8"}, + {"farming:cotton_8", "farming:grapes_8"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:pea_5"}, + {"farming:cotton_8", "farming:coffee_5"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:raspberry_4"}, + {"farming:cotton_8", "farming:tomato_8"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:chili_8"}, + {"farming:cotton_8", "farming:cucumber_4"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:spinach_4"}, + {"farming:cotton_8", "farming:eggplant_4"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"nod", "default:chest", 0, { + {name = (mcl and "mcl_farming:wheat_seeds" or "farming:seed_wheat"), max = 15}, + {name = "farming:seed_barley", max = 15}, + {name = "farming:seed_hemp", max = 15}, + {name = "farming:seed_rye", max = 15}, + {name = "farming:seed_rice", max = 15}, + {name = "farming:seed_oat", max = 15}, + {name = "farming:soil_wet", max = 10}, + {name = "farming:cotton_wild", max = 5}, + {name = "farming:grapebush", max = 5}, + {name = "farming:asparagus", max = 7} + }}, + {"dro", {"farming:chili_powder"}, 5} +}) diff --git a/mods/farming/mapgen.lua b/mods/farming/mapgen.lua deleted file mode 100644 index 65d7cda3..00000000 --- a/mods/farming/mapgen.lua +++ /dev/null @@ -1,240 +0,0 @@ --- what mapgen are we using -local mg_name = minetest.get_mapgen_setting("mg_name") - --- temp vars -local tmp1, tmp2, tmp3 - --- decoration function -local function register_plant(name, min, max, spawnon, spawnby, num, rarety) - - -- do not place on mapgen if no value given (or not true) - if not rarety then - return - end - - -- set rarety value or default to farming.rarety if not a number - rarety = tonumber(rarety) or farming.rarety - - minetest.register_decoration({ - deco_type = "simple", - place_on = spawnon or {"default:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 329, - octaves = 3, - persist = 0.6 - }, - y_min = min, - y_max = max, - decoration = "farming:" .. name, - spawn_by = spawnby, - num_spawn_by = num - }) -end - - --- add crops to mapgen -register_plant("potato_3", 15, 40, nil, "", -1, farming.potato) -register_plant("tomato_7", 5, 20, nil, "", -1, farming.tomato) -register_plant("corn_7", 12, 22, nil, "", -1, farming.corn) -register_plant("raspberry_4", 3, 10, nil, "", -1, farming.raspberry) -register_plant("rhubarb_3", 3, 15, nil, "", -1, farming.rhubarb) -register_plant("blueberry_4", 3, 10, nil, "", -1, farming.blueberry) -register_plant("beanbush", 18, 35, nil, "", -1, farming.beans) -register_plant("grapebush", 25, 45, nil, "", -1, farming.grapes) -register_plant("onion_5", 5, 22, nil, "", -1, farming.onion) -register_plant("garlic_5", 3, 30, nil, "group:tree", 1, farming.garlic) -register_plant("pea_5", 25, 50, nil, "", -1, farming.peas) -register_plant("beetroot_5", 1, 15, nil, "", -1, farming.beetroot) -register_plant("cabbage_6", 2, 10, nil, "", -1, farming.cabbage) -register_plant("lettuce_5", 5, 30, nil, "", -1, farming.lettuce) -register_plant("blackberry_4", 3, 10, nil, "", -1, farming.blackberry) -register_plant("vanilla_7", 5, 35, nil, "", -1, farming.vanilla) -register_plant("parsley_3", 10, 40, nil, "", -1, farming.parsley) -register_plant("sunflower_8", 10, 40, nil, "", -1, farming.sunflower) -register_plant("mint_4", 1, 75, { - "default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, - "group:water", 1, farming.mint) - - --- v6 mapgen compatibility for specific crops -if mg_name == "v6" then - - register_plant("carrot_8", 1, 30, nil, "group:water", 1, farming.carrot) - register_plant("cucumber_4", 1, 20, nil, "group:water", 1, farming.cucumber) - register_plant("melon_8", 1, 20, nil, "group:water", 1, farming.melon) - register_plant("pumpkin_8", 1, 20, nil, "group:water", 1, farming.pumpkin) - register_plant("coffee_5", 20, 45, nil, "", -1, farming.coffee) - register_plant("soy_6", 20, 50, nil, "", -1, farming.soy) -else - -- v7 maps have a beach so plants growing near water is limited to 6 high - register_plant("carrot_8", 1, 15, nil, "", -1, farming.carrot) - register_plant("cucumber_4", 1, 10, nil, "", -1, farming.cucumber) - register_plant("melon_8", 1, 6, {"default:dirt_with_dry_grass", - "default:dirt_with_rainforest_litter"}, "", -1, farming.melon) - register_plant("pumpkin_8", 1, 6, nil, "", -1, farming.pumpkin) - register_plant("coffee_5", 20, 45, {"default:dirt_with_dry_grass", - "default:dirt_with_rainforest_litter", - "default:dry_dirt_with_dry_grass"}, "", -1, farming.coffee) - register_plant("soy_6", 20, 50, {"default:dirt_with_dry_grass", - "default:dirt_with_rainforest_litter", - "default:dry_dirt_with_dry_grass"}, "", -1, farming.soy) -end - - -if farming.hemp then -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = tonumber(farming.hemp) or farming.rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.6 - }, - y_min = 3, - y_max = 45, - decoration = "farming:hemp_7", - spawn_by = "group:tree", - num_spawn_by = 1 -}) -end - - -if farming.chili then -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = tonumber(farming.chili) or farming.rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 760, - octaves = 3, - persist = 0.6 - }, - y_min = 5, - y_max = 35, - decoration = {"farming:chili_8"}, - spawn_by = "group:tree", - num_spawn_by = 1 -}) -end - - -if farming.artichoke then -minetest.register_decoration({ - deco_type = "simple", - place_on = {"default:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = tonumber(farming.artichoke) or farming.rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 448, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 13, - decoration = {"farming:artichoke_5"}, - spawn_by = "group:tree", - num_spawn_by = 1, -}) -end - - -if farming.pepper then - -local tmp1 = {"default:dirt_with_rainforest_litter"} -- v7 - -if mg_name == "v6" then - tmp1 = {"default:dirt_with_grass"} -- v6 -end - -minetest.register_decoration({ - deco_type = "simple", - place_on = tmp1, - sidelen = 16, - noise_params = { - offset = 0, - scale = tonumber(farming.pepper) or farming.rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 933, - octaves = 3, - persist = 0.6 - }, - y_min = 5, - y_max = 35, - decoration = {"farming:pepper_5", "farming:pepper_6", "farming:pepper_7"}, - spawn_by = "group:tree", - num_spawn_by = 1 -}) -end - - -if farming.pineapple then - -tmp1 = {"default:dirt_with_dry_grass", "default:dry_dirt_with_dry_grass"} -tmp2 = nil -tmp3 = -1 - -if mg_name == "v6" then - tmp1 = {"default:dirt_with_grass"} - tmp2 = "default:desert_sand" - tmp3 = 1 -end - -minetest.register_decoration({ - deco_type = "simple", - place_on = tmp1, - sidelen = 16, - noise_params = { - offset = 0, - scale = tonumber(farming.pineapple) or farming.rarety, - spread = {x = 100, y = 100, z = 100}, - seed = 917, - octaves = 3, - persist = 0.6 - }, - y_min = 18, - y_max = 30, - decoration = {"farming:pineapple_8"}, - spawn_by = tmp2, - num_spawn_by = tmp3 -}) -end - -tmp1 = {"default:dry_dirt_with_dry_grass"} -tmp2 = {"savanna"} - -if mg_name == "v6" then - tmp1 = {"default:dirt_with_grass"} - tmp2 = {"jungle"} -end - -minetest.register_decoration({ - name = "farming:cotton_wild", - deco_type = "simple", - place_on = tmp1, - sidelen = 16, - noise_params = { - offset = -0.1, - scale = 0.1, - spread = {x = 50, y = 50, z = 50}, - seed = 4242, - octaves = 3, - persist = 0.7 - }, - biomes = tmp2, - y_max = 31000, - y_min = 1, - decoration = "farming:cotton_wild" -}) diff --git a/mods/farming/mod.conf b/mods/farming/mod.conf index bc6a919b..bcaba216 100644 --- a/mods/farming/mod.conf +++ b/mods/farming/mod.conf @@ -1,4 +1,4 @@ name = farming -depends = default -optional_depends = stairs, intllib, lucky_block, toolranks -description = Adds many plants and food to Minetest +description = Adds many new plants and food into Minetest. +optional_depends = default, flowers, mcl_core, mcl_sounds, mcl_farming, mcl_stairs, mcl_flowers, stairs, lucky_block, toolranks +min_minetest_version = 5.0 diff --git a/mods/farming/screenshot.jpg b/mods/farming/screenshot.jpg new file mode 100644 index 00000000..3fd5c341 Binary files /dev/null and b/mods/farming/screenshot.jpg differ diff --git a/mods/farming/screenshot.png b/mods/farming/screenshot.png deleted file mode 100644 index aba30f01..00000000 Binary files a/mods/farming/screenshot.png and /dev/null differ diff --git a/mods/farming/settingtypes.txt b/mods/farming/settingtypes.txt index 05f50afb..7573de9d 100644 --- a/mods/farming/settingtypes.txt +++ b/mods/farming/settingtypes.txt @@ -1,2 +1,4 @@ # Contains a value used for speed of crop growth in seconds farming_stage_length (Farming Stage Length) float 160.0 + +farming_use_utensils (Use utensil recipes) bool true diff --git a/mods/farming/soil.lua b/mods/farming/soil.lua index fbb11f87..7572d572 100644 --- a/mods/farming/soil.lua +++ b/mods/farming/soil.lua @@ -1,132 +1,148 @@ -local S = farming.intllib +local S = minetest.get_translator("farming") + +-- default dry soil node + +local dry_soil = "farming:soil" -- add soil types to existing dirt blocks + minetest.override_item("default:dirt", { soil = { - base = "default:dirt", - dry = "farming:soil", - wet = "farming:soil_wet" + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" } }) minetest.override_item("default:dirt_with_grass", { soil = { - base = "default:dirt_with_grass", - dry = "farming:soil", - wet = "farming:soil_wet" + base = "default:dirt_with_grass", dry = "farming:soil", wet = "farming:soil_wet" } }) -minetest.override_item("default:dirt_with_dry_grass", { - soil = { - base = "default:dirt_with_dry_grass", - dry = "farming:soil", - wet = "farming:soil_wet" - } -}) +if minetest.registered_nodes["default:dirt_with_dry_grass"] then + + minetest.override_item("default:dirt_with_dry_grass", { + soil = { + base = "default:dirt_with_dry_grass", dry = "farming:soil", + wet = "farming:soil_wet" + } + }) +end minetest.override_item("default:dirt_with_rainforest_litter", { soil = { - base = "default:dirt_with_rainforest_litter", - dry = "farming:soil", + base = "default:dirt_with_rainforest_litter", dry = "farming:soil", wet = "farming:soil_wet" } }) -minetest.override_item("default:dirt_with_coniferous_litter", { - soil = { - base = "default:dirt_with_coniferous_litter", - dry = "farming:soil", - wet = "farming:soil_wet" - } -}) +if minetest.registered_nodes["default:dirt_with_coniferous_litter"] then -minetest.override_item("default:dry_dirt", { - soil = { - base = "default:dry_dirt", - dry = "farming:dry_soil", - wet = "farming:dry_soil_wet" - } -}) + minetest.override_item("default:dirt_with_coniferous_litter", { + soil = { + base = "default:dirt_with_coniferous_litter", dry = "farming:soil", + wet = "farming:soil_wet" + } + }) +end -minetest.override_item("default:dry_dirt_with_dry_grass", { - soil = { - base = "default:dry_dirt_with_dry_grass", - dry = "farming:dry_soil", - wet = "farming:dry_soil_wet" - } -}) +-- savanna soil + +if minetest.registered_nodes["default:dry_dirt"] then + + minetest.override_item("default:dry_dirt", { + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.override_item("default:dry_dirt_with_dry_grass", { + soil = { + base = "default:dry_dirt_with_dry_grass", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.register_node("farming:dry_soil", { + description = S("Savanna Soil"), + tiles = { + "default_dry_dirt.png^farming_soil.png", + "default_dry_dirt.png" + }, + drop = "default:dry_dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.register_node("farming:dry_soil_wet", { + description = S("Wet Savanna Soil"), + tiles = { + "default_dry_dirt.png^farming_soil_wet.png", + "default_dry_dirt.png^farming_soil_wet_side.png" + }, + drop = "default:dry_dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + dry_soil = "farming:dry_soil" +end -- normal soil + minetest.register_node("farming:soil", { description = S("Soil"), tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, drop = "default:dirt", - groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, field = 1}, + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, grassland = 1, + field = 1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), soil = { - base = "default:dirt", - dry = "farming:soil", - wet = "farming:soil_wet" + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" } }) -- wet soil + minetest.register_node("farming:soil_wet", { description = S("Wet Soil"), tiles = { "default_dirt.png^farming_soil_wet.png", - "default_dirt.png^farming_soil_wet_side.png"}, + "default_dirt.png^farming_soil_wet_side.png" + }, drop = "default:dirt", - groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, field = 1}, + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, grassland = 1, + field = 1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), soil = { - base = "default:dirt", - dry = "farming:soil", - wet = "farming:soil_wet" + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" } }) --- savanna soil -if minetest.registered_nodes["default:dry_dirt"] then -minetest.register_node("farming:dry_soil", { - description = S("Savanna Soil"), - tiles = { - "default_dry_dirt.png^farming_soil.png", - "default_dry_dirt.png"}, - drop = "default:dry_dirt", - groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, field = 1}, - sounds = default.node_sound_dirt_defaults(), - soil = { - base = "default:dry_dirt", - dry = "farming:dry_soil", - wet = "farming:dry_soil_wet" - } -}) - -minetest.register_node("farming:dry_soil_wet", { - description = S("Wet Savanna Soil"), - tiles = { - "default_dry_dirt.png^farming_soil_wet.png", - "default_dry_dirt.png^farming_soil_wet_side.png"}, - drop = "default:dry_dirt", - groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, field = 1}, - sounds = default.node_sound_dirt_defaults(), - soil = { - base = "default:dry_dirt", - dry = "farming:dry_soil", - wet = "farming:dry_soil_wet" - } -}) -end - -- sand is not soil, change existing sand-soil to use dry soil -minetest.register_alias("farming:desert_sand_soil", "farming:dry_soil") -minetest.register_alias("farming:desert_sand_soil_wet", "farming:dry_soil_wet") + +minetest.register_alias("farming:desert_sand_soil", dry_soil) +minetest.register_alias("farming:desert_sand_soil_wet", dry_soil .. "_wet") -- if water near soil then change to wet soil + minetest.register_abm({ + label = "Soil changes", nodenames = {"group:field"}, interval = 15, chance = 4, @@ -147,30 +163,34 @@ minetest.register_abm({ -- what's on top of soil, if solid/not plant change soil to dirt if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].walkable - and minetest.get_item_group(nn, "plant") == 0 then + and minetest.get_item_group(nn, "plant") == 0 + and minetest.get_item_group(nn, "growing") == 0 then + minetest.set_node(pos, {name = ndef.soil.base}) + return end - -- if map around soil not loaded then skip until loaded - if minetest.find_node_near(pos, 3, {"ignore"}) then - return - end + -- check if water is within 3 nodes + if minetest.find_node_near(pos, 3, {"group:water"}) then - -- check if water is within 3 nodes horizontally and 1 below - if #minetest.find_nodes_in_area( - {x = pos.x + 3, y = pos.y - 1, z = pos.z + 3}, - {x = pos.x - 3, y = pos.y , z = pos.z - 3}, - {"group:water"}) > 0 then + -- only change if it's not already wet soil + if node.name ~= ndef.soil.wet then + minetest.set_node(pos, {name = ndef.soil.wet}) + end - minetest.set_node(pos, {name = ndef.soil.wet}) + -- only dry out soil if no unloaded blocks nearby, just incase + elseif not minetest.find_node_near(pos, 3, {"ignore"}) then - elseif node.name == ndef.soil.wet then - minetest.set_node(pos, {name = ndef.soil.dry}) + if node.name == ndef.soil.wet then + minetest.set_node(pos, {name = ndef.soil.dry}) - elseif node.name == ndef.soil.dry - and minetest.get_item_group(nn, "plant") == 0 then - minetest.set_node(pos, {name = ndef.soil.base}) + -- if crop or seed found don't turn to dry soil + elseif node.name == ndef.soil.dry + and minetest.get_item_group(nn, "plant") == 0 + and minetest.get_item_group(nn, "growing") == 0 then + minetest.set_node(pos, {name = ndef.soil.base}) + end end end }) diff --git a/mods/farming/statistics.lua b/mods/farming/statistics.lua index b8928671..df12bd96 100644 --- a/mods/farming/statistics.lua +++ b/mods/farming/statistics.lua @@ -1,39 +1,38 @@ -local statistics = {} -local ROOT_2 = math.sqrt(2.0) -- Approximations for erf(x) and erfInv(x) from -- https://en.wikipedia.org/wiki/Error_function -local erf -local erf_inv - -local A = 8 * (math.pi - 3.0)/(3.0 * math.pi * (4.0 - math.pi)) +local statistics = {} +local random, floor, ceil = math.random, math.floor, math.ceil +local exp, log, sqrt = math.exp, math.log, math.sqrt +local ROOT_2 = sqrt(2.0) +local A = 8 * (math.pi - 3.0) / (3.0 * math.pi * (4.0 - math.pi)) local B = 4.0 / math.pi -local C = 2.0/(math.pi * A) +local C = 2.0 / (math.pi * A) local D = 1.0 / A -erf = function(x) +local function erf(x) - if x == 0 then return 0; end + if x == 0 then return 0 end local xSq = x * x local aXSq = A * xSq - local v = math.sqrt(1.0 - math.exp(-xSq * (B + aXSq) / (1.0 + aXSq))) + local v = sqrt(1.0 - exp(-xSq * (B + aXSq) / (1.0 + aXSq))) return (x > 0 and v) or -v end -erf_inv = function(x) +local function erf_inv(x) - if x == 0 then return 0; end + if x == 0 then return 0 end - if x <= -1 or x >= 1 then return nil; end + if x <= -1 or x >= 1 then return nil end - local y = math.log(1 - x * x) + local y = log(1 - x * x) local u = C + 0.5 * y - local v = math.sqrt(math.sqrt(u * u - D * y) - u) + local v = sqrt(sqrt(u * u - D * y) - u) return (x > 0 and v) or -v end @@ -44,14 +43,10 @@ local function std_normal(u) end -local poisson -local cdf_table = {} - - local function generate_cdf(lambda_index, lambda) - local max = math.ceil(4 * lambda) - local pdf = math.exp(-lambda) + local max = ceil(4 * lambda) + local pdf = exp(-lambda) local cdf = pdf local t = { [0] = pdf } @@ -65,30 +60,32 @@ local function generate_cdf(lambda_index, lambda) end +local cdf_table = {} + for li = 1, 100 do cdf_table[li] = generate_cdf(li, 0.25 * li) end -poisson = function(lambda, max) +local function poisson(lambda, max) if max < 2 then - return (math.random() < math.exp(-lambda) and 0) or 1 + return (random() < exp(-lambda) and 0) or 1 elseif lambda >= 2 * max then return max end - local u = math.random() - local lambda_index = math.floor(4 * lambda + 0.5) + local u = random() + local lambda_index = floor(4 * lambda + 0.5) local cdfs = cdf_table[lambda_index] if cdfs then lambda = 0.25 * lambda_index - if u < cdfs[0] then return 0; end - if max > #cdfs then max = #cdfs + 1 else max = math.floor(max); end - if u >= cdfs[max - 1] then return max; end + if u < cdfs[0] then return 0 end + if max > #cdfs then max = #cdfs + 1 else max = floor(max) end + if u >= cdfs[max - 1] then return max end if max > 4 then -- Binary search @@ -96,62 +93,49 @@ poisson = function(lambda, max) while s + 1 < max do - local m = math.floor(0.5 * (s + max)) + local m = floor(0.5 * (s + max)) - if u < cdfs[m] then max = m; else s = m; end + if u < cdfs[m] then max = m else s = m end end else for i = 1, max - 1 do - if u < cdfs[i] then return i; end + if u < cdfs[i] then return i end end end return max else - local x = lambda + math.sqrt(lambda) * std_normal(u) + local x = lambda + sqrt(lambda) * std_normal(u) - return (x < 0.5 and 0) or (x >= max - 0.5 and max) or math.floor(x + 0.5) + return (x < 0.5 and 0) or (x >= max - 0.5 and max) or floor(x + 0.5) end end +-- Error and Inverse error functions --- Error function. statistics.erf = erf - --- Inverse error function. statistics.erf_inv = erf_inv --- Standard normal distribution function (mean 0, standard deviation 1). - -- - -- @return - -- Any real number (actually between -3.0 and 3.0). + -- @return - Any real number (actually between -3.0 and 3.0). statistics.std_normal = function() - local u = math.random() + local u = random() - if u < 0.001 then - return -3.0 - elseif u > 0.999 then - return 3.0 - end + if u < 0.001 then return -3.0 elseif u > 0.999 then return 3.0 end return std_normal(u) end - --- Standard normal distribution function (mean 0, standard deviation 1). - -- - -- @param mu - -- The distribution mean. - -- @param sigma - -- The distribution standard deviation. - -- @return - -- Any real number (actually between -3*sigma and 3*sigma). + -- @param mu - The distribution mean. + -- @param sigma - The distribution standard deviation. + -- @return - Any real number (actually between -3*sigma and 3*sigma). statistics.normal = function(mu, sigma) - local u = math.random() + local u = random() if u < 0.001 then return mu - 3.0 * sigma @@ -162,24 +146,18 @@ statistics.normal = function(mu, sigma) return mu + sigma * std_normal(u) end - --- Poisson distribution function. - -- - -- @param lambda - -- The distribution mean and variance. - -- @param max - -- The distribution maximum. - -- @return - -- An integer between 0 and max (both inclusive). + -- @param lambda - The distribution mean and variance. + -- @param max - The distribution maximum. + -- @return - An integer between 0 and max (both inclusive). statistics.poisson = function(lambda, max) lambda, max = tonumber(lambda), tonumber(max) - if not lambda or not max or lambda <= 0 or max < 1 then return 0; end + if not lambda or not max or lambda <= 0 or max < 1 then return 0 end return poisson(lambda, max) end - return statistics diff --git a/mods/farming/textures/crops_garlic.png b/mods/farming/textures/crops_garlic.png index a73638c2..831335f1 100644 Binary files a/mods/farming/textures/crops_garlic.png and b/mods/farming/textures/crops_garlic.png differ diff --git a/mods/farming/textures/crops_garlic_braid.png b/mods/farming/textures/crops_garlic_braid.png index f5fa269b..e776a978 100644 Binary files a/mods/farming/textures/crops_garlic_braid.png and b/mods/farming/textures/crops_garlic_braid.png differ diff --git a/mods/farming/textures/crops_garlic_braid_side.png b/mods/farming/textures/crops_garlic_braid_side.png index ce467b76..de5286b0 100644 Binary files a/mods/farming/textures/crops_garlic_braid_side.png and b/mods/farming/textures/crops_garlic_braid_side.png differ diff --git a/mods/farming/textures/crops_garlic_braid_top.png b/mods/farming/textures/crops_garlic_braid_top.png new file mode 100644 index 00000000..0d3508ad Binary files /dev/null and b/mods/farming/textures/crops_garlic_braid_top.png differ diff --git a/mods/farming/textures/crops_garlic_clove.png b/mods/farming/textures/crops_garlic_clove.png index bfc1cee8..00cf9778 100644 Binary files a/mods/farming/textures/crops_garlic_clove.png and b/mods/farming/textures/crops_garlic_clove.png differ diff --git a/mods/farming/textures/crops_onion.png b/mods/farming/textures/crops_onion.png index 2099c63c..4c778c88 100644 Binary files a/mods/farming/textures/crops_onion.png and b/mods/farming/textures/crops_onion.png differ diff --git a/mods/farming/textures/ethereal_banana_leaf.png b/mods/farming/textures/ethereal_banana_leaf.png new file mode 100644 index 00000000..45770dac Binary files /dev/null and b/mods/farming/textures/ethereal_banana_leaf.png differ diff --git a/mods/farming/textures/ethereal_strawberry.png b/mods/farming/textures/ethereal_strawberry.png new file mode 100644 index 00000000..b085fd97 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry.png differ diff --git a/mods/farming/textures/ethereal_strawberry_1.png b/mods/farming/textures/ethereal_strawberry_1.png new file mode 100644 index 00000000..531ff350 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_1.png differ diff --git a/mods/farming/textures/ethereal_strawberry_2.png b/mods/farming/textures/ethereal_strawberry_2.png new file mode 100644 index 00000000..82fa6725 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_2.png differ diff --git a/mods/farming/textures/ethereal_strawberry_3.png b/mods/farming/textures/ethereal_strawberry_3.png new file mode 100644 index 00000000..950a57cd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_3.png differ diff --git a/mods/farming/textures/ethereal_strawberry_4.png b/mods/farming/textures/ethereal_strawberry_4.png new file mode 100644 index 00000000..ed090917 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_4.png differ diff --git a/mods/farming/textures/ethereal_strawberry_5.png b/mods/farming/textures/ethereal_strawberry_5.png new file mode 100644 index 00000000..8e6c0acd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_5.png differ diff --git a/mods/farming/textures/ethereal_strawberry_6.png b/mods/farming/textures/ethereal_strawberry_6.png new file mode 100644 index 00000000..c9e97664 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_6.png differ diff --git a/mods/farming/textures/ethereal_strawberry_7.png b/mods/farming/textures/ethereal_strawberry_7.png new file mode 100644 index 00000000..e35830d6 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_7.png differ diff --git a/mods/farming/textures/ethereal_strawberry_8.png b/mods/farming/textures/ethereal_strawberry_8.png new file mode 100644 index 00000000..10ee97dd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_8.png differ diff --git a/mods/farming/textures/farming_apple_pie.png b/mods/farming/textures/farming_apple_pie.png index 0e4fdf4e..a6761350 100644 Binary files a/mods/farming/textures/farming_apple_pie.png and b/mods/farming/textures/farming_apple_pie.png differ diff --git a/mods/farming/textures/farming_asparagus.png b/mods/farming/textures/farming_asparagus.png new file mode 100644 index 00000000..4dbc1ecb Binary files /dev/null and b/mods/farming/textures/farming_asparagus.png differ diff --git a/mods/farming/textures/farming_asparagus_1.png b/mods/farming/textures/farming_asparagus_1.png new file mode 100644 index 00000000..87444d1b Binary files /dev/null and b/mods/farming/textures/farming_asparagus_1.png differ diff --git a/mods/farming/textures/farming_asparagus_2.png b/mods/farming/textures/farming_asparagus_2.png new file mode 100644 index 00000000..cb8c6b4b Binary files /dev/null and b/mods/farming/textures/farming_asparagus_2.png differ diff --git a/mods/farming/textures/farming_asparagus_3.png b/mods/farming/textures/farming_asparagus_3.png new file mode 100644 index 00000000..904fb25f Binary files /dev/null and b/mods/farming/textures/farming_asparagus_3.png differ diff --git a/mods/farming/textures/farming_asparagus_4.png b/mods/farming/textures/farming_asparagus_4.png new file mode 100644 index 00000000..13c02ca5 Binary files /dev/null and b/mods/farming/textures/farming_asparagus_4.png differ diff --git a/mods/farming/textures/farming_asparagus_5.png b/mods/farming/textures/farming_asparagus_5.png new file mode 100644 index 00000000..1ed183e0 Binary files /dev/null and b/mods/farming/textures/farming_asparagus_5.png differ diff --git a/mods/farming/textures/farming_barley.png b/mods/farming/textures/farming_barley.png index ca929e0e..c6819548 100644 Binary files a/mods/farming/textures/farming_barley.png and b/mods/farming/textures/farming_barley.png differ diff --git a/mods/farming/textures/farming_barley_1.png b/mods/farming/textures/farming_barley_1.png index 4a458b16..177fbdf1 100644 Binary files a/mods/farming/textures/farming_barley_1.png and b/mods/farming/textures/farming_barley_1.png differ diff --git a/mods/farming/textures/farming_barley_2.png b/mods/farming/textures/farming_barley_2.png index 96610c2f..d5a5936e 100644 Binary files a/mods/farming/textures/farming_barley_2.png and b/mods/farming/textures/farming_barley_2.png differ diff --git a/mods/farming/textures/farming_barley_3.png b/mods/farming/textures/farming_barley_3.png index ef14b5b3..b456f431 100644 Binary files a/mods/farming/textures/farming_barley_3.png and b/mods/farming/textures/farming_barley_3.png differ diff --git a/mods/farming/textures/farming_barley_4.png b/mods/farming/textures/farming_barley_4.png index f7c90544..62905efd 100644 Binary files a/mods/farming/textures/farming_barley_4.png and b/mods/farming/textures/farming_barley_4.png differ diff --git a/mods/farming/textures/farming_barley_5.png b/mods/farming/textures/farming_barley_5.png index 68c0d683..cc1d66ba 100644 Binary files a/mods/farming/textures/farming_barley_5.png and b/mods/farming/textures/farming_barley_5.png differ diff --git a/mods/farming/textures/farming_barley_6.png b/mods/farming/textures/farming_barley_6.png index 496a2185..e72dd2e5 100644 Binary files a/mods/farming/textures/farming_barley_6.png and b/mods/farming/textures/farming_barley_6.png differ diff --git a/mods/farming/textures/farming_barley_7.png b/mods/farming/textures/farming_barley_7.png index 1c636afb..a37c5173 100644 Binary files a/mods/farming/textures/farming_barley_7.png and b/mods/farming/textures/farming_barley_7.png differ diff --git a/mods/farming/textures/farming_barley_8.png b/mods/farming/textures/farming_barley_8.png new file mode 100644 index 00000000..a2a07653 Binary files /dev/null and b/mods/farming/textures/farming_barley_8.png differ diff --git a/mods/farming/textures/farming_blueberry_pie.png b/mods/farming/textures/farming_blueberry_pie.png index 21746864..1fa6b1c9 100644 Binary files a/mods/farming/textures/farming_blueberry_pie.png and b/mods/farming/textures/farming_blueberry_pie.png differ diff --git a/mods/farming/textures/farming_bowl.png b/mods/farming/textures/farming_bowl.png index 627c22ea..c6b69bab 100644 Binary files a/mods/farming/textures/farming_bowl.png and b/mods/farming/textures/farming_bowl.png differ diff --git a/mods/farming/textures/farming_burger.png b/mods/farming/textures/farming_burger.png index c39f7c0a..94e38fcb 100644 Binary files a/mods/farming/textures/farming_burger.png and b/mods/farming/textures/farming_burger.png differ diff --git a/mods/farming/textures/farming_chili_powder.png b/mods/farming/textures/farming_chili_powder.png new file mode 100644 index 00000000..5c3e31e1 Binary files /dev/null and b/mods/farming/textures/farming_chili_powder.png differ diff --git a/mods/farming/textures/farming_coffee_1.png b/mods/farming/textures/farming_coffee_1.png index 97c207a3..48d1b7ff 100644 Binary files a/mods/farming/textures/farming_coffee_1.png and b/mods/farming/textures/farming_coffee_1.png differ diff --git a/mods/farming/textures/farming_coffee_2.png b/mods/farming/textures/farming_coffee_2.png index a659f851..e80d7bef 100644 Binary files a/mods/farming/textures/farming_coffee_2.png and b/mods/farming/textures/farming_coffee_2.png differ diff --git a/mods/farming/textures/farming_coffee_3.png b/mods/farming/textures/farming_coffee_3.png index 93088c80..a057d04c 100644 Binary files a/mods/farming/textures/farming_coffee_3.png and b/mods/farming/textures/farming_coffee_3.png differ diff --git a/mods/farming/textures/farming_coffee_4.png b/mods/farming/textures/farming_coffee_4.png index 37a609f6..912c5f0d 100644 Binary files a/mods/farming/textures/farming_coffee_4.png and b/mods/farming/textures/farming_coffee_4.png differ diff --git a/mods/farming/textures/farming_coffee_5.png b/mods/farming/textures/farming_coffee_5.png index e624fbeb..47b11f22 100644 Binary files a/mods/farming/textures/farming_coffee_5.png and b/mods/farming/textures/farming_coffee_5.png differ diff --git a/mods/farming/textures/farming_coffee_beans.png b/mods/farming/textures/farming_coffee_beans.png index 0786f4e7..88e9438c 100644 Binary files a/mods/farming/textures/farming_coffee_beans.png and b/mods/farming/textures/farming_coffee_beans.png differ diff --git a/mods/farming/textures/farming_cookie.png b/mods/farming/textures/farming_cookie.png index e80be358..60d88f8a 100644 Binary files a/mods/farming/textures/farming_cookie.png and b/mods/farming/textures/farming_cookie.png differ diff --git a/mods/farming/textures/farming_eggplant.png b/mods/farming/textures/farming_eggplant.png new file mode 100644 index 00000000..4315adda Binary files /dev/null and b/mods/farming/textures/farming_eggplant.png differ diff --git a/mods/farming/textures/farming_eggplant_1.png b/mods/farming/textures/farming_eggplant_1.png new file mode 100644 index 00000000..7246860d Binary files /dev/null and b/mods/farming/textures/farming_eggplant_1.png differ diff --git a/mods/farming/textures/farming_eggplant_2.png b/mods/farming/textures/farming_eggplant_2.png new file mode 100644 index 00000000..bfaf3634 Binary files /dev/null and b/mods/farming/textures/farming_eggplant_2.png differ diff --git a/mods/farming/textures/farming_eggplant_3.png b/mods/farming/textures/farming_eggplant_3.png new file mode 100644 index 00000000..c812200c Binary files /dev/null and b/mods/farming/textures/farming_eggplant_3.png differ diff --git a/mods/farming/textures/farming_eggplant_4.png b/mods/farming/textures/farming_eggplant_4.png new file mode 100644 index 00000000..7b32b1be Binary files /dev/null and b/mods/farming/textures/farming_eggplant_4.png differ diff --git a/mods/farming/textures/farming_ginger.png b/mods/farming/textures/farming_ginger.png new file mode 100644 index 00000000..22a48b5c Binary files /dev/null and b/mods/farming/textures/farming_ginger.png differ diff --git a/mods/farming/textures/farming_ginger_1.png b/mods/farming/textures/farming_ginger_1.png new file mode 100644 index 00000000..84d0d457 Binary files /dev/null and b/mods/farming/textures/farming_ginger_1.png differ diff --git a/mods/farming/textures/farming_ginger_2.png b/mods/farming/textures/farming_ginger_2.png new file mode 100644 index 00000000..c472d20c Binary files /dev/null and b/mods/farming/textures/farming_ginger_2.png differ diff --git a/mods/farming/textures/farming_ginger_3.png b/mods/farming/textures/farming_ginger_3.png new file mode 100644 index 00000000..96f75d75 Binary files /dev/null and b/mods/farming/textures/farming_ginger_3.png differ diff --git a/mods/farming/textures/farming_ginger_4.png b/mods/farming/textures/farming_ginger_4.png new file mode 100644 index 00000000..32f6de5b Binary files /dev/null and b/mods/farming/textures/farming_ginger_4.png differ diff --git a/mods/farming/textures/farming_gingerbread_man.png b/mods/farming/textures/farming_gingerbread_man.png new file mode 100644 index 00000000..f037ae20 Binary files /dev/null and b/mods/farming/textures/farming_gingerbread_man.png differ diff --git a/mods/farming/textures/farming_grapes.png b/mods/farming/textures/farming_grapes.png index aa00ed63..f6396e21 100644 Binary files a/mods/farming/textures/farming_grapes.png and b/mods/farming/textures/farming_grapes.png differ diff --git a/mods/farming/textures/farming_jerusalem_artichokes.png b/mods/farming/textures/farming_jerusalem_artichokes.png new file mode 100644 index 00000000..db87dbc5 Binary files /dev/null and b/mods/farming/textures/farming_jerusalem_artichokes.png differ diff --git a/mods/farming/textures/farming_mac_and_cheese.png b/mods/farming/textures/farming_mac_and_cheese.png new file mode 100644 index 00000000..9ae8b160 Binary files /dev/null and b/mods/farming/textures/farming_mac_and_cheese.png differ diff --git a/mods/farming/textures/farming_mayo.png b/mods/farming/textures/farming_mayo.png new file mode 100644 index 00000000..0178f140 Binary files /dev/null and b/mods/farming/textures/farming_mayo.png differ diff --git a/mods/farming/textures/farming_melon_1.png b/mods/farming/textures/farming_melon_1.png index 3c6ea6d8..f18f6330 100644 Binary files a/mods/farming/textures/farming_melon_1.png and b/mods/farming/textures/farming_melon_1.png differ diff --git a/mods/farming/textures/farming_melon_2.png b/mods/farming/textures/farming_melon_2.png index 185ed826..d5d94133 100644 Binary files a/mods/farming/textures/farming_melon_2.png and b/mods/farming/textures/farming_melon_2.png differ diff --git a/mods/farming/textures/farming_melon_3.png b/mods/farming/textures/farming_melon_3.png index 6e661f92..07730e97 100644 Binary files a/mods/farming/textures/farming_melon_3.png and b/mods/farming/textures/farming_melon_3.png differ diff --git a/mods/farming/textures/farming_melon_4.png b/mods/farming/textures/farming_melon_4.png index d9199f3c..9ff1e2f6 100644 Binary files a/mods/farming/textures/farming_melon_4.png and b/mods/farming/textures/farming_melon_4.png differ diff --git a/mods/farming/textures/farming_melon_5.png b/mods/farming/textures/farming_melon_5.png index 755cbd34..c44afcdd 100644 Binary files a/mods/farming/textures/farming_melon_5.png and b/mods/farming/textures/farming_melon_5.png differ diff --git a/mods/farming/textures/farming_melon_6.png b/mods/farming/textures/farming_melon_6.png index b31a5b4c..f0b9c3db 100644 Binary files a/mods/farming/textures/farming_melon_6.png and b/mods/farming/textures/farming_melon_6.png differ diff --git a/mods/farming/textures/farming_melon_7.png b/mods/farming/textures/farming_melon_7.png index 3aebfdd6..95a3c633 100644 Binary files a/mods/farming/textures/farming_melon_7.png and b/mods/farming/textures/farming_melon_7.png differ diff --git a/mods/farming/textures/farming_melon_bottom.png b/mods/farming/textures/farming_melon_bottom.png index 91d1e6cd..471d6bec 100644 Binary files a/mods/farming/textures/farming_melon_bottom.png and b/mods/farming/textures/farming_melon_bottom.png differ diff --git a/mods/farming/textures/farming_melon_side.png b/mods/farming/textures/farming_melon_side.png index 07afb25d..7995ea5d 100644 Binary files a/mods/farming/textures/farming_melon_side.png and b/mods/farming/textures/farming_melon_side.png differ diff --git a/mods/farming/textures/farming_melon_slice.png b/mods/farming/textures/farming_melon_slice.png index 6ee97757..8ae5dec3 100644 Binary files a/mods/farming/textures/farming_melon_slice.png and b/mods/farming/textures/farming_melon_slice.png differ diff --git a/mods/farming/textures/farming_melon_top.png b/mods/farming/textures/farming_melon_top.png index 29ca92d2..9309f37d 100644 Binary files a/mods/farming/textures/farming_melon_top.png and b/mods/farming/textures/farming_melon_top.png differ diff --git a/mods/farming/textures/farming_onigiri.png b/mods/farming/textures/farming_onigiri.png index 86ee7c68..e1bf0bc1 100644 Binary files a/mods/farming/textures/farming_onigiri.png and b/mods/farming/textures/farming_onigiri.png differ diff --git a/mods/farming/textures/farming_paella.png b/mods/farming/textures/farming_paella.png index 1362ac74..e6bca52a 100644 Binary files a/mods/farming/textures/farming_paella.png and b/mods/farming/textures/farming_paella.png differ diff --git a/mods/farming/textures/farming_pea_1.png b/mods/farming/textures/farming_pea_1.png index eb48e363..aa98af7c 100644 Binary files a/mods/farming/textures/farming_pea_1.png and b/mods/farming/textures/farming_pea_1.png differ diff --git a/mods/farming/textures/farming_pea_2.png b/mods/farming/textures/farming_pea_2.png index 4db7551f..3a4ed622 100644 Binary files a/mods/farming/textures/farming_pea_2.png and b/mods/farming/textures/farming_pea_2.png differ diff --git a/mods/farming/textures/farming_pea_3.png b/mods/farming/textures/farming_pea_3.png index 980d6eaa..5cfd90e3 100644 Binary files a/mods/farming/textures/farming_pea_3.png and b/mods/farming/textures/farming_pea_3.png differ diff --git a/mods/farming/textures/farming_pea_4.png b/mods/farming/textures/farming_pea_4.png index 551eaf40..b14f301a 100644 Binary files a/mods/farming/textures/farming_pea_4.png and b/mods/farming/textures/farming_pea_4.png differ diff --git a/mods/farming/textures/farming_pea_5.png b/mods/farming/textures/farming_pea_5.png index 907760df..ecd81c37 100644 Binary files a/mods/farming/textures/farming_pea_5.png and b/mods/farming/textures/farming_pea_5.png differ diff --git a/mods/farming/textures/farming_pineapple.png b/mods/farming/textures/farming_pineapple.png index febf22a9..c2d2ceb1 100644 Binary files a/mods/farming/textures/farming_pineapple.png and b/mods/farming/textures/farming_pineapple.png differ diff --git a/mods/farming/textures/farming_pineapple_1.png b/mods/farming/textures/farming_pineapple_1.png index 262eff7d..7daa9176 100644 Binary files a/mods/farming/textures/farming_pineapple_1.png and b/mods/farming/textures/farming_pineapple_1.png differ diff --git a/mods/farming/textures/farming_pineapple_2.png b/mods/farming/textures/farming_pineapple_2.png index 4b96d172..6fe2a14b 100644 Binary files a/mods/farming/textures/farming_pineapple_2.png and b/mods/farming/textures/farming_pineapple_2.png differ diff --git a/mods/farming/textures/farming_pineapple_3.png b/mods/farming/textures/farming_pineapple_3.png index 90464a17..e9a625ab 100644 Binary files a/mods/farming/textures/farming_pineapple_3.png and b/mods/farming/textures/farming_pineapple_3.png differ diff --git a/mods/farming/textures/farming_pineapple_4.png b/mods/farming/textures/farming_pineapple_4.png index be58e53f..5bc64153 100644 Binary files a/mods/farming/textures/farming_pineapple_4.png and b/mods/farming/textures/farming_pineapple_4.png differ diff --git a/mods/farming/textures/farming_pineapple_5.png b/mods/farming/textures/farming_pineapple_5.png index 2526f835..ddf2dd56 100644 Binary files a/mods/farming/textures/farming_pineapple_5.png and b/mods/farming/textures/farming_pineapple_5.png differ diff --git a/mods/farming/textures/farming_pineapple_6.png b/mods/farming/textures/farming_pineapple_6.png index 741e0e36..a674df2d 100644 Binary files a/mods/farming/textures/farming_pineapple_6.png and b/mods/farming/textures/farming_pineapple_6.png differ diff --git a/mods/farming/textures/farming_pineapple_7.png b/mods/farming/textures/farming_pineapple_7.png index 22bad237..5158af32 100644 Binary files a/mods/farming/textures/farming_pineapple_7.png and b/mods/farming/textures/farming_pineapple_7.png differ diff --git a/mods/farming/textures/farming_pineapple_8.png b/mods/farming/textures/farming_pineapple_8.png index 5182c4f7..006a54ef 100644 Binary files a/mods/farming/textures/farming_pineapple_8.png and b/mods/farming/textures/farming_pineapple_8.png differ diff --git a/mods/farming/textures/farming_pineapple_top.png b/mods/farming/textures/farming_pineapple_top.png index f653d83f..78e3f36a 100644 Binary files a/mods/farming/textures/farming_pineapple_top.png and b/mods/farming/textures/farming_pineapple_top.png differ diff --git a/mods/farming/textures/farming_popcorn.png b/mods/farming/textures/farming_popcorn.png index 6a534b94..9aa75807 100644 Binary files a/mods/farming/textures/farming_popcorn.png and b/mods/farming/textures/farming_popcorn.png differ diff --git a/mods/farming/textures/farming_porridge.png b/mods/farming/textures/farming_porridge.png index cd4466fb..e31929be 100644 Binary files a/mods/farming/textures/farming_porridge.png and b/mods/farming/textures/farming_porridge.png differ diff --git a/mods/farming/textures/farming_potato_omelet.png b/mods/farming/textures/farming_potato_omelet.png index abdacada..aee3cfb5 100644 Binary files a/mods/farming/textures/farming_potato_omelet.png and b/mods/farming/textures/farming_potato_omelet.png differ diff --git a/mods/farming/textures/farming_potato_salad.png b/mods/farming/textures/farming_potato_salad.png index 0028c91e..ce148bb5 100644 Binary files a/mods/farming/textures/farming_potato_salad.png and b/mods/farming/textures/farming_potato_salad.png differ diff --git a/mods/farming/textures/farming_pumpkin_bottom.png b/mods/farming/textures/farming_pumpkin_bottom.png index b23d2413..8c8f56e8 100644 Binary files a/mods/farming/textures/farming_pumpkin_bottom.png and b/mods/farming/textures/farming_pumpkin_bottom.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_off.png b/mods/farming/textures/farming_pumpkin_face_off.png index df701714..ed46e833 100644 Binary files a/mods/farming/textures/farming_pumpkin_face_off.png and b/mods/farming/textures/farming_pumpkin_face_off.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_on.png b/mods/farming/textures/farming_pumpkin_face_on.png index fa71c9d4..4708c9d6 100644 Binary files a/mods/farming/textures/farming_pumpkin_face_on.png and b/mods/farming/textures/farming_pumpkin_face_on.png differ diff --git a/mods/farming/textures/farming_pumpkin_side.png b/mods/farming/textures/farming_pumpkin_side.png index 2d30f203..e29b7320 100644 Binary files a/mods/farming/textures/farming_pumpkin_side.png and b/mods/farming/textures/farming_pumpkin_side.png differ diff --git a/mods/farming/textures/farming_pumpkin_top.png b/mods/farming/textures/farming_pumpkin_top.png index 79283454..6b8e91bb 100644 Binary files a/mods/farming/textures/farming_pumpkin_top.png and b/mods/farming/textures/farming_pumpkin_top.png differ diff --git a/mods/farming/textures/farming_rhubarb_1.png b/mods/farming/textures/farming_rhubarb_1.png index 01585b1b..5ebf1160 100644 Binary files a/mods/farming/textures/farming_rhubarb_1.png and b/mods/farming/textures/farming_rhubarb_1.png differ diff --git a/mods/farming/textures/farming_rhubarb_2.png b/mods/farming/textures/farming_rhubarb_2.png index 71845c75..01585b1b 100644 Binary files a/mods/farming/textures/farming_rhubarb_2.png and b/mods/farming/textures/farming_rhubarb_2.png differ diff --git a/mods/farming/textures/farming_rhubarb_3.png b/mods/farming/textures/farming_rhubarb_3.png index b412f7e0..71845c75 100644 Binary files a/mods/farming/textures/farming_rhubarb_3.png and b/mods/farming/textures/farming_rhubarb_3.png differ diff --git a/mods/farming/textures/farming_rhubarb_4.png b/mods/farming/textures/farming_rhubarb_4.png new file mode 100644 index 00000000..b412f7e0 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_4.png differ diff --git a/mods/farming/textures/farming_rhubarb_pie.png b/mods/farming/textures/farming_rhubarb_pie.png index 1f77b535..d5593260 100644 Binary files a/mods/farming/textures/farming_rhubarb_pie.png and b/mods/farming/textures/farming_rhubarb_pie.png differ diff --git a/mods/farming/textures/farming_rice.png b/mods/farming/textures/farming_rice.png index 3d64c7e2..9b42a346 100644 Binary files a/mods/farming/textures/farming_rice.png and b/mods/farming/textures/farming_rice.png differ diff --git a/mods/farming/textures/farming_rice_seed.png b/mods/farming/textures/farming_rice_seed.png new file mode 100644 index 00000000..8a84f58d Binary files /dev/null and b/mods/farming/textures/farming_rice_seed.png differ diff --git a/mods/farming/textures/farming_spaghetti.png b/mods/farming/textures/farming_spaghetti.png index a401281b..b18ee439 100644 Binary files a/mods/farming/textures/farming_spaghetti.png and b/mods/farming/textures/farming_spaghetti.png differ diff --git a/mods/farming/textures/farming_spanish_potatoes.png b/mods/farming/textures/farming_spanish_potatoes.png index 198b50e4..8571b180 100644 Binary files a/mods/farming/textures/farming_spanish_potatoes.png and b/mods/farming/textures/farming_spanish_potatoes.png differ diff --git a/mods/farming/textures/farming_spinach.png b/mods/farming/textures/farming_spinach.png new file mode 100644 index 00000000..2e7d519a Binary files /dev/null and b/mods/farming/textures/farming_spinach.png differ diff --git a/mods/farming/textures/farming_spinach_1.png b/mods/farming/textures/farming_spinach_1.png new file mode 100644 index 00000000..67c95f86 Binary files /dev/null and b/mods/farming/textures/farming_spinach_1.png differ diff --git a/mods/farming/textures/farming_spinach_2.png b/mods/farming/textures/farming_spinach_2.png new file mode 100644 index 00000000..52d976db Binary files /dev/null and b/mods/farming/textures/farming_spinach_2.png differ diff --git a/mods/farming/textures/farming_spinach_3.png b/mods/farming/textures/farming_spinach_3.png new file mode 100644 index 00000000..ef2e85f9 Binary files /dev/null and b/mods/farming/textures/farming_spinach_3.png differ diff --git a/mods/farming/textures/farming_spinach_4.png b/mods/farming/textures/farming_spinach_4.png new file mode 100644 index 00000000..9435bc66 Binary files /dev/null and b/mods/farming/textures/farming_spinach_4.png differ diff --git a/mods/farming/textures/farming_sugar_cube.png b/mods/farming/textures/farming_sugar_cube.png new file mode 100644 index 00000000..7c9b8352 Binary files /dev/null and b/mods/farming/textures/farming_sugar_cube.png differ diff --git a/mods/farming/textures/farming_sunflower.png b/mods/farming/textures/farming_sunflower.png index 06b9387d..17a91c97 100644 Binary files a/mods/farming/textures/farming_sunflower.png and b/mods/farming/textures/farming_sunflower.png differ diff --git a/mods/farming/textures/farming_sunflower_bread.png b/mods/farming/textures/farming_sunflower_bread.png index 112e8c63..49938700 100644 Binary files a/mods/farming/textures/farming_sunflower_bread.png and b/mods/farming/textures/farming_sunflower_bread.png differ diff --git a/mods/farming/textures/farming_vanilla.png b/mods/farming/textures/farming_vanilla.png index 25596ade..ddcb540e 100644 Binary files a/mods/farming/textures/farming_vanilla.png and b/mods/farming/textures/farming_vanilla.png differ diff --git a/mods/farming/textures/farming_vanilla_flan.png b/mods/farming/textures/farming_vanilla_flan.png index c8b9ff06..10008c4b 100644 Binary files a/mods/farming/textures/farming_vanilla_flan.png and b/mods/farming/textures/farming_vanilla_flan.png differ diff --git a/mods/farming/textures/farming_vegan_butter.png b/mods/farming/textures/farming_vegan_butter.png new file mode 100644 index 00000000..2e843497 Binary files /dev/null and b/mods/farming/textures/farming_vegan_butter.png differ diff --git a/mods/farming/utensils.lua b/mods/farming/utensils.lua deleted file mode 100644 index f9b2d29f..00000000 --- a/mods/farming/utensils.lua +++ /dev/null @@ -1,160 +0,0 @@ - -local S = farming.intllib - --- wooden bowl - -minetest.register_craftitem("farming:bowl", { - description = S("Wooden Bowl"), - inventory_image = "farming_bowl.png", - groups = {food_bowl = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:bowl 4", - recipe = { - {"group:wood", "", "group:wood"}, - {"", "group:wood", ""} - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "farming:bowl", - burntime = 10 -}) - --- saucepan - -minetest.register_craftitem("farming:saucepan", { - description = S("Saucepan"), - inventory_image = "farming_saucepan.png", - groups = {food_saucepan = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:saucepan", - recipe = { - {"default:steel_ingot", "", ""}, - {"", "group:stick", ""} - } -}) - --- cooking pot - -minetest.register_craftitem("farming:pot", { - description = S("Cooking Pot"), - inventory_image = "farming_pot.png", - groups = {food_pot = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:pot", - recipe = { - {"group:stick", "default:steel_ingot", "default:steel_ingot"}, - {"", "default:steel_ingot", "default:steel_ingot"} - } -}) - --- baking tray - -minetest.register_craftitem("farming:baking_tray", { - description = S("Baking Tray"), - inventory_image = "farming_baking_tray.png", - groups = {food_baking_tray = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:baking_tray", - recipe = { - {"default:clay_brick", "default:clay_brick", "default:clay_brick"}, - {"default:clay_brick", "", "default:clay_brick"}, - {"default:clay_brick", "default:clay_brick", "default:clay_brick"} - } -}) - --- skillet - -minetest.register_craftitem("farming:skillet", { - description = S("Skillet"), - inventory_image = "farming_skillet.png", - groups = {food_skillet = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:skillet", - recipe = { - {"default:steel_ingot", "", ""}, - {"", "default:steel_ingot", ""}, - {"", "", "group:stick"} - } -}) - --- mortar and pestle - -minetest.register_craftitem("farming:mortar_pestle", { - description = S("Mortar and Pestle"), - inventory_image = "farming_mortar_pestle.png", - groups = {food_mortar_pestle = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:mortar_pestle", - recipe = { - {"default:stone", "group:stick", "default:stone"}, - {"", "default:stone", ""} - } -}) - --- cutting board - -minetest.register_craftitem("farming:cutting_board", { - description = S("Cutting Board"), - inventory_image = "farming_cutting_board.png", - groups = {food_cutting_board = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:cutting_board", - recipe = { - {"default:steel_ingot", "", ""}, - {"", "group:stick", ""}, - {"", "", "group:wood"} - } -}) - --- juicer - -minetest.register_craftitem("farming:juicer", { - description = S("Juicer"), - inventory_image = "farming_juicer.png", - groups = {food_juicer = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:juicer", - recipe = { - {"", "default:stone", ""}, - {"default:stone", "", "default:stone"} - } -}) - --- glass mixing bowl - -minetest.register_craftitem("farming:mixing_bowl", { - description = S("Glass Mixing Bowl"), - inventory_image = "farming_mixing_bowl.png", - groups = {food_mixing_bowl = 1, flammable = 2} -}) - -minetest.register_craft({ - output = "farming:mixing_bowl", - recipe = { - {"default:glass", "group:stick", "default:glass"}, - {"", "default:glass", ""} - } -}) - -minetest.register_craft( { - output = "vessels:glass_fragments", - recipe = {{"farming:mixing_bowl"}} -}) diff --git a/mods/flowerpot/init.lua b/mods/flowerpot/init.lua index 53b4b657..fa1bfb9a 100644 --- a/mods/flowerpot/init.lua +++ b/mods/flowerpot/init.lua @@ -12,54 +12,34 @@ flowerpot = {} +local f = string.format + -- Translation local S = minetest.get_translator("flowerpot") --- handle plant removal from flowerpot -local function flowerpot_on_punch(pos, node, puncher, pointed_thing) - if puncher and not minetest.check_player_privs(puncher, "protection_bypass") then - local name = puncher:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return false - end - end - - local nodedef = minetest.registered_nodes[node.name] - local plant = nodedef.flowerpot_plantname - assert(plant, "unknown plant in flowerpot: " .. node.name) - - minetest.sound_play(nodedef.sounds.dug, {pos = pos}) - minetest.handle_node_drops(pos, {plant}, puncher) - minetest.swap_node(pos, {name = "flowerpot:empty"}) -end +local flower_items_by_pot = {} -- handle plant insertion into flowerpot local function flowerpot_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return false - end + if not minetest.is_player(clicker) then + return itemstack end - local nodename = itemstack:get_name() - if not nodename then - return false + local player_name = clicker:get_player_name() + + if minetest.is_protected(pos, player_name) then + return itemstack end - if nodename:match("grass_1") then - nodename = nodename:gsub("grass_1", "grass_" .. math.random(5)) - end + local item_name = itemstack:get_name() - local name = "flowerpot:" .. nodename:gsub(":", "_") - local def = minetest.registered_nodes[name] + local pot_name = "flowerpot:" .. item_name:gsub(":", "_") + local def = minetest.registered_nodes[pot_name] if not def then return itemstack end minetest.sound_play(def.sounds.place, {pos = pos}) - minetest.swap_node(pos, {name = name}) + minetest.swap_node(pos, {name = pot_name}) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -74,12 +54,39 @@ local function get_tile(def) return tile end +local old_get_node_drops = minetest.get_node_drops + +function minetest.get_node_drops(node, toolname) + local node_name + if type(node) == "table" then + node_name = node.name + + elseif type(node) == "string" then + node_name = node + end + + if node_name then + local flower_item = flower_items_by_pot[node_name] + if flower_item then + local drops = old_get_node_drops(flower_item, toolname) + if drops then + table.insert(drops, "flowerpot:empty") + return drops + else + return { "flowerpot:empty" } + end + end + end + + return old_get_node_drops(node, toolname) +end + function flowerpot.register_node(nodename) assert(nodename, "no nodename passed") local nodedef = minetest.registered_nodes[nodename] + if not nodedef then - minetest.log("error", S("@1 is not a known node, unable to register flowerpot", nodename)) - return false + error(f("%s is not a known node, unable to register flowerpot", nodename)) end local desc = nodedef.description @@ -100,7 +107,7 @@ function flowerpot.register_node(nodename) } end - local dropname = nodename:gsub("grass_%d", "grass_1") + flower_items_by_pot["flowerpot:" .. name] = nodename minetest.register_node(":flowerpot:" .. name, { description = S("Flowerpot with @1", desc), @@ -121,20 +128,24 @@ function flowerpot.register_node(nodename) sounds = default.node_sound_defaults(), groups = {attached_node = 1, oddly_breakable_by_hand = 1, snappy = 3, not_in_creative_inventory = 1}, flowerpot_plantname = nodename, - on_dig = function(pos, node, digger) - minetest.set_node(pos, {name = "flowerpot:empty"}) - local def = minetest.registered_nodes[node.name] - minetest.add_item(pos, dropname) + node_dig_prediction = "flowerpot:empty", + on_punch = function(pos, node, puncher, pointed_thing) + if not (puncher and puncher:is_player()) then + return + end + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local toolname = puncher:get_wielded_item() + if node.name then + local flower_item = flower_items_by_pot[node.name] + if flower_item then + local drops = old_get_node_drops(flower_item, toolname) + minetest.handle_node_drops(pos, drops, puncher) + end + end + minetest.swap_node(pos, {name = "flowerpot:empty"}) end, - drop = { - max_items = 2, - items = { - { - items = {"flowerpot:empty", dropname}, - rarity = 1, - }, - } - }, }) end diff --git a/mods/flowerpot/locale/flowerpot.eo.tr b/mods/flowerpot/locale/flowerpot.eo.tr new file mode 100644 index 00000000..8a6c08f3 --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.eo.tr @@ -0,0 +1,7 @@ +# textdomain: flowerpot + +@1 is not a known node, unable to register flowerpot=@1 ne estas konata nodo, nekapabla registri florpoton + +Flowerpot with @1=Florpoto kun @1 + +Flowerpot=Florpoto diff --git a/mods/flowerpot/locale/flowerpot.es.tr b/mods/flowerpot/locale/flowerpot.es.tr new file mode 100644 index 00000000..f4e1370b --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.es.tr @@ -0,0 +1,7 @@ +# textdomain: flowerpot + +@1 is not a known node, unable to register flowerpot=@1 no es un nodo conocido, no se pudo registrar la maceta + +Flowerpot with @1=Maceta con @1 + +Flowerpot=Maceta diff --git a/mods/gloopblocks/init.lua b/mods/gloopblocks/init.lua index 7a220e45..9da78c4c 100644 --- a/mods/gloopblocks/init.lua +++ b/mods/gloopblocks/init.lua @@ -8,9 +8,8 @@ Maintained by VanessaE. gloopblocks = {} --- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator(minetest.get_current_modname()) dofile(MP.."/main.lua") dofile(MP.."/crafts.lua") diff --git a/mods/gloopblocks/intllib.lua b/mods/gloopblocks/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/gloopblocks/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/gloopblocks/lava-handling.lua b/mods/gloopblocks/lava-handling.lua index a2c083d6..64712e9f 100644 --- a/mods/gloopblocks/lava-handling.lua +++ b/mods/gloopblocks/lava-handling.lua @@ -1,6 +1,4 @@ --- Load support for intllib. -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator(minetest.get_current_modname()) -- define lava-cooling-based nodes and hook into the default lavacooling -- functions to generate basalt, pumice, and obsidian @@ -10,7 +8,7 @@ if minetest.setting_getbool("gloopblocks_lavacooling") ~= false then minetest.register_node("gloopblocks:obsidian_cooled", { description = S("Obsidian"), tiles = {"default_obsidian.png"}, - is_ground_content = true, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), groups = {cracky=1, level=2, not_in_creative_inventory=1}, drop = "default:obsidian", @@ -23,6 +21,7 @@ if minetest.setting_getbool("gloopblocks_lavacooling") ~= false then description = S("Basalt"), tiles = {"gloopblocks_basalt.png"}, groups = {cracky=2, not_in_creative_inventory=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), drop = "gloopblocks:basalt", after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -34,6 +33,7 @@ if minetest.setting_getbool("gloopblocks_lavacooling") ~= false then description = S("Pumice"), tiles = {"gloopblocks_pumice.png"}, groups = {cracky=3, not_in_creative_inventory=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), drop = "gloopblocks:pumice", after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -75,6 +75,7 @@ if minetest.setting_getbool("gloopblocks_lava_damage") then description = S("Block of ashes"), tiles = {"gloopblocks_ashes.png"}, groups = {crumbly = 3}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), }) @@ -91,6 +92,7 @@ if minetest.setting_getbool("gloopblocks_lava_damage") then selection_box = cbox, collision_box = cbox, groups = {crumbly = 3}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), }) diff --git a/mods/gloopblocks/locale/de.po b/mods/gloopblocks/locale/de.po deleted file mode 100644 index 2cabe6ff..00000000 --- a/mods/gloopblocks/locale/de.po +++ /dev/null @@ -1,235 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-14 07:09+0200\n" -"PO-Revision-Date: 2017-05-14 07:22+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: Xanthin\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de\n" - -#: init.lua -#, fuzzy -msgid "Diagonal Rainbow Block" -msgstr "Regenbogenblock (diagonal)" - -#: init.lua -#, fuzzy -msgid "Horizontal Rainbow Block" -msgstr "Regenbogenblock (horizontal)" - -#: init.lua -msgid "Cement" -msgstr "Zement" - -#: init.lua -msgid "Evil Block" -msgstr "Teuflischer Block" - -#: init.lua -msgid "Basalt" -msgstr "Basalt" - -#: init.lua -msgid "Pumice" -msgstr "Bimsstein" - -#: init.lua -msgid "Pavement" -msgstr "Strassenbelag" - -#: init.lua -msgid "Oerkki Block" -msgstr "Oerkkiblock" - -#: init.lua -msgid "Mossy Stone Brick" -msgstr "Moosiger Steinziegel" - -#: init.lua -msgid "Mossy Stone" -msgstr "Moosiger Stein" - -#: init.lua -msgid "Cobblestone Road Bed" -msgstr "Kopfsteinpflasterstrasse" - -#: init.lua -msgid "Mossy Cobblestone Road Bed" -msgstr "Moosige Kopfsteinpflasterstrasse" - -#: init.lua -msgid "Wooden Scaffold" -msgstr "Holzgeruest" - -#: init.lua -msgid "Cobblestone Roadbed" -msgstr "Kopfsteinpflasterstrasse" - -#: init.lua -msgid "Mossy Cobblestone Roadbed" -msgstr "Moosige Kopfsteinpflasterstrasse" - -#: init.lua -msgid "Rainbow Block" -msgstr "Regenbogenblock" - -#: init.lua -msgid "Glow Crystal" -msgstr "" - -#: init.lua -msgid "Glow Emerald" -msgstr "" - -#: init.lua -msgid "Glow Mese" -msgstr "" - -#: init.lua -msgid "Mossy Stone Stair" -msgstr "Moosige Steintreppe" - -#: init.lua -msgid "Mossy Stone Slab" -msgstr "Moosige Pflastersteintreppe" - -#: init.lua -msgid "Mossy Cobble Stair" -msgstr "Moosige Pflastersteintreppe" - -#: init.lua -msgid "Mossy Cobble Slab" -msgstr "Moosige Pflastersteinstufe" - -#: init.lua -msgid "Mossy Stone Brick Stair" -msgstr "Moosige Steinziegeltreppe" - -#: init.lua -msgid "Mossy Stone Brick Slab" -msgstr "Moosige Steinziegelstufe" - -#: init.lua -msgid "Cobble Roadbed Stair" -msgstr "Kopfsteinstrassentreppe" - -#: init.lua -msgid "Cobble Roadbed Slab" -msgstr "Kopfsteinstrassenstufe" - -#: init.lua -msgid "Mossy Cobble Roadbed Stair" -msgstr "Moosige Kopfsteinstrassentreppe" - -#: init.lua -msgid "Mossy Cobble Roadbed Slab" -msgstr "Moosige Kopfsteinstrassenstufe" - -#: init.lua -msgid "Cement Stair" -msgstr "Zementtreppe" - -#: init.lua -msgid "Cement Slab" -msgstr "Zementstufe" - -#: init.lua -msgid "Pavement Stair" -msgstr "Strassenbelagtreppe" - -#: init.lua -msgid "Pavement Slab" -msgstr "Strassenbelagstufe" - -#: init.lua -#, fuzzy -msgid "Basalt Stair" -msgstr "Basalttreppe" - -#: init.lua -#, fuzzy -msgid "Basalt Slab" -msgstr "Basaltstufe" - -#: init.lua -#, fuzzy -msgid "Pumice Stair" -msgstr "Bimssteintreppe" - -#: init.lua -#, fuzzy -msgid "Pumice Slab" -msgstr "Bimssteinstufe" - -#: init.lua -#, fuzzy -msgid "Rainbow Block Stair" -msgstr "Regenbogenblocktreppe" - -#: init.lua -#, fuzzy -msgid "Rainbow Block Slab" -msgstr "Regenbogenblockstufe" - -#: init.lua -msgid "Cement Pickaxe" -msgstr "Zementspitzhacke" - -#: init.lua -msgid "Cement Shovel" -msgstr "Zementschaufel" - -#: init.lua -msgid "Cement Axe" -msgstr "Zementaxt" - -#: init.lua -msgid "Cement Sword" -msgstr "Zementschwert" - -#: init.lua -msgid "Evil Pickaxe" -msgstr "Teuflische Spitzhacke" - -#: init.lua -msgid "Evil Shovel" -msgstr "Teuflische Schaufel" - -#: init.lua -msgid "Evil Axe" -msgstr "Teuflische Axt" - -#: init.lua -msgid "Evil Sword" -msgstr "Teuflisches Schwert" - -#: init.lua -msgid "Wet Cement" -msgstr "Feuchter Zement" - -#: init.lua -msgid "Evil Stick" -msgstr "Teuflischer Stock" - -#: init.lua -msgid "Obsidian" -msgstr "Obsidian" - -#: init.lua -msgid "Steel Fence" -msgstr "" - -#: init.lua -msgid "Gloopblocks Loaded!" -msgstr "Gloopblocks geladen!" diff --git a/mods/gloopblocks/locale/fr.po b/mods/gloopblocks/locale/fr.po deleted file mode 100644 index 2baaa6c1..00000000 --- a/mods/gloopblocks/locale/fr.po +++ /dev/null @@ -1,227 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-14 06:47+0200\n" -"PO-Revision-Date: 2017-08-06 08:45+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: fat115 \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: init.lua -msgid "Diagonal Rainbow Block" -msgstr "Bloc Arc-en-ciel diagonal" - -#: init.lua -msgid "Horizontal Rainbow Block" -msgstr "Bloc Arc-en-ciel horizontal" - -#: init.lua -msgid "Cement" -msgstr "Ciment" - -#: init.lua -msgid "Evil Block" -msgstr "Bloc diabolique" - -#: init.lua -msgid "Basalt" -msgstr "Basalte" - -#: init.lua -msgid "Pumice" -msgstr "Pierre ponce" - -#: init.lua -msgid "Pavement" -msgstr "Chaussée" - -#: init.lua -msgid "Oerkki Block" -msgstr "Bloc Oerkki" - -#: init.lua -msgid "Mossy Stone Brick" -msgstr "Brique moussue en pierre" - -#: init.lua -msgid "Mossy Stone" -msgstr "Pierre moussue" - -#: init.lua -msgid "Cobblestone Road Bed" -msgstr "Ballast en pierres" - -#: init.lua -msgid "Mossy Cobblestone Road Bed" -msgstr "Ballast moussu en pierres" - -#: init.lua -msgid "Wooden Scaffold" -msgstr "Échafaud en bois" - -#: init.lua -msgid "Cobblestone Roadbed" -msgstr "Ballast en pierres" - -#: init.lua -msgid "Mossy Cobblestone Roadbed" -msgstr "Ballast moussu en pierres" - -#: init.lua -msgid "Rainbow Block" -msgstr "Bloc Arc-en-ciel" - -#: init.lua -msgid "Glow Crystal" -msgstr "Cristal brillant" - -#: init.lua -msgid "Glow Emerald" -msgstr "Émeraude brillante" - -#: init.lua -msgid "Glow Mese" -msgstr "Mese brillant" - -#: init.lua -msgid "Mossy Stone Stair" -msgstr "Marche moussue en pierre" - -#: init.lua -msgid "Mossy Stone Slab" -msgstr "Dalle moussue en pierre" - -#: init.lua -msgid "Mossy Cobble Stair" -msgstr "Marche moussue en pierres" - -#: init.lua -msgid "Mossy Cobble Slab" -msgstr "Dalle moussue en pierres" - -#: init.lua -msgid "Mossy Stone Brick Stair" -msgstr "Marche moussue en briques de pierre" - -#: init.lua -msgid "Mossy Stone Brick Slab" -msgstr "Dalle moussue en briques de pierre" - -#: init.lua -msgid "Cobble Roadbed Stair" -msgstr "Marche en ballast (pierres)" - -#: init.lua -msgid "Cobble Roadbed Slab" -msgstr "Dalle en ballast (pierres)" - -#: init.lua -msgid "Mossy Cobble Roadbed Stair" -msgstr "Marche moussue en ballast (pierres)" - -#: init.lua -msgid "Mossy Cobble Roadbed Slab" -msgstr "Dalle moussue en ballast (pierres)" - -#: init.lua -msgid "Cement Stair" -msgstr "Marche en ciment" - -#: init.lua -msgid "Cement Slab" -msgstr "Dalle en ciment" - -#: init.lua -msgid "Pavement Stair" -msgstr "Marche de chaussée" - -#: init.lua -msgid "Pavement Slab" -msgstr "Dalle de chaussée" - -#: init.lua -msgid "Basalt Stair" -msgstr "Marche en basalte" - -#: init.lua -msgid "Basalt Slab" -msgstr "Dalle en basalte" - -#: init.lua -msgid "Pumice Stair" -msgstr "Marche en pierre ponce" - -#: init.lua -msgid "Pumice Slab" -msgstr "Dalle en pierre ponce" - -#: init.lua -msgid "Rainbow Block Stair" -msgstr "Marche en bloc Arc-en-ciel" - -#: init.lua -msgid "Rainbow Block Slab" -msgstr "Dalle en bloc Arc-en-ciel" - -#: init.lua -msgid "Cement Pickaxe" -msgstr "Pioche en ciment" - -#: init.lua -msgid "Cement Shovel" -msgstr "Pelle en ciment" - -#: init.lua -msgid "Cement Axe" -msgstr "Hache en ciment" - -#: init.lua -msgid "Cement Sword" -msgstr "Épée en ciment" - -#: init.lua -msgid "Evil Pickaxe" -msgstr "Pioche diabolique" - -#: init.lua -msgid "Evil Shovel" -msgstr "Pelle diabolique" - -#: init.lua -msgid "Evil Axe" -msgstr "Hache diabolique" - -#: init.lua -msgid "Evil Sword" -msgstr "Épée diabolique" - -#: init.lua -msgid "Wet Cement" -msgstr "Mortier" - -#: init.lua -msgid "Evil Stick" -msgstr "Baton diabolique" - -#: init.lua -msgid "Obsidian" -msgstr "Obsidienne" - -#: init.lua -msgid "Steel Fence" -msgstr "Barrière en acier" - -#: init.lua -msgid "Gloopblocks Loaded!" -msgstr "[Gloopblocks] a été chargé." diff --git a/mods/gloopblocks/locale/gloopblocks.de.tr b/mods/gloopblocks/locale/gloopblocks.de.tr new file mode 100644 index 00000000..f1871c48 --- /dev/null +++ b/mods/gloopblocks/locale/gloopblocks.de.tr @@ -0,0 +1,87 @@ +# textdomain: gloopblocks +Gloopblocks Loaded!=Gloopblocks geladen! +Obsidian=Obsidian +Block of ashes= +Pile of ashes= +Basalt=Basalt +Pumice=Bimsstein +Diagonal Rainbow Block=Regenbogenblock (diagonal) +Horizontal Rainbow Block=Regenbogenblock (horizontal) +Evil Block=Teuflischer Block +Pavement=Strassenbelag +Oerkki Block=Oerkkiblock +Mossy Stone Brick=Moosiger Steinziegel +Mossy Stone=Moosiger Stein +Cobblestone Roadbed=Kopfsteinpflasterstrasse +Mossy Cobblestone Roadbed=Moosige Kopfsteinpflasterstrasse +Wooden Scaffold=Holzgeruest +Concrete sidewalk= +Rainbow Block=Regenbogenblock +Gravel= +Glow Crystal= +Glow Emerald= +Glow Mese= +Cement Pickaxe=Zementspitzhacke +Cement Shovel=Zementschaufel +Cement Axe=Zementaxt +Cement Sword=Zementschwert +Evil Pickaxe=Teuflische Spitzhacke +Evil Shovel=Teuflische Schaufel +Evil Axe=Teuflische Axt +Evil Sword=Teuflisches Schwert +Evil Stick=Teuflischer Stock +Steel Fence= +Mossy Stone Stair=Moosige Steintreppe +Inner Mossy Stone Stair= +Outer Mossy Stone Stair= +Mossy Stone Slab=Moosige Pflastersteintreppe +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Mossy Stone Brick Stair=Moosige Steinziegeltreppe +Inner Mossy Stone Brick Stair= +Outer Mossy Stone Brick Stair= +Mossy Stone Brick Slab=Moosige Steinziegelstufe +Cobblestone Roadbed Stair= +Inner Cobblestone Roadbed Stair= +Outer Cobblestone Roadbed Stair= +Cobblestone Roadbed Slab= +Mossy Cobblestone Roadbed Stair= +Inner Mossy Cobblestone Roadbed Stair= +Outer Mossy Cobblestone Roadbed Stair= +Mossy Cobblestone Roadbed Slab= +Cement Stair=Zementtreppe +Inner Cement Stair= +Outer Cement Stair= +Cement Slab=Zementstufe +Pavement Stair=Strassenbelagtreppe +Inner Pavement Stair= +Outer Pavement Stair= +Pavement Slab=Strassenbelagstufe +Basalt Stair=Basalttreppe +Inner Basalt Stair= +Outer Basalt Stair= +Basalt Slab=Basaltstufe +Pumice Stair=Bimssteintreppe +Inner Pumice Stair= +Outer Pumice Stair= +Pumice Slab=Bimssteinstufe +Rainbow Block Stair=Regenbogenblocktreppe +Inner Rainbow Block Stair= +Outer Rainbow Block Stair= +Rainbow Block Slab=Regenbogenblockstufe + + +##### not used anymore ##### + +Cobblestone Road Bed=Kopfsteinpflasterstrasse +Mossy Cobblestone Road Bed=Moosige Kopfsteinpflasterstrasse +Mossy Cobble Stair=Moosige Pflastersteintreppe +Mossy Cobble Slab=Moosige Pflastersteinstufe +Cobble Roadbed Stair=Kopfsteinstrassentreppe +Cobble Roadbed Slab=Kopfsteinstrassenstufe +Mossy Cobble Roadbed Stair=Moosige Kopfsteinstrassentreppe +Mossy Cobble Roadbed Slab=Moosige Kopfsteinstrassenstufe +Cement=Zement +Wet Cement=Feuchter Zement diff --git a/mods/gloopblocks/locale/gloopblocks.fr.tr b/mods/gloopblocks/locale/gloopblocks.fr.tr new file mode 100644 index 00000000..83282255 --- /dev/null +++ b/mods/gloopblocks/locale/gloopblocks.fr.tr @@ -0,0 +1,87 @@ +# textdomain: gloopblocks +Gloopblocks Loaded!=[Gloopblocks] a été chargé. +Obsidian=Obsidienne +Block of ashes= +Pile of ashes= +Basalt=Basalte +Pumice=Pierre ponce +Diagonal Rainbow Block=Bloc Arc-en-ciel diagonal +Horizontal Rainbow Block=Bloc Arc-en-ciel horizontal +Evil Block=Bloc diabolique +Pavement=Chaussée +Oerkki Block=Bloc Oerkki +Mossy Stone Brick=Brique moussue en pierre +Mossy Stone=Pierre moussue +Cobblestone Roadbed=Ballast en pierres +Mossy Cobblestone Roadbed=Ballast moussu en pierres +Wooden Scaffold=Échafaud en bois +Concrete sidewalk= +Rainbow Block=Bloc Arc-en-ciel +Gravel= +Glow Crystal=Cristal brillant +Glow Emerald=Émeraude brillante +Glow Mese=Mese brillant +Cement Pickaxe=Pioche en ciment +Cement Shovel=Pelle en ciment +Cement Axe=Hache en ciment +Cement Sword=Épée en ciment +Evil Pickaxe=Pioche diabolique +Evil Shovel=Pelle diabolique +Evil Axe=Hache diabolique +Evil Sword=Épée diabolique +Evil Stick=Baton diabolique +Steel Fence=Barrière en acier +Mossy Stone Stair=Marche moussue en pierre +Inner Mossy Stone Stair= +Outer Mossy Stone Stair= +Mossy Stone Slab=Dalle moussue en pierre +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Mossy Stone Brick Stair=Marche moussue en briques de pierre +Inner Mossy Stone Brick Stair= +Outer Mossy Stone Brick Stair= +Mossy Stone Brick Slab=Dalle moussue en briques de pierre +Cobblestone Roadbed Stair= +Inner Cobblestone Roadbed Stair= +Outer Cobblestone Roadbed Stair= +Cobblestone Roadbed Slab= +Mossy Cobblestone Roadbed Stair= +Inner Mossy Cobblestone Roadbed Stair= +Outer Mossy Cobblestone Roadbed Stair= +Mossy Cobblestone Roadbed Slab= +Cement Stair=Marche en ciment +Inner Cement Stair= +Outer Cement Stair= +Cement Slab=Dalle en ciment +Pavement Stair=Marche de chaussée +Inner Pavement Stair= +Outer Pavement Stair= +Pavement Slab=Dalle de chaussée +Basalt Stair=Marche en basalte +Inner Basalt Stair= +Outer Basalt Stair= +Basalt Slab=Dalle en basalte +Pumice Stair=Marche en pierre ponce +Inner Pumice Stair= +Outer Pumice Stair= +Pumice Slab=Dalle en pierre ponce +Rainbow Block Stair=Marche en bloc Arc-en-ciel +Inner Rainbow Block Stair= +Outer Rainbow Block Stair= +Rainbow Block Slab=Dalle en bloc Arc-en-ciel + + +##### not used anymore ##### + +Cobblestone Road Bed=Ballast en pierres +Mossy Cobblestone Road Bed=Ballast moussu en pierres +Mossy Cobble Stair=Marche moussue en pierres +Mossy Cobble Slab=Dalle moussue en pierres +Cobble Roadbed Stair=Marche en ballast (pierres) +Cobble Roadbed Slab=Dalle en ballast (pierres) +Mossy Cobble Roadbed Stair=Marche moussue en ballast (pierres) +Mossy Cobble Roadbed Slab=Dalle moussue en ballast (pierres) +Cement=Ciment +Wet Cement=Mortier diff --git a/mods/gloopblocks/locale/gloopblocks.id.tr b/mods/gloopblocks/locale/gloopblocks.id.tr new file mode 100644 index 00000000..f49d9dc5 --- /dev/null +++ b/mods/gloopblocks/locale/gloopblocks.id.tr @@ -0,0 +1,73 @@ +# textdomain: gloopblocks +Gloopblocks Loaded!=Gloopblocks Dimuat! +Obsidian=Obsidian +Block of ashes=Balok Abu +Pile of ashes=Tumpukan Abu +Basalt=Basal +Pumice=Batu Apung +Diagonal Rainbow Block=Balok Pelangi Diagonal +Horizontal Rainbow Block=Balok Pelangi Horizontal +Evil Block=Balok Jahat +Pavement=Trotoar +Oerkki Block=Balok Oerkki +Mossy Stone Brick=Tembok Batu Berlumut +Mossy Stone=Batu Berlumut +Cobblestone Roadbed=Landasan Jalan Bongkahan Batu +Mossy Cobblestone Roadbed=Landasan Jalan Bongkahan Batu Berlumut +Wooden Scaffold=Perancah Kayu +Concrete sidewalk=Trotoar Beton +Rainbow Block=Balok Pelangi +Gravel=Kerikil +Glow Crystal=Kristal Bersinar +Glow Emerald=Zamrud Bersinar +Glow Mese=Mese Bersinar +Cement Pickaxe=Belencong Semen +Cement Shovel=Sekop Semen +Cement Axe=Kapak Semen +Cement Sword=Pedang Semen +Evil Pickaxe=Belencong Jahat +Evil Shovel=Sekop Jahat +Evil Axe=Kapak Jahat +Evil Sword=Pedang Jahat +Evil Stick=Tongkat Jahat +Steel Fence=Pagar Baja +Mossy Stone Stair=Tangga Batu Berlumut +Inner Mossy Stone Stair=Tangga Batu Berlumut Dalam +Outer Mossy Stone Stair=Tangga Batu Berlumut Luar +Mossy Stone Slab=Lempengan Batu Berlumut +Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut +Inner Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Luar +Mossy Cobblestone Slab=Lempengan Bongkahan Batu Berlumut +Mossy Stone Brick Stair=Tangga Tembok Batu Berlumut +Inner Mossy Stone Brick Stair=Tangga Tembok Batu Berlumut Dalam +Outer Mossy Stone Brick Stair=Tangga Tembok Batu Berlumut Luar +Mossy Stone Brick Slab=Lempengan Tembok Batu Berlumut +Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu +Inner Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu Dalam +Outer Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu Luar +Cobblestone Roadbed Slab=Lempengan Landasan Jalan Bongkahan Batu +Mossy Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu Berlumut +Inner Mossy Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Roadbed Stair=Tangga Landasan Jalan Bongkahan Batu Berlumut Luar +Mossy Cobblestone Roadbed Slab=Lempengan Landasan Jalan Bongkahan Batu Berlumut +Cement Stair=Tangga Semen +Inner Cement Stair=Tangga Semen Dalam +Outer Cement Stair=Tangga Semen Luar +Cement Slab=Lempengan Semen +Pavement Stair=Tangga Trotoar +Inner Pavement Stair=Tangga Trotoar Dalam +Outer Pavement Stair=Tangga Trotoar Luar +Pavement Slab=Lempengan Trotoar +Basalt Stair=Tangga Basal +Inner Basalt Stair=Tangga Basal Dalam +Outer Basalt Stair=Tangga Basal Luar +Basalt Slab=Lempengan Basal +Pumice Stair=Tangga Batu Apung +Inner Pumice Stair=Tangga Batu Apung Dalam +Outer Pumice Stair=Tangga Batu Apung Luar +Pumice Slab=Lempengan Batu Apung +Rainbow Block Stair=Tangga Balok Pelangi +Inner Rainbow Block Stair=Tangga Balok Pelangi Dalam +Outer Rainbow Block Stair=Tangga Balok Pelangi Luar +Rainbow Block Slab=Lempengan Balok Pelangi diff --git a/mods/gloopblocks/locale/gloopblocks.ru.tr b/mods/gloopblocks/locale/gloopblocks.ru.tr new file mode 100644 index 00000000..934a9da1 --- /dev/null +++ b/mods/gloopblocks/locale/gloopblocks.ru.tr @@ -0,0 +1,87 @@ +# textdomain: gloopblocks +Gloopblocks Loaded!=Gloopblocks загружен! +Obsidian=Обсидиан +Block of ashes= +Pile of ashes= +Basalt=Базальт +Pumice=Пемза +Diagonal Rainbow Block=Блок с радугой по диагонали +Horizontal Rainbow Block=Блок с радугой по горизонтали +Evil Block=Злой блок +Pavement=Мостовая +Oerkki Block=Блок Оеркки +Mossy Stone Brick=Кирпич из мшистого камня +Mossy Stone=Мшистый камень +Cobblestone Roadbed=Брусчатка +Mossy Cobblestone Roadbed=Мшистая брусчатка +Wooden Scaffold=Деревянные строительные леса +Concrete sidewalk= +Rainbow Block=Радужный блок +Gravel= +Glow Crystal=Светящийся хрусталь +Glow Emerald=Светящийся изумруд +Glow Mese=Светящийся камень +Cement Pickaxe=Кирка из цемента +Cement Shovel=Лопата из цемента +Cement Axe=Топор из цемента +Cement Sword=Меч из цемента +Evil Pickaxe=Кирка зла +Evil Shovel=Лопата зла +Evil Axe=Топор зла +Evil Sword=Меч зла +Evil Stick=Злая палка +Steel Fence=Стальной забор +Mossy Stone Stair=Ступенька из мшистого камня +Inner Mossy Stone Stair= +Outer Mossy Stone Stair= +Mossy Stone Slab=Плита из мшистого камня +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Mossy Stone Brick Stair=Ступенька из мшистого каменного кирпича +Inner Mossy Stone Brick Stair= +Outer Mossy Stone Brick Stair= +Mossy Stone Brick Slab=Плита из мшистого каменного кирпича +Cobblestone Roadbed Stair= +Inner Cobblestone Roadbed Stair= +Outer Cobblestone Roadbed Stair= +Cobblestone Roadbed Slab= +Mossy Cobblestone Roadbed Stair= +Inner Mossy Cobblestone Roadbed Stair= +Outer Mossy Cobblestone Roadbed Stair= +Mossy Cobblestone Roadbed Slab= +Cement Stair=Ступенька из цемента +Inner Cement Stair= +Outer Cement Stair= +Cement Slab=Плита из цемента +Pavement Stair=Ступенька из мостовой +Inner Pavement Stair= +Outer Pavement Stair= +Pavement Slab=Плита из мостовой +Basalt Stair=Базальтовая ступенька +Inner Basalt Stair= +Outer Basalt Stair= +Basalt Slab=Базальтовая плита +Pumice Stair=Ступенька из пемзы +Inner Pumice Stair= +Outer Pumice Stair= +Pumice Slab=Плита из пемзы +Rainbow Block Stair=Ступенька из радужного блока +Inner Rainbow Block Stair= +Outer Rainbow Block Stair= +Rainbow Block Slab=Плита из радужного блока + + +##### not used anymore ##### + +Cobblestone Road Bed=Брусчатка +Mossy Cobblestone Road Bed=Мшистая брусчатка +Mossy Cobble Stair=Ступенька из мшистого булыжника +Mossy Cobble Slab=Плита из мшистого булыжника +Cobble Roadbed Stair=Ступенька из брусчатки +Cobble Roadbed Slab=Плита из брусчатки +Mossy Cobble Roadbed Stair=Ступенька из мшистой брусчатки +Mossy Cobble Roadbed Slab=Плита из мшистой брусчатки +Cement=Цемент +Wet Cement=Мокрый цемент diff --git a/mods/gloopblocks/locale/ru.po b/mods/gloopblocks/locale/ru.po deleted file mode 100644 index 68cb7f8f..00000000 --- a/mods/gloopblocks/locale/ru.po +++ /dev/null @@ -1,176 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-14 06:45+0200\n" -"PO-Revision-Date: 2017-08-17 12:47+0300\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.3\n" -"Last-Translator: inpos \n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"Language: ru\n" - -msgid "Diagonal Rainbow Block" -msgstr "Блок с радугой по диагонали" - -msgid "Horizontal Rainbow Block" -msgstr "Блок с радугой по горизонтали" - -msgid "Cement" -msgstr "Цемент" - -msgid "Evil Block" -msgstr "Злой блок" - -msgid "Basalt" -msgstr "Базальт" - -msgid "Pumice" -msgstr "Пемза" - -msgid "Pavement" -msgstr "Мостовая" - -msgid "Oerkki Block" -msgstr "Блок Оеркки" - -msgid "Mossy Stone Brick" -msgstr "Кирпич из мшистого камня" - -msgid "Mossy Stone" -msgstr "Мшистый камень" - -msgid "Cobblestone Road Bed" -msgstr "Брусчатка" - -msgid "Mossy Cobblestone Road Bed" -msgstr "Мшистая брусчатка" - -msgid "Wooden Scaffold" -msgstr "Деревянные строительные леса" - -msgid "Cobblestone Roadbed" -msgstr "Брусчатка" - -msgid "Mossy Cobblestone Roadbed" -msgstr "Мшистая брусчатка" - -msgid "Rainbow Block" -msgstr "Радужный блок" - -msgid "Glow Crystal" -msgstr "Светящийся хрусталь" - -msgid "Glow Emerald" -msgstr "Светящийся изумруд" - -msgid "Glow Mese" -msgstr "Светящийся камень" - -msgid "Mossy Stone Stair" -msgstr "Ступенька из мшистого камня" - -msgid "Mossy Stone Slab" -msgstr "Плита из мшистого камня" - -msgid "Mossy Cobble Stair" -msgstr "Ступенька из мшистого булыжника" - -msgid "Mossy Cobble Slab" -msgstr "Плита из мшистого булыжника" - -msgid "Mossy Stone Brick Stair" -msgstr "Ступенька из мшистого каменного кирпича" - -msgid "Mossy Stone Brick Slab" -msgstr "Плита из мшистого каменного кирпича" - -msgid "Cobble Roadbed Stair" -msgstr "Ступенька из брусчатки" - -msgid "Cobble Roadbed Slab" -msgstr "Плита из брусчатки" - -msgid "Mossy Cobble Roadbed Stair" -msgstr "Ступенька из мшистой брусчатки" - -msgid "Mossy Cobble Roadbed Slab" -msgstr "Плита из мшистой брусчатки" - -msgid "Cement Stair" -msgstr "Ступенька из цемента" - -msgid "Cement Slab" -msgstr "Плита из цемента" - -msgid "Pavement Stair" -msgstr "Ступенька из мостовой" - -msgid "Pavement Slab" -msgstr "Плита из мостовой" - -msgid "Basalt Stair" -msgstr "Базальтовая ступенька" - -msgid "Basalt Slab" -msgstr "Базальтовая плита" - -msgid "Pumice Stair" -msgstr "Ступенька из пемзы" - -msgid "Pumice Slab" -msgstr "Плита из пемзы" - -msgid "Rainbow Block Stair" -msgstr "Ступенька из радужного блока" - -msgid "Rainbow Block Slab" -msgstr "Плита из радужного блока" - -msgid "Cement Pickaxe" -msgstr "Кирка из цемента" - -msgid "Cement Shovel" -msgstr "Лопата из цемента" - -msgid "Cement Axe" -msgstr "Топор из цемента" - -msgid "Cement Sword" -msgstr "Меч из цемента" - -msgid "Evil Pickaxe" -msgstr "Кирка зла" - -msgid "Evil Shovel" -msgstr "Лопата зла" - -msgid "Evil Axe" -msgstr "Топор зла" - -msgid "Evil Sword" -msgstr "Меч зла" - -msgid "Wet Cement" -msgstr "Мокрый цемент" - -msgid "Evil Stick" -msgstr "Злая палка" - -msgid "Obsidian" -msgstr "Обсидиан" - -msgid "Steel Fence" -msgstr "Стальной забор" - -msgid "Gloopblocks Loaded!" -msgstr "Gloopblocks загружен!" - diff --git a/mods/gloopblocks/locale/template.pot b/mods/gloopblocks/locale/template.pot deleted file mode 100644 index fbea21b8..00000000 --- a/mods/gloopblocks/locale/template.pot +++ /dev/null @@ -1,226 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-14 06:45+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Diagonal Rainbow Block" -msgstr "" - -#: init.lua -msgid "Horizontal Rainbow Block" -msgstr "" - -#: init.lua -msgid "Cement" -msgstr "" - -#: init.lua -msgid "Evil Block" -msgstr "" - -#: init.lua -msgid "Basalt" -msgstr "" - -#: init.lua -msgid "Pumice" -msgstr "" - -#: init.lua -msgid "Pavement" -msgstr "" - -#: init.lua -msgid "Oerkki Block" -msgstr "" - -#: init.lua -msgid "Mossy Stone Brick" -msgstr "" - -#: init.lua -msgid "Mossy Stone" -msgstr "" - -#: init.lua -msgid "Cobblestone Road Bed" -msgstr "" - -#: init.lua -msgid "Mossy Cobblestone Road Bed" -msgstr "" - -#: init.lua -msgid "Wooden Scaffold" -msgstr "" - -#: init.lua -msgid "Cobblestone Roadbed" -msgstr "" - -#: init.lua -msgid "Mossy Cobblestone Roadbed" -msgstr "" - -#: init.lua -msgid "Rainbow Block" -msgstr "" - -#: init.lua -msgid "Glow Crystal" -msgstr "" - -#: init.lua -msgid "Glow Emerald" -msgstr "" - -#: init.lua -msgid "Glow Mese" -msgstr "" - -#: init.lua -msgid "Mossy Stone Stair" -msgstr "" - -#: init.lua -msgid "Mossy Stone Slab" -msgstr "" - -#: init.lua -msgid "Mossy Cobble Stair" -msgstr "" - -#: init.lua -msgid "Mossy Cobble Slab" -msgstr "" - -#: init.lua -msgid "Mossy Stone Brick Stair" -msgstr "" - -#: init.lua -msgid "Mossy Stone Brick Slab" -msgstr "" - -#: init.lua -msgid "Cobble Roadbed Stair" -msgstr "" - -#: init.lua -msgid "Cobble Roadbed Slab" -msgstr "" - -#: init.lua -msgid "Mossy Cobble Roadbed Stair" -msgstr "" - -#: init.lua -msgid "Mossy Cobble Roadbed Slab" -msgstr "" - -#: init.lua -msgid "Cement Stair" -msgstr "" - -#: init.lua -msgid "Cement Slab" -msgstr "" - -#: init.lua -msgid "Pavement Stair" -msgstr "" - -#: init.lua -msgid "Pavement Slab" -msgstr "" - -#: init.lua -msgid "Basalt Stair" -msgstr "" - -#: init.lua -msgid "Basalt Slab" -msgstr "" - -#: init.lua -msgid "Pumice Stair" -msgstr "" - -#: init.lua -msgid "Pumice Slab" -msgstr "" - -#: init.lua -msgid "Rainbow Block Stair" -msgstr "" - -#: init.lua -msgid "Rainbow Block Slab" -msgstr "" - -#: init.lua -msgid "Cement Pickaxe" -msgstr "" - -#: init.lua -msgid "Cement Shovel" -msgstr "" - -#: init.lua -msgid "Cement Axe" -msgstr "" - -#: init.lua -msgid "Cement Sword" -msgstr "" - -#: init.lua -msgid "Evil Pickaxe" -msgstr "" - -#: init.lua -msgid "Evil Shovel" -msgstr "" - -#: init.lua -msgid "Evil Axe" -msgstr "" - -#: init.lua -msgid "Evil Sword" -msgstr "" - -#: init.lua -msgid "Wet Cement" -msgstr "" - -#: init.lua -msgid "Evil Stick" -msgstr "" - -#: init.lua -msgid "Obsidian" -msgstr "" - -#: init.lua -msgid "Steel Fence" -msgstr "" - -#: init.lua -msgid "Gloopblocks Loaded!" -msgstr "" diff --git a/mods/gloopblocks/locale/template.txt b/mods/gloopblocks/locale/template.txt new file mode 100644 index 00000000..367a04b7 --- /dev/null +++ b/mods/gloopblocks/locale/template.txt @@ -0,0 +1,73 @@ +# textdomain: gloopblocks +Gloopblocks Loaded!= +Obsidian= +Block of ashes= +Pile of ashes= +Basalt= +Pumice= +Diagonal Rainbow Block= +Horizontal Rainbow Block= +Evil Block= +Pavement= +Oerkki Block= +Mossy Stone Brick= +Mossy Stone= +Cobblestone Roadbed= +Mossy Cobblestone Roadbed= +Wooden Scaffold= +Concrete sidewalk= +Rainbow Block= +Gravel= +Glow Crystal= +Glow Emerald= +Glow Mese= +Cement Pickaxe= +Cement Shovel= +Cement Axe= +Cement Sword= +Evil Pickaxe= +Evil Shovel= +Evil Axe= +Evil Sword= +Evil Stick= +Steel Fence= +Mossy Stone Stair= +Inner Mossy Stone Stair= +Outer Mossy Stone Stair= +Mossy Stone Slab= +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Mossy Stone Brick Stair= +Inner Mossy Stone Brick Stair= +Outer Mossy Stone Brick Stair= +Mossy Stone Brick Slab= +Cobblestone Roadbed Stair= +Inner Cobblestone Roadbed Stair= +Outer Cobblestone Roadbed Stair= +Cobblestone Roadbed Slab= +Mossy Cobblestone Roadbed Stair= +Inner Mossy Cobblestone Roadbed Stair= +Outer Mossy Cobblestone Roadbed Stair= +Mossy Cobblestone Roadbed Slab= +Cement Stair= +Inner Cement Stair= +Outer Cement Stair= +Cement Slab= +Pavement Stair= +Inner Pavement Stair= +Outer Pavement Stair= +Pavement Slab= +Basalt Stair= +Inner Basalt Stair= +Outer Basalt Stair= +Basalt Slab= +Pumice Stair= +Inner Pumice Stair= +Outer Pumice Stair= +Pumice Slab= +Rainbow Block Stair= +Inner Rainbow Block Stair= +Outer Rainbow Block Stair= +Rainbow Block Slab= diff --git a/mods/gloopblocks/main.lua b/mods/gloopblocks/main.lua index 7db9bba3..6765fd6e 100644 --- a/mods/gloopblocks/main.lua +++ b/mods/gloopblocks/main.lua @@ -1,13 +1,13 @@ --- Load support for intllib. -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator(minetest.get_current_modname()) +-- Same as S, but will be ignored by mod translation updater +local T = S -- Nodes minetest.register_node("gloopblocks:rainbow_block_diagonal", { description = S("Diagonal Rainbow Block"), tiles = {"gloopblocks_rainbow_block.png"}, - is_ground_content = true, + is_ground_content = false, groups = {cracky=3}, sounds = default.node_sound_defaults(), }) @@ -32,7 +32,7 @@ minetest.register_node("gloopblocks:evil_block", { description = S("Evil Block"), tiles = {"gloopblocks_evil_block.png"}, light_source = 5, - is_ground_content = true, + is_ground_content = false, groups = {cracky=2}, sounds = default.node_sound_stone_defaults(), @@ -42,6 +42,7 @@ minetest.register_node("gloopblocks:basalt", { description = S("Basalt"), tiles = {"gloopblocks_basalt.png"}, groups = {cracky=2}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -49,6 +50,7 @@ minetest.register_node("gloopblocks:pumice", { description = S("Pumice"), tiles = {"gloopblocks_pumice.png"}, groups = {cracky=3}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -57,6 +59,7 @@ minetest.register_node("gloopblocks:pavement", { description = S("Pavement"), tiles = {"gloopblocks_pavement.png"}, groups = {cracky=3, oddly_breakable_by_hand=3}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -74,6 +77,7 @@ minetest.register_node("gloopblocks:oerkki_block", { "gloopblocks_oerkkiblock_front.png" }, groups = {cracky=3, oddly_breakable_by_hand=3}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), selection_box = { type = "fixed", @@ -96,6 +100,7 @@ minetest.register_node("gloopblocks:stone_brick_mossy", { description = S("Mossy Stone Brick"), tiles = {"gloopblocks_stone_brick_mossy.png"}, groups = {cracky=3, stone=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -103,21 +108,24 @@ minetest.register_node("gloopblocks:stone_mossy", { description = S("Mossy Stone"), tiles = {"gloopblocks_stone_mossy.png"}, groups = {cracky=3, stone=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), drop = "default:mossycobble" }) minetest.register_node("gloopblocks:cobble_road", { - description = S("Cobblestone Road Bed"), + description = S("Cobblestone Roadbed"), tiles = {"gloopblocks_cobble_road.png"}, groups = {cracky=3, stone=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("gloopblocks:cobble_road_mossy", { - description = S("Mossy Cobblestone Road Bed"), + description = S("Mossy Cobblestone Roadbed"), tiles = {"gloopblocks_cobble_road_mossy.png"}, groups = {cracky=3, stone=1}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -128,6 +136,7 @@ minetest.register_node("gloopblocks:scaffolding", { sunlight_propagates = true, tiles = {"gloopblocks_scaffold.png"}, groups = {choppy=3, oddly_breakable_by_hand=3}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) @@ -151,6 +160,7 @@ minetest.register_node("gloopblocks:concrete_sidewalk", { }, on_rotate = screwdriver.rotate_simple, groups = {cracky=2}, + is_ground_content = false, sounds = default.node_sound_stone_defaults(), }) @@ -175,6 +185,7 @@ if not minetest.get_modpath("usesdirt") then tiles = { dirt_brick_tex }, description = "Dirt Brick", groups = {snappy=2,choppy=1,oddly_breakable_by_hand=2}, + is_ground_content = false, }) minetest.register_node(":usesdirt:dirt_brick_ladder", { @@ -185,7 +196,7 @@ if not minetest.get_modpath("usesdirt") then wield_image = dirt_brick_ladder_tex, paramtype = "light", paramtype2 = "wallmounted", - is_ground_content = true, + is_ground_content = false, walkable = false, climbable = true, selection_box = { @@ -244,7 +255,7 @@ if not minetest.get_modpath("usesdirt") then wield_image = dirt_ladder_tex, paramtype = "light", paramtype2 = "wallmounted", - is_ground_content = true, + is_ground_content = false, walkable = false, climbable = true, selection_box = { @@ -260,7 +271,7 @@ if not minetest.get_modpath("usesdirt") then output = 'usesdirt:dirt_ladder 3', recipe = { {'usesdirt:dirt_brick', '', 'usesdirt:dirt_brick'}, - {'usesdirt:dirt_brick', 'usesdirt:dirt_brick','usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick', '','usesdirt:dirt_brick'}, {'usesdirt:dirt_brick','','usesdirt:dirt_brick'}, } }) @@ -280,8 +291,8 @@ if not minetest.get_modpath("usesdirt") then minetest.register_node(":usesdirt:dirt_cobble_stone", { tiles = { dirt_cobble_tex }, - description = "Dirt Cobble Stone", - is_ground_content = true, + description = "Dirt Cobblestone", + is_ground_content = false, groups = {cracky=3, stone=2}, }) minetest.register_craft({ @@ -294,14 +305,14 @@ if not minetest.get_modpath("usesdirt") then }) minetest.register_node(":usesdirt:dirt_cobble_stone_ladder", { - description = "Dirt Cobble Stone Ladder", + description = "Dirt Cobblestone Ladder", drawtype = "signlike", tiles = { dirt_cobble_ladder_tex }, inventory_image = dirt_cobble_ladder_tex, wield_image = dirt_cobble_ladder_tex, paramtype = "light", paramtype2 = "wallmounted", - is_ground_content = true, + is_ground_content = false, walkable = false, climbable = true, selection_box = { @@ -323,7 +334,7 @@ if not minetest.get_modpath("usesdirt") then }) default.register_fence(":usesdirt:dirt_cobble_stone_fence", { - description = "Dirt Cobble Stone Fence", + description = "Dirt Cobblestone Fence", texture = dirt_cobble_tex, inventory_image = "default_fence_overlay.png^("..dirt_cobble_tex..")^default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^("..dirt_cobble_tex..")^default_fence_overlay.png^[makealpha:255,126,126", @@ -338,7 +349,7 @@ if not minetest.get_modpath("usesdirt") then minetest.register_node(":usesdirt:dirt_stone", { tiles = { dirt_stone_tex }, description = "Dirt Stone", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, stone=2}, }) @@ -350,7 +361,7 @@ if not minetest.get_modpath("usesdirt") then wield_image = dirt_stone_ladder_tex, paramtype = "light", paramtype2 = "wallmounted", - is_ground_content = true, + is_ground_content = false, walkable = false, climbable = true, selection_box = { @@ -601,83 +612,94 @@ if minetest.get_modpath("moreblocks") then elseif minetest.get_modpath("stairs") then - --stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + -- Local function so we can apply translations, specifically for inner/outer stairs + local function my_stairs_register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds) + stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair), + sounds, false) + stairs.register_stair_inner(subname, recipeitem, groups, images, "", + sounds, false, T("Inner " .. desc_stair)) + stairs.register_stair_outer(subname, recipeitem, groups, images, "", + sounds, false, T("Outer " .. desc_stair)) + stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab), + sounds, false) + end -- stairs:xxxx_stone_mossy ; xxxx = stair or slab - stairs.register_stair_and_slab("stone_mossy", "gloopblocks:stone_mossy", + my_stairs_register_stair_and_slab("stone_mossy", "gloopblocks:stone_mossy", {cracky=3}, {"gloopblocks_stone_mossy.png"}, - S("Mossy Stone Stair"), - S("Mossy Stone Slab"), + "Mossy Stone Stair", + "Mossy Stone Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_mossycobble - stairs.register_stair_and_slab("mossycobble", "default:mossycobble", + my_stairs_register_stair_and_slab("mossycobble", "default:mossycobble", {cracky=3}, {"default_mossycobble.png"}, - S("Mossy Cobble Stair"), - S("Mossy Cobble Slab"), + "Mossy Cobblestone Stair", + "Mossy Cobblestone Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_stone_brick_mossy - stairs.register_stair_and_slab("stone_brick_mossy", "gloopblocks:stone_brick_mossy", + my_stairs_register_stair_and_slab("stone_brick_mossy", "gloopblocks:stone_brick_mossy", {cracky=3}, {"gloopblocks_stone_brick_mossy.png"}, - S("Mossy Stone Brick Stair"), - S("Mossy Stone Brick Slab"), + "Mossy Stone Brick Stair", + "Mossy Stone Brick Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_cobble_road - stairs.register_stair_and_slab("cobble_road", "gloopblocks:cobble_road", + my_stairs_register_stair_and_slab("cobble_road", "gloopblocks:cobble_road", {cracky=3}, {"gloopblocks_cobble_road.png"}, - S("Cobble Roadbed Stair"), - S("Cobble Roadbed Slab"), + "Cobblestone Roadbed Stair", + "Cobblestone Roadbed Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_cobble_road_mossy - stairs.register_stair_and_slab("cobble_road_mossy", "gloopblocks:cobble_road_mossy", + my_stairs_register_stair_and_slab("cobble_road_mossy", "gloopblocks:cobble_road_mossy", {cracky=3}, {"gloopblocks_cobble_road_mossy.png"}, - S("Mossy Cobble Roadbed Stair"), - S("Mossy Cobble Roadbed Slab"), + "Mossy Cobblestone Roadbed Stair", + "Mossy Cobblestone Roadbed Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_cement - stairs.register_stair_and_slab("cement", "gloopblocks:cement", + my_stairs_register_stair_and_slab("cement", "gloopblocks:cement", {cracky=2}, {"basic_materials_cement_block.png"}, - S("Cement Stair"), - S("Cement Slab"), + "Cement Stair", + "Cement Slab", default.node_sound_stone_defaults()) -- stairs:xxxx_pavement - stairs.register_stair_and_slab("pavement", "gloopblocks:pavement", + my_stairs_register_stair_and_slab("pavement", "gloopblocks:pavement", {cracky=3, oddly_breakable_by_hand=3}, {"gloopblocks_pavement.png"}, - S("Pavement Stair"), - S("Pavement Slab"), + "Pavement Stair", + "Pavement Slab", default.node_sound_stone_defaults()) - stairs.register_stair_and_slab("basalt", "gloopblocks:basalt", + my_stairs_register_stair_and_slab("basalt", "gloopblocks:basalt", {cracky=2}, {"gloopblocks_basalt.png"}, - S("Basalt Stair"), - S("Basalt Slab"), + "Basalt Stair", + "Basalt Slab", default.node_sound_stone_defaults()) - stairs.register_stair_and_slab("pumice", "gloopblocks:pumice", + my_stairs_register_stair_and_slab("pumice", "gloopblocks:pumice", {cracky=3}, {"gloopblocks_pumice.png"}, - S("Pumice Stair"), - S("Pumice Slab"), + "Pumice Stair", + "Pumice Slab", default.node_sound_stone_defaults()) - stairs.register_stair_and_slab("rainbow_block", "gloopblocks:rainbow_block", + my_stairs_register_stair_and_slab("rainbow_block", "gloopblocks:rainbow_block", {cracky=3}, {"gloopblocks_rainbow_block.png"}, - S("Rainbow Block Stair"), - S("Rainbow Block Slab"), + "Rainbow Block Stair", + "Rainbow Block Slab", default.node_sound_defaults()) if minetest.setting_getbool("gloopblocks_mossy_conversion") ~= false then @@ -862,3 +884,51 @@ minetest.register_node("gloopblocks:fence_steel", { minetest.register_alias("nyancat:nyancat_rainbow", "gloopblocks:rainbow_block_horizontal") minetest.register_alias("default:nyancat_rainbow", "gloopblocks:rainbow_block_horizontal") + +-- These are dummy calls to S() for the translation updater script. +-- To update this list, add this code to my_stairs_register_stair_and_slab function: +-- for _, x in ipairs({"", "Inner ", "Outer "}) do print(("S(%q)"):format(x .. desc_stair)) end +-- print(("S(%q)"):format(desc_slab)) + +--[[ +S("Mossy Stone Stair") +S("Inner Mossy Stone Stair") +S("Outer Mossy Stone Stair") +S("Mossy Stone Slab") +S("Mossy Cobblestone Stair") +S("Inner Mossy Cobblestone Stair") +S("Outer Mossy Cobblestone Stair") +S("Mossy Cobblestone Slab") +S("Mossy Stone Brick Stair") +S("Inner Mossy Stone Brick Stair") +S("Outer Mossy Stone Brick Stair") +S("Mossy Stone Brick Slab") +S("Cobblestone Roadbed Stair") +S("Inner Cobblestone Roadbed Stair") +S("Outer Cobblestone Roadbed Stair") +S("Cobblestone Roadbed Slab") +S("Mossy Cobblestone Roadbed Stair") +S("Inner Mossy Cobblestone Roadbed Stair") +S("Outer Mossy Cobblestone Roadbed Stair") +S("Mossy Cobblestone Roadbed Slab") +S("Cement Stair") +S("Inner Cement Stair") +S("Outer Cement Stair") +S("Cement Slab") +S("Pavement Stair") +S("Inner Pavement Stair") +S("Outer Pavement Stair") +S("Pavement Slab") +S("Basalt Stair") +S("Inner Basalt Stair") +S("Outer Basalt Stair") +S("Basalt Slab") +S("Pumice Stair") +S("Inner Pumice Stair") +S("Outer Pumice Stair") +S("Pumice Slab") +S("Rainbow Block Stair") +S("Inner Rainbow Block Stair") +S("Outer Rainbow Block Stair") +S("Rainbow Block Slab") +--]] diff --git a/mods/gloopblocks/mod.conf b/mods/gloopblocks/mod.conf index 53e09763..e3982582 100644 --- a/mods/gloopblocks/mod.conf +++ b/mods/gloopblocks/mod.conf @@ -1,4 +1,4 @@ name = gloopblocks min_minetest_version = 5.2.0 depends = default, basic_materials -optional_depends = screwdriver, stairs, wool, moreblocks, glooptest, gloopores, intllib, xdecor, caverealms, technic, nyancat, usesdirt, worldedit, signs_lib, bakedclay, farming, bushes_classic, dryplants, bedrock, cottages +optional_depends = screwdriver, stairs, wool, moreblocks, glooptest, gloopores, xdecor, caverealms, technic, nyancat, usesdirt, worldedit, signs_lib, bakedclay, farming, bushes_classic, dryplants, bedrock, cottages diff --git a/mods/home_workshop_modpack/.luacheckrc b/mods/home_workshop_modpack/.luacheckrc index 8ceb8c3d..c2cef01c 100644 --- a/mods/home_workshop_modpack/.luacheckrc +++ b/mods/home_workshop_modpack/.luacheckrc @@ -21,5 +21,5 @@ read_globals = { "vector", "ItemStack", "dump", "DIR_DELIM", "VoxelArea", "Settings", "PcgRandom", "VoxelManip", "PseudoRandom", --mod produced - "default", "screwdriver", "unifieddyes", "computers", + "default", "screwdriver", "unifieddyes", "computers", "farming", "xcompat", } \ No newline at end of file diff --git a/mods/home_workshop_modpack/computers/computers.lua b/mods/home_workshop_modpack/computers/computers.lua index 6596d776..2364c80a 100644 --- a/mods/home_workshop_modpack/computers/computers.lua +++ b/mods/home_workshop_modpack/computers/computers.lua @@ -21,8 +21,10 @@ minetest.register_node("computers:vanio", { tiles = {"computers_laptop.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", light_source = 4, groups = {snappy=3}, + is_ground_content = false, walkable = false, selection_box = { type = "fixed", @@ -41,7 +43,9 @@ minetest.register_node("computers:vanio_off", { tiles = {"computers_laptop.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=3, not_in_creative_inventory=1}, + is_ground_content = false, walkable = false, selection_box = { type = "fixed", @@ -79,8 +83,9 @@ minetest.register_node("computers:piepad", { light_source = 8, walkable = false, groups = {oddly_breakable_by_hand=2}, + is_ground_content = false, selection_box = {type = "wallmounted"}, - sounds = default and default.node_sound_wood_defaults() or nil + sounds = xcompat.sounds.node_sound_wood_defaults() }) -- Commodore 64 lookalike @@ -123,6 +128,7 @@ minetest.register_node("computers:monitor", { paramtype2 = "facedir", walkable = false, groups = {snappy=3}, + is_ground_content = false, selection_box = mo_sbox, on_rightclick = function(pos, node, clicker, itemstack) node.name = "computers:monitor_on" @@ -145,6 +151,7 @@ minetest.register_node("computers:monitor_on", { light_source = 9, walkable = false, groups = {snappy=3, not_in_creative_inventory=1}, + is_ground_content = false, selection_box = mo_sbox, drop = "computers:monitor", on_rightclick = function(pos, node, clicker, itemstack) @@ -171,9 +178,11 @@ minetest.register_node("computers:router", { }, --"computers_router_f.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", walkable = false, groups = {snappy=3}, - sound = default and default.node_sound_wood_defaults() or nil, + is_ground_content = false, + sound = xcompat.sounds.node_sound_wood_defaults(), drawtype = "nodebox", node_box = { type = "fixed", @@ -201,7 +210,8 @@ minetest.register_node("computers:tower", { paramtype = "light", paramtype2 = "facedir", groups = {snappy=3}, - sound = default and default.node_sound_wood_defaults() or nil, + is_ground_content = false, + sound = xcompat.sounds.node_sound_wood_defaults(), selection_box = pct_cbox, collision_box = pct_cbox }) @@ -221,7 +231,9 @@ minetest.register_node("computers:server", { inventory_image = "computers_server_inv.png", paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=3}, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.25, 0.5, 1.125, 0.4375} @@ -230,7 +242,7 @@ minetest.register_node("computers:server", { type = "fixed", fixed = {-0.5, -0.5, -0.25, 0.5, 1.125, 0.4375} }, - sounds = default and default.node_sound_wood_defaults() or nil, + sounds = xcompat.sounds.node_sound_wood_defaults(), on_rightclick = function(pos, node, clicker, itemstack) node.name = "computers:server_on" minetest.set_node(pos, node) @@ -260,7 +272,9 @@ minetest.register_node("computers:server_on", { inventory_image = "computers_server_inv.png", paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=3,not_in_creative_inventory=1}, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.25, 0.5, 1.125, 0.4375} @@ -269,7 +283,7 @@ minetest.register_node("computers:server_on", { type = "fixed", fixed = {-0.5, -0.5, -0.25, 0.5, 1.125, 0.4375} }, - sounds = default and default.node_sound_wood_defaults() or nil, + sounds = xcompat.sounds.node_sound_wood_defaults(), drop = 'computers:server', on_rightclick = function(pos, node, clicker, itemstack) node.name = "computers:server" @@ -287,9 +301,11 @@ minetest.register_node("computers:printer", { "computers_printer_r.png","computers_printer_b.png","computers_printer_f.png"}, paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", walkable = true, groups = {snappy=3}, - sound = default and default.node_sound_wood_defaults() or nil, + is_ground_content = false, + sound = xcompat.sounds.node_sound_wood_defaults(), drawtype = "nodebox", node_box = { type = "fixed", diff --git a/mods/home_workshop_modpack/computers/gaming.lua b/mods/home_workshop_modpack/computers/gaming.lua index 9fc16751..931df3c9 100644 --- a/mods/home_workshop_modpack/computers/gaming.lua +++ b/mods/home_workshop_modpack/computers/gaming.lua @@ -313,6 +313,7 @@ minetest.register_node("computers:tetris_arcade", { paramtype = "light", paramtype2 = "facedir", groups = {snappy=3}, + is_ground_content = false, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, selection_box = { type = "fixed", diff --git a/mods/home_workshop_modpack/computers/init.lua b/mods/home_workshop_modpack/computers/init.lua index e3cc6d11..057ff063 100644 --- a/mods/home_workshop_modpack/computers/init.lua +++ b/mods/home_workshop_modpack/computers/init.lua @@ -11,9 +11,11 @@ computers.register = function (name, def) drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", description = cdef.description, inventory_image = cdef.inventory_image, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, tiles = { TEXPFX.."tp.png", TEXPFX.."bt.png", @@ -37,7 +39,9 @@ computers.register = function (name, def) drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + is_ground_content = false, tiles = { (TEXPFX.."tp"..(cdef.tiles_off.top and "_off" or "")..".png"), (TEXPFX.."bt"..(cdef.tiles_off.bottom and "_off" or "")..".png"), @@ -96,6 +100,6 @@ dofile(MODPATH.."/computers.lua") dofile(MODPATH.."/gaming.lua") dofile(MODPATH.."/aliases.lua") -if minetest.get_modpath("default") and minetest.get_modpath("basic_materials") then +if minetest.get_modpath("basic_materials") then dofile(MODPATH.."/recipes.lua") -end \ No newline at end of file +end diff --git a/mods/home_workshop_modpack/computers/locale/computers.de.tr b/mods/home_workshop_modpack/computers/locale/computers.de.tr index 0d0485cf..dedeb252 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.de.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.de.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128=Admiral 128 +SheFriendSOO=Freundin S00 +Pony Vanio=Pony Oiva +SX Specter=Z Inspektor +Snapple Piepad=Apfel-Ei-Pat Admiral64=Admiral 64 -Computer Tower=Computerturm -HUEG Box=YBOX +Admiral128=Admiral 128 Monitor and keyboard=Bildschirm und Tastatur -Nientiendo Wee=Tinnendo iiW +WIFI Router=WiFi-Router +Computer Tower=Computerturm +Rack Server=Serverschrank Not enough vertical space to place a server!=Es gibt nicht genug vertikalen Platz, um einen Server zu platzieren! +Printer-Scanner Combo=Multifunktionsdrucker Pony SlayStation=Pony Slaystation Pony SlayStation 2=Pony Slaystation 2 -Pony Vanio=Pony Oiva -Rack Server=Serverschrank -SX Specter=Z Inspektor -SheFriendSOO=Freundin S00 -Snapple Piepad=Apfel-Ei-Pat -WIFI Router=WiFi-Router -Printer-Scanner Combo=Multifunktionsdrucker - -### tetris.lua ### - +Nientiendo Wee=Tinnendo iiW +HUEG Box=YBOX L=L +R=R New Game=Neues Spiel Next...=Nächster… -No room for place the Arcade!=Kein Platz, um den Arkadeautomaten zu platzieren! -R=R Score: =Punktzahl: Tetris Arcade=Tetris-Arkadeautomat +No room for place the Arcade!=Kein Platz, um den Arkadeautomaten zu platzieren! diff --git a/mods/home_workshop_modpack/computers/locale/computers.es.tr b/mods/home_workshop_modpack/computers/locale/computers.es.tr index f0d5a4d4..b419d760 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.es.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.es.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Torre de ordenador -HUEG Box= +Admiral128= Monitor and keyboard=Monitor y teclado -Nientiendo Wee= +WIFI Router=Enrutador WIFI +Computer Tower=Torre de ordenador +Rack Server=Servidor en rack Not enough vertical space to place a server!=¡No hay suficiente espacio para colocar un servidor! +Printer-Scanner Combo=Impresora y escáner combinados Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Servidor en rack -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=Enrutador WIFI -Printer-Scanner Combo=Impresora y escáner combinados - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=Juego Nuevo Next...= -No room for place the Arcade!=¡No hay lugar para colocar el arcade! -R= Score: = Tetris Arcade=Arcade Tetris +No room for place the Arcade!=¡No hay lugar para colocar el arcade! diff --git a/mods/home_workshop_modpack/computers/locale/computers.fr.tr b/mods/home_workshop_modpack/computers/locale/computers.fr.tr index 91784b49..91e2b6b0 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.fr.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.fr.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Ordinateur (tour) -HUEG Box= +Admiral128= Monitor and keyboard=Écran et clavier -Nientiendo Wee= +WIFI Router=Routeur WiFi +Computer Tower=Ordinateur (tour) +Rack Server=Serveur en rack Not enough vertical space to place a server!=Pas assez d'espace vertical pour placer un serveur ! +Printer-Scanner Combo=Imprimante multi-fonction Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Serveur en rack -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=Routeur WiFi -Printer-Scanner Combo=Imprimante multi-fonction - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L=G +R=D New Game=Nouveau Jeu Next...=Suivant… -No room for place the Arcade!=Pas assez de place pour placer la borne d'arcade ! -R=D Score: =Score : Tetris Arcade=Borne Tetris +No room for place the Arcade!=Pas assez de place pour placer la borne d'arcade ! diff --git a/mods/home_workshop_modpack/computers/locale/computers.it.tr b/mods/home_workshop_modpack/computers/locale/computers.it.tr index 0a639cbb..fc34243e 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.it.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.it.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower= -HUEG Box= +Admiral128= Monitor and keyboard= -Nientiendo Wee= +WIFI Router= +Computer Tower= +Rack Server= Not enough vertical space to place a server!=Non c'è abbastanza spazio verticale per mettere un frigorifero! +Printer-Scanner Combo= Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server= -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router= -Printer-Scanner Combo= - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game= Next...= -No room for place the Arcade!= -R= Score: = Tetris Arcade= +No room for place the Arcade!= diff --git a/mods/home_workshop_modpack/computers/locale/computers.ms.tr b/mods/home_workshop_modpack/computers/locale/computers.ms.tr index e33788e5..b1ec33d5 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.ms.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.ms.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Sistem Unit -HUEG Box= +Admiral128= Monitor and keyboard=Monitor dan Papan Kekunci -Nientiendo Wee= +WIFI Router=Penghala WIFI +Computer Tower=Sistem Unit +Rack Server=Rak Pelayan Not enough vertical space to place a server!=Tidak cukup ruang menegak untuk letak rak pelayan! +Printer-Scanner Combo=Pencetak Semua Dalam Satu Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Rak Pelayan -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=Penghala WIFI -Printer-Scanner Combo=Pencetak Semua Dalam Satu - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=Main Baru Next...=Seterusnya... -No room for place the Arcade!=Tiada ruang untuk letak Arked! -R= Score: =Markah: Tetris Arcade=Arked Tetris +No room for place the Arcade!=Tiada ruang untuk letak Arked! diff --git a/mods/home_workshop_modpack/computers/locale/computers.pt.tr b/mods/home_workshop_modpack/computers/locale/computers.pt.tr index caad3ceb..1b74ea65 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.pt.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.pt.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Gabinete do Computador -HUEG Box= +Admiral128= Monitor and keyboard=Tela e teclado -Nientiendo Wee= +WIFI Router=Roteador WIFI +Computer Tower=Gabinete do Computador +Rack Server=Rack para Servidor Not enough vertical space to place a server!=Sem espaço vertical suficiente para colocar um servidor. +Printer-Scanner Combo=Tudo em Um Impressora-Scaner Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Rack para Servidor -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=Roteador WIFI -Printer-Scanner Combo=Tudo em Um Impressora-Scaner - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=Novo Jogo Next...= -No room for place the Arcade!=Sem espaço para colocar o Fliperama! -R= Score: = Tetris Arcade=Fliperama Tetris +No room for place the Arcade!=Sem espaço para colocar o Fliperama! diff --git a/mods/home_workshop_modpack/computers/locale/computers.pt_BR.tr b/mods/home_workshop_modpack/computers/locale/computers.pt_BR.tr index caad3ceb..1b74ea65 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.pt_BR.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.pt_BR.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Gabinete do Computador -HUEG Box= +Admiral128= Monitor and keyboard=Tela e teclado -Nientiendo Wee= +WIFI Router=Roteador WIFI +Computer Tower=Gabinete do Computador +Rack Server=Rack para Servidor Not enough vertical space to place a server!=Sem espaço vertical suficiente para colocar um servidor. +Printer-Scanner Combo=Tudo em Um Impressora-Scaner Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Rack para Servidor -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=Roteador WIFI -Printer-Scanner Combo=Tudo em Um Impressora-Scaner - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=Novo Jogo Next...= -No room for place the Arcade!=Sem espaço para colocar o Fliperama! -R= Score: = Tetris Arcade=Fliperama Tetris +No room for place the Arcade!=Sem espaço para colocar o Fliperama! diff --git a/mods/home_workshop_modpack/computers/locale/computers.ru.tr b/mods/home_workshop_modpack/computers/locale/computers.ru.tr index a5cca85b..9234a91d 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.ru.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.ru.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=Системный блок -HUEG Box= +Admiral128= Monitor and keyboard=Монитор и клавиатура -Nientiendo Wee= +WIFI Router=WIFI-роутер +Computer Tower=Системный блок +Rack Server=Стоечный сервер Not enough vertical space to place a server!=Недостаточно вертикального пространства для размещения сервера! +Printer-Scanner Combo=МФУ Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=Стоечный сервер -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=WIFI-роутер -Printer-Scanner Combo=МФУ - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=Новая игра Next...=Далее... -No room for place the Arcade!=Недостаточно места для размещения игрового автомата! -R= Score: =Счёт: Tetris Arcade=Игровой автомат Тетрис +No room for place the Arcade!=Недостаточно места для размещения игрового автомата! diff --git a/mods/home_workshop_modpack/computers/locale/computers.zh_CN.tr b/mods/home_workshop_modpack/computers/locale/computers.zh_CN.tr index b4c67294..2916db2b 100644 --- a/mods/home_workshop_modpack/computers/locale/computers.zh_CN.tr +++ b/mods/home_workshop_modpack/computers/locale/computers.zh_CN.tr @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower=计算机箱 -HUEG Box= +Admiral128= Monitor and keyboard=显示器和键盘 -Nientiendo Wee= +WIFI Router=无线路由器 +Computer Tower=计算机箱 +Rack Server=机架式服务器 Not enough vertical space to place a server!=高度不足,无法放置服务器! +Printer-Scanner Combo=打印扫描一体机 Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server=机架式服务器 -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router=无线路由器 -Printer-Scanner Combo=打印扫描一体机 - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game=新游戏 Next...=下一个。。。 -No room for place the Arcade!=没有地方放游戏机! -R= Score: =分数: Tetris Arcade=俄罗斯方块游戏机 +No room for place the Arcade!=没有地方放游戏机! diff --git a/mods/home_workshop_modpack/computers/locale/template.txt b/mods/home_workshop_modpack/computers/locale/template.txt index ce997f61..d542071f 100644 --- a/mods/home_workshop_modpack/computers/locale/template.txt +++ b/mods/home_workshop_modpack/computers/locale/template.txt @@ -1,31 +1,24 @@ # textdomain: computers - - -### computers.lua ### - -Admiral128= +SheFriendSOO= +Pony Vanio= +SX Specter= +Snapple Piepad= Admiral64= -Computer Tower= -HUEG Box= +Admiral128= Monitor and keyboard= -Nientiendo Wee= +WIFI Router= +Computer Tower= +Rack Server= Not enough vertical space to place a server!= +Printer-Scanner Combo= Pony SlayStation= Pony SlayStation 2= -Pony Vanio= -Rack Server= -SX Specter= -SheFriendSOO= -Snapple Piepad= -WIFI Router= -Printer-Scanner Combo= - -### tetris.lua ### - +Nientiendo Wee= +HUEG Box= L= +R= New Game= Next...= -No room for place the Arcade!= -R= Score: = Tetris Arcade= +No room for place the Arcade!= diff --git a/mods/home_workshop_modpack/computers/mod.conf b/mods/home_workshop_modpack/computers/mod.conf index 77e5d973..368b2a5f 100644 --- a/mods/home_workshop_modpack/computers/mod.conf +++ b/mods/home_workshop_modpack/computers/mod.conf @@ -1,2 +1,3 @@ name = computers +depends = xcompat optional_depends = screwdriver, default, basic_materials diff --git a/mods/home_workshop_modpack/computers/recipes.lua b/mods/home_workshop_modpack/computers/recipes.lua index 75eafb0c..f6499b12 100644 --- a/mods/home_workshop_modpack/computers/recipes.lua +++ b/mods/home_workshop_modpack/computers/recipes.lua @@ -1,10 +1,11 @@ -- Copyright (C) 2012-2013 Diego Martínez +local materials = xcompat.materials minetest.register_craft({ output = "computers:shefriendSOO", recipe = { { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:glass", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", materials.glass, "basic_materials:plastic_sheet" }, { "basic_materials:plastic_sheet", "group:wood", "basic_materials:plastic_sheet" } } }) @@ -21,7 +22,7 @@ minetest.register_craft({ output = "computers:vanio", recipe = { { "basic_materials:plastic_sheet", "", "" }, - { "default:glass", "", "" }, + { materials.glass, "", "" }, { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } } }) @@ -39,7 +40,7 @@ minetest.register_craft({ output = "computers:slaystation2", recipe = { { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:steel_ingot", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.steel_ingot, "basic_materials:plastic_sheet" } } }) @@ -55,7 +56,7 @@ minetest.register_craft({ output = "computers:admiral128", recipe = { { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + { materials.steel_ingot, materials.steel_ingot, materials.steel_ingot } } }) @@ -63,7 +64,7 @@ minetest.register_craft({ output = "computers:wee", recipe = { { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:copper_ingot", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.copper_ingot, "basic_materials:plastic_sheet" } } }) @@ -71,7 +72,7 @@ minetest.register_craft({ output = "computers:piepad", recipe = { { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:glass", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.glass, "basic_materials:plastic_sheet" } } }) @@ -80,45 +81,45 @@ minetest.register_craft({ minetest.register_craft({ output = "computers:monitor", recipe = { - { "basic_materials:plastic_sheet", "default:glass","" }, - { "basic_materials:plastic_sheet", "default:glass","" }, - { "basic_materials:plastic_sheet", "default:mese_crystal_fragment", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.glass,"" }, + { "basic_materials:plastic_sheet", materials.glass,"" }, + { "basic_materials:plastic_sheet", materials.mese_crystal_fragment, "basic_materials:plastic_sheet" } } }) minetest.register_craft({ output = "computers:router", recipe = { - { "default:steel_ingot","","" }, - { "default:steel_ingot" ,"basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "default:mese_crystal_fragment","basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } + { materials.steel_ingot,"","" }, + { materials.steel_ingot ,"basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { materials.mese_crystal_fragment,"basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } } }) minetest.register_craft({ output = "computers:tower", recipe = { - { "basic_materials:plastic_sheet", "default:steel_ingot", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:mese_crystal", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:steel_ingot", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.steel_ingot, "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", materials.mese_crystal, "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", materials.steel_ingot, "basic_materials:plastic_sheet" } } }) minetest.register_craft({ output = "computers:printer", recipe = { - { "basic_materials:plastic_sheet", "default:steel_ingot","" }, - { "basic_materials:plastic_sheet", "default:mese_crystal", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:coal_lump", "basic_materials:plastic_sheet" } + { "basic_materials:plastic_sheet", materials.steel_ingot,"" }, + { "basic_materials:plastic_sheet", materials.mese_crystal, "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", materials.coal_lump, "basic_materials:plastic_sheet" } } }) minetest.register_craft({ output = "computers:printer", recipe = { - { "basic_materials:plastic_sheet", "default:steel_ingot","" }, - { "basic_materials:plastic_sheet", "default:mese_crystal", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "dye:black", "basic_materials:plastic_sheet", } + { "basic_materials:plastic_sheet", materials.steel_ingot,"" }, + { "basic_materials:plastic_sheet", materials.mese_crystal, "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", materials.dye_black, "basic_materials:plastic_sheet", } } }) @@ -135,7 +136,7 @@ minetest.register_craft({ output = "computers:tetris_arcade", recipe = { { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet", }, - { "dye:black", "default:glass", "dye:black" }, + { materials.dye_black, materials.glass, materials.dye_black }, { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet" } } }) diff --git a/mods/home_workshop_modpack/home_vending_machines/api.lua b/mods/home_workshop_modpack/home_vending_machines/api.lua index ccad0bf7..278c42f0 100644 --- a/mods/home_workshop_modpack/home_vending_machines/api.lua +++ b/mods/home_workshop_modpack/home_vending_machines/api.lua @@ -12,7 +12,8 @@ local function reg_simple(name, def) tiles = def.tiles, paramtype = "light", paramtype2 = "facedir", - groups = def.groups or {snappy=3}, + groups = def.groups or {snappy=3, dig_tree=2}, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5} @@ -28,6 +29,7 @@ local function reg_simple(name, def) end end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not itemstack then return end local pname = clicker:get_player_name() local iname = itemstack:get_name() local dpos = vector.add((vector.multiply(minetest.facedir_to_dir(node.param2), -1)), pos) @@ -56,4 +58,4 @@ function home_vending_machines.register_machine(type, name, def) reg_simple(name, def) end --TODO: add more complex machine type with formspec and selections -end \ No newline at end of file +end diff --git a/mods/home_workshop_modpack/home_vending_machines/crafts.lua b/mods/home_workshop_modpack/home_vending_machines/crafts.lua new file mode 100644 index 00000000..c044e5fe --- /dev/null +++ b/mods/home_workshop_modpack/home_vending_machines/crafts.lua @@ -0,0 +1,26 @@ +local materials = xcompat.materials + +minetest.register_craft({ + output = "home_workshop_misc:soda_machine", + recipe = { + {materials.steel_ingot, materials.steel_ingot, materials.steel_ingot}, + {materials.steel_ingot, materials.dye_red, materials.steel_ingot}, + {materials.steel_ingot, materials.copper_block, materials.steel_ingot}, + }, +}) +minetest.register_craft({ + output = "home_vending_machines:drink_machine", + recipe = { + {materials.steel_ingot, "group:vessel", materials.steel_ingot}, + {materials.steel_ingot, materials.steel_ingot, materials.steel_ingot}, + {materials.steel_ingot, materials.copper_block, materials.steel_ingot}, + }, +}) +minetest.register_craft({ + output = "home_vending_machines:sweet_machine", + recipe = { + {materials.steel_ingot, "group:food_sugar", materials.steel_ingot}, + {materials.steel_ingot, materials.steel_ingot, materials.steel_ingot}, + {materials.steel_ingot, materials.copper_block, materials.steel_ingot}, + }, +}) \ No newline at end of file diff --git a/mods/home_workshop_modpack/home_vending_machines/init.lua b/mods/home_workshop_modpack/home_vending_machines/init.lua index cf44cf69..ca9fe6df 100644 --- a/mods/home_workshop_modpack/home_vending_machines/init.lua +++ b/mods/home_workshop_modpack/home_vending_machines/init.lua @@ -4,5 +4,6 @@ home_vending_machines = {} dofile(modpath .. "/api.lua") dofile(modpath .. "/machines.lua") dofile(modpath .. "/items.lua") +dofile(modpath .. "/crafts.lua") home_vending_machines.init = true \ No newline at end of file diff --git a/mods/home_workshop_modpack/home_vending_machines/mod.conf b/mods/home_workshop_modpack/home_vending_machines/mod.conf index 6ca3f1a3..e88c4405 100644 --- a/mods/home_workshop_modpack/home_vending_machines/mod.conf +++ b/mods/home_workshop_modpack/home_vending_machines/mod.conf @@ -1 +1,3 @@ -optional_depends = screwdriver \ No newline at end of file +name = home_vending_machines +depends = xcompat +optional_depends = screwdriver, default, dye, vessels, farming \ No newline at end of file diff --git a/mods/home_workshop_modpack/home_workshop_machines/init.lua b/mods/home_workshop_modpack/home_workshop_machines/init.lua index 3bcab6d7..d89c2f23 100644 --- a/mods/home_workshop_modpack/home_workshop_machines/init.lua +++ b/mods/home_workshop_modpack/home_workshop_machines/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("home_workshop_machines") +local materials = xcompat.materials -- "bedflinger" style 3D Printer (Prusa i3 or equivalent) @@ -16,8 +17,9 @@ minetest.register_node("home_workshop_machines:3dprinter_bedflinger", { }, paramtype = "light", walkable = true, - groups = {snappy=3, ud_param2_colorable = 1}, - sound = default and default.node_sound_wood_defaults() or nil, + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2}, + is_ground_content = false, + sound = xcompat.sounds.node_sound_wood_defaults(), drawtype = "mesh", mesh = "home_workshop_machines_3dprinter_bedflinger.obj", paramtype2 = "colorwallmounted", @@ -46,8 +48,9 @@ minetest.register_node("home_workshop_machines:3dprinter_corexy", { }, paramtype = "light", walkable = true, - groups = {snappy=3, ud_param2_colorable = 1}, - sound = default and default.node_sound_wood_defaults() or nil, + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2}, + is_ground_content = false, + sound = xcompat.sounds.node_sound_wood_defaults(), drawtype = "mesh", mesh = "home_workshop_machines_3dprinter_corexy.obj", paramtype2 = "colorwallmounted", @@ -61,6 +64,26 @@ minetest.register_node("home_workshop_machines:3dprinter_corexy", { on_rotate = unifieddyes.fix_after_screwdriver_nsew, }) +if minetest.get_modpath("basic_materials") then + minetest.register_craft({ + output = "home_workshop_machines:3dprinter_bedflinger", + recipe = { + {"basic_materials:plastic_sheet", materials.dye_white, "basic_materials:plastic_sheet"}, + {"basic_materials:motor", "basic_materials:heating_element", "basic_materials:motor"}, + {materials.steel_ingot, materials.steel_ingot, materials.steel_ingot}, + }, + }) + + minetest.register_craft({ + output = "home_workshop_machines:3dprinter_corexy", + recipe = { + {materials.steel_ingot, "basic_materials:motor", "basic_materials:plastic_sheet"}, + {materials.glass, "basic_materials:heating_element", materials.glass}, + {materials.steel_ingot, "basic_materials:motor", materials.steel_ingot}, + }, + }) +end + minetest.register_alias("computer:3dprinter_bedflinger", "home_workshop_machines:3dprinter_bedflinger") minetest.register_alias("computers:3dprinter_bedflinger", "home_workshop_machines:3dprinter_bedflinger") minetest.register_alias("computer:3dprinter_corexy", "home_workshop_machines:3dprinter_corexy") diff --git a/mods/home_workshop_modpack/home_workshop_machines/locale/home_workshop_machines.de.tr b/mods/home_workshop_modpack/home_workshop_machines/locale/home_workshop_machines.de.tr index 11ac392e..60a2f0a0 100644 --- a/mods/home_workshop_modpack/home_workshop_machines/locale/home_workshop_machines.de.tr +++ b/mods/home_workshop_modpack/home_workshop_machines/locale/home_workshop_machines.de.tr @@ -1,6 +1,3 @@ # textdomain: home_workshop_machines - -### init.lua ### - 3D Printer ("bedflinger" design)=3D Drucker ("Bettschubser") 3D Printer (CoreXY design)= diff --git a/mods/home_workshop_modpack/home_workshop_machines/locale/template.txt b/mods/home_workshop_modpack/home_workshop_machines/locale/template.txt index cbf2dbf0..a44ce9d4 100644 --- a/mods/home_workshop_modpack/home_workshop_machines/locale/template.txt +++ b/mods/home_workshop_modpack/home_workshop_machines/locale/template.txt @@ -1,6 +1,3 @@ # textdomain: home_workshop_machines - -### init.lua ### - 3D Printer ("bedflinger" design)= 3D Printer (CoreXY design)= diff --git a/mods/home_workshop_modpack/home_workshop_machines/mod.conf b/mods/home_workshop_modpack/home_workshop_machines/mod.conf index 2bcc916c..0985393c 100644 --- a/mods/home_workshop_modpack/home_workshop_machines/mod.conf +++ b/mods/home_workshop_modpack/home_workshop_machines/mod.conf @@ -1,4 +1,3 @@ name = home_workshop_machines -depends = unifieddyes -optional_depends = default -optional_depends = screwdriver +depends = unifieddyes, xcompat +optional_depends = default, screwdriver, dye, basic_materials diff --git a/mods/home_workshop_modpack/home_workshop_misc/crafts.lua b/mods/home_workshop_modpack/home_workshop_misc/crafts.lua index 8e6523b0..743dcb7c 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/crafts.lua +++ b/mods/home_workshop_modpack/home_workshop_misc/crafts.lua @@ -1,26 +1,19 @@ +local materials = xcompat.materials + minetest.register_craft({ output = "home_workshop_misc:tool_cabinet", recipe = { - { "basic_materials:motor", "default:axe_steel", "default:pick_steel" }, - { "default:steel_ingot", "home_workshop_misc:drawer_small", "default:steel_ingot" }, - { "default:steel_ingot", "home_workshop_misc:drawer_small", "default:steel_ingot" } + { "basic_materials:motor", materials.axe_steel, materials.pick_steel }, + { materials.steel_ingot, "home_workshop_misc:drawer_small", materials.steel_ingot }, + { materials.steel_ingot, "home_workshop_misc:drawer_small", materials.steel_ingot } }, }) minetest.register_craft({ output = "home_workshop_misc:beer_tap", recipe = { - { "group:stick", "default:steel_ingot", "group:stick" }, - { "basic_materials:steel_bar", "default:steel_ingot", "basic_materials:steel_bar" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + { "group:stick", materials.steel_ingot, "group:stick" }, + { "basic_materials:steel_bar", materials.steel_ingot, "basic_materials:steel_bar" }, + { materials.steel_ingot, materials.steel_ingot, materials.steel_ingot } }, -}) - -minetest.register_craft({ - output = "homedecor:soda_machine", - recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "dye:red", "default:steel_ingot"}, - {"default:steel_ingot", "default:copperblock", "default:steel_ingot"}, - }, -}) +}) \ No newline at end of file diff --git a/mods/home_workshop_modpack/home_workshop_misc/init.lua b/mods/home_workshop_modpack/home_workshop_misc/init.lua index 6d9414a9..e0ba6248 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/init.lua +++ b/mods/home_workshop_modpack/home_workshop_misc/init.lua @@ -18,7 +18,8 @@ minetest.register_node("home_workshop_misc:tool_cabinet", { paramtype2="facedir", inventory_image = "home_workshop_misc_tool_cabinet_inv.png", on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, - groups = { snappy=3 }, + groups = { snappy=3, dig_tree=2 }, + is_ground_content = false, expand = { top="placeholder" }, inventory = { size=24, @@ -36,7 +37,8 @@ minetest.register_node("home_workshop_misc:beer_tap", { inventory_image = "home_workshop_misc_beertap_inv.png", paramtype = "light", paramtype2 = "facedir", - groups = { snappy=3 }, + groups = { snappy=3, dig_tree=2 }, + is_ground_content = false, walkable = false, selection_box = { type = "fixed", @@ -44,13 +46,14 @@ minetest.register_node("home_workshop_misc:beer_tap", { }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local inv = clicker:get_inventory() + if not itemstack then return end local wieldname = itemstack:get_name() if wieldname == "vessels:drinking_glass" then if inv:room_for_item("main", "home_workshop_misc:beer_mug 1") then + inv:add_item("main", "home_workshop_misc:beer_mug 1") itemstack:take_item() clicker:set_wielded_item(itemstack) - inv:add_item("main", "home_workshop_misc:beer_mug 1") minetest.chat_send_player(clicker:get_player_name(), S("Ahh, a frosty cold beer - look in your inventory for it!")) else @@ -75,8 +78,9 @@ minetest.register_node("home_workshop_misc:beer_mug", { paramtype = "light", paramtype2 = "facedir", groups = { snappy=3, oddly_breakable_by_hand=3 }, + is_ground_content = false, walkable = false, - sounds = default and default.node_sound_glass_defaults() or nil, + sounds = xcompat.sounds.node_sound_glass_defaults(), selection_box = beer_cbox, on_use = function(itemstack, user, pointed_thing) if not minetest.is_creative_enabled(user:get_player_name()) then @@ -96,7 +100,7 @@ else end local MODPATH = minetest.get_modpath("home_workshop_misc") -if minetest.get_modpath("default") and minetest.get_modpath("basic_materials") then +if minetest.get_modpath("basic_materials") then dofile(MODPATH.."/crafts.lua") end diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.de.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.de.tr index 2ef8ad31..48bba2f6 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.de.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.de.tr @@ -1,12 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### - Metal tool cabinet and work table=Metallwerkzeugschrank und Arbeitstisch -Ahh, a frosty cold beer - look in your inventory for it!=Ahh ein kühles Bier – sehen Sie in Ihrem Inventar nach! -Beer mug=Bierkrug Beer tap=Bierzapfhahn -Soda Can=Limodose -Soda vending machine=Limoautomat +Ahh, a frosty cold beer - look in your inventory for it!=Ahh ein kühles Bier – sehen Sie in Ihrem Inventar nach! No room in your inventory to add a beer mug!=Kein Platz im Inventar für einen Bierkrug! -Please insert a 25 Mg cent coin in the machine.=Bitte Münze in Automaten einwerfen. +Beer mug=Bierkrug +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.es.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.es.tr index ed1f8782..ed7acfc8 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.es.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.es.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Mesa de trabajo y gabinete en hierro -Ahh, a frosty cold beer - look in your inventory for it!=¡Ah, una cerveza fría! La encontrarás en tu inventario. -Beer mug=Jarra de cerveza Beer tap=Grifo de cerveza -Soda Can=Lata de refresco -Soda vending machine=Máquina expendedora de refrescos +Ahh, a frosty cold beer - look in your inventory for it!=¡Ah, una cerveza fría! La encontrarás en tu inventario. No room in your inventory to add a beer mug!=¡No hay lugar para tomar una jarra de cerveza! -Please insert a 25 Mg cent coin in the machine.=Por favor introduzca una moneda en la máquina. +Beer mug=Jarra de cerveza +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.fr.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.fr.tr index 33267cd6..634304af 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.fr.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.fr.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Établi pour le travail du métal -Ahh, a frosty cold beer - look in your inventory for it!=Ahh, une bière bien fraîche - regardez dans votre inventaire ! -Beer mug=Pinte de bière Beer tap=Pompe à bière +Ahh, a frosty cold beer - look in your inventory for it!=Ahh, une bière bien fraîche - regardez dans votre inventaire ! No room in your inventory to add a beer mug!=Pas de place dans votre inventaire pour ajouter une pinte de bière ! -Please insert a 25 Mg cent coin in the machine.=Veuillez insérer une pièce dans la machine. -Soda Can=Canette de soda -Soda vending machine=Distributeur de boissons +Beer mug=Pinte de bière +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ms.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ms.tr index 492c3335..d48b586a 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ms.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ms.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Kabinet Alatan Logam dan Meja Kerja -Ahh, a frosty cold beer - look in your inventory for it!=Ahh, bir sejuk dingin - cari dalam inventori anda! -Beer mug=Kole Bir Beer tap=Paip Bir +Ahh, a frosty cold beer - look in your inventory for it!=Ahh, bir sejuk dingin - cari dalam inventori anda! No room in your inventory to add a beer mug!=Tiada ruang dalam inventori anda untuk menambah kole bir! -Please insert a 25 Mg cent coin in the machine.=Sila masukkan duit syiling ke dalam mesin. -Soda Can=Tin Soda -Soda vending machine=Mesin Soda Layan Diri +Beer mug=Kole Bir +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt.tr index 34fd8c03..bef0dd9e 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Gabinete de ferramentas metálicas e mesa de trabalho -Ahh, a frosty cold beer - look in your inventory for it!=Ahh, uma cerveja bem gelada - procure por ela em seu inventário! -Beer mug=Caneca de cerveja Beer tap=Torneira de cerveja +Ahh, a frosty cold beer - look in your inventory for it!=Ahh, uma cerveja bem gelada - procure por ela em seu inventário! No room in your inventory to add a beer mug!=Sem espaço no inventário para colocar uma caneca de cerveja -Please insert a 25 Mg cent coin in the machine.=Por favor insira uma moeda na máquina. -Soda Can=Lata de Refrigerante -Soda vending machine=Máquina de refrigerante +Beer mug=Caneca de cerveja +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt_BR.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt_BR.tr index 34fd8c03..bef0dd9e 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt_BR.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.pt_BR.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Gabinete de ferramentas metálicas e mesa de trabalho -Ahh, a frosty cold beer - look in your inventory for it!=Ahh, uma cerveja bem gelada - procure por ela em seu inventário! -Beer mug=Caneca de cerveja Beer tap=Torneira de cerveja +Ahh, a frosty cold beer - look in your inventory for it!=Ahh, uma cerveja bem gelada - procure por ela em seu inventário! No room in your inventory to add a beer mug!=Sem espaço no inventário para colocar uma caneca de cerveja -Please insert a 25 Mg cent coin in the machine.=Por favor insira uma moeda na máquina. -Soda Can=Lata de Refrigerante -Soda vending machine=Máquina de refrigerante +Beer mug=Caneca de cerveja +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ru.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ru.tr index afa8ee0e..1b265623 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ru.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.ru.tr @@ -1,11 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### Metal tool cabinet and work table=Шкаф с металлическим инструментом и рабочий стол -Ahh, a frosty cold beer - look in your inventory for it!=О, холодное пиво! Ищи его в инвентаре! -Beer mug=Пивная кружка Beer tap=Пивной кран +Ahh, a frosty cold beer - look in your inventory for it!=О, холодное пиво! Ищи его в инвентаре! No room in your inventory to add a beer mug!=В инвентаре нет места для пивной кружки! -Please insert a 25 Mg cent coin in the machine.=Вставьте монету в автомат. -Soda Can=Банка газировки -Soda vending machine=Автомат с газировкой +Beer mug=Пивная кружка +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.zh_CN.tr b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.zh_CN.tr index bcae4100..83928350 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.zh_CN.tr +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/home_workshop_misc_misc.zh_CN.tr @@ -1,12 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### - Metal tool cabinet and work table=金属工具柜及工作台 -Ahh, a frosty cold beer - look in your inventory for it!=啊,一杯冰凉的啤酒-看看你的库存吧! -Beer mug=啤酒杯 Beer tap=啤酒龙头 +Ahh, a frosty cold beer - look in your inventory for it!=啊,一杯冰凉的啤酒-看看你的库存吧! No room in your inventory to add a beer mug!=你的库存里没有地方放啤酒杯! -Please insert a 25 Mg cent coin in the machine.=请在机器里放一枚硬币。 -Soda Can=易拉罐 -Soda vending machine=汽水自动售货机 +Beer mug=啤酒杯 +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/locale/template.txt b/mods/home_workshop_modpack/home_workshop_misc/locale/template.txt index b6911dca..082f2bc5 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/locale/template.txt +++ b/mods/home_workshop_modpack/home_workshop_misc/locale/template.txt @@ -1,12 +1,7 @@ # textdomain: home_workshop_misc - -### init.lua ### - Metal tool cabinet and work table= -Ahh, a frosty cold beer - look in your inventory for it!= -Beer mug= Beer tap= +Ahh, a frosty cold beer - look in your inventory for it!= No room in your inventory to add a beer mug!= -Please insert a 25 Mg cent coin in the machine.= -Soda Can= -Soda vending machine= +Beer mug= +Small Wooden Drawer= diff --git a/mods/home_workshop_modpack/home_workshop_misc/mod.conf b/mods/home_workshop_modpack/home_workshop_misc/mod.conf index b3958bbf..f5bccbfe 100644 --- a/mods/home_workshop_modpack/home_workshop_misc/mod.conf +++ b/mods/home_workshop_modpack/home_workshop_misc/mod.conf @@ -1,2 +1,3 @@ name = home_workshop_misc +depends = xcompat optional_depends = currency, screwdriver, homedecor_common, default diff --git a/mods/home_workshop_modpack/modpack.conf b/mods/home_workshop_modpack/modpack.conf index e69de29b..1df31547 100644 --- a/mods/home_workshop_modpack/modpack.conf +++ b/mods/home_workshop_modpack/modpack.conf @@ -0,0 +1,2 @@ +name = home_workshop_modpack +min_minetest_version = 5.4.0 \ No newline at end of file diff --git a/mods/homedecor_modpack/.luacheckrc b/mods/homedecor_modpack/.luacheckrc new file mode 100644 index 00000000..f4c7d9ae --- /dev/null +++ b/mods/homedecor_modpack/.luacheckrc @@ -0,0 +1,45 @@ +unused_args = false + +globals = { + "homedecor", + "homedecor_lighting", + "homedecor_windows_and_treatments", + "homedecor_roofing", + "homedecor_misc", + "homedecor_exterior", + "homedecor_electrical", + "homedecor_cobweb", + "lavalamp", + "lrfurn", + "signs_lib", + "homedecor_doors_and_gates", + + -- mod-deps + "armor", + xcompat = {fields = {"player"}}, +} + +read_globals = { + "minetest", "core", + "vector", "ItemStack", + "dump", + + -- Stdlib + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + -- mod-deps + "default", + "unifieddyes", + "player_api", + "screwdriver", + "hopper", + "mesecon", + "skins", + "stairsplus", + "creative", + "doors", + "i3", + "xcompat", + "player_monoids" +} \ No newline at end of file diff --git a/mods/homedecor_modpack/README b/mods/homedecor_modpack/README deleted file mode 100644 index 328a8ed4..00000000 --- a/mods/homedecor_modpack/README +++ /dev/null @@ -1,8 +0,0 @@ -This is what I consider to be a fairly feature-filled home decor modpack. -See the forum thread at -https://forum.minetest.net/viewtopic.php?f=11&t=2041 for details about -this modpack. - -Dependencies: unifieddyes and a Minetest engine build newer than 2017-01-23. - -Recommends: signs_lib, windmill, moreblocks, unified_inventory. diff --git a/mods/homedecor_modpack/README.md b/mods/homedecor_modpack/README.md new file mode 100644 index 00000000..41365782 --- /dev/null +++ b/mods/homedecor_modpack/README.md @@ -0,0 +1,28 @@ +# Minetest Homedecor Modpack + +[![ContentDB](https://content.minetest.net/packages/VanessaE/homedecor_modpack/shields/downloads/)](https://content.minetest.net/packages/VanessaE/homedecor_modpack/) + +A fairly feature-filled home decor modpack that is game agnostic. + +## About + +first class support for: + +* Minetest Game +* Farlands Reloaded +* Hades +* Mineclone2, Mineclone5 + +## Links + +* [Github](https://github.com/mt-mods/homedecor_modpack) +* [Contentdb](https://content.minetest.net/packages/VanessaE/homedecor_modpack/) +* [Forums](https://forum.minetest.net/viewtopic.php?f=11&t=2041) + +# Setup + +required: + +* [Unifieddyes](https://github.com/mt-mods/unifieddyes) +* [Basic Materials](https://github.com/mt-mods/basic_materials) +* [xcompat](https://github.com/mt-mods/xcompat) diff --git a/mods/homedecor_modpack/bower.json b/mods/homedecor_modpack/bower.json deleted file mode 100644 index 2a5379c8..00000000 --- a/mods/homedecor_modpack/bower.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "homedecor_modpack", - "description": "This mod adds a whole bunch of new items to Minetest suitable for decorating inside and outside a home.", - "keywords": [ - "building", - "cosmetic", - "homedecor modpack", - "homedecor_modpack" - ], - "homepage": "http://daconcepts.com/vanessa/hobbies/minetest/homedecor-crafting-guide/homedecor-craft-guide.html", - "project": "https://github.com/minetest-mods/homedecor_modpack", - "forum": "http://forum.minetest.net/viewtopic.php?f=11&t=2041", - "screenshots": [ - "http://daconcepts.com/vanessa/hobbies/minetest/screenshots/homedecor1.png" - ], - "authors": [ - "VanessaE" - ] -} \ No newline at end of file diff --git a/mods/homedecor_modpack/building_blocks/.luacheckrc b/mods/homedecor_modpack/building_blocks/.luacheckrc deleted file mode 100644 index 69e608c5..00000000 --- a/mods/homedecor_modpack/building_blocks/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "stairsplus", - "default", - "stairs", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/building_blocks/alias.lua b/mods/homedecor_modpack/building_blocks/alias.lua index 065f7405..7f2c1b3b 100644 --- a/mods/homedecor_modpack/building_blocks/alias.lua +++ b/mods/homedecor_modpack/building_blocks/alias.lua @@ -8,16 +8,9 @@ if minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs") then end if minetest.get_modpath("moreblocks") then + minetest.register_alias_force("moreblocks:tar", "building_blocks:Tar") stairsplus:register_alias_all("building_blocks", "tar", "building_blocks", "Tar") stairsplus:register_alias_all("building_blocks", "marble", "building_blocks", "Marble") - for _, i in ipairs(stairsplus.shapes_list) do - local class = i[1] - local cut = i[2] - minetest.unregister_item("moreblocks:"..class.."tar"..cut) - minetest.register_alias("moreblocks:"..class.."tar"..cut, "building_blocks:"..class.."tar"..cut) - end - minetest.unregister_item("moreblocks:tar") - minetest.register_alias("moreblocks:tar", "building_blocks:Tar") stairsplus:register_alias_all("moreblocks", "tar", "building_blocks", "Tar") if minetest.get_modpath("gloopblocks") then @@ -40,8 +33,11 @@ if not minetest.get_modpath("technic") then description = S("Granite"), tiles = { "technic_granite.png" }, is_ground_content = true, - groups = {cracky=1}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=1, dig_stone=2, pickaxey=5}, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) minetest.register_craft({ output = "technic:granite 9", diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.de.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.de.tr index c2d6750d..5c11194d 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.de.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.de.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granit - -### node_stairs.lua ### - -Adobe=Adobe -Adobe Slab=Adobestufe -Adobe Stair=Adobetreppe -Brobble Spread=Ziesterboden -Chess board tiling=Schachbrettkacheln -Fake Grass=Falsches Gras -Fake Grass Slab=Falsches-Gras-Stufe -Fake Grass Stair=Falsches-Gras-Treppe -Fireplace=Kamin Grate=Rost -Grate Slab=Roststufe -Grate Stair=Rosttreppe -Gravel Spread=Kiesboden -Hardwood=Hartholz -Hardwood Slab=Hartholzstufe -Hardwood Stair=Hartholztreppe -Marble=Marmor -Marble Slab=Marmorstufe -Marble Stair=Marmortreppe -Roof block=Dachblock -Roof block Slab=Dachblockstufe -Roof block Stair=Dachblocktreppe Streak Free Glass=Schlierenfreies Glas -Streak Free Glass Slab=Schlierenfreies-Glas-Stufe -Streak Free Glass Stair=Schlierenfreies-Glas-Treppe +Wood Framed Glass=Holzrahmenglas +Adobe=Adobe +Fake Grass=Falsches Gras +Hardwood=Hartholz +Roof block=Dachblock Tar=Teer -Tar Slab=Teerstufe -Tar Stair=Teertreppe +Marble=Marmor +Brobble Spread=Ziesterboden +Gravel Spread=Kiesboden Tarmac Spread=Asphaltboden Terrycloth towel=Frottiertuch -Wood Framed Glass=Holzrahmenglas -Wood Framed Glass Slab=Holzrahmenglasstufe -Wood Framed Glass Stair=Holzrahmenglastreppe - -### others.lua ### - +Chess board tiling=Schachbrettkacheln +Fireplace=Kamin Small bundle of sticks=Kleines Bündel Stöcke -Tar Knife=Teermesser Tar base=Teerbase +Tar Knife=Teermesser diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.es.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.es.tr index 1212d5fe..a83dc5fd 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.es.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.es.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granito - -### node_stairs.lua ### - -Adobe=Adobe -Adobe Slab=Losa de adobe -Adobe Stair=Escaleras de adobe -Brobble Spread=Mezcla de Ladroquines -Chess board tiling=Azulejos de ajedrez -Fake Grass=Hierba falsa -Fake Grass Slab= -Fake Grass Stair= -Fireplace=Chimenea Grate=Reja -Grate Slab=Losa de rejas -Grate Stair=Escaleras de rejas -Gravel Spread=Mezcla de gravilla -Hardwood=Madera dura -Hardwood Slab=Losa de madera dura -Hardwood Stair=Escaleras de madera dura -Marble=Mármol -Marble Slab=Losa de mármol -Marble Stair=Escaleras de mármol -Roof block=Bloque de techo -Roof block Slab= -Roof block Stair= Streak Free Glass=Vídrio sin rayas -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=Vídrio enmarcado en madera +Adobe=Adobe +Fake Grass=Hierba falsa +Hardwood=Madera dura +Roof block=Bloque de techo Tar=Alquitrán -Tar Slab=Losa de alquitrán -Tar Stair=Escaleras de alquitrán +Marble=Mármol +Brobble Spread=Mezcla de Ladroquines +Gravel Spread=Mezcla de gravilla Tarmac Spread=Mezcla de asfalto Terrycloth towel=Toalla -Wood Framed Glass=Vídrio enmarcado en madera -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=Azulejos de ajedrez +Fireplace=Chimenea Small bundle of sticks=Manojo de palitos -Tar Knife=Cuchillo de alquitrán Tar base=Base de alquitrán +Tar Knife=Cuchillo de alquitrán diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.fr.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.fr.tr index 4ea5fb29..ae10d96b 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.fr.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.fr.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granit - -### node_stairs.lua ### - -Adobe=Pisé -Adobe Slab=Dalle en pisé -Adobe Stair=Escalier en pisé -Brobble Spread=Tapis rouge -Chess board tiling=Pavage en échiquier -Fake Grass=Herbe synthétique -Fake Grass Slab=Dalle en herbe synthétique -Fake Grass Stair=Escalier en herbe synthétique -Fireplace=Cheminée Grate=Grille -Grate Slab=Dalle en métal déployé -Grate Stair=Escalier en métal déployé -Gravel Spread=Tapis de gravier -Hardwood=Bois dur (feuillu) -Hardwood Slab=Dalle en bois dur (feuillu) -Hardwood Stair=Escalier en bois dur (feuillu) -Marble=Marbre -Marble Slab=Dalle en marbre -Marble Stair=Marche en marbre -Roof block=Bloc de toit -Roof block Slab=Dalle en bloc de toit -Roof block Stair=Escalier en bloc de toit Streak Free Glass=Verre anti-rayures -Streak Free Glass Slab=Dalle en verre anti-rayures -Streak Free Glass Stair=Escalier en verre anti-rayures +Wood Framed Glass=Verre encadré de bois +Adobe=Pisé +Fake Grass=Herbe synthétique +Hardwood=Bois dur (feuillu) +Roof block=Bloc de toit Tar=Goudron -Tar Slab=Dalle en goudron -Tar Stair=Marche en goudron +Marble=Marbre +Brobble Spread=Tapis rouge +Gravel Spread=Tapis de gravier Tarmac Spread=Tapis de goudron Terrycloth towel=Serviette éponge -Wood Framed Glass=Verre encadré de bois -Wood Framed Glass Slab=Dalle en verre encadré de bois -Wood Framed Glass Stair=Escalier en verre encadré de bois - -### others.lua ### - +Chess board tiling=Pavage en échiquier +Fireplace=Cheminée Small bundle of sticks=Petit fagot de brindilles -Tar Knife=Couteau à goudron Tar base=Pâte de goudron +Tar Knife=Couteau à goudron diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.ms.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.ms.tr index e13b93b8..32dcb5af 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.ms.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.ms.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granit - -### node_stairs.lua ### - -Adobe=Adob -Adobe Slab=Bidur Adob -Adobe Stair=Tangga Adob -Brobble Spread=Sebaran Batu Merah -Chess board tiling=Jubin Papan Catur -Fake Grass=Rumput Tiruan -Fake Grass Slab= -Fake Grass Stair= -Fireplace=Pendiangan Grate=Jeriji -Grate Slab=Bidur Jeriji -Grate Stair=Tangga Jeriji -Gravel Spread=Sebaran Kelikir -Hardwood=Kayu Keras -Hardwood Slab=Bidur Kayu Keras -Hardwood Stair=Tangga Kayu Keras -Marble=Marmar -Marble Slab=Bidur Marmar -Marble Stair=Tangga Marmar -Roof block=Blok Bumbung -Roof block Slab= -Roof block Stair= Streak Free Glass=Kaca Bebas Calar -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=Kaca Berbingkai Kayu +Adobe=Adob +Fake Grass=Rumput Tiruan +Hardwood=Kayu Keras +Roof block=Blok Bumbung Tar=Tar -Tar Slab=Bidur Tar -Tar Stair=Tangga Tar +Marble=Marmar +Brobble Spread=Sebaran Batu Merah +Gravel Spread=Sebaran Kelikir Tarmac Spread=Sebaran Tar Terrycloth towel=Kain Tuala -Wood Framed Glass=Kaca Berbingkai Kayu -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=Jubin Papan Catur +Fireplace=Pendiangan Small bundle of sticks=Seberkas Kecil Serpihan Kayu -Tar Knife=Pisau Tar Tar base=Campuran Tar +Tar Knife=Pisau Tar diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt.tr index 0091e85e..b2e983f0 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granito - -### node_stairs.lua ### - -Adobe=Argila -Adobe Slab=Placa de argila -Adobe Stair=Escada de Argila -Brobble Spread=Calçado -Chess board tiling=Revestimento de xadrez -Fake Grass=Grama Falsa -Fake Grass Slab= -Fake Grass Stair= -Fireplace=Lareira Grate=Grelha -Grate Slab=Placa de Grelha -Grate Stair=Escade de Grelha -Gravel Spread=Espalhamento de Cascalho -Hardwood=Madeira -Hardwood Slab=Placa de madeira -Hardwood Stair=Escada de madeira -Marble=Mármore -Marble Slab=Placa de Mármore -Marble Stair=Escada de mármore -Roof block=Bloco de telhado -Roof block Slab= -Roof block Stair= Streak Free Glass=Vidro Sem Riscos -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=Vidro com Bordas de Madeira +Adobe=Argila +Fake Grass=Grama Falsa +Hardwood=Madeira +Roof block=Bloco de telhado Tar=Alcatrão -Tar Slab=Placa de alcatrão -Tar Stair=Escada de alcatrão +Marble=Mármore +Brobble Spread=Calçado +Gravel Spread=Espalhamento de Cascalho Tarmac Spread=Espalhamento das Estradas Terrycloth towel=Toalha de Roupinha -Wood Framed Glass=Vidro com Bordas de Madeira -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=Revestimento de xadrez +Fireplace=Lareira Small bundle of sticks=Pequeno amontoado de gravetos -Tar Knife=Faca de Alcatrão Tar base=Base para alcatrão +Tar Knife=Faca de Alcatrão diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt_BR.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt_BR.tr index 0091e85e..b2e983f0 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt_BR.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.pt_BR.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Granito - -### node_stairs.lua ### - -Adobe=Argila -Adobe Slab=Placa de argila -Adobe Stair=Escada de Argila -Brobble Spread=Calçado -Chess board tiling=Revestimento de xadrez -Fake Grass=Grama Falsa -Fake Grass Slab= -Fake Grass Stair= -Fireplace=Lareira Grate=Grelha -Grate Slab=Placa de Grelha -Grate Stair=Escade de Grelha -Gravel Spread=Espalhamento de Cascalho -Hardwood=Madeira -Hardwood Slab=Placa de madeira -Hardwood Stair=Escada de madeira -Marble=Mármore -Marble Slab=Placa de Mármore -Marble Stair=Escada de mármore -Roof block=Bloco de telhado -Roof block Slab= -Roof block Stair= Streak Free Glass=Vidro Sem Riscos -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=Vidro com Bordas de Madeira +Adobe=Argila +Fake Grass=Grama Falsa +Hardwood=Madeira +Roof block=Bloco de telhado Tar=Alcatrão -Tar Slab=Placa de alcatrão -Tar Stair=Escada de alcatrão +Marble=Mármore +Brobble Spread=Calçado +Gravel Spread=Espalhamento de Cascalho Tarmac Spread=Espalhamento das Estradas Terrycloth towel=Toalha de Roupinha -Wood Framed Glass=Vidro com Bordas de Madeira -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=Revestimento de xadrez +Fireplace=Lareira Small bundle of sticks=Pequeno amontoado de gravetos -Tar Knife=Faca de Alcatrão Tar base=Base para alcatrão +Tar Knife=Faca de Alcatrão diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.ru.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.ru.tr index c7b5a106..ab2b3c9a 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.ru.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.ru.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=Гранит - -### node_stairs.lua ### - -Adobe=Саман -Adobe Slab=Саманная плита -Adobe Stair=Саманная ступенька -Brobble Spread=Настил кирпичного булыжника -Chess board tiling=Шахматная плитка -Fake Grass=Псевдо трава -Fake Grass Slab= -Fake Grass Stair= -Fireplace=Камин Grate=Каминная решётка -Grate Slab=Решётчатая плита -Grate Stair=Решётчатая ступенька -Gravel Spread=Настил гравия -Hardwood=Твёрдая древесина -Hardwood Slab=Плита из твёрдой древесины -Hardwood Stair=Ступенька из твёрдой древесины -Marble=Мрамор -Marble Slab=Мраморная блита -Marble Stair=Мраморная ступенька -Roof block=Кровельный блок -Roof block Slab= -Roof block Stair= Streak Free Glass=Стекло без стыков -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=Деревянное окно +Adobe=Саман +Fake Grass=Псевдо трава +Hardwood=Твёрдая древесина +Roof block=Кровельный блок Tar=Смола -Tar Slab=Плита из смолы -Tar Stair=Ступенька из смолы +Marble=Мрамор +Brobble Spread=Настил кирпичного булыжника +Gravel Spread=Настил гравия Tarmac Spread=Покрытие гудронной смолой Terrycloth towel=Махровое полотенце -Wood Framed Glass=Деревянное окно -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=Шахматная плитка +Fireplace=Камин Small bundle of sticks=Небольшая связка палок -Tar Knife=Смоляной нож Tar base=Смоляная основа +Tar Knife=Смоляной нож diff --git a/mods/homedecor_modpack/building_blocks/locale/building_blocks.zh_CN.tr b/mods/homedecor_modpack/building_blocks/locale/building_blocks.zh_CN.tr index f140881b..d2de214e 100644 --- a/mods/homedecor_modpack/building_blocks/locale/building_blocks.zh_CN.tr +++ b/mods/homedecor_modpack/building_blocks/locale/building_blocks.zh_CN.tr @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite=花岗岩 - -### node_stairs.lua ### - -Adobe=土砖 -Adobe Slab= -Adobe Stair= -Brobble Spread=石砖路面 -Chess board tiling=棋盘铺贴 -Fake Grass=塑料草 -Fake Grass Slab= -Fake Grass Stair= -Fireplace=壁炉 Grate=磨碎 -Grate Slab= -Grate Stair= -Gravel Spread=碎石路面 -Hardwood=硬木 -Hardwood Slab= -Hardwood Stair= -Marble=大理石 -Marble Slab= -Marble Stair= -Roof block=天台 -Roof block Slab= -Roof block Stair= Streak Free Glass=无条纹玻璃 -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass=木框玻璃 +Adobe=土砖 +Fake Grass=塑料草 +Hardwood=硬木 +Roof block=天台 Tar=焦油 -Tar Slab= -Tar Stair= +Marble=大理石 +Brobble Spread=石砖路面 +Gravel Spread=碎石路面 Tarmac Spread=柏油路面 Terrycloth towel=毛巾 -Wood Framed Glass=木框玻璃 -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling=棋盘铺贴 +Fireplace=壁炉 Small bundle of sticks=小捆棍子 -Tar Knife=焦油刀 Tar base=焦油基 +Tar Knife=焦油刀 diff --git a/mods/homedecor_modpack/building_blocks/locale/template.txt b/mods/homedecor_modpack/building_blocks/locale/template.txt index d69b8337..2a4cb7c7 100644 --- a/mods/homedecor_modpack/building_blocks/locale/template.txt +++ b/mods/homedecor_modpack/building_blocks/locale/template.txt @@ -1,48 +1,20 @@ # textdomain: building_blocks - - -### alias.lua ### - Granite= - -### node_stairs.lua ### - -Adobe= -Adobe Slab= -Adobe Stair= -Brobble Spread= -Chess board tiling= -Fake Grass= -Fake Grass Slab= -Fake Grass Stair= -Fireplace= Grate= -Grate Slab= -Grate Stair= -Gravel Spread= -Hardwood= -Hardwood Slab= -Hardwood Stair= -Marble= -Marble Slab= -Marble Stair= -Roof block= -Roof block Slab= -Roof block Stair= Streak Free Glass= -Streak Free Glass Slab= -Streak Free Glass Stair= +Wood Framed Glass= +Adobe= +Fake Grass= +Hardwood= +Roof block= Tar= -Tar Slab= -Tar Stair= +Marble= +Brobble Spread= +Gravel Spread= Tarmac Spread= Terrycloth towel= -Wood Framed Glass= -Wood Framed Glass Slab= -Wood Framed Glass Stair= - -### others.lua ### - +Chess board tiling= +Fireplace= Small bundle of sticks= -Tar Knife= Tar base= +Tar Knife= diff --git a/mods/homedecor_modpack/building_blocks/mod.conf b/mods/homedecor_modpack/building_blocks/mod.conf index 146d5ef6..81ae801c 100644 --- a/mods/homedecor_modpack/building_blocks/mod.conf +++ b/mods/homedecor_modpack/building_blocks/mod.conf @@ -1,3 +1,3 @@ name = building_blocks -depends = default -optional_depends = moreblocks, gloopblocks, stairs +depends = homedecor_common +optional_depends = moreblocks, gloopblocks, stairs, default diff --git a/mods/homedecor_modpack/building_blocks/node_stairs.lua b/mods/homedecor_modpack/building_blocks/node_stairs.lua index 07cbe223..349c4bcb 100644 --- a/mods/homedecor_modpack/building_blocks/node_stairs.lua +++ b/mods/homedecor_modpack/building_blocks/node_stairs.lua @@ -1,6 +1,20 @@ local S = minetest.get_translator("building_blocks") local function building_blocks_stairs(nodename, def) + + if def.groups and (def.groups.crumbly or def.groups.oddly_breakable_by_hand) then + def.groups["handy"]=1 + def._mcl_hardness=0.6 + elseif def.groups and (def.groups.snappy or def.groups.choppy) then + def.groups["axey"]=5 + def._mcl_hardness=1.6 + elseif def.groups and (def.groups.cracky or def.groups.crumbly) then + def.groups["pickaxey"]=5 + def._mcl_hardness=1.6 + end + + def.is_ground_content = def.is_ground_content == true + minetest.register_node(nodename, def) if minetest.get_modpath("moreblocks") then local mod, name = nodename:match("(.*):(.*)") @@ -19,10 +33,12 @@ building_blocks_stairs("building_blocks:grate", { tiles = {"building_blocks_grate.png"}, paramtype = "light", sunlight_propagates = true, - is_ground_content = true, + is_ground_content = false, use_texture_alpha = "clip", - groups = {cracky=1}, - sounds = default.node_sound_metal_defaults(), + groups = {cracky=1, dig_generic=3}, + _sound_def = { + key = "node_sound_metal_defaults", + }, }) building_blocks_stairs("building_blocks:smoothglass", { drawtype = "glasslike", @@ -30,10 +46,12 @@ building_blocks_stairs("building_blocks:smoothglass", { tiles = {"building_blocks_sglass.png"}, paramtype = "light", sunlight_propagates = true, - is_ground_content = true, + is_ground_content = false, use_texture_alpha = "clip", groups = {snappy=3,cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, }) building_blocks_stairs("building_blocks:woodglass", { drawtype = "glasslike", @@ -41,55 +59,72 @@ building_blocks_stairs("building_blocks:woodglass", { tiles = {"building_blocks_wglass.png"}, paramtype = "light", sunlight_propagates = true, - is_ground_content = true, + is_ground_content = false, use_texture_alpha = "clip", groups = {snappy=3,cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, }) building_blocks_stairs("building_blocks:Adobe", { tiles = {"building_blocks_Adobe.png"}, description = S("Adobe"), - is_ground_content = true, - groups = {crumbly=3}, - sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + groups = {crumbly=3, dig_stone=2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) +local grasstex = { + homedecor.textures.grass.top, + homedecor.textures.grass.dirt, + homedecor.textures.grass.side +} building_blocks_stairs("building_blocks:fakegrass", { - tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + tiles = grasstex, description = S("Fake Grass"), - is_ground_content = true, - groups = {crumbly=3}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), + is_ground_content = false, + groups = {crumbly=3, dig_sand=3}, + _sound_def = { + key = "node_sound_dirt_defaults", + }, }) building_blocks_stairs("building_blocks:hardwood", { tiles = {"building_blocks_hardwood.png"}, - is_ground_content = true, + is_ground_content = false, description = S("Hardwood"), - groups = {choppy=1,flammable=1}, - sounds = default.node_sound_wood_defaults(), + groups = {choppy=1,flammable=1, dig_tree=1}, + _sound_def = { + key = "node_sound_wood_defaults", + }, }) building_blocks_stairs("building_blocks:Roofing", { tiles = {"building_blocks_Roofing.png"}, - is_ground_content = true, + is_ground_content = false, description = S("Roof block"), - groups = {snappy=3}, - sounds = default.node_sound_stone_defaults(), + groups = {snappy=3, dig_generic=4}, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) building_blocks_stairs("building_blocks:Tar", { description = S("Tar"), tiles = {"building_blocks_tar.png"}, - is_ground_content = true, - groups = {crumbly=1, tar_block = 1}, - sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + groups = {crumbly=1, tar_block = 1, dig_generic=4}, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) building_blocks_stairs("building_blocks:Marble", { description = S("Marble"), tiles = {"building_blocks_marble.png"}, - is_ground_content = true, - groups = {cracky=3, marble = 1}, - sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + groups = {cracky=3, marble = 1, dig_stone=2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) minetest.register_node("building_blocks:brobble_spread", { @@ -103,34 +138,36 @@ minetest.register_node("building_blocks:brobble_spread", { walkable = false, selection_box = { type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, sunlight_propagates = true, - is_ground_content = true, - groups = {crumbly=3}, + is_ground_content = false, + groups = {crumbly=3, dig_generic=4, handy=1}, + _mcl_hardness=0.6 }) if not minetest.get_modpath("moreblocks") or not minetest.get_modpath("gloopblocks") then + local graveltex = homedecor.textures.gravel minetest.register_node("building_blocks:gravel_spread", { drawtype = "raillike", description = S("Gravel Spread"), - tiles = {"default_gravel.png"}, + tiles = {graveltex}, inventory_image = "building_blocks_gravel_spread_inv.png", paramtype = "light", walkable = false, selection_box = { type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, sunlight_propagates = true, - is_ground_content = true, - groups = {crumbly=2}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.5}, - dug = {name="default_gravel_footstep", gain=1.0}, - }), + is_ground_content = false, + groups = {crumbly=2, dig_generic=4, handy=1}, + _mcl_hardness=0.6, + _sound_def = { + key = "node_sound_dirt_defaults", + }, }) end @@ -143,13 +180,16 @@ minetest.register_node("building_blocks:Tarmac_spread", { walkable = false, selection_box = { type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, sunlight_propagates = true, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_dirt_defaults(), + is_ground_content = false, + groups = {cracky=3, dig_generic=4, pickaxey=5}, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_dirt_defaults", + }, }) minetest.register_node("building_blocks:terrycloth_towel", { drawtype = "raillike", @@ -160,12 +200,13 @@ minetest.register_node("building_blocks:terrycloth_towel", { walkable = false, selection_box = { type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, sunlight_propagates = true, - is_ground_content = true, - groups = {crumbly=3}, + is_ground_content = false, + groups = {crumbly=3, dig_generic=4, handy=1}, + _mcl_hardness=0.6 }) minetest.register_node("building_blocks:BWtile", { @@ -187,8 +228,9 @@ minetest.register_node("building_blocks:BWtile", { fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, sunlight_propagates = true, - is_ground_content = true, - groups = {crumbly=3}, + is_ground_content = false, + groups = {crumbly=3, dig_generic=4, handy=1}, + _mcl_hardness=0.6 }) minetest.register_node("building_blocks:Fireplace", { @@ -201,9 +243,12 @@ minetest.register_node("building_blocks:Fireplace", { }, paramtype = "light", paramtype2 = "facedir", - light_source = default.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sunlight_propagates = true, - is_ground_content = true, - groups = {cracky=2}, - sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + groups = {cracky=2, dig_generic=4, pickaxey=5}, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) diff --git a/mods/homedecor_modpack/building_blocks/recipes.lua b/mods/homedecor_modpack/building_blocks/recipes.lua index e0d601fc..86e665f8 100644 --- a/mods/homedecor_modpack/building_blocks/recipes.lua +++ b/mods/homedecor_modpack/building_blocks/recipes.lua @@ -1,3 +1,5 @@ +local materials = homedecor.materials + if minetest.get_modpath("moreblocks") then minetest.register_craft({ output = 'building_blocks:sticks 2', @@ -20,15 +22,15 @@ end minetest.register_craft({ output = 'building_blocks:Adobe 3', recipe = { - {"default:sand"}, - {"default:clay"}, + {materials.sand}, + {materials.clay_lump}, {"group:stick"}, } }) minetest.register_craft({ output = 'building_blocks:brobble_spread 4', recipe = { - {"default:brick", "default:cobble", "default:brick"}, + {materials.brick, materials.cobble, materials.brick}, } }) minetest.register_craft({ @@ -42,20 +44,20 @@ minetest.register_craft({ output = 'building_blocks:fakegrass 2', recipe = { {'group:leaves'}, - {"default:dirt"}, + {materials.dirt}, } }) minetest.register_craft({ output = 'building_blocks:Fireplace 1', recipe = { - {"default:steel_ingot", "building_blocks:sticks", "default:steel_ingot"}, + {materials.steel_ingot, "building_blocks:sticks", materials.steel_ingot}, } }) minetest.register_craft({ output = 'building_blocks:grate 1', recipe = { - {"default:steel_ingot", "default:steel_ingot"}, - {"default:glass", "default:glass"}, + {materials.steel_ingot, materials.steel_ingot}, + {materials.glass_block, materials.glass_block}, } }) @@ -63,25 +65,27 @@ if not minetest.get_modpath("moreblocks") or not minetest.get_modpath("gloopbloc minetest.register_craft({ output = 'building_blocks:gravel_spread 4', recipe = { - {"default:gravel", "default:gravel", "default:gravel"}, + {materials.gravel, materials.gravel, materials.gravel}, } }) end -minetest.register_craft({ - output = 'building_blocks:hardwood 2', - recipe = { - {"default:wood", "default:junglewood"}, - {"default:junglewood", "default:wood"}, - } -}) -minetest.register_craft({ - output = 'building_blocks:hardwood 2', - recipe = { - {"default:junglewood", "default:wood"}, - {"default:wood", "default:junglewood"}, - } -}) +if minetest.get_modpath("default") then + minetest.register_craft({ + output = 'building_blocks:hardwood 2', + recipe = { + {"default:wood", "default:junglewood"}, + {"default:junglewood", "default:wood"}, + } + }) + minetest.register_craft({ + output = 'building_blocks:hardwood 2', + recipe = { + {"default:junglewood", "default:wood"}, + {"default:wood", "default:junglewood"}, + } + }) +end minetest.register_craft({ output = 'building_blocks:knife 1', recipe = { @@ -92,9 +96,9 @@ minetest.register_craft({ minetest.register_craft({ output = "building_blocks:Marble 9", recipe = { - {"default:clay", "group:tar_block", "default:clay"}, - {"group:tar_block","default:clay", "group:tar_block"}, - {"default:clay", "group:tar_block","default:clay"}, + {materials.clay_lump, "group:tar_block", materials.clay_lump}, + {"group:tar_block",materials.clay_lump, "group:tar_block"}, + {materials.clay_lump, "group:tar_block",materials.clay_lump}, } }) minetest.register_craft({ @@ -113,15 +117,15 @@ minetest.register_craft({ minetest.register_craft({ output = 'building_blocks:tar_base 4', recipe = { - {"default:coal_lump", "default:gravel"}, - {"default:gravel", "default:coal_lump"} + {materials.coal_lump, materials.gravel}, + {materials.gravel, materials.coal_lump} } }) minetest.register_craft({ output = 'building_blocks:tar_base 4', recipe = { - {"default:gravel", "default:coal_lump"}, - {"default:coal_lump", "default:gravel"} + {materials.gravel, materials.coal_lump}, + {materials.coal_lump, materials.gravel} } }) minetest.register_craft({ @@ -140,14 +144,14 @@ minetest.register_craft({ output = 'building_blocks:woodglass 1', recipe = { {"group:wood"}, - {"default:glass"}, + {materials.glass_block}, } }) minetest.register_craft({ type = "cooking", output = "building_blocks:smoothglass", - recipe = "default:glass" + recipe = materials.glass_block }) minetest.register_craft({ type = "cooking", diff --git a/mods/homedecor_modpack/fake_fire/.luacheckrc b/mods/homedecor_modpack/fake_fire/.luacheckrc deleted file mode 100644 index bc95a84a..00000000 --- a/mods/homedecor_modpack/fake_fire/.luacheckrc +++ /dev/null @@ -1,19 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/fake_fire/init.lua b/mods/homedecor_modpack/fake_fire/init.lua index 21f82cc0..b718c821 100644 --- a/mods/homedecor_modpack/fake_fire/init.lua +++ b/mods/homedecor_modpack/fake_fire/init.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator("fake_fire") +local fake_fire_reload_particles_nodes = {} + local function fire_particles_on(pos) -- 3 layers of fire local meta = minetest.get_meta(pos) local id1 = minetest.add_particlespawner({ -- 1 layer big particles fire @@ -102,8 +104,8 @@ local function start_fire_effects(pos, node, clicker, chimney) minsize = 4, maxsize = 8, texture = "smoke_particle.png", }) + this_spawner_meta:set_int("smoky", id) if chimney == 1 then - this_spawner_meta:set_int("smoky", id) this_spawner_meta:set_int("sound", 0) else s_handle = minetest.sound_play("fire_small", { @@ -111,6 +113,7 @@ local function start_fire_effects(pos, node, clicker, chimney) max_hear_distance = 5, loop = true }) + fire_particles_off(pos) fire_particles_on(pos) this_spawner_meta:set_int("sound", s_handle) end @@ -142,7 +145,9 @@ minetest.register_node("fake_fire:ice_fire", { drawtype = "plantlike", paramtype = "light", paramtype2 = "facedir", - groups = {dig_immediate=3, not_in_creative_inventory=1}, + groups = {dig_immediate=3, not_in_creative_inventory=1, dig_generic=3, handy=1}, + is_ground_content = false, + _mcl_hardness=0.6, sunlight_propagates = true, buildable_to = true, walkable = false, @@ -158,6 +163,7 @@ minetest.register_node("fake_fire:ice_fire", { end, on_destruct = function (pos) stop_smoke(pos) + fire_particles_off(pos) minetest.sound_play("fire_extinguish", { pos = pos, max_hear_distance = 5 }) @@ -172,6 +178,8 @@ local sbox = { fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16}, } +local wtex = homedecor.textures.wood.jungle.planks + minetest.register_node("fake_fire:fancy_fire", { inventory_image = "fancy_fire_inv.png", description = S("Fancy Fire"), @@ -179,7 +187,10 @@ minetest.register_node("fake_fire:fancy_fire", { mesh = "fancy_fire.obj", paramtype = "light", paramtype2 = "facedir", - groups = {oddly_breakable_by_hand=3, flammable=0}, + use_texture_alpha = "clip", + groups = {oddly_breakable_by_hand=3, flammable=0, handy=1}, + is_ground_content = false, + _mcl_hardness=0.6, sunlight_propagates = true, light_source = 13, walkable = false, @@ -188,10 +199,11 @@ minetest.register_node("fake_fire:fancy_fire", { selection_box = sbox, tiles = { "basic_materials_concrete_block.png", - "default_junglewood.png", + wtex, "fake_fire_empty_tile.png" }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + fire_particles_off(pos) fire_particles_on(pos) return itemstack end, @@ -223,25 +235,46 @@ minetest.register_node("fake_fire:embers", { aspect_w=16, aspect_h=16, length=2}}, }, light_source = 9, - groups = {crumbly=3}, + groups = {crumbly=3, dig_stone=2, handy=1}, + is_ground_content = false, + _mcl_hardness=0.6, paramtype = "light", - sounds = default.node_sound_dirt_defaults(), + _sound_def = { + key = "node_sound_dirt_defaults", + }, }) +local sandstone_tex = "default_sandstone.png" +if not minetest.get_modpath("default") then + local sname = minetest.registered_nodes["mapgen_stone"].name + local names = sname:split(":") + local nitem = names[2] and string.gsub(names[2], "stone", "sandstone") or nil + if nitem and minetest.registered_nodes[names[1]..":"..nitem] then + sandstone_tex = minetest.registered_nodes[names[1]..":"..nitem].tiles[1] + else + sandstone_tex = "[combine:16x16^[noalpha^[colorize:#fefebe" + end +end + -- CHIMNEYS local materials = { - { "stone", S("Stone chimney top") }, - { "sandstone", S("Sandstone chimney top") }, + { "stone", S("Stone chimney top"), minetest.registered_nodes["mapgen_stone"].tiles[1] }, + { "sandstone", S("Sandstone chimney top"), sandstone_tex }, } for _, mat in ipairs(materials) do - local name, desc = unpack(mat) + local name, desc, tex = unpack(mat) + table.insert(fake_fire_reload_particles_nodes, "fake_fire:chimney_top_"..name) minetest.register_node("fake_fire:chimney_top_"..name, { description = desc, - tiles = {"default_"..name..".png^chimney_top.png", "default_"..name..".png"}, - groups = {snappy=3}, + tiles = {tex.."^chimney_top.png", tex}, + groups = {snappy=3, dig_stone=2, handy=1}, + is_ground_content = false, + _mcl_hardness=0.6, paramtype = "light", - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, drawtype = "nodebox", node_box = { type = "fixed", @@ -257,37 +290,42 @@ for _, mat in ipairs(materials) do end }) - minetest.register_craft({ - type = "shapeless", - output = 'fake_fire:chimney_top_'..name, - recipe = {"default:torch", "stairs:slab_"..name} - }) + if minetest.get_modpath("default") then + minetest.register_craft({ + type = "shapeless", + output = 'fake_fire:chimney_top_'..name, + recipe = {"default:torch", "stairs:slab_"..name} + }) + end end minetest.register_alias("fake_fire:flint_and_steel", "fire:flint_and_steel") -minetest.override_item("default:ice", { - on_ignite = function(pos, igniter) - local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} - if minetest.get_node(flame_pos).name == "air" then - minetest.set_node(flame_pos, {name = "fake_fire:ice_fire"}) +if minetest.get_modpath("default") then + minetest.override_item("default:ice", { + on_ignite = function(pos, igniter) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == "air" then + minetest.set_node(flame_pos, {name = "fake_fire:ice_fire"}) + end end - end -}) + }) +end -- CRAFTS +if minetest.get_modpath("default") then + minetest.register_craft({ + type = "shapeless", + output = 'fake_fire:embers', + recipe = {"default:torch", "group:wood", "default:torch"} + }) -minetest.register_craft({ - type = "shapeless", - output = 'fake_fire:embers', - recipe = {"default:torch", "group:wood", "default:torch"} -}) - -minetest.register_craft({ - type = "shapeless", - output = 'fake_fire:fancy_fire', - recipe = {"default:torch", "building_blocks:sticks", "default:torch" } -}) + minetest.register_craft({ + type = "shapeless", + output = 'fake_fire:fancy_fire', + recipe = {"default:torch", "building_blocks:sticks", "default:torch" } + }) +end -- ALIASES @@ -302,10 +340,23 @@ minetest.register_alias("fake_fire:flint", "fake_fire:flint_and_steel") minetest.register_lbm({ name = "fake_fire:reload_particles", label = "restart fire particles on reload", - nodenames = {"fake_fire:fancy_fire"}, + nodenames = { "fake_fire:fancy_fire" }, run_at_every_load = true, action = function(pos, node) fire_particles_off(pos) fire_particles_on(pos) end }) + +minetest.register_lbm({ + name = "fake_fire:reload_particles_chimney", + label = "restart chimney smoke on reload", + nodenames = fake_fire_reload_particles_nodes, + run_at_every_load = true, + action = function(pos, node) + if minetest.get_meta(pos):get_int("smoky") ~= 0 then + stop_smoke(pos) + start_fire_effects(pos, node, nil, 1) + end + end +}) diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.de.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.de.tr index 029951fa..f69568ae 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.de.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.de.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Eisfeuer Fancy Fire=Schönes Feuer Glowing Embers=Glühende Asche -Ice fire=Eisfeuer -Sandstone chimney top=Sandsteinschornsteinaufsatz Stone chimney top=Steinschornsteinaufsatz +Sandstone chimney top=Sandsteinschornsteinaufsatz diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.es.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.es.tr index 84ee0483..ad0aa523 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.es.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.es.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Fuego de hielo Fancy Fire=Fuego fantasía Glowing Embers=Brasas ardientes -Ice fire=Fuego de hielo -Sandstone chimney top=Chimenea de arenisca Stone chimney top=Chimenea de piedra +Sandstone chimney top=Chimenea de arenisca diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.fr.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.fr.tr index fa450eb9..81532e5a 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.fr.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.fr.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Feu glacé Fancy Fire=Feu décoratif Glowing Embers=Braises incandescentes -Ice fire=Feu glacé -Sandstone chimney top=Haut de cheminée en grès Stone chimney top=Haut de cheminée en pierre +Sandstone chimney top=Haut de cheminée en grès diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.ms.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.ms.tr index ed4c5f6f..0406abcd 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.ms.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.ms.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Api Ais Fancy Fire=Api Hiasan Glowing Embers=Bara Api -Ice fire=Api Ais -Sandstone chimney top=Kepala Serombong Batu Pasir Stone chimney top=Kepala Serombong Batu +Sandstone chimney top=Kepala Serombong Batu Pasir diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt.tr index fb08cf34..3311bc12 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Fogo de gelo Fancy Fire=Fogo Chique Glowing Embers=Brasas Brilhantes -Ice fire=Fogo de gelo -Sandstone chimney top=Topo de chaminé de arenito Stone chimney top=Topo de chaminé de pedra +Sandstone chimney top=Topo de chaminé de arenito diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt_BR.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt_BR.tr index fb08cf34..3311bc12 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt_BR.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.pt_BR.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Fogo de gelo Fancy Fire=Fogo Chique Glowing Embers=Brasas Brilhantes -Ice fire=Fogo de gelo -Sandstone chimney top=Topo de chaminé de arenito Stone chimney top=Topo de chaminé de pedra +Sandstone chimney top=Topo de chaminé de arenito diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.ru.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.ru.tr index bcbc5d43..cf5995f7 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.ru.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.ru.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=Ледяной огонь Fancy Fire=Необычный огонь Glowing Embers=Светящиеся угли -Ice fire=Ледяной огонь -Sandstone chimney top=Дымоход из песчаника на крышу Stone chimney top=Каменный дымоход на крышу +Sandstone chimney top=Дымоход из песчаника на крышу diff --git a/mods/homedecor_modpack/fake_fire/locale/fake_fire.zh_CN.tr b/mods/homedecor_modpack/fake_fire/locale/fake_fire.zh_CN.tr index 27eeef7f..9538d482 100644 --- a/mods/homedecor_modpack/fake_fire/locale/fake_fire.zh_CN.tr +++ b/mods/homedecor_modpack/fake_fire/locale/fake_fire.zh_CN.tr @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire=冰火 Fancy Fire=花式火 Glowing Embers=发光的余烬 -Ice fire=冰火 -Sandstone chimney top=砂石烟囱顶部 Stone chimney top=鹅卵石烟囱顶部 +Sandstone chimney top=砂石烟囱顶部 diff --git a/mods/homedecor_modpack/fake_fire/locale/template.txt b/mods/homedecor_modpack/fake_fire/locale/template.txt index 61373dcc..d359de6e 100644 --- a/mods/homedecor_modpack/fake_fire/locale/template.txt +++ b/mods/homedecor_modpack/fake_fire/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: fake_fire - - -### init.lua ### - +Ice fire= Fancy Fire= Glowing Embers= -Ice fire= -Sandstone chimney top= Stone chimney top= +Sandstone chimney top= diff --git a/mods/homedecor_modpack/fake_fire/mod.conf b/mods/homedecor_modpack/fake_fire/mod.conf index c3e56ba2..7db49176 100644 --- a/mods/homedecor_modpack/fake_fire/mod.conf +++ b/mods/homedecor_modpack/fake_fire/mod.conf @@ -1,2 +1,2 @@ name = fake_fire -depends = default +depends = homedecor_common diff --git a/mods/homedecor_modpack/homedecor_3d_extras/.luacheckrc b/mods/homedecor_modpack/homedecor_3d_extras/.luacheckrc deleted file mode 100644 index f3a5fb28..00000000 --- a/mods/homedecor_modpack/homedecor_3d_extras/.luacheckrc +++ /dev/null @@ -1,18 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_3d_extras/init.lua b/mods/homedecor_modpack/homedecor_3d_extras/init.lua index 53d75545..563445f2 100644 --- a/mods/homedecor_modpack/homedecor_3d_extras/init.lua +++ b/mods/homedecor_modpack/homedecor_3d_extras/init.lua @@ -1,14 +1,16 @@ -minetest.override_item("default:bookshelf", { - drawtype = "mesh", - mesh = "homedecor_3d_bookshelf.obj", - tiles = { - "default_wood.png", - "default_wood.png^homedecor_3d_bookshelf_inside_back.png", - "homedecor_3d_bookshelf_books.png", - }, - paramtype = "light", - paramtype2 = "facedir", -}) +if minetest.get_modpath("default") then + minetest.override_item("default:bookshelf", { + drawtype = "mesh", + mesh = "homedecor_3d_bookshelf.obj", + tiles = { + "default_wood.png", + "default_wood.png^homedecor_3d_bookshelf_inside_back.png", + "homedecor_3d_bookshelf_books.png", + }, + paramtype = "light", + paramtype2 = "facedir", + }) +end if minetest.get_modpath("vessels") then minetest.override_item("vessels:shelf", { @@ -21,7 +23,7 @@ if minetest.get_modpath("vessels") then }, paramtype = "light", paramtype2 = "facedir", - use_texture_alpha = true + use_texture_alpha = "blend", }) local sbox = { @@ -35,7 +37,7 @@ if minetest.get_modpath("vessels") then tiles = {"homedecor_3d_vessels_shelf_glass.png"}, inventory_image = "homedecor_3d_vessels_glass_bottle_inv.png", wield_image = "homedecor_3d_vessels_glass_bottle_inv.png", - use_texture_alpha = true, + use_texture_alpha = "blend", selection_box = sbox }) @@ -54,7 +56,7 @@ if minetest.get_modpath("vessels") then tiles = {"homedecor_3d_vessels_shelf_glass.png"}, inventory_image = "homedecor_3d_vessels_drinking_glass_inv.png", wield_image = "homedecor_3d_vessels_drinking_glass_inv.png", - use_texture_alpha = true, + use_texture_alpha = "blend", selection_box = sbox }) end @@ -92,16 +94,22 @@ if minetest.get_modpath("doors") then local def for _,mat in ipairs({"wood", "steel"}) do def = table.copy(minetest.registered_nodes["doors:door_"..mat.."_a"]) + def.groups.handy = 1 + def._mcl_hardness=0.6 def.mesh = "homedecor_3d_door_"..mat.."_a.obj" minetest.register_node(":doors:door_"..mat.."_a", def) def = table.copy(minetest.registered_nodes["doors:door_"..mat.."_b"]) + def.groups.handy = 1 + def._mcl_hardness=0.6 def.mesh = "homedecor_3d_door_"..mat.."_b.obj" minetest.register_node(":doors:door_"..mat.."_b", def) end for _,mat in ipairs({"", "_steel"}) do def = table.copy(minetest.registered_nodes["doors:trapdoor"..mat]) + def.groups.handy = 1 + def._mcl_hardness=0.6 def.drawtype = "mesh" def.mesh = "homedecor_3d_trapdoor"..mat..".obj" def.tiles = { @@ -111,6 +119,8 @@ if minetest.get_modpath("doors") then minetest.register_node(":doors:trapdoor"..mat, def) def = table.copy(minetest.registered_nodes["doors:trapdoor"..mat.."_open"]) + def.groups.handy = 1 + def._mcl_hardness=0.6 def.mesh = "homedecor_3d_trapdoor"..mat.."_open.obj" def.drawtype = "mesh" def.tiles = { diff --git a/mods/homedecor_modpack/homedecor_3d_extras/mod.conf b/mods/homedecor_modpack/homedecor_3d_extras/mod.conf index 4cfc7c1c..74535dcc 100644 --- a/mods/homedecor_modpack/homedecor_3d_extras/mod.conf +++ b/mods/homedecor_modpack/homedecor_3d_extras/mod.conf @@ -1,4 +1,3 @@ name = homedecor_3d_extras description = Homedecor Mod: 3d extras -depends = default -optional_depends = vessels, moreblocks, doors +optional_depends = vessels, moreblocks, doors, default diff --git a/mods/homedecor_modpack/homedecor_bathroom/.luacheckrc b/mods/homedecor_modpack/homedecor_bathroom/.luacheckrc deleted file mode 100644 index 53ea7014..00000000 --- a/mods/homedecor_modpack/homedecor_bathroom/.luacheckrc +++ /dev/null @@ -1,22 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", - "unifieddyes", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_bathroom/init.lua b/mods/homedecor_modpack/homedecor_bathroom/init.lua index c344bbdb..cd2e1e5e 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/init.lua +++ b/mods/homedecor_modpack/homedecor_bathroom/init.lua @@ -2,7 +2,10 @@ local S = minetest.get_translator("homedecor_bathroom") local sc_disallow = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil -minetest.register_node(":homedecor:bathroom_tiles_dark", { +local wood_tex = homedecor.textures.wood.apple.planks +local water_tex = homedecor.textures.water.tile + +homedecor.register("bathroom_tiles_dark", { description = S("Bathroom/kitchen tiles (dark)"), tiles = { "homedecor_bathroom_tiles_bg.png" @@ -13,13 +16,24 @@ minetest.register_node(":homedecor:bathroom_tiles_dark", { paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - groups = {cracky=3, ud_param2_colorable = 1}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, ud_param2_colorable = 1, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_construct = unifieddyes.on_construct, on_dig = unifieddyes.on_dig, + crafts = { + { + output = "homedecor:bathroom_tiles_dark 4", + recipe = { + { "group:marble", "group:marble", "" }, + { "group:marble", "group:marble", "dye_dark_grey" } + }, + } + } }) -minetest.register_node(":homedecor:bathroom_tiles_medium", { +homedecor.register("bathroom_tiles_medium", { description = S("Bathroom/kitchen tiles (medium)"), tiles = { "homedecor_bathroom_tiles_bg.png" @@ -30,13 +44,24 @@ minetest.register_node(":homedecor:bathroom_tiles_medium", { paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - groups = {cracky=3, ud_param2_colorable = 1}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, ud_param2_colorable = 1, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_construct = unifieddyes.on_construct, on_dig = unifieddyes.on_dig, + crafts = { + { + output = "homedecor:bathroom_tiles_medium 4", + recipe = { + { "group:marble", "group:marble", "" }, + { "group:marble", "group:marble", "dye_grey" } + }, + } + } }) -minetest.register_node(":homedecor:bathroom_tiles_light", { +homedecor.register("bathroom_tiles_light", { description = S("Bathroom/kitchen tiles (light)"), tiles = { "homedecor_bathroom_tiles_bg.png" @@ -47,10 +72,21 @@ minetest.register_node(":homedecor:bathroom_tiles_light", { paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - groups = {cracky=3, ud_param2_colorable = 1}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, ud_param2_colorable = 1, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_construct = unifieddyes.on_construct, on_dig = unifieddyes.on_dig, + crafts = { + { + output = "homedecor:bathroom_tiles_light 4", + recipe = { + { "group:marble", "group:marble" }, + { "group:marble", "group:marble" } + }, + } + } }) local tr_cbox = { @@ -63,20 +99,30 @@ homedecor.register("towel_rod", { mesh = "homedecor_towel_rod.obj", tiles = { "homedecor_generic_terrycloth.png", - "default_wood.png", + wood_tex, }, inventory_image = "homedecor_towel_rod_inv.png", selection_box = tr_cbox, walkable = false, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3}, - sounds = default.node_sound_defaults(), + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,dig_tree=2}, + _sound_def = { + key = "node_sound_default", + }, + crafts = { + { + recipe = { + { "group:wood", "group:stick", "group:wood" }, + { "", "building_blocks:terrycloth_towel", "" }, + }, + } + } }) homedecor.register("medicine_cabinet", { description = S("Medicine cabinet"), mesh = "homedecor_medicine_cabinet.obj", tiles = { - 'default_wood.png', + wood_tex, 'homedecor_medicine_cabinet_mirror.png' }, inventory_image = "homedecor_medicine_cabinet_inv.png", @@ -85,8 +131,10 @@ homedecor.register("medicine_cabinet", { fixed = {-0.3125, -0.1875, 0.3125, 0.3125, 0.5, 0.5} }, walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_stone = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, on_punch = function(pos, node, puncher, pointed_thing) node.name = "homedecor:medicine_cabinet_open" minetest.swap_node(pos, node) @@ -99,12 +147,21 @@ homedecor.register("medicine_cabinet", { inventory = { size=6, }, + crafts = { + { + recipe = { + { "group:stick", "glass_block", "group:stick" }, + { "group:stick", "glass_block", "group:stick" }, + { "group:stick", "glass_block", "group:stick" } + }, + } + } }) homedecor.register("medicine_cabinet_open", { mesh = "homedecor_medicine_cabinet_open.obj", tiles = { - 'default_wood.png', + wood_tex, 'homedecor_medicine_cabinet_mirror.png', 'homedecor_medicine_cabinet_inside.png' }, @@ -113,7 +170,7 @@ homedecor.register("medicine_cabinet_open", { fixed = {-0.3125, -0.1875, -0.25, 0.3125, 0.5, 0.5} }, walkable = false, - groups = { snappy = 3, not_in_creative_inventory=1 }, + groups = { snappy = 3, not_in_creative_inventory=1, dig_stone = 2 }, drop = "homedecor:medicine_cabinet", on_punch = function(pos, node, puncher, pointed_thing) node.name = "homedecor:medicine_cabinet" @@ -151,12 +208,23 @@ homedecor.register("toilet", { }, selection_box = toilet_sbox, node_box = toilet_cbox, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) node.name = "homedecor:toilet_open" minetest.set_node(pos, node) - end + end, + crafts = { + { + recipe = { + { "","","water_bucket"}, + { "group:marble","group:marble", "group:marble" }, + { "", "empty_bucket", "" }, + }, + } + } }) homedecor.register("toilet_open", { @@ -165,14 +233,17 @@ homedecor.register("toilet_open", { "building_blocks_marble.png", "building_blocks_marble.png", "building_blocks_marble.png", - "default_water.png", + water_tex, { name = "homedecor_generic_metal.png", color = homedecor.color_med_grey } }, selection_box = toilet_sbox, collision_box = toilet_cbox, drop = "homedecor:toilet", - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + use_texture_alpha = "blend", + groups = {cracky=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) node.name = "homedecor:toilet" minetest.set_node(pos, node) @@ -196,13 +267,24 @@ homedecor.register("toilet_paper", { mesh = "homedecor_toilet_paper.obj", tiles = { "homedecor_generic_quilted_paper.png", - "default_wood.png" + wood_tex }, inventory_image = "homedecor_toilet_paper_inv.png", selection_box = tp_cbox, walkable = false, - groups = {snappy=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_defaults(), + groups = {snappy=3,oddly_breakable_by_hand=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_default", + }, + crafts = { + { + recipe = { + { "", "paper", "paper" }, + { "group:wood", "group:stick", "paper" }, + { "", "paper", "paper" }, + }, + } + } }) --Sink @@ -229,16 +311,27 @@ homedecor.register("sink", { tiles = { "building_blocks_marble.png", "building_blocks_marble.png", - "default_water.png" + water_tex }, + use_texture_alpha = "blend", inventory_image="homedecor_bathroom_sink_inv.png", selection_box = sink_sbox, collision_box = sink_cbox, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_destruct = function(pos) homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z}) - end + end, + crafts = { + { + recipe = { + { "group:marble","empty_bucket", "group:marble" }, + { "", "group:marble", "" } + }, + } + } }) --Taps @@ -277,11 +370,20 @@ homedecor.register("taps", { fixed = { -4/16, -7/16, 4/16, 4/16, -4/16, 8/16 }, }, walkable = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_rightclick = taps_on_rightclick, on_destruct = homedecor.stop_particle_spawner, - on_rotate = sc_disallow or nil + on_rotate = sc_disallow or nil, + crafts = { + { + recipe = { + { "steel_ingot","water_bucket", "steel_ingot" }, + }, + } + } }) homedecor.register("taps_brass", { @@ -300,11 +402,20 @@ homedecor.register("taps_brass", { fixed = { -4/16, -7/16, 4/16, 4/16, -4/16, 8/16 }, }, walkable = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_rightclick = taps_on_rightclick, on_destruct = homedecor.stop_particle_spawner, on_rotate = sc_disallow or nil, + crafts = { + { + recipe = { + { "basic_materials:brass_ingot","water_bucket", "basic_materials:brass_ingot" }, + }, + } + } }) --Shower Tray @@ -326,12 +437,21 @@ homedecor.register("shower_tray", { }, }, selection_box = homedecor.nodebox.slab_y(0.1), - groups = {cracky=2}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=2, dig_stone = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_destruct = function(pos) homedecor.stop_particle_spawner({x=pos.x, y=pos.y+2, z=pos.z}) -- the showerhead homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z}) -- the taps, if any - end + end, + crafts = { + { + recipe = { + { "group:marble","empty_bucket", "group:marble" }, + }, + } + } }) --Shower Head @@ -351,7 +471,7 @@ homedecor.register("shower_head", { }, inventory_image = "homedecor_shower_head_inv.png", description = S("Shower Head"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone = 2}, selection_box = sh_cbox, walkable = false, on_rotate = sc_disallow or nil, @@ -374,7 +494,14 @@ homedecor.register("shower_head", { end, on_destruct = function(pos) homedecor.stop_particle_spawner(pos) - end + end, + crafts = { + { + recipe = { + {"steel_ingot", "water_bucket"}, + }, + } + } }) local tub_sbox = { @@ -410,10 +537,21 @@ homedecor.register("bathtub_clawfoot_brass_taps", { "homedecor_bathtub_clawfoot_bottom_inside.png", }, description = S("Bathtub, clawfoot, with brass taps"), - groups = {cracky=3}, + groups = {cracky=3, dig_stone = 2}, selection_box = tub_sbox, node_box = tub_cbox, - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, + crafts = { + { + recipe = { + { "homedecor:taps_brass", "", "" }, + { "group:marble", "", "group:marble" }, + { "steel_ingot", "group:marble", "steel_ingot"}, + }, + } + } }) homedecor.register("bathtub_clawfoot_chrome_taps", { @@ -428,10 +566,21 @@ homedecor.register("bathtub_clawfoot_chrome_taps", { "homedecor_bathtub_clawfoot_bottom_inside.png", }, description = S("Bathtub, clawfoot, with chrome taps"), - groups = {cracky=3}, + groups = {cracky=3, dig_stone = 2}, selection_box = tub_sbox, node_box = tub_cbox, - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, + crafts = { + { + recipe = { + { "homedecor:taps", "", "" }, + { "group:marble", "", "group:marble" }, + {"steel_ingot", "group:marble", "steel_ingot"}, + }, + } + } }) local bs_cbox = { @@ -451,10 +600,21 @@ homedecor.register("bathroom_set", { }, inventory_image = "homedecor_bathroom_set_inv.png", description = S("Bathroom sundries set"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone = 2}, selection_box = bs_cbox, walkable = false, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, + crafts = { + { + recipe = { + { "", "homedecor:glass_table_small_round", "" }, + { "basic_materials:plastic_sheet", "homedecor:glass_table_small_round", "basic_materials:plastic_sheet" }, + { "group:stick", "basic_materials:plastic_sheet", "group:stick" } + }, + } + } }) -- aliases @@ -526,45 +686,7 @@ minetest.register_lbm({ end }) --- crafting - - -minetest.register_craft({ - output = "homedecor:towel_rod", - recipe = { - { "group:wood", "group:stick", "group:wood" }, - { "", "building_blocks:terrycloth_towel", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:toilet_paper", - recipe = { - { "", "default:paper", "default:paper" }, - { "group:wood", "group:stick", "default:paper" }, - { "", "default:paper", "default:paper" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:medicine_cabinet", - recipe = { - { "group:stick", "default:glass", "group:stick" }, - { "group:stick", "default:glass", "group:stick" }, - { "group:stick", "default:glass", "group:stick" } - }, -}) - - --- bathroom/kitchen tiles - -minetest.register_craft( { - output = "homedecor:bathroom_tiles_light 4", - recipe = { - { "group:marble", "group:marble" }, - { "group:marble", "group:marble" } - }, -}) +-- color crafting unifieddyes.register_color_craft({ output = "homedecor:bathroom_tiles_light", @@ -577,14 +699,6 @@ unifieddyes.register_color_craft({ } }) -minetest.register_craft( { - output = "homedecor:bathroom_tiles_medium 4", - recipe = { - { "group:marble", "group:marble", "" }, - { "group:marble", "group:marble", "dye:grey" } - }, -}) - unifieddyes.register_color_craft({ output = "homedecor:bathroom_tiles_medium", palette = "extended", @@ -596,14 +710,6 @@ unifieddyes.register_color_craft({ } }) -minetest.register_craft( { - output = "homedecor:bathroom_tiles_dark 4", - recipe = { - { "group:marble", "group:marble", "" }, - { "group:marble", "group:marble", "dye:dark_grey" } - }, -}) - unifieddyes.register_color_craft({ output = "homedecor:bathroom_tiles_dark", palette = "extended", @@ -615,75 +721,3 @@ unifieddyes.register_color_craft({ } }) -minetest.register_craft({ - output = "homedecor:bathroom_set", - recipe = { - { "", "homedecor:glass_table_small_round", "" }, - { "basic_materials:plastic_sheet", "homedecor:glass_table_small_round", "basic_materials:plastic_sheet" }, - { "group:stick", "basic_materials:plastic_sheet", "group:stick" } - }, -}) - -minetest.register_craft({ - output = "homedecor:toilet", - recipe = { - { "","","bucket:bucket_water"}, - { "group:marble","group:marble", "group:marble" }, - { "", "bucket:bucket_empty", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:sink", - recipe = { - { "group:marble","bucket:bucket_empty", "group:marble" }, - { "", "group:marble", "" } - }, -}) - -minetest.register_craft({ - output = "homedecor:taps", - recipe = { - { "default:steel_ingot","bucket:bucket_water", "default:steel_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:taps_brass", - recipe = { - { "basic_materials:brass_ingot","bucket:bucket_water", "basic_materials:brass_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:shower_tray", - recipe = { - { "group:marble","bucket:bucket_empty", "group:marble" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:shower_head", - recipe = { - {"default:steel_ingot", "bucket:bucket_water"}, - }, -}) - -minetest.register_craft({ - output = "homedecor:bathtub_clawfoot_brass_taps", - recipe = { - { "homedecor:taps_brass", "", "" }, - { "group:marble", "", "group:marble" }, - { "default:steel_ingot", "group:marble", "default:steel_ingot"}, - }, -}) - -minetest.register_craft({ - output = "homedecor:bathtub_clawfoot_chrome_taps", - recipe = { - { "homedecor:taps", "", "" }, - { "group:marble", "", "group:marble" }, - {"default:steel_ingot", "group:marble", "default:steel_ingot"}, - }, -}) - diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.de.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.de.tr index baac732e..9f6cb186 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.de.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.de.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Badezimmerwaschbecken -Bathroom sundries set=Badezimmerkrimskrams -Bathroom taps/faucet=Badezimmerwasserhahn -Bathroom taps/faucet (brass)=Badezimmerwasserhahn (Messing) Bathroom/kitchen tiles (dark)=Badezimmer-/Küchenkacheln (dunkel) -Bathroom/kitchen tiles (light)=Badezimmer-/Küchenkacheln (hell) Bathroom/kitchen tiles (medium)=Badezimmer-/Küchenkacheln (mittel) -Bathtub, clawfoot, with brass taps=Badewanne, Krallenfuß, mit Messingwasserhähnen -Bathtub, clawfoot, with chrome taps=Badewanne, Krallenfuß, mit Chromwasserhähnen +Bathroom/kitchen tiles (light)=Badezimmer-/Küchenkacheln (hell) +Towel rod with towel=Handtuchhalter mit Handtuch Medicine cabinet=Medizinschrank -Shower Head=Duschbrause -Shower Tray=Duschtasse Toilet=Toilette Toilet paper=Toilettenpapier -Towel rod with towel=Handtuchhalter mit Handtuch +Bathroom Sink=Badezimmerwaschbecken +Bathroom taps/faucet=Badezimmerwasserhahn +Bathroom taps/faucet (brass)=Badezimmerwasserhahn (Messing) +Shower Tray=Duschtasse +Shower Head=Duschbrause +Bathtub, clawfoot, with brass taps=Badewanne, Krallenfuß, mit Messingwasserhähnen +Bathtub, clawfoot, with chrome taps=Badewanne, Krallenfuß, mit Chromwasserhähnen +Bathroom sundries set=Badezimmerkrimskrams diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.es.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.es.tr index c105364b..e07cced8 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.es.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.es.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Lavabo de baño -Bathroom sundries set=Artículos de baño -Bathroom taps/faucet=Grifo de baño -Bathroom taps/faucet (brass)=Grifo de baño (latón) Bathroom/kitchen tiles (dark)=Azulejo de baño/cocina (tonos oscuros) -Bathroom/kitchen tiles (light)=Azulejo de baño/cocina (tonos claros) Bathroom/kitchen tiles (medium)=Azulejo de baño/cocina (tonos medios) -Bathtub, clawfoot, with brass taps= -Bathtub, clawfoot, with chrome taps= +Bathroom/kitchen tiles (light)=Azulejo de baño/cocina (tonos claros) +Towel rod with towel=Toallero con toalla Medicine cabinet=Gabinete de medicinas -Shower Head=Ducha -Shower Tray=Plato de ducha Toilet=Inodoro Toilet paper=Papel higiénico -Towel rod with towel=Toallero con toalla +Bathroom Sink=Lavabo de baño +Bathroom taps/faucet=Grifo de baño +Bathroom taps/faucet (brass)=Grifo de baño (latón) +Shower Tray=Plato de ducha +Shower Head=Ducha +Bathtub, clawfoot, with brass taps= +Bathtub, clawfoot, with chrome taps= +Bathroom sundries set=Artículos de baño diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.fr.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.fr.tr index 7f9ceb0b..d8d5d96e 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.fr.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.fr.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Évier -Bathroom sundries set=Miroir et tablette de salle de bain -Bathroom taps/faucet=Robinetterie -Bathroom taps/faucet (brass)=Robinetterie (laiton) Bathroom/kitchen tiles (dark)=Carreaux de salle de bain ou cuisine (foncées) -Bathroom/kitchen tiles (light)=Carreaux de salle de bain ou cuisine (claires) Bathroom/kitchen tiles (medium)=Carreaux de salle de bain ou cuisine (moyennes) -Bathtub, clawfoot, with brass taps=Baignoire sur pieds, avec robinetterie en laiton -Bathtub, clawfoot, with chrome taps=Baignoire sur pieds, avec robinetterie en chrome +Bathroom/kitchen tiles (light)=Carreaux de salle de bain ou cuisine (claires) +Towel rod with towel=Porte serviette et serviette Medicine cabinet=Armoire à pharmacie -Shower Head=Pomme de douche -Shower Tray=Bac de douche Toilet=Toilettes Toilet paper=Papier toilette -Towel rod with towel=Porte serviette et serviette +Bathroom Sink=Évier +Bathroom taps/faucet=Robinetterie +Bathroom taps/faucet (brass)=Robinetterie (laiton) +Shower Tray=Bac de douche +Shower Head=Pomme de douche +Bathtub, clawfoot, with brass taps=Baignoire sur pieds, avec robinetterie en laiton +Bathtub, clawfoot, with chrome taps=Baignoire sur pieds, avec robinetterie en chrome +Bathroom sundries set=Miroir et tablette de salle de bain diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.it.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.it.tr index 2a05cbf4..0a758f80 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.it.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.it.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink= -Bathroom sundries set= -Bathroom taps/faucet= -Bathroom taps/faucet (brass)= Bathroom/kitchen tiles (dark)= -Bathroom/kitchen tiles (light)= Bathroom/kitchen tiles (medium)= -Bathtub, clawfoot, with brass taps= -Bathtub, clawfoot, with chrome taps= +Bathroom/kitchen tiles (light)= +Towel rod with towel= Medicine cabinet=Armadietto sotto il lavandino -Shower Head=Pigna della doccia -Shower Tray=Piatto della doccia Toilet=Water Toilet paper=Water -Towel rod with towel= +Bathroom Sink= +Bathroom taps/faucet= +Bathroom taps/faucet (brass)= +Shower Tray=Piatto della doccia +Shower Head=Pigna della doccia +Bathtub, clawfoot, with brass taps= +Bathtub, clawfoot, with chrome taps= +Bathroom sundries set= diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ms.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ms.tr index ff2b8f04..4e716a8c 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ms.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ms.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Sinki Bilik Mandi -Bathroom sundries set=Set Barangan Bilik Mandi -Bathroom taps/faucet=Kepala Paip Bilik Mandi -Bathroom taps/faucet (brass)=Kepala Paip Bilik Mandi (Loyang) Bathroom/kitchen tiles (dark)=Jubin Dapur/Bilik Mandi (Gelap) -Bathroom/kitchen tiles (light)=Jubin Dapur/Bilik Mandi (Cerah) Bathroom/kitchen tiles (medium)=Jubin Dapur/Bilik Mandi (Biasa) -Bathtub, clawfoot, with brass taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Loyang -Bathtub, clawfoot, with chrome taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Krom +Bathroom/kitchen tiles (light)=Jubin Dapur/Bilik Mandi (Cerah) +Towel rod with towel=Ampaian Beserta Tuala Medicine cabinet=Kabinet Ubat -Shower Head=Kepala Pancuran -Shower Tray=Lubang Air Mandi Toilet=Tandas Toilet paper=Tisu Tandas -Towel rod with towel=Ampaian Beserta Tuala +Bathroom Sink=Sinki Bilik Mandi +Bathroom taps/faucet=Kepala Paip Bilik Mandi +Bathroom taps/faucet (brass)=Kepala Paip Bilik Mandi (Loyang) +Shower Tray=Lubang Air Mandi +Shower Head=Kepala Pancuran +Bathtub, clawfoot, with brass taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Loyang +Bathtub, clawfoot, with chrome taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Krom +Bathroom sundries set=Set Barangan Bilik Mandi diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt.tr index 02ba6f13..707aee6c 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Pia de Banheiro -Bathroom sundries set=Espelho de Banheiro com bancada -Bathroom taps/faucet=Torneira de Banheiro -Bathroom taps/faucet (brass)=Torneira de Banheiro (latão) Bathroom/kitchen tiles (dark)=Azulejo de Banheiro/Cozinha (escuro) -Bathroom/kitchen tiles (light)=Azulejo de Banheiro/Cozinha (claro) Bathroom/kitchen tiles (medium)=Azulejo de Banheiro/Cozinha (médio) -Bathtub, clawfoot, with brass taps= -Bathtub, clawfoot, with chrome taps= +Bathroom/kitchen tiles (light)=Azulejo de Banheiro/Cozinha (claro) +Towel rod with towel=Haste de Toalha com Toalha Medicine cabinet=Armário de remédios -Shower Head=Chuveiro -Shower Tray=Ralo do Chuveiro Toilet=Vaso Sanitário Toilet paper=Papel higiênico -Towel rod with towel=Haste de Toalha com Toalha +Bathroom Sink=Pia de Banheiro +Bathroom taps/faucet=Torneira de Banheiro +Bathroom taps/faucet (brass)=Torneira de Banheiro (latão) +Shower Tray=Ralo do Chuveiro +Shower Head=Chuveiro +Bathtub, clawfoot, with brass taps= +Bathtub, clawfoot, with chrome taps= +Bathroom sundries set=Espelho de Banheiro com bancada diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt_BR.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt_BR.tr index 02ba6f13..707aee6c 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.pt_BR.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Pia de Banheiro -Bathroom sundries set=Espelho de Banheiro com bancada -Bathroom taps/faucet=Torneira de Banheiro -Bathroom taps/faucet (brass)=Torneira de Banheiro (latão) Bathroom/kitchen tiles (dark)=Azulejo de Banheiro/Cozinha (escuro) -Bathroom/kitchen tiles (light)=Azulejo de Banheiro/Cozinha (claro) Bathroom/kitchen tiles (medium)=Azulejo de Banheiro/Cozinha (médio) -Bathtub, clawfoot, with brass taps= -Bathtub, clawfoot, with chrome taps= +Bathroom/kitchen tiles (light)=Azulejo de Banheiro/Cozinha (claro) +Towel rod with towel=Haste de Toalha com Toalha Medicine cabinet=Armário de remédios -Shower Head=Chuveiro -Shower Tray=Ralo do Chuveiro Toilet=Vaso Sanitário Toilet paper=Papel higiênico -Towel rod with towel=Haste de Toalha com Toalha +Bathroom Sink=Pia de Banheiro +Bathroom taps/faucet=Torneira de Banheiro +Bathroom taps/faucet (brass)=Torneira de Banheiro (latão) +Shower Tray=Ralo do Chuveiro +Shower Head=Chuveiro +Bathtub, clawfoot, with brass taps= +Bathtub, clawfoot, with chrome taps= +Bathroom sundries set=Espelho de Banheiro com bancada diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ru.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ru.tr index 39a7d1a9..f59f1a89 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ru.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.ru.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=Раковина для ванной комнаты -Bathroom sundries set=Набор для ванных комнат -Bathroom taps/faucet=м -Bathroom taps/faucet (brass)=Краны(смесители) для ванной комнаты (латунь) Bathroom/kitchen tiles (dark)=Плитка для ванной/кухни (тёмная) -Bathroom/kitchen tiles (light)=Плитка для ванной/кухни (светлая) Bathroom/kitchen tiles (medium)=Плитка для ванной/кухни (обычная) -Bathtub, clawfoot, with brass taps=Ванна на острых ножках с латунными кранами -Bathtub, clawfoot, with chrome taps=Ванна на острых ножках с хромированными кранами +Bathroom/kitchen tiles (light)=Плитка для ванной/кухни (светлая) +Towel rod with towel=Полотенцедержатель с полотенцем Medicine cabinet=Медицинский кабинет -Shower Head=Душевая лейка -Shower Tray=Душевой поддон Toilet=Туалет Toilet paper=Туалетная бумага -Towel rod with towel=Полотенцедержатель с полотенцем +Bathroom Sink=Раковина для ванной комнаты +Bathroom taps/faucet=м +Bathroom taps/faucet (brass)=Краны(смесители) для ванной комнаты (латунь) +Shower Tray=Душевой поддон +Shower Head=Душевая лейка +Bathtub, clawfoot, with brass taps=Ванна на острых ножках с латунными кранами +Bathtub, clawfoot, with chrome taps=Ванна на острых ножках с хромированными кранами +Bathroom sundries set=Набор для ванных комнат diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.zh_CN.tr b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.zh_CN.tr index 97be2034..8577f635 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/homedecor_bathroom.zh_CN.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink=浴室水槽 -Bathroom sundries set=浴室杂物套装 -Bathroom taps/faucet=浴室水龙头 -Bathroom taps/faucet (brass)=黄铜浴室水龙头 Bathroom/kitchen tiles (dark)=深色浴室/厨房瓷砖 -Bathroom/kitchen tiles (light)=浅色浴室/厨房瓷砖 Bathroom/kitchen tiles (medium)=浴室/厨房瓷砖 -Bathtub, clawfoot, with brass taps=带黄铜水龙头的浴缸 -Bathtub, clawfoot, with chrome taps=带镀铬水龙头的浴缸 +Bathroom/kitchen tiles (light)=浅色浴室/厨房瓷砖 +Towel rod with towel=毛巾杆 Medicine cabinet=药柜 -Shower Head=淋浴喷头 -Shower Tray=淋浴盆 Toilet=卫生间 Toilet paper=厕纸 -Towel rod with towel=毛巾杆 +Bathroom Sink=浴室水槽 +Bathroom taps/faucet=浴室水龙头 +Bathroom taps/faucet (brass)=黄铜浴室水龙头 +Shower Tray=淋浴盆 +Shower Head=淋浴喷头 +Bathtub, clawfoot, with brass taps=带黄铜水龙头的浴缸 +Bathtub, clawfoot, with chrome taps=带镀铬水龙头的浴缸 +Bathroom sundries set=浴室杂物套装 diff --git a/mods/homedecor_modpack/homedecor_bathroom/locale/template.txt b/mods/homedecor_modpack/homedecor_bathroom/locale/template.txt index a692126b..5a41804c 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_bathroom/locale/template.txt @@ -1,20 +1,16 @@ # textdomain: homedecor_bathroom - - -### init.lua ### - -Bathroom Sink= -Bathroom sundries set= -Bathroom taps/faucet= -Bathroom taps/faucet (brass)= Bathroom/kitchen tiles (dark)= -Bathroom/kitchen tiles (light)= Bathroom/kitchen tiles (medium)= -Bathtub, clawfoot, with brass taps= -Bathtub, clawfoot, with chrome taps= +Bathroom/kitchen tiles (light)= +Towel rod with towel= Medicine cabinet= -Shower Head= -Shower Tray= Toilet= Toilet paper= -Towel rod with towel= +Bathroom Sink= +Bathroom taps/faucet= +Bathroom taps/faucet (brass)= +Shower Tray= +Shower Head= +Bathtub, clawfoot, with brass taps= +Bathtub, clawfoot, with chrome taps= +Bathroom sundries set= diff --git a/mods/homedecor_modpack/homedecor_bathroom/mod.conf b/mods/homedecor_modpack/homedecor_bathroom/mod.conf index 66e6c7fb..aa09c645 100644 --- a/mods/homedecor_modpack/homedecor_bathroom/mod.conf +++ b/mods/homedecor_modpack/homedecor_bathroom/mod.conf @@ -1,4 +1,4 @@ name = homedecor_bathroom description = Homedecor mod: bathroom -depends = homedecor_common, default, basic_materials, unifieddyes, building_blocks -optional_depends = bucket, homedecor_fences, screwdriver +depends = homedecor_common +optional_depends = bucket, homedecor_fences, screwdriver, default, basic_materials, unifieddyes, building_blocks diff --git a/mods/homedecor_modpack/homedecor_bedroom/.luacheckrc b/mods/homedecor_modpack/homedecor_bedroom/.luacheckrc deleted file mode 100644 index 53ea7014..00000000 --- a/mods/homedecor_modpack/homedecor_bedroom/.luacheckrc +++ /dev/null @@ -1,22 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", - "unifieddyes", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_bedroom/init.lua b/mods/homedecor_modpack/homedecor_bedroom/init.lua index aea1f8ca..f0a6cddf 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/init.lua +++ b/mods/homedecor_modpack/homedecor_bedroom/init.lua @@ -2,6 +2,8 @@ local S = minetest.get_translator("homedecor_bedroom") local sc_disallow = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil +local wood_tex, wool_tex = homedecor.textures.wood.apple.planks, homedecor.textures.wool.white + local bed_sbox = { type = "wallmounted", wall_side = { -0.5, -0.5, -0.5, 0.5, 0.5, 1.5 } @@ -31,26 +33,29 @@ local kbed_cbox = { } -local bed_on_rightclick = minetest.registered_nodes["beds:bed"].on_rightclick +local bed_def = minetest.registered_nodes["beds:bed"] +local bed_on_rightclick = bed_def and bed_def.on_rightclick or nil homedecor.register("bed_regular", { mesh = "homedecor_bed_regular.obj", tiles = { { name = "homedecor_bed_frame.png", color = 0xffffffff }, - { name = "default_wood.png", color = 0xffffffff }, - { name = "wool_white.png", color = 0xffffffff }, - "wool_white.png", + { name = wood_tex, color = 0xffffffff }, + { name = wool_tex, color = 0xffffffff }, + wool_tex, { name = "homedecor_bed_bottom.png", color = 0xffffffff }, - "wool_white.png^[brighten", -- pillow + wool_tex.."^[brighten", -- pillow }, inventory_image = "homedecor_bed_inv.png", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", description = S("Bed"), - groups = {snappy=3, ud_param2_colorable = 1}, + groups = {snappy=3, ud_param2_colorable = 1, dig_generic=2}, selection_box = bed_sbox, node_box = bed_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = sc_disallow or nil, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) @@ -66,30 +71,40 @@ homedecor.register("bed_regular", { local itemname = itemstack:get_name() if itemname == "homedecor:bed_regular" then homedecor.bed_expansion(pos, clicker, itemstack, pointed_thing, true) - return itemstack - else + elseif bed_on_rightclick then bed_on_rightclick(pos, node, clicker) - return itemstack end - end + return itemstack + end, + crafts = { + { + recipe = { + { "group:stick", "", "group:stick" }, + { "wool_white", "wool_white", "wool_white" }, + { "group:wood", "", "group:wood" }, + }, + } + } }) homedecor.register("bed_extended", { mesh = "homedecor_bed_extended.obj", tiles = { { name = "homedecor_bed_frame.png", color = 0xffffffff }, - { name = "default_wood.png", color = 0xffffffff }, - { name = "wool_white.png", color = 0xffffffff }, - "wool_white.png", + { name = wood_tex, color = 0xffffffff }, + { name = wool_tex, color = 0xffffffff }, + wool_tex, { name = "homedecor_bed_bottom.png", color = 0xffffffff }, - "wool_white.png^[brighten", + wool_tex.."^[brighten", }, paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", selection_box = bed_sbox, node_box = bed_cbox, - groups = {snappy=3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, ud_param2_colorable = 1, dig_generic=2, not_in_creative_inventory=1}, + _sound_def = { + key = "node_sound_wood_defaults", + }, expand = { forward = "air" }, on_rotate = sc_disallow or nil, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -97,7 +112,9 @@ homedecor.register("bed_extended", { end, on_dig = unifieddyes.on_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - bed_on_rightclick(pos, node, clicker) + if bed_on_rightclick then + bed_on_rightclick(pos, node, clicker) + end return itemstack end, drop = "homedecor:bed_regular" @@ -107,20 +124,22 @@ homedecor.register("bed_kingsize", { mesh = "homedecor_bed_kingsize.obj", tiles = { { name = "homedecor_bed_frame.png", color = 0xffffffff }, - { name = "default_wood.png", color = 0xffffffff }, - { name = "wool_white.png", color = 0xffffffff }, - "wool_white.png", + { name = wood_tex, color = 0xffffffff }, + { name = wool_tex, color = 0xffffffff }, + wool_tex, { name = "homedecor_bed_bottom.png", color = 0xffffffff }, - "wool_white.png^[brighten", + wool_tex.."^[brighten", }, paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", inventory_image = "homedecor_bed_kingsize_inv.png", description = S("Bed (king sized)"), - groups = {snappy=3, ud_param2_colorable = 1}, + groups = {snappy=3, ud_param2_colorable = 1, dig_generic=2}, selection_box = kbed_sbox, node_box = kbed_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = sc_disallow or nil, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) @@ -134,9 +153,18 @@ homedecor.register("bed_kingsize", { end, on_dig = unifieddyes.on_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - bed_on_rightclick(pos, node, clicker) + if bed_on_rightclick then + bed_on_rightclick(pos, node, clicker) + end return itemstack end, + crafts = { + { + recipe = { + { "homedecor:bed_regular", "homedecor:bed_regular" } + }, + } + } }) for w, d in pairs({ ["mahogany"] = S("mahogany"), ["oak"] = S("oak") }) do @@ -159,8 +187,10 @@ for w, d in pairs({ ["mahogany"] = S("mahogany"), ["oak"] = S("oak") }) do { -8/16, -8/16, -30/64, 8/16, -7/16, 8/16 } -- bottom } }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = { type = "regular" }, infotext=S("One-drawer Nightstand"), inventory = { @@ -185,8 +215,10 @@ for w, d in pairs({ ["mahogany"] = S("mahogany"), ["oak"] = S("oak") }) do { -7/16, -7/16, -32/64, 7/16, -1/16, -29/64 }, -- bottom drawer face } }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = { type = "regular" }, infotext=S("Two-drawer Nightstand"), inventory = { @@ -318,7 +350,7 @@ minetest.register_craft( { output = "homedecor:nightstand_mahogany_one_drawer", recipe = { "homedecor:nightstand_oak_one_drawer", - "dye:brown", + homedecor.materials.dye_brown, }, }) @@ -333,7 +365,7 @@ minetest.register_craft( { output = "homedecor:nightstand_mahogany_two_drawers", recipe = { "homedecor:nightstand_oak_two_drawers", - "dye:brown", + homedecor.materials.dye_brown, }, }) @@ -343,16 +375,6 @@ minetest.register_craft({ burntime = 30, }) - -minetest.register_craft( { - output = "homedecor:bed_regular", - recipe = { - { "group:stick", "", "group:stick" }, - { "wool:white", "wool:white", "wool:white" }, - { "group:wood", "", "group:wood" }, - }, -}) - unifieddyes.register_color_craft({ output = "homedecor:bed_regular", palette = "wallmounted", @@ -364,13 +386,6 @@ unifieddyes.register_color_craft({ } }) -minetest.register_craft( { - output = "homedecor:bed_kingsize", - recipe = { - { "homedecor:bed_regular", "homedecor:bed_regular" } - }, -}) - unifieddyes.register_color_craft({ output = "homedecor:bed_kingsize", palette = "wallmounted", diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.de.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.de.tr index acb76680..2cea6e60 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.de.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.de.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Bett Bed (king sized)=Breites Doppelbett -Nightstand with One Drawer (@1)=Nachttisch mit einer Schublade (@1) -Nightstand with Two Drawers (@1)=Nachttisch mit zwei Schubladen (@1) -One-drawer Nightstand=Nachttisch mit einer Schublade -Two-drawer Nightstand=Nachttisch mit zwei Schubladen mahogany=Mahagoni oak=Eiche +Nightstand with One Drawer (@1)=Nachttisch mit einer Schublade (@1) +One-drawer Nightstand=Nachttisch mit einer Schublade +Nightstand with Two Drawers (@1)=Nachttisch mit zwei Schubladen (@1) +Two-drawer Nightstand=Nachttisch mit zwei Schubladen diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.es.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.es.tr index 4b358a2b..37b7b21d 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.es.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.es.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Cama Bed (king sized)=Cama (tamaño grande) -Nightstand with One Drawer (@1)=Mesa de luz con un cajón (@1) -Nightstand with Two Drawers (@1)=Mesa de luz con dos cajones (@1) -One-drawer Nightstand=Mesa de luz con un cajón -Two-drawer Nightstand=Mesa de luz con dos cajones mahogany=caoba oak=roble +Nightstand with One Drawer (@1)=Mesa de luz con un cajón (@1) +One-drawer Nightstand=Mesa de luz con un cajón +Nightstand with Two Drawers (@1)=Mesa de luz con dos cajones (@1) +Two-drawer Nightstand=Mesa de luz con dos cajones diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.fr.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.fr.tr index df7e2986..049888c2 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.fr.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.fr.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Lit Bed (king sized)=Grand lit -Nightstand with One Drawer (@1)=Meuble de chevet avec un tiroir (@1) -Nightstand with Two Drawers (@1)=Meuble de chevet avec deux tiroirs (@1) -One-drawer Nightstand=Meuble de chevet avec un tiroir -Two-drawer Nightstand=Meuble de chevet avec deux tiroirs mahogany=acajou oak=chêne +Nightstand with One Drawer (@1)=Meuble de chevet avec un tiroir (@1) +One-drawer Nightstand=Meuble de chevet avec un tiroir +Nightstand with Two Drawers (@1)=Meuble de chevet avec deux tiroirs (@1) +Two-drawer Nightstand=Meuble de chevet avec deux tiroirs diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.it.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.it.tr index 346563c5..79b6547d 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.it.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.it.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=rosso Bed (king sized)= -Nightstand with One Drawer (@1)=Comodino in quercia con un cassetto -Nightstand with Two Drawers (@1)=Comodino in quercia con due cassetti -One-drawer Nightstand=Comodino a singolo cassetto -Two-drawer Nightstand=Comodino a doppio cassetto mahogany= oak= +Nightstand with One Drawer (@1)=Comodino in quercia con un cassetto (@1) +One-drawer Nightstand=Comodino a singolo cassetto +Nightstand with Two Drawers (@1)=Comodino in quercia con due cassetti (@1) +Two-drawer Nightstand=Comodino a doppio cassetto diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ms.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ms.tr index 67cf8273..c6a8ddf8 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ms.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ms.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Katil Bed (king sized)=Katil Raja -Nightstand with One Drawer (@1)=Kabinet Katil dengan Satu Laci (@1) -Nightstand with Two Drawers (@1)=Kabinet Katil dengan Dua Laci (@1) -One-drawer Nightstand=Kabinet Katil Satu Laci -Two-drawer Nightstand=Kabinet Katil Dua Laci mahogany=Mahogani oak=Oak +Nightstand with One Drawer (@1)=Kabinet Katil dengan Satu Laci (@1) +One-drawer Nightstand=Kabinet Katil Satu Laci +Nightstand with Two Drawers (@1)=Kabinet Katil dengan Dua Laci (@1) +Two-drawer Nightstand=Kabinet Katil Dua Laci diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt.tr index bbd59a94..09bcbc7d 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Cama Bed (king sized)=Cama (tamanho king) -Nightstand with One Drawer (@1)=Mesa de Cabeceira com Gaveta (@1) -Nightstand with Two Drawers (@1)=Mesa de Cabeceira com Duas Gavetas (@1) -One-drawer Nightstand=Mesinha de Uma Gaveta -Two-drawer Nightstand=Mesinha de Duas Gavetas mahogany=mogno oak=carvalho +Nightstand with One Drawer (@1)=Mesa de Cabeceira com Gaveta (@1) +One-drawer Nightstand=Mesinha de Uma Gaveta +Nightstand with Two Drawers (@1)=Mesa de Cabeceira com Duas Gavetas (@1) +Two-drawer Nightstand=Mesinha de Duas Gavetas diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt_BR.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt_BR.tr index bbd59a94..09bcbc7d 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.pt_BR.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Cama Bed (king sized)=Cama (tamanho king) -Nightstand with One Drawer (@1)=Mesa de Cabeceira com Gaveta (@1) -Nightstand with Two Drawers (@1)=Mesa de Cabeceira com Duas Gavetas (@1) -One-drawer Nightstand=Mesinha de Uma Gaveta -Two-drawer Nightstand=Mesinha de Duas Gavetas mahogany=mogno oak=carvalho +Nightstand with One Drawer (@1)=Mesa de Cabeceira com Gaveta (@1) +One-drawer Nightstand=Mesinha de Uma Gaveta +Nightstand with Two Drawers (@1)=Mesa de Cabeceira com Duas Gavetas (@1) +Two-drawer Nightstand=Mesinha de Duas Gavetas diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ru.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ru.tr index 8640c6f3..46e43017 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ru.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.ru.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=Кровать Bed (king sized)=Кровать (большая) -Nightstand with One Drawer (@1)=Тумба с одним ящиком (@1) -Nightstand with Two Drawers (@1)=Тумба с двумя ящиками (@1) -One-drawer Nightstand=Тумба с одним ящиком -Two-drawer Nightstand=Тумба с двумя ящиками mahogany=красное дерево oak=дуб +Nightstand with One Drawer (@1)=Тумба с одним ящиком (@1) +One-drawer Nightstand=Тумба с одним ящиком +Nightstand with Two Drawers (@1)=Тумба с двумя ящиками (@1) +Two-drawer Nightstand=Тумба с двумя ящиками diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.zh_CN.tr b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.zh_CN.tr index 8e979775..dfc81c22 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/homedecor_bedroom.zh_CN.tr @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed=床 Bed (king sized)=双人床 -Nightstand with One Drawer (@1)=带一个抽屉的床头柜(@1) -Nightstand with Two Drawers (@1)=带两个抽屉的床头柜(@1) -One-drawer Nightstand=单抽屉床头柜 -Two-drawer Nightstand=两抽屉床头柜 mahogany=桃花心木 oak=橡木 +Nightstand with One Drawer (@1)=带一个抽屉的床头柜(@1) +One-drawer Nightstand=单抽屉床头柜 +Nightstand with Two Drawers (@1)=带两个抽屉的床头柜(@1) +Two-drawer Nightstand=两抽屉床头柜 diff --git a/mods/homedecor_modpack/homedecor_bedroom/locale/template.txt b/mods/homedecor_modpack/homedecor_bedroom/locale/template.txt index 2adeadb1..a9fb6f68 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_bedroom/locale/template.txt @@ -1,13 +1,9 @@ # textdomain: homedecor_bedroom - - -### init.lua ### - Bed= Bed (king sized)= -Nightstand with One Drawer (@1)= -Nightstand with Two Drawers (@1)= -One-drawer Nightstand= -Two-drawer Nightstand= mahogany= oak= +Nightstand with One Drawer (@1)= +One-drawer Nightstand= +Nightstand with Two Drawers (@1)= +Two-drawer Nightstand= diff --git a/mods/homedecor_modpack/homedecor_bedroom/mod.conf b/mods/homedecor_modpack/homedecor_bedroom/mod.conf index 78d24766..a0763b13 100644 --- a/mods/homedecor_modpack/homedecor_bedroom/mod.conf +++ b/mods/homedecor_modpack/homedecor_bedroom/mod.conf @@ -1,4 +1,4 @@ name = homedecor_bedroom description = Homedecor mod: bedroom -depends = homedecor_common, default, basic_materials, unifieddyes, creative, beds -optional_depends = screwdriver +depends = homedecor_common +optional_depends = screwdriver, default, basic_materials, unifieddyes, creative, beds diff --git a/mods/homedecor_modpack/homedecor_books/.luacheckrc b/mods/homedecor_modpack/homedecor_books/.luacheckrc deleted file mode 100644 index f729bf5a..00000000 --- a/mods/homedecor_modpack/homedecor_books/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "creative", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_books/init.lua b/mods/homedecor_modpack/homedecor_books/init.lua index 59ed57b4..a34cc3b1 100644 --- a/mods/homedecor_modpack/homedecor_books/init.lua +++ b/mods/homedecor_modpack/homedecor_books/init.lua @@ -81,7 +81,7 @@ for _, c in ipairs(bookcolors) do name = "homedecor:book_"..color, param2 = fdir, }) - local text = itemstack:get_metadata() or "" + local text = itemstack:get_meta():get_string("") local meta = minetest.get_meta(pos) local data = minetest.deserialize(text) or {} if type(data) ~= "table" then @@ -97,7 +97,7 @@ for _, c in ipairs(bookcolors) do if data.title and data.title ~= "" then meta:set_string("infotext", data.title) end - if not creative.is_enabled_for(plname) then + if not minetest.is_creative_enabled(plname) then itemstack:take_item() end return itemstack @@ -128,16 +128,15 @@ for _, c in ipairs(bookcolors) do local owner = meta:get_string("owner") or "" local formspec if owner == "" or owner == player_name then - formspec = "size[8,8]"..default.gui_bg..default.gui_bg_img.. + formspec = "size[8,8]".. "field[0.5,1;7.5,0;title;Book title :;".. minetest.formspec_escape(title).."]".. "textarea[0.5,1.5;7.5,7;text;Book content :;".. minetest.formspec_escape(text).."]".. "button_exit[2.5,7.5;3,1;save;Save]" else - formspec = "size[8,8]"..default.gui_bg.. + formspec = "size[8,8]".. "button_exit[7,0.25;1,0.5;close;X]".. - default.gui_bg_img.. "label[0.5,0.5;by "..owner.."]".. "label[0.5,0;"..minetest.formspec_escape(title).."]".. "textarea[0.5,1.5;7.5,7;;"..minetest.formspec_escape(text)..";]" @@ -167,7 +166,7 @@ for _, c in ipairs(bookcolors) do output = "homedecor:book_"..color, recipe = { "dye:"..color, - "default:book" + homedecor.materials.book }, }) @@ -194,8 +193,8 @@ minetest.register_on_player_receive_fields(function(player, form_name, fields) if (fields.title or "") ~= "" then meta:set_string("infotext", fields.title) end - minetest.log("action", S("@1 has written in a book (title: \"@2\"): \"@3\" at location @4", - player:get_player_name(), fields.title, fields.text, minetest.pos_to_string(player:getpos()))) + minetest.log("action", ("%s has written in a book (title: \"%s\"): \"%s\" at location %s"):format( + player:get_player_name(), fields.title, fields.text, minetest.pos_to_string(pos))) player_current_book[player_name] = nil return true diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.de.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.de.tr index 7121d9ae..dfc6142c 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.de.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.de.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 hat in ein Buch geschrieben (Titel: „@2”): „@3” am Ort @4 -Writable Book (@1)=Schreibbares Buch (@1) -blue=blau -brown=braun -green=grün -grey=grau red=rot +green=grün +blue=blau violet=violett +grey=grau +brown=braun +Writable Book (@1)=Schreibbares Buch (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.es.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.es.tr index 712cedfb..f56d0458 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.es.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.es.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 ha escrito en un libro (título: "@2"): "@3" en la ubicación @4 -Writable Book (@1)=Libro (@1) -blue=azul -brown=marrón -green=verde -grey=gris red=roja +green=verde +blue=azul violet=violeta +grey=gris +brown=marrón +Writable Book (@1)=Libro (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.fr.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.fr.tr index e26bf46b..1d78dea2 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.fr.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.fr.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 a écrit dans un livre (titre: "@2"): "@3" à l'emplacement @4 -Writable Book (@1)=Livre inscriptible (@1) -blue=bleu -brown=marron -green=vert -grey=vert red=rouge +green=vert +blue=bleu violet=violet +grey=vert +brown=marron +Writable Book (@1)=Livre inscriptible (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.it.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.it.tr index f193ebb5..192dacf3 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.it.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.it.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4= -Writable Book (@1)=Gambe in ottone del tavolo (@1) -blue=blu -brown= -green=verde -grey=verde scuro red=rosso +green=verde +blue=blu violet=viola +grey=verde scuro +brown= +Writable Book (@1)=Gambe in ottone del tavolo (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ms.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ms.tr index df3af4a7..196acb04 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ms.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ms.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 telah menulis dalam buku (tajuk: "@2"): "@3" di lokasi @4 -Writable Book (@1)=Buku Boleh Ditulis (@1) -blue=Biru -brown=Perang -green=Hijau -grey=Kelabu red=Merah +green=Hijau +blue=Biru violet=Ungu +grey=Kelabu +brown=Perang +Writable Book (@1)=Buku Boleh Ditulis (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt.tr index 6275ef53..4fffb591 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 escreveu um livro (título: "@2"): "@3" na localização @4 -Writable Book (@1)=Livro que pode ser escrito (@1) -blue=azul -brown=marrom -green=verde -grey=cinza red=vermelho +green=verde +blue=azul violet=violeta +grey=cinza +brown=marrom +Writable Book (@1)=Livro que pode ser escrito (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt_BR.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt_BR.tr index 6275ef53..4fffb591 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.pt_BR.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 escreveu um livro (título: "@2"): "@3" na localização @4 -Writable Book (@1)=Livro que pode ser escrito (@1) -blue=azul -brown=marrom -green=verde -grey=cinza red=vermelho +green=verde +blue=azul violet=violeta +grey=cinza +brown=marrom +Writable Book (@1)=Livro que pode ser escrito (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ru.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ru.tr index e2070e6d..df011da9 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ru.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.ru.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@1 написал в книге (заголовок: "@2"): "@3" в позиции @4 -Writable Book (@1)=Записная книга (@1) -blue= -brown= -green=зелёный -grey= red=красный +green=зелёный +blue= violet= +grey= +brown= +Writable Book (@1)=Записная книга (@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.zh_CN.tr b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.zh_CN.tr index 2ce99d5b..614a24dd 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_books/locale/homedecor_books.zh_CN.tr @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4=@我在一本书中写过(书名:\@2\):\@3\,地点@4 -Writable Book (@1)=可写书(@1) -blue=蓝色 -brown=棕色的 -green=绿色 -grey=灰色 red=红色 +green=绿色 +blue=蓝色 violet=紫罗兰 +grey=灰色 +brown=棕色的 +Writable Book (@1)=可写书(@1) diff --git a/mods/homedecor_modpack/homedecor_books/locale/template.txt b/mods/homedecor_modpack/homedecor_books/locale/template.txt index ce9e2097..5603eef8 100644 --- a/mods/homedecor_modpack/homedecor_books/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_books/locale/template.txt @@ -1,13 +1,8 @@ # textdomain: homedecor_books - - -### init.lua ### - -@1 has written in a book (title: "@2"): "@3" at location @4= -Writable Book (@1)= -blue= -brown= -green= -grey= red= +green= +blue= violet= +grey= +brown= +Writable Book (@1)= diff --git a/mods/homedecor_modpack/homedecor_books/mod.conf b/mods/homedecor_modpack/homedecor_books/mod.conf index 54d6c859..34be332b 100644 --- a/mods/homedecor_modpack/homedecor_books/mod.conf +++ b/mods/homedecor_modpack/homedecor_books/mod.conf @@ -1,4 +1,4 @@ name = homedecor_books description = Homedecor mod: books -depends = homedecor_common, default, creative -optional_depends = unifieddyes +depends = homedecor_common +optional_depends = unifieddyes, default, creative diff --git a/mods/homedecor_modpack/homedecor_climate_control/.luacheckrc b/mods/homedecor_modpack/homedecor_climate_control/.luacheckrc deleted file mode 100644 index 6718384e..00000000 --- a/mods/homedecor_modpack/homedecor_climate_control/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_climate_control/init.lua b/mods/homedecor_modpack/homedecor_climate_control/init.lua index cbb0aaa3..9b1e70ad 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/init.lua +++ b/mods/homedecor_modpack/homedecor_climate_control/init.lua @@ -7,34 +7,55 @@ homedecor.register("air_conditioner", { mesh = "homedecor_ac.obj", tiles = { "homedecor_ac.png", - "default_glass.png" + homedecor.textures.glass.pane + }, + groups = { snappy = 3, dig_stone = 3 }, + use_texture_alpha = "clip", + _sound_def = { + key = "node_sound_leaves_defaults", }, - groups = { snappy = 3 }, - sounds = default.node_sound_leaves_defaults(), selection_box = { type="regular" }, + crafts = { + { + recipe = { + { "steel_ingot", "building_blocks:grate", "steel_ingot" }, + { "steel_ingot", "homedecor:fan_blades", "basic_materials:motor" }, + { "steel_ingot", "basic_materials:motor", "steel_ingot" }, + }, + }, + { + recipe = { + { "steel_ingot", "building_blocks:grate", "steel_ingot" }, + { "steel_ingot", "basic_materials:motor", "steel_ingot" }, + { "steel_ingot", "basic_materials:motor", "steel_ingot" }, + }, + } + } }) -- fans minetest.register_entity(":homedecor:mesh_desk_fan", { - collisionbox = homedecor.nodebox.null, - visual = "mesh", - mesh = "homedecor_desk_fan.b3d", - textures = {"homedecor_desk_fan_uv.png"}, - visual_size = {x=10, y=10}, + initial_properties = { + collisionbox = homedecor.nodebox.null, + visual = "mesh", + mesh = "homedecor_desk_fan.b3d", + textures = {"homedecor_desk_fan_uv.png"}, + visual_size = {x=10, y=10}, + } }) local add_mesh_desk_fan_entity = function(pos) local param2 = minetest.get_node(pos).param2 local entity = minetest.add_entity(pos, "homedecor:mesh_desk_fan") if param2 == 0 then - entity:setyaw(3.142) -- 180 degrees + entity:set_yaw(3.142) -- 180 degrees elseif minetest.get_node(pos).param2 == 1 then - entity:setyaw(3.142/2) -- 90 degrees + entity:set_yaw(3.142/2) -- 90 degrees elseif minetest.get_node(pos).param2 == 3 then - entity:setyaw((-3.142/2)) -- 270 degrees + entity:set_yaw((-3.142/2)) -- 270 degrees else - entity:setyaw(0) + entity:set_yaw(0) end return entity end @@ -74,6 +95,14 @@ homedecor.register("desk_fan", { local entities = minetest.get_objects_inside_radius(pos, 0.1) if entities[1] then entities[1]:remove() end end, + crafts = { + { + recipe = { + {"steel_ingot", "homedecor:fan_blades", "basic_materials:motor"}, + {"", "steel_ingot", ""} + }, + } + } }) -- ceiling fan @@ -95,9 +124,28 @@ homedecor.register("ceiling_fan", { { -0.0625, 0.375, -0.0625, 0.0625, 0.5, 0.0625 } } }, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-1, - sounds = default.node_sound_glass_defaults(), + use_texture_alpha = "clip", + groups = { snappy = 3, dig_stone = 3 }, + light_source = minetest.LIGHT_MAX-1, + _sound_def = { + key = "node_sound_glass_defaults", + }, + crafts = { + { + recipe = { + { "basic_materials:motor" }, + { "homedecor:fan_blades" }, + { "homedecor:glowlight_small_cube" } + } + }, + { + recipe = { + { "basic_materials:motor" }, + { "homedecor:fan_blades" }, + { "homedecor:glowlight_small_cube" } + } + } + } }) -- heating devices @@ -113,8 +161,10 @@ homedecor.register("space_heater", { }, inventory_image = "homedecor_heater_inv.png", walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_stone = 3 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = { type = "fixed", fixed = { @@ -124,6 +174,15 @@ homedecor.register("space_heater", { selection_box = { type = "fixed", fixed = {-0.1875, -0.5, 0.0625, 0.1875, 0, 0.3125} + }, + crafts = { + { + recipe = { + {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"}, + {"basic_materials:plastic_sheet", "homedecor:fan_blades", "basic_materials:motor"}, + {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"} + }, + } } }) @@ -136,10 +195,21 @@ homedecor.register("radiator", { }, inventory_image = "homedecor_radiator_inv.png", description = S("Radiator heater"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone = 3}, selection_box = r_cbox, collision_box = r_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" }, + { "basic_materials:ic", "basic_materials:heating_element", "" }, + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" } + }, + } + } }) -- crafting @@ -152,70 +222,7 @@ minetest.register_craft( { output = "homedecor:fan_blades 2", recipe = { { "", "basic_materials:plastic_sheet", "" }, - { "", "default:steel_ingot", "" }, + { "", homedecor.materials.steel_ingot, "" }, { "basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet" } }, }) - -minetest.register_craft({ - output = "homedecor:air_conditioner", - recipe = { - { "default:steel_ingot", "building_blocks:grate", "default:steel_ingot" }, - { "default:steel_ingot", "homedecor:fan_blades", "basic_materials:motor" }, - { "default:steel_ingot", "basic_materials:motor", "default:steel_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:air_conditioner", - recipe = { - { "default:steel_ingot", "building_blocks:grate", "default:steel_ingot" }, - { "default:steel_ingot", "basic_materials:motor", "default:steel_ingot" }, - { "default:steel_ingot", "basic_materials:motor", "default:steel_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:ceiling_fan", - recipe = { - { "basic_materials:motor" }, - { "homedecor:fan_blades" }, - { "homedecor:glowlight_small_cube" } - } -}) - -minetest.register_craft({ - output = "homedecor:ceiling_fan", - recipe = { - { "basic_materials:motor" }, - { "homedecor:fan_blades" }, - { "homedecor:glowlight_small_cube" } - } -}) - - -minetest.register_craft( { - output = "homedecor:desk_fan", - recipe = { - {"default:steel_ingot", "homedecor:fan_blades", "basic_materials:motor"}, - {"", "default:steel_ingot", ""} - }, -}) - -minetest.register_craft( { - output = "homedecor:space_heater", - recipe = { - {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"}, - {"basic_materials:plastic_sheet", "homedecor:fan_blades", "basic_materials:motor"}, - {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"} - }, -}) - -minetest.register_craft( { - output = "homedecor:radiator", - recipe = { - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" }, - { "basic_materials:ic", "basic_materials:heating_element", "" }, - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" } - }, -}) diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.de.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.de.tr index 6575f7ab..999d305a 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.de.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.de.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Klimaanlage -Ceiling Fan=Deckenventilator Desk Fan=Schreibtischventilator -Fan blades=Ventilatorblätter -Radiator heater=Heizkörper +Ceiling Fan=Deckenventilator Space heater=Heizgerät +Radiator heater=Heizkörper +Fan blades=Ventilatorblätter diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.es.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.es.tr index 831ff0ae..250a30c0 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.es.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.es.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Acondicionador de aire -Ceiling Fan=Ventilador de techo Desk Fan=Ventilador de escritorio -Fan blades=Aspas de ventilador -Radiator heater=Radiador +Ceiling Fan=Ventilador de techo Space heater=Calentador de espacios +Radiator heater=Radiador +Fan blades=Aspas de ventilador diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.fr.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.fr.tr index 4faf18e6..555a4d9f 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.fr.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.fr.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Climatiseur -Ceiling Fan=Ventilateur (plafonnier) Desk Fan=Ventilateur de bureau -Fan blades=Pales de ventilateur -Radiator heater=Radiateur +Ceiling Fan=Ventilateur (plafonnier) Space heater=Chaufferette +Radiator heater=Radiateur +Fan blades=Pales de ventilateur diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ms.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ms.tr index f881d697..0058bf2c 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ms.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ms.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Pendingin Hawa -Ceiling Fan=Kipas Siling Desk Fan=Kipas Meja -Fan blades=Bilah Kipas -Radiator heater=Pemanas Radiator +Ceiling Fan=Kipas Siling Space heater=Pemanas Ruang +Radiator heater=Pemanas Radiator +Fan blades=Bilah Kipas diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt.tr index 3d4ac55f..9ff9946d 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Ar condicionado -Ceiling Fan=Ventilador de Teto Desk Fan=Ventilador de Escrivaninha -Fan blades=Pás de ventilador -Radiator heater=Aquecedor de radiador +Ceiling Fan=Ventilador de Teto Space heater=Aquecedor de ambiente +Radiator heater=Aquecedor de radiador +Fan blades=Pás de ventilador diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt_BR.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt_BR.tr index 3d4ac55f..9ff9946d 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.pt_BR.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Ar condicionado -Ceiling Fan=Ventilador de Teto Desk Fan=Ventilador de Escrivaninha -Fan blades=Pás de ventilador -Radiator heater=Aquecedor de radiador +Ceiling Fan=Ventilador de Teto Space heater=Aquecedor de ambiente +Radiator heater=Aquecedor de radiador +Fan blades=Pás de ventilador diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ru.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ru.tr index e3e2f80c..d2e27514 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ru.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.ru.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=Кондиционер -Ceiling Fan=Потолочный вентилятор Desk Fan=Настольный вентилятор -Fan blades=Лопасти вентилятора -Radiator heater=Масленый обогреватель +Ceiling Fan=Потолочный вентилятор Space heater=Обогреватель +Radiator heater=Масленый обогреватель +Fan blades=Лопасти вентилятора diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.zh_CN.tr b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.zh_CN.tr index d4824d01..2d0ab0d7 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/homedecor_climate_control.zh_CN.tr @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner=空调 -Ceiling Fan=吊扇 Desk Fan=台扇 -Fan blades=风扇叶片 -Radiator heater=散热器加热器 +Ceiling Fan=吊扇 Space heater=暖气机 +Radiator heater=散热器加热器 +Fan blades=风扇叶片 diff --git a/mods/homedecor_modpack/homedecor_climate_control/locale/template.txt b/mods/homedecor_modpack/homedecor_climate_control/locale/template.txt index 7adde387..137b4093 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_climate_control/locale/template.txt @@ -1,11 +1,7 @@ # textdomain: homedecor_climate_control - - -### init.lua ### - Air Conditioner= -Ceiling Fan= Desk Fan= -Fan blades= -Radiator heater= +Ceiling Fan= Space heater= +Radiator heater= +Fan blades= diff --git a/mods/homedecor_modpack/homedecor_climate_control/mod.conf b/mods/homedecor_modpack/homedecor_climate_control/mod.conf index 889b90f4..97c75f6a 100644 --- a/mods/homedecor_modpack/homedecor_climate_control/mod.conf +++ b/mods/homedecor_modpack/homedecor_climate_control/mod.conf @@ -1,4 +1,4 @@ name = homedecor_climate_control description = Homedecor mod: climate control -depends = homedecor_common, default, basic_materials -optional_depends = building_blocks, screwdriver +depends = homedecor_common +optional_depends = building_blocks, screwdriver, default diff --git a/mods/homedecor_modpack/homedecor_clocks/.luacheckrc b/mods/homedecor_modpack/homedecor_clocks/.luacheckrc deleted file mode 100644 index 6718384e..00000000 --- a/mods/homedecor_modpack/homedecor_clocks/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_clocks/init.lua b/mods/homedecor_modpack/homedecor_clocks/init.lua index 8801e921..854a4b50 100644 --- a/mods/homedecor_modpack/homedecor_clocks/init.lua +++ b/mods/homedecor_modpack/homedecor_clocks/init.lua @@ -1,18 +1,37 @@ - local S = minetest.get_translator("homedecor_clocks") +local wood = homedecor.textures.wood.apple.planks + +local plastic_craft = { + output = "homedecor:analog_clock_plastic 2", + recipe = { + { "basic_materials:plastic_sheet", "dye_black", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "dye_black", "basic_materials:plastic_sheet" }, + }, +} + +local wood_craft = { + output = "homedecor:analog_clock_wood 2", + recipe = { + { "group:stick", "dye_black", "group:stick" }, + { "group:stick", "basic_materials:ic", "group:stick" }, + { "group:stick", "dye_black", "group:stick" }, + }, +} + local clock_sbox = { type = "fixed", fixed = { -8/32, -8/32, 14/32, 8/32, 8/32, 16/32 } } local clock_materials = { - { "plastic", S("Plastic analog clock"), "homedecor_generic_plastic.png" }, - { "wood", S("Wooden analog clock"), "default_wood.png" } + {"plastic", S("Plastic analog clock"), "homedecor_generic_plastic.png", plastic_craft}, + {"wood", S("Wooden analog clock"), wood, wood_craft} } for _, mat in ipairs(clock_materials) do - local name, desc, tex = unpack(mat) + local name, desc, tex, craft = unpack(mat) homedecor.register("analog_clock_"..name, { description = desc, mesh = "homedecor_analog_clock.obj", @@ -24,8 +43,13 @@ for _, mat in ipairs(clock_materials) do inventory_image = "homedecor_analog_clock_"..name.."_inv.png", walkable = false, selection_box = clock_sbox, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + craft + } }) end @@ -47,8 +71,20 @@ homedecor.register("digital_clock", { } }, walkable = false, - sounds = default.node_sound_wood_defaults(), - groups = {snappy=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, + groups = {snappy=3, dig_tree=2}, + crafts = { + { + output = "homedecor:digital_clock 2", + recipe = { + { "basic_materials:plastic_sheet", "paper", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet" }, + }, + } + } }) homedecor.register("alarm_clock", { @@ -69,8 +105,19 @@ homedecor.register("alarm_clock", { } }, walkable = false, - sounds = default.node_sound_wood_defaults(), - groups = {snappy=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, + groups = {snappy=3, dig_tree=2}, + crafts = { + { + recipe = { + { "basic_materials:plastic_sheet", "homedecor:speaker_driver", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "homedecor:digital_clock", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet" }, + }, + } + } }) local gf_cbox = { @@ -82,67 +129,31 @@ homedecor.register("grandfather_clock", { description = S("Grandfather Clock"), mesh = "homedecor_grandfather_clock.obj", tiles = { - "default_glass.png", + homedecor.textures.glass.pane, "homedecor_grandfather_clock_face.png", homedecor.lux_wood, "homedecor_grandfather_clock_face_edge.png", "homedecor_generic_metal_brass.png" }, + use_texture_alpha = "clip", inventory_image = "homedecor_grandfather_clock_inv.png", - groups = { snappy = 3 }, + groups = {snappy = 3, dig_tree=2}, selection_box = gf_cbox, collision_box = gf_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, expand = { top="placeholder" }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, -}) - --- crafting - - -minetest.register_craft({ - output = "homedecor:analog_clock_plastic 2", - recipe = { - { "basic_materials:plastic_sheet", "dye:black", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "dye:black", "basic_materials:plastic_sheet" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:analog_clock_wood 2", - recipe = { - { "group:stick", "dye:black", "group:stick" }, - { "group:stick", "basic_materials:ic", "group:stick" }, - { "group:stick", "dye:black", "group:stick" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:digital_clock 2", - recipe = { - { "basic_materials:plastic_sheet", "default:paper", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:alarm_clock", - recipe = { - { "basic_materials:plastic_sheet", "homedecor:speaker_driver", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "homedecor:digital_clock", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:grandfather_clock", - recipe = { - { "building_blocks:slab_hardwood","homedecor:analog_clock_wood","building_blocks:slab_hardwood" }, - { "building_blocks:slab_hardwood","basic_materials:brass_ingot","building_blocks:slab_hardwood" }, - { "building_blocks:slab_hardwood","basic_materials:brass_ingot","building_blocks:slab_hardwood" } - }, + crafts = { + { + recipe = { + { "building_blocks:slab_hardwood","homedecor:analog_clock_wood","building_blocks:slab_hardwood" }, + { "building_blocks:slab_hardwood","basic_materials:brass_ingot","building_blocks:slab_hardwood" }, + { "building_blocks:slab_hardwood","basic_materials:brass_ingot","building_blocks:slab_hardwood" } + }, + } + } }) -- aliases diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.de.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.de.tr index d0930262..b9edbb28 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.de.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.de.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Wecker -Digital clock=Digitaluhr -Grandfather Clock=Standuhr Plastic analog clock=Plastikanaloguhr Wooden analog clock=Hölzerne Analoguhr +Digital clock=Digitaluhr +Alarm clock=Wecker +Grandfather Clock=Standuhr diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.es.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.es.tr index 923977c2..9d56b8df 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.es.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.es.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Reloj de alarma -Digital clock=Reloj digital -Grandfather Clock=Reloj de péndulo Plastic analog clock=Reloj análogo de plástico Wooden analog clock=Reloj análogo de madera +Digital clock=Reloj digital +Alarm clock=Reloj de alarma +Grandfather Clock=Reloj de péndulo diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.fr.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.fr.tr index f0ee5bbb..7c2442d1 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.fr.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.fr.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Réveil-matin -Digital clock=Horloge numérique -Grandfather Clock=Horloge comtoise Plastic analog clock=Horloge analogique en plastique Wooden analog clock=Horloge analogique en bois +Digital clock=Horloge numérique +Alarm clock=Réveil-matin +Grandfather Clock=Horloge comtoise diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ms.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ms.tr index fc600929..224f25e0 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ms.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ms.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Jam Loceng -Digital clock=Jam Digital -Grandfather Clock=Jam Besar Berdiri Plastic analog clock=Jam Analog Plastik Wooden analog clock=Jam Analog Kayu +Digital clock=Jam Digital +Alarm clock=Jam Loceng +Grandfather Clock=Jam Besar Berdiri diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt.tr index c8fb1b01..2ce63739 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Despertador -Digital clock=Relógio digital -Grandfather Clock=Relógio Antigo Plastic analog clock=Relógio analógico de plástico Wooden analog clock=Relógio analógico de madeira +Digital clock=Relógio digital +Alarm clock=Despertador +Grandfather Clock=Relógio Antigo diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt_BR.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt_BR.tr index c8fb1b01..2ce63739 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.pt_BR.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Despertador -Digital clock=Relógio digital -Grandfather Clock=Relógio Antigo Plastic analog clock=Relógio analógico de plástico Wooden analog clock=Relógio analógico de madeira +Digital clock=Relógio digital +Alarm clock=Despertador +Grandfather Clock=Relógio Antigo diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ru.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ru.tr index 740a8b7c..84ab84e7 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ru.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.ru.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=Будильник -Digital clock=Цифровые часы -Grandfather Clock=Дедушкины часы Plastic analog clock=Пластиковые стрелочные часы Wooden analog clock=Деревянные стрелочные часы +Digital clock=Цифровые часы +Alarm clock=Будильник +Grandfather Clock=Дедушкины часы diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.zh_CN.tr b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.zh_CN.tr index 35eae7ec..24181c39 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_clocks/locale/homedecor_clocks.zh_CN.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock=闹钟 -Digital clock=数字时钟 -Grandfather Clock=祖父钟 Plastic analog clock=塑料时钟 Wooden analog clock=木钟 +Digital clock=数字时钟 +Alarm clock=闹钟 +Grandfather Clock=祖父钟 diff --git a/mods/homedecor_modpack/homedecor_clocks/locale/template.txt b/mods/homedecor_modpack/homedecor_clocks/locale/template.txt index cce71752..0f61338a 100644 --- a/mods/homedecor_modpack/homedecor_clocks/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_clocks/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: homedecor_clocks - - -### init.lua ### - -Alarm clock= -Digital clock= -Grandfather Clock= Plastic analog clock= Wooden analog clock= +Digital clock= +Alarm clock= +Grandfather Clock= diff --git a/mods/homedecor_modpack/homedecor_clocks/mod.conf b/mods/homedecor_modpack/homedecor_clocks/mod.conf index f82affd4..9ebf87d7 100644 --- a/mods/homedecor_modpack/homedecor_clocks/mod.conf +++ b/mods/homedecor_modpack/homedecor_clocks/mod.conf @@ -1,4 +1,4 @@ name = homedecor_clocks description = Homedecor mod: clocks -depends = homedecor_common, default, basic_materials, dye -optional_depends = building_blocks, screwdriver +depends = homedecor_common +optional_depends = building_blocks, screwdriver, default, basic_materials, dye diff --git a/mods/homedecor_modpack/homedecor_cobweb/.luacheckrc b/mods/homedecor_modpack/homedecor_cobweb/.luacheckrc deleted file mode 100644 index f3a5fb28..00000000 --- a/mods/homedecor_modpack/homedecor_cobweb/.luacheckrc +++ /dev/null @@ -1,18 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_cobweb/init.lua b/mods/homedecor_modpack/homedecor_cobweb/init.lua index 2d5a6bbe..ad8a9331 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/init.lua +++ b/mods/homedecor_modpack/homedecor_cobweb/init.lua @@ -1,7 +1,7 @@ local S = minetest.get_translator("homedecor_cobweb") homedecor_cobweb = {} -minetest.register_node(":homedecor:cobweb_corner", { +homedecor.register("cobweb_corner", { description = S("Cobweb"), drawtype = "torchlike", tiles = { "homedecor_cobweb_torchlike.png" }, @@ -19,17 +19,28 @@ minetest.register_node(":homedecor:cobweb_corner", { walkable = false, selection_box = { type = "regular" }, visual_scale = 1.4, - groups = { snappy = 3, liquid=3 }, + groups = { snappy = 3, liquid=3, dig_glass = 1 }, after_place_node = function(pos, placer, itemstack, pointed_thing) homedecor_cobweb.rotate(pos) - end + end, + crafts = { + { + output = "homedecor:cobweb_corner 5", + recipe = { + {"string", "", "string"}, + {"", "string", ""}, + {"string", "", "string"} + }, + } + } }) -minetest.register_node(":homedecor:cobweb_centered", { +homedecor.register("cobweb_centered", { description = S("Cobweb"), drawtype = "nodebox", tiles = { "homedecor_cobweb.png" }, inventory_image = "homedecor_cobweb.png", + use_texture_alpha = "clip", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -48,17 +59,18 @@ minetest.register_node(":homedecor:cobweb_centered", { type = "fixed", fixed = { -0.5, -0.5, 0, 0.5, 0.5, 0 } }, - groups = { snappy = 3, liquid=3, not_in_creative_inventory = 1 }, + groups = { snappy = 3, liquid=3, dig_glass = 1, not_in_creative_inventory = 1 }, drop = "homedecor:cobweb_corner" }) -minetest.register_node(":homedecor:cobweb_flat", { +homedecor.register("cobweb_flat", { description = S("Cobweb"), drawtype = "nodebox", tiles = { "homedecor_cobweb.png" }, inventory_image = "homedecor_cobweb.png", paramtype = "light", paramtype2 = "facedir", + use_texture_alpha = "clip", sunlight_propagates = true, liquid_viscosity = 8, liquidtype = "source", @@ -75,11 +87,11 @@ minetest.register_node(":homedecor:cobweb_flat", { type = "fixed", fixed = { -0.5, -0.5, 0.495, 0.5, 0.5, 0.495 } }, - groups = { snappy = 3, liquid=3, not_in_creative_inventory = 1 }, + groups = { snappy = 3, liquid=3, dig_glass = 1, not_in_creative_inventory = 1 }, drop = "homedecor:cobweb_corner" }) -minetest.register_node(":homedecor:cobweb_plantlike", { +homedecor.register("cobweb_plantlike", { description = S("Cobweb"), drawtype = "plantlike", tiles = { "homedecor_cobweb_plantlike.png" }, @@ -96,7 +108,7 @@ minetest.register_node(":homedecor:cobweb_plantlike", { walkable = false, selection_box = { type = "regular" }, visual_scale = 1.189, - groups = { snappy = 3, liquid=3, not_in_creative_inventory = 1 }, + groups = { snappy = 3, liquid=3, dig_glass = 1, not_in_creative_inventory = 1 }, drop = "homedecor:cobweb_corner" }) @@ -157,14 +169,3 @@ function homedecor_cobweb.rotate(pos) end end - --- crafting - -minetest.register_craft( { - output = "homedecor:cobweb_corner 5", - recipe = { - { "farming:string", "", "farming:string" }, - { "", "farming:string", "" }, - { "farming:string", "", "farming:string" } - }, -}) diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.de.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.de.tr index 37c6a151..843d44d4 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.de.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.de.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Spinnennetz diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.es.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.es.tr index c1853c82..665ec2b6 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.es.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.es.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Telaraña diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.fr.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.fr.tr index 6ccd2bf1..c23286a9 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.fr.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.fr.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Toile d'araignée diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ms.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ms.tr index dc3abf76..134896ab 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ms.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ms.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Sarang Labah-Labah diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt.tr index 6099b7df..492382d9 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Teia de Aranha diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt_BR.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt_BR.tr index 6099b7df..492382d9 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.pt_BR.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Teia de Aranha diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ru.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ru.tr index df65b102..65674044 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ru.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.ru.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=Паутина diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.zh_CN.tr b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.zh_CN.tr index 3e69a81e..dea8c26e 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/homedecor_cobweb.zh_CN.tr @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb=蛛网 diff --git a/mods/homedecor_modpack/homedecor_cobweb/locale/template.txt b/mods/homedecor_modpack/homedecor_cobweb/locale/template.txt index 080cd2c2..e45ac697 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_cobweb/locale/template.txt @@ -1,6 +1,2 @@ # textdomain: homedecor_cobweb - - -### init.lua ### - Cobweb= diff --git a/mods/homedecor_modpack/homedecor_cobweb/mod.conf b/mods/homedecor_modpack/homedecor_cobweb/mod.conf index d80cd394..e8e0360e 100644 --- a/mods/homedecor_modpack/homedecor_cobweb/mod.conf +++ b/mods/homedecor_modpack/homedecor_cobweb/mod.conf @@ -1,3 +1,4 @@ name = homedecor_cobweb description = Homedecor mod: cobweb -depends = homedecor_common, default +depends = homedecor_common +optional_depends = default diff --git a/mods/homedecor_modpack/homedecor_common/.luacheckrc b/mods/homedecor_modpack/homedecor_common/.luacheckrc deleted file mode 100644 index ef788aab..00000000 --- a/mods/homedecor_modpack/homedecor_common/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "creative", - "default", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_common/expansion.lua b/mods/homedecor_modpack/homedecor_common/expansion.lua index 037d09b6..05a989b5 100644 --- a/mods/homedecor_modpack/homedecor_common/expansion.lua +++ b/mods/homedecor_modpack/homedecor_common/expansion.lua @@ -103,7 +103,7 @@ local function stack(itemstack, placer, fdir, pos, def, pos2, node1, node2, poin ctrl_node_def.after_place_node(pos, placer, itemstack, pointed_thing) end - if not creative.is_enabled_for(placer_name) then + if not minetest.is_creative_enabled(placer_name) then itemstack:take_item() end end @@ -133,7 +133,8 @@ function homedecor.stack_vertically(itemstack, placer, pointed_thing, node1, nod end -- Stack one door node above another --- like homedecor.stack_vertically but tests first if it was placed as a right wing, then uses node1_right and node2_right instead +-- like homedecor.stack_vertically but tests first if it was placed as a right wing, +-- then uses node1_right and node2_right instead function homedecor.stack_wing(itemstack, placer, pointed_thing, node1, node2, node1_right, node2_right) local rightclick_result = rightclick_pointed_thing(pointed_thing.under, placer, itemstack, pointed_thing) @@ -230,8 +231,9 @@ function homedecor.bed_expansion(pos, placer, itemstack, pointed_thing, trybunks if trybunks and is_buildable_to(placer_name, toppos, topposfwd) then local newname = string.gsub(thisnode.name, "_regular", "_extended") - local newparam2 = param2 % 8 - -- FIXME: is newparam2 a legacy unused variable from a8729575abfbd15cc622b413b71976c9157fbab4? or should this variable be used somewhere? + -- local newparam2 = param2 % 8 + -- FIXME: is newparam2 a legacy unused variable from a8729575abfbd15cc622b413b71976c9157fbab4? + -- or should this variable be used somewhere? minetest.swap_node(toppos, { name = thisnode.name, param2 = param2}) minetest.swap_node(pos, { name = newname, param2 = param2}) itemstack:take_item() diff --git a/mods/homedecor_modpack/homedecor_common/furnaces.lua b/mods/homedecor_modpack/homedecor_common/furnaces.lua index 86e54015..9a444222 100644 --- a/mods/homedecor_modpack/homedecor_common/furnaces.lua +++ b/mods/homedecor_modpack/homedecor_common/furnaces.lua @@ -91,16 +91,6 @@ function homedecor.register_furnace(name, furnacedef) local description = furnacedef.description or S("Furnace") - local furnace_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", make_formspec(furnacedef, 0)) - meta:set_string("infotext", description) - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", furnacedef.output_slots) - end - local furnace_allow_put = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -139,16 +129,217 @@ function homedecor.register_furnace(name, furnacedef) end end + local n_active = name.."_active" + local nname, name_active = "homedecor:"..name, "homedecor:"..n_active + + local function furnace_node_timer(pos, elapsed) + -- + -- Initialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + local dst_full = false + + local timer_elapsed = meta:get_int("timer_elapsed") or 0 + meta:set_int("timer_elapsed", timer_elapsed + 1) + + local cookable, cooked + local fuel + + local update = true + while elapsed > 0 and update do + update = false + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + + local el = math.min(elapsed, fuel_totaltime - fuel_time) + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + el + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + else + dst_full = true + end + else + -- Item could not be cooked: probably missing fuel + update = true + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + src_time = 0 + else + -- prevent blocking of fuel inventory (for automatization mods) + local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}}) + if is_fuel.time == 0 then + table.insert(fuel.replacements, afterfuel.items[1]) + inv:set_stack("fuel", 1, "") + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + end + -- Put replacements in dst list or drop them on the furnace. + local replacements = fuel.replacements + if replacements[1] then + local leftover = inv:add_item("dst", replacements[1]) + if not leftover:is_empty() then + local above = vector.new(pos.x, pos.y + 1, pos.z) + local drop_pos = minetest.find_node_near(above, 1, {"air"}) or above + minetest.item_drop(replacements[1], nil, drop_pos) + end + end + update = true + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = elapsed - el + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec, infotext and node + -- + local formspec + local infotext + + local percent = math.floor(fuel_time / fuel_totaltime * 100) + + local result = false + + local node = minetest.get_node(pos) + local locked = node.name:find("_locked$") and "_locked" or "" + local desc = minetest.registered_nodes[nname..locked].description + + if fuel_totaltime ~= 0 then + formspec = make_formspec(furnacedef, percent) + swap_node(pos, name_active .. locked) + -- make sure timer restarts automatically + result = true + else + formspec = make_formspec(furnacedef, 0) + infotext = S("@1 (out of fuel)", desc) + swap_node(pos, nname .. locked) + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) + end + + if not cookable and fuellist and not fuellist[1]:is_empty() then + infotext = S("@1 (empty)", desc) + end + + if dst_full then + infotext = S("@1 (output bins are full)", desc) + result = false + formspec = make_formspec(furnacedef, 0) + swap_node(pos, nname .. locked) + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) + fuel_totaltime, fuel_time, src_time = 0, 0, 0 + end + + if infotext == nil then + infotext = S("@1 (active: @2%)", desc, percent) + end + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result + end + + local furnace_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 1) + inv:set_size("dst", furnacedef.output_slots) + furnace_node_timer(pos, 0) + end + local def = { description = description, tiles = make_tiles(furnacedef.tiles, furnacedef.tile_format, false), groups = furnacedef.groups or {cracky=2}, - sounds = furnacedef.sounds or default.node_sound_wood_defaults(), + sounds = furnacedef.sounds, + _sound_def = { + key = "node_sound_wood_defaults", + }, on_construct = furnace_construct, can_dig = furnace_can_dig, allow_metadata_inventory_put = furnace_allow_put, allow_metadata_inventory_move = furnace_allow_move, - inventory = { lockable = true } + inventory = { lockable = true }, + is_furnace = true, + on_timer = furnace_node_timer, + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos) + -- check whether the furnace is empty or not. + minetest.get_node_timer(pos):start(1.0) + end } local def_active = { @@ -157,12 +348,28 @@ function homedecor.register_furnace(name, furnacedef) light_source = 8, drop = "homedecor:" .. name, groups = furnacedef.groups or {cracky=2, not_in_creative_inventory=1}, - sounds = furnacedef.sounds or default.node_sound_stone_defaults(), + sounds = furnacedef.sounds, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_construct = furnace_construct, can_dig = furnace_can_dig, allow_metadata_inventory_put = furnace_allow_put, allow_metadata_inventory_move = furnace_allow_move, - inventory = { lockable = true } + inventory = { lockable = true }, + is_furnace = true, + on_timer = furnace_node_timer, + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos) + -- check whether the furnace is empty or not. + minetest.get_node_timer(pos):start(1.0) + end } if furnacedef.extra_nodedef_fields then @@ -172,113 +379,6 @@ function homedecor.register_furnace(name, furnacedef) end end - local n_active = name.."_active" - homedecor.register(name, def) homedecor.register(n_active, def_active) - - local nname, name_active = "homedecor:"..name, "homedecor:"..n_active - - minetest.register_abm({ - nodenames = {nname, name_active, nname.."_locked", name_active.."_locked"}, - label = "furnaces", - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos) - for i, pname in ipairs({ - "fuel_totaltime", - "fuel_time", - "src_totaltime", - "src_time" - }) do - if meta:get_string(pname) == "" then - meta:set_float(pname, 0.0) - end - end - - local inv = meta:get_inventory() - - local srclist = inv:get_list("src") - local cooked = nil - local aftercooked - - if srclist then - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - - local was_active = false - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - was_active = true - meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) - meta:set_float("src_time", meta:get_float("src_time") + furnacedef.cook_speed) - if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then - -- check if there's room for output in "dst" list - if inv:room_for_item("dst",cooked.item) then - -- Put result in "dst" list - inv:add_item("dst", cooked.item) - -- take stuff from "src" list - inv:set_stack("src", 1, aftercooked.items[1]) - end - meta:set_string("src_time", 0) - end - end - - -- XXX: Quick patch, make it better in the future. - local locked = node.name:find("_locked$") and "_locked" or "" - local desc = minetest.registered_nodes[nname..locked].description - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - local percent = math.floor(meta:get_float("fuel_time") / - meta:get_float("fuel_totaltime") * 100) - meta:set_string("infotext", S("@1 (active: @2%)", desc, percent)) - swap_node(pos,name_active..locked) - meta:set_string("formspec", make_formspec(furnacedef, percent)) - return - end - - local fuel = nil - local afterfuel - cooked = nil - local fuellist = inv:get_list("fuel") - srclist = inv:get_list("src") - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - if fuellist then - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - end - - if (not fuel) or (fuel.time <= 0) then - meta:set_string("infotext", S("@1 (out of fuel)", desc)) - swap_node(pos, nname..locked) - meta:set_string("formspec", make_formspec(furnacedef, 0)) - return - end - - if cooked.item:is_empty() then - if was_active then - meta:set_string("infotext", S("@1 (empty)", desc)) - swap_node(pos, nname..locked) - meta:set_string("formspec", make_formspec(furnacedef, 0)) - end - return - end - - if not inv:room_for_item("dst", cooked.item) then - meta:set_string("infotext", S("@1 (output bins are full)", desc)) - swap_node(pos, nname..locked) - meta:set_string("formspec", make_formspec(furnacedef, 0)) - return - end - - meta:set_string("fuel_totaltime", fuel.time) - meta:set_string("fuel_time", 0) - - inv:set_stack("fuel", 1, afterfuel.items[1]) - end, - }) - end diff --git a/mods/homedecor_modpack/homedecor_common/init.lua b/mods/homedecor_modpack/homedecor_common/init.lua index f03078ca..0a177910 100644 --- a/mods/homedecor_modpack/homedecor_common/init.lua +++ b/mods/homedecor_modpack/homedecor_common/init.lua @@ -49,24 +49,18 @@ function homedecor.find_ceiling(itemstack, placer, pointed_thing) return isceiling, pos end -homedecor.plain_wood = { name = "homedecor_generic_wood_plain.png", color = 0xffa76820 } -homedecor.mahogany_wood = { name = "homedecor_generic_wood_plain.png", color = 0xff7d2506 } -homedecor.white_wood = "homedecor_generic_wood_plain.png" -homedecor.dark_wood = { name = "homedecor_generic_wood_plain.png", color = 0xff39240f } -homedecor.lux_wood = { name = "homedecor_generic_wood_luxury.png", color = 0xff643f23 } - homedecor.color_black = 0xff303030 homedecor.color_dark_grey = 0xff606060 homedecor.color_med_grey = 0xffa0a0a0 -- load different handler subsystems +dofile(modpath.."/xcompat.lua") dofile(modpath.."/nodeboxes.lua") dofile(modpath.."/expansion.lua") dofile(modpath.."/furnaces.lua") dofile(modpath.."/inventory.lua") dofile(modpath.."/registration.lua") dofile(modpath.."/water_particles.lua") -dofile(modpath.."/sit.lua") dofile(modpath.."/crafts.lua") if minetest.settings:get_bool("log_mod") then diff --git a/mods/homedecor_modpack/homedecor_common/inventory.lua b/mods/homedecor_modpack/homedecor_common/inventory.lua index 30e4c2cb..614e0eef 100644 --- a/mods/homedecor_modpack/homedecor_common/inventory.lua +++ b/mods/homedecor_modpack/homedecor_common/inventory.lua @@ -1,51 +1,58 @@ local S = minetest.get_translator("homedecor_common") +local has_hopper = minetest.get_modpath("hopper") +local has_safe_hopper = has_hopper and + -- mod from https://github.com/minetest-mods/hopper respects the owner + (hopper.neighbors or + -- mod from https://notabug.org/TenPlus1/hopper respects the owner since 20220123 + (hopper.version and hopper.version >= "20220123")) + local default_can_dig = function(pos,player) local meta = minetest.get_meta(pos) return meta:get_inventory():is_empty("main") end -local background = default.gui_bg .. default.gui_bg_img .. default.gui_slots +local default_can_interact_with_node = xcompat.functions.can_interact_with_node + local default_inventory_formspecs = { - ["4"]="size[8,6]".. background .. + ["4"]="size[8,6]".. "list[context;main;2,0;4,1;]" .. "list[current_player;main;0,2;8,4;]" .. "listring[]", - ["6"]="size[8,6]".. background .. + ["6"]="size[8,6]".. "list[context;main;1,0;6,1;]".. "list[current_player;main;0,2;8,4;]" .. "listring[]", - ["8"]="size[8,6]".. background .. + ["8"]="size[8,6]".. "list[context;main;0,0;8,1;]".. "list[current_player;main;0,2;8,4;]" .. "listring[]", - ["12"]="size[8,7]".. background .. + ["12"]="size[8,7]".. "list[context;main;1,0;6,2;]".. "list[current_player;main;0,3;8,4;]" .. "listring[]", - ["16"]="size[8,7]".. background .. + ["16"]="size[8,7]".. "list[context;main;0,0;8,2;]".. "list[current_player;main;0,3;8,4;]" .. "listring[]", - ["24"]="size[8,8]".. background .. + ["24"]="size[8,8]".. "list[context;main;0,0;8,3;]".. "list[current_player;main;0,4;8,4;]" .. "listring[]", - ["32"]="size[8,9]".. background .. + ["32"]="size[8,9]".. "list[context;main;0,0.3;8,4;]".. "list[current_player;main;0,4.85;8,1;]".. "list[current_player;main;0,6.08;8,3;8]".. "listring[context;main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,4.85), + "listring[current_player;main]", - ["50"]="size[10,10]".. background .. + ["50"]="size[10,10]".. "list[context;main;0,0;10,5;]".. "list[current_player;main;1,6;8,4;]" .. "listring[]", @@ -97,6 +104,23 @@ function homedecor.handle_inventory(name, def, original_def) end local locked = inventory.locked + + if has_hopper and (not locked or has_safe_hopper) then + if inventory.size then + hopper:add_container({ + {"top", "homedecor:"..name, "main"}, + {"bottom", "homedecor:"..name, "main"}, + {"side", "homedecor:"..name, "main"}, + }) + elseif original_def.is_furnace then + hopper:add_container({ + {"top", "homedecor:"..name, "dst"}, + {"bottom", "homedecor:"..name, "src"}, + {"side", "homedecor:"..name, "fuel"}, + }) + end + end + if locked then local after_place_node = def.after_place_node def.after_place_node = function(pos, placer) @@ -110,7 +134,7 @@ function homedecor.handle_inventory(name, def, original_def) local allow_move = def.allow_metadata_inventory_move def.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if not default.can_interact_with_node(player, pos) then + if not default_can_interact_with_node(player, pos) then minetest.log("action", player:get_player_name().." tried to access a "..name.." belonging to " ..minetest.get_meta(pos):get_string("owner").." at "..minetest.pos_to_string(pos)) return 0 @@ -121,7 +145,7 @@ function homedecor.handle_inventory(name, def, original_def) local allow_put = def.allow_metadata_inventory_put def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then + if not default_can_interact_with_node(player, pos) then minetest.log("action", player:get_player_name().." tried to access a "..name.." belonging to" ..minetest.get_meta(pos):get_string("owner").." at "..minetest.pos_to_string(pos)) return 0 @@ -132,7 +156,7 @@ function homedecor.handle_inventory(name, def, original_def) local allow_take = def.allow_metadata_inventory_take def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then + if not default_can_interact_with_node(player, pos) then minetest.log("action", player:get_player_name().." tried to access a "..name.." belonging to" ..minetest.get_meta(pos):get_string("owner").." at ".. minetest.pos_to_string(pos)) return 0 @@ -143,7 +167,7 @@ function homedecor.handle_inventory(name, def, original_def) local can_dig = def.can_dig or default_can_dig def.can_dig = function(pos, player) - return default.can_interact_with_node(player, pos) and (can_dig and can_dig(pos, player) == true) + return default_can_interact_with_node(player, pos) and (can_dig and can_dig(pos, player) == true) end def.on_key_use = function(pos, player) @@ -187,7 +211,7 @@ function homedecor.handle_inventory(name, def, original_def) if lockable then local locked_def = table.copy(original_def) locked_def.description = S("@1 (Locked)", def.description or name) - + locked_def.crafts = nil local locked_inventory = locked_def.inventory locked_inventory.locked = true locked_inventory.lockable = nil -- avoid loops of locked locked stuff diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.de.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.de.tr index 8d03596c..8a48e551 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.de.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.de.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Kleine Holzschublade Terracotta Roof Tile=Terrakottadachziegel - -### expansion.lua ### - +Small Wooden Drawer=Kleine Holzschublade Not enough room - the space for the headboard is occupied!=Nicht genügeng Platz – Der Platz für das Kopfende ist belegt! +Someone already owns the spot where the headboard goes.=Jemanden gehört schon der Platz, wo das Kopfende hingehen würde. Not enough room - the upper space is occupied!=Nicht genügend Platz – der obere Teil ist belegt! Someone already owns that spot.=Jemanden gehört diese Stelle schon. -Someone already owns the spot where the headboard goes.=Jemanden gehört schon der Platz, wo das Kopfende hingehen würde. - -### furnaces.lua ### - -@1 (active)=@1 (aktiv) -@1 (active: @2%)=@1 (aktiv: @2%) +Furnace=Ofen @1 (empty)=@1 (leer) @1 (out of fuel)=@1 (kein Brennmaterial vorhanden) @1 (output bins are full)=@1 (Ausgabe ist voll) -Furnace=Ofen - -### inventory.lua ### - -@1 (Locked)=@1 (abgeschlossen) +@1 (active: @2%)=@1 (aktiv: @2%) +@1 (active)=@1 (aktiv) @1 (owned by @2)=@1 (gehört @2) +@1 (Locked)=@1 (abgeschlossen) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.es.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.es.tr index b7d75e67..16b34096 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.es.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.es.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Cajón de madera pequeño Terracotta Roof Tile=Tejado de terracota - -### expansion.lua ### - +Small Wooden Drawer=Cajón de madera pequeño Not enough room - the space for the headboard is occupied!=No hay suficiente espacio - ¡El espacio para la cabecera está ocupado! +Someone already owns the spot where the headboard goes.=Alguien ya es dueño del lugar donde va la cabecera. Not enough room - the upper space is occupied!=No hay suficiente espacio - ¡El espacio de encima está ocupado! Someone already owns that spot.=Alguien ya es dueño de ese lugar. -Someone already owns the spot where the headboard goes.=Alguien ya es dueño del lugar donde va la cabecera. - -### furnaces.lua ### - -@1 (active)=@1 (activo) -@1 (active: @2%)=@1 (activo: @2%) +Furnace=Horno @1 (empty)=@1 (vacía) @1 (out of fuel)=@1 (sin combustible) @1 (output bins are full)=@1 (ranuras de salida llenas) -Furnace=Horno - -### inventory.lua ### - -@1 (Locked)=@1 (Cerrado) +@1 (active: @2%)=@1 (activo: @2%) +@1 (active)=@1 (activo) @1 (owned by @2)=@1 (propiedad de @2) +@1 (Locked)=@1 (Cerrado) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.fr.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.fr.tr index fc6fbadc..f36ea35a 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.fr.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.fr.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Petit tiroir en bois Terracotta Roof Tile=Tuile en terre cuite - -### expansion.lua ### - +Small Wooden Drawer=Petit tiroir en bois Not enough room - the space for the headboard is occupied!=Pas assez de place - l'espace pour la tête de lit est occupé ! +Someone already owns the spot where the headboard goes.=Quelqu'un possède déjà l'endroit où doit aller la tête de lit. Not enough room - the upper space is occupied!=Pas assez de place - l'espace en haut est occupé ! Someone already owns that spot.=Quelqu'un est déjà propriétaire de cette zone. -Someone already owns the spot where the headboard goes.=Quelqu'un possède déjà l'endroit où doit aller la tête de lit. - -### furnaces.lua ### - -@1 (active)=@1 (actif) -@1 (active: @2%)=@1 (actif : @2%) +Furnace=Fourneau @1 (empty)=@1 (vide) @1 (out of fuel)=@1 (pas de combustible) @1 (output bins are full)=@1 (les réceptacles de sortie sont pleins) -Furnace=Fourneau - -### inventory.lua ### - -@1 (Locked)=@1 (verrouillé) +@1 (active: @2%)=@1 (actif : @2%) +@1 (active)=@1 (actif) @1 (owned by @2)=@1 (propriété de @2) +@1 (Locked)=@1 (verrouillé) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.it.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.it.tr index 4adcfa14..75ceaf4e 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.it.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.it.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Bauletto in legno Terracotta Roof Tile=Tegole di terracotta - -### expansion.lua ### - +Small Wooden Drawer=Bauletto in legno Not enough room - the space for the headboard is occupied!= -Not enough room - the upper space is occupied!= -Someone already owns that spot.=Spiacente, quel punto è di proprietà di %s. Someone already owns the spot where the headboard goes.= - -### furnaces.lua ### - -@1 (active)= -@1 (active: @2%)= -@1 (empty)= -@1 (out of fuel)=Senza combustibile -@1 (output bins are full)=i contenitori sono pieni +Not enough room - the upper space is occupied!= +Someone already owns that spot.= Furnace= - -### inventory.lua ### - -@1 (Locked)=%s (Con lucchetto) -@1 (owned by @2)=%s (di proprietà di %s) +@1 (empty)= +@1 (out of fuel)=@1 (Senza combustibile) +@1 (output bins are full)=@1 (i contenitori sono pieni) +@1 (active: @2%)= +@1 (active)= +@1 (owned by @2)=@1 (di proprietà di @2) +@1 (Locked)=@1 (Con lucchetto) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ms.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ms.tr index 21d57b44..2b6bf789 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ms.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ms.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Laci Kayu Kecil Terracotta Roof Tile=Genting Bumbung Terracotta - -### expansion.lua ### - +Small Wooden Drawer=Laci Kayu Kecil Not enough room - the space for the headboard is occupied!=Tidak cukup ruang - ada barang di kawasan untuk letak kepala katil! +Someone already owns the spot where the headboard goes.=Tempat untuk letak kepala katil itu kawasan kepunyaan orang lain. Not enough room - the upper space is occupied!=Tidak cukup ruang - ada barang di kawasan atas! Someone already owns that spot.=Kawasan itu kepunyaan orang lain. -Someone already owns the spot where the headboard goes.=Tempat untuk letak kepala katil itu kawasan kepunyaan orang lain. - -### furnaces.lua ### - -@1 (active)=@1 (aktif) -@1 (active: @2%)=@1 (aktif: @2) +Furnace=Relau @1 (empty)=@1 (kosong) @1 (out of fuel)=@1 (kehabisan bahan api) @1 (output bins are full)=@1 (dulang keluar penuh) -Furnace=Relau - -### inventory.lua ### - -@1 (Locked)=@1 (Berkunci) +@1 (active: @2%)=@1 (aktif: @2) +@1 (active)=@1 (aktif) @1 (owned by @2)=@1 (hak milik @2) +@1 (Locked)=@1 (Berkunci) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt.tr index e55674cc..777e3707 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Gaveta Pequena de Madeira Terracotta Roof Tile=Telha de Terracota - -### expansion.lua ### - +Small Wooden Drawer=Gaveta Pequena de Madeira Not enough room - the space for the headboard is occupied!=Sem espaço - o espaço para a cabeceira está ocupado! +Someone already owns the spot where the headboard goes.=Alguém já é proprietário do local onde a cabeceira vai. Not enough room - the upper space is occupied!=Sem espaço - o espaço acima está ocupado! Someone already owns that spot.=Alguém já é proprietário deste lugar. -Someone already owns the spot where the headboard goes.=Alguém já é proprietário do local onde a cabeceira vai. - -### furnaces.lua ### - -@1 (active)=@1 (ativo) -@1 (active: @2%)=@1 (ativo: @2%) +Furnace=Forno @1 (empty)=@1 (vazio) @1 (out of fuel)=@1 (sem combustível) @1 (output bins are full)=@1 (saída de itens está lotada) -Furnace=Forno - -### inventory.lua ### - -@1 (Locked)=@1 (trancado) +@1 (active: @2%)=@1 (ativo: @2%) +@1 (active)=@1 (ativo) @1 (owned by @2)=@1 (pertence a @2) +@1 (Locked)=@1 (trancado) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt_BR.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt_BR.tr index e55674cc..777e3707 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.pt_BR.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Gaveta Pequena de Madeira Terracotta Roof Tile=Telha de Terracota - -### expansion.lua ### - +Small Wooden Drawer=Gaveta Pequena de Madeira Not enough room - the space for the headboard is occupied!=Sem espaço - o espaço para a cabeceira está ocupado! +Someone already owns the spot where the headboard goes.=Alguém já é proprietário do local onde a cabeceira vai. Not enough room - the upper space is occupied!=Sem espaço - o espaço acima está ocupado! Someone already owns that spot.=Alguém já é proprietário deste lugar. -Someone already owns the spot where the headboard goes.=Alguém já é proprietário do local onde a cabeceira vai. - -### furnaces.lua ### - -@1 (active)=@1 (ativo) -@1 (active: @2%)=@1 (ativo: @2%) +Furnace=Forno @1 (empty)=@1 (vazio) @1 (out of fuel)=@1 (sem combustível) @1 (output bins are full)=@1 (saída de itens está lotada) -Furnace=Forno - -### inventory.lua ### - -@1 (Locked)=@1 (trancado) +@1 (active: @2%)=@1 (ativo: @2%) +@1 (active)=@1 (ativo) @1 (owned by @2)=@1 (pertence a @2) +@1 (Locked)=@1 (trancado) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ru.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ru.tr index 53287dfb..824328fa 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ru.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.ru.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=Маленький деревянный выдвижной ящик Terracotta Roof Tile=Терракотовая крыша - -### expansion.lua ### - +Small Wooden Drawer=Маленький деревянный выдвижной ящик Not enough room - the space for the headboard is occupied!=Не хватает места - пространство для изголовья занято! +Someone already owns the spot where the headboard goes.=Точка, куда ставится изголовье, уже принадлежит кому-то. Not enough room - the upper space is occupied!=Не хватает места - верхнее пространство занято! Someone already owns that spot.=Та точка уже принадлежит кому-то. -Someone already owns the spot where the headboard goes.=Точка, куда ставится изголовье, уже принадлежит кому-то. - -### furnaces.lua ### - -@1 (active)=@1 (активно) -@1 (active: @2%)=@1 (активно: @2%) +Furnace=Печь @1 (empty)=@1 (пусто) @1 (out of fuel)=@1 (не хватает топлива) @1 (output bins are full)=@1 (выходные ячейки заполнены) -Furnace=Печь - -### inventory.lua ### - -@1 (Locked)=@1 (Закрыто) +@1 (active: @2%)=@1 (активно: @2%) +@1 (active)=@1 (активно) @1 (owned by @2)=@1 (принадлежит @2) +@1 (Locked)=@1 (Закрыто) diff --git a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.zh_CN.tr b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.zh_CN.tr index 21114eb7..ac40da24 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_common/locale/homedecor_common.zh_CN.tr @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer=小的木抽屉 Terracotta Roof Tile=陶土屋顶瓦 - -### expansion.lua ### - +Small Wooden Drawer=小的木抽屉 Not enough room - the space for the headboard is occupied!=没有足够的空间-床头板的空间被占用了! +Someone already owns the spot where the headboard goes.=有东西已经占用床头板的位置了。 Not enough room - the upper space is occupied!=没有足够的空间-上面的空间被占用了! Someone already owns that spot.=已经有东西占用那个地方了。 -Someone already owns the spot where the headboard goes.=有东西已经占用床头板的位置了。 - -### furnaces.lua ### - -@1 (active)=@1(活动) -@1 (active: @2%)=@1(活动:@2%) +Furnace=熔炉 @1 (empty)=@1(空) @1 (out of fuel)=@1(燃油耗尽) @1 (output bins are full)=@1(输出箱已满) -Furnace=熔炉 - -### inventory.lua ### - -@1 (Locked)=@1(锁定) +@1 (active: @2%)=@1(活动:@2%) +@1 (active)=@1(活动) @1 (owned by @2)=@1(归@2所有) +@1 (Locked)=@1(锁定) diff --git a/mods/homedecor_modpack/homedecor_common/locale/template.txt b/mods/homedecor_modpack/homedecor_common/locale/template.txt index b470842d..c66c0a44 100644 --- a/mods/homedecor_modpack/homedecor_common/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_common/locale/template.txt @@ -1,28 +1,15 @@ # textdomain: homedecor_common - - -### crafts.lua ### - -Small Wooden Drawer= Terracotta Roof Tile= - -### expansion.lua ### - +Small Wooden Drawer= Not enough room - the space for the headboard is occupied!= +Someone already owns the spot where the headboard goes.= Not enough room - the upper space is occupied!= Someone already owns that spot.= -Someone already owns the spot where the headboard goes.= - -### furnaces.lua ### - -@1 (active)= -@1 (active: @2%)= +Furnace= @1 (empty)= @1 (out of fuel)= @1 (output bins are full)= -Furnace= - -### inventory.lua ### - -@1 (Locked)= +@1 (active: @2%)= +@1 (active)= @1 (owned by @2)= +@1 (Locked)= diff --git a/mods/homedecor_modpack/homedecor_common/mod.conf b/mods/homedecor_modpack/homedecor_common/mod.conf index ab7c4320..7a8bec85 100644 --- a/mods/homedecor_modpack/homedecor_common/mod.conf +++ b/mods/homedecor_modpack/homedecor_common/mod.conf @@ -1,4 +1,4 @@ name = homedecor_common description = Homedecor mod: common -depends = default, creative -optional_depends = screwdriver +depends = basic_materials, unifieddyes, xcompat +optional_depends = screwdriver, hopper, default, creative, sound_api, fl_stone, fl_mapgen, i3, mcl_core, mcl_mapgen_core, void_essential, mapgen diff --git a/mods/homedecor_modpack/homedecor_common/nodeboxes.lua b/mods/homedecor_modpack/homedecor_common/nodeboxes.lua index 6960072b..f9150880 100644 --- a/mods/homedecor_modpack/homedecor_common/nodeboxes.lua +++ b/mods/homedecor_modpack/homedecor_common/nodeboxes.lua @@ -10,7 +10,7 @@ homedecor.box = { slab_y = function(height, shift) return { -0.5, -0.5+(shift or 0), -0.5, 0.5, -0.5+height+(shift or 0), 0.5 } end, -- slab starting from -z (+z with negative depth) slab_z = function(depth, shift) - -- for consistency with the other functions here, we have to assume that a "z" slab starts from -z and extends by depth, + -- for consistency with the other functions here, we have to assume that a z slab starts from -z and extends by depth, -- but since conventionally a lot of nodes place slabs against +z for player convenience, we define -- a "negative" depth as a depth extending from the other side, i.e. +z local s = shift or 0 diff --git a/mods/homedecor_modpack/homedecor_common/registration.lua b/mods/homedecor_modpack/homedecor_common/registration.lua index f31eee0d..cb2b13cd 100644 --- a/mods/homedecor_modpack/homedecor_common/registration.lua +++ b/mods/homedecor_modpack/homedecor_common/registration.lua @@ -6,6 +6,21 @@ local placeholder_node = "homedecor:expansion_placeholder" function homedecor.register(name, original_def) local def = table.copy(original_def) + def.is_furnace = nil + + if def.groups and (def.groups.crumbly or def.groups.oddly_breakable_by_hand) then + def.groups["handy"]=1 + def._mcl_hardness=0.6 + elseif def.groups and (def.groups.snappy or def.groups.choppy) then + def.groups["axey"]=5 + def._mcl_hardness=1.6 + elseif def.groups and (def.groups.cracky or def.groups.crumbly) then + def.groups["pickaxey"]=5 + def._mcl_hardness=1.6 + end + + def.is_ground_content = def.is_ground_content == true + def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") @@ -44,9 +59,12 @@ function homedecor.register(name, original_def) if expand then -- dissallow rotating only half the expanded node by default -- unless we know better - def.on_rotate = def.on_rotate - or (minetest.get_modpath("screwdriver") and (def.mesh and expand.top and screwdriver.rotate_simple) - or screwdriver.disallow) or nil + def.on_rotate = def.on_rotate or ( + minetest.get_modpath("screwdriver") and ( + (def.mesh and expand.top and screwdriver.rotate_simple) or + screwdriver.disallow + ) + ) def.on_place = def.on_place or function(itemstack, placer, pointed_thing) if expand.top then @@ -94,6 +112,31 @@ function homedecor.register(name, original_def) end end + local crafts = def.crafts and table.copy(def.crafts) or {} + def.crafts = nil + -- register the actual minetest node minetest.register_node(":homedecor:" .. name, def) + + for _, cdef in pairs(crafts) do + if cdef.recipe then + for k, row in pairs(cdef.recipe) do + if type(row) == "string" and homedecor.materials[row] then + cdef.recipe[k] = homedecor.materials[row] + elseif type(row) == "table" then + for i, item in pairs(row) do + if homedecor.materials[item] then + cdef.recipe[k][i] = homedecor.materials[item] + end + end + end + end + end + + if cdef.type ~= "toolrepair" and not cdef.output then + cdef.output = "homedecor:" .. name + end + + minetest.register_craft(cdef) + end end diff --git a/mods/homedecor_modpack/homedecor_common/sit.lua b/mods/homedecor_modpack/homedecor_common/sit.lua deleted file mode 100644 index fc49177f..00000000 --- a/mods/homedecor_modpack/homedecor_common/sit.lua +++ /dev/null @@ -1,34 +0,0 @@ -function homedecor.sit(pos, node, clicker) - return -- delete it when the engine is stabler for the player's physics ---[[ - local meta = minetest.get_meta(pos) - local param2 = node.param2 - local name = clicker:get_player_name() - - if name == meta:get_string("is_sit") then - meta:set_string("is_sit", "") - pos.y = pos.y-0.5 - clicker:setpos(pos) - clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) - clicker:set_physics_override(1, 1, 1) - default.player_attached[name] = false - default.player_set_animation(clicker, "stand", 30) - else - meta:set_string("is_sit", clicker:get_player_name()) - clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0}) - clicker:set_physics_override(0, 0, 0) - clicker:setpos(pos) - default.player_attached[name] = true - default.player_set_animation(clicker, "sit", 30) - if param2 == 0 then - clicker:set_look_yaw(3.15) - elseif param2 == 1 then - clicker:set_look_yaw(7.9) - elseif param2 == 2 then - clicker:set_look_yaw(6.28) - elseif param2 == 3 then - clicker:set_look_yaw(4.75) - else return end - end ---]] -end diff --git a/mods/homedecor_modpack/homedecor_common/textures/homedecor_blanktile.png b/mods/homedecor_modpack/homedecor_common/textures/homedecor_blanktile.png deleted file mode 100644 index dcdefebb..00000000 Binary files a/mods/homedecor_modpack/homedecor_common/textures/homedecor_blanktile.png and /dev/null differ diff --git a/mods/homedecor_modpack/homedecor_common/xcompat.lua b/mods/homedecor_modpack/homedecor_common/xcompat.lua new file mode 100644 index 00000000..1efe2ba5 --- /dev/null +++ b/mods/homedecor_modpack/homedecor_common/xcompat.lua @@ -0,0 +1,8 @@ +homedecor.plain_wood = { name = "homedecor_generic_wood_plain.png", color = 0xffa76820 } +homedecor.mahogany_wood = { name = "homedecor_generic_wood_plain.png", color = 0xff7d2506 } +homedecor.white_wood = "homedecor_generic_wood_plain.png" +homedecor.dark_wood = { name = "homedecor_generic_wood_plain.png", color = 0xff39240f } +homedecor.lux_wood = { name = "homedecor_generic_wood_luxury.png", color = 0xff643f23 } + +homedecor.materials = xcompat.materials +homedecor.textures = xcompat.textures \ No newline at end of file diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/.luacheckrc b/mods/homedecor_modpack/homedecor_doors_and_gates/.luacheckrc deleted file mode 100644 index 935eeb19..00000000 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/.luacheckrc +++ /dev/null @@ -1,23 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "doors", - "mesecon", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/init.lua b/mods/homedecor_modpack/homedecor_doors_and_gates/init.lua index 0554db5e..84356de0 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/init.lua +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/init.lua @@ -1,212 +1,150 @@ -- Node definitions for Homedecor doors +if not minetest.get_modpath("doors") or not minetest.get_modpath("default") then + minetest.log( + "action", + "[homedecor_doors_and_gates]: minetest game not detected, disabling as this mod is minetest game only at this time" + ) + return +end + local S = minetest.get_translator("homedecor_doors_and_gates") local mesecons_mp = minetest.get_modpath("mesecons") homedecor_doors_and_gates = {} --- new doors using minetest_game doors API - local door_list = { { name = "wood_plain", description = S("Plain Wooden Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - open = "homedecor_door_open", - close = "homedecor_door_close", - } + sounds = default.node_sound_wood_defaults(), + sound_open = "homedecor_door_open", + sound_close = "homedecor_door_close", }, - { name = "exterior_fancy", description = S("Fancy Wood/Glass Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - open = "homedecor_door_open", - close = "homedecor_door_close", - }, - backface = true, - alpha = true, - custom_model = "homedecor_door_fancy" + sounds = default.node_sound_wood_defaults(), + sound_open = "homedecor_door_open", + sound_close = "homedecor_door_close", + mesh = "homedecor_door_fancy" }, - { name = "french_oak", description = S("French door, Oak-colored"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_glass_defaults(), - }, - backface = true, - alpha = true, - custom_model = "homedecor_door_french" + sounds = default.node_sound_glass_defaults(), + mesh = "homedecor_door_french" }, - { name = "french_mahogany", description = S("French door, Mahogany-colored"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_glass_defaults(), - }, - backface = true, - alpha = true, - custom_model = "homedecor_door_french" + sounds = default.node_sound_glass_defaults(), + mesh = "homedecor_door_french" }, - { name = "french_white", description = S("French door, White"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_glass_defaults(), - }, - backface = true, - alpha = true, - custom_model = "homedecor_door_french" + sounds = default.node_sound_glass_defaults(), + mesh = "homedecor_door_french" }, - { name = "basic_panel", description = S("Basic white panel Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - open = "homedecor_door_open", - close = "homedecor_door_close", - } + sounds = default.node_sound_wood_defaults(), + sound_open = "homedecor_door_open", + sound_close = "homedecor_door_close", }, - { name = "wrought_iron", description = S("Wrought Iron Gate/Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_metal_defaults(), - open = "doors_steel_door_open", - close = "doors_steel_door_close", - }, - backface = true, - custom_model = "homedecor_door_wrought_iron" + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + mesh = "homedecor_door_wrought_iron" }, - { name = "carolina", description = S("Wooden Carolina door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - open = "homedecor_door_open", - close = "homedecor_door_close", - }, - backface = true, - alpha = true + sounds = default.node_sound_wood_defaults(), + sound_open = "homedecor_door_open", + sound_close = "homedecor_door_close", }, - { name = "woodglass", description = S("Wooden door with glass insert, type 3"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - open = "homedecor_door_open", - close = "homedecor_door_close", - }, - backface = true, - alpha = true, - custom_model = "homedecor_door_wood_glass_3" + sounds = default.node_sound_wood_defaults(), + sound_open = "homedecor_door_open", + sound_close = "homedecor_door_close", + mesh = "homedecor_door_wood_glass_3" }, - { name = "closet_mahogany", description = S("Mahogany Closet Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - }, - custom_model = "homedecor_door_closet" + sounds = default.node_sound_wood_defaults(), + mesh = "homedecor_door_closet" }, - { name = "closet_oak", description = S("Oak Closet Door"), - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = { - main = default.node_sound_wood_defaults(), - }, - custom_model = "homedecor_door_closet" + sounds = default.node_sound_wood_defaults(), + mesh = "homedecor_door_closet" }, } local old_doors = {} -local mesecons --- This part blatantly copied from Mesecons, and modified :-) -if mesecons_mp then - mesecons = { - effector = { - action_on = function(pos, node) - local door = doors.get(pos) - if door then - door:open() - end - end, - action_off = function(pos, node) - local door = doors.get(pos) - if door then - door:close() - end - end, - rules = mesecon.rules.pplate - } +local door_types = {"_a", "_b", "_c", "_d"} +local door_conversion = {["_c"]="_a", ["_d"]="_b"} + +local function generate_door(def) + local default_settings = { + tiles = {{ name = "homedecor_door_" .. def.name .. ".png", backface_culling = true }}, + inventory_image = "homedecor_door_" .. def.name .. "_inv.png", + use_texture_alpha = "blend", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + mesecons = { + effector = { + action_on = function(pos, node) + local door = doors.get(pos) + if door then door:open() end + end, + action_off = function(pos, node) + local door = doors.get(pos) + if door then door:close() end + end, + rules = minetest.global_exists("mesecon") and mesecon.rules.pplate or nil + } + }, } + + for k, v in pairs(default_settings) do + if not def[k] then def[k] = v end + end + + def.name = nil + + return def end -local hd_3d = minetest.get_modpath("homedecor_3d_extras") - for _, door in ipairs(door_list) do - doors.register("homedecor_"..door.name, { - tiles = {{ name = "homedecor_door_"..door.name..".png", backface_culling = door.backface }}, - description = door.description, - inventory_image = "homedecor_door_"..door.name.."_inv.png", - groups = table.copy(door.groups), - sounds = door.sounds.main, - sound_open = door.sounds.open, - sound_close = door.sounds.close, - mesecons = mesecons - }) + local name, mesh = door.name, door.mesh + doors.register("homedecor_" .. name, generate_door(door)) - local nn_a = "doors:homedecor_"..door.name.."_a" - local nn_b = "doors:homedecor_"..door.name.."_b" - - if door.alpha then - local def = table.copy(minetest.registered_nodes[nn_a]) - def.use_texture_alpha = true - def.mesh = "door_a.obj" -- leaving this out will break the _a model - minetest.register_node(":"..nn_a, def) -- assignment when the override takes place - - def = table.copy(minetest.registered_nodes[nn_b]) - def.use_texture_alpha = true - minetest.register_node(":"..nn_b, def) + --hack to get around doors not allowing custom meshes + if mesh then + for _, v in pairs(door_types) do + if door_conversion[v] then v=door_conversion[v] end + minetest.override_item("doors:homedecor_" .. name .. v, { + mesh = mesh .. v .. ".obj" + }) + end end - if door.custom_model and hd_3d then - def = table.copy(minetest.registered_nodes[nn_a]) - def.mesh = door.custom_model.."_a.obj" - minetest.register_node(":"..nn_a, def) + --compatibility + old_doors[#old_doors + 1] = "homedecor:door_"..name.."_left" + old_doors[#old_doors + 1] = "homedecor:door_"..name.."_right" - def = table.copy(minetest.registered_nodes[nn_b]) - def.mesh = door.custom_model.."_b.obj" - minetest.register_node(":"..nn_b, def) - end - - old_doors[#old_doors + 1] = "homedecor:door_"..door.name.."_left" - old_doors[#old_doors + 1] = "homedecor:door_"..door.name.."_right" - - minetest.register_alias("doors:"..door.name.."_a", "doors:homedecor_"..door.name.."_a") - minetest.register_alias("doors:"..door.name.."_b", "doors:homedecor_"..door.name.."_b") + minetest.register_alias("doors:"..name.."_a", "doors:homedecor_"..name.."_a") + minetest.register_alias("doors:"..name.."_b", "doors:homedecor_"..name.."_b") end -- Gates @@ -293,10 +231,10 @@ for i, g in ipairs(gate_list) do if gate == "picket" or gate == "picket_white" then tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_blanktile.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", "homedecor_gate_"..gate.."_back.png", "homedecor_gate_"..gate.."_front.png" } @@ -307,7 +245,10 @@ for i, g in ipairs(gate_list) do description = gatedesc, tiles = tiles, paramtype = "light", - groups = {snappy=3}, + use_texture_alpha = "clip", + groups = {snappy=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, sounds = default.node_sound_wood_defaults(), paramtype2 = "facedir", selection_box = { @@ -469,8 +410,8 @@ minetest.register_craft( { type = "shapeless", output = "homedecor:gate_half_door_closed 4", recipe = { - "doors:homedecor_wood_plain_a", - "doors:homedecor_wood_plain_a" + "doors:homedecor_wood_plain", + "doors:homedecor_wood_plain" }, }) @@ -478,8 +419,8 @@ minetest.register_craft( { type = "shapeless", output = "homedecor:gate_half_door_white_closed 4", recipe = { - "doors:homedecor_bedroom_a", - "doors:homedecor_bedroom_a" + "doors:homedecor_basic_panel", + "doors:homedecor_basic_panel" }, }) diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.de.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.de.tr index 4c568bd0..59efe6c4 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.de.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.de.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door=„Halbe“ Tür -"Half" Door (white)=„Halbe“ Tür (weiß) -Barbed Wire Fence Gate=Stacheldrahtzauntor -Basic white panel Door=weiße Zimmertür -Chainlink Fence Gate=Maschendrahtzauntor -Fancy Wood/Glass Door=moderne Tür mit Lichtausschnitt -French door, Mahogany-colored=französische Flügeltür (Mahagonidesign) -French door, Oak-colored=französische Flügeltür (Eichendesign) -French door, White=französische Flügeltür (weiß) -Japanese-style door=Tür im japanischen Stil -Mahogany Closet Door=Mahagonilamellentür -Oak Closet Door=Eichenlamellentür Plain Wooden Door=Echtholz-Zimmertür -Unpainted Picket Fence Gate=Unlackiertes Lattenzauntor -White Picket Fence Gate=Weißes Lattenzauntor +Fancy Wood/Glass Door=Moderne Tür mit Lichtausschnitt +French door, Oak-colored=Französische Flügeltür (Eichendesign) +French door, Mahogany-colored=Französische Flügeltür (Mahagonidesign) +French door, White=Französische Flügeltür (weiß) +Basic white panel Door=Weiße Zimmertür +Wrought Iron Gate/Door=Schmiedeeisernes Tor Wooden Carolina door=Holztür, Carolina-Stil Wooden door with glass insert, type 3=Tür mit Lichtausschnitt -Wrought Iron Gate/Door=schmiedeeisernes Tor +Mahogany Closet Door=Mahagonilamellentür +Oak Closet Door=Eichenlamellentür +Unpainted Picket Fence Gate=Unlackiertes Lattenzauntor +White Picket Fence Gate=Weißes Lattenzauntor +Barbed Wire Fence Gate=Stacheldrahtzauntor +Chainlink Fence Gate=Maschendrahtzauntor +"Half" Door=„Halbe“ Tür +"Half" Door (white)=„Halbe“ Tür (weiß) +Japanese-style door=Tür im japanischen Stil diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.es.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.es.tr index 549e7215..bdbda3f5 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.es.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.es.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door= -"Half" Door (white)= -Barbed Wire Fence Gate=Cerca de alambre de espino -Basic white panel Door= -Chainlink Fence Gate=Cerca de eslabón de cadena -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=Puerta estilo japonés -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Cerca de piquete sin pintar -White Picket Fence Gate=Cerca de piquete blanca +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Cerca de piquete sin pintar +White Picket Fence Gate=Cerca de piquete blanca +Barbed Wire Fence Gate=Cerca de alambre de espino +Chainlink Fence Gate=Cerca de eslabón de cadena +"Half" Door= +"Half" Door (white)= +Japanese-style door=Puerta estilo japonés diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.fr.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.fr.tr index 59922b19..58ab2d31 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.fr.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.fr.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door=Demi-porte -"Half" Door (white)=Demi-porte (blanche) -Barbed Wire Fence Gate=Portillon en fil barbelé -Basic white panel Door=Porte blanche simple à panneaux -Chainlink Fence Gate=Portillon grillagé -Fancy Wood/Glass Door=Porte chic en bois et verre -French door, Mahogany-colored=Porte française, couleur acajou -French door, Oak-colored=Porte française, couleur chêne -French door, White=Porte française, blanche -Japanese-style door=Porte japonaise -Mahogany Closet Door=Porte de placard en acajou -Oak Closet Door=Porte de placard en chêne Plain Wooden Door=Porte en bois simple -Unpainted Picket Fence Gate=Portillon en piquets bruts -White Picket Fence Gate=Portillon en piquets blancs +Fancy Wood/Glass Door=Porte chic en bois et verre +French door, Oak-colored=Porte française, couleur chêne +French door, Mahogany-colored=Porte française, couleur acajou +French door, White=Porte française, blanche +Basic white panel Door=Porte blanche simple à panneaux +Wrought Iron Gate/Door=Porte en fer forgé Wooden Carolina door=Porte en pin de caroline Wooden door with glass insert, type 3=Porte en bois avec fenêtre en verre, type 3 -Wrought Iron Gate/Door=Porte en fer forgé +Mahogany Closet Door=Porte de placard en acajou +Oak Closet Door=Porte de placard en chêne +Unpainted Picket Fence Gate=Portillon en piquets bruts +White Picket Fence Gate=Portillon en piquets blancs +Barbed Wire Fence Gate=Portillon en fil barbelé +Chainlink Fence Gate=Portillon grillagé +"Half" Door=Demi-porte +"Half" Door (white)=Demi-porte (blanche) +Japanese-style door=Porte japonaise diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.it.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.it.tr index 47f9ea2a..b3fb8a59 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.it.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.it.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door= -"Half" Door (white)= -Barbed Wire Fence Gate=Cancello della recinzione di filo spinato -Basic white panel Door= -Chainlink Fence Gate=Cancello della rete metallica -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door= -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Cancello della recinzione non verniciata di paletti -White Picket Fence Gate=Cancello della recinzione di paletti bianca +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Cancello della recinzione non verniciata di paletti +White Picket Fence Gate=Cancello della recinzione di paletti bianca +Barbed Wire Fence Gate=Cancello della recinzione di filo spinato +Chainlink Fence Gate=Cancello della rete metallica +"Half" Door= +"Half" Door (white)= +Japanese-style door= diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ms.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ms.tr index 0979828e..9e803dda 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ms.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ms.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door=Pintu "Separuh" -"Half" Door (white)=Pintu "Separuh" (Putih) -Barbed Wire Fence Gate=Pintu Pagar Dawai Berduri -Basic white panel Door= -Chainlink Fence Gate=Pintu Pagar Dawai Berangkai -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=Pintu Gaya Jepun -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Pintu Pagar Pancang Tidak Bercat -White Picket Fence Gate=Pintu Pagar Pancang Putih +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Pintu Pagar Pancang Tidak Bercat +White Picket Fence Gate=Pintu Pagar Pancang Putih +Barbed Wire Fence Gate=Pintu Pagar Dawai Berduri +Chainlink Fence Gate=Pintu Pagar Dawai Berangkai +"Half" Door=Pintu "Separuh" +"Half" Door (white)=Pintu "Separuh" (Putih) +Japanese-style door=Pintu Gaya Jepun diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt.tr index 5d0b64d5..efde3a27 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door= -"Half" Door (white)= -Barbed Wire Fence Gate=Porteira de Arame Farpado -Basic white panel Door= -Chainlink Fence Gate=Porteira de Tela de Arame -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=Porta estilo japonês -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Porteira de Madeira Não Pintada -White Picket Fence Gate=Porteira Branca de Piquete +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Porteira de Madeira Não Pintada +White Picket Fence Gate=Porteira Branca de Piquete +Barbed Wire Fence Gate=Porteira de Arame Farpado +Chainlink Fence Gate=Porteira de Tela de Arame +"Half" Door= +"Half" Door (white)= +Japanese-style door=Porta estilo japonês diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt_BR.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt_BR.tr index 5d0b64d5..efde3a27 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.pt_BR.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door= -"Half" Door (white)= -Barbed Wire Fence Gate=Porteira de Arame Farpado -Basic white panel Door= -Chainlink Fence Gate=Porteira de Tela de Arame -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=Porta estilo japonês -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Porteira de Madeira Não Pintada -White Picket Fence Gate=Porteira Branca de Piquete +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Porteira de Madeira Não Pintada +White Picket Fence Gate=Porteira Branca de Piquete +Barbed Wire Fence Gate=Porteira de Arame Farpado +Chainlink Fence Gate=Porteira de Tela de Arame +"Half" Door= +"Half" Door (white)= +Japanese-style door=Porta estilo japonês diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ru.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ru.tr index 1d8ec623..ee8ae4c9 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ru.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.ru.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door=Полуразмерная дверь -"Half" Door (white)=Полуразмерная дверь (белая) -Barbed Wire Fence Gate=Ворота для забора из колючей проволоки -Basic white panel Door= -Chainlink Fence Gate=Ворота для цепного забора -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=Дверь в японском стиле -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=Некрашеные ворота для забора из частокола -White Picket Fence Gate=Белые ворота для забора из частокола +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=Некрашеные ворота для забора из частокола +White Picket Fence Gate=Белые ворота для забора из частокола +Barbed Wire Fence Gate=Ворота для забора из колючей проволоки +Chainlink Fence Gate=Ворота для цепного забора +"Half" Door=Полуразмерная дверь +"Half" Door (white)=Полуразмерная дверь (белая) +Japanese-style door=Дверь в японском стиле diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.zh_CN.tr b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.zh_CN.tr index 1a3dc3dd..f4803079 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/homedecor_doors_and_gates.zh_CN.tr @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door=\半门 -"Half" Door (white)=\半门(白色) -Barbed Wire Fence Gate=铁丝网栅栏门 -Basic white panel Door= -Chainlink Fence Gate=铁链栅栏门 -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door=日式门 -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate=未上漆的尖桩栅栏门 -White Picket Fence Gate=白色尖桩栅栏门 +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate=未上漆的尖桩栅栏门 +White Picket Fence Gate=白色尖桩栅栏门 +Barbed Wire Fence Gate=铁丝网栅栏门 +Chainlink Fence Gate=铁链栅栏门 +"Half" Door=\半门 +"Half" Door (white)=\半门(白色) +Japanese-style door=日式门 diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/template.txt b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/template.txt index 4fda4931..50539220 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/locale/template.txt @@ -1,23 +1,19 @@ # textdomain: homedecor_doors_and_gates - - -### init.lua ### - -"Half" Door= -"Half" Door (white)= -Barbed Wire Fence Gate= -Basic white panel Door= -Chainlink Fence Gate= -Fancy Wood/Glass Door= -French door, Mahogany-colored= -French door, Oak-colored= -French door, White= -Japanese-style door= -Mahogany Closet Door= -Oak Closet Door= Plain Wooden Door= -Unpainted Picket Fence Gate= -White Picket Fence Gate= +Fancy Wood/Glass Door= +French door, Oak-colored= +French door, Mahogany-colored= +French door, White= +Basic white panel Door= +Wrought Iron Gate/Door= Wooden Carolina door= Wooden door with glass insert, type 3= -Wrought Iron Gate/Door= +Mahogany Closet Door= +Oak Closet Door= +Unpainted Picket Fence Gate= +White Picket Fence Gate= +Barbed Wire Fence Gate= +Chainlink Fence Gate= +"Half" Door= +"Half" Door (white)= +Japanese-style door= diff --git a/mods/homedecor_modpack/homedecor_doors_and_gates/mod.conf b/mods/homedecor_modpack/homedecor_doors_and_gates/mod.conf index fe1693ab..0c8fc055 100644 --- a/mods/homedecor_modpack/homedecor_doors_and_gates/mod.conf +++ b/mods/homedecor_modpack/homedecor_doors_and_gates/mod.conf @@ -1,4 +1,4 @@ name = homedecor_doors_and_gates description = Homedecor mod: doors and gates -depends = homedecor_common, default, basic_materials, dye, doors -optional_depends = homedecor_misc, homedecor_3d_extras, mesecons, screwdriver +depends = homedecor_common +optional_depends = homedecor_misc, homedecor_3d_extras, mesecons, screwdriver, default, doors diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_closet_a.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_closet_a.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_closet_a.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_closet_a.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_closet_b.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_closet_b.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_closet_b.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_closet_b.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_fancy_a.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_fancy_a.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_fancy_a.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_fancy_a.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_fancy_b.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_fancy_b.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_fancy_b.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_fancy_b.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_french_a.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_french_a.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_french_a.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_french_a.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_french_b.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_french_b.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_french_b.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_french_b.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wood_glass_3_a.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wood_glass_3_a.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wood_glass_3_a.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wood_glass_3_a.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wood_glass_3_b.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wood_glass_3_b.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wood_glass_3_b.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wood_glass_3_b.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wrought_iron_a.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wrought_iron_a.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wrought_iron_a.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wrought_iron_a.obj diff --git a/mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wrought_iron_b.obj b/mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wrought_iron_b.obj similarity index 100% rename from mods/homedecor_modpack/homedecor_3d_extras/models/homedecor_door_wrought_iron_b.obj rename to mods/homedecor_modpack/homedecor_doors_and_gates/models/homedecor_door_wrought_iron_b.obj diff --git a/mods/homedecor_modpack/homedecor_electrical/.luacheckrc b/mods/homedecor_modpack/homedecor_electrical/.luacheckrc deleted file mode 100644 index b7b26372..00000000 --- a/mods/homedecor_modpack/homedecor_electrical/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "homedecor", - "mesecon", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_electrical/init.lua b/mods/homedecor_modpack/homedecor_electrical/init.lua index fd77b710..3feaa141 100644 --- a/mods/homedecor_modpack/homedecor_electrical/init.lua +++ b/mods/homedecor_modpack/homedecor_electrical/init.lua @@ -53,7 +53,16 @@ homedecor.register("power_outlet", { } }, groups = {cracky=3,dig_immediate=2}, - walkable = false + walkable = false, + crafts = { + { + recipe = { + {"basic_materials:plastic_sheet", "basic_materials:copper_strip"}, + {"basic_materials:plastic_sheet", ""}, + {"basic_materials:plastic_sheet", "basic_materials:copper_strip"} + }, + } + } }) for _, onoff in ipairs ({"on", "off"}) do @@ -120,7 +129,7 @@ homedecor.register("doorbell", { tiles = { "homedecor_doorbell.png" }, inventory_image = "homedecor_doorbell_inv.png", description = S("Doorbell"), - groups = {snappy=3}, + groups = {snappy=3, dig_tree = 3}, walkable = false, node_box = { type = "fixed", @@ -135,20 +144,18 @@ homedecor.register("doorbell", { gain = 1.0, max_hear_distance = 15 }) - end + end, + crafts = { + { + recipe = { + { "homedecor:light_switch_off", "basic_materials:energy_crystal_simple", "homedecor:speaker_driver" } + }, + } + } }) -- crafting -minetest.register_craft( { - output = "homedecor:power_outlet", - recipe = { - {"basic_materials:plastic_sheet", "basic_materials:copper_strip"}, - {"basic_materials:plastic_sheet", ""}, - {"basic_materials:plastic_sheet", "basic_materials:copper_strip"} - }, -}) - minetest.register_craft( { output = "homedecor:light_switch_off", recipe = { @@ -158,13 +165,6 @@ minetest.register_craft( { }, }) -minetest.register_craft( { - output = "homedecor:doorbell", - recipe = { - { "homedecor:light_switch_off", "basic_materials:energy_crystal_simple", "homedecor:speaker_driver" } - }, -}) - -- aliases minetest.register_alias("homedecor:light_switch", "homedecor:light_switch_on") diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.de.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.de.tr index be0d17cb..ddd2bb96 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.de.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Türklingel -Light switch=Lichtschalter Power Outlet=Steckdose +Light switch=Lichtschalter +Doorbell=Türklingel diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.es.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.es.tr index 1fe8600a..6d15d6ab 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.es.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.es.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Timbre -Light switch=Interruptor de luz Power Outlet=Toma de corriente +Light switch=Interruptor de luz +Doorbell=Timbre diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.fr.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.fr.tr index 885af010..69e0005c 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.fr.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Sonnette -Light switch=Interrupteur Power Outlet=Prise de courant +Light switch=Interrupteur +Doorbell=Sonnette diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ms.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ms.tr index aca48ab2..ee97abfd 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ms.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ms.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Loceng Pintu -Light switch=Suis Lampu Power Outlet=Palam Elektrik +Light switch=Suis Lampu +Doorbell=Loceng Pintu diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt.tr index 1f0dcd32..bbd254c5 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Campainha -Light switch=Interruptor de luz Power Outlet=Cristal de Força +Light switch=Interruptor de luz +Doorbell=Campainha diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt_BR.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt_BR.tr index 1f0dcd32..bbd254c5 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.pt_BR.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Campainha -Light switch=Interruptor de luz Power Outlet=Cristal de Força +Light switch=Interruptor de luz +Doorbell=Campainha diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ru.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ru.tr index 3a957836..e66475c1 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ru.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.ru.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=Дверной звонок -Light switch=Выключатель света Power Outlet=Розетка +Light switch=Выключатель света +Doorbell=Дверной звонок diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.zh_CN.tr b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.zh_CN.tr index 4f0d3970..3c3e3c33 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_electrical/locale/homedecor_electrical.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell=门铃 -Light switch=灯光开关 Power Outlet=电源插座 +Light switch=灯光开关 +Doorbell=门铃 diff --git a/mods/homedecor_modpack/homedecor_electrical/locale/template.txt b/mods/homedecor_modpack/homedecor_electrical/locale/template.txt index f416388f..f4d8c4b3 100644 --- a/mods/homedecor_modpack/homedecor_electrical/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_electrical/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_electrical - - -### init.lua ### - -Doorbell= -Light switch= Power Outlet= +Light switch= +Doorbell= diff --git a/mods/homedecor_modpack/homedecor_electrical/mod.conf b/mods/homedecor_modpack/homedecor_electrical/mod.conf index e06eafcb..a02b6ada 100644 --- a/mods/homedecor_modpack/homedecor_electrical/mod.conf +++ b/mods/homedecor_modpack/homedecor_electrical/mod.conf @@ -1,4 +1,4 @@ name = homedecor_electrical description = Homedecor mod: electrical -depends = homedecor_common, default, basic_materials +depends = homedecor_common optional_depends = mesecons, mesecons_receiver diff --git a/mods/homedecor_modpack/homedecor_electronics/.luacheckrc b/mods/homedecor_modpack/homedecor_electronics/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_electronics/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_electronics/init.lua b/mods/homedecor_modpack/homedecor_electronics/init.lua index 76b5a855..953b73ea 100644 --- a/mods/homedecor_modpack/homedecor_electronics/init.lua +++ b/mods/homedecor_modpack/homedecor_electronics/init.lua @@ -9,11 +9,29 @@ homedecor.register("speaker", { "homedecor_speaker_sides.png", "homedecor_speaker_front.png" }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) minetest.set_node(pos, {name = "homedecor:speaker_open", param2 = node.param2}) - end + end, + crafts = { + { + recipe = { + { "wool_black", "homedecor:speaker_driver", "group:wood" }, + { "wool_black", "homedecor:speaker_driver", "group:wood" }, + { "wool_black", "group:wood", "group:wood" }, + }, + }, + { + recipe = { + { "cotton:black", "homedecor:speaker_driver", "group:wood" }, + { "cotton:black", "homedecor:speaker_driver", "group:wood" }, + { "cotton:black", "group:wood", "group:wood" }, + }, + } + } }) homedecor.register("speaker_open", { @@ -25,8 +43,10 @@ homedecor.register("speaker_open", { "homedecor_speaker_open_front.png", { name = "homedecor_generic_metal.png", color = homedecor.color_black } }, - groups = { snappy = 3, not_in_creative_inventory=1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, not_in_creative_inventory=1, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) minetest.set_node(pos, {name = "homedecor:speaker", param2 = node.param2}) end @@ -46,8 +66,22 @@ homedecor.register("speaker_small", { }, selection_box = spk_cbox, walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "wool_black", "homedecor:speaker_driver", "group:wood" }, + }, + }, + { + recipe = { + { "cotton:black", "homedecor:speaker_driver", "group:wood" }, + }, + } + } }) homedecor.register("stereo", { @@ -58,8 +92,19 @@ homedecor.register("stereo", { 'homedecor_stereo_left.png', 'homedecor_stereo_back.png', 'homedecor_stereo_front.png'}, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, + { "steel_ingot", "basic_materials:ic", "steel_ingot" }, + }, + } + } }) homedecor.register("projection_screen", { @@ -69,13 +114,25 @@ homedecor.register("projection_screen", { wield_image = 'homedecor_projection_screen_inv.png', inventory_image = 'homedecor_projection_screen_inv.png', walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_leaves_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_leaves_defaults", + }, paramtype2 = 'wallmounted', selection_box = { type = "wallmounted", --wall_side = = }, + crafts = { + { + output = "homedecor:projection_screen 3", + recipe = { + { "", "glass_block", "" }, + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + }, + }, + } }) homedecor.register("television", { @@ -94,9 +151,27 @@ homedecor.register("television", { } } }, - light_source = default.LIGHT_MAX - 1, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + light_source = minetest.LIGHT_MAX - 1, + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "glass_block", "basic_materials:plastic_sheet" }, + { "basic_materials:ic", "basic_materials:energy_crystal_simple", "basic_materials:ic" }, + }, + }, + { + recipe = { + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "moreblocks:glow_glass", "basic_materials:plastic_sheet" }, + { "basic_materials:ic", "basic_materials:ic", "basic_materials:ic" }, + }, + } + } }) homedecor.register("dvd_vcr", { @@ -117,8 +192,28 @@ homedecor.register("dvd_vcr", { {-0.25, -0.5, -0.25, 0.25, -0.1875, 0.125}, } }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + output = "homedecor:dvd_player 2", + recipe = { + { "", "basic_materials:plastic_sheet", "" }, + { "obsidian_glass", "basic_materials:motor", "basic_materials:motor" }, + { "mese_crystal_fragment", "basic_materials:ic", "basic_materials:energy_crystal_simple" }, + }, + }, + { + type = "shapeless", + output = "homedecor:dvd_vcr", + recipe = { + "homedecor:vcr", + "homedecor:dvd_player" + }, + } + } }) local tel_cbox = { @@ -136,13 +231,24 @@ homedecor.register("telephone", { }, inventory_image = "homedecor_telephone_inv.png", description = S("Telephone"), - groups = {snappy=3}, + groups = {snappy=3, dig_tree = 2}, selection_box = tel_cbox, walkable = false, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "homedecor:speaker_driver", "basic_materials:copper_wire", "homedecor:speaker_driver" }, + { "basic_materials:plastic_sheet", "steel_ingot", "basic_materials:plastic_sheet" }, + { "steel_ingot", "steel_ingot", "steel_ingot" } + }, + } + } }) --- crafting +-- craft items minetest.register_craftitem(":homedecor:vcr", { description = S("VCR"), @@ -159,21 +265,7 @@ minetest.register_craftitem(":homedecor:speaker_driver", { inventory_image = "homedecor_speaker_driver_inv.png" }) -minetest.register_craft( { - output = "homedecor:projection_screen 3", - recipe = { - { "", "default:glass", "" }, - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - }, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "homedecor:projection_screen", - burntime = 30, -}) - +--crafts minetest.register_craft( { output = "basic_materials:ic 4", @@ -183,110 +275,26 @@ minetest.register_craft( { }, }) -minetest.register_craft( { - output = "homedecor:television", - recipe = { - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "moreblocks:glow_glass", "basic_materials:plastic_sheet" }, - { "basic_materials:ic", "basic_materials:ic", "basic_materials:ic" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:television", - recipe = { - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "default:glass", "basic_materials:plastic_sheet" }, - { "basic_materials:ic", "basic_materials:energy_crystal_simple", "basic_materials:ic" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:stereo", - recipe = { - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:ic", "basic_materials:plastic_sheet" }, - { "default:steel_ingot", "basic_materials:ic", "default:steel_ingot" }, - }, -}) - - minetest.register_craft( { output = "homedecor:speaker_driver 2", recipe = { - { "", "default:steel_ingot", "" }, - { "default:paper", "basic_materials:copper_wire", "default:iron_lump" }, - { "", "default:steel_ingot", "" }, + { "", homedecor.materials["steel_ingot"], "" }, + { homedecor.materials["paper"], "basic_materials:copper_wire", homedecor.materials["iron_lump"] }, + { "", homedecor.materials["steel_ingot"], "" }, }, }) -minetest.register_craft( { - output = "homedecor:speaker_small", - recipe = { - { "wool:black", "homedecor:speaker_driver", "group:wood" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:speaker", - recipe = { - { "wool:black", "homedecor:speaker_driver", "group:wood" }, - { "wool:black", "homedecor:speaker_driver", "group:wood" }, - { "wool:black", "group:wood", "group:wood" }, - }, -}) - --- cotton version - -minetest.register_craft( { - output = "homedecor:speaker_small", - recipe = { - { "cotton:black", "homedecor:speaker_driver", "group:wood" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:speaker", - recipe = { - { "cotton:black", "homedecor:speaker_driver", "group:wood" }, - { "cotton:black", "homedecor:speaker_driver", "group:wood" }, - { "cotton:black", "group:wood", "group:wood" }, - }, -}) - - minetest.register_craft({ output = "homedecor:vcr 2", recipe = { - { "basic_materials:ic", "default:steel_ingot", "basic_materials:plastic_sheet" }, - { "default:iron_lump", "default:iron_lump", "default:iron_lump" }, + { "basic_materials:ic", homedecor.materials["steel_ingot"], "basic_materials:plastic_sheet" }, + { homedecor.materials["iron_lump"], homedecor.materials["iron_lump"], homedecor.materials["iron_lump"] }, { "basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet" }, }, }) minetest.register_craft({ - output = "homedecor:dvd_player 2", - recipe = { - { "", "basic_materials:plastic_sheet", "" }, - { "default:obsidian_glass", "basic_materials:motor", "basic_materials:motor" }, - { "default:mese_crystal_fragment", "basic_materials:ic", "basic_materials:energy_crystal_simple" }, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "homedecor:dvd_vcr", - recipe = { - "homedecor:vcr", - "homedecor:dvd_player" - }, -}) - -minetest.register_craft( { - output = "homedecor:telephone", - recipe = { - { "homedecor:speaker_driver", "basic_materials:copper_wire", "homedecor:speaker_driver" }, - { "basic_materials:plastic_sheet", "default:steel_ingot", "basic_materials:plastic_sheet" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } - }, -}) + type = "fuel", + recipe = "homedecor:projection_screen", + burntime = 30, +}) \ No newline at end of file diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.de.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.de.tr index 01cbe410..37e2f5d4 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.de.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.de.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=DVD-Spieler -DVD and VCR=DVD-Spieler und Videorecorder Large Stereo Speaker=Großer Stereolautsprecher Large Stereo Speaker, open front=Großer Stereolautsprecher, offene Vorderseite +Small Surround Speaker=Kleiner Surround-Lautsprecher +Stereo Receiver=Stereoanlage Projection Screen Material=Projektorleinwand Small CRT Television=Kleiner Röhrenfernseher -Small Surround Speaker=Kleiner Surround-Lautsprecher -Speaker driver=Lautsprechermembran -Stereo Receiver=Stereoanlage +DVD and VCR=DVD-Spieler und Videorecorder Telephone=Telefon VCR=Videorecorder +DVD Player=DVD-Spieler +Speaker driver=Lautsprechermembran diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.es.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.es.tr index d24e26ec..8da18c64 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.es.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.es.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=Reproductor de DVD -DVD and VCR=DVD y reproductor de vídeo Large Stereo Speaker=Altavoz estéreo grande Large Stereo Speaker, open front=Altavoz estéreo grande con frente abierto +Small Surround Speaker=Altavoz envolvente pequeño +Stereo Receiver=Receptor estéreo Projection Screen Material=Material para pantalla de proyección Small CRT Television=Televisión CRT pequeña -Small Surround Speaker=Altavoz envolvente pequeño -Speaker driver=Conductor de altavoz -Stereo Receiver=Receptor estéreo +DVD and VCR=DVD y reproductor de vídeo Telephone=Teléfono VCR=Grabadora de vídeo +DVD Player=Reproductor de DVD +Speaker driver=Conductor de altavoz diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.fr.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.fr.tr index 33e403cb..55e499a2 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.fr.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.fr.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=Lecteur DVD -DVD and VCR=DVD et magnétoscope Large Stereo Speaker=Enceinte Large Stereo Speaker, open front=Enceinte, sans grille +Small Surround Speaker=Enceinte satellite surround +Stereo Receiver=Récepteur radio Projection Screen Material=Toile d'écran de projection Small CRT Television=Petite télévision à tube cathodique -Small Surround Speaker=Enceinte satellite surround -Speaker driver=Haut-parleur -Stereo Receiver=Récepteur radio +DVD and VCR=DVD et magnétoscope Telephone=Téléphone VCR=Magnétoscope +DVD Player=Lecteur DVD +Speaker driver=Haut-parleur diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.it.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.it.tr index aa9b01e9..9a6940c4 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.it.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.it.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player= -DVD and VCR= Large Stereo Speaker=Altoparlante stereo grande Large Stereo Speaker, open front=Altoparlante stereo grande +Small Surround Speaker=Altoparlante audio surround piccolo +Stereo Receiver=Ricevitore stereo Projection Screen Material=Materiale per lo schermo di proiezione Small CRT Television=Piccola televisione a tubo catodico -Small Surround Speaker=Altoparlante audio surround piccolo -Speaker driver= -Stereo Receiver=Ricevitore stereo +DVD and VCR= Telephone= VCR= +DVD Player= +Speaker driver= diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ms.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ms.tr index aa21efda..3ebc03a0 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ms.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ms.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=Pemain DVD -DVD and VCR=Pemain DVD beserta Perakam VCR Large Stereo Speaker=Pembesar Suara Stereo Besar Large Stereo Speaker, open front=Pembesar Suara Stereo Besar, bahagian depan terbuka +Small Surround Speaker=Pembesar Suara Keliling Kecil +Stereo Receiver=Penerima Stereo Projection Screen Material=Bahan Skrin Pemancaran Small CRT Television=Televisyen CRT Kecil -Small Surround Speaker=Pembesar Suara Keliling Kecil -Speaker driver=Pemacu Pembesar Suara -Stereo Receiver=Penerima Stereo +DVD and VCR=Pemain DVD beserta Perakam VCR Telephone=Telefon VCR=Perakam Kaset Video +DVD Player=Pemain DVD +Speaker driver=Pemacu Pembesar Suara diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt.tr index 8277a13f..5b767591 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=DVD Player -DVD and VCR=DVD e VCR Large Stereo Speaker=Alto-falante Estéreo Grande Large Stereo Speaker, open front=Alto-falante Estéreo Grande, frente aberta +Small Surround Speaker=Alto-falante Surround Pequeno +Stereo Receiver=Aparelho de Som Estéreo Projection Screen Material=Material de Tela de Projeção Small CRT Television=TV de tubo pequena -Small Surround Speaker=Alto-falante Surround Pequeno -Speaker driver=Alto-falante -Stereo Receiver=Aparelho de Som Estéreo +DVD and VCR=DVD e VCR Telephone=Telefone VCR=VCR +DVD Player=DVD Player +Speaker driver=Alto-falante diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt_BR.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt_BR.tr index 8277a13f..5b767591 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.pt_BR.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=DVD Player -DVD and VCR=DVD e VCR Large Stereo Speaker=Alto-falante Estéreo Grande Large Stereo Speaker, open front=Alto-falante Estéreo Grande, frente aberta +Small Surround Speaker=Alto-falante Surround Pequeno +Stereo Receiver=Aparelho de Som Estéreo Projection Screen Material=Material de Tela de Projeção Small CRT Television=TV de tubo pequena -Small Surround Speaker=Alto-falante Surround Pequeno -Speaker driver=Alto-falante -Stereo Receiver=Aparelho de Som Estéreo +DVD and VCR=DVD e VCR Telephone=Telefone VCR=VCR +DVD Player=DVD Player +Speaker driver=Alto-falante diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ru.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ru.tr index 26c2e07b..6f384421 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ru.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.ru.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=DVD-проигрыватель -DVD and VCR=DVD и Видеомагнитофон Large Stereo Speaker=Большой стерео громкоговоритель Large Stereo Speaker, open front=Большой стерео громкоговоритель (открытый) +Small Surround Speaker=Малый круговой громкоговоритель +Stereo Receiver=Стерео приёмник Projection Screen Material=Материал проекционного экрана Small CRT Television=Малый кинескопный телевизор -Small Surround Speaker=Малый круговой громкоговоритель -Speaker driver=Динамик -Stereo Receiver=Стерео приёмник +DVD and VCR=DVD и Видеомагнитофон Telephone=Телефон VCR=Видеомагнитофон +DVD Player=DVD-проигрыватель +Speaker driver=Динамик diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.zh_CN.tr b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.zh_CN.tr index a03dbcbd..7899a72b 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_electronics/locale/homedecor_electronics.zh_CN.tr @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player=光盘播放机 -DVD and VCR=DVD和VCR Large Stereo Speaker=大型立体声扬声器 Large Stereo Speaker, open front=开放式大立体声扬声器 +Small Surround Speaker=小型环绕扬声器 +Stereo Receiver=立体声接收机 Projection Screen Material=投影屏幕材料 Small CRT Television=小型CRT电视 -Small Surround Speaker=小型环绕扬声器 -Speaker driver=扬声器 -Stereo Receiver=立体声接收机 +DVD and VCR=DVD和VCR Telephone=电话 VCR=录像机 +DVD Player=光盘播放机 +Speaker driver=扬声器 diff --git a/mods/homedecor_modpack/homedecor_electronics/locale/template.txt b/mods/homedecor_modpack/homedecor_electronics/locale/template.txt index 0967417a..8323792b 100644 --- a/mods/homedecor_modpack/homedecor_electronics/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_electronics/locale/template.txt @@ -1,16 +1,12 @@ # textdomain: homedecor_electronics - - -### init.lua ### - -DVD Player= -DVD and VCR= Large Stereo Speaker= Large Stereo Speaker, open front= +Small Surround Speaker= +Stereo Receiver= Projection Screen Material= Small CRT Television= -Small Surround Speaker= -Speaker driver= -Stereo Receiver= +DVD and VCR= Telephone= VCR= +DVD Player= +Speaker driver= diff --git a/mods/homedecor_modpack/homedecor_electronics/mod.conf b/mods/homedecor_modpack/homedecor_electronics/mod.conf index 09df794b..634a0c0d 100644 --- a/mods/homedecor_modpack/homedecor_electronics/mod.conf +++ b/mods/homedecor_modpack/homedecor_electronics/mod.conf @@ -1,4 +1,4 @@ name = homedecor_electronics description = Homedecor mod: electronics -depends = homedecor_common, default, basic_materials +depends = homedecor_common optional_depends = moreblocks diff --git a/mods/homedecor_modpack/homedecor_exterior/.luacheckrc b/mods/homedecor_modpack/homedecor_exterior/.luacheckrc deleted file mode 100644 index 24ea4f8c..00000000 --- a/mods/homedecor_modpack/homedecor_exterior/.luacheckrc +++ /dev/null @@ -1,22 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "creative", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_exterior/init.lua b/mods/homedecor_modpack/homedecor_exterior/init.lua index 3e4b1697..7fbc4668 100644 --- a/mods/homedecor_modpack/homedecor_exterior/init.lua +++ b/mods/homedecor_modpack/homedecor_exterior/init.lua @@ -21,32 +21,56 @@ homedecor.register("barbecue", { }, "homedecor_barbecue_meat.png", }, - groups = { snappy=3 }, + groups = { snappy=3, dig_tree = 2 }, light_source = 9, selection_box = bbq_cbox, collision_box = bbq_cbox, - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, -- no need for placeholder it appears expand = { top="air" }, + crafts = { + { + recipe = { + { "","homedecor:fence_chainlink","" }, + { "steel_ingot","fake_fire:embers","steel_ingot" }, + { "basic_materials:steel_bar","steel_ingot","basic_materials:steel_bar" } + }, + } + } }) minetest.register_alias("homedecor:barbecue_meat", "air") +local wood_tex = homedecor.textures.wood.apple.planks + homedecor.register("doghouse", { mesh = "homedecor_doghouse.obj", tiles = { "homedecor_shingles_terracotta.png", - "default_wood.png", + wood_tex, "building_blocks_towel.png" }, description = S("Doghouse"), inventory_image = "homedecor_doghouse_inv.png", selection_box = homedecor.nodebox.slab_y(1.5), collision_box = homedecor.nodebox.slab_y(1.5), - groups = {snappy=3}, + groups = {snappy=3, dig_tree = 2}, expand = { top="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, + crafts = { + { + recipe = { + {"homedecor:shingles_terracotta", "homedecor:shingles_terracotta", "homedecor:shingles_terracotta"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "building_blocks:terrycloth_towel", "group:wood"} + }, + } + } }) minetest.register_alias("homedecor:doghouse_roof", "air") @@ -55,10 +79,10 @@ minetest.register_alias("homedecor:doghouse_base", "homedecor:doghouse") homedecor.register("stonepath", { description = S("Garden stone path"), tiles = { - "default_stone.png" + minetest.registered_nodes["mapgen_stone"].tiles[1], }, inventory_image = "homedecor_stonepath_inv.png", - groups = { snappy=3 }, + groups = { snappy=3, dig_stone = 2 }, node_box = { type = "fixed", fixed = { @@ -76,7 +100,35 @@ homedecor.register("stonepath", { type = "fixed", fixed = { -0.4375, -0.5, -0.4375, 0.4375, -0.4, 0.4375 } }, - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, + crafts = { + { + output = "homedecor:stonepath 16", + recipe = { + { "slab_stone","","slab_stone" }, + { "","slab_stone","" }, + { "slab_stone","","slab_stone" } + }, + }, + { + output = "homedecor:stonepath 16", + recipe = { + { "moreblocks:slab_stone","","moreblocks:slab_stone" }, + { "","moreblocks:slab_stone","" }, + { "moreblocks:slab_stone","","moreblocks:slab_stone" } + }, + }, + { + output = "homedecor:stonepath 3", + recipe = { + { "moreblocks:micro_stone_1","","moreblocks:micro_stone_1" }, + { "","moreblocks:micro_stone_1","" }, + { "moreblocks:micro_stone_1","","moreblocks:micro_stone_1" } + }, + } + } }) local lattice_colors = { @@ -94,7 +146,8 @@ homedecor.register("lattice_"..name, { description = S("Garden Lattice (@1)", desc), tiles = {"homedecor_lattice"..texture}, inventory_image = "homedecor_lattice"..texture, - groups = { snappy=3 }, + use_texture_alpha = "clip", + groups = { snappy=3, dig_tree = 2 }, node_box = { type = "fixed", fixed = { @@ -109,7 +162,9 @@ homedecor.register("lattice_"..name, { type = "fixed", fixed = {-0.5, -0.5, 0.44, 0.5, 0.5, 0.5} }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) end @@ -121,8 +176,11 @@ homedecor.register("swing", { "homedecor_swing_top.png" }, inventory_image = "homedecor_swing_inv.png", - groups = { snappy=3, oddly_breakable_by_hand=3 }, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = { snappy=3, oddly_breakable_by_hand=3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, walkable = false, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, node_box = { @@ -170,7 +228,7 @@ homedecor.register("swing", { minetest.set_node({ x=pos.x, y=pos.y-height, z=pos.z }, { name = "homedecor:swing", param2 = fdir }) - if not creative.is_enabled_for(placer_name) then + if not minetest.is_creative_enabled(placer_name) then itemstack:take_item() end else @@ -188,7 +246,30 @@ homedecor.register("swing", { return end end - end + end, + crafts = { + { + recipe = { + { "string","","string" }, + { "string","","string" }, + { "string","slab_wood","string" } + }, + }, + { + recipe = { + { "string","","string" }, + { "string","","string" }, + { "string","moreblocks:slab_wood","string" } + }, + }, + { + recipe = { + { "string","","string" }, + { "string","","string" }, + { "string","moreblocks:panel_wood_1","string" } + }, + } + } }) homedecor.register("swing_rope", { @@ -207,27 +288,49 @@ homedecor.register("swing_rope", { selection_box = homedecor.nodebox.null }) +local water_tex = homedecor.textures.water.tile +local cobble_tex = minetest.registered_nodes["mapgen_stone"].tiles[1] +local stone_drop = minetest.registered_nodes["mapgen_stone"].drop +if stone_drop and type(stone_drop) == "string" then + cobble_tex = minetest.registered_nodes[stone_drop].tiles[1] +elseif stone_drop and type(stone_drop) == "table" then + cobble_tex = minetest.registered_nodes[stone_drop.items[1].items[1]].tiles[1] +end + homedecor.register("well", { mesh = "homedecor_well.obj", tiles = { "homedecor_rope_texture.png", { name = "homedecor_generic_metal.png", color = homedecor.color_med_grey }, - "default_water.png", - "default_cobble.png", - "default_wood.png", + water_tex, + cobble_tex, + wood_tex, "homedecor_shingles_wood.png" }, inventory_image = "homedecor_well_inv.png", description = S("Water well"), - groups = { snappy = 3 }, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_stone = 1 }, selection_box = homedecor.nodebox.slab_y(2), collision_box = homedecor.nodebox.slab_y(2), expand = { top="placeholder" }, - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, + crafts = { + { + recipe = { + { "homedecor:shingles_wood", "homedecor:shingles_wood", "homedecor:shingles_wood" }, + { "group:wood", "group:stick", "group:wood" }, + { "group:stone", "", "group:stone" } + }, + } + } }) -if minetest.get_modpath("bucket") then +--because the engine of all people cant follow right to a name, need to verify bucket empty +if minetest.get_modpath("bucket") and minetest.registered_items["bucket:bucket_empty"] then local original_bucket_on_use = minetest.registered_items["bucket:bucket_empty"].on_use minetest.override_item("bucket:bucket_empty", { on_use = function(itemstack, user, pointed_thing) @@ -258,18 +361,29 @@ homedecor_exterior.shrub_colors = { local shrub_cbox = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } for color, color_loc in pairs(homedecor_exterior.shrub_colors) do - minetest.register_node(":homedecor:shrubbery_large_"..color, { + homedecor.register("shrubbery_large_"..color, { description = S("Shrubbery (large, @1)", color_loc), drawtype = "mesh", mesh = "homedecor_cube.obj", tiles = {"homedecor_shrubbery_"..color..".png"}, paramtype = "light", is_ground_content = false, - groups = {snappy=3, flammable=2}, - sounds = default.node_sound_leaves_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, flammable=2, dig_tree = 3}, + _sound_def = { + key = "node_sound_leaves_defaults", + }, + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:shrubbery_"..color + } + } + } }) - minetest.register_node(":homedecor:shrubbery_"..color, { + homedecor.register("shrubbery_"..color, { description = S("Shrubbery (@1)", color_loc), drawtype = "mesh", mesh = "homedecor_shrubbery.obj", @@ -280,105 +394,47 @@ for color, color_loc in pairs(homedecor_exterior.shrub_colors) do }, paramtype = "light", is_ground_content = false, - groups = {snappy=3, flammable=2}, - sounds = default.node_sound_leaves_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, flammable=2, dig_tree = 3}, + _sound_def = { + key = "node_sound_leaves_defaults", + }, selection_box = shrub_cbox, collision_box = shrub_cbox, + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:shrubbery_large_"..color + } + } + } }) + + if color ~= "green" then + minetest.register_craft({ + type = "shapeless", + output = "homedecor:shrubbery_large_"..color, + recipe = { + "homedecor:shrubbery_large_green", + homedecor.materials["dye_"..color] + } + }) + + minetest.register_craft({ + type = "shapeless", + output = "homedecor:shrubbery_"..color, + recipe = { + "homedecor:shrubbery_green", + homedecor.materials["dye_"..color] + } + }) + + end end -- crafting -minetest.register_craft({ - output = "homedecor:chimney 2", - recipe = { - { "default:clay_brick", "", "default:clay_brick" }, - { "default:clay_brick", "", "default:clay_brick" }, - { "default:clay_brick", "", "default:clay_brick" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:doghouse", - recipe = { - {"homedecor:shingles_terracotta", "homedecor:shingles_terracotta", "homedecor:shingles_terracotta"}, - {"group:wood", "", "group:wood"}, - {"group:wood", "building_blocks:terrycloth_towel", "group:wood"} - }, -}) - -minetest.register_craft( { - output = "homedecor:well", - recipe = { - { "homedecor:shingles_wood", "homedecor:shingles_wood", "homedecor:shingles_wood" }, - { "group:wood", "group:stick", "group:wood" }, - { "group:stone", "", "group:stone" } - }, -}) - -minetest.register_craft({ - output = "homedecor:stonepath 16", - recipe = { - { "stairs:slab_stone","","stairs:slab_stone" }, - { "","stairs:slab_stone","" }, - { "stairs:slab_stone","","stairs:slab_stone" } - }, -}) - -minetest.register_craft({ - output = "homedecor:stonepath 16", - recipe = { - { "moreblocks:slab_stone","","moreblocks:slab_stone" }, - { "","moreblocks:slab_stone","" }, - { "moreblocks:slab_stone","","moreblocks:slab_stone" } - }, -}) - -minetest.register_craft({ - output = "homedecor:stonepath 3", - recipe = { - { "moreblocks:micro_stone_1","","moreblocks:micro_stone_1" }, - { "","moreblocks:micro_stone_1","" }, - { "moreblocks:micro_stone_1","","moreblocks:micro_stone_1" } - }, -}) - -minetest.register_craft({ - output = "homedecor:barbecue", - recipe = { - { "","homedecor:fence_chainlink","" }, - { "default:steel_ingot","fake_fire:embers","default:steel_ingot" }, - { "basic_materials:steel_bar","default:steel_ingot","basic_materials:steel_bar" } - }, -}) - -minetest.register_craft({ - output = "homedecor:swing", - recipe = { - { "farming:string","","farming:string" }, - { "farming:string","","farming:string" }, - { "farming:string","stairs:slab_wood","farming:string" } - }, -}) - -minetest.register_craft({ - output = "homedecor:swing", - recipe = { - { "farming:string","","farming:string" }, - { "farming:string","","farming:string" }, - { "farming:string","moreblocks:slab_wood","farming:string" } - }, -}) - -minetest.register_craft({ - output = "homedecor:swing", - recipe = { - { "farming:string","","farming:string" }, - { "farming:string","","farming:string" }, - { "farming:string","moreblocks:panel_wood_1","farming:string" } - }, -}) - minetest.register_craft({ output = "homedecor:lattice_wood 8", recipe = { @@ -392,7 +448,7 @@ minetest.register_craft({ output = "homedecor:lattice_white_wood 8", recipe = { {"group:stick", "group:wood", "group:stick"}, - {"group:wood", "dye:white", "group:wood"}, + {"group:wood", homedecor.materials["dye_white"], "group:wood"}, {"group:stick", "group:wood", "group:stick"}, }, }) @@ -411,7 +467,7 @@ minetest.register_craft({ recipe = { {"group:stick", "group:wood", "group:stick"}, {"group:wood", "group:leaves", "group:wood"}, - {"group:stick", "dye:white", "group:stick"}, + {"group:stick", homedecor.materials["dye_white"], "group:stick"}, }, }) @@ -425,46 +481,6 @@ minetest.register_craft({ } }) -for color, _ in pairs(homedecor_exterior.shrub_colors) do - - minetest.register_craft({ - type = "shapeless", - output = "homedecor:shrubbery_large_"..color, - recipe = { - "homedecor:shrubbery_"..color - } - }) - - minetest.register_craft({ - type = "shapeless", - output = "homedecor:shrubbery_"..color, - recipe = { - "homedecor:shrubbery_large_"..color - } - }) - - if color ~= "green" then - minetest.register_craft({ - type = "shapeless", - output = "homedecor:shrubbery_large_"..color, - recipe = { - "homedecor:shrubbery_large_green", - "dye:"..color - } - }) - - minetest.register_craft({ - type = "shapeless", - output = "homedecor:shrubbery_"..color, - recipe = { - "homedecor:shrubbery_green", - "dye:"..color - } - }) - - end -end - -- aliases minetest.register_alias("homedecor:well_top", "air") diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.de.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.de.tr index b7320731..1e19d8cb 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.de.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.de.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Grill Doghouse=Hundehütte -Garden Lattice (@1)=Gartenzaun (@1) Garden stone path=Gartensteinpfad -No room in your inventory to add a filled bucket!=Kein Platz im Inventar für einen vollen Eimer. -No room under there to hang a swing.=Darunter ist kein Platz zum Aufhängen einer Schaukel. -Shrubbery (@1)=Gebüsch (@1) -Shrubbery (large, @1)=Gebüsch (@1) +wood=Holz +white wood=weißes Holz +wood, with vegetation=Holz mit Vegetation +white wood, with vegetation=weißes Holz mit Vegetation +Garden Lattice (@1)=Gartenzaun (@1) Tree's swing=Baumschaukel -Water well=Wasserbrunnen - +No room under there to hang a swing.=Darunter ist kein Platz zum Aufhängen einer Schaukel. You have to point at the bottom side of an overhanging object to place a swing.=Um eine Schaukel zu plazieren, muss auf die Unterseite eines überhängenden Objektes gezeigt werden. - +Water well=Wasserbrunnen +No room in your inventory to add a filled bucket!=Kein Platz im Inventar für einen vollen Eimer. green=grün red=rot -white wood=weißes Holz -white wood, with vegetation=weißes Holz mit Vegetation -wood=Holz -wood, with vegetation=Holz mit Vegetation yellow=gelb +Shrubbery (large, @1)=Gebüsch (@1) +Shrubbery (@1)=Gebüsch (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.es.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.es.tr index 7d2c60d1..ddecb7f9 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.es.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.es.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Barbacoa Doghouse=Casa de perros -Garden Lattice (@1)=Enrejado de jardín (@1) Garden stone path=Camino de piedra de jardín -No room in your inventory to add a filled bucket!=No hay espacio en tu inv para el cubo -No room under there to hang a swing.=No hay espacio para colgar el columpio -Shrubbery (@1)=Arbustos (@1) -Shrubbery (large, @1)=Arbustos (@1) +wood=madera +white wood=madera blanca +wood, with vegetation=madera, con vegetación +white wood, with vegetation=madera blanca, con vegetación +Garden Lattice (@1)=Enrejado de jardín (@1) Tree's swing=Columpio -Water well=Pozo de agua - +No room under there to hang a swing.=No hay espacio para colgar el columpio You have to point at the bottom side of an overhanging object to place a swing.=Debe ser la parte inferior de un objeto para colocar el columpio. - +Water well=Pozo de agua +No room in your inventory to add a filled bucket!=No hay espacio en tu inv para el cubo green=verde red=roja -white wood=madera blanca -white wood, with vegetation=madera blanca, con vegetación -wood=madera -wood, with vegetation=madera, con vegetación yellow=amarilla +Shrubbery (large, @1)=Arbustos (@1) +Shrubbery (@1)=Arbustos (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.fr.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.fr.tr index c4d3ce0a..97dd6c33 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.fr.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.fr.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Barbecue Doghouse=Niche -Garden Lattice (@1)=Treillage (@1) Garden stone path=Chemin de pierres -No room in your inventory to add a filled bucket!=Il n’y a pas de place dans votre inventaire pour y ajouter un seau plein! -No room under there to hang a swing.=Il n’y a pas la place en dessous pour y accrocher une balançoire. -Shrubbery (@1)=Arbustes (@1) -Shrubbery (large, @1)=Arbustes (@1) +wood=bois +white wood=bois blanc +wood, with vegetation=bois, avec végétation +white wood, with vegetation=bois blanc, avec végétation +Garden Lattice (@1)=Treillage (@1) Tree's swing=Balançoire -Water well=Puits - +No room under there to hang a swing.=Il n’y a pas la place en dessous pour y accrocher une balançoire. You have to point at the bottom side of an overhanging object to place a swing.=Vous devez viser le dessous d’un objet en hauteur pour placer la balançoire. - +Water well=Puits +No room in your inventory to add a filled bucket!=Il n’y a pas de place dans votre inventaire pour y ajouter un seau plein! green=vert red=rouge -white wood=bois blanc -white wood, with vegetation=bois blanc, avec végétation -wood=bois -wood, with vegetation=bois, avec végétation yellow=jaune +Shrubbery (large, @1)=Arbustes (@1) +Shrubbery (@1)=Arbustes (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.it.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.it.tr index 8c1cbed3..75295c0d 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.it.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.it.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue= Doghouse= -Garden Lattice (@1)= Garden stone path= -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)= -Shrubbery (large, @1)= +wood= +white wood=bianco +wood, with vegetation= +white wood, with vegetation= +Garden Lattice (@1)= Tree's swing= -Water well= - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well= +No room in your inventory to add a filled bucket!= green=verde red=rosso -white wood=bianco -white wood, with vegetation= -wood= -wood, with vegetation= yellow= +Shrubbery (large, @1)= +Shrubbery (@1)= diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ms.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ms.tr index b7acdb8c..5b8dd4ed 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ms.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ms.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Barbeku Doghouse=Rumah Anjing -Garden Lattice (@1)=Kekisi Taman (@1) Garden stone path=Laluan Berbatu Taman -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)=Rumpun Pokok Renek (@1) -Shrubbery (large, @1)=Rumpun Pokok Renek (Besar, @1) +wood=Kayu +white wood=Kayu Putih +wood, with vegetation=Kayu, dengan Tumbuhan +white wood, with vegetation=Kayu Putih, dengan Tumbuhan +Garden Lattice (@1)=Kekisi Taman (@1) Tree's swing=Buaian Pokok -Water well=Perigi Air - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well=Perigi Air +No room in your inventory to add a filled bucket!= green=Hijau red=Merah -white wood=Kayu Putih -white wood, with vegetation=Kayu Putih, dengan Tumbuhan -wood=Kayu -wood, with vegetation=Kayu, dengan Tumbuhan yellow=Kuning +Shrubbery (large, @1)=Rumpun Pokok Renek (Besar, @1) +Shrubbery (@1)=Rumpun Pokok Renek (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt.tr index 1284c857..f7d7f381 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Churrasqueira Doghouse=Casa de Cachorro -Garden Lattice (@1)=Treliça de Jardim (@1) Garden stone path=Caminho de pedra de jardim -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)=Matagal (@1) -Shrubbery (large, @1)=Matagal (@1) +wood=madeira +white wood=madeira branca +wood, with vegetation=madeira, com vegetação +white wood, with vegetation=madeira branca, com vegetação +Garden Lattice (@1)=Treliça de Jardim (@1) Tree's swing=Balancinho de árvore -Water well=Poço de agua - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well=Poço de agua +No room in your inventory to add a filled bucket!= green=verde red=vermelho -white wood=madeira branca -white wood, with vegetation=madeira branca, com vegetação -wood=madeira -wood, with vegetation=madeira, com vegetação yellow=amarelo +Shrubbery (large, @1)=Matagal (@1) +Shrubbery (@1)=Matagal (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt_BR.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt_BR.tr index 1284c857..f7d7f381 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.pt_BR.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Churrasqueira Doghouse=Casa de Cachorro -Garden Lattice (@1)=Treliça de Jardim (@1) Garden stone path=Caminho de pedra de jardim -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)=Matagal (@1) -Shrubbery (large, @1)=Matagal (@1) +wood=madeira +white wood=madeira branca +wood, with vegetation=madeira, com vegetação +white wood, with vegetation=madeira branca, com vegetação +Garden Lattice (@1)=Treliça de Jardim (@1) Tree's swing=Balancinho de árvore -Water well=Poço de agua - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well=Poço de agua +No room in your inventory to add a filled bucket!= green=verde red=vermelho -white wood=madeira branca -white wood, with vegetation=madeira branca, com vegetação -wood=madeira -wood, with vegetation=madeira, com vegetação yellow=amarelo +Shrubbery (large, @1)=Matagal (@1) +Shrubbery (@1)=Matagal (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ru.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ru.tr index 88a1bba0..f1d36255 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ru.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.ru.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=Барбекю Doghouse=Собачья будка -Garden Lattice (@1)=Садовая решётка (@1) Garden stone path=Садовая каменная дорожка -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)=Кустарник (@1) -Shrubbery (large, @1)=Кустарник (@1) +wood=дерево +white wood=белое дерево +wood, with vegetation=дерево с растительностью +white wood, with vegetation=белое дерево с растительностью +Garden Lattice (@1)=Садовая решётка (@1) Tree's swing=Качели для дерева -Water well=Колодец с водой - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well=Колодец с водой +No room in your inventory to add a filled bucket!= green=зелёный red=красный -white wood=белое дерево -white wood, with vegetation=белое дерево с растительностью -wood=дерево -wood, with vegetation=дерево с растительностью yellow=жёлтый +Shrubbery (large, @1)=Кустарник (@1) +Shrubbery (@1)=Кустарник (@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.zh_CN.tr b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.zh_CN.tr index 45ee2d00..346742c9 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_exterior/locale/homedecor_exterior.zh_CN.tr @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue=烧烤 Doghouse=狗窝 -Garden Lattice (@1)=花园格子(@1) Garden stone path=花园石径 -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)=灌木丛(@1) -Shrubbery (large, @1)=大灌木丛(@1) +wood=木材 +white wood=白木 +wood, with vegetation=带植被的木材 +white wood, with vegetation=带植被的白木 +Garden Lattice (@1)=花园格子(@1) Tree's swing=树的秋千 -Water well=水井 - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well=水井 +No room in your inventory to add a filled bucket!= green=绿色 red=红色 -white wood=白木 -white wood, with vegetation=带植被的白木 -wood=木材 -wood, with vegetation=带植被的木材 yellow=黄色的 +Shrubbery (large, @1)=大灌木丛(@1) +Shrubbery (@1)=灌木丛(@1) diff --git a/mods/homedecor_modpack/homedecor_exterior/locale/template.txt b/mods/homedecor_modpack/homedecor_exterior/locale/template.txt index dafbc7d7..59917c9a 100644 --- a/mods/homedecor_modpack/homedecor_exterior/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_exterior/locale/template.txt @@ -1,25 +1,19 @@ # textdomain: homedecor_exterior - - -### init.lua ### - Barbecue= Doghouse= -Garden Lattice (@1)= Garden stone path= -No room in your inventory to add a filled bucket!= -No room under there to hang a swing.= -Shrubbery (@1)= -Shrubbery (large, @1)= +wood= +white wood= +wood, with vegetation= +white wood, with vegetation= +Garden Lattice (@1)= Tree's swing= -Water well= - +No room under there to hang a swing.= You have to point at the bottom side of an overhanging object to place a swing.= - +Water well= +No room in your inventory to add a filled bucket!= green= red= -white wood= -white wood, with vegetation= -wood= -wood, with vegetation= yellow= +Shrubbery (large, @1)= +Shrubbery (@1)= diff --git a/mods/homedecor_modpack/homedecor_exterior/mod.conf b/mods/homedecor_modpack/homedecor_exterior/mod.conf index 40183adc..6fc6338f 100644 --- a/mods/homedecor_modpack/homedecor_exterior/mod.conf +++ b/mods/homedecor_modpack/homedecor_exterior/mod.conf @@ -1,4 +1,4 @@ name = homedecor_exterior description = Homedecor mod: exterior -depends = homedecor_common, default, dye, creative, basic_materials +depends = homedecor_common optional_depends = moreblocks, building_blocks, bucket, screwdriver diff --git a/mods/homedecor_modpack/homedecor_fences/.luacheckrc b/mods/homedecor_modpack/homedecor_fences/.luacheckrc deleted file mode 100644 index 56d60d09..00000000 --- a/mods/homedecor_modpack/homedecor_fences/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { - "signs_lib", -} - diff --git a/mods/homedecor_modpack/homedecor_fences/init.lua b/mods/homedecor_modpack/homedecor_fences/init.lua index 7a0dccc4..6389d691 100644 --- a/mods/homedecor_modpack/homedecor_fences/init.lua +++ b/mods/homedecor_modpack/homedecor_fences/init.lua @@ -2,14 +2,30 @@ local S = minetest.get_translator("homedecor_fences") +local brass = { + output = "homedecor:fence_brass 6", + 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" }, + }, +} + +local iron = { + output = "homedecor:fence_wrought_iron 6", + recipe = { + { "iron_lump","iron_lump","iron_lump" }, + { "iron_lump","iron_lump","iron_lump" }, + }, +} + local materials = { - { S("brass"), "brass" }, - { S("wrought iron"), "wrought_iron" }, + { S("brass"), "brass", brass }, + { S("wrought iron"), "wrought_iron", iron }, } for _, m in ipairs(materials) do - local desc, name = unpack(m) + local desc, name, craft = unpack(m) homedecor.register("fence_"..name, { description = S("Fence/railing (@1)", desc), @@ -17,8 +33,13 @@ for _, m in ipairs(materials) do tiles = {"homedecor_generic_metal_"..name..".png"}, inventory_image = "homedecor_fence_"..name..".png", selection_box = homedecor.nodebox.bar_y(1/7), - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + craft + } }) end @@ -28,65 +49,129 @@ end homedecor.register("fence_picket", { description = S("Unpainted Picket Fence"), tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", + "blank.png", + "blank.png", "homedecor_fence_picket.png", "homedecor_fence_picket.png", "homedecor_fence_picket_backside.png", "homedecor_fence_picket.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-0.1), node_box = homedecor.nodebox.slab_z(-0.002), + crafts = { + { + output = "homedecor:fence_picket 6", + recipe = { + { "group:stick", "group:stick", "group:stick" }, + { "group:stick", "", "group:stick" }, + { "group:stick", "group:stick", "group:stick" } + }, + }, + { + type = "shapeless", + output = "homedecor:fence_picket 2", + recipe = { + "homedecor:fence_picket_corner" + }, + } + } }) homedecor.register("fence_picket_corner", { description = S("Unpainted Picket Fence Corner"), tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", + "blank.png", + "blank.png", "homedecor_fence_picket.png", "homedecor_fence_picket_backside.png", "homedecor_fence_picket_backside.png", "homedecor_fence_picket.png", }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.corner_xz(0.1, -0.1), node_box = homedecor.nodebox.corner_xz(0.002, -0.002), + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:fence_picket", + "homedecor:fence_picket" + }, + }, + } }) homedecor.register("fence_picket_white", { description = S("White Picket Fence"), tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", + "blank.png", + "blank.png", "homedecor_fence_picket_white.png", "homedecor_fence_picket_white.png", "homedecor_fence_picket_white_backside.png", "homedecor_fence_picket_white.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-0.1), node_box = homedecor.nodebox.slab_z(-0.002), + crafts = { + { + output = "homedecor:fence_picket_white 6", + recipe = { + { "group:stick", "group:stick", "group:stick" }, + { "group:stick", "dye_white", "group:stick" }, + { "group:stick", "group:stick", "group:stick" } + }, + }, + { + type = "shapeless", + output = "homedecor:fence_picket_white 2", + recipe = { + "homedecor:fence_picket_corner_white" + }, + } + } }) homedecor.register("fence_picket_corner_white", { description = S("White Picket Fence Corner"), tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", + "blank.png", + "blank.png", "homedecor_fence_picket_white.png", "homedecor_fence_picket_white_backside.png", "homedecor_fence_picket_white_backside.png", "homedecor_fence_picket_white.png", }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.corner_xz(0.1, -0.1), node_box = homedecor.nodebox.corner_xz(0.002, -0.002), + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:fence_picket_white", + "homedecor:fence_picket_white" + }, + } + } }) homedecor.register("fence_privacy", { @@ -99,8 +184,10 @@ homedecor.register("fence_privacy", { "homedecor_fence_privacy_backside.png", "homedecor_fence_privacy_front.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-3/16), node_box = { type = "fixed", @@ -111,6 +198,23 @@ homedecor.register("fence_privacy", { { -8/16, -2/16, 7/16, 8/16, 2/16, 8/16 }, -- connecting rung } }, + crafts = { + { + output = "homedecor:fence_privacy 6", + recipe = { + { "group:wood", "group:stick", "group:wood" }, + { "group:wood", "", "group:wood" }, + { "group:wood", "group:stick", "group:wood" } + }, + }, + { + type = "shapeless", + output = "homedecor:fence_privacy 2", + recipe = { + "homedecor:fence_privacy_corner" + }, + } + } }) homedecor.register("fence_privacy_corner", { @@ -123,8 +227,10 @@ homedecor.register("fence_privacy_corner", { "homedecor_fence_privacy_backside.png", "homedecor_fence_privacy_corner_front.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = { type = "fixed", fixed = { @@ -146,26 +252,62 @@ homedecor.register("fence_privacy_corner", { { -8/16, -2/16, -8/16, -7/16, 2/16, 7/16 }, -- left-side connecting rung } }, + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:fence_privacy", + "homedecor:fence_privacy" + }, + }, + } }) homedecor.register("fence_barbed_wire", { description = S("Barbed Wire Fence"), mesh = "homedecor_fence_barbed_wire.obj", tiles = {"homedecor_fence_barbed_wire.png"}, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-0.125), collision_box = homedecor.nodebox.slab_z(-0.125), + crafts = { + { + output = "homedecor:fence_barbed_wire 6", + recipe = { + { "group:stick", "basic_materials:steel_wire", "group:stick" }, + { "group:stick", "", "group:stick" }, + { "group:stick", "basic_materials:steel_wire", "group:stick" } + }, + }, + { + type = "shapeless", + output = "homedecor:fence_barbed_wire 2", + recipe = { "homedecor:fence_barbed_wire_corner" }, + } + } }) homedecor.register("fence_barbed_wire_corner", { description = S("Barbed Wire Fence Corner"), mesh = "homedecor_fence_barbed_wire_corner.obj", tiles = { "homedecor_fence_barbed_wire.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.corner_xz(0.125, -0.125), collision_box = homedecor.nodebox.corner_xz(0.125, -0.125), + crafts = { + { + type = "shapeless", + recipe = { "homedecor:fence_barbed_wire", "homedecor:fence_barbed_wire" }, + } + } }) homedecor.register("fence_chainlink", { @@ -179,10 +321,28 @@ homedecor.register("fence_chainlink", { "homedecor_fence_chainlink_fb.png", "homedecor_fence_chainlink_fb.png", }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-0.125), collision_box = homedecor.nodebox.slab_z(-0.125), + crafts = { + { + output = "homedecor:fence_chainlink 9", + recipe = { + { "steel_ingot", "steel_ingot", "steel_ingot" }, + { "basic_materials:steel_wire", "basic_materials:steel_wire", "steel_ingot" }, + { "basic_materials:steel_wire", "basic_materials:steel_wire", "steel_ingot" } + }, + }, + { + type = "shapeless", + output = "homedecor:fence_chainlink 2", + recipe = { "homedecor:fence_chainlink_corner" }, + } + } }) @@ -197,10 +357,19 @@ homedecor.register("fence_chainlink_corner", { "homedecor_fence_chainlink_corner_front.png", "homedecor_fence_chainlink_corner_front.png", }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.corner_xz(0.125, -0.125), collision_box = homedecor.nodebox.corner_xz(0.125, -0.125), + crafts = { + { + type = "shapeless", + recipe = { "homedecor:fence_chainlink", "homedecor:fence_chainlink" }, + } + } }) homedecor.register("fence_wrought_iron_2", { @@ -213,8 +382,11 @@ homedecor.register("fence_wrought_iron_2", { "homedecor_fence_wrought_iron_2_fb.png", "homedecor_fence_wrought_iron_2_fb.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_z(-0.08), node_box = { type = "fixed", @@ -228,6 +400,22 @@ homedecor.register("fence_wrought_iron_2", { { -8/16, -8/16, 15/32, 8/16, 8/16, 15/32 } -- the grid itself } }, + crafts = { + { + output = "homedecor:fence_wrought_iron_2 4", + recipe = { + { "homedecor:pole_wrought_iron", "iron_lump" }, + { "homedecor:pole_wrought_iron", "iron_lump" }, + }, + } + }, + { + type = "shapeless", + output = "homedecor:fence_wrought_iron_2 2", + recipe = { + "homedecor:fence_wrought_iron_2_corner", + }, + } }) homedecor.register("fence_wrought_iron_2_corner", { @@ -240,8 +428,11 @@ homedecor.register("fence_wrought_iron_2_corner", { "homedecor_fence_corner_wrought_iron_2_sides.png^[transformFX", "homedecor_fence_corner_wrought_iron_2_sides.png" }, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "clip", + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.corner_xz(0.08, -0.08), node_box = { type = "fixed", @@ -261,10 +452,20 @@ homedecor.register("fence_wrought_iron_2_corner", { { -15.25/32, -0.015625, -0.5, -14.75/32, 0.015625, 0.5 } -- cross piece side } }, + crafts = { + { + type = "shapeless", + output = "homedecor:fence_wrought_iron_2_corner", + recipe = { + "homedecor:fence_wrought_iron_2", + "homedecor:fence_wrought_iron_2" + }, + } + } }) -- insert the old wood signs-on-metal-fences into signs_lib's conversion LBM -if minetest.get_modpath("signs_lib") then +if minetest.get_modpath("signs_lib") and minetest.get_modpath("default") then -- FIXME: export a function in signs_lib API to allow signs_lib to be read only in .luacheckrc table.insert(signs_lib.old_fenceposts_with_signs, "homedecor:fence_brass_with_sign") signs_lib.old_fenceposts["homedecor:fence_brass_with_sign"] = "homedecor:fence_brass" @@ -274,183 +475,3 @@ if minetest.get_modpath("signs_lib") then signs_lib.old_fenceposts["homedecor:fence_wrought_iron_with_sign"] = "homedecor:fence_wrought_iron" signs_lib.old_fenceposts_replacement_signs["homedecor:fence_wrought_iron_with_sign"] = "default:sign_wall_wood_onpole" end - --- crafting - --- Brass/wrought iron fences - -minetest.register_craft( { - output = "homedecor:fence_brass 6", - 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 = "homedecor:fence_wrought_iron 6", - recipe = { - { "default:iron_lump","default:iron_lump","default:iron_lump" }, - { "default:iron_lump","default:iron_lump","default:iron_lump" }, - }, -}) - --- other types of fences - -minetest.register_craft( { - output = "homedecor:fence_wrought_iron_2 4", - recipe = { - { "homedecor:pole_wrought_iron", "default:iron_lump" }, - { "homedecor:pole_wrought_iron", "default:iron_lump" }, - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_wrought_iron_2_corner", - recipe = { - "homedecor:fence_wrought_iron_2", - "homedecor:fence_wrought_iron_2" - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_wrought_iron_2 2", - recipe = { - "homedecor:fence_wrought_iron_2_corner", - }, -}) - --- - -minetest.register_craft( { - output = "homedecor:fence_picket 6", - recipe = { - { "group:stick", "group:stick", "group:stick" }, - { "group:stick", "", "group:stick" }, - { "group:stick", "group:stick", "group:stick" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_picket_corner", - recipe = { - "homedecor:fence_picket", - "homedecor:fence_picket" - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_picket 2", - recipe = { - "homedecor:fence_picket_corner" - }, -}) - --- - - -minetest.register_craft( { - output = "homedecor:fence_picket_white 6", - recipe = { - { "group:stick", "group:stick", "group:stick" }, - { "group:stick", "dye:white", "group:stick" }, - { "group:stick", "group:stick", "group:stick" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_picket_corner_white", - recipe = { - "homedecor:fence_picket_white", - "homedecor:fence_picket_white" - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_picket_white 2", - recipe = { - "homedecor:fence_picket_corner_white" - }, -}) - --- - - -minetest.register_craft( { - output = "homedecor:fence_privacy 6", - recipe = { - { "group:wood", "group:stick", "group:wood" }, - { "group:wood", "", "group:wood" }, - { "group:wood", "group:stick", "group:wood" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_privacy_corner", - recipe = { - "homedecor:fence_privacy", - "homedecor:fence_privacy" - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_privacy 2", - recipe = { - "homedecor:fence_privacy_corner" - }, -}) - --- - - -minetest.register_craft( { - output = "homedecor:fence_barbed_wire 6", - recipe = { - { "group:stick", "basic_materials:steel_wire", "group:stick" }, - { "group:stick", "", "group:stick" }, - { "group:stick", "basic_materials:steel_wire", "group:stick" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_barbed_wire_corner", - recipe = { "homedecor:fence_barbed_wire", "homedecor:fence_barbed_wire" }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_barbed_wire 2", - recipe = { "homedecor:fence_barbed_wire_corner" }, -}) - --- - -minetest.register_craft( { - output = "homedecor:fence_chainlink 9", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, - { "basic_materials:steel_wire", "basic_materials:steel_wire", "default:steel_ingot" }, - { "basic_materials:steel_wire", "basic_materials:steel_wire", "default:steel_ingot" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_chainlink_corner", - recipe = { "homedecor:fence_chainlink", "homedecor:fence_chainlink" }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "homedecor:fence_chainlink 2", - recipe = { "homedecor:fence_chainlink_corner" }, -}) diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.de.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.de.tr index ab21e231..7d716464 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.de.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.de.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Stacheldrahtzaun -Barbed Wire Fence Corner=Stacheldrahtzaunecke -Chainlink Fence=Maschendrahtzaun -Chainlink Fence Corner=Maschendrahtzaunecke +brass=Messing +wrought iron=Schmiedeeisen Fence/railing (@1)=Zaun/Geländer (@1) Unpainted Picket Fence=Unlackierter Lattenzaun Unpainted Picket Fence Corner=Unlackierte Lattenenzaunecke @@ -14,7 +8,9 @@ White Picket Fence=Weißer Lattenzaun White Picket Fence Corner=Weiße Lattenzaunecke Wooden Privacy Fence=Holzsichtschutzzaun Wooden Privacy Fence Corner=Holzsichtschutzzaunecke +Barbed Wire Fence=Stacheldrahtzaun +Barbed Wire Fence Corner=Stacheldrahtzaunecke +Chainlink Fence=Maschendrahtzaun +Chainlink Fence Corner=Maschendrahtzaunecke Wrought Iron fence (type 2)=Schmiedeeisenzaun/-geländer (Typ 2) Wrought Iron fence (type 2) Corner=Schmiedeeisenzaun/-geländerecke (Typ 2) -brass=Messing -wrought iron=Schmiedeeisen diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.es.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.es.tr index 4c91a5cf..273bc8c5 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.es.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.es.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Cerca de alambre de espino -Barbed Wire Fence Corner=Esquina de cerca de alambre de espino -Chainlink Fence=Cerca de eslabón de cadena -Chainlink Fence Corner=Esquina de cerca de eslabón de cadena +brass=latón +wrought iron=hierro forjado Fence/railing (@1)=Cerca/barandilla (@1) Unpainted Picket Fence=Cerca de piquete sin pintar Unpainted Picket Fence Corner=Esquina de cerca de piquete sin pintar @@ -14,7 +8,9 @@ White Picket Fence=Cerca de piquete blanca White Picket Fence Corner=Esquina de cerca de piquete blanca Wooden Privacy Fence=Cerca de privacidad de madera Wooden Privacy Fence Corner=Esquina de cerca de privacidad de madera +Barbed Wire Fence=Cerca de alambre de espino +Barbed Wire Fence Corner=Esquina de cerca de alambre de espino +Chainlink Fence=Cerca de eslabón de cadena +Chainlink Fence Corner=Esquina de cerca de eslabón de cadena Wrought Iron fence (type 2)=Cerca de hierro forjado (tipo 2) Wrought Iron fence (type 2) Corner=Esquina de cerca de hierro forjado (tipo 2) -brass=latón -wrought iron=hierro forjado diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.fr.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.fr.tr index be94e202..6d0e1179 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.fr.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.fr.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Clôture en fil barbelé -Barbed Wire Fence Corner=Clôture en fil barbelé (angle) -Chainlink Fence=Grillage -Chainlink Fence Corner=Grillage (angle) -Fence/railing (@1)=Barrière +brass=laiton +wrought iron=fer forgé +Fence/railing (@1)=Barrière (@1) Unpainted Picket Fence=Clôture en piquets bruts Unpainted Picket Fence Corner=Clôture en piquets bruts (angle) White Picket Fence=Clôture en piquets blancs White Picket Fence Corner=Clôture en piquets blancs (angle) Wooden Privacy Fence=Clôture de confidentialité en bois Wooden Privacy Fence Corner=Clôture de confidentialité en bois (angle) +Barbed Wire Fence=Clôture en fil barbelé +Barbed Wire Fence Corner=Clôture en fil barbelé (angle) +Chainlink Fence=Grillage +Chainlink Fence Corner=Grillage (angle) Wrought Iron fence (type 2)=Clôture en fer forgé Wrought Iron fence (type 2) Corner=Clôture en fer forgé (angle) -brass=laiton -wrought iron=fer forgé diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.it.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.it.tr index 50f32d28..3b8293c2 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.it.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.it.tr @@ -1,20 +1,16 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Recinzione di filo spinato -Barbed Wire Fence Corner=Angolo della recinzione di filo spinato -Chainlink Fence=Rete metallica -Chainlink Fence Corner=Angolo della rete metallica -Fence/railing (@1)=Recinzione di ottone/ringhiera +brass= +wrought iron=Palo di ferro battuto +Fence/railing (@1)=Recinzione di ottone/ringhiera (@1) Unpainted Picket Fence=Recinzione non verniciata di paletti Unpainted Picket Fence Corner=Angolo della recinzione non verniciata di paletti White Picket Fence=Recinzione di paletti bianca White Picket Fence Corner=Angolo della recinzione di paletti bianca Wooden Privacy Fence=Recinzione di isolamento in legno Wooden Privacy Fence Corner=Angolo della recinzione di isolamento in legno +Barbed Wire Fence=Recinzione di filo spinato +Barbed Wire Fence Corner=Angolo della recinzione di filo spinato +Chainlink Fence=Rete metallica +Chainlink Fence Corner=Angolo della rete metallica Wrought Iron fence (type 2)=Recinzione/ringhiera in ferro battuto Wrought Iron fence (type 2) Corner=Recinzione/ringhiera in ferro battuto -brass= -wrought iron=Palo di ferro battuto diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ms.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ms.tr index 9c00667f..03b65755 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ms.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ms.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Pagar Dawai Berduri -Barbed Wire Fence Corner=Bucu Pagar Dawai Berduri -Chainlink Fence=Pagar Dawai Berangkai -Chainlink Fence Corner=Bucu Pagar Dawai Berangkai +brass=Loyang +wrought iron=Besi Tempaan Fence/railing (@1)=Pagar/Kisi-Kisi (@1) Unpainted Picket Fence=Pagar Pancang Tidak Bercat Unpainted Picket Fence Corner=Bucu Pagar Pancang Tidak Bercat @@ -14,7 +8,9 @@ White Picket Fence=Pagar Pancang Putih White Picket Fence Corner=Bucu Pagar Pancang Putih Wooden Privacy Fence=Pagar Privasi Kayu Wooden Privacy Fence Corner=Bucu Pagar Privasi Kayu +Barbed Wire Fence=Pagar Dawai Berduri +Barbed Wire Fence Corner=Bucu Pagar Dawai Berduri +Chainlink Fence=Pagar Dawai Berangkai +Chainlink Fence Corner=Bucu Pagar Dawai Berangkai Wrought Iron fence (type 2)=Pagar Besi Tempaan (jenis ke-2) Wrought Iron fence (type 2) Corner=Bucu Pagar Besi Tempaan (jenis ke-2) -brass=Loyang -wrought iron=Besi Tempaan diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt.tr index 3f5c0a5d..4ea97e36 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Cerca de Arame Farpado -Barbed Wire Fence Corner=Cerca de Arame Farpado de Canto -Chainlink Fence=Cerca de Tela de Arame -Chainlink Fence Corner=Cerca de Tela de Arame de Canto +brass=latão +wrought iron=ferro forjado Fence/railing (@1)=Cerca/corrimão (@1) Unpainted Picket Fence=Cerca de Piquete Não Pintada Unpainted Picket Fence Corner=Cerca de Piquete Não Pintada de Canto @@ -14,7 +8,9 @@ White Picket Fence=Cerca de Piquete Branca White Picket Fence Corner=Cerca de Piquete Branca de Canto Wooden Privacy Fence=Cerca Privativa de Madeira Wooden Privacy Fence Corner=Cerca Privativa de Madeira de Canto +Barbed Wire Fence=Cerca de Arame Farpado +Barbed Wire Fence Corner=Cerca de Arame Farpado de Canto +Chainlink Fence=Cerca de Tela de Arame +Chainlink Fence Corner=Cerca de Tela de Arame de Canto Wrought Iron fence (type 2)=Cerca de Ferro Forjado (tipo 2) Wrought Iron fence (type 2) Corner=Cerca de Ferro Forjado (tipo 2) de Canto -brass=latão -wrought iron=ferro forjado diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt_BR.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt_BR.tr index 3f5c0a5d..4ea97e36 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.pt_BR.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Cerca de Arame Farpado -Barbed Wire Fence Corner=Cerca de Arame Farpado de Canto -Chainlink Fence=Cerca de Tela de Arame -Chainlink Fence Corner=Cerca de Tela de Arame de Canto +brass=latão +wrought iron=ferro forjado Fence/railing (@1)=Cerca/corrimão (@1) Unpainted Picket Fence=Cerca de Piquete Não Pintada Unpainted Picket Fence Corner=Cerca de Piquete Não Pintada de Canto @@ -14,7 +8,9 @@ White Picket Fence=Cerca de Piquete Branca White Picket Fence Corner=Cerca de Piquete Branca de Canto Wooden Privacy Fence=Cerca Privativa de Madeira Wooden Privacy Fence Corner=Cerca Privativa de Madeira de Canto +Barbed Wire Fence=Cerca de Arame Farpado +Barbed Wire Fence Corner=Cerca de Arame Farpado de Canto +Chainlink Fence=Cerca de Tela de Arame +Chainlink Fence Corner=Cerca de Tela de Arame de Canto Wrought Iron fence (type 2)=Cerca de Ferro Forjado (tipo 2) Wrought Iron fence (type 2) Corner=Cerca de Ferro Forjado (tipo 2) de Canto -brass=latão -wrought iron=ferro forjado diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ru.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ru.tr index 1b77fc1b..07a85c52 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ru.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.ru.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=Забор из колючей проволоки -Barbed Wire Fence Corner=Угол забора из колючей проволоки -Chainlink Fence=Цепной забор -Chainlink Fence Corner=Угол цепного забора +brass=латунь +wrought iron=кованное железо Fence/railing (@1)=Забор/ограда (@1) Unpainted Picket Fence=Некрашеный забор из частокола Unpainted Picket Fence Corner=Угол некрашеного забора из частокола @@ -14,7 +8,9 @@ White Picket Fence=Белый забор из частокола White Picket Fence Corner=Угол белого забора из частокола Wooden Privacy Fence=Деревянный глухой забор Wooden Privacy Fence Corner=Угол деревянного глухого забора +Barbed Wire Fence=Забор из колючей проволоки +Barbed Wire Fence Corner=Угол забора из колючей проволоки +Chainlink Fence=Цепной забор +Chainlink Fence Corner=Угол цепного забора Wrought Iron fence (type 2)=Кованный железный забор (2й тип) Wrought Iron fence (type 2) Corner=Угол кованного железного забора (2й тип) -brass=латунь -wrought iron=кованное железо diff --git a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.zh_CN.tr b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.zh_CN.tr index f24c3fed..809dc40b 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_fences/locale/homedecor_fences.zh_CN.tr @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence=带刺铁丝网 -Barbed Wire Fence Corner=铁丝网围栏角 -Chainlink Fence=铁丝网围栏 -Chainlink Fence Corner=铁丝网围栏角 +brass=黄铜 +wrought iron=锻铁 Fence/railing (@1)=围栏/栏杆(@1) Unpainted Picket Fence=未上漆的尖桩篱笆 Unpainted Picket Fence Corner=未上漆的尖桩围栏角 @@ -14,7 +8,9 @@ White Picket Fence=白色尖桩篱笆 White Picket Fence Corner=白色尖桩篱笆角 Wooden Privacy Fence=木质隐私围栏 Wooden Privacy Fence Corner=木质隐私围栏角 +Barbed Wire Fence=带刺铁丝网 +Barbed Wire Fence Corner=铁丝网围栏角 +Chainlink Fence=铁丝网围栏 +Chainlink Fence Corner=铁丝网围栏角 Wrought Iron fence (type 2)=锻铁栅栏(2型) Wrought Iron fence (type 2) Corner=锻铁围栏(2类)转角 -brass=黄铜 -wrought iron=锻铁 diff --git a/mods/homedecor_modpack/homedecor_fences/locale/template.txt b/mods/homedecor_modpack/homedecor_fences/locale/template.txt index d7d39aa6..aa054e30 100644 --- a/mods/homedecor_modpack/homedecor_fences/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_fences/locale/template.txt @@ -1,12 +1,6 @@ # textdomain: homedecor_fences - - -### init.lua ### - -Barbed Wire Fence= -Barbed Wire Fence Corner= -Chainlink Fence= -Chainlink Fence Corner= +brass= +wrought iron= Fence/railing (@1)= Unpainted Picket Fence= Unpainted Picket Fence Corner= @@ -14,7 +8,9 @@ White Picket Fence= White Picket Fence Corner= Wooden Privacy Fence= Wooden Privacy Fence Corner= +Barbed Wire Fence= +Barbed Wire Fence Corner= +Chainlink Fence= +Chainlink Fence Corner= Wrought Iron fence (type 2)= Wrought Iron fence (type 2) Corner= -brass= -wrought iron= diff --git a/mods/homedecor_modpack/homedecor_fences/mod.conf b/mods/homedecor_modpack/homedecor_fences/mod.conf index 727700a6..440d6998 100644 --- a/mods/homedecor_modpack/homedecor_fences/mod.conf +++ b/mods/homedecor_modpack/homedecor_fences/mod.conf @@ -1,4 +1,4 @@ name = homedecor_fences description = Homedecor mod: fences -depends = homedecor_common, default, basic_materials, dye -optional_depends = signs_lib +depends = homedecor_common +optional_depends = signs_lib, default, basic_materials, dye diff --git a/mods/homedecor_modpack/homedecor_foyer/.luacheckrc b/mods/homedecor_modpack/homedecor_foyer/.luacheckrc deleted file mode 100644 index 6718384e..00000000 --- a/mods/homedecor_modpack/homedecor_foyer/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_foyer/init.lua b/mods/homedecor_modpack/homedecor_foyer/init.lua index dbd725db..10bc31aa 100644 --- a/mods/homedecor_modpack/homedecor_foyer/init.lua +++ b/mods/homedecor_modpack/homedecor_foyer/init.lua @@ -4,8 +4,10 @@ homedecor.register("coatrack_wallmount", { tiles = { homedecor.plain_wood }, inventory_image = "homedecor_coatrack_wallmount_inv.png", description = S("Wall-mounted coat rack"), - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = { type = "fixed", fixed = { @@ -20,6 +22,13 @@ homedecor.register("coatrack_wallmount", { {0.0525, 0.025, 0.352697, 0.135, 0.115, 0.375}, -- NodeBox9 } }, + crafts = { + { + recipe = { + { "group:stick", "homedecor:curtainrod_wood", "group:stick" }, + }, + } + } }) homedecor.register("coat_tree", { @@ -30,8 +39,10 @@ homedecor.register("coat_tree", { }, inventory_image = "homedecor_coatrack_inv.png", description = S("Coat tree"), - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, expand = { top="placeholder" }, walkable = false, selection_box = { @@ -39,16 +50,59 @@ homedecor.register("coat_tree", { fixed = { -0.4, -0.5, -0.4, 0.4, 1.5, 0.4 } }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, + crafts = { + { + recipe = { + { "group:stick", "group:stick", "group:stick" }, + { "", "group:stick", "" }, + { "", "group:wood", "" } + }, + } + } }) +local grey = {{ + output = "homedecor:welcome_mat_grey 2", + recipe = { + { "", "dye_black", "" }, + { "wool_grey", "wool_grey", "wool_grey" }, + }, +}} + +local brown = {{ + output = "homedecor:welcome_mat_brown 2", + recipe = { + { "", "dye_black", "" }, + { "wool_brown", "wool_brown", "wool_brown" }, + }, +}} + +local green = { + { + output = "homedecor:welcome_mat_green 2", + recipe = { + { "", "dye_white", "" }, + { "wool_dark_green", "wool_dark_green", "wool_dark_green" }, + }, + }, + { + output = "homedecor:welcome_mat_green 2", + recipe = { + { "", "dye_white", "" }, + { "dye_black", "dye_black", "dye_black" }, + { "wool_green", "wool_green", "wool_green" }, + }, + } +} + local mat_colors = { - { "green", S("Green welcome mat") }, - { "brown", S("Brown welcome mat") }, - { "grey", S("Grey welcome mat") }, + { "green", S("Green welcome mat"), green }, + { "brown", S("Brown welcome mat"), brown }, + { "grey", S("Grey welcome mat"), grey }, } for _, mat in ipairs(mat_colors) do - local color, desc = unpack(mat) + local color, desc, crafts = unpack(mat) homedecor.register("welcome_mat_"..color, { description = desc, tiles = { @@ -56,65 +110,14 @@ for _, mat in ipairs(mat_colors) do "homedecor_welcome_mat_bottom.png", "homedecor_welcome_mat_"..color..".png", }, - groups = {crumbly=3}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.25}, - }), + groups = {crumbly=3, dig_tree=2}, + _sound_def = { + key = "node_sound_dirt_defaults", + }, node_box = { type = "fixed", fixed = { -0.5, -0.5, -0.375, 0.5, -0.46875, 0.375 } - } + }, + crafts = crafts }) -end - --- crafting - - -minetest.register_craft({ - output = "homedecor:welcome_mat_grey 2", - recipe = { - { "", "dye:black", "" }, - { "wool:grey", "wool:grey", "wool:grey" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:welcome_mat_brown 2", - recipe = { - { "", "dye:black", "" }, - { "wool:brown", "wool:brown", "wool:brown" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:welcome_mat_green 2", - recipe = { - { "", "dye:white", "" }, - { "wool:dark_green", "wool:dark_green", "wool:dark_green" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:welcome_mat_green 2", - recipe = { - { "", "dye:white", "" }, - { "dye:black", "dye:black", "dye:black" }, - { "wool:green", "wool:green", "wool:green" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:coat_tree", - recipe = { - { "group:stick", "group:stick", "group:stick" }, - { "", "group:stick", "" }, - { "", "group:wood", "" } - }, -}) - -minetest.register_craft( { - output = "homedecor:coatrack_wallmount", - recipe = { - { "group:stick", "homedecor:curtainrod_wood", "group:stick" }, - }, -}) +end \ No newline at end of file diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.de.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.de.tr index 1b21fe77..2336eb21 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.de.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.de.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Brauner Fußabtreter +Wall-mounted coat rack=Wandgarderobe Coat tree=Kleiderständer Green welcome mat=Grüner Fußabtreter +Brown welcome mat=Brauner Fußabtreter Grey welcome mat=Grauer Fußabtreter -Wall-mounted coat rack=Wandgarderobe diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.es.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.es.tr index 12b4dbea..6c929703 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.es.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.es.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Tapete marrón de bienvenida +Wall-mounted coat rack=Perchero de pared Coat tree=Perchero de piso Green welcome mat=Tapete verde de bienvenida +Brown welcome mat=Tapete marrón de bienvenida Grey welcome mat=Tapete gris de bienvenida -Wall-mounted coat rack=Perchero de pared diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.fr.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.fr.tr index 934bb29a..65ec55be 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.fr.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.fr.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Paillasson marron +Wall-mounted coat rack=Porte-manteau mural Coat tree=Porte-manteau Green welcome mat=Paillasson vert +Brown welcome mat=Paillasson marron Grey welcome mat=Paillasson gris -Wall-mounted coat rack=Porte-manteau mural diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ms.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ms.tr index d2b10feb..77e00ac2 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ms.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ms.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Alas Kaki "Welcome" Perang +Wall-mounted coat rack=Penyangkut Baju Dinding Coat tree=Penyangkut Baju Berdiri Green welcome mat=Alas Kaki "Welcome" Hijau +Brown welcome mat=Alas Kaki "Welcome" Perang Grey welcome mat=Alas Kaki "Welcome" Kelabu -Wall-mounted coat rack=Penyangkut Baju Dinding diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt.tr index cf45a52c..c1ca5a3f 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Tapete de boas vindas marrom +Wall-mounted coat rack=Cabideiro de parede Coat tree=Cabideiro de piso Green welcome mat=Tapete de boas vindas verde +Brown welcome mat=Tapete de boas vindas marrom Grey welcome mat=Tapete de boas vindas cinza -Wall-mounted coat rack=Cabideiro de parede diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt_BR.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt_BR.tr index cf45a52c..c1ca5a3f 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.pt_BR.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Tapete de boas vindas marrom +Wall-mounted coat rack=Cabideiro de parede Coat tree=Cabideiro de piso Green welcome mat=Tapete de boas vindas verde +Brown welcome mat=Tapete de boas vindas marrom Grey welcome mat=Tapete de boas vindas cinza -Wall-mounted coat rack=Cabideiro de parede diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ru.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ru.tr index 859adf45..c4c29dad 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ru.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.ru.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=Коричневый коврик под входную дверь +Wall-mounted coat rack=Настенная вешалка для одежды Coat tree=Стоечная вешалка для одежды Green welcome mat=Зелёный коврик под входную дверь +Brown welcome mat=Коричневый коврик под входную дверь Grey welcome mat=Серый коврик под входную дверь -Wall-mounted coat rack=Настенная вешалка для одежды diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.zh_CN.tr b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.zh_CN.tr index be57f16b..2e7b108d 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_foyer/locale/homedecor_foyer.zh_CN.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat=棕色迎宾垫 +Wall-mounted coat rack=壁挂衣架 Coat tree=种树 Green welcome mat=绿色迎宾垫 +Brown welcome mat=棕色迎宾垫 Grey welcome mat=灰色迎宾垫 -Wall-mounted coat rack=壁挂衣架 diff --git a/mods/homedecor_modpack/homedecor_foyer/locale/template.txt b/mods/homedecor_modpack/homedecor_foyer/locale/template.txt index 2bf8598e..70db6144 100644 --- a/mods/homedecor_modpack/homedecor_foyer/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_foyer/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: homedecor_foyer - - -### init.lua ### - -Brown welcome mat= +Wall-mounted coat rack= Coat tree= Green welcome mat= +Brown welcome mat= Grey welcome mat= -Wall-mounted coat rack= diff --git a/mods/homedecor_modpack/homedecor_foyer/mod.conf b/mods/homedecor_modpack/homedecor_foyer/mod.conf index 47fbde76..bd0f30e7 100644 --- a/mods/homedecor_modpack/homedecor_foyer/mod.conf +++ b/mods/homedecor_modpack/homedecor_foyer/mod.conf @@ -1,4 +1,4 @@ name = homedecor_foyer description = Homedecor mod: foyer -depends = homedecor_common, default, dye -optional_depends = screwdriver +depends = homedecor_common +optional_depends = screwdriver, default, dye diff --git a/mods/homedecor_modpack/homedecor_furniture/.luacheckrc b/mods/homedecor_modpack/homedecor_furniture/.luacheckrc deleted file mode 100644 index 760672e2..00000000 --- a/mods/homedecor_modpack/homedecor_furniture/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "unifieddyes", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_furniture/init.lua b/mods/homedecor_modpack/homedecor_furniture/init.lua index bcb9dea4..9c7e33af 100644 --- a/mods/homedecor_modpack/homedecor_furniture/init.lua +++ b/mods/homedecor_modpack/homedecor_furniture/init.lua @@ -5,29 +5,44 @@ local ob_cbox = { fixed = { -0.5, -0.5, 0, 0.5, 0.5, 0.5 } } -minetest.register_node(":homedecor:openframe_bookshelf", { +local wood_tex = homedecor.textures.wood.apple.planks + +homedecor.register("openframe_bookshelf", { description = S("Bookshelf (open-frame)"), drawtype = "mesh", mesh = "homedecor_openframe_bookshelf.obj", tiles = { "homedecor_openframe_bookshelf_books.png", - "default_wood.png" + wood_tex }, groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, paramtype = "light", paramtype2 = "facedir", selection_box = ob_cbox, collision_box = ob_cbox, + crafts = { + { + recipe = { + {"group:wood", "", "group:wood"}, + {"book", "book", "book"}, + {"group:wood", "", "group:wood"}, + }, + } + } }) homedecor.register("wall_shelf", { description = S("Wall Shelf"), tiles = { - "default_wood.png", + wood_tex, + }, + groups = { snappy = 3, dig_tree = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), node_box = { type = "fixed", fixed = { diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.de.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.de.tr index 7cd10c56..63c42477 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.de.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.de.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Bücherregal (offener Rahmen) -Mahogany Table=Mahagonitisch -Table=Tisch Wall Shelf=Wandbrett -White Table=Weißer Tisch diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.es.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.es.tr index 72c4b51d..82945aaa 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.es.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.es.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Estante para libros (abierto) -Mahogany Table=Mesa de caoba -Table=Mesa Wall Shelf=Estante -White Table=Mesa blanca diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.fr.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.fr.tr index b2caeddf..7fcddd03 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.fr.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.fr.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Bibliothèque (cadre ouvert) -Mahogany Table=Table en acajou -Table=Table Wall Shelf=Étagère -White Table=Table blanche diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.it.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.it.tr index 3f0fdad7..8b43c29a 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.it.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.it.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)= -Mahogany Table=Porta dell'armadio in mogano -Table=Tavolo Wall Shelf= -White Table=Tavolo di lavoro diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ms.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ms.tr index 1394ba35..ec6a3126 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ms.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ms.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Rak Buku (Bingkai Terbuka) -Mahogany Table=Meja Mahogani -Table=Meja Wall Shelf=Rak Dinding -White Table=Meja Putih diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt.tr index 580f1254..80704724 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Estante de Livros de Parede -Mahogany Table=Mesa em Mogno -Table=Mesa Wall Shelf=Estante de Parede -White Table=Mesa Branca diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt_BR.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt_BR.tr index 580f1254..80704724 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.pt_BR.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Estante de Livros de Parede -Mahogany Table=Mesa em Mogno -Table=Mesa Wall Shelf=Estante de Parede -White Table=Mesa Branca diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ru.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ru.tr index c78d1e14..c161955a 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ru.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.ru.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=Книжная полка (открытая) -Mahogany Table=Стол из красного дерева -Table=Стол Wall Shelf=Настенная полка -White Table=Белый стол diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.zh_CN.tr b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.zh_CN.tr index 7e04c927..db64ae35 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_furniture/locale/homedecor_furniture.zh_CN.tr @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)=书架(开架) -Mahogany Table=红木桌 -Table=桌子 Wall Shelf=墙架 -White Table=白色桌子 diff --git a/mods/homedecor_modpack/homedecor_furniture/locale/template.txt b/mods/homedecor_modpack/homedecor_furniture/locale/template.txt index 4df251fa..8b43c29a 100644 --- a/mods/homedecor_modpack/homedecor_furniture/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_furniture/locale/template.txt @@ -1,10 +1,3 @@ # textdomain: homedecor_furniture - - -### init.lua ### - Bookshelf (open-frame)= -Mahogany Table= -Table= Wall Shelf= -White Table= diff --git a/mods/homedecor_modpack/homedecor_furniture/mod.conf b/mods/homedecor_modpack/homedecor_furniture/mod.conf index 1425e755..a0ac325d 100644 --- a/mods/homedecor_modpack/homedecor_furniture/mod.conf +++ b/mods/homedecor_modpack/homedecor_furniture/mod.conf @@ -1,4 +1,4 @@ name = homedecor_furniture description = Homedecor mod: furniture -depends = homedecor_common, default, unifieddyes, wool -optional_depends = moreblocks, technic, bucket +depends = homedecor_common +optional_depends = moreblocks, technic, bucket, default, unifieddyes, wool diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/.luacheckrc b/mods/homedecor_modpack/homedecor_furniture_medieval/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/init.lua b/mods/homedecor_modpack/homedecor_furniture_medieval/init.lua index 7db474ac..5dde4f20 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/init.lua +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/init.lua @@ -17,8 +17,19 @@ homedecor.register("bars", { type = "fixed", fixed = { -0.5, -0.5, -0.1, 0.5, 0.5, 0.1 }, }, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone=1}, + _sound_def = { + key = "node_sound_stone_defaults", + }, + crafts = { + { + output = "homedecor:bars 6", + recipe = { + { "steel_ingot","steel_ingot","steel_ingot" }, + { "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" }, + }, + } + } }) --L Binding Bars @@ -37,8 +48,19 @@ homedecor.register("L_binding_bars", { { -0.05, 0.45, -0.50, 0.05, 0.50, 0.00 }, }, }, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, dig_stone=1}, + _sound_def = { + key = "node_sound_stone_defaults", + }, + crafts = { + { + output = "homedecor:L_binding_bars 3", + recipe = { + { "homedecor:bars","" }, + { "homedecor:bars","homedecor:bars" }, + }, + } + } }) local chain_cbox = { @@ -53,26 +75,19 @@ homedecor.register("chains", { inventory_image="forniture_chains_inv.png", selection_box = chain_cbox, walkable = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - --- Crafts - -minetest.register_craft({ - output = "homedecor:bars 6", - recipe = { - { "default:steel_ingot","default:steel_ingot","default:steel_ingot" }, - { "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:L_binding_bars 3", - recipe = { - { "homedecor:bars","" }, - { "homedecor:bars","homedecor:bars" }, + groups = {cracky=3, dig_stone=1}, + _sound_def = { + key = "node_sound_stone_defaults", }, + crafts = { + { + output = "homedecor:chains 4", + recipe = { + { "steel_ingot","" }, + { "homedecor:bars","homedecor:bars" }, + }, + } + } }) minetest.register_alias("3dforniture:bars", "homedecor:bars") diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.de.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.de.tr index c56bcf9c..60c9d7dc 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.de.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Gitterstäbe Binding Bars=Gitterstäbeverbindung Chains=Ketten diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.es.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.es.tr index c9fd27e2..bb84bdfc 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.es.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.es.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Barrotes Binding Bars=Barrotes de contención Chains=Cadenas diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.fr.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.fr.tr index c9ad7242..0ab0fd6a 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.fr.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Barres de renfort Binding Bars=Barres de renfort (angle) Chains=Chaînes diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.it.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.it.tr index fcbf299c..f654b8ca 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.it.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.it.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Sbarre Binding Bars=Ceppi Chains=Catene diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ms.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ms.tr index 2ef03e19..7081bc12 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ms.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ms.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Palang Binding Bars=Palang Bucu Chains=Rantai diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt.tr index 6854248d..07794ef1 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Barras Binding Bars=Barras do Canto Chains=Correntes diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt_BR.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt_BR.tr index 6854248d..07794ef1 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.pt_BR.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Barras Binding Bars=Barras do Canto Chains=Correntes diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ru.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ru.tr index 2a20d5cd..99e00c04 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ru.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.ru.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=Стержни Binding Bars=Связующие стержни Chains=Цепи diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.zh_CN.tr b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.zh_CN.tr index 7a9ca22f..54ba7577 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/homedecor_furniture_medieval.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars=酒吧 Binding Bars=绑扎钢筋 Chains=链 diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/template.txt b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/template.txt index 6de9a397..a9fc0754 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_furniture_medieval - - -### init.lua ### - Bars= Binding Bars= Chains= diff --git a/mods/homedecor_modpack/homedecor_furniture_medieval/mod.conf b/mods/homedecor_modpack/homedecor_furniture_medieval/mod.conf index de463a34..3518dd59 100644 --- a/mods/homedecor_modpack/homedecor_furniture_medieval/mod.conf +++ b/mods/homedecor_modpack/homedecor_furniture_medieval/mod.conf @@ -1,3 +1,3 @@ name = homedecor_furniture_medieval description = Homedecor mod: furniture medieval -depends = homedecor_common, default, creative +depends = homedecor_common diff --git a/mods/homedecor_modpack/homedecor_gastronomy/.luacheckrc b/mods/homedecor_modpack/homedecor_gastronomy/.luacheckrc deleted file mode 100644 index 24ea4f8c..00000000 --- a/mods/homedecor_modpack/homedecor_gastronomy/.luacheckrc +++ /dev/null @@ -1,22 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "creative", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_gastronomy/init.lua b/mods/homedecor_modpack/homedecor_gastronomy/init.lua index 4cc18b66..8bff5847 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/init.lua +++ b/mods/homedecor_modpack/homedecor_gastronomy/init.lua @@ -8,16 +8,51 @@ local cutlery_cbox = { } } +local fdir_to_steampos = { + x = { 0.15, 0.275, -0.15, -0.275 }, + z = { 0.275, -0.15, -0.275, 0.15 } +} + +local function sfx(pos) + local node = minetest.get_node(pos) + local fdir = node.param2 + if fdir and fdir < 4 then + + local steamx = fdir_to_steampos.x[fdir + 1] + local steamz = fdir_to_steampos.z[fdir + 1] + + minetest.add_particlespawner({ + amount = 1, + time = 1, + minpos = {x=pos.x - steamx, y=pos.y - 0.35, z=pos.z - steamz}, + maxpos = {x=pos.x - steamx, y=pos.y - 0.35, z=pos.z - steamz}, + minvel = {x=-0.003, y=0.01, z=-0.003}, + maxvel = {x=0.003, y=0.01, z=-0.003}, + minacc = {x=0.0,y=-0.0,z=-0.0}, + maxacc = {x=0.0,y=0.003,z=-0.0}, + minexptime = 2, + maxexptime = 5, + minsize = 1, + maxsize = 1.2, + collisiondetection = false, + texture = "homedecor_steam.png", + }) + end + return true +end + homedecor.register("cutlery_set", { drawtype = "mesh", mesh = "homedecor_cutlery_set.obj", tiles = { "homedecor_cutlery_set.png" }, inventory_image = "homedecor_cutlery_set_inv.png", description = S("Cutlery set"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone=3}, selection_box = cutlery_cbox, walkable = false, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, }) local bottle_cbox = { @@ -49,8 +84,10 @@ for _, b in ipairs(bottle_colors) do description = desc, mesh = "homedecor_bottle.obj", walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_glass_defaults(), + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_glass_defaults", + }, selection_box = bottle_cbox }) @@ -65,8 +102,10 @@ for _, b in ipairs(bottle_colors) do description = desc4, mesh = "homedecor_4_bottles.obj", walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_glass_defaults(), + groups = {snappy=3, dig_stone=3}, + _sound_def = { + key = "node_sound_glass_defaults", + }, selection_box = fbottle_cbox }) end @@ -79,9 +118,11 @@ homedecor.register("4_bottles_multi", { inventory_image = "homedecor_4_bottles_multi_inv.png", description = S("Four misc brown/green bottles"), mesh = "homedecor_4_bottles.obj", - groups = {snappy=3}, + groups = {snappy=3, dig_stone=3}, walkable = false, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, selection_box = fbottle_cbox }) @@ -97,10 +138,12 @@ homedecor.register("wine_rack", { "homedecor_bottle_brown4.png" }, inventory_image = "homedecor_wine_rack_inv.png", - groups = {choppy=2}, + groups = {choppy=2, dig_tree=2}, selection_box = wine_cbox, collision_box = wine_cbox, - sounds = default.node_sound_defaults(), + _sound_def = { + key = "node_sound_default", + }, }) -- coffee! @@ -125,10 +168,23 @@ homedecor.register("coffee_maker", { description = S("Coffee Maker"), inventory_image = "homedecor_coffeemaker_inv.png", walkable = false, - groups = {snappy=3}, + groups = {snappy=3, dig_stone=3}, selection_box = cm_cbox, node_box = cm_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, + crafts = { + { + recipe = { + {"basic_materials:plastic_sheet", "bucket:bucket_water", "basic_materials:plastic_sheet"}, + {"basic_materials:plastic_sheet", "glass_block", "basic_materials:plastic_sheet"}, + {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"} + }, + } + }, + on_timer = sfx, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end }) homedecor.register("toaster", { @@ -136,7 +192,8 @@ homedecor.register("toaster", { tiles = { "homedecor_toaster_sides.png" }, inventory_image = "homedecor_toaster_inv.png", walkable = false, - groups = { snappy=3 }, + use_texture_alpha = "clip", + groups = { snappy=3, dig_stone=3 }, node_box = { type = "fixed", fixed = { @@ -152,7 +209,15 @@ homedecor.register("toaster", { max_hear_distance = 5 }) return itemstack - end + end, + crafts = { + { + recipe = { + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" }, + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" } + }, + } + } }) homedecor.register("toaster_loaf", { @@ -165,7 +230,8 @@ homedecor.register("toaster_loaf", { "homedecor_toaster_sides.png" }, walkable = false, - groups = { snappy=3, not_in_creative_inventory=1 }, + use_texture_alpha = "clip", + groups = { snappy=3, not_in_creative_inventory=1, dig_stone=3 }, node_box = { type = "fixed", fixed = { @@ -182,77 +248,22 @@ homedecor.register("toaster_loaf", { drop = "homedecor:toaster" }) -local fdir_to_steampos = { - x = { 0.15, 0.275, -0.15, -0.275 }, - z = { 0.275, -0.15, -0.275, 0.15 } -} - -minetest.register_abm({ - nodenames = "homedecor:coffee_maker", - label = "sfx", - interval = 2, - chance = 1, - action = function(pos, node) - local fdir = node.param2 - if fdir and fdir < 4 then - - local steamx = fdir_to_steampos.x[fdir + 1] - local steamz = fdir_to_steampos.z[fdir + 1] - - minetest.add_particlespawner({ - amount = 1, - time = 1, - minpos = {x=pos.x - steamx, y=pos.y - 0.35, z=pos.z - steamz}, - maxpos = {x=pos.x - steamx, y=pos.y - 0.35, z=pos.z - steamz}, - minvel = {x=-0.003, y=0.01, z=-0.003}, - maxvel = {x=0.003, y=0.01, z=-0.003}, - minacc = {x=0.0,y=-0.0,z=-0.0}, - maxacc = {x=0.0,y=0.003,z=-0.0}, - minexptime = 2, - maxexptime = 5, - minsize = 1, - maxsize = 1.2, - collisiondetection = false, - texture = "homedecor_steam.png", - }) - end - end -}) - -- crafting minetest.register_craft( { output = "homedecor:bottle_green", recipe = { - { "vessels:glass_bottle", "dye:green" } + { homedecor.materials["glass_bottle"], homedecor.materials["dye_green"] } }, }) minetest.register_craft( { output = "homedecor:bottle_brown", recipe = { - { "vessels:glass_bottle", "dye:brown" } + { homedecor.materials["glass_bottle"], homedecor.materials["dye_brown"] } }, }) -minetest.register_craft({ - output = "homedecor:coffee_maker", - recipe = { - {"basic_materials:plastic_sheet", "bucket:bucket_water", "basic_materials:plastic_sheet"}, - {"basic_materials:plastic_sheet", "default:glass", "basic_materials:plastic_sheet"}, - {"basic_materials:plastic_sheet", "basic_materials:heating_element", "basic_materials:plastic_sheet"} - }, -}) - -minetest.register_craft({ - output = "homedecor:toaster", - recipe = { - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" }, - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" } - }, -}) - - minetest.register_craft({ type = "shapeless", output = "homedecor:4_bottles_brown", @@ -295,3 +306,11 @@ minetest.register_craft({ }, }) +minetest.register_lbm({ + name = "homedecor_gastronomy:sfx_init", + nodenames = {"homedecor:coffee_maker"}, + run_at_every_load = false, + action = function(pos) + minetest.get_node_timer(pos):start(2) + end +}) diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.de.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.de.tr index 2a00d01f..ce8b9f7a 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.de.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.de.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Braune Flasche -Coffee Maker=Kaffeemaschine Cutlery set=Besteckset +Brown bottle=Braune Flasche Four brown bottles=Vier braune Flaschen +Green bottle=Grüne Flasche Four green bottles=Vier grüne Flaschen Four misc brown/green bottles=Vier gemischte braune/grüne Flaschen -Green bottle=Grüne Flasche -Toaster=Toaster Wine rack=Weinregal +Coffee Maker=Kaffeemaschine +Toaster=Toaster diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.es.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.es.tr index 1624badd..729d19a9 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.es.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.es.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Botella marrón -Coffee Maker=Cafetera Cutlery set=Cubertería +Brown bottle=Botella marrón Four brown bottles=Cuatro botellas marrones +Green bottle=Botella verde Four green bottles=Cuatro botellas verdes Four misc brown/green bottles=Cuatro botellas verdes/marrones -Green bottle=Botella verde -Toaster=Tostador Wine rack=Estantería de vino +Coffee Maker=Cafetera +Toaster=Tostador diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.fr.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.fr.tr index af7a8146..3d1cfce8 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.fr.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.fr.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Bouteille marron -Coffee Maker=Cafetière Cutlery set=Couverts +Brown bottle=Bouteille marron Four brown bottles=Quatre bouteilles marrons +Green bottle=Bouteille verte Four green bottles=Quatre bouteilles vertes Four misc brown/green bottles=Quatre bouteilles marrons et vertes -Green bottle=Bouteille verte -Toaster=Grille-pain Wine rack=Casier à bouteilles +Coffee Maker=Cafetière +Toaster=Grille-pain diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.it.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.it.tr index 76cc2f2c..bdc43be2 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.it.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.it.tr @@ -1,17 +1,10 @@ # textdomain: homedecor_gastronomy - - -### init.lua ### - -Ahh, a frosty cold beer - look in your inventory for it!= -Beer mug= -Beer tap= -Brown bottle= -Coffee Maker= Cutlery set= +Brown bottle= Four brown bottles= +Green bottle= Four green bottles= Four misc brown/green bottles= -Green bottle= -Toaster= Wine rack= +Coffee Maker= +Toaster= diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ms.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ms.tr index c9995578..2bd230b7 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ms.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ms.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Botol Perang -Coffee Maker=Alat Pembuat Kopi Cutlery set=Set Kutleri +Brown bottle=Botol Perang Four brown bottles=Empat Botol Perang +Green bottle=Botol Hijau Four green bottles=Empat Botol Hijau Four misc brown/green bottles=Empat Botol Pelbagai Warna -Green bottle=Botol Hijau -Toaster=Pembakar Roti Wine rack=Rak Wain +Coffee Maker=Alat Pembuat Kopi +Toaster=Pembakar Roti diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt.tr index 4329dfd1..6a712676 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Garrafa marrom -Coffee Maker=Cafeteira Cutlery set=Conjunto de Talheres +Brown bottle=Garrafa marrom Four brown bottles=Quatro garrafas marrons +Green bottle=Garrafa verde Four green bottles=Quatro garrafas verdes Four misc brown/green bottles=Quatro garrafas mescladas verde/marrom -Green bottle=Garrafa verde -Toaster=Torradeira Wine rack=Prateleira de Vinho +Coffee Maker=Cafeteira +Toaster=Torradeira diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt_BR.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt_BR.tr index 4329dfd1..6a712676 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.pt_BR.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Garrafa marrom -Coffee Maker=Cafeteira Cutlery set=Conjunto de Talheres +Brown bottle=Garrafa marrom Four brown bottles=Quatro garrafas marrons +Green bottle=Garrafa verde Four green bottles=Quatro garrafas verdes Four misc brown/green bottles=Quatro garrafas mescladas verde/marrom -Green bottle=Garrafa verde -Toaster=Torradeira Wine rack=Prateleira de Vinho +Coffee Maker=Cafeteira +Toaster=Torradeira diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ru.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ru.tr index e7d34abb..b98f8381 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ru.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.ru.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=Коричневая бутылка -Coffee Maker=Кофеварка Cutlery set=Набор столовых приборов +Brown bottle=Коричневая бутылка Four brown bottles=Четыре коричневых бутылки +Green bottle=Зелёная бутылка Four green bottles=Четыре зелёных бутылки Four misc brown/green bottles=Четыре разные коричневые/зелёные -Green bottle=Зелёная бутылка -Toaster=Тостер Wine rack=Винный шкаф +Coffee Maker=Кофеварка +Toaster=Тостер diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.zh_CN.tr b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.zh_CN.tr index 7f0fe40c..c1befbba 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/homedecor_gastronomy.zh_CN.tr @@ -1,13 +1,10 @@ # textdomain: homedecor_gastronomy - -### init.lua ### - -Brown bottle=棕色瓶子 -Coffee Maker=咖啡机 Cutlery set=餐具套装 +Brown bottle=棕色瓶子 Four brown bottles=四个棕色瓶子 +Green bottle=绿瓶 Four green bottles=四个绿色瓶子 Four misc brown/green bottles=四个其他棕色/绿色瓶子 -Green bottle=绿瓶 -Toaster=烤面包机 Wine rack=酒架 +Coffee Maker=咖啡机 +Toaster=烤面包机 diff --git a/mods/homedecor_modpack/homedecor_gastronomy/locale/template.txt b/mods/homedecor_modpack/homedecor_gastronomy/locale/template.txt index 76cc2f2c..bdc43be2 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_gastronomy/locale/template.txt @@ -1,17 +1,10 @@ # textdomain: homedecor_gastronomy - - -### init.lua ### - -Ahh, a frosty cold beer - look in your inventory for it!= -Beer mug= -Beer tap= -Brown bottle= -Coffee Maker= Cutlery set= +Brown bottle= Four brown bottles= +Green bottle= Four green bottles= Four misc brown/green bottles= -Green bottle= -Toaster= Wine rack= +Coffee Maker= +Toaster= diff --git a/mods/homedecor_modpack/homedecor_gastronomy/mod.conf b/mods/homedecor_modpack/homedecor_gastronomy/mod.conf index b81ba2a7..c8622152 100644 --- a/mods/homedecor_modpack/homedecor_gastronomy/mod.conf +++ b/mods/homedecor_modpack/homedecor_gastronomy/mod.conf @@ -1,4 +1,4 @@ name = homedecor_gastronomy description = Homedecor mod: gastronomy -depends = homedecor_common, default, basic_materials, dye, creative +depends = homedecor_common optional_depends = bucket, screwdriver diff --git a/mods/homedecor_modpack/inbox/init.lua b/mods/homedecor_modpack/homedecor_inbox/init.lua similarity index 86% rename from mods/homedecor_modpack/inbox/init.lua rename to mods/homedecor_modpack/homedecor_inbox/init.lua index 0ec889b8..6d870dc4 100644 --- a/mods/homedecor_modpack/inbox/init.lua +++ b/mods/homedecor_modpack/homedecor_inbox/init.lua @@ -2,36 +2,29 @@ local S = minetest.get_translator("inbox") local inbox = {} -minetest.register_craft({ - output ="inbox:empty", - recipe = { - {"","default:steel_ingot",""}, - {"default:steel_ingot","","default:steel_ingot"}, - {"default:steel_ingot","default:steel_ingot","default:steel_ingot"} - } -}) - local mb_cbox = { type = "fixed", fixed = { -5/16, -8/16, -8/16, 5/16, 2/16, 8/16 } } -minetest.register_node("inbox:empty", { +homedecor.register("inbox", { paramtype = "light", drawtype = "mesh", - mesh = "inbox_mailbox.obj", + mesh = "homedecor_inbox_mailbox.obj", description = S("Mailbox"), tiles = { - "inbox_red_metal.png", - "inbox_white_metal.png", - "inbox_grey_metal.png", + "homedecor_inbox_red_metal.png", + "homedecor_inbox_white_metal.png", + "homedecor_inbox_grey_metal.png", }, - inventory_image = "mailbox_inv.png", + inventory_image = "homedecor_mailbox_inv.png", selection_box = mb_cbox, collision_box = mb_cbox, paramtype2 = "facedir", groups = {choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, after_place_node = function(pos, placer, itemstack) local meta = minetest.get_meta(pos) @@ -103,8 +96,19 @@ minetest.register_node("inbox:empty", { allow_metadata_inventory_move = function(pos) return 0 end, + crafts = { + { + recipe = { + {"","steel_ingot",""}, + {"steel_ingot","","steel_ingot"}, + {"steel_ingot","steel_ingot","steel_ingot"} + } + } + } }) +minetest.register_alias("inbox:empty", "homedecor:inbox") + function inbox.get_inbox_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = diff --git a/mods/homedecor_modpack/inbox/locale/inbox.de.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.de.tr similarity index 56% rename from mods/homedecor_modpack/inbox/locale/inbox.de.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.de.tr index cb2a78cf..b8f773b7 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.de.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.de.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Briefkasten von @1 +# textdomain: homedecor_inbox Mailbox=Briefkasten +@1's Mailbox=Briefkasten von @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.es.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.es.tr similarity index 50% rename from mods/homedecor_modpack/inbox/locale/inbox.es.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.es.tr index 7309df14..2c5f2d99 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.es.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.es.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Buzón de @1 +# textdomain: homedecor_inbox Mailbox=Buzón +@1's Mailbox=Buzón de @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.fr.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.fr.tr similarity index 61% rename from mods/homedecor_modpack/inbox/locale/inbox.fr.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.fr.tr index 3618ea04..0fb1cad3 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.fr.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.fr.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Boîte aux lettres de @1 +# textdomain: homedecor_inbox Mailbox=Boîte aux lettres +@1's Mailbox=Boîte aux lettres de @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.ms.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.ms.tr similarity index 53% rename from mods/homedecor_modpack/inbox/locale/inbox.ms.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.ms.tr index 259b537f..b0f6696e 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.ms.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.ms.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Peti Surat @1 +# textdomain: homedecor_inbox Mailbox=Peti Surat +@1's Mailbox=Peti Surat @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.pt.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt.tr similarity index 51% rename from mods/homedecor_modpack/inbox/locale/inbox.pt.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt.tr index 59a8ecda..05793ff9 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.pt.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Correio de @1 +# textdomain: homedecor_inbox Mailbox=Correio +@1's Mailbox=Correio de @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.pt_BR.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt_BR.tr similarity index 51% rename from mods/homedecor_modpack/inbox/locale/inbox.pt_BR.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt_BR.tr index 59a8ecda..05793ff9 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.pt_BR.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Correio de @1 +# textdomain: homedecor_inbox Mailbox=Correio +@1's Mailbox=Correio de @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.ru.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.ru.tr similarity index 65% rename from mods/homedecor_modpack/inbox/locale/inbox.ru.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.ru.tr index 0edb392a..a151725f 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.ru.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.ru.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=Почтовый ящик @1 +# textdomain: homedecor_inbox Mailbox=Почтовый ящик +@1's Mailbox=Почтовый ящик @1 diff --git a/mods/homedecor_modpack/inbox/locale/inbox.zh_CN.tr b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.zh_CN.tr similarity index 50% rename from mods/homedecor_modpack/inbox/locale/inbox.zh_CN.tr rename to mods/homedecor_modpack/homedecor_inbox/locale/inbox.zh_CN.tr index 14bbd903..182571b2 100644 --- a/mods/homedecor_modpack/inbox/locale/inbox.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_inbox/locale/inbox.zh_CN.tr @@ -1,7 +1,3 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox=@1的邮箱 +# textdomain: homedecor_inbox Mailbox=邮箱 +@1's Mailbox=@1的邮箱 diff --git a/mods/homedecor_modpack/homedecor_inbox/locale/template.txt b/mods/homedecor_modpack/homedecor_inbox/locale/template.txt new file mode 100644 index 00000000..8c11f35c --- /dev/null +++ b/mods/homedecor_modpack/homedecor_inbox/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: homedecor_inbox +Mailbox= +@1's Mailbox= diff --git a/mods/homedecor_modpack/homedecor_inbox/mod.conf b/mods/homedecor_modpack/homedecor_inbox/mod.conf new file mode 100644 index 00000000..9ba7cca6 --- /dev/null +++ b/mods/homedecor_modpack/homedecor_inbox/mod.conf @@ -0,0 +1,3 @@ +name = homedecor_inbox +depends = homedecor_common +optional_depends = screwdriver diff --git a/mods/homedecor_modpack/inbox/models/inbox_mailbox.obj b/mods/homedecor_modpack/homedecor_inbox/models/homedecor_inbox_mailbox.obj similarity index 100% rename from mods/homedecor_modpack/inbox/models/inbox_mailbox.obj rename to mods/homedecor_modpack/homedecor_inbox/models/homedecor_inbox_mailbox.obj diff --git a/mods/homedecor_modpack/inbox/textures/inbox_grey_metal.png b/mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_grey_metal.png similarity index 100% rename from mods/homedecor_modpack/inbox/textures/inbox_grey_metal.png rename to mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_grey_metal.png diff --git a/mods/homedecor_modpack/inbox/textures/inbox_red_metal.png b/mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_red_metal.png similarity index 100% rename from mods/homedecor_modpack/inbox/textures/inbox_red_metal.png rename to mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_red_metal.png diff --git a/mods/homedecor_modpack/inbox/textures/inbox_white_metal.png b/mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_white_metal.png similarity index 100% rename from mods/homedecor_modpack/inbox/textures/inbox_white_metal.png rename to mods/homedecor_modpack/homedecor_inbox/textures/homedecor_inbox_white_metal.png diff --git a/mods/homedecor_modpack/inbox/textures/mailbox_inv.png b/mods/homedecor_modpack/homedecor_inbox/textures/homedecor_mailbox_inv.png similarity index 100% rename from mods/homedecor_modpack/inbox/textures/mailbox_inv.png rename to mods/homedecor_modpack/homedecor_inbox/textures/homedecor_mailbox_inv.png diff --git a/mods/homedecor_modpack/homedecor_kitchen/.luacheckrc b/mods/homedecor_modpack/homedecor_kitchen/.luacheckrc deleted file mode 100644 index 6718384e..00000000 --- a/mods/homedecor_modpack/homedecor_kitchen/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_kitchen/init.lua b/mods/homedecor_modpack/homedecor_kitchen/init.lua index 9c321351..74ed9c29 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/init.lua +++ b/mods/homedecor_modpack/homedecor_kitchen/init.lua @@ -8,8 +8,10 @@ homedecor.register("refrigerator_steel", { tiles = { "homedecor_refrigerator_steel.png" }, inventory_image = "homedecor_refrigerator_steel_inv.png", description = S("Refrigerator (stainless steel)"), - groups = {snappy=3}, - sounds = default.node_sound_stone_defaults(), + groups = {snappy=3, dig_stone=1}, + _sound_def = { + key = "node_sound_stone_defaults", + }, selection_box = homedecor.nodebox.slab_y(2), collision_box = homedecor.nodebox.slab_y(2), expand = { top="placeholder" }, @@ -27,10 +29,12 @@ homedecor.register("refrigerator_white", { tiles = { "homedecor_refrigerator_white.png" }, inventory_image = "homedecor_refrigerator_white_inv.png", description = S("Refrigerator"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone=1}, selection_box = homedecor.nodebox.slab_y(2), collision_box = homedecor.nodebox.slab_y(2), - sounds = default.node_sound_stone_defaults(), + _sound_def = { + key = "node_sound_stone_defaults", + }, expand = { top="placeholder" }, infotext=S("Refrigerator"), inventory = { @@ -86,6 +90,7 @@ homedecor.register_furnace("microwave_oven", { output_width = 2, cook_speed = 1.5, extra_nodedef_fields = { + use_texture_alpha = "clip", node_box = { type = "fixed", fixed = { -0.5, -0.5, -0.125, 0.5, 0.125, 0.5 }, @@ -114,8 +119,10 @@ homedecor.register("dishwasher", { } }, selection_box = { type = "regular" }, - sounds = default.node_sound_stone_defaults(), - groups = { snappy = 3 }, + _sound_def = { + key = "node_sound_stone_defaults", + }, + groups = { snappy = 3, dig_stone=1 }, }) local materials = { ["granite"] = S("granite"), ["marble"] = S("marble"), ["steel"] = S("steel"), ["wood"] = S("wood") } @@ -131,18 +138,21 @@ homedecor.register("dishwasher_"..m, { "homedecor_dishwasher_back.png", "homedecor_dishwasher_front.png" }, - groups = { snappy = 3 }, - sounds = default.node_sound_stone_defaults(), + groups = { snappy = 3, dig_tree=1 }, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) end -local cabinet_sides = "(default_wood.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png" +local wood_tex = homedecor.textures.wood.apple.planks +local cabinet_sides = "("..wood_tex.."^[transformR90)^homedecor_kitchen_cabinet_bevel.png" local cabinet_sides_colored = "(homedecor_generic_wood_plain.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png" local ic_cabinet_sides = string.gsub(cabinet_sides, "%^", "&") local ic_cabinet_sides_colored = string.gsub(cabinet_sides_colored, "%^", "&") -local cabinet_bottom = "(default_wood.png^[colorize:#000000:100)^homedecor_kitchen_cabinet_bevel.png" +local cabinet_bottom = "("..wood_tex.."^[colorize:#000000:100)^homedecor_kitchen_cabinet_bevel.png" local cabinet_bottom_colored = "homedecor_generic_wood_plain.png^homedecor_kitchen_cabinet_bevel.png" local function N_(x) return x end @@ -178,12 +188,14 @@ for _, mat in ipairs(counter_materials) do .."{homedecor_kitchen_cabinet_front.png" .."{"..ic_cabinet_sides, mesh = "homedecor_kitchen_cabinet.obj", - paramtype2 = "wallmounted", + paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", airbrush_replacement_node = "homedecor:kitchen_cabinet_colored"..material, place_param2 = 0, - groups = { snappy = 3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_tree=1}, + _sound_def = { + key = "node_sound_stone_defaults", + }, infotext=S("Kitchen Cabinet"), inventory = { size=24, @@ -211,8 +223,10 @@ for _, mat in ipairs(counter_materials) do mesh = "homedecor_kitchen_cabinet.obj", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Kitchen Cabinet"), inventory = { size=24, @@ -238,11 +252,13 @@ for _, mat in ipairs(counter_materials) do .."{homedecor_kitchen_cabinet_front_with_drawers.png" .."{"..ic_cabinet_sides, mesh = "homedecor_kitchen_cabinet.obj", - paramtype2 = "wallmounted", + paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_drawers"..material, - groups = { snappy = 3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_tree=1}, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Kitchen Cabinet with drawers"), inventory = { size=24, @@ -270,8 +286,10 @@ for _, mat in ipairs(counter_materials) do mesh = "homedecor_kitchen_cabinet.obj", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Kitchen Cabinet with drawers"), inventory = { size=24, @@ -282,8 +300,8 @@ for _, mat in ipairs(counter_materials) do end }) - homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet"..material - homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet"..material.."_locked" + homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1]="homedecor:kitchen_cabinet"..material + homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1]="homedecor:kitchen_cabinet"..material.."_locked" end @@ -300,14 +318,16 @@ homedecor.register("kitchen_cabinet_colorable_half", { 'homedecor_kitchen_cabinet_front_half.png^homedecor_kitchen_cabinet_half_bevel.png' }, mesh = "homedecor_kitchen_cabinet_half.obj", - paramtype2 = "wallmounted", + paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_half", place_param2 = 0, selection_box = kitchen_cabinet_half_box, node_box = kitchen_cabinet_half_box, - groups = { snappy = 3, ud_param2_colorable = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Kitchen Cabinet"), inventory = { size=12, @@ -336,8 +356,10 @@ homedecor.register("kitchen_cabinet_colored_half", { palette = "unifieddyes_palette_colorwallmounted.png", selection_box = kitchen_cabinet_half_box, node_box = kitchen_cabinet_half_box, - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Kitchen Cabinet"), inventory = { size=12, @@ -363,12 +385,14 @@ homedecor.register("kitchen_cabinet_colorable_with_sink", { .."{homedecor_kitchen_sink_top.png" .."{homedecor_kitchen_cabinet_front.png" .."{"..ic_cabinet_sides, - paramtype2 = "wallmounted", + paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_sink", place_param2 = 0, - groups = { snappy = 3, ud_param2_colorable = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Under-sink cabinet"), inventory = { size=16, @@ -412,8 +436,10 @@ homedecor.register("kitchen_cabinet_colored_with_sink", { .."{"..ic_cabinet_sides_colored, paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1, dig_tree=1 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Under-sink cabinet"), inventory = { size=16, @@ -447,7 +473,7 @@ homedecor.register("copper_pans", { mesh = "homedecor_copper_pans.obj", tiles = { "homedecor_polished_copper.png" }, inventory_image = "homedecor_copper_pans_inv.png", - groups = { snappy=3 }, + groups = { snappy=3, dig_stone=1 }, selection_box = cp_cbox, walkable = false, on_place = minetest.rotate_node @@ -463,7 +489,7 @@ homedecor.register("kitchen_faucet", { tiles = { "homedecor_generic_metal_bright.png" }, inventory_image = "homedecor_kitchen_faucet_inv.png", description = S("Kitchen Faucet"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone=1}, selection_box = kf_cbox, walkable = false, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, @@ -488,11 +514,11 @@ homedecor.register("paper_towel", { mesh = "homedecor_paper_towel.obj", tiles = { "homedecor_generic_quilted_paper.png", - "default_wood.png" + wood_tex }, inventory_image = "homedecor_paper_towel_inv.png", description = S("Paper towels"), - groups = { snappy=3 }, + groups = { snappy=3, dig_tree=1 }, walkable = false, selection_box = { type = "fixed", @@ -506,18 +532,18 @@ homedecor.register("paper_towel", { minetest.register_craft({ output = "homedecor:oven_steel", recipe = { - {"basic_materials:heating_element", "default:steel_ingot", "basic_materials:heating_element", }, - {"default:steel_ingot", "moreblocks:iron_glass", "default:steel_ingot", }, - {"default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot", }, + {"basic_materials:heating_element", homedecor.materials.steel_ingot, "basic_materials:heating_element", }, + {homedecor.materials.steel_ingot, "moreblocks:iron_glass", homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, "basic_materials:heating_element", homedecor.materials.steel_ingot, }, } }) minetest.register_craft({ output = "homedecor:oven_steel", recipe = { - {"basic_materials:heating_element", "default:steel_ingot", "basic_materials:heating_element", }, - {"default:steel_ingot", "default:glass", "default:steel_ingot", }, - {"default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot", }, + {"basic_materials:heating_element", homedecor.materials.steel_ingot, "basic_materials:heating_element", }, + {homedecor.materials.steel_ingot, homedecor.materials.glass_block, homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, "basic_materials:heating_element", homedecor.materials.steel_ingot, }, } }) @@ -526,35 +552,35 @@ minetest.register_craft({ output = "homedecor:oven", recipe = { "homedecor:oven_steel", - "dye:white", - "dye:white", + homedecor.materials.dye_white, + homedecor.materials.dye_white, } }) minetest.register_craft({ output = "homedecor:microwave_oven 2", recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot", }, - {"default:steel_ingot", "moreblocks:iron_glass", "basic_materials:ic", }, - {"default:steel_ingot", "default:copper_ingot", "basic_materials:energy_crystal_simple", }, + {homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, "moreblocks:iron_glass", "basic_materials:ic", }, + {homedecor.materials.steel_ingot, homedecor.materials.copper_ingot, "basic_materials:energy_crystal_simple", }, } }) minetest.register_craft({ output = "homedecor:microwave_oven 2", recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot", }, - {"default:steel_ingot", "default:glass", "basic_materials:ic", }, - {"default:steel_ingot", "default:copper_ingot", "basic_materials:energy_crystal_simple", }, + {homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, homedecor.materials.glass_block, "basic_materials:ic", }, + {homedecor.materials.steel_ingot, homedecor.materials.copper_ingot, "basic_materials:energy_crystal_simple", }, } }) minetest.register_craft({ output = "homedecor:refrigerator_steel", recipe = { - {"default:steel_ingot", "homedecor:glowlight_small_cube", "default:steel_ingot", }, - {"default:steel_ingot", "default:copperblock", "default:steel_ingot", }, - {"default:steel_ingot", "default:clay", "default:steel_ingot", }, + {homedecor.materials.steel_ingot, "homedecor:glowlight_small_cube", homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, homedecor.materials.copper_ingot, homedecor.materials.steel_ingot, }, + {homedecor.materials.steel_ingot, homedecor.materials.clay_lump, homedecor.materials.steel_ingot, }, } }) @@ -563,9 +589,9 @@ minetest.register_craft({ output = "homedecor:refrigerator_white", recipe = { "homedecor:refrigerator_steel", - "dye:white", - "dye:white", - "dye:white", + homedecor.materials.dye_white, + homedecor.materials.dye_white, + homedecor.materials.dye_white, } }) @@ -579,44 +605,56 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "homedecor:kitchen_cabinet_colorable_steel", - recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"", "homedecor:kitchen_cabinet_colorable", ""}, + output = "homedecor:kitchen_cabinet_colorable_with_drawers", + recipe = { + {"homedecor:kitchen_cabinet_colorable", }, } }) -minetest.register_craft({ - output = "homedecor:kitchen_cabinet_colorable_steel", - recipe = { + +local cabinet_types = { "homedecor:kitchen_cabinet_colorable", "homedecor:kitchen_cabinet_colorable_with_drawers" } + +for _, cabinet in ipairs(cabinet_types) do + minetest.register_craft({ + output = cabinet.."_steel", + recipe = { + {homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, homedecor.materials.steel_ingot}, + {"", cabinet, ""}, + } + }) + + minetest.register_craft({ + output = cabinet.."_steel", + recipe = { {"moreblocks:slab_steelblock_1"}, - { "homedecor:kitchen_cabinet_colorable" }, - } -}) + {cabinet}, + } + }) -minetest.register_craft({ - output = "homedecor:kitchen_cabinet_colorable_marble", - recipe = { + minetest.register_craft({ + output = cabinet.."_marble", + recipe = { {"building_blocks:slab_marble"}, - {"homedecor:kitchen_cabinet_colorable"}, - } -}) + {cabinet}, + } + }) -minetest.register_craft({ - output = "homedecor:kitchen_cabinet_colorable_marble", - recipe = { + minetest.register_craft({ + output = cabinet.."_marble", + recipe = { {"technic:slab_marble_1"}, - {"homedecor:kitchen_cabinet_colorable"}, - } -}) + {cabinet}, + } + }) -minetest.register_craft({ - output = "homedecor:kitchen_cabinet_colorable_granite", - recipe = { + minetest.register_craft({ + output = cabinet.."_granite", + recipe = { {"technic:slab_granite_1"}, - {"homedecor:kitchen_cabinet_colorable"}, - } -}) + {cabinet}, + } + }) +end minetest.register_craft({ type = "shapeless", @@ -627,8 +665,8 @@ minetest.register_craft({ minetest.register_craft({ output = "homedecor:kitchen_cabinet_colorable_with_sink", recipe = { - {"group:wood", "default:steel_ingot", "group:wood", }, - {"group:wood", "default:steel_ingot", "group:wood", }, + {"group:wood", homedecor.materials.steel_ingot, "group:wood", }, + {"group:wood", homedecor.materials.steel_ingot, "group:wood", }, {"group:wood", "group:stick", "group:wood", }, } }) @@ -636,18 +674,18 @@ minetest.register_craft({ minetest.register_craft( { output = "homedecor:dishwasher", recipe = { - { "basic_materials:ic", "building_blocks:slab_grate_1", "default:steel_ingot", }, - { "default:steel_ingot", "homedecor:shower_head", "basic_materials:motor" }, - { "default:steel_ingot", "basic_materials:heating_element", "bucket:bucket_water" } + { "basic_materials:ic", "building_blocks:slab_grate_1", homedecor.materials.steel_ingot, }, + { homedecor.materials.steel_ingot, "homedecor:shower_head", "basic_materials:motor" }, + { homedecor.materials.steel_ingot, "basic_materials:heating_element", homedecor.materials.water_bucket } }, }) minetest.register_craft( { output = "homedecor:dishwasher", recipe = { - { "basic_materials:ic", "homedecor:fence_chainlink", "default:steel_ingot", }, - { "default:steel_ingot", "homedecor:shower_head", "basic_materials:motor" }, - { "default:steel_ingot", "basic_materials:heating_element", "bucket:bucket_water" } + { "basic_materials:ic", "homedecor:fence_chainlink", homedecor.materials.steel_ingot, }, + { homedecor.materials.steel_ingot, "homedecor:shower_head", "basic_materials:motor" }, + { homedecor.materials.steel_ingot, "basic_materials:heating_element", homedecor.materials.water_bucket } }, }) @@ -678,7 +716,7 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:dishwasher_steel", recipe = { - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { homedecor.materials.steel_ingot, homedecor.materials.steel_ingot, homedecor.materials.steel_ingot }, { "", "homedecor:dishwasher", "" }, }, }) @@ -718,8 +756,8 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:kitchen_faucet", recipe = { - { "", "default:steel_ingot" }, - { "default:steel_ingot", "" }, + { "", homedecor.materials.steel_ingot }, + { homedecor.materials.steel_ingot, "" }, { "homedecor:taps", "" } }, }) @@ -727,8 +765,8 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:kitchen_faucet", recipe = { - { "default:steel_ingot","" }, - { "", "default:steel_ingot" }, + { homedecor.materials.steel_ingot,"" }, + { "", homedecor.materials.steel_ingot }, { "", "homedecor:taps" } }, }) @@ -753,8 +791,8 @@ minetest.register_craft({ output = "homedecor:copper_pans", recipe = { { "basic_materials:copper_strip","","basic_materials:copper_strip" }, - { "default:copper_ingot","","default:copper_ingot" }, - { "default:copper_ingot","","default:copper_ingot" } + { homedecor.materials.copper_ingot,"",homedecor.materials.copper_ingot }, + { homedecor.materials.copper_ingot,"",homedecor.materials.copper_ingot } }, }) diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.de.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.de.tr index d8f3a518..6aea0892 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.de.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.de.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Kupferpfannen -Dishwasher=Spülmachine -Dishwasher (@1)=Spülmaschine (@1) -Half-height Kitchen Cabinet (on ceiling)=Halbhoher Küchenschrank (oben) -Kitchen Cabinet=Küchenschrank -Kitchen Cabinet (@1 top)=Küchenschrank (@1platte) -Kitchen Cabinet with sink=Küchenschrank mit Spüle -Kitchen Faucet=Küchenwasserhahn -Microwave Oven=Mikrowelle +Refrigerator (stainless steel)=Kühlschrank (Edelstahl) +Refrigerator=Kühlschrank Oven=Backofen Oven (stainless steel)=Backofen (Edelstahl) -Paper towels=Küchenpapier -Refrigerator=Kühlschrank -Refrigerator (stainless steel)=Kühlschrank (Edelstahl) -Under-sink cabinet=Waschbeckenunterschrank +Microwave Oven=Mikrowelle +Dishwasher=Spülmaschine granite=Granit marble=Marmor steel=Stahl wood=Holz +Dishwasher (@1)=Spülmaschine (@1) +Kitchen Cabinet=Küchenschrank +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Küchenschrank (@1platte) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Halbhoher Küchenschrank (oben) +Kitchen Cabinet with sink=Küchenschrank mit Spüle +Under-sink cabinet=Waschbeckenunterschrank +Copper pans=Kupferpfannen +Kitchen Faucet=Küchenwasserhahn +Paper towels=Küchenpapier diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.es.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.es.tr index 47848e9c..fee849f8 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.es.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.es.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Sartenes de cobre -Dishwasher=Lavavajillas -Dishwasher (@1)=Lavavajillas (@1) -Half-height Kitchen Cabinet (on ceiling)=Gabinete de cocina de media altura (en techo) -Kitchen Cabinet=Gabinete de cocina -Kitchen Cabinet (@1 top)=Gabinete de cocina (mesada de @1) -Kitchen Cabinet with sink=Gabinete de cocina con lavabo -Kitchen Faucet=Grifo de cocina -Microwave Oven=Horno microondas +Refrigerator (stainless steel)=Refrigerador (acero inoxidable) +Refrigerator=Refrigerador Oven=Horno Oven (stainless steel)=Horno (acero inoxidable) -Paper towels=Toallas de papel -Refrigerator=Refrigerador -Refrigerator (stainless steel)=Refrigerador (acero inoxidable) -Under-sink cabinet=Gabinete bajo lavabo +Microwave Oven=Horno microondas +Dishwasher=Lavavajillas granite=granito marble=mármol steel=acero wood=madera +Dishwasher (@1)=Lavavajillas (@1) +Kitchen Cabinet=Gabinete de cocina +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Gabinete de cocina (mesada de @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Gabinete de cocina de media altura (en techo) +Kitchen Cabinet with sink=Gabinete de cocina con lavabo +Under-sink cabinet=Gabinete bajo lavabo +Copper pans=Sartenes de cobre +Kitchen Faucet=Grifo de cocina +Paper towels=Toallas de papel diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.fr.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.fr.tr index 914cb948..1bd576dd 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.fr.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.fr.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Poêles en cuivre -Dishwasher=Lave-vaisselle -Dishwasher (@1)=Lave-vaisselle (@1) -Half-height Kitchen Cabinet (on ceiling)=Meuble de cuisine réduit en hauteur (sur le plafond) -Kitchen Cabinet=Meuble de cuisine -Kitchen Cabinet (@1 top)=Meuble de cuisine (haut @1) -Kitchen Cabinet with sink=Meuble de cuisine avec lavabo -Kitchen Faucet=Robinet de cuisine -Microwave Oven=Four Micro-ondes +Refrigerator (stainless steel)=Réfrigérateur (acier inox) +Refrigerator=Réfrigérateur Oven=Four Oven (stainless steel)=Four (acier inox) -Paper towels=Essuie-tout -Refrigerator=Réfrigérateur -Refrigerator (stainless steel)=Réfrigérateur (acier inox) -Under-sink cabinet=Meuble sous évier +Microwave Oven=Four Micro-ondes +Dishwasher=Lave-vaisselle granite=granit marble=marbre steel=acier wood=bois +Dishwasher (@1)=Lave-vaisselle (@1) +Kitchen Cabinet=Meuble de cuisine +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Meuble de cuisine (haut @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Meuble de cuisine réduit en hauteur (sur le plafond) +Kitchen Cabinet with sink=Meuble de cuisine avec lavabo +Under-sink cabinet=Meuble sous évier +Copper pans=Poêles en cuivre +Kitchen Faucet=Robinet de cuisine +Paper towels=Essuie-tout diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.it.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.it.tr index ed609110..d423cbf7 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.it.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.it.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans= -Dishwasher= -Dishwasher (@1)= -Half-height Kitchen Cabinet (on ceiling)=Armadietto della cucina di altezza dimezzata (sul soffitto) -Kitchen Cabinet=Armadietto della cucina -Kitchen Cabinet (@1 top)=Armadietto della cucina -Kitchen Cabinet with sink=Armadietto della cucina con il lavandino -Kitchen Faucet=Armadietto della cucina -Microwave Oven=Forno a microonde +Refrigerator (stainless steel)=Frigorifero +Refrigerator=Frigorifero Oven=Forno Oven (stainless steel)= -Paper towels= -Refrigerator=Frigorifero -Refrigerator (stainless steel)=Frigorifero -Under-sink cabinet=Armadietto sotto il lavandino +Microwave Oven=Forno a microonde +Dishwasher= granite= marble= steel= wood= +Dishwasher (@1)= +Kitchen Cabinet=Armadietto della cucina +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Armadietto della cucina (superiore in @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Armadietto della cucina di altezza dimezzata (sul soffitto) +Kitchen Cabinet with sink=Armadietto della cucina con il lavandino +Under-sink cabinet=Armadietto sotto il lavandino +Copper pans= +Kitchen Faucet=Armadietto della cucina +Paper towels= diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ms.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ms.tr index 3515d1ae..23c6bc60 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ms.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ms.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Kuali Leper Tembaga -Dishwasher=Mesin Basuh Pinggan Mangkuk -Dishwasher (@1)=Mesin Basuh Pinggan Mangkuk (@1) -Half-height Kitchen Cabinet (on ceiling)=Kabinet Dapur Separuh (dekat siling) -Kitchen Cabinet=Kabinet Dapur -Kitchen Cabinet (@1 top)=Kabinet Dapur (Beralaskan @1) -Kitchen Cabinet with sink=Kabinet Dapur dengan Sinki -Kitchen Faucet=Kepala Paip Dapur -Microwave Oven=Ketuhar Gelombang Mikro +Refrigerator (stainless steel)=Peti Sejuk (Keluli Tahan Karat) +Refrigerator=Peti Sejuk Oven=Ketuhar Oven (stainless steel)=Ketuhar (Keluli Tahan Karat) -Paper towels=Tuala Dapur Pakai Buang -Refrigerator=Peti Sejuk -Refrigerator (stainless steel)=Peti Sejuk (Keluli Tahan Karat) -Under-sink cabinet=Kabinet Bawah Sinki +Microwave Oven=Ketuhar Gelombang Mikro +Dishwasher=Mesin Basuh Pinggan Mangkuk granite=Granit marble=Marmar steel=Keluli wood=Kayu +Dishwasher (@1)=Mesin Basuh Pinggan Mangkuk (@1) +Kitchen Cabinet=Kabinet Dapur +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Kabinet Dapur (Beralaskan @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Kabinet Dapur Separuh (dekat siling) +Kitchen Cabinet with sink=Kabinet Dapur dengan Sinki +Under-sink cabinet=Kabinet Bawah Sinki +Copper pans=Kuali Leper Tembaga +Kitchen Faucet=Kepala Paip Dapur +Paper towels=Tuala Dapur Pakai Buang diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt.tr index 97cc1c0c..177fc77c 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Panelas de cobre -Dishwasher=Lava Louças -Dishwasher (@1)=Lava Louças (@1) -Half-height Kitchen Cabinet (on ceiling)=Armário Superior de Cozinha (no teto) -Kitchen Cabinet=Armário de Cozinha -Kitchen Cabinet (@1 top)=Armário de Cozinha (tampo de @1) -Kitchen Cabinet with sink=Armário de Cozinha com Pia -Kitchen Faucet=Armário de Cozinha -Microwave Oven=Forno Microondas +Refrigerator (stainless steel)=Refrigerador (aço inoxidável) +Refrigerator=Refrigerador Oven=Forno Oven (stainless steel)=Forno (aço inoxidável) -Paper towels=Papel toalha -Refrigerator=Refrigerador -Refrigerator (stainless steel)=Refrigerador (aço inoxidável) -Under-sink cabinet=Armário sob a Pia +Microwave Oven=Forno Microondas +Dishwasher=Lava Louças granite=granito marble=mármore steel=aço wood=madeira +Dishwasher (@1)=Lava Louças (@1) +Kitchen Cabinet=Armário de Cozinha +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Armário de Cozinha (tampo de @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Armário Superior de Cozinha (no teto) +Kitchen Cabinet with sink=Armário de Cozinha com Pia +Under-sink cabinet=Armário sob a Pia +Copper pans=Panelas de cobre +Kitchen Faucet=Armário de Cozinha +Paper towels=Papel toalha diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt_BR.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt_BR.tr index 97cc1c0c..177fc77c 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.pt_BR.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Panelas de cobre -Dishwasher=Lava Louças -Dishwasher (@1)=Lava Louças (@1) -Half-height Kitchen Cabinet (on ceiling)=Armário Superior de Cozinha (no teto) -Kitchen Cabinet=Armário de Cozinha -Kitchen Cabinet (@1 top)=Armário de Cozinha (tampo de @1) -Kitchen Cabinet with sink=Armário de Cozinha com Pia -Kitchen Faucet=Armário de Cozinha -Microwave Oven=Forno Microondas +Refrigerator (stainless steel)=Refrigerador (aço inoxidável) +Refrigerator=Refrigerador Oven=Forno Oven (stainless steel)=Forno (aço inoxidável) -Paper towels=Papel toalha -Refrigerator=Refrigerador -Refrigerator (stainless steel)=Refrigerador (aço inoxidável) -Under-sink cabinet=Armário sob a Pia +Microwave Oven=Forno Microondas +Dishwasher=Lava Louças granite=granito marble=mármore steel=aço wood=madeira +Dishwasher (@1)=Lava Louças (@1) +Kitchen Cabinet=Armário de Cozinha +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Armário de Cozinha (tampo de @1) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Armário Superior de Cozinha (no teto) +Kitchen Cabinet with sink=Armário de Cozinha com Pia +Under-sink cabinet=Armário sob a Pia +Copper pans=Panelas de cobre +Kitchen Faucet=Armário de Cozinha +Paper towels=Papel toalha diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ru.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ru.tr index 4ce5e33b..5ef791fa 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ru.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.ru.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=Медные кастрюли -Dishwasher=Посудомоечная машина -Dishwasher (@1)=Посудомоечная машина (@1) -Half-height Kitchen Cabinet (on ceiling)=Полуразмерный кухонный шкаф (потолочный) -Kitchen Cabinet=Кухонный шкаф -Kitchen Cabinet (@1 top)=Кухонный шкаф (@1 верх) -Kitchen Cabinet with sink=Кухонный шкаф с раковиной -Kitchen Faucet=Кухонный смеситель -Microwave Oven=Микроволновая печь +Refrigerator (stainless steel)=Холодильник (нержавеющая сталь) +Refrigerator=Холодильник Oven=Духовка Oven (stainless steel)=Духовка (нержавеющая сталь) -Paper towels=Бумажные полотенца -Refrigerator=Холодильник -Refrigerator (stainless steel)=Холодильник (нержавеющая сталь) -Under-sink cabinet=Шкаф для раковины +Microwave Oven=Микроволновая печь +Dishwasher=Посудомоечная машина granite=гранит marble=мрамор steel=сталь wood=дерево +Dishwasher (@1)=Посудомоечная машина (@1) +Kitchen Cabinet=Кухонный шкаф +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=Кухонный шкаф (@1 верх) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=Полуразмерный кухонный шкаф (потолочный) +Kitchen Cabinet with sink=Кухонный шкаф с раковиной +Under-sink cabinet=Шкаф для раковины +Copper pans=Медные кастрюли +Kitchen Faucet=Кухонный смеситель +Paper towels=Бумажные полотенца diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.zh_CN.tr b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.zh_CN.tr index 5bcadd41..840a9dce 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/homedecor_kitchen.zh_CN.tr @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans=铜锅 -Dishwasher=洗碗机 -Dishwasher (@1)=洗碗机(@1) -Half-height Kitchen Cabinet (on ceiling)=半高厨柜(悬挂式) -Kitchen Cabinet=厨柜 -Kitchen Cabinet (@1 top)=厨柜(@1顶) -Kitchen Cabinet with sink=带水槽的橱柜 -Kitchen Faucet=厨房水龙头 -Microwave Oven=微波炉 +Refrigerator (stainless steel)=冰箱(不锈钢) +Refrigerator=冰箱 Oven=烤箱 Oven (stainless steel)=烤箱(不锈钢) -Paper towels=纸巾 -Refrigerator=冰箱 -Refrigerator (stainless steel)=冰箱(不锈钢) -Under-sink cabinet=水槽柜下 +Microwave Oven=微波炉 +Dishwasher=洗碗机 granite=花岗岩 marble=大理石 steel=钢 wood=木材 +Dishwasher (@1)=洗碗机(@1) +Kitchen Cabinet=厨柜 +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)=厨柜(@1顶) +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)=半高厨柜(悬挂式) +Kitchen Cabinet with sink=带水槽的橱柜 +Under-sink cabinet=水槽柜下 +Copper pans=铜锅 +Kitchen Faucet=厨房水龙头 +Paper towels=纸巾 diff --git a/mods/homedecor_modpack/homedecor_kitchen/locale/template.txt b/mods/homedecor_modpack/homedecor_kitchen/locale/template.txt index f3832b76..522e7484 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_kitchen/locale/template.txt @@ -1,24 +1,22 @@ # textdomain: homedecor_kitchen - - -### init.lua ### - -Copper pans= -Dishwasher= -Dishwasher (@1)= -Half-height Kitchen Cabinet (on ceiling)= -Kitchen Cabinet= -Kitchen Cabinet (@1 top)= -Kitchen Cabinet with sink= -Kitchen Faucet= -Microwave Oven= +Refrigerator (stainless steel)= +Refrigerator= Oven= Oven (stainless steel)= -Paper towels= -Refrigerator= -Refrigerator (stainless steel)= -Under-sink cabinet= +Microwave Oven= +Dishwasher= granite= marble= steel= wood= +Dishwasher (@1)= +Kitchen Cabinet= +Kitchen Cabinet with drawers= +Kitchen Cabinet (@1 top)= +Kitchen Cabinet with drawers (@1 top)= +Half-height Kitchen Cabinet (on ceiling)= +Kitchen Cabinet with sink= +Under-sink cabinet= +Copper pans= +Kitchen Faucet= +Paper towels= diff --git a/mods/homedecor_modpack/homedecor_kitchen/mod.conf b/mods/homedecor_modpack/homedecor_kitchen/mod.conf index 22f97b2f..8775ca19 100644 --- a/mods/homedecor_modpack/homedecor_kitchen/mod.conf +++ b/mods/homedecor_modpack/homedecor_kitchen/mod.conf @@ -1,4 +1,4 @@ name = homedecor_kitchen description = Homedecor mod: kitchen -depends = homedecor_common, default, basic_materials, dye -optional_depends = moreblocks, building_blocks, technic, bucket, screwdriver +depends = homedecor_common +optional_depends = moreblocks, building_blocks, technic, bucket, screwdriver, default, basic_materials, dye, unifieddyes diff --git a/mods/homedecor_modpack/homedecor_laundry/.luacheckrc b/mods/homedecor_modpack/homedecor_laundry/.luacheckrc deleted file mode 100644 index 744a1127..00000000 --- a/mods/homedecor_modpack/homedecor_laundry/.luacheckrc +++ /dev/null @@ -1,19 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_laundry/init.lua b/mods/homedecor_modpack/homedecor_laundry/init.lua index 516331f7..96508220 100644 --- a/mods/homedecor_modpack/homedecor_laundry/init.lua +++ b/mods/homedecor_modpack/homedecor_laundry/init.lua @@ -19,7 +19,23 @@ homedecor.register("washing_machine", { } }, selection_box = { type = "regular" }, - groups = { snappy = 3 }, + groups = { snappy = 3, dig_stone=3 }, + crafts = { + { + recipe = { + { "steel_ingot", "steel_ingot", "basic_materials:ic" }, + { "steel_ingot", "water_bucket", "steel_ingot" }, + { "steel_ingot", "basic_materials:motor", "steel_ingot" } + }, + }, + { + recipe = { + { "steel_ingot", "steel_ingot", "basic_materials:ic" }, + { "steel_ingot", "water_bucket", "steel_ingot" }, + { "steel_ingot", "basic_materials:motor", "steel_ingot" } + }, + } + } }) homedecor.register("dryer", { @@ -40,7 +56,23 @@ homedecor.register("dryer", { } }, selection_box = { type = "regular" }, - groups = { snappy = 3 }, + groups = { snappy = 3, dig_stone=3 }, + crafts = { + { + recipe = { + { "steel_ingot", "steel_ingot", "basic_materials:ic" }, + { "steel_ingot", "empty_bucket", "basic_materials:motor" }, + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" } + }, + }, + { + recipe = { + { "steel_ingot", "steel_ingot", "basic_materials:ic" }, + { "steel_ingot", "empty_bucket", "basic_materials:motor" }, + { "steel_ingot", "basic_materials:heating_element", "steel_ingot" } + }, + } + } }) local ib_cbox = { @@ -48,66 +80,26 @@ local ib_cbox = { fixed = { -6/16, -8/16, -4/16, 17/16, 4/16, 4/16 } } +local wool_tex = homedecor.textures.wool.grey + homedecor.register("ironing_board", { description = S("Ironing board"), mesh = "homedecor_ironing_board.obj", tiles = { - "wool_grey.png", + wool_tex, { name = "homedecor_generic_metal.png", color = homedecor.color_med_grey }, }, expand = {right = "placeholder"}, - groups = { snappy = 3 }, + groups = { snappy = 3, dig_stone=3 }, selection_box = ib_cbox, - collision_box = ib_cbox -}) - --- crafting - - --- laundry stuff - -minetest.register_craft( { - output = "homedecor:washing_machine", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "basic_materials:ic" }, - { "default:steel_ingot", "bucket:bucket_water", "default:steel_ingot" }, - { "default:steel_ingot", "basic_materials:motor", "default:steel_ingot" } - }, -}) - -minetest.register_craft( { - output = "homedecor:washing_machine", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "basic_materials:ic" }, - { "default:steel_ingot", "bucket:bucket_water", "default:steel_ingot" }, - { "default:steel_ingot", "basic_materials:motor", "default:steel_ingot" } - }, -}) - -minetest.register_craft( { - output = "homedecor:dryer", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "basic_materials:ic" }, - { "default:steel_ingot", "bucket:bucket_empty", "basic_materials:motor" }, - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" } - }, -}) - -minetest.register_craft( { - output = "homedecor:dryer", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "basic_materials:ic" }, - { "default:steel_ingot", "bucket:bucket_empty", "basic_materials:motor" }, - { "default:steel_ingot", "basic_materials:heating_element", "default:steel_ingot" } - }, -}) - -minetest.register_craft( { - output = "homedecor:ironing_board", - recipe = { - { "wool:grey", "wool:grey", "wool:grey"}, - { "", "default:steel_ingot", "" }, - { "default:steel_ingot", "", "default:steel_ingot" } - }, -}) - + collision_box = ib_cbox, + crafts = { + { + recipe = { + { "wool_grey", "wool_grey", "wool_grey"}, + { "", "steel_ingot", "" }, + { "steel_ingot", "", "steel_ingot" } + }, + } + } +}) \ No newline at end of file diff --git a/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.de.tr b/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.de.tr index f9455642..9f03973b 100644 --- a/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.de.tr +++ b/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_laundry - - -### init.lua ### - -Ironing board=Bügelbrett -Tumble dryer=Wäschetrockner Washing Machine=Waschmaschine +Tumble dryer=Wäschetrockner +Ironing board=Bügelbrett diff --git a/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.fr.tr b/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.fr.tr index eafcb29f..35976d87 100644 --- a/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.fr.tr +++ b/mods/homedecor_modpack/homedecor_laundry/locale/homedecor_laundry.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_laundry - - -### init.lua ### - -Ironing board=Planche à repasser -Tumble dryer=Sèche-linge Washing Machine=Machine à laver +Tumble dryer=Sèche-linge +Ironing board=Planche à repasser diff --git a/mods/homedecor_modpack/homedecor_laundry/locale/template.txt b/mods/homedecor_modpack/homedecor_laundry/locale/template.txt index 37047861..8a727d45 100644 --- a/mods/homedecor_modpack/homedecor_laundry/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_laundry/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_laundry - - -### init.lua ### - -Ironing board= -Tumble dryer= Washing Machine= +Tumble dryer= +Ironing board= diff --git a/mods/homedecor_modpack/homedecor_laundry/mod.conf b/mods/homedecor_modpack/homedecor_laundry/mod.conf index b35c5e1f..fc58b248 100644 --- a/mods/homedecor_modpack/homedecor_laundry/mod.conf +++ b/mods/homedecor_modpack/homedecor_laundry/mod.conf @@ -1,4 +1,4 @@ name = homedecor_laundry description = Homedecor mod: laundry -depends = homedecor_common, default, basic_materials +depends = homedecor_common optional_depends = bucket diff --git a/mods/homedecor_modpack/homedecor_lighting/.luacheckrc b/mods/homedecor_modpack/homedecor_lighting/.luacheckrc deleted file mode 100644 index 383f28f4..00000000 --- a/mods/homedecor_modpack/homedecor_lighting/.luacheckrc +++ /dev/null @@ -1,23 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "mesecon", - "unifieddyes", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_lighting/init.lua b/mods/homedecor_modpack/homedecor_lighting/init.lua index 6d7ba80f..adcc3559 100644 --- a/mods/homedecor_modpack/homedecor_lighting/init.lua +++ b/mods/homedecor_modpack/homedecor_lighting/init.lua @@ -241,7 +241,7 @@ for brightness_level = 0, 14 do } overlay = { { name = "homedecor_glowlight_top_glare.png", color = "white"}, - "", + { name = "homedecor_glowlight_top_glare.png", color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, @@ -263,7 +263,7 @@ for brightness_level = 0, 14 do description = S("Thick Glowlight"), tiles = tiles, overlay_tiles = overlay, - use_texture_alpha = true, + use_texture_alpha = "blend", drawtype = "nodebox", paramtype = "light", paramtype2 = "colorwallmounted", @@ -275,9 +275,13 @@ for brightness_level = 0, 14 do wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 } }, node_box = glowlight_nodebox.half, - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici }, + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici, dig_glass=1, axey=5 }, + is_ground_content = false, + _mcl_hardness=1.6, light_source = brightness_level, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) end, @@ -307,7 +311,7 @@ for brightness_level = 0, 14 do } overlay = { { name = "homedecor_glowlight_top_glare.png", color = "white"}, - "", + { name = "homedecor_glowlight_top_glare.png", color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, @@ -329,7 +333,7 @@ for brightness_level = 0, 14 do description = S("Thin Glowlight"), tiles = tiles, overlay_tiles = overlay, - use_texture_alpha = true, + use_texture_alpha = "blend", drawtype = "nodebox", paramtype = "light", paramtype2 = "colorwallmounted", @@ -341,9 +345,13 @@ for brightness_level = 0, 14 do wall_side = { -0.5, -0.5, -0.5, -0.25, 0.5, 0.5 } }, node_box = glowlight_nodebox.quarter, - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici }, + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici, dig_glass=1, axey=5 }, + is_ground_content = false, + _mcl_hardness=1.6, light_source = brightness_level, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) end, @@ -374,7 +382,7 @@ for brightness_level = 0, 14 do } overlay = { { name = "homedecor_glowlight_cube_top_glare.png", color = "white"}, - "", + { name = "homedecor_glowlight_cube_top_glare.png", color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, { name = sides_glare, color = "white"}, @@ -396,7 +404,7 @@ for brightness_level = 0, 14 do description = S("Small Glowlight Cube"), tiles = tiles, overlay_tiles = overlay, - use_texture_alpha = true, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "colorwallmounted", drawtype = "nodebox", @@ -408,9 +416,13 @@ for brightness_level = 0, 14 do wall_side = { -0.5, -0.25, -0.25, 0, 0.25, 0.25 } }, node_box = glowlight_nodebox.small_cube, - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici }, + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = nici, dig_glass=1, axey=5 }, + is_ground_content = false, + _mcl_hardness=1.6, light_source = brightness_level, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) end, @@ -440,19 +452,22 @@ for brightness_level = 0, 14 do lighttex = "homedecor_plasma_lamp_off.png" end + local gtex=homedecor.textures.metal.gold.block homedecor.register("plasma_lamp_"..brightness_level, { description = S("Plasma Lamp/Light"), drawtype = "mesh", mesh = "plasma_lamp.obj", tiles = { - "default_gold_block.png", + gtex, lighttex }, - use_texture_alpha = true, + use_texture_alpha = "blend", light_source = brightness_level, sunlight_propagates = true, groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_rightclick = homedecor_lighting.toggle_light, drop = { items = { @@ -473,10 +488,10 @@ for brightness_level = 0, 14 do description = S("Ground Lantern/Light"), mesh = "homedecor_ground_lantern.obj", tiles = { gen_ls_tex_yellow, "homedecor_generic_metal_wrought_iron.png" }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "homedecor_ground_lantern_inv.png", wield_image = "homedecor_ground_lantern_inv.png", - groups = {snappy=3, not_in_creative_inventory = nici}, + groups = {snappy=3, not_in_creative_inventory = nici, dig_glass=1}, light_source = brightness_level, selection_box = gl_cbox, walkable = false, @@ -500,10 +515,10 @@ for brightness_level = 0, 14 do description = S("Hanging Lantern/Light"), mesh = "homedecor_hanging_lantern.obj", tiles = { "homedecor_generic_metal_wrought_iron.png", gen_ls_tex_yellow }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "homedecor_hanging_lantern_inv.png", wield_image = "homedecor_hanging_lantern_inv.png", - groups = {snappy=3, not_in_creative_inventory = nici}, + groups = {snappy=3, not_in_creative_inventory = nici, dig_glass=1}, light_source = brightness_level, selection_box = hl_cbox, walkable = false, @@ -527,10 +542,10 @@ for brightness_level = 0, 14 do drawtype = "mesh", mesh = "homedecor_ceiling_lantern.obj", tiles = { gen_ls_tex_yellow, "homedecor_generic_metal_wrought_iron.png" }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "homedecor_ceiling_lantern_inv.png", description = S("Ceiling Lantern/Light"), - groups = {snappy=3, not_in_creative_inventory = nici}, + groups = {snappy=3, not_in_creative_inventory = nici, dig_glass=1}, light_source = brightness_level, selection_box = cl_cbox, walkable = false, @@ -549,9 +564,12 @@ for brightness_level = 0, 14 do homedecor.register("lattice_lantern_large_"..brightness_level, { description = S("Lattice lantern/Light (large)"), tiles = { gen_ls_tex_yellow.."^homedecor_lattice_lantern_large_overlay.png" }, - groups = { snappy = 3, not_in_creative_inventory = nici }, + use_texture_alpha = "clip", + groups = { snappy = 3, not_in_creative_inventory = nici, dig_glass=1 }, light_source = brightness_level, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_rightclick = homedecor_lighting.toggle_light, drop = { items = { @@ -590,9 +608,12 @@ for brightness_level = 0, 14 do type = "fixed", fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } }, - groups = { snappy = 3, not_in_creative_inventory = nici }, + use_texture_alpha = "clip", + groups = { snappy = 3, not_in_creative_inventory = nici, dig_glass=1 }, light_source = brightness_level, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_place = minetest.rotate_node, on_rightclick = homedecor_lighting.toggle_light, drop = { @@ -628,7 +649,7 @@ for brightness_level = 0, 14 do selection_box = dlamp_cbox, node_box = dlamp_cbox, walkable = false, - groups = {snappy=3, ud_param2_colorable = 1, not_in_creative_inventory = nici}, + groups = {snappy=3, ud_param2_colorable = 1, not_in_creative_inventory = nici, dig_glass=1}, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) end, @@ -659,7 +680,7 @@ for brightness_level = 0, 14 do }, inventory_image = "homedecor_ceiling_lamp_inv.png", light_source = brightness_level, - groups = {snappy=3, not_in_creative_inventory = nici}, + groups = {snappy=3, not_in_creative_inventory = nici, dig_glass=1}, walkable = false, on_rightclick = homedecor_lighting.toggle_light, drop = { @@ -682,7 +703,7 @@ for brightness_level = 0, 14 do fixed = { -0.25, -0.5, -0.25, 0.25, 1.5, 0.25 } } - local wool_brightened = "wool_grey.png^[colorize:#ffffff:"..(brightness_level * 15) + local wool_brightened=homedecor.textures.wool.grey .. "^[colorize:#ffffff:"..(brightness_level * 15) homedecor.register("table_lamp_"..brightness_level, { description = S("Table Lamp/Light"), @@ -700,7 +721,9 @@ for brightness_level = 0, 14 do walkable = false, light_source = brightness_level, selection_box = tlamp_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, groups = {cracky=2,oddly_breakable_by_hand=1, ud_param2_colorable = 1, not_in_creative_inventory=nici }, drop = { items = { @@ -731,7 +754,9 @@ for brightness_level = 0, 14 do light_source = brightness_level, groups = {cracky=2,oddly_breakable_by_hand=1, ud_param2_colorable = 1, not_in_creative_inventory=nici }, selection_box = slamp_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, --expand = { top="air" }, drop = { @@ -770,7 +795,7 @@ for _, light_brightn_name in ipairs({"off", "on"}) do local gen_ls_tex_yellow = "homedecor_generic_light_source_off.png" if onflag then gen_ls_tex_yellow = "homedecor_generic_light_source_yellow.png" end - local lighttex = "homedecor_blanktile.png" + local lighttex = "blank.png" if onflag then lighttex = { name = "homedecor_plasma_ball_streamers.png", @@ -792,11 +817,13 @@ for _, light_brightn_name in ipairs({"off", "on"}) do fixed = { -0.1875, -0.5, -0.1875, 0.1875, 0, 0.1875 } }, walkable = false, - use_texture_alpha = true, - light_source = onflag and (default.LIGHT_MAX - 5) or nil, + use_texture_alpha = "blend", + light_source = onflag and (minetest.LIGHT_MAX - 5) or nil, sunlight_propagates = true, groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_rightclick = homedecor_lighting.toggle_light, drop = { items = { @@ -843,8 +870,12 @@ for _, light_brightn_name in ipairs({"off", "on"}) do "homedecor:rope_light_on_floor_off", "group:mesecon_conductor_craftable" }, - groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici_m}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici_m, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, drop = { items = { {items = {"homedecor:rope_light_on_floor_"..di} }, @@ -889,8 +920,12 @@ for _, light_brightn_name in ipairs({"off", "on"}) do "homedecor:rope_light_on_ceiling_off", "group:mesecon_conductor_craftable" }, - groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici_m}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky=3, oddly_breakable_by_hand=3, not_in_creative_inventory = nici_m, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, drop = { items = { {items = {"homedecor:rope_light_on_ceiling_"..di}}, @@ -916,10 +951,10 @@ for _, light_brightn_name in ipairs({"off", "on"}) do gen_ls_tex_yellow, "homedecor_generic_metal_wrought_iron.png" }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "homedecor_wall_lamp_inv.png", - groups = {snappy=3, not_in_creative_inventory = nici}, - light_source = onflag and (default.LIGHT_MAX - 3) or nil, + groups = {snappy=3, not_in_creative_inventory = nici, dig_glass=1}, + light_source = onflag and (minetest.LIGHT_MAX - 3) or nil, selection_box = wl_cbox, walkable = false, drop = { @@ -954,8 +989,9 @@ homedecor.register("candle", { inventory_image = "homedecor_candle_inv.png", selection_box = tc_cbox, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-4, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-4, }) local c_cbox = { @@ -975,8 +1011,9 @@ homedecor.register("candle_thin", { inventory_image = "homedecor_candle_thin_inv.png", selection_box = c_cbox, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-4, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-4, }) local cs_cbox = { @@ -997,8 +1034,9 @@ homedecor.register("candlestick_wrought_iron", { inventory_image = "homedecor_candlestick_wrought_iron_inv.png", selection_box = cs_cbox, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-4, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-4, }) homedecor.register("candlestick_brass", { @@ -1012,8 +1050,9 @@ homedecor.register("candlestick_brass", { inventory_image = "homedecor_candlestick_brass_inv.png", selection_box = cs_cbox, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-4, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-4, }) homedecor.register("wall_sconce", { @@ -1031,8 +1070,9 @@ homedecor.register("wall_sconce", { fixed = { -0.1875, -0.25, 0.3125, 0.1875, 0.25, 0.5 } }, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-4, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-4, }) local ol_cbox = { @@ -1053,13 +1093,15 @@ homedecor.register("oil_lamp", { { name = "homedecor_generic_metal.png", color = 0xffa00000 }, "homedecor_oil_lamp_glass.png", }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "homedecor_oil_lamp_inv.png", selection_box = ol_cbox, walkable = false, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-3, - sounds = default.node_sound_glass_defaults(), + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-3, + _sound_def = { + key = "node_sound_glass_defaults", + }, }) homedecor.register("oil_lamp_tabletop", { @@ -1069,9 +1111,11 @@ homedecor.register("oil_lamp_tabletop", { inventory_image = "homedecor_oil_lamp_tabletop_inv.png", selection_box = ol_cbox, collision_box = ol_cbox, - groups = { snappy = 3 }, - light_source = default.LIGHT_MAX-3, - sounds = default.node_sound_glass_defaults(), + groups = { snappy = 3, dig_glass=1 }, + light_source = minetest.LIGHT_MAX-3, + _sound_def = { + key = "node_sound_glass_defaults", + }, }) local topchains_sbox = { @@ -1092,7 +1136,9 @@ minetest.register_node(":homedecor:chain_steel_top", { sunlight_propagates = true, paramtype = "light", inventory_image = "basic_materials_chain_steel_inv.png", - groups = {cracky=3}, + groups = {cracky=3, dig_glass=1, pickaxey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = topchains_sbox, }) @@ -1106,7 +1152,9 @@ minetest.register_node(":homedecor:chain_brass_top", { sunlight_propagates = true, paramtype = "light", inventory_image = "basic_materials_chain_brass_inv.png", - groups = {cracky=3}, + groups = {cracky=3, dig_glass=1, pickaxey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = topchains_sbox, }) @@ -1132,8 +1180,13 @@ minetest.register_node(":homedecor:chandelier_steel", { }, drawtype = "mesh", mesh = "homedecor_chandelier.obj", - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + use_texture_alpha = "clip", + groups = {cracky=3, dig_glass=1, pickaxey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) minetest.register_node(":homedecor:chandelier_brass", { @@ -1158,8 +1211,13 @@ minetest.register_node(":homedecor:chandelier_brass", { }, drawtype = "mesh", mesh = "homedecor_chandelier.obj", - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + use_texture_alpha = "clip", + groups = {cracky=3, dig_glass=1, pickaxey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) homedecor.register("torch_wall", { @@ -1186,7 +1244,8 @@ homedecor.register("torch_wall", { type = "fixed", fixed = { -0.15, -0.45, 0.15, 0.15,0.35, 0.5 }, }, - groups = {cracky=3}, + use_texture_alpha = "clip", + groups = {cracky=3, dig_glass=1}, }) -- table lamps and standing lamps @@ -1362,7 +1421,71 @@ minetest.register_lbm({ end }) +-- aliases +minetest.register_alias("chains:chain_top", "homedecor:chain_steel_top") +minetest.register_alias("chains:chain_top_brass", "homedecor:chain_brass_top") + +minetest.register_alias("chains:chandelier", "homedecor:chandelier_steel") +minetest.register_alias("chains:chandelier_steel", "homedecor:chandelier_steel") +minetest.register_alias("chains:chandelier_brass", "homedecor:chandelier_brass") + +minetest.register_alias("homedecor:glowlight_half", "homedecor:glowlight_half_14") +minetest.register_alias("homedecor:glowlight_quarter", "homedecor:glowlight_quarter_14") +minetest.register_alias("homedecor:glowlight_small_cube", "homedecor:glowlight_small_cube_14") +minetest.register_alias("homedecor:plasma_lamp", "homedecor:plasma_lamp_14") +minetest.register_alias("homedecor:ground_lantern", "homedecor:ground_lantern_14") +minetest.register_alias("homedecor:hanging_lantern", "homedecor:hanging_lantern_14") +minetest.register_alias("homedecor:ceiling_lantern", "homedecor:ceiling_lantern_14") +minetest.register_alias("homedecor:lattice_lantern_large", "homedecor:lattice_lantern_large_14") +minetest.register_alias("homedecor:lattice_lantern_small", "homedecor:lattice_lantern_small_14") +minetest.register_alias("homedecor:desk_lamp", "homedecor:desk_lamp_14") +minetest.register_alias("homedecor:ceiling_lamp", "homedecor:ceiling_lamp_14") +minetest.register_alias("homedecor:table_lamp", "homedecor:table_lamp_14") +minetest.register_alias("homedecor:standing_lamp", "homedecor:standing_lamp_14") +minetest.register_alias("3dforniture:table_lamp", "homedecor:table_lamp_14") + +minetest.register_alias("3dforniture:torch_wall", "homedecor:torch_wall") +minetest.register_alias("torch_wall", "homedecor:torch_wall") + +minetest.register_alias("homedecor:plasma_ball", "homedecor:plasma_ball_on") +minetest.register_alias("homedecor:wall_lamp", "homedecor:wall_lamp_on") + +minetest.register_alias("homedecor:rope_light_on_floor_0", "homedecor:rope_light_on_floor_off") +minetest.register_alias("homedecor:rope_light_on_floor_14", "homedecor:rope_light_on_floor_on") + +minetest.register_alias("homedecor:rope_light_on_ceiling_0", "homedecor:rope_light_on_ceiling_off") +minetest.register_alias("homedecor:rope_light_on_ceiling_14", "homedecor:rope_light_on_ceiling_on") + +for name, level in pairs(word_to_bright) do + minetest.register_alias("homedecor:glowlight_half_"..name, "homedecor:glowlight_half_"..level) + minetest.register_alias("homedecor:glowlight_quarter_"..name, "homedecor:glowlight_quarter_"..level) + minetest.register_alias("homedecor:glowlight_small_cube_"..name, "homedecor:glowlight_small_cube_"..level) + minetest.register_alias("homedecor:rope_light_on_floor_"..name, "homedecor:rope_light_on_floor_"..level) + minetest.register_alias("homedecor:rope_light_on_ceiling_"..name, "homedecor:rope_light_on_ceiling_"..level) + minetest.register_alias("homedecor:plasma_lamp_"..name, "homedecor:plasma_lamp_"..level) + minetest.register_alias("homedecor:plasma_ball_"..name, "homedecor:plasma_ball_"..level) + minetest.register_alias("homedecor:ground_lantern_"..name, "homedecor:ground_lantern_"..level) + minetest.register_alias("homedecor:hanging_lantern_"..name, "homedecor:hanging_lantern_"..level) + minetest.register_alias("homedecor:ceiling_lantern_"..name, "homedecor:ceiling_lantern_"..level) + minetest.register_alias("homedecor:lattice_lantern_large_"..name, "homedecor:lattice_lantern_large_"..level) + minetest.register_alias("homedecor:lattice_lantern_small_"..name, "homedecor:lattice_lantern_small_"..level) + minetest.register_alias("homedecor:desk_lamp_"..name, "homedecor:desk_lamp_"..level) + minetest.register_alias("homedecor:ceiling_lamp_"..name, "homedecor:ceiling_lamp_"..level) + minetest.register_alias("homedecor:table_lamp_"..name, "homedecor:table_lamp_"..level) + minetest.register_alias("homedecor:standing_lamp_"..name, "homedecor:standing_lamp_"..level) + minetest.register_alias("3dforniture:table_lamp_"..name, "homedecor:table_lamp_"..level) +end + +if minetest.get_modpath("darkage") then + minetest.register_alias("homedecor:lattice_lantern_large", "darkage:lamp") + for n = 0, 14 do + minetest.register_alias("homedecor:lattice_lantern_large_"..n, "darkage:lamp") + end + for name, level in pairs(word_to_bright) do + minetest.register_alias("homedecor:lattice_lantern_large_"..name, "darkage:lamp") + end +end -- crafting @@ -1536,6 +1659,17 @@ end -- glowlights +unifieddyes.register_color_craft({ + output = "homedecor:glowlight_half", + palette = "wallmounted", + type = "shapeless", + neutral_node = "homedecor:glowlight_half", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE" + } +}) + minetest.register_craft({ output = "homedecor:glowlight_half 6", recipe = { @@ -1568,10 +1702,10 @@ minetest.register_craft({ }) unifieddyes.register_color_craft({ - output = "homedecor:glowlight_half", + output = "homedecor:glowlight_quarter", palette = "wallmounted", type = "shapeless", - neutral_node = "homedecor:glowlight_half", + neutral_node = "homedecor:glowlight_quarter", recipe = { "NEUTRAL_NODE", "MAIN_DYE" @@ -1586,10 +1720,10 @@ minetest.register_craft({ }) unifieddyes.register_color_craft({ - output = "homedecor:glowlight_quarter", + output = "homedecor:glowlight_small_cube", palette = "wallmounted", type = "shapeless", - neutral_node = "homedecor:glowlight_quarter", + neutral_node = "homedecor:glowlight_small_cube", recipe = { "NEUTRAL_NODE", "MAIN_DYE" @@ -1620,17 +1754,6 @@ minetest.register_craft({ } }) -unifieddyes.register_color_craft({ - output = "homedecor:glowlight_small_cube", - palette = "wallmounted", - type = "shapeless", - neutral_node = "homedecor:glowlight_small_cube", - recipe = { - "NEUTRAL_NODE", - "MAIN_DYE" - } -}) - ---- minetest.register_craft({ @@ -1651,16 +1774,6 @@ minetest.register_craft({ } }) - -minetest.register_craft({ - output = "homedecor:desk_lamp 2", - recipe = { - { "", "default:steel_ingot", "homedecor:glowlight_small_cube" }, - { "", "basic_materials:steel_strip", "" }, - { "basic_materials:plastic_sheet", "basic_materials:copper_wire", "basic_materials:plastic_sheet" }, - }, -}) - unifieddyes.register_color_craft({ output = "homedecor:desk_lamp", palette = "wallmounted", @@ -1672,6 +1785,15 @@ unifieddyes.register_color_craft({ } }) +minetest.register_craft({ + output = "homedecor:desk_lamp 2", + recipe = { + { "", "default:steel_ingot", "homedecor:glowlight_small_cube" }, + { "", "basic_materials:steel_strip", "" }, + { "basic_materials:plastic_sheet", "basic_materials:copper_wire", "basic_materials:plastic_sheet" }, + }, +}) + minetest.register_craft({ output = "homedecor:hanging_lantern 2", recipe = { @@ -1708,6 +1830,22 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "homedecor:rope_light_on_floor_off", + type= "shapeless", + recipe = { + "homedecor:rope_light_on_ceiling_off" + } +}) + +minetest.register_craft({ + output = "homedecor:rope_light_on_ceiling_off", + type= "shapeless", + recipe = { + homedecor.materials.steel_ingot, "homedecor:ceiling_lamp" + } +}) + minetest.register_craft({ output = "homedecor:ceiling_lamp", recipe = { @@ -1716,6 +1854,17 @@ minetest.register_craft({ }, }) +unifieddyes.register_color_craft({ + output = "homedecor:standing_lamp_hi", + palette = "extended", + type = "shapeless", + neutral_node = "homedecor:standing_lamp_hi", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE" + } +}) + minetest.register_craft({ output = "homedecor:standing_lamp_hi", recipe = { @@ -1726,10 +1875,10 @@ minetest.register_craft({ }) unifieddyes.register_color_craft({ - output = "homedecor:standing_lamp_hi", + output = "homedecor:table_lamp_hi", palette = "extended", type = "shapeless", - neutral_node = "homedecor:standing_lamp_hi", + neutral_node = "homedecor:table_lamp_hi", recipe = { "NEUTRAL_NODE", "MAIN_DYE" @@ -1778,18 +1927,6 @@ minetest.register_craft({ }, }) -unifieddyes.register_color_craft({ - output = "homedecor:table_lamp_hi", - palette = "extended", - type = "shapeless", - neutral_node = "homedecor:table_lamp_hi", - recipe = { - "NEUTRAL_NODE", - "MAIN_DYE" - } -}) - - minetest.register_craft({ output = "homedecor:torch_wall 10", recipe = { @@ -1797,96 +1934,3 @@ minetest.register_craft({ { "default:steel_ingot" }, }, }) --- aliases - -minetest.register_alias("chains:chain_top", "homedecor:chain_steel_top") -minetest.register_alias("chains:chain_top_brass", "homedecor:chain_brass_top") - -minetest.register_alias("chains:chandelier", "homedecor:chandelier_steel") -minetest.register_alias("chains:chandelier_steel", "homedecor:chandelier_steel") -minetest.register_alias("chains:chandelier_brass", "homedecor:chandelier_brass") - -minetest.register_alias("homedecor:glowlight_half", "homedecor:glowlight_half_14") -minetest.register_alias("homedecor:glowlight_half_max", "homedecor:glowlight_half_14") - -minetest.register_alias("homedecor:glowlight_quarter", "homedecor:glowlight_quarter_14") -minetest.register_alias("homedecor:glowlight_quarter_max", "homedecor:glowlight_quarter_14") - -minetest.register_alias("homedecor:glowlight_small_cube", "homedecor:glowlight_small_cube_14") -minetest.register_alias("homedecor:glowlight_small_cube_max", "homedecor:glowlight_small_cube_14") - -minetest.register_alias("homedecor:plasma_lamp", "homedecor:plasma_lamp_14") -minetest.register_alias("homedecor:plasma_lamp_max", "homedecor:plasma_lamp_14") - -minetest.register_alias("homedecor:ground_lantern", "homedecor:ground_lantern_14") -minetest.register_alias("homedecor:ground_lantern_max", "homedecor:ground_lantern_14") - -minetest.register_alias("homedecor:hanging_lantern", "homedecor:hanging_lantern_14") -minetest.register_alias("homedecor:hanging_lantern_max", "homedecor:hanging_lantern_14") - -minetest.register_alias("homedecor:ceiling_lantern", "homedecor:ceiling_lantern_14") -minetest.register_alias("homedecor:ceiling_lantern_max", "homedecor:ceiling_lantern_14") - -minetest.register_alias("homedecor:lattice_lantern_large", "homedecor:lattice_lantern_large_14") -minetest.register_alias("homedecor:lattice_lantern_large_max", "homedecor:lattice_lantern_large_14") - -minetest.register_alias("homedecor:lattice_lantern_small", "homedecor:lattice_lantern_small_14") -minetest.register_alias("homedecor:lattice_lantern_small_max", "homedecor:lattice_lantern_small_14") - -minetest.register_alias("homedecor:desk_lamp", "homedecor:desk_lamp_14") -minetest.register_alias("homedecor:desk_lamp_max", "homedecor:desk_lamp_14") - -minetest.register_alias("homedecor:ceiling_lamp", "homedecor:ceiling_lamp_14") -minetest.register_alias("homedecor:ceiling_lamp_max", "homedecor:ceiling_lamp_14") - -minetest.register_alias("homedecor:table_lamp", "homedecor:table_lamp_14") -minetest.register_alias("homedecor:table_lamp_max", "homedecor:table_lamp_14") - -minetest.register_alias("homedecor:standing_lamp", "homedecor:standing_lamp_14") -minetest.register_alias("homedecor:standing_lamp_max", "homedecor:standing_lamp_14") - -minetest.register_alias("3dforniture:table_lamp", "homedecor:table_lamp_14") -minetest.register_alias("3dforniture:table_lamp_max", "homedecor:table_lamp_14") - -minetest.register_alias("3dforniture:torch_wall", "homedecor:torch_wall") -minetest.register_alias("torch_wall", "homedecor:torch_wall") - -minetest.register_alias("homedecor:plasma_ball", "homedecor:plasma_ball_on") -minetest.register_alias("homedecor:wall_lamp", "homedecor:wall_lamp_on") - -minetest.register_alias("homedecor:rope_light_on_floor_0", "homedecor:rope_light_on_floor_off") -minetest.register_alias("homedecor:rope_light_on_floor_14", "homedecor:rope_light_on_floor_on") - -minetest.register_alias("homedecor:rope_light_on_ceiling_0", "homedecor:rope_light_on_ceiling_off") -minetest.register_alias("homedecor:rope_light_on_ceiling_14", "homedecor:rope_light_on_ceiling_on") - -for name, level in pairs(word_to_bright) do - minetest.register_alias("homedecor:glowlight_half_"..name, "homedecor:glowlight_half_"..level) - minetest.register_alias("homedecor:glowlight_quarter_"..name, "homedecor:glowlight_quarter_"..level) - minetest.register_alias("homedecor:glowlight_small_cube_"..name, "homedecor:glowlight_small_cube_"..level) - minetest.register_alias("homedecor:rope_light_on_floor_"..name, "homedecor:rope_light_on_floor_"..level) - minetest.register_alias("homedecor:rope_light_on_ceiling_"..name, "homedecor:rope_light_on_ceiling_"..level) - minetest.register_alias("homedecor:plasma_lamp_"..name, "homedecor:plasma_lamp_"..level) - minetest.register_alias("homedecor:plasma_ball_"..name, "homedecor:plasma_ball_"..level) - minetest.register_alias("homedecor:ground_lantern_"..name, "homedecor:ground_lantern_"..level) - minetest.register_alias("homedecor:hanging_lantern_"..name, "homedecor:hanging_lantern_"..level) - minetest.register_alias("homedecor:ceiling_lantern_"..name, "homedecor:ceiling_lantern_"..level) - minetest.register_alias("homedecor:lattice_lantern_large_"..name, "homedecor:lattice_lantern_large_"..level) - minetest.register_alias("homedecor:lattice_lantern_small_"..name, "homedecor:lattice_lantern_small_"..level) - minetest.register_alias("homedecor:desk_lamp_"..name, "homedecor:desk_lamp_"..level) - minetest.register_alias("homedecor:ceiling_lamp_"..name, "homedecor:ceiling_lamp_"..level) - minetest.register_alias("homedecor:table_lamp_"..name, "homedecor:table_lamp_"..level) - minetest.register_alias("homedecor:standing_lamp_"..name, "homedecor:standing_lamp_"..level) - minetest.register_alias("3dforniture:table_lamp_"..name, "homedecor:table_lamp_"..level) -end - -if minetest.get_modpath("darkage") then - minetest.register_alias("homedecor:lattice_lantern_large", "darkage:lamp") - for n = 0, 14 do - minetest.register_alias("homedecor:lattice_lantern_large_"..n, "darkage:lamp") - end - for name, level in pairs(word_to_bright) do - minetest.register_alias("homedecor:lattice_lantern_large_"..name, "darkage:lamp") - end -end - diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.de.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.de.tr index 99a4736b..50f498a1 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.de.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.de.tr @@ -1,34 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Kerzenhalter (Messing) -Candlestick (wrought iron)=Kerzenhalter (Schmiedeeisen) -Ceiling Lamp/Light=Deckenlampe -Ceiling Lantern/Light=Deckenlaterne -Chandelier (brass)=Kronleuchter (Messing) -Chandelier (steel)=Kronleuchter (Stahl) -Desk Lamp/Light=Schreibtischlampe +Thick Glowlight=Dickes Glimmlicht +Thin Glowlight=Dünnes Glimmlicht +Small Glowlight Cube=Kleiner Glimmlichtwürfel +Plasma Lamp/Light=Plasmalampe Ground Lantern/Light=Standlaterne Hanging Lantern/Light=hängende Laterne -Hanging chain (ceiling mount, brass)=Hängende Kette (Decke, Messing) -Hanging chain (ceiling mount, steel)=Hängende Kette (Decke, Eisen) +Ceiling Lantern/Light=Deckenlaterne Lattice lantern/Light (large)=Gitterlaterne (groß) Lattice lantern/light (small)=Gitterlaterne (klein) -Oil Lamp/Light (tabletop)=Tisch-Öllampe -Oil lamp/Light (hurricane)=Öl-Sturmlaterne -Plasma Ball/light=Plasmakugel -Plasma Lamp/Light=Plasmalampe -Rope lighting (on ceiling)=Lichtband an der Decke -Rope lighting (on floor)=Lichtband am Boden -Small Glowlight Cube=Kleiner Glimmlichtwürfel -Standing Lamp/Light=Stehlampe +Desk Lamp/Light=Schreibtischlampe +Ceiling Lamp/Light=Deckenlampe Table Lamp/Light=Tischlampe -Thick Candle=Dicke Kerze -Thick Glowlight=Dickes Glimmlicht -Thin Candle=Dünne Kerze -Thin Glowlight=Dünnes Glimmlicht +Standing Lamp/Light=Stehlampe +Plasma Ball/light=Plasmakugel +Rope lighting (on floor)=Lichtband am Boden +Rope lighting (on ceiling)=Lichtband an der Decke Wall Lamp/light=Wandlaterne -Wall Torch=Wandfackel +Thick Candle=Dicke Kerze +Thin Candle=Dünne Kerze +Candlestick (wrought iron)=Kerzenhalter (Schmiedeeisen) +Candlestick (brass)=Kerzenhalter (Messing) Wall sconce=Wandkerze +Oil lamp/Light (hurricane)=Öl-Sturmlaterne +Oil Lamp/Light (tabletop)=Tisch-Öllampe +Hanging chain (ceiling mount, steel)=Hängende Kette (Decke, Eisen) +Hanging chain (ceiling mount, brass)=Hängende Kette (Decke, Messing) +Chandelier (steel)=Kronleuchter (Stahl) +Chandelier (brass)=Kronleuchter (Messing) +Wall Torch=Wandfackel diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.es.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.es.tr index f34bd433..bd9417be 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.es.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.es.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Candelero (latón) -Candlestick (wrought iron)=Candelero (hierro forjado) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=Candelabro (latón) -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Luz brillante gruesa +Thin Glowlight=Luz brillante fina +Small Glowlight Cube=Cubo pequeño de luz brillante +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=Cadena colgante (montada en techo, latón) -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Cubo pequeño de luz brillante -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=Vela gruesa -Thick Glowlight=Luz brillante gruesa -Thin Candle=Vela fina -Thin Glowlight=Luz brillante fina +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Antorcha de pared +Thick Candle=Vela gruesa +Thin Candle=Vela fina +Candlestick (wrought iron)=Candelero (hierro forjado) +Candlestick (brass)=Candelero (latón) Wall sconce=Candelabro de pared +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=Cadena colgante (montada en techo, latón) +Chandelier (steel)= +Chandelier (brass)=Candelabro (latón) +Wall Torch=Antorcha de pared diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.fr.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.fr.tr index fad415da..512fe2ab 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.fr.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.fr.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Chandelier (laiton) -Candlestick (wrought iron)=Chandelier (fer forgé) -Ceiling Lamp/Light=Plafonnier -Ceiling Lantern/Light=Lanterne de plafond -Chandelier (brass)=Chandelier (laiton) -Chandelier (steel)=Chandelier (acier) -Desk Lamp/Light=Lampe de bureau +Thick Glowlight=Dalle lumineuse épaisse +Thin Glowlight=Dalle lumineuse fine +Small Glowlight Cube=Petit cube lumineux +Plasma Lamp/Light=Lampe plasma Ground Lantern/Light=Lanterne de jardin Hanging Lantern/Light=Lanterne suspendue -Hanging chain (ceiling mount, brass)=Chaine suspendue (plafonnier, laiton) -Hanging chain (ceiling mount, steel)=Chaine suspendue (plafonnier, acier) +Ceiling Lantern/Light=Lanterne de plafond Lattice lantern/Light (large)=Lanterne à grille (grande) Lattice lantern/light (small)=Lanterne à grille (petite) -Oil Lamp/Light (tabletop)=Lampe à huile -Oil lamp/Light (hurricane)=Lampe tempête -Plasma Ball/light=Boule plasma -Plasma Lamp/Light=Lampe plasma -Small Glowlight Cube=Petit cube lumineux -Standing Lamp/Light=Lampe à pied +Desk Lamp/Light=Lampe de bureau +Ceiling Lamp/Light=Plafonnier Table Lamp/Light=Lampe de table -Thick Candle=Grosse bougie -Thick Glowlight=Dalle lumineuse épaisse -Thin Candle=Petite bougie -Thin Glowlight=Dalle lumineuse fine +Standing Lamp/Light=Lampe à pied +Plasma Ball/light=Boule plasma +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light=Lampe murale -Wall Torch=Torche murale +Thick Candle=Grosse bougie +Thin Candle=Petite bougie +Candlestick (wrought iron)=Chandelier (fer forgé) +Candlestick (brass)=Chandelier (laiton) Wall sconce=Bougeoir mural +Oil lamp/Light (hurricane)=Lampe tempête +Oil Lamp/Light (tabletop)=Lampe à huile +Hanging chain (ceiling mount, steel)=Chaine suspendue (plafonnier, acier) +Hanging chain (ceiling mount, brass)=Chaine suspendue (plafonnier, laiton) +Chandelier (steel)=Chandelier (acier) +Chandelier (brass)=Chandelier (laiton) +Wall Torch=Torche murale diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.it.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.it.tr index 8fcb1c9b..ee063f6f 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.it.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.it.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)= -Candlestick (wrought iron)= -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)= -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Luce fosforescente bianca (sottile) +Thin Glowlight=Luce fosforescente bianca (sottile) +Small Glowlight Cube=Luce fosforescente gialla (cubo piccolo) +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)= -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Luce fosforescente gialla (cubo piccolo) -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle= -Thick Glowlight=Luce fosforescente bianca (sottile) -Thin Candle= -Thin Glowlight=Luce fosforescente bianca (sottile) +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Torcia a muro +Thick Candle= +Thin Candle= +Candlestick (wrought iron)= +Candlestick (brass)= Wall sconce=Torcia a muro +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)= +Chandelier (steel)= +Chandelier (brass)= +Wall Torch=Torcia a muro diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ms.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ms.tr index f6501afa..5c8d238c 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ms.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ms.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Lilin Berkaki (Loyang) -Candlestick (wrought iron)=Lilin Berkaki (Besi Tempaan) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=Candelier (Loyang) -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Lampu Putih Tebal +Thin Glowlight=Lampu Putih Nipis +Small Glowlight Cube=Kiub Lampu Putih Kecil +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=Rantai Gantung (Lekap Siling, Loyang) -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Kiub Lampu Putih Kecil -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=Lilin Tebal -Thick Glowlight=Lampu Putih Tebal -Thin Candle=Lili Nipis -Thin Glowlight=Lampu Putih Nipis +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Obor Dinding +Thick Candle=Lilin Tebal +Thin Candle=Lili Nipis +Candlestick (wrought iron)=Lilin Berkaki (Besi Tempaan) +Candlestick (brass)=Lilin Berkaki (Loyang) Wall sconce=Pendakap Lilin Dinding +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=Rantai Gantung (Lekap Siling, Loyang) +Chandelier (steel)= +Chandelier (brass)=Candelier (Loyang) +Wall Torch=Obor Dinding diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt.tr index 23d7c626..c1d4999e 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Castiçal (latão) -Candlestick (wrought iron)=Castiçal (ferro forjado) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=Castiçal (latão) -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Arandela Grossa +Thin Glowlight=Arandela Fina +Small Glowlight Cube=Arandela Cúbica Pequena +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=Corrente suspensa (cela de montaria, latão) -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Arandela Cúbica Pequena -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=Vela Grossa -Thick Glowlight=Arandela Grossa -Thin Candle=Vela Fina -Thin Glowlight=Arandela Fina +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Tocha de parede +Thick Candle=Vela Grossa +Thin Candle=Vela Fina +Candlestick (wrought iron)=Castiçal (ferro forjado) +Candlestick (brass)=Castiçal (latão) Wall sconce=Candeeiro de Parede +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=Corrente suspensa (cela de montaria, latão) +Chandelier (steel)= +Chandelier (brass)=Castiçal (latão) +Wall Torch=Tocha de parede diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt_BR.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt_BR.tr index 23d7c626..c1d4999e 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.pt_BR.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Castiçal (latão) -Candlestick (wrought iron)=Castiçal (ferro forjado) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=Castiçal (latão) -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Arandela Grossa +Thin Glowlight=Arandela Fina +Small Glowlight Cube=Arandela Cúbica Pequena +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=Corrente suspensa (cela de montaria, latão) -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Arandela Cúbica Pequena -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=Vela Grossa -Thick Glowlight=Arandela Grossa -Thin Candle=Vela Fina -Thin Glowlight=Arandela Fina +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Tocha de parede +Thick Candle=Vela Grossa +Thin Candle=Vela Fina +Candlestick (wrought iron)=Castiçal (ferro forjado) +Candlestick (brass)=Castiçal (latão) Wall sconce=Candeeiro de Parede +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=Corrente suspensa (cela de montaria, latão) +Chandelier (steel)= +Chandelier (brass)=Castiçal (latão) +Wall Torch=Tocha de parede diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ru.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ru.tr index f7c60af8..21e55346 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ru.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.ru.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=Подсвечник (латунь) -Candlestick (wrought iron)=Подсвечник (кованное железо) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=Люстра (латунь) -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=Толстый светильник +Thin Glowlight=Тонкий светильник +Small Glowlight Cube=Малый светящийся куб +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=Висящая цепь (потолочное крепление, латунь) -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=Малый светящийся куб -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=Толстая свеча -Thick Glowlight=Толстый светильник -Thin Candle=Тонкая свеча -Thin Glowlight=Тонкий светильник +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=Настенный факел +Thick Candle=Толстая свеча +Thin Candle=Тонкая свеча +Candlestick (wrought iron)=Подсвечник (кованное железо) +Candlestick (brass)=Подсвечник (латунь) Wall sconce=Настенный светильник +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=Висящая цепь (потолочное крепление, латунь) +Chandelier (steel)= +Chandelier (brass)=Люстра (латунь) +Wall Torch=Настенный факел diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.zh_CN.tr b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.zh_CN.tr index 3d99ad16..a99f0973 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_lighting/locale/homedecor_lighting.zh_CN.tr @@ -1,32 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)=烛台(黄铜) -Candlestick (wrought iron)=烛台(锻铁) -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)=黄铜吊灯 -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight=厚辉光 +Thin Glowlight=薄辉光 +Small Glowlight Cube=小发光体 +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)=黄铜吊链 -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Small Glowlight Cube=小发光体 -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle=粗蜡烛 -Thick Glowlight=厚辉光 -Thin Candle=薄蜡烛 -Thin Glowlight=薄辉光 +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch=壁灯 +Thick Candle=粗蜡烛 +Thin Candle=薄蜡烛 +Candlestick (wrought iron)=烛台(锻铁) +Candlestick (brass)=烛台(黄铜) Wall sconce=壁灯 +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)=黄铜吊链 +Chandelier (steel)= +Chandelier (brass)=黄铜吊灯 +Wall Torch=壁灯 diff --git a/mods/homedecor_modpack/homedecor_lighting/locale/template.txt b/mods/homedecor_modpack/homedecor_lighting/locale/template.txt index 54688503..cafe6513 100644 --- a/mods/homedecor_modpack/homedecor_lighting/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_lighting/locale/template.txt @@ -1,34 +1,30 @@ # textdomain: homedecor_lighting - - -### init.lua ### - -Candlestick (brass)= -Candlestick (wrought iron)= -Ceiling Lamp/Light= -Ceiling Lantern/Light= -Chandelier (brass)= -Chandelier (steel)= -Desk Lamp/Light= +Thick Glowlight= +Thin Glowlight= +Small Glowlight Cube= +Plasma Lamp/Light= Ground Lantern/Light= Hanging Lantern/Light= -Hanging chain (ceiling mount, brass)= -Hanging chain (ceiling mount, steel)= +Ceiling Lantern/Light= Lattice lantern/Light (large)= Lattice lantern/light (small)= -Oil Lamp/Light (tabletop)= -Oil lamp/Light (hurricane)= -Plasma Ball/light= -Plasma Lamp/Light= -Rope lighting (on ceiling)= -Rope lighting (on floor)= -Small Glowlight Cube= -Standing Lamp/Light= +Desk Lamp/Light= +Ceiling Lamp/Light= Table Lamp/Light= -Thick Candle= -Thick Glowlight= -Thin Candle= -Thin Glowlight= +Standing Lamp/Light= +Plasma Ball/light= +Rope lighting (on floor)= +Rope lighting (on ceiling)= Wall Lamp/light= -Wall Torch= +Thick Candle= +Thin Candle= +Candlestick (wrought iron)= +Candlestick (brass)= Wall sconce= +Oil lamp/Light (hurricane)= +Oil Lamp/Light (tabletop)= +Hanging chain (ceiling mount, steel)= +Hanging chain (ceiling mount, brass)= +Chandelier (steel)= +Chandelier (brass)= +Wall Torch= diff --git a/mods/homedecor_modpack/homedecor_lighting/mod.conf b/mods/homedecor_modpack/homedecor_lighting/mod.conf index 1e69e386..ce69f665 100644 --- a/mods/homedecor_modpack/homedecor_lighting/mod.conf +++ b/mods/homedecor_modpack/homedecor_lighting/mod.conf @@ -1,4 +1,4 @@ name = homedecor_lighting description = Homedecor mod: lighting -depends = homedecor_common, default, basic_materials, unifieddyes, creative -optional_depends = moreblocks, building_blocks, darkage, mesecons, digilines, screwdriver +depends = homedecor_common +optional_depends = moreblocks, building_blocks, darkage, mesecons, digilines, screwdriver, default, basic_materials, unifieddyes, creative diff --git a/mods/homedecor_modpack/homedecor_misc/init.lua b/mods/homedecor_modpack/homedecor_misc/init.lua index dd9911a0..f16413d8 100644 --- a/mods/homedecor_modpack/homedecor_misc/init.lua +++ b/mods/homedecor_modpack/homedecor_misc/init.lua @@ -11,6 +11,9 @@ local S = minetest.get_translator("homedecor_misc") homedecor_misc = {} +local wool_black, wool_grey = homedecor.textures.wool.black, homedecor.textures.wool.grey +local wood_tex = homedecor.textures.wood.apple.planks + homedecor.register("ceiling_paint", { description = S("Textured Ceiling Paint"), drawtype = 'signlike', @@ -19,7 +22,9 @@ homedecor.register("ceiling_paint", { wield_image = 'homedecor_ceiling_paint_roller.png', walkable = false, groups = { snappy = 3 }, - sounds = default.node_sound_leaves_defaults(), + _sound_def = { + key = "node_sound_leaves_defaults", + }, selection_box = { type = "wallmounted" }, }) @@ -31,22 +36,24 @@ homedecor.register("ceiling_tile", { inventory_image = 'homedecor_ceiling_tile.png', walkable = false, groups = { snappy = 3 }, - sounds = default.node_sound_leaves_defaults(), + _sound_def = { + key = "node_sound_leaves_defaults", + }, selection_box = { type = "wallmounted" }, }) local rug_types = { - { "small", "homedecor_small_rug.obj" }, - { "large", homedecor.box.slab_y(0.0625) }, - { "persian", homedecor.box.slab_y(0.0625) }, + { "small", S("small"), "homedecor_small_rug.obj" }, + { "large", S("large"), homedecor.box.slab_y(0.0625) }, + { "persian", S("persian"), homedecor.box.slab_y(0.0625) }, } for _, rt in ipairs(rug_types) do - local s, m = unpack(rt) + local s, desc, m = unpack(rt) local mesh = m local nodebox = nil - local tiles = { "homedecor_rug_"..s..".png", "wool_grey.png" } + local tiles = { "homedecor_rug_"..s..".png", wool_grey } if type(m) == "table" then mesh = nil @@ -56,79 +63,94 @@ for _, rt in ipairs(rug_types) do } tiles = { "homedecor_rug_"..s..".png", - "wool_grey.png", + wool_grey, "homedecor_rug_"..s..".png" } end homedecor.register("rug_"..s, { - description = S("Rug (@1)", S(s)), + description = S("Rug (@1)", desc), mesh = mesh, tiles = tiles, node_box = nodebox, paramtype2 = "wallmounted", walkable = false, groups = {snappy = 3}, - sounds = default.node_sound_leaves_defaults(), + _sound_def = { + key = "node_sound_leaves_defaults", + }, selection_box = { type = "wallmounted" }, }) end -local pot_colors = { "black", "green", "terracotta" } - -for _, p in ipairs(pot_colors) do -homedecor.register("flower_pot_"..p, { - description = S("Flower Pot (@1)", S(p)), - mesh = "homedecor_flowerpot.obj", - tiles = { - "homedecor_flower_pot_"..p..".png", - { name = "default_dirt.png", color = 0xff505050 }, - }, - groups = { snappy = 3, potting_soil=1 }, - sounds = default.node_sound_stone_defaults(), -}) -end - -local flowers_list = { - { S("Rose"), "rose", "flowers:rose" }, - { S("Tulip"), "tulip", "flowers:tulip" }, - { S("Yellow Dandelion"), "dandelion_yellow", "flowers:dandelion_yellow" }, - { S("White Dandelion"), "dandelion_white", "flowers:dandelion_white" }, - { S("Blue Geranium"), "geranium", "flowers:geranium" }, - { S("Viola"), "viola", "flowers:viola" }, - { S("Cactus"), "cactus", "default:cactus" }, - { S("Bonsai"), "bonsai", "default:sapling" } +local pot_colors = { + { "black", S("black") }, + { "green", S("green") }, + { "terracotta", S("terracotta") }, } -for _, f in ipairs(flowers_list) do - local flowerdesc, flower, craftwith = unpack(f) +for _, pot in ipairs(pot_colors) do + local p, desc = unpack(pot) - homedecor.register("potted_"..flower, { - description = S("Potted flower (@1)", flowerdesc), - mesh = "homedecor_potted_plant.obj", + homedecor.register("flower_pot_"..p, { + description = S("Flower Pot (@1)", desc), + mesh = "homedecor_flowerpot.obj", tiles = { - "homedecor_flower_pot_terracotta.png", - { name = "default_dirt.png", color = 0xff303030 }, - "flowers_"..flower..".png" + "homedecor_flower_pot_"..p..".png", + { name = default and "default_dirt.png" or wood_tex, color = 0xff505050 }, + }, + groups = { snappy = 3, potting_soil=1 }, + _sound_def = { + key = "node_sound_stone_defaults", }, - walkable = false, - groups = {snappy = 3}, - sounds = default.node_sound_glass_defaults(), - selection_box = { - type = "fixed", - fixed = { -0.2, -0.5, -0.2, 0.2, 0.3, 0.2 } - } }) +end - minetest.register_craft({ - type = "shapeless", - output = "homedecor:potted_"..flower, - recipe = { craftwith, "homedecor:flower_pot_small" } - }) +if minetest.get_modpath("flowers") then + local flowers_list = { + { S("Rose"), "rose", "flowers:rose" }, + { S("Tulip"), "tulip", "flowers:tulip" }, + { S("Yellow Dandelion"), "dandelion_yellow", "flowers:dandelion_yellow" }, + { S("White Dandelion"), "dandelion_white", "flowers:dandelion_white" }, + { S("Blue Geranium"), "geranium", "flowers:geranium" }, + { S("Viola"), "viola", "flowers:viola" }, + { S("Cactus"), "cactus", "default:cactus" }, + { S("Bonsai"), "bonsai", "default:sapling" } + } - minetest.register_alias("flowers:flower_"..flower.."_pot", "homedecor:potted_"..flower) - minetest.register_alias("flowers:potted_"..flower, "homedecor:potted_"..flower) - minetest.register_alias("flowers:flower_pot", "homedecor:flower_pot_small") + for _, f in ipairs(flowers_list) do + local flowerdesc, flower, craftwith = unpack(f) + + homedecor.register("potted_"..flower, { + description = S("Potted flower (@1)", flowerdesc), + mesh = "homedecor_potted_plant.obj", + tiles = { + "homedecor_flower_pot_terracotta.png", + { name = "default_dirt.png", color = 0xff303030 }, + "flowers_"..flower..".png" + }, + walkable = false, + use_texture_alpha = "clip", + groups = {snappy = 3}, + _sound_def = { + key = "node_sound_glass_defaults", + }, + selection_box = { + type = "fixed", + fixed = { -0.2, -0.5, -0.2, 0.2, 0.3, 0.2 } + } + }) + + minetest.register_craft({ + type = "shapeless", + output = "homedecor:potted_"..flower, + recipe = { craftwith, "homedecor:flower_pot_small" } + }) + + minetest.register_alias("flowers:flower_"..flower.."_pot", "homedecor:potted_"..flower) + minetest.register_alias("flowers:potted_"..flower, "homedecor:potted_"..flower) + minetest.register_alias("flowers:flower_pot", "homedecor:flower_pot_small") + end end homedecor.register("pole_brass", { @@ -146,7 +168,9 @@ homedecor.register("pole_brass", { fixed = { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 }, }, groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, check_for_pole = true }) @@ -164,7 +188,9 @@ homedecor.register("pole_wrought_iron", { fixed = {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625} }, groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) local ft_cbox = { @@ -183,11 +209,13 @@ homedecor.register("fishtank", { "homedecor_fishtank_water_top.png", "homedecor_fishtank_sides.png", }, - use_texture_alpha = true, + use_texture_alpha = "blend", selection_box = ft_cbox, collision_box = ft_cbox, groups = {cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) minetest.set_node(pos, {name = "homedecor:fishtank_lighted", param2 = node.param2}) return itemstack @@ -205,12 +233,14 @@ homedecor.register("fishtank_lighted", { "homedecor_fishtank_water_top_lighted.png", "homedecor_fishtank_sides_lighted.png", }, - light_source = default.LIGHT_MAX-4, - use_texture_alpha = true, + light_source = minetest.LIGHT_MAX-4, + use_texture_alpha = "blend", selection_box = ft_cbox, collision_box = ft_cbox, groups = {cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) minetest.set_node(pos, {name = "homedecor:fishtank", param2 = node.param2}) return itemstack @@ -225,6 +255,7 @@ homedecor.register("cardboard_box_big", { 'homedecor_cardbox_big_tb.png', 'homedecor_cardbox_big_sides.png', }, + use_texture_alpha = "clip", groups = { snappy = 3 }, infotext=S("Cardboard box"), inventory = { @@ -245,6 +276,7 @@ homedecor.register("cardboard_box", { {-0.3125, -0.5, -0.3125, 0.3125, 0, 0.3125}, } }, + use_texture_alpha = "clip", groups = { snappy = 3 }, infotext=S("Cardboard box"), inventory = { @@ -256,13 +288,23 @@ homedecor.register("dvd_cd_cabinet", { description = S("DVD/CD cabinet"), mesh = "homedecor_dvd_cabinet.obj", tiles = { - "default_wood.png", + wood_tex, "homedecor_dvdcd_cabinet_front.png", "homedecor_dvdcd_cabinet_back.png" }, selection_box = homedecor.nodebox.slab_z(-0.5), groups = {choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + type = "shapeless", + recipe = { + "homedecor:dvd_player", "homedecor:kitchen_cabinet_colorable" + } + } + } }) local pooltable_cbox = { @@ -285,7 +327,9 @@ homedecor.register("pool_table", { selection_box = pooltable_cbox, collision_box = pooltable_cbox, expand = { forward="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, }) @@ -309,7 +353,9 @@ homedecor.register("piano", { selection_box = piano_cbox, collision_box = piano_cbox, expand = { right="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, }) @@ -325,7 +371,7 @@ homedecor.register("trophy", { description = S("Trophy"), mesh = "homedecor_trophy.obj", tiles = { - "default_wood.png", + wood_tex, "homedecor_generic_metal_gold.png" }, inventory_image = "homedecor_trophy_inv.png", @@ -346,13 +392,15 @@ homedecor.register("sportbench", { "homedecor_generic_metal_wrought_iron.png", "homedecor_generic_metal_bright.png", { name = "homedecor_generic_metal.png", color = homedecor.color_black }, - "wool_black.png" + wool_black }, inventory_image = "homedecor_sport_bench_inv.png", groups = { snappy=3 }, selection_box = sb_cbox, walkable = false, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) local skate_cbox = { @@ -366,10 +414,13 @@ homedecor.register("skateboard", { tiles = { "homedecor_skateboard.png" }, inventory_image = "homedecor_skateboard_inv.png", description = S("Skateboard"), + use_texture_alpha = "clip", groups = {snappy=3}, selection_box = skate_cbox, walkable = false, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_place = minetest.rotate_node }) @@ -377,8 +428,8 @@ homedecor_misc.banister_materials = { { "wood", S("wood"), - "default_wood.png", - "default_wood.png", + wood_tex, + wood_tex, "group:wood", "group:stick", "", @@ -481,7 +532,7 @@ for _, side in ipairs({"diagonal_left", "diagonal_right", "horizontal"}) do end homedecor.register("spiral_staircase", { - description = "Spiral Staircase", + description = S("Spiral Staircase"), mesh = "homedecor_spiral_staircase.obj", wield_scale = { x=0.4, y=0.4, z=0.4 }, tiles = { @@ -515,7 +566,9 @@ homedecor.register("spiral_staircase", { } }, groups = {cracky = 1}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, after_place_node = function(pos, placer, itemstack, pointed_thing) local fdir = minetest.dir_to_facedir(placer:get_look_dir()) @@ -583,7 +636,9 @@ minetest.register_node(":homedecor:tatami_mat", { description = S("Japanese tatami"), drawtype = "nodebox", paramtype = "light", - groups = {snappy=3}, + groups = {snappy=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, node_box = { type = "fixed", fixed = { @@ -605,7 +660,9 @@ homedecor.register("dartboard", { }, groups = {choppy=2,dig_immediate=2,attached_node=1}, legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) -- crafting @@ -617,7 +674,7 @@ homedecor.register("dartboard", { minetest.register_craft( { output = "homedecor:flower_pot_terracotta", recipe = { - { "homedecor:roof_tile_terracotta", "default:dirt", "homedecor:roof_tile_terracotta" }, + { "homedecor:roof_tile_terracotta", homedecor.materials.dirt, "homedecor:roof_tile_terracotta" }, { "homedecor:roof_tile_terracotta", "homedecor:roof_tile_terracotta", "homedecor:roof_tile_terracotta" }, }, }) @@ -626,7 +683,7 @@ minetest.register_craft( { output = "homedecor:flower_pot_green", recipe = { { "", "dye:dark_green", "" }, - { "basic_materials:plastic_sheet", "default:dirt", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", homedecor.materials.dirt, "basic_materials:plastic_sheet" }, { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, }, }) @@ -634,8 +691,8 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:flower_pot_black", recipe = { - { "dye:black", "dye:black", "dye:black" }, - { "basic_materials:plastic_sheet", "default:dirt", "basic_materials:plastic_sheet" }, + { homedecor.materials.dye_black, homedecor.materials.dye_black, homedecor.materials.dye_black }, + { "basic_materials:plastic_sheet", homedecor.materials.dirt, "basic_materials:plastic_sheet" }, { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, }, }) @@ -644,26 +701,26 @@ minetest.register_craft( { type = "shapeless", output = "homedecor:ceiling_paint 20", recipe = { - "dye:white", - "dye:white", - "default:sand", - "bucket:bucket_water", + homedecor.materials.dye_white, + homedecor.materials.dye_white, + homedecor.materials.sand, + homedecor.materials.water_bucket, }, - replacements = { { "bucket:bucket_water","bucket:bucket_empty" } } + replacements = { { homedecor.materials.water_bucket,homedecor.materials.empty_bucket } } }) minetest.register_craft( { output = "homedecor:ceiling_tile 10", recipe = { - { "", "dye:white", "" }, - { "default:steel_ingot", "default:stone", "default:steel_ingot" }, + { "", homedecor.materials.dye_white, "" }, + { homedecor.materials.steel_ingot, homedecor.materials.stone, homedecor.materials.steel_ingot }, }, }) minetest.register_craft( { output = "homedecor:drawer_small", recipe = { - { "group:wood", "default:steel_ingot", "group:wood" }, + { "group:wood", homedecor.materials.steel_ingot, "group:wood" }, }, }) @@ -687,9 +744,9 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:pole_wrought_iron 4", recipe = { - { "default:iron_lump", }, - { "default:iron_lump", }, - { "default:iron_lump", }, + { homedecor.materials.iron_lump, }, + { homedecor.materials.iron_lump, }, + { homedecor.materials.iron_lump, }, }, }) @@ -773,35 +830,26 @@ minetest.register_craft({ output = "homedecor:fishtank", recipe = { { "basic_materials:plastic_sheet", "homedecor:glowlight_small_cube", "basic_materials:plastic_sheet" }, - { "default:glass", "bucket:bucket_water", "default:glass" }, - { "default:glass", "building_blocks:gravel_spread", "default:glass" }, + { homedecor.materials.glass_block, homedecor.materials.water_bucket, homedecor.materials.glass_block }, + { homedecor.materials.glass_block, "building_blocks:gravel_spread", homedecor.materials.glass_block }, }, - replacements = { {"bucket:bucket_water", "bucket:bucket_empty"} } + replacements = { {homedecor.materials.water_bucket, homedecor.materials.empty_bucket} } }) minetest.register_craft({ output = "homedecor:cardboard_box 2", recipe = { - { "default:paper", "", "default:paper" }, - { "default:paper", "default:paper", "default:paper" }, + { homedecor.materials.paper, "", homedecor.materials.paper }, + { homedecor.materials.paper, homedecor.materials.paper, homedecor.materials.paper }, }, }) minetest.register_craft({ output = "homedecor:cardboard_box_big 2", recipe = { - { "default:paper", "", "default:paper" }, - { "default:paper", "", "default:paper" }, - { "default:paper", "default:paper", "default:paper" }, - }, -}) - -minetest.register_craft( { - output = "homedecor:openframe_bookshelf", - recipe = { - {"group:wood", "", "group:wood"}, - {"default:book", "default:book", "default:book"}, - {"group:wood", "", "group:wood"}, + { homedecor.materials.paper, "", homedecor.materials.paper }, + { homedecor.materials.paper, "", homedecor.materials.paper }, + { homedecor.materials.paper, homedecor.materials.paper, homedecor.materials.paper }, }, }) @@ -810,18 +858,18 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:japanese_wall_top", recipe = { - {"group:stick", "default:paper"}, - {"default:paper", "group:stick"}, - {"group:stick", "default:paper"} + {"group:stick", homedecor.materials.paper}, + { homedecor.materials.paper, "group:stick"}, + {"group:stick", homedecor.materials.paper} }, }) minetest.register_craft( { output = "homedecor:japanese_wall_top", recipe = { - {"default:paper", "group:stick"}, - {"group:stick", "default:paper"}, - {"default:paper", "group:stick"} + {homedecor.materials.paper, "group:stick"}, + {"group:stick", homedecor.materials.paper}, + {homedecor.materials.paper, "group:stick"} }, }) @@ -989,10 +1037,14 @@ minetest.register_node(":homedecor:japanese_wall_top", { }, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=3}, + groups = {snappy=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = jp_cbox, collision_box = jp_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) minetest.register_node(":homedecor:japanese_wall_middle", { @@ -1005,10 +1057,14 @@ minetest.register_node(":homedecor:japanese_wall_middle", { }, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=3}, + groups = {snappy=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = jp_cbox, collision_box = jp_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) minetest.register_node(":homedecor:japanese_wall_bottom", { @@ -1021,8 +1077,12 @@ minetest.register_node(":homedecor:japanese_wall_bottom", { }, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=3}, + groups = {snappy=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = jp_cbox, collision_box = jp_cbox, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.de.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.de.tr index 16258ebb..e0d77f9d 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.de.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.de.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Treppengeländer (@1, @2) -Blue Geranium=Blaue Geranie -Bonsai=Bonsai -Brass Pole=Messingstange -Cactus=Kaktus -Cardboard box=Karton -Cardboard box (big)=Karton (groß) -DVD/CD cabinet=DVD-/CD-Regal -Dartboard=Dartscheibe +Textured Ceiling Paint=Deckenfarbe Drop-Ceiling Tile=Abgehängte Deckenkachel +small= +large= +persian= +Rug (@1)=Teppich (@1) +black=schwarz +green=grün +terracotta=Terrakotta +Flower Pot (@1)=Blumentopf (@1) +Rose=Rose +Tulip=Tulpe +Yellow Dandelion=Gelber Löwenzahn +White Dandelion=Weißer Löwenzahn +Blue Geranium=Blaue Geranie +Viola=Veilchen +Cactus=Kaktus +Bonsai=Bonsai +Potted flower (@1)=Eingetopfte Blume (@1) +Brass Pole=Messingstange +Wrought Iron Pole=Schmiedeeiserne Stange Fishtank=Aquarium Fishtank (lighted)=Beleuchtetes Aquarium -Flower Pot (@1)=Blumentopf (@1) -Japanese tatami=Japanische Tatami -Japanese wall=Japanische Wand -Japanese wall (bottom)=Japanische Wand (unten) -Japanese wall (top)=Japanische Wand (oben) -Piano=Klavier +Cardboard box (big)=Karton (groß) +Cardboard box=Karton +DVD/CD cabinet=DVD-/CD-Regal Pool Table=Billardtisch -Potted flower (@1)=Eingetopfte Blume (@1) -Rose=Rose -Rug (@1)=Teppich (@1) -Skateboard=Skateboard -Small Flower Pot=Kleiner Blumentopf -Sport bench=Fitnessgerät -Textured Ceiling Paint=Deckenfarbe +Piano=Klavier Trophy=Trophäe -Tulip=Tulpe -Viola=Veilchen -White Dandelion=Weißer Löwenzahn -Wrought Iron Pole=Schmiedeeiserne Stange -Yellow Dandelion=Gelber Löwenzahn -brass=Messing +Sport bench=Fitnessgerät +Skateboard=Skateboard +wood=Holz dark topped=dunkler Handlauf +brass=Messing +wrought iron=Schmiedeeisen diagonal=diagonal horizontal=horizontal +Banister for Stairs (@1, @2)=Treppengeländer (@1, @2) +Spiral Staircase= not enough space=nicht genügend Platz -wood=Holz -wrought iron=Schmiedeeisen +Japanese tatami=Japanische Tatami +Dartboard=Dartscheibe +Small Flower Pot=Kleiner Blumentopf +Japanese wall (top)=Japanische Wand (oben) +Japanese wall=Japanische Wand +Japanese wall (bottom)=Japanische Wand (unten) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.es.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.es.tr index 7323ea1b..496bd9f6 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.es.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.es.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Barandilla para escaleras (@1, @2) -Blue Geranium=Geranio azul -Bonsai=Bonsai -Brass Pole=Poste de latón -Cactus=Cacto -Cardboard box=Caja de cartón -Cardboard box (big)=Caja de cartón (grande) -DVD/CD cabinet=Gabinete de CDs/DVDs -Dartboard=Diana +Textured Ceiling Paint=Pintura de techo con textura Drop-Ceiling Tile=Azulejo de techo +small= +large= +persian= +Rug (@1)=Tapete (@1) +black= +green= +terracotta= +Flower Pot (@1)=Maceta (@1) +Rose=Rosa +Tulip=Tulipán +Yellow Dandelion=Diente de león amarillo +White Dandelion=Diente de león blanco +Blue Geranium=Geranio azul +Viola=Viola +Cactus=Cacto +Bonsai=Bonsai +Potted flower (@1)=Flor en maceta (@1) +Brass Pole=Poste de latón +Wrought Iron Pole=Poste de hierro forjado Fishtank=Estanque para peces Fishtank (lighted)=Estanque para peces (iliminado) -Flower Pot (@1)=Maceta (@1) -Japanese tatami=Tatami -Japanese wall=Pared japonesa -Japanese wall (bottom)=Pared japonesa (parte más baja) -Japanese wall (top)=Pared japonesa (parte más alta) -Piano=Piano +Cardboard box (big)=Caja de cartón (grande) +Cardboard box=Caja de cartón +DVD/CD cabinet=Gabinete de CDs/DVDs Pool Table=Mesa de pool -Potted flower (@1)=Flor en maceta (@1) -Rose=Rosa -Rug (@1)=Tapete (@1) -Skateboard=Patineta -Small Flower Pot=Maceta pequeña -Sport bench=Banco deportivo -Textured Ceiling Paint=Pintura de techo con textura +Piano=Piano Trophy=Trofeo -Tulip=Tulipán -Viola=Viola -White Dandelion=Diente de león blanco -Wrought Iron Pole=Poste de hierro forjado -Yellow Dandelion=Diente de león amarillo -brass=latón +Sport bench=Banco deportivo +Skateboard=Patineta +wood=madera dark topped=mesada oscura +brass=latón +wrought iron=hierro forjado diagonal=diagonal horizontal=horizontal +Banister for Stairs (@1, @2)=Barandilla para escaleras (@1, @2) +Spiral Staircase= not enough space=no hay suficiente espacio -wood=madera -wrought iron=hierro forjado +Japanese tatami=Tatami +Dartboard=Diana +Small Flower Pot=Maceta pequeña +Japanese wall (top)=Pared japonesa (parte más alta) +Japanese wall=Pared japonesa +Japanese wall (bottom)=Pared japonesa (parte más baja) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.fr.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.fr.tr index 10ef972f..7213dfa3 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.fr.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.fr.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Rampe d'escalier (@1, @2) -Blue Geranium=Géranium bleu -Bonsai=Bonsaï -Brass Pole=Perche en étain -Cactus=Cactus -Cardboard box=Carton d'emballage -Cardboard box (big)=Carton d'emballage (grand) -DVD/CD cabinet=Meuble DVD/CD -Dartboard=Jeu de fléchettes +Textured Ceiling Paint=Peinture pour plafonds Drop-Ceiling Tile=Plaque de plafond +small= +large= +persian= +Rug (@1)=Tapis (@1) +black= +green= +terracotta= +Flower Pot (@1)=Pot de fleur (@1) +Rose=Rose +Tulip=Tulipe +Yellow Dandelion=Pissenlit jaune +White Dandelion=Pissenlit blanc +Blue Geranium=Géranium bleu +Viola=Violette +Cactus=Cactus +Bonsai=Bonsaï +Potted flower (@1)=Fleur en pot (@1) +Brass Pole=Perche en étain +Wrought Iron Pole=Perche en fer forgé Fishtank=Aquarium Fishtank (lighted)=Aquarium (éclairé) -Flower Pot (@1)=Pot de fleur (@1) -Japanese tatami=Tatami -Japanese wall=Mur japonais -Japanese wall (bottom)=Mur japonais (bas) -Japanese wall (top)=Mur japonais (haut) -Piano=Piano +Cardboard box (big)=Carton d'emballage (grand) +Cardboard box=Carton d'emballage +DVD/CD cabinet=Meuble DVD/CD Pool Table=Billard -Potted flower (@1)=Fleur en pot (@1) -Rose=Rose -Rug (@1)=Tapis (@1) -Skateboard=Planche à roulettes -Small Flower Pot=Petit pot de fleurs -Sport bench=Banc de musculation -Textured Ceiling Paint=Peinture pour plafonds +Piano=Piano Trophy=Trophée -Tulip=Tulipe -Viola=Violette -White Dandelion=Pissenlit blanc -Wrought Iron Pole=Perche en fer forgé -Yellow Dandelion=Pissenlit jaune -brass=laiton +Sport bench=Banc de musculation +Skateboard=Planche à roulettes +wood=bois dark topped=dessus foncé +brass=laiton +wrought iron=fer forgé diagonal=diagonal horizontal=horizontal +Banister for Stairs (@1, @2)=Rampe d'escalier (@1, @2) +Spiral Staircase= not enough space=pas assez d'espace -wood=bois -wrought iron=fer forgé +Japanese tatami=Tatami +Dartboard=Jeu de fléchettes +Small Flower Pot=Petit pot de fleurs +Japanese wall (top)=Mur japonais (haut) +Japanese wall=Mur japonais +Japanese wall (bottom)=Mur japonais (bas) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.it.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.it.tr index 3cb27ad2..9e4fe1b8 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.it.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.it.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)= -Blue Geranium= -Bonsai= -Brass Pole=Palo di ottone -Cactus= -Cardboard box= -Cardboard box (big)= -DVD/CD cabinet= -Dartboard= +Textured Ceiling Paint=Vernice con trama per il soffitto Drop-Ceiling Tile=Piastrella del controsoffitto +small= +large= +persian= +Rug (@1)= +black= +green= +terracotta= +Flower Pot (@1)= +Rose= +Tulip= +Yellow Dandelion= +White Dandelion= +Blue Geranium= +Viola=viola +Cactus= +Bonsai= +Potted flower (@1)= +Brass Pole=Palo di ottone +Wrought Iron Pole=Palo di ferro battuto Fishtank= Fishtank (lighted)= -Flower Pot (@1)= -Japanese tatami= -Japanese wall= -Japanese wall (bottom)= -Japanese wall (top)= -Piano= +Cardboard box (big)= +Cardboard box= +DVD/CD cabinet= Pool Table=Tavolo -Potted flower (@1)= -Rose= -Rug (@1)= -Skateboard= -Small Flower Pot=Vaso per fiori di plastica nera -Sport bench= -Textured Ceiling Paint=Vernice con trama per il soffitto +Piano= Trophy= -Tulip= -Viola=viola -White Dandelion= -Wrought Iron Pole=Palo di ferro battuto -Yellow Dandelion= -brass= +Sport bench= +Skateboard= +wood= dark topped= +brass= +wrought iron=Palo di ferro battuto diagonal= horizontal= +Banister for Stairs (@1, @2)= +Spiral Staircase= not enough space= -wood= -wrought iron=Palo di ferro battuto +Japanese tatami= +Dartboard= +Small Flower Pot=Vaso per fiori di plastica nera +Japanese wall (top)= +Japanese wall= +Japanese wall (bottom)= diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ms.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ms.tr index 89330cd7..055afa72 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ms.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ms.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Selusur Tangga (@1, @2) -Blue Geranium=Geranium Biru -Bonsai=Bonsai -Brass Pole=Tiang Loyang -Cactus=Kaktus -Cardboard box=Kotak Kadbod (Kecil) -Cardboard box (big)=Kotak Kadbod (Besar) -DVD/CD cabinet=Kabinet DVD/CD -Dartboard=Papan Damak +Textured Ceiling Paint=Cat Siling Bertekstur Drop-Ceiling Tile=Kepingan Siling +small= +large= +persian= +Rug (@1)=Ambal (@1) +black= +green= +terracotta= +Flower Pot (@1)=Pasu Bunga (@1) +Rose=Ros +Tulip=Tulip +Yellow Dandelion=Dandelion Kuning +White Dandelion=Dandelion Putih +Blue Geranium=Geranium Biru +Viola=Violet +Cactus=Kaktus +Bonsai=Bonsai +Potted flower (@1)=Pasu Berbunga (@1) +Brass Pole=Tiang Loyang +Wrought Iron Pole=Tiang Besi Tempaan Fishtank=Tangki Ikan Fishtank (lighted)=Tangki Ikan (Bercahaya) -Flower Pot (@1)=Pasu Bunga (@1) -Japanese tatami=Tatami Jepun -Japanese wall=Dinding Jepun -Japanese wall (bottom)=Dinding Jepun (Bawah) -Japanese wall (top)=Dinding Jepun (Atas) -Piano=Piano +Cardboard box (big)=Kotak Kadbod (Besar) +Cardboard box=Kotak Kadbod (Kecil) +DVD/CD cabinet=Kabinet DVD/CD Pool Table=Meja Pool -Potted flower (@1)=Pasu Berbunga (@1) -Rose=Ros -Rug (@1)=Ambal (@1) -Skateboard=Papan Luncur -Small Flower Pot=Pasu Bunga Kecil -Sport bench=Bangku Angkat Berat -Textured Ceiling Paint=Cat Siling Bertekstur +Piano=Piano Trophy=Trofi -Tulip=Tulip -Viola=Violet -White Dandelion=Dandelion Putih -Wrought Iron Pole=Tiang Besi Tempaan -Yellow Dandelion=Dandelion Kuning -brass=Loyang +Sport bench=Bangku Angkat Berat +Skateboard=Papan Luncur +wood=Kayu dark topped=atasan gelap +brass=Loyang +wrought iron=Besi Tempaan diagonal=pepenjuru horizontal=mendatar +Banister for Stairs (@1, @2)=Selusur Tangga (@1, @2) +Spiral Staircase= not enough space=Tidak cukup ruang -wood=Kayu -wrought iron=Besi Tempaan +Japanese tatami=Tatami Jepun +Dartboard=Papan Damak +Small Flower Pot=Pasu Bunga Kecil +Japanese wall (top)=Dinding Jepun (Atas) +Japanese wall=Dinding Jepun +Japanese wall (bottom)=Dinding Jepun (Bawah) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt.tr index f8dc9f01..bcd5d87f 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Corrimão para Escadas (@1, @2) -Blue Geranium=Gerânio Azul -Bonsai=Bonsai -Brass Pole=Poste de bronze -Cactus=Cacto -Cardboard box=Caixa de Papelão -Cardboard box (big)=Caixa de Papelão (grande) -DVD/CD cabinet=Gabinete de DVD/CD -Dartboard=Alvo +Textured Ceiling Paint=Pintura Texturizada do Teto Drop-Ceiling Tile=Placa de Teto +small= +large= +persian= +Rug (@1)=Carpete (@1) +black= +green= +terracotta= +Flower Pot (@1)=Vaso de Flores (@1) +Rose=Rosa +Tulip=Tulipa +Yellow Dandelion=Dente de Leão Amarelo +White Dandelion=Dente de Leão Branco +Blue Geranium=Gerânio Azul +Viola=Violeta +Cactus=Cacto +Bonsai=Bonsai +Potted flower (@1)=Vaso de Flor (@1) +Brass Pole=Poste de bronze +Wrought Iron Pole=Poste de Ferro Forjado Fishtank=Aquário Fishtank (lighted)=Aquário (iluminado) -Flower Pot (@1)=Vaso de Flores -Japanese tatami=Tatami Japonês -Japanese wall=Divisória japonesa -Japanese wall (bottom)=Divisória japonesa (inferior) -Japanese wall (top)=Divisória japonesa (superior) -Piano=Piano +Cardboard box (big)=Caixa de Papelão (grande) +Cardboard box=Caixa de Papelão +DVD/CD cabinet=Gabinete de DVD/CD Pool Table=Mesa de Sinuca -Potted flower (@1)=Vaso de Flor (@1) -Rose=Rosa -Rug (@1)=Carpete (@1) -Skateboard=Skate -Small Flower Pot=Vaso de Flor Pequeno -Sport bench=Supino Reto -Textured Ceiling Paint=Pintura Texturizada do Teto +Piano=Piano Trophy=Troféu -Tulip=Tulipa -Viola=Violeta -White Dandelion=Dente de Leão Branco -Wrought Iron Pole=Poste de Ferro Forjado -Yellow Dandelion=Dente de Leão Amarelo -brass=latão +Sport bench=Supino Reto +Skateboard=Skate +wood=madeira dark topped=coberto escuro +brass=latão +wrought iron=ferro forjado diagonal=diagonal horizontal=horizontal +Banister for Stairs (@1, @2)=Corrimão para Escadas (@1, @2) +Spiral Staircase= not enough space=espaço insuficiente -wood=madeira -wrought iron=ferro forjado +Japanese tatami=Tatami Japonês +Dartboard=Alvo +Small Flower Pot=Vaso de Flor Pequeno +Japanese wall (top)=Divisória japonesa (superior) +Japanese wall=Divisória japonesa +Japanese wall (bottom)=Divisória japonesa (inferior) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt_BR.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt_BR.tr index f8dc9f01..bcd5d87f 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.pt_BR.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Corrimão para Escadas (@1, @2) -Blue Geranium=Gerânio Azul -Bonsai=Bonsai -Brass Pole=Poste de bronze -Cactus=Cacto -Cardboard box=Caixa de Papelão -Cardboard box (big)=Caixa de Papelão (grande) -DVD/CD cabinet=Gabinete de DVD/CD -Dartboard=Alvo +Textured Ceiling Paint=Pintura Texturizada do Teto Drop-Ceiling Tile=Placa de Teto +small= +large= +persian= +Rug (@1)=Carpete (@1) +black= +green= +terracotta= +Flower Pot (@1)=Vaso de Flores (@1) +Rose=Rosa +Tulip=Tulipa +Yellow Dandelion=Dente de Leão Amarelo +White Dandelion=Dente de Leão Branco +Blue Geranium=Gerânio Azul +Viola=Violeta +Cactus=Cacto +Bonsai=Bonsai +Potted flower (@1)=Vaso de Flor (@1) +Brass Pole=Poste de bronze +Wrought Iron Pole=Poste de Ferro Forjado Fishtank=Aquário Fishtank (lighted)=Aquário (iluminado) -Flower Pot (@1)=Vaso de Flores -Japanese tatami=Tatami Japonês -Japanese wall=Divisória japonesa -Japanese wall (bottom)=Divisória japonesa (inferior) -Japanese wall (top)=Divisória japonesa (superior) -Piano=Piano +Cardboard box (big)=Caixa de Papelão (grande) +Cardboard box=Caixa de Papelão +DVD/CD cabinet=Gabinete de DVD/CD Pool Table=Mesa de Sinuca -Potted flower (@1)=Vaso de Flor (@1) -Rose=Rosa -Rug (@1)=Carpete (@1) -Skateboard=Skate -Small Flower Pot=Vaso de Flor Pequeno -Sport bench=Supino Reto -Textured Ceiling Paint=Pintura Texturizada do Teto +Piano=Piano Trophy=Troféu -Tulip=Tulipa -Viola=Violeta -White Dandelion=Dente de Leão Branco -Wrought Iron Pole=Poste de Ferro Forjado -Yellow Dandelion=Dente de Leão Amarelo -brass=latão +Sport bench=Supino Reto +Skateboard=Skate +wood=madeira dark topped=coberto escuro +brass=latão +wrought iron=ferro forjado diagonal=diagonal horizontal=horizontal +Banister for Stairs (@1, @2)=Corrimão para Escadas (@1, @2) +Spiral Staircase= not enough space=espaço insuficiente -wood=madeira -wrought iron=ferro forjado +Japanese tatami=Tatami Japonês +Dartboard=Alvo +Small Flower Pot=Vaso de Flor Pequeno +Japanese wall (top)=Divisória japonesa (superior) +Japanese wall=Divisória japonesa +Japanese wall (bottom)=Divisória japonesa (inferior) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ru.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ru.tr index cc4ecbc2..f2b55582 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ru.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.ru.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=Перила для ступеней (@1, @2) -Blue Geranium=Голубая герань -Bonsai=Карликовое дерево -Brass Pole=Латунный столб -Cactus=Кактус -Cardboard box=Картонная коробка -Cardboard box (big)=Картонная коробка (большая) -DVD/CD cabinet=Шкаф с дисками DVD/CD -Dartboard=Мишень для дротиков +Textured Ceiling Paint=Текстурированная потолочная краска Drop-Ceiling Tile=Потолочная плитка +small= +large= +persian= +Rug (@1)=Ковёр (@1) +black= +green= +terracotta= +Flower Pot (@1)=Цветочный горшок (@1) +Rose=Роза +Tulip=Тюльпан +Yellow Dandelion=Жёлтый одуванчик +White Dandelion=Белый одуванчик +Blue Geranium=Голубая герань +Viola=Фиалка +Cactus=Кактус +Bonsai=Карликовое дерево +Potted flower (@1)=Цветок в горшке (@1) +Brass Pole=Латунный столб +Wrought Iron Pole=Кованный железный столб Fishtank=Аквариум Fishtank (lighted)=Аквариум (освещённый) -Flower Pot (@1)=Цветочный горшок -Japanese tatami=Японский татами -Japanese wall=Японская стена -Japanese wall (bottom)=Японская стена (низ) -Japanese wall (top)=Японская стена (верх) -Piano=Пианино +Cardboard box (big)=Картонная коробка (большая) +Cardboard box=Картонная коробка +DVD/CD cabinet=Шкаф с дисками DVD/CD Pool Table=Бильярдный стол -Potted flower (@1)=Цветок в горшке (@1) -Rose=Роза -Rug (@1)=Ковёр (@1) -Skateboard=Скейт -Small Flower Pot=Маленький цветочный горшок -Sport bench=Спортивная скамья -Textured Ceiling Paint=Текстурированная потолочная краска +Piano=Пианино Trophy=Награда -Tulip=Тюльпан -Viola=Фиалка -White Dandelion=Белый одуванчик -Wrought Iron Pole=Кованный железный столб -Yellow Dandelion=Жёлтый одуванчик -brass=латунь +Sport bench=Спортивная скамья +Skateboard=Скейт +wood=дерево dark topped=тёмный верх +brass=латунь +wrought iron=кованное железо diagonal=диагональный horizontal=горизонтальный +Banister for Stairs (@1, @2)=Перила для ступеней (@1, @2) +Spiral Staircase= not enough space=не хватает места -wood=дерево -wrought iron=кованное железо +Japanese tatami=Японский татами +Dartboard=Мишень для дротиков +Small Flower Pot=Маленький цветочный горшок +Japanese wall (top)=Японская стена (верх) +Japanese wall=Японская стена +Japanese wall (bottom)=Японская стена (низ) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.zh_CN.tr b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.zh_CN.tr index d50f1af8..5b69340b 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_misc/locale/homedecor_misc.zh_CN.tr @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)=楼梯栏杆(@1,@2) -Blue Geranium=蓝色天竺葵 -Bonsai=盆景 -Brass Pole=铜柱 -Cactus=仙人掌 -Cardboard box=纸箱 -Cardboard box (big)=纸箱(大) -DVD/CD cabinet=DVD/CD柜 -Dartboard=飞镖板 +Textured Ceiling Paint=纹理天花板漆 Drop-Ceiling Tile=落地砖 +small= +large= +persian= +Rug (@1)=地毯(@1) +black= +green= +terracotta= +Flower Pot (@1)=花盆(@1) +Rose=玫瑰 +Tulip=郁金香 +Yellow Dandelion=黄色蒲公英 +White Dandelion=白色蒲公英 +Blue Geranium=蓝色天竺葵 +Viola=中提琴 +Cactus=仙人掌 +Bonsai=盆景 +Potted flower (@1)=盆花(@1) +Brass Pole=铜柱 +Wrought Iron Pole=锻铁杆 Fishtank=鱼缸 Fishtank (lighted)=鱼缸(带灯光) -Flower Pot (@1)=花盆(@1) -Japanese tatami=日本榻榻米 -Japanese wall=日本墙 -Japanese wall (bottom)=日本墙(下) -Japanese wall (top)=日本墙(上) -Piano=钢琴 +Cardboard box (big)=纸箱(大) +Cardboard box=纸箱 +DVD/CD cabinet=DVD/CD柜 Pool Table=台球桌 -Potted flower (@1)=盆花(@1) -Rose=玫瑰 -Rug (@1)=地毯(@1) -Skateboard=滑板 -Small Flower Pot=小花盆 -Sport bench=运动板凳 -Textured Ceiling Paint=纹理天花板漆 +Piano=钢琴 Trophy=奖杯 -Tulip=郁金香 -Viola=中提琴 -White Dandelion=白色蒲公英 -Wrought Iron Pole=锻铁杆 -Yellow Dandelion=黄色蒲公英 -brass=黄铜 +Sport bench=运动板凳 +Skateboard=滑板 +wood=木材 dark topped= +brass=黄铜 +wrought iron=锻铁 diagonal=对角线的 horizontal=水平的 +Banister for Stairs (@1, @2)=楼梯栏杆(@1,@2) +Spiral Staircase= not enough space=空间不足 -wood=木材 -wrought iron=锻铁 +Japanese tatami=日本榻榻米 +Dartboard=飞镖板 +Small Flower Pot=小花盆 +Japanese wall (top)=日本墙(上) +Japanese wall=日本墙 +Japanese wall (bottom)=日本墙(下) diff --git a/mods/homedecor_modpack/homedecor_misc/locale/template.txt b/mods/homedecor_modpack/homedecor_misc/locale/template.txt index 0adf1828..49514875 100644 --- a/mods/homedecor_modpack/homedecor_misc/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_misc/locale/template.txt @@ -1,44 +1,47 @@ # textdomain: homedecor_misc - - -### init.lua ### - -Banister for Stairs (@1, @2)= -Blue Geranium= -Bonsai= -Brass Pole= -Cactus= -Cardboard box= -Cardboard box (big)= -DVD/CD cabinet= -Dartboard= +Textured Ceiling Paint= Drop-Ceiling Tile= +small= +large= +persian= +Rug (@1)= +black= +green= +terracotta= +Flower Pot (@1)= +Rose= +Tulip= +Yellow Dandelion= +White Dandelion= +Blue Geranium= +Viola= +Cactus= +Bonsai= +Potted flower (@1)= +Brass Pole= +Wrought Iron Pole= Fishtank= Fishtank (lighted)= -Flower Pot (@1)= -Japanese tatami= -Japanese wall= -Japanese wall (bottom)= -Japanese wall (top)= -Piano= +Cardboard box (big)= +Cardboard box= +DVD/CD cabinet= Pool Table= -Potted flower (@1)= -Rose= -Rug (@1)= -Skateboard= -Small Flower Pot= -Sport bench= -Textured Ceiling Paint= +Piano= Trophy= -Tulip= -Viola= -White Dandelion= -Wrought Iron Pole= -Yellow Dandelion= -brass= +Sport bench= +Skateboard= +wood= dark topped= +brass= +wrought iron= diagonal= horizontal= +Banister for Stairs (@1, @2)= +Spiral Staircase= not enough space= -wood= -wrought iron= +Japanese tatami= +Dartboard= +Small Flower Pot= +Japanese wall (top)= +Japanese wall= +Japanese wall (bottom)= diff --git a/mods/homedecor_modpack/homedecor_misc/mod.conf b/mods/homedecor_modpack/homedecor_misc/mod.conf index a616716e..3e8919b0 100644 --- a/mods/homedecor_modpack/homedecor_misc/mod.conf +++ b/mods/homedecor_modpack/homedecor_misc/mod.conf @@ -1,4 +1,4 @@ name = homedecor_misc description = Homedecor mod: miscellaneous -depends = homedecor_common, default, basic_materials, unifieddyes -optional_depends = building_blocks, technic, bucket, signs_lib, screwdriver +depends = homedecor_common +optional_depends = building_blocks, technic, bucket, signs_lib, screwdriver, default, basic_materials, unifieddyes diff --git a/mods/homedecor_modpack/homedecor_office/.luacheckrc b/mods/homedecor_modpack/homedecor_office/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_office/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_office/init.lua b/mods/homedecor_modpack/homedecor_office/init.lua index e55c4bcb..13cca903 100644 --- a/mods/homedecor_modpack/homedecor_office/init.lua +++ b/mods/homedecor_modpack/homedecor_office/init.lua @@ -8,13 +8,24 @@ homedecor.register("filing_cabinet", { "homedecor_filing_cabinet_front.png", "homedecor_filing_cabinet_bottom.png" }, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree=2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, infotext=S("Filing cabinet"), inventory = { size=16, lockable=true, }, + crafts = { + { + recipe = { + { "", "group:wood", "" }, + { "group:wood", "homedecor:drawer_small", "group:wood" }, + { "", "group:wood", "" }, + }, + } + } }) local desk_cbox = { @@ -32,13 +43,31 @@ homedecor.register("desk", { inventory_image = "homedecor_desk_inv.png", selection_box = desk_cbox, collision_box = desk_cbox, - sounds = default.node_sound_wood_defaults(), - groups = { snappy = 3 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, + groups = { snappy = 3, dig_tree=2 }, expand = { right="placeholder" }, inventory = { size=24, lockable=true, }, + crafts = { + { + recipe = { + { "slab_wood", "slab_wood", "slab_wood" }, + { "homedecor:drawer_small", "group:wood", "group:wood" }, + { "homedecor:drawer_small", "", "group:wood" }, + }, + }, + { + recipe = { + { "moreblocks:slab_wood", "moreblocks:slab_wood", "moreblocks:slab_wood" }, + { "homedecor:drawer_small", "group:wood", "group:wood" }, + { "homedecor:drawer_small", "", "group:wood" }, + }, + } + } }) minetest.register_alias("homedecor:desk_r", "air") @@ -60,7 +89,25 @@ homedecor.register("desk_globe", { collision_box = globe_cbox, groups = {choppy=2, oddly_breakable_by_hand=2}, walkable = false, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, + crafts = { + { + recipe = { + { "group:stick", "basic_materials:plastic_sheet", "dye_green" }, + { "group:stick", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "group:stick", "slab_wood", "dye_blue" } + }, + }, + { + recipe = { + { "group:stick", "basic_materials:plastic_sheet", "dye_green" }, + { "group:stick", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "group:stick", "moreblocks:slab_wood", "dye_blue" } + }, + } + } }) homedecor.register("calendar", { @@ -77,72 +124,26 @@ homedecor.register("calendar", { wall_bottom = { -4/16, -8/16, -8/16, 4/16, -5/16, 5/16 }, wall_top = { -4/16, 5/16, -8/16, 4/16, 8/16, 5/16 } }, - groups = {choppy=2,attached_node=1}, + use_texture_alpha = "clip", + groups = {choppy=2,attached_node=1, dig_tree=2}, legacy_wallmounted = true, - sounds = default.node_sound_defaults(), + _sound_def = { + key = "node_sound_default", + }, infotext = S("Date (right-click to update):\n@1", os.date("%Y-%m-%d")), -- ISO 8601 format on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local meta = minetest.get_meta(pos) local date = os.date("%Y-%m-%d") meta:set_string("infotext", S("Date (right-click to update):\n@1", date)) return itemstack - end -}) - --- crafting - - -minetest.register_craft({ - output = "homedecor:desk", - recipe = { - { "stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood" }, - { "homedecor:drawer_small", "group:wood", "group:wood" }, - { "homedecor:drawer_small", "", "group:wood" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:desk", - recipe = { - { "moreblocks:slab_wood", "moreblocks:slab_wood", "moreblocks:slab_wood" }, - { "homedecor:drawer_small", "group:wood", "group:wood" }, - { "homedecor:drawer_small", "", "group:wood" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:filing_cabinet", - recipe = { - { "", "group:wood", "" }, - { "group:wood", "homedecor:drawer_small", "group:wood" }, - { "", "group:wood", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:calendar", - recipe = { - { "","dye:red","" }, - { "","dye:black","" }, - { "","default:paper","" } - }, -}) - -minetest.register_craft({ - output = "homedecor:desk_globe", - recipe = { - { "group:stick", "basic_materials:plastic_sheet", "dye:green" }, - { "group:stick", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "group:stick", "stairs:slab_wood", "dye:blue" } - }, -}) - -minetest.register_craft({ - output = "homedecor:desk_globe", - recipe = { - { "group:stick", "basic_materials:plastic_sheet", "dye:green" }, - { "group:stick", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "group:stick", "moreblocks:slab_wood", "dye:blue" } - }, -}) - + end, + crafts = { + { + recipe = { + { "","dye_red","" }, + { "","dye_black","" }, + { "","paper","" } + }, + } + } +}) \ No newline at end of file diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.de.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.de.tr index 9253da49..dae4e3bf 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.de.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.de.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Kalender -Date (right-click to update):@n@1=Datum (Rechsklick zum Aktualisieren):@n@1 +Filing cabinet=Ablageschrank Desk=Schreibtisch Desk globe=Schreibtischglobus -Filing cabinet=Ablageschrank +Calendar=Kalender +Date (right-click to update):@n@1=Datum (Rechsklick zum Aktualisieren):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.es.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.es.tr index ece20063..a7ee6d3c 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.es.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.es.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Calendario -Date (right-click to update):@n@1=Fecha (clic derecho para actualizar):@n@1 +Filing cabinet=Archivador Desk=Escritorio Desk globe=Globo terráqueo -Filing cabinet=Archivador +Calendar=Calendario +Date (right-click to update):@n@1=Fecha (clic derecho para actualizar):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.fr.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.fr.tr index a52e5ad3..d50b4837 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.fr.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.fr.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Calendrier -Date (right-click to update):@n@1=Date (clic-droit pour mettre à jour) :@n@1 +Filing cabinet=Meuble de rangement Desk=Bureau Desk globe=Globe de bureau -Filing cabinet=Meuble de rangement +Calendar=Calendrier +Date (right-click to update):@n@1=Date (clic-droit pour mettre à jour) :@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ms.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ms.tr index d59812e1..a9e07d82 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ms.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ms.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Kalendar -Date (right-click to update):@n@1=Tarikh (klik-kanan untuk kemaskini):@n@1 +Filing cabinet=Kabinet Pemfailan Desk=Meja Kerja Desk globe=Glob Dunia -Filing cabinet=Kabinet Pemfailan +Calendar=Kalendar +Date (right-click to update):@n@1=Tarikh (klik-kanan untuk kemaskini):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt.tr index 2d60f8c9..8aad9861 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Calendário -Date (right-click to update):@n@1=Data (clique com o botão direito para atualizar):@n@1 +Filing cabinet=Armário sob a Pia Desk=Escrivaninha Desk globe=Globo da terra -Filing cabinet=Armário sob a Pia +Calendar=Calendário +Date (right-click to update):@n@1=Data (clique com o botão direito para atualizar):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt_BR.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt_BR.tr index 2d60f8c9..8aad9861 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.pt_BR.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Calendário -Date (right-click to update):@n@1=Data (clique com o botão direito para atualizar):@n@1 +Filing cabinet=Armário sob a Pia Desk=Escrivaninha Desk globe=Globo da terra -Filing cabinet=Armário sob a Pia +Calendar=Calendário +Date (right-click to update):@n@1=Data (clique com o botão direito para atualizar):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ru.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ru.tr index ac083e4e..858f90a6 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ru.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.ru.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=Календарь -Date (right-click to update):@n@1=Дата (правая кнопка мыши для обновления):@n@1 +Filing cabinet=Шкаф для документов Desk=Письменный стол Desk globe=Настольный глобус -Filing cabinet=Шкаф для документов +Calendar=Календарь +Date (right-click to update):@n@1=Дата (правая кнопка мыши для обновления):@n@1 diff --git a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.zh_CN.tr b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.zh_CN.tr index a201d927..b4df4ece 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_office/locale/homedecor_office.zh_CN.tr @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar=日历 -Date (right-click to update):@n@1= +Filing cabinet=文件柜 Desk=办公桌 Desk globe=台式地球仪 -Filing cabinet=文件柜 +Calendar=日历 +Date (right-click to update):@n@1= diff --git a/mods/homedecor_modpack/homedecor_office/locale/template.txt b/mods/homedecor_modpack/homedecor_office/locale/template.txt index 0396fb5c..9de0ccb5 100644 --- a/mods/homedecor_modpack/homedecor_office/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_office/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: homedecor_office - - -### init.lua ### - -Calendar= -Date (right-click to update):@n@1= +Filing cabinet= Desk= Desk globe= -Filing cabinet= +Calendar= +Date (right-click to update):@n@1= diff --git a/mods/homedecor_modpack/homedecor_office/mod.conf b/mods/homedecor_modpack/homedecor_office/mod.conf index d6c7eb4c..59b52162 100644 --- a/mods/homedecor_modpack/homedecor_office/mod.conf +++ b/mods/homedecor_modpack/homedecor_office/mod.conf @@ -1,4 +1,4 @@ name = homedecor_office description = Homedecor mod: office -depends = homedecor_common, default, basic_materials, dye +depends = homedecor_common optional_depends = moreblocks, building_blocks diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/.luacheckrc b/mods/homedecor_modpack/homedecor_pictures_and_paintings/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/init.lua b/mods/homedecor_modpack/homedecor_pictures_and_paintings/init.lua index 695bf566..39c79c24 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/init.lua +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/init.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator("homedecor_pictures_and_paintings") +local wood_tex = homedecor.textures.wood.apple.planks + local pframe_cbox = { type = "fixed", fixed = { -0.18, -0.5, -0.08, 0.18, -0.08, 0.18 } @@ -17,10 +19,12 @@ for _, i in ipairs(n) do }, inventory_image = "homedecor_picture_frame"..i.."_inv.png", wield_image = "homedecor_picture_frame"..i.."_inv.png", - groups = {snappy = 3}, + groups = {snappy = 3, dig_tree = 3}, selection_box = pframe_cbox, walkable = false, - sounds = default.node_sound_glass_defaults() + _sound_def = { + key = "node_sound_glass_defaults", + }, }) end @@ -36,14 +40,16 @@ for i = 1,20 do description = S("Decorative painting #@1", i), mesh = "homedecor_painting.obj", tiles = { - "default_wood.png", + wood_tex, "homedecor_blank_canvas.png", "homedecor_painting"..i..".png" }, selection_box = p_cbox, walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_tree = 3}, + _sound_def = { + key = "node_sound_wood_defaults", + }, }) end @@ -60,7 +66,7 @@ minetest.register_craft({ output = "homedecor:blank_canvas", recipe = { { "", "group:stick", "" }, - { "group:stick", "wool:white", "group:stick" }, + { "group:stick", homedecor.materials["wool_white"], "group:stick" }, { "", "group:stick", "" }, } }) @@ -129,12 +135,12 @@ local painting_patterns = { for i,recipe in pairs(painting_patterns) do - local item1 = "dye:"..recipe[1][1] - local item2 = "dye:"..recipe[1][2] - local item3 = "dye:"..recipe[1][3] - local item4 = "dye:"..recipe[2][1] - local item5 = "dye:"..recipe[2][2] - local item6 = "dye:"..recipe[2][3] + local item1 = homedecor.materials["dye_"..recipe[1][1]] + local item2 = homedecor.materials["dye_"..recipe[1][2]] + local item3 = homedecor.materials["dye_"..recipe[1][3]] + local item4 = homedecor.materials["dye_"..recipe[2][1]] + local item5 = homedecor.materials["dye_"..recipe[2][2]] + local item6 = homedecor.materials["dye_"..recipe[2][3]] minetest.register_craft({ output = "homedecor:painting_"..i, @@ -147,16 +153,28 @@ for i,recipe in pairs(painting_patterns) do end local picture_dyes = { - {"dye:brown", "dye:green"}, -- the figure sitting by the tree, wielding a pick - {"dye:green", "dye:blue"} -- the "family photo" + {"dye_brown", "dye_green"}, -- the figure sitting by the tree, wielding a pick + {"dye_green", "dye_blue"} -- the "family photo" } for i in ipairs(picture_dyes) do minetest.register_craft({ output = "homedecor:picture_frame"..i, recipe = { - { picture_dyes[i][1], picture_dyes[i][2] }, + { homedecor.materials[picture_dyes[i][1]], homedecor.materials[picture_dyes[i][2]] }, { "homedecor:blank_canvas", "group:stick" }, }, }) end + +local numbers = {} +for i = 2,20 do + table.insert(numbers, i) +end + +if minetest.get_modpath("i3") then + i3.compress("homedecor:painting_1", { + replace = "1", + by = numbers + }) +end diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.de.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.de.tr index ad8e9011..74d091cd 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.de.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Leeres Leintuch -Decorative painting #@1=dekoratives Wandbild @1 Picture Frame @1=Bilderrahmen @1 +Decorative painting #@1=dekoratives Wandbild @1 +Blank Canvas=Leeres Leintuch diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.es.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.es.tr index b436e19b..01f1b285 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.es.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.es.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Lienzo en blanco -Decorative painting #@1= Picture Frame @1=Marco de fotografía @1 +Decorative painting #@1= +Blank Canvas=Lienzo en blanco diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.fr.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.fr.tr index d0494415..2c7479c4 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.fr.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Toile vierge -Decorative painting #@1=Painture décorative #@1 Picture Frame @1=Cadre photo @1 +Decorative painting #@1=Painture décorative #@1 +Blank Canvas=Toile vierge diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ms.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ms.tr index a5ac9d28..d7dcbf40 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ms.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ms.tr @@ -1,484 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Kanvas Kosong -Decorative painting #@1= Picture Frame @1=Bingkai Gambar @1 - - -##### not used anymore ##### - -Small Wooden Drawer=Laci Kayu Kecil -Terracotta Roof Tile=Genting Bumbung Terracotta -Not enough room - the space for the headboard is occupied!=Tidak cukup ruang - ada barang di kawasan untuk letak kepala katil! -Not enough room - the upper space is occupied!=Tidak cukup ruang - ada barang di kawasan atas! -Someone already owns that spot.=Kawasan itu kepunyaan orang lain. -Someone already owns the spot where the headboard goes.=Tempat untuk letak kepala katil itu kawasan kepunyaan orang lain. -@1 (active)=@1 (aktif) -@1 (active: @2%)=@1 (aktif: @2) -@1 (empty)=@1 (kosong) -@1 (out of fuel)=@1 (kehabisan bahan api) -@1 (output bins are full)=@1 (dulang keluar penuh) -Furnace=Relau -@1 (Locked)=@1 (Berkunci) -@1 (owned by @2)=@1 (hak milik @2) -@1 moves @2 to @3 at @4=@1 pindahkan @2 ke @3 dekat @4 -@1 moves stuff in @2 at @3=@1 pindah barang dalam @2 dekat @3 -@1 takes @2 from @3 at @4=@1 ambil @2 daripada @3 dekat @4 -@1 tried to access a @2 belonging to @3 at @4=@1 cuba untuk pakai @2 milik @3 dekat @4 -Granite=Granit -Grate=Jeriji -Streak Free Glass=Kaca Bebas Calar -Wood Framed Glass=Kaca Berbingkai Kayu -Adobe=Adob -Fake Grass=Rumput Tiruan -Hardwood=Kayu Keras -Roof block=Blok Bumbung -Tar=Tar -Marble=Marmar -Brobble Spread=Sebaran Batu Merah -Gravel Spread=Sebaran Kelikir -Tarmac Spread=Sebaran Tar -Terrycloth towel=Kain Tuala -Chess board tiling=Jubin Papan Catur -Fireplace=Pendiangan -Small bundle of sticks=Seberkas Kecil Serpihan Kayu -Tar base=Campuran Tar -Tar Knife=Pisau Tar -Hanging chain (wrought iron)=Rantai Gantung (Besi Tempaan) -Hanging chain (brass)=Rantai Gantung (Loyang) -Hanging chain (ceiling mount, wrought iron)=Rantai Gantung (Lekap Siling, Besi Tempaan) -Hanging chain (ceiling mount, brass)=Rantai Gantung (Lekap Siling, Loyang) -Chandelier (wrought iron)=Candelier (Besi Tempaan) -Chandelier (brass)=Candelier (Loyang) -Monitor and keyboard=Monitor dan Papan Kekunci -WIFI Router=Penghala WIFI -Computer Tower=Sistem Unit -Printer-Scanner Combo=Pencetak Semua Dalam Satu -Rack Server=Rak Pelayan -Not enough vertical space to place a server!=Tidak cukup ruang menegak untuk letak rak pelayan! -Plastic sheet=Kepingan Plastik -Unprocessed Plastic base=Campuran Plastik Belum Diproses -New Game=Main Baru -Next...=Seterusnya... -Score: =Markah: -Tetris Arcade=Arked Tetris -No room for place the Arcade!=Tiada ruang untuk letak Arked! -Ice fire=Api Ais -Fancy Fire=Api Hiasan -Glowing Embers=Bara Api -Stone chimney top=Kepala Serombong Batu -Sandstone chimney top=Kepala Serombong Batu Pasir -Bathroom/kitchen tiles (dark)=Jubin Dapur/Bilik Mandi (Gelap) -Bathroom/kitchen tiles (medium)=Jubin Dapur/Bilik Mandi (Biasa) -Bathroom/kitchen tiles (light)=Jubin Dapur/Bilik Mandi (Cerah) -Towel rod with towel=Ampaian Beserta Tuala -Medicine cabinet=Kabinet Ubat -Toilet=Tandas -Toilet paper=Tisu Tandas -Bathroom Sink=Sinki Bilik Mandi -Bathroom taps/faucet=Kepala Paip Bilik Mandi -Bathroom taps/faucet (brass)=Kepala Paip Bilik Mandi (Loyang) -Shower Tray=Lubang Air Mandi -Shower Head=Kepala Pancuran -Bathtub, clawfoot, with brass taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Loyang -Bathtub, clawfoot, with chrome taps=Tab Mandi Berkaki Cakar, dengan Kepala Paip Krom -Bathroom sundries set=Set Barangan Bilik Mandi -Bed=Katil -Bed (king sized)=Katil Raja -mahogany=Mahogani -oak=Oak -Nightstand with One Drawer (@1)=Kabinet Katil dengan Satu Laci (@1) -One-drawer Nightstand=Kabinet Katil Satu Laci -Nightstand with Two Drawers (@1)=Kabinet Katil dengan Dua Laci (@1) -Two-drawer Nightstand=Kabinet Katil Dua Laci -red=Merah -green=Hijau -blue=Biru -violet=Ungu -grey=Kelabu -brown=Perang -Writable Book (@1)=Buku Boleh Ditulis (@1) -@1 has written in a book (title: "@2"): "@3" at location @4=@1 telah menulis dalam buku (tajuk: "@2"): "@3" di lokasi @4 -Air Conditioner=Pendingin Hawa -Desk Fan=Kipas Meja -Ceiling Fan=Kipas Siling -Space heater=Pemanas Ruang -Radiator heater=Pemanas Radiator -Plastic analog clock=Jam Analog Plastik -Wooden analog clock=Jam Analog Kayu -Digital clock=Jam Digital -Alarm clock=Jam Loceng -Grandfather Clock=Jam Besar Berdiri -Cobweb=Sarang Labah-Labah -Uncooked Terracotta Base=Asas Terracotta Belum Dimasak -Oil extract=Sari Minyak -Unprocessed paraffin=Parafin Belum Diproses -Plastic strips=Jalur Plastik -Simple Integrated Circuit=Litar Bersepadu Ringkas -Heating element=Unsur Pemanas -Motor=Motor -Power Crystal=Kristal Kuasa -VCR=Perakam Kaset Video -DVD Player=Pemain DVD -Spool of copper wire=Gelendong Wayar Tembaga -Spool of steel wire=Gelendong Wayar Keluli -Speaker driver=Pemacu Pembesar Suara -Fan blades=Bilah Kipas -Copper Strip=Jalur Tembaga -Steel Strip=Jalur Keluli -Steel chainlink=Dawai Rangkai Keluli -Brass chainlink=Dawai Rangkai Loyang -Soda Can=Tin Soda -Gold Coin (for soda vending machine)=Duit Syiling Emas (untuk mesin soda layan diri) -Silicon lump=Ketulan Silikon -Brass Ingot=Jongkong Loyang -Small Flower Pot=Pasu Bunga Kecil -Mahogany Closet Door (@1 opening)=Pintu Almari Mahogani (Bukaan @1) -Oak Closet Door (@1 opening)=Pintu Almari Oak (Bukaan @1) -Fancy Wood/Glass Door (@1 opening)=Pintu Hiasan Kayu/Kaca (Bukaan @1) -Glass Office Door (@1 opening)=Pintu Pejabat Kaca (Bukaan @1) -Glass and Wood, Oak-colored (@1 opening)=Pintu Kayu Kaca, warna Oak (Bukaan @1) -Glass and Wood, Mahogany-colored (@1 opening)=Pintu Kayu Kaca, warna Mahogani (Bukaan @1) -Glass and Wood, White (@1 opening)=Pintu Kayu Kaca, warna Putih (Bukaan @1) -Plain Wooden Door (@1 opening)=Pintu Kayu Biasa (Bukaan @1) -White Bedroom Door (@1 opening)=Pintu Bilik Tidur Putih (Bukaan @1) -Wrought Iron Gate/Door (@1 opening)=Pintu Besi Tempaan (Bukaan @1) -Wooden door with glass insert (@1 opening)=Pintu Kayu dengan Masukan Kaca (Bukaan @1) -Wooden door with glass insert, type 2 (@1 opening)=Pintu Kayu dengan Masukan Kaca, Jenis ke-2 (Bukaan @1) -left=Kiri -right=Kanan -Unpainted Picket Fence Gate=Pintu Pagar Pancang Tidak Bercat -White Picket Fence Gate=Pintu Pagar Pancang Putih -Barbed Wire Fence Gate=Pintu Pagar Dawai Berduri -Chainlink Fence Gate=Pintu Pagar Dawai Berangkai -"Half" Door=Pintu "Separuh" -"Half" Door (white)=Pintu "Separuh" (Putih) -Japanese wall (top)=Dinding Jepun (Atas) -Japanese wall=Dinding Jepun -Japanese wall (bottom)=Dinding Jepun (Bawah) -Japanese tatami=Tatami Jepun -Japanese-style door=Pintu Gaya Jepun -Power Outlet=Palam Elektrik -Light switch=Suis Lampu -Doorbell=Loceng Pintu -Large Stereo Speaker=Pembesar Suara Stereo Besar -Large Stereo Speaker, open front=Pembesar Suara Stereo Besar, bahagian depan terbuka -Small Surround Speaker=Pembesar Suara Keliling Kecil -Stereo Receiver=Penerima Stereo -Projection Screen Material=Bahan Skrin Pemancaran -Small CRT Television=Televisyen CRT Kecil -DVD and VCR=Pemain DVD beserta Perakam VCR -Telephone=Telefon -Barbecue=Barbeku -Garden Bench (style 1)=Bangku Taman (gaya 1) -Garden Bench (style 2)=Bangku Taman (gaya 2) -Deck Chair=Kerusi Anduh -Deck Chair (blue striped)=Kerusi Anduh (Berjalur Biru) -Doghouse=Rumah Anjing -Simple Bench=Bangku Ringkas -Garden stone path=Laluan Berbatu Taman -wood=Kayu -white wood=Kayu Putih -wood, with vegetation=Kayu, dengan Tumbuhan -white wood, with vegetation=Kayu Putih, dengan Tumbuhan -Garden Lattice (@1)=Kekisi Taman (@1) -Tree's swing=Buaian Pokok -Water well=Perigi Air -yellow=Kuning -Shrubbery (large, @1)=Rumpun Pokok Renek (Besar, @1) -Shrubbery (@1)=Rumpun Pokok Renek (@1) -brass=Loyang -wrought iron=Besi Tempaan -Fence/railing (@1)=Pagar/Kisi-Kisi (@1) -Fence/railing with sign (@1)=Pagar/Kisi-Kisi dengan Papan Tanda (@1) -Unpainted Picket Fence=Pagar Pancang Tidak Bercat -Unpainted Picket Fence Corner=Bucu Pagar Pancang Tidak Bercat -White Picket Fence=Pagar Pancang Putih -White Picket Fence Corner=Bucu Pagar Pancang Putih -Wooden Privacy Fence=Pagar Privasi Kayu -Wooden Privacy Fence Corner=Bucu Pagar Privasi Kayu -Barbed Wire Fence=Pagar Dawai Berduri -Barbed Wire Fence Corner=Bucu Pagar Dawai Berduri -Chainlink Fence=Pagar Dawai Berangkai -Chainlink Fence Corner=Bucu Pagar Dawai Berangkai -Wrought Iron fence (type 2)=Pagar Besi Tempaan (jenis ke-2) -Wrought Iron fence (type 2) Corner=Bucu Pagar Besi Tempaan (jenis ke-2) -Wall-mounted coat rack=Penyangkut Baju Dinding -Coat tree=Penyangkut Baju Berdiri -Green welcome mat=Alas Kaki "Welcome" Hijau -Brown welcome mat=Alas Kaki "Welcome" Perang -Grey welcome mat=Alas Kaki "Welcome" Kelabu -Table=Meja -Mahogany Table=Meja Mahogani -White Table=Meja Putih -Kitchen chair=Kerusi Dapur -Armchair=Kerusi Berlengan -Bookshelf (open-frame)=Rak Buku (Bingkai Terbuka) -Wall Shelf=Rak Dinding -Bars=Palang -Binding Bars=Palang Bucu -Chains=Rantai -Wall Torch=Obor Dinding -Wall Lamp=Lantera Dinding -Cutlery set=Set Kutleri -Brown bottle=Botol Perang -Four brown bottles=Empat Botol Perang -Four green bottles=Empat Botol Hijau -Green bottle=Botol Hijau -Four misc brown/green bottles=Empat Botol Pelbagai Warna -Wine rack=Rak Wain -Dartboard=Papan Damak -Beer tap=Paip Bir -Ahh, a frosty cold beer - look in your inventory for it!=Ahh, bir sejuk dingin - cari dalam inventori anda! -No room in your inventory to add a beer mug!=Tiada ruang dalam inventori anda untuk menambah kole bir! -Beer mug=Kole Bir -Soda vending machine=Mesin Soda Layan Diri -Please insert a coin in the machine.=Sila masukkan duit syiling ke dalam mesin. -Loaded!=Telah Dimuatkan! -Refrigerator (stainless steel)=Peti Sejuk (Keluli Tahan Karat) -Refrigerator=Peti Sejuk -Oven=Ketuhar -Oven (stainless steel)=Ketuhar (Keluli Tahan Karat) -Microwave Oven=Ketuhar Gelombang Mikro -Coffee Maker=Alat Pembuat Kopi -Toaster=Pembakar Roti -Dishwasher=Mesin Basuh Pinggan Mangkuk -granite=Granit -marble=Marmar -steel=Keluli -Dishwasher (@1)=Mesin Basuh Pinggan Mangkuk (@1) -Kitchen Cabinet=Kabinet Dapur -Kitchen Cabinet (@1 top)=Kabinet Dapur (Beralaskan @1) -Half-height Kitchen Cabinet (on ceiling)=Kabinet Dapur Separuh (dekat siling) -Kitchen Cabinet with sink=Kabinet Dapur dengan Sinki -Under-sink cabinet=Kabinet Bawah Sinki -Copper pans=Kuali Leper Tembaga -Kitchen Faucet=Kepala Paip Dapur -Paper towels=Tuala Dapur Pakai Buang -Thick Glowlight=Lampu Putih Tebal -Thin Glowlight=Lampu Putih Nipis -Small Glowlight Cube=Kiub Lampu Putih Kecil -Plasma Lamp=Lampu Plasma -Plasma Ball=Bebola Plasma -Thick Candle=Lilin Tebal -Thin Candle=Lili Nipis -Candlestick (wrought iron)=Lilin Berkaki (Besi Tempaan) -Candlestick (brass)=Lilin Berkaki (Loyang) -Wall sconce=Pendakap Lilin Dinding -Oil lamp (hurricane)=Pelita Gantung -Oil Lamp (tabletop)=Pelita Duduk -Ground Lantern=Lantera Berdiri -Hanging Lantern=Lantera Bergantung -Ceiling Lantern=Lantera Siling -Lattice lantern (large)=Lantera Kekisi (Besar) -Lattice lantern (small)=Lantera Kekisi (Kecil) -Table Lamp=Lampu Meja -Standing Lamp=Lampu Berdiri -Desk Lamp=Lampu Meja Kerja -Ceiling Lamp=Lampu Siling -Ceiling Lamp (off)=Lampu Siling (tutup) -Textured Ceiling Paint=Cat Siling Bertekstur -Drop-Ceiling Tile=Kepingan Siling -small=Kecil -large=Besar -persian=Parsi -Rug (@1)=Ambal (@1) -black=Hitam -terracotta=Terracotta -Flower Pot (@1)=Pasu Bunga (@1) -Rose=Ros -Tulip=Tulip -Yellow Dandelion=Dandelion Kuning -White Dandelion=Dandelion Putih -Blue Geranium=Geranium Biru -Viola=Violet -Cactus=Kaktus -Bonsai=Bonsai -Potted flower (@1)=Pasu Berbunga (@1) -Brass Pole=Tiang Loyang -Wrought Iron Pole=Tiang Besi Tempaan -Fishtank=Tangki Ikan -Fishtank (lighted)=Tangki Ikan (Bercahaya) -Cardboard box (big)=Kotak Kadbod (Besar) -Cardboard box=Kotak Kadbod (Kecil) -DVD/CD cabinet=Kabinet DVD/CD -Pool Table=Meja Pool -Piano=Piano -Trophy=Trofi -Sport bench=Bangku Angkat Berat -Skateboard=Papan Luncur -Metal tool cabinet and work table=Kabinet Alatan Logam dan Meja Kerja -Picture Frame =Bingkai Gambar -dark topped=atasan gelap -diagonal=pepenjuru -horizontal=mendatar -Banister for Stairs (@1, @2)=Selusur Tangga (@1, @2) -not enough space=Tidak cukup ruang -Filing cabinet=Kabinet Pemfailan -Desk=Meja Kerja -Desk globe=Glob Dunia -Calendar=Kalendar -Date (right-click to update):@n@1=Tarikh (klik-kanan untuk kemaskini):@n@1 -Basic office chair=Kerusi Pejabat Biasa -Upscale office chair=Kerusi Pejabat Besar -Glass Skylight=Bumbung Kaca -Glass Skylight Frosted=Bumbung Kaca Berkabut -asphalt=Asfalt -Shingles (@1)=Genting (@1) -@1 (outer corner)=@1 (bucu luar) -@1 (inner corner)=@1 (bucu dalam) -Wood Shingles=Genting Kayu -Asphalt Shingles=Genting Asfalt -Terracotta Shingles=Genting Terracotta -Glass Shingles=Genting Kaca -Chimney=Serombong -Wooden Shutter=Pengatup Kayu -Small square glass table=Kaca Meja Segi Empat Kecil -Small round glass table=Kaca Meja Bulat Kecil -Large glass table piece=Kepingan Kaca Meja Besar -Small square wooden table=Kepingan Meja Kayu Segi Empat Kecil -Small round wooden table=Kepingan Meja Kayu Bulat Kecil -Large wooden table piece=Kepingan Meja Kayu Besar -Utility Table=Kepingan Meja Utiliti -Table Legs (@1)=Kaki Meja (@1) -Legs for Utility Table=Kaki untuk Meja Utiliti -Green Trash Can=Tong Sampah Hijau -Trash Can=Tong Sampah -Small Trash Can=Tong Sampah Kecil -Wardrobe=Almari Pakaian -Clothes=Pakaian -Storage=Simpanan -Window (quartered)=Tingkap (Berpalang) -Window (plain)=Tingkap (Biasa) -Window Blinds (thick)=Bidai Tingkap (Tebal) -Window Blinds (thin)=Bidai Tingkap (Nipis) -Curtains=Langsir -Curtains (open)=Langsir (Terbuka) -Curtain Rod (@1)=Alang Langsir -Window flowerbox=Kotak Bunga Tingkap -Stained Glass=Kaca Berwarna -Mailbox=Peti Surat -@1's Mailbox=Peti Surat @1 -Item frame=Bingkai Item -Item frame (owned by @1)=Bingkai Item (hak milik @1) -Pedestal=Kekaki -Pedestal (owned by @1)=Kekaki (hak milik @1) -Lava Lamp=Lampu Lava -Lava Lamp (off)=Lampu Lava (tutup) -Coffee Table=Meja Kopi -No room to place the coffee table!=Tiada ruang untuk letak meja kopi! -End Table=Meja Hujung -Someone else owns the spot where other end goes!=Tempat untuk letak hujung objek itu kawasan kepunyaan orang lain! -Someone else owns the spot where the middle or far end goes!=Tempat untuk letak pertengahan atau hujung objek itu kawasan kepunyaan orang lain! -Someone else owns the spot where the other end goes!=Tempat untuk letak hujung objek itu kawasan kepunyaan orang lain! -Long Sofa=Sofa Panjang -No room to place the sofa!=Tiada ruang untuk letak sofa! -Sofa=Sofa -Plasma Screen TV Stand=Kaki TV Plasma -Plasma TV=TV Plasma -Plasma TV (off)=TV Plasma (tutup) -Grass=Rumput -Roofing=Bahan Bumbung -Marble stair=Tangga Marmar -Marble slab=Bidur Marmar -Hardwood stair=Tangga Kayu Keras -Hardwood slab=Bidur Kayu Keras -Grass stair=Tangga Rumput -Grass slab=Bidur Rumput -Tar stair=Tangga Tar -Tar slab=Bidur Tar -Grate Stair=Tangga Jeriji -Grate Slab=Bidur Jeriji -Adobe stair=Tangga Adob -Adobe slab=Bidur Adob -Roofing stair=Tangga Bahan Bumbung -Roofing slab=Bidur Bahan Bumbung -Fake fire=Api Tiruan -Flint and steel=Pemetik Api -This area is protected!=Kawasan ini dilindungi! -white=putih -pink=merah jambu -dark green=Hijau Gelap -white/grey=putih -white/red=putih -white/blue=putih -white/tan=putih -light blue=kanan -Armchair (@1)=Kerusi Tangan (%s) -dark_grey=Hijau Gelap -dark_green=Hijau Gelap -%s moves stuff in kitchen cabinet at %s =%s pindah barang dalam kabinet dapur dekat %s -%s moves stuff to kitchen cabinet at %s =%s pindah barang masuk kabinet dapur dekat %s -%s takes stuff from kitchen cabinet at %s =%s ambil barang dari kabinet dapur dekat %s -(Top Half, %s-opening) =(Separuh Atas, bukaan %s) -(%s-opening) =(Bukaan %s) -Not enough space above that spot to place a door! =Tidak cukup ruang di atas kawasan untuk letak pintu! -Bucket of white paint =Baldi cat putih -Legs for Small Utility table =Kaki untuk Meja Utiliti Kecil -Titanium Dioxide =Titanium Dioksida -Wrought Iron Fence/railing with sign =Pagar/Kisi-kisi Besi Tempaan dengan Papan Tanda -want to simply place the wielded item like usual. =ingin letakkan barangan yang diacukan seperti biasa. -Red =Merah -Pink =Merah Jambu -Blue =Biru -Sink =Sinki -Taps =Pili Air -Asphalt Shingles (outer corner) =Genting Asfalt (bucu luar) -Asphalt Shingles (inner corner) =Genting Asfalt (bucu dalam) -Wrought Iron Table Legs =Kaki Meja Besi Tempaan -Glass Table (Small, Round) =Meja Kaca (Bulat, Kecil) -Glass Table (Small, Square) =Meja Kaca (Segi Empat, Kecil) -Glass Table Piece (large) =Kepingan Meja Kaca (besar) -Green Plastic Flower Pot =Pasu Bunga Plastik Hijau -Large Area Rug =Ambal Kawasan Besar -Small Throw Rug =Ambal Kecil -Terracotta Flower Pot =Pasu Bunga Terracotta -Terracotta Shingles (outer corner) =Genting Terracotta (bucu luar) -Terracotta Shingles (inner corner) =Genting Terracotta (bucu dalam) -Utility table mk2 =Meja utiliti mk2 -Wooden Shutter (Black) =Pengatup Kayu (Hitam) -Wooden Shutter (Dark grey) =Pengatup Kayu (Kelabu Gelap) -Wooden Shutter (Forest green) =Pengatup Kayu (Hijau Rimba) -Wooden Shutter (Grey) =Pengatup Kayu (Kelabu) -Wooden Shutter (Light blue) =Pengatup Kayu (Biru Cerah) -Wooden Shutter (Violet) =Pengatup Kayu (Ungu) -Wooden Shutter (Mahogany) =Pengatup Kayu (Mahogani) -Wooden Shutter (Unpainted oak) =Pengatup Kayu (Oak tak bercat) -Wooden Shutter (White) =Pengatup Kayu (Putih) -Wooden Shutter (Yellow) =Pengatup Kayu (Kuning) -Wood Table Piece (large)=Kepingan Meja Kayu (besar) -Wood Table (Small, Round) =Meja Kayu (Bulat, Kecil) -Wood Table (Small, Square) =Meja Kayu (Segi Empat, Kecil) -someone =seseorang -White Glowlight (small cube) =Lampu Bara Putih (kiub kecil) -White Glowlight (small cube, on ceiling) =Lampu Bara Putih (kiub kecil, dekat siling) -White Glowlight (thick, on wall) =Lampu Bara Putih (tebal, dekat dinding) -White Glowlight (thin, on wall) =Lampu Bara Putih (nipis, dekat dinding) -Yellow Glowlight (small cube, on ceiling) =Lampu Bara Kuning (kiub kecil, dekat siling) -Yellow Glowlight (thick) =Lampu Bara Kuning (tebal) -Yellow Glowlight (thick, on wall) =Lampu Bara Kuning (tebal, dekat dinding) -Yellow Glowlight (thin) =Lampu Bara Kuning (nipis) -Yellow Glowlight (thin, on wall) =Lampu Bara Kuning (nipis, dekat dinding) -Locked Fridge =Peti Sejuk Berkunci -Locked Cabinet =Kabinet Berkunci -Locked Nightstand =Kabinet Katil Berkunci -Locked Oven =Ketuhar Berkunci -Locked Oven (active) =Ketuhar Berkunci (aktif) -Locked Microwave Oven =Ketuhar Gelombang Mikro Berkunci -Locked Microwave Oven (active) =Ketuhar Gelombang Mikro Berkunci (aktif) -Mahogany Nightstand with One Drawer =Kabinet Katil Mahogani dengan Satu Laci -Mahogany Nightstand with Two Drawers =Kabinet Katil Mahogani dengan Dua Laci -%s moves stuff to nightstand at %s =%s pindah barang masuk kabinet katil dekat %s -%s takes stuff from nightstand at %s =%s ambil barang dari kabinet katil dekat %s -%s is empty =%s tiada apa-apa -%s moves stuff in refrigerator at %s =%s pindah barang dalam peti sejuk dekat %s -%s moves stuff to refrigerator at %s =%s pindah barang masuk peti sejuk dekat %s -%s takes stuff from refrigerator at %s =%s ambil barang dari peti sejuk dekat %s -%s wrote "%s" to sign at %s =%s menulis "%s" pada papan tanda dekat %s -Reading cached character database. =Sedang membaca pangkalan data watak yang di-cache. -Font seems to have changed. Rebuilding cache. =Nampaknya fon tulisan berubah. Membina semula cache. -Registered %s and %s =Dah daftarkan %s dan %s -signs loaded =papan tanda telah dimuatkan +Decorative painting #@1= +Blank Canvas=Kanvas Kosong diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt.tr index 5c52b914..00f38759 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Tela Branca -Decorative painting #@1= Picture Frame @1=Quadro de Foto @1 +Decorative painting #@1= +Blank Canvas=Tela Branca diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt_BR.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt_BR.tr index 5c52b914..00f38759 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.pt_BR.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Tela Branca -Decorative painting #@1= Picture Frame @1=Quadro de Foto @1 +Decorative painting #@1= +Blank Canvas=Tela Branca diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ru.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ru.tr index cd40ccf0..f3be12dd 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ru.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.ru.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=Пустой холст -Decorative painting #@1= Picture Frame @1=Рамка для картины @1 +Decorative painting #@1= +Blank Canvas=Пустой холст diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.zh_CN.tr b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.zh_CN.tr index 69a2a642..606d0a45 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/homedecor_pictures_and_paintings.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas=空白画布 -Decorative painting #@1= Picture Frame @1=相框 @1 +Decorative painting #@1= +Blank Canvas=空白画布 diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/template.txt b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/template.txt index 2aeac019..d19a6f03 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_pictures_and_paintings - - -### init.lua ### - -Blank Canvas= -Decorative painting #@1= Picture Frame @1= +Decorative painting #@1= +Blank Canvas= diff --git a/mods/homedecor_modpack/homedecor_pictures_and_paintings/mod.conf b/mods/homedecor_modpack/homedecor_pictures_and_paintings/mod.conf index 2041ba83..6f6a7644 100644 --- a/mods/homedecor_modpack/homedecor_pictures_and_paintings/mod.conf +++ b/mods/homedecor_modpack/homedecor_pictures_and_paintings/mod.conf @@ -1,3 +1,3 @@ name = homedecor_pictures_and_paintings description = Homedecor mod: pictures and paintings -depends = homedecor_common, default, dye +depends = homedecor_common diff --git a/mods/homedecor_modpack/plasmascreen/init.lua b/mods/homedecor_modpack/homedecor_plasmascreen/init.lua similarity index 71% rename from mods/homedecor_modpack/plasmascreen/init.lua rename to mods/homedecor_modpack/homedecor_plasmascreen/init.lua index 4f76bf41..d03da70d 100644 --- a/mods/homedecor_modpack/plasmascreen/init.lua +++ b/mods/homedecor_modpack/homedecor_plasmascreen/init.lua @@ -1,10 +1,10 @@ -local S = minetest.get_translator("plasmascreen") +local S = minetest.get_translator("homedecor_plasmascreen") local sc_disallow = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil -minetest.register_node("plasmascreen:stand", { +homedecor.register("tv_stand", { description = S("Plasma Screen TV Stand"), - tiles = {"plasmascreen_back.png"}, + tiles = {"homedecor_plasmascreen_back.png"}, paramtype = "light", paramtype2 = "facedir", drawtype = "nodebox", @@ -24,15 +24,17 @@ minetest.register_node("plasmascreen:stand", { } }, groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2}, + crafts = { + { + recipe = { + {'', '', ''}, + {'', 'steel_ingot', ''}, + {'group:stick', 'coal_lump', 'group:stick'}, + } + } + } }) -minetest.register_alias("plasmascreen:screen1", "air") -minetest.register_alias("plasmascreen:screen2", "air") -minetest.register_alias("plasmascreen:screen3", "air") -minetest.register_alias("plasmascreen:screen4", "air") -minetest.register_alias("plasmascreen:screen5", "plasmascreen:tv") -minetest.register_alias("plasmascreen:screen6", "air") - local fdir_to_left = { { -1, 0 }, { 0, 1 }, @@ -95,13 +97,13 @@ local function checkwall(pos) return true end -minetest.register_node("plasmascreen:tv", { +homedecor.register("tv", { description = S("Plasma TV"), drawtype = "mesh", - mesh = "plasmascreen_tv.obj", + mesh = "homedecor_plasmascreen_tv.obj", tiles = { - "plasmascreen_case.png", - { name="plasmascreen_video.png", + "homedecor_plasmascreen_case.png", + { name="homedecor_plasmascreen_video.png", animation={ type="vertical_frames", aspect_w = 42, @@ -111,8 +113,8 @@ minetest.register_node("plasmascreen:tv", { } }, - inventory_image = "plasmascreen_tv_inv.png", - wield_image = "plasmascreen_tv_inv.png", + inventory_image = "homedecor_plasmascreen_tv_inv.png", + wield_image = "homedecor_plasmascreen_tv_inv.png", paramtype = "light", paramtype2 = "facedir", light_source = 10, @@ -127,20 +129,33 @@ minetest.register_node("plasmascreen:tv", { end end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - minetest.set_node(pos, {name = "plasmascreen:tv_off", param2 = node.param2}) - end + minetest.set_node(pos, {name = "homedecor:tv_off", param2 = node.param2}) + end, + crafts = { + { + recipe = { + {'glass_block', 'coal_lump', 'glass_block'}, + {'steel_ingot', 'copper_ingot', 'steel_ingot'}, + {'glass_block', 'glass_block', 'glass_block'}, + } + }, + { + type = "shapeless", + recipe = {'homedecor:television', 'homedecor:television'}, + } + } }) -minetest.register_node("plasmascreen:tv_off", { +homedecor.register("tv_off", { description = S("Plasma TV (off)"), drawtype = "mesh", - mesh = "plasmascreen_tv.obj", + mesh = "homedecor_plasmascreen_tv.obj", tiles = { - "plasmascreen_case_off.png", - "plasmascreen_screen_off.png", + "homedecor_plasmascreen_case_off.png", + "homedecor_plasmascreen_screen_off.png", }, - inventory_image = "plasmascreen_tv_inv.png", - wield_image = "plasmascreen_tv_inv.png", + inventory_image = "homedecor_plasmascreen_tv_inv.png", + wield_image = "homedecor_plasmascreen_tv_inv.png", paramtype = "light", paramtype2 = "facedir", light_source = 10, @@ -155,33 +170,17 @@ minetest.register_node("plasmascreen:tv_off", { end end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - minetest.set_node(pos, {name = "plasmascreen:tv", param2 = node.param2}) + minetest.set_node(pos, {name = "homedecor:tv", param2 = node.param2}) end, - drop = "plasmascreen:tv" + drop = "homedecor:tv", }) --- crafting recipes - -minetest.register_craft({ - output = "plasmascreen:tv", - recipe = { - {'default:glass', 'default:coal_lump', 'default:glass'}, - {'default:steel_ingot', 'default:copper_ingot', 'default:steel_ingot'}, - {'default:glass', 'default:glass', 'default:glass'}, - } -}) - -minetest.register_craft({ - type = "shapeless", - output = "plasmascreen:tv", - recipe = {'homedecor:television', 'homedecor:television'}, -}) - -minetest.register_craft({ - output = "plasmascreen:stand", - recipe = { - {'', '', ''}, - {'', 'default:steel_ingot', ''}, - {'group:stick', 'default:coal_lump', 'group:stick'}, - } -}) +minetest.register_alias("plasmascreen:screen1", "air") +minetest.register_alias("plasmascreen:screen2", "air") +minetest.register_alias("plasmascreen:screen3", "air") +minetest.register_alias("plasmascreen:screen4", "air") +minetest.register_alias("plasmascreen:screen6", "air") +minetest.register_alias("plasmascreen:screen5", "homedecor:tv") +minetest.register_alias("plasmascreen:stand", "homedecor:tv_stand") +minetest.register_alias("plasmascreen:tv", "homedecor:tv") +minetest.register_alias("plasmascreen:tv_off", "homedecor:tv_off") \ No newline at end of file diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.de.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.de.tr similarity index 72% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.de.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.de.tr index 9b808c87..1089f6c6 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.de.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.de.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Plasmafernseherbildschirmständer Plasma TV=Plasmafernseher Plasma TV (off)=Plasmafernseher (aus) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.es.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.es.tr similarity index 75% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.es.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.es.tr index 53562e97..f142da21 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.es.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.es.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Mesa para televisión de pantalla de plasma Plasma TV=Televisión de plasma Plasma TV (off)=Televisión de plasma (apagada) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.fr.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.fr.tr similarity index 70% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.fr.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.fr.tr index 64766166..5994e5a2 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.fr.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.fr.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Télévision sur pied Plasma TV=Écran TV géant Plasma TV (off)=Écran TV géant (éteint) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ms.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ms.tr similarity index 66% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ms.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ms.tr index 86944ca4..8436baac 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ms.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ms.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Kaki TV Plasma Plasma TV=TV Plasma Plasma TV (off)=TV Plasma (tutup) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt.tr similarity index 70% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt.tr index 26036e50..8a8416df 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Suporte de TV de Plasma Plasma TV=TV de Plasma Plasma TV (off)=TV de Plasma (desligada) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt_BR.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt_BR.tr similarity index 70% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt_BR.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt_BR.tr index 26036e50..8a8416df 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.pt_BR.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Suporte de TV de Plasma Plasma TV=TV de Plasma Plasma TV (off)=TV de Plasma (desligada) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ru.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ru.tr similarity index 82% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ru.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ru.tr index cfb58739..7219b71e 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.ru.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.ru.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=Подставка для плазменного телевизора Plasma TV=Плазменный телевизор Plasma TV (off)=Плазменный телевизор (выключен) diff --git a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.zh_CN.tr b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.zh_CN.tr similarity index 68% rename from mods/homedecor_modpack/plasmascreen/locale/plasmascreen.zh_CN.tr rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.zh_CN.tr index 55f15e45..096f1b94 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/plasmascreen.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/plasmascreen.zh_CN.tr @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand=液晶电视架 Plasma TV=液晶电视 Plasma TV (off)=液晶电视(关闭) diff --git a/mods/homedecor_modpack/plasmascreen/locale/template.txt b/mods/homedecor_modpack/homedecor_plasmascreen/locale/template.txt similarity index 52% rename from mods/homedecor_modpack/plasmascreen/locale/template.txt rename to mods/homedecor_modpack/homedecor_plasmascreen/locale/template.txt index fa3de96f..be10ab31 100644 --- a/mods/homedecor_modpack/plasmascreen/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_plasmascreen/locale/template.txt @@ -1,8 +1,4 @@ -# textdomain: plasmascreen - - -### init.lua ### - +# textdomain: homedecor_plasmascreen Plasma Screen TV Stand= Plasma TV= Plasma TV (off)= diff --git a/mods/homedecor_modpack/homedecor_plasmascreen/mod.conf b/mods/homedecor_modpack/homedecor_plasmascreen/mod.conf new file mode 100644 index 00000000..1d840a25 --- /dev/null +++ b/mods/homedecor_modpack/homedecor_plasmascreen/mod.conf @@ -0,0 +1,3 @@ +name = homedecor_plasmascreen +depends = homedecor_common +optional_depends = screwdriver diff --git a/mods/homedecor_modpack/plasmascreen/models/plasmascreen_tv.obj b/mods/homedecor_modpack/homedecor_plasmascreen/models/homedecor_plasmascreen_tv.obj similarity index 100% rename from mods/homedecor_modpack/plasmascreen/models/plasmascreen_tv.obj rename to mods/homedecor_modpack/homedecor_plasmascreen/models/homedecor_plasmascreen_tv.obj diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_back.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_back.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_back.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_back.png diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_case.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_case.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_case.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_case.png diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_case_off.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_case_off.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_case_off.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_case_off.png diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_screen_off.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_screen_off.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_screen_off.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_screen_off.png diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_tv_inv.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_tv_inv.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_tv_inv.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_tv_inv.png diff --git a/mods/homedecor_modpack/plasmascreen/textures/plasmascreen_video.png b/mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_video.png similarity index 100% rename from mods/homedecor_modpack/plasmascreen/textures/plasmascreen_video.png rename to mods/homedecor_modpack/homedecor_plasmascreen/textures/homedecor_plasmascreen_video.png diff --git a/mods/homedecor_modpack/homedecor_roofing/.luacheckrc b/mods/homedecor_modpack/homedecor_roofing/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_roofing/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_roofing/init.lua b/mods/homedecor_modpack/homedecor_roofing/init.lua index 3c88deaf..123f12bd 100644 --- a/mods/homedecor_modpack/homedecor_roofing/init.lua +++ b/mods/homedecor_modpack/homedecor_roofing/init.lua @@ -5,13 +5,18 @@ homedecor_roofing = {} minetest.register_node(":homedecor:skylight", { description = S("Glass Skylight"), drawtype = "raillike", - tiles = { "default_glass.png" }, - wield_image = "default_glass.png", + tiles = { homedecor.textures.glass.pane }, + wield_image = homedecor.textures.glass.pane, inventory_image = "homedecor_skylight_inv.png", - groups = { snappy = 3 }, + groups = { snappy = 3, dig_tree = 2 , axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, paramtype = "light", - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, selection_box = homedecor.nodebox.slab_y(0.1), + collision_box = homedecor.nodebox.slab_y(0.1), }) minetest.register_node(":homedecor:skylight_frosted", { @@ -20,11 +25,16 @@ minetest.register_node(":homedecor:skylight_frosted", { tiles = { "homedecor_skylight_frosted.png" }, wield_image = "homedecor_skylight_frosted.png", inventory_image = "homedecor_skylight_frosted_inv.png", - use_texture_alpha = true, - groups = { snappy = 3 }, + use_texture_alpha = "blend", + groups = { snappy = 3, dig_tree = 2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, paramtype = "light", - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, selection_box = homedecor.nodebox.slab_y(0.1), + collision_box = homedecor.nodebox.slab_y(0.1), }) for s, s_loc in pairs({ ["asphalt"] = S("asphalt"), ["terracotta"] = S("terracotta"), ["wood"] = S("wood") }) do @@ -36,8 +46,12 @@ for s, s_loc in pairs({ ["asphalt"] = S("asphalt"), ["terracotta"] = S("terracot inventory_image = "homedecor_shingles_"..s.."_inv.png", paramtype = "light", walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree = 2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = homedecor.nodebox.slab_y(0.1), }) end @@ -81,6 +95,7 @@ homedecor_roofing.register_outer_corner = function(modname, subname, groups, slo if type(slope_image) ~= "table" then tiles = { "homedecor_slope_outer_corner_"..slope_image..".png" } end + groups.axey=5 minetest.register_node(":"..modname..":shingle_outer_corner_" .. subname, { description = S("@1 (outer corner)", description), @@ -92,8 +107,12 @@ homedecor_roofing.register_outer_corner = function(modname, subname, groups, slo selection_box = ocorner_cbox, collision_box = ocorner_cbox, groups = groups, + is_ground_content = false, + _mcl_hardness=1.6, on_place = minetest.rotate_node, - sounds = default.node_sound_wood_defaults() + _sound_def = { + key = "node_sound_wood_defaults", + }, }) end @@ -103,6 +122,7 @@ homedecor_roofing.register_inner_corner = function(modname, subname, groups, slo if type(slope_image) ~= "table" then tiles = { "homedecor_slope_outer_corner_"..slope_image..".png" } end + groups.axey=5 minetest.register_node(":"..modname..":shingle_inner_corner_" .. subname, { description = S("@1 (inner corner)", description), @@ -113,8 +133,12 @@ homedecor_roofing.register_inner_corner = function(modname, subname, groups, slo paramtype2 = "facedir", collision_box = icorner_cbox, groups = groups, + is_ground_content = false, + _mcl_hardness=1.6, on_place = minetest.rotate_node, - sounds = default.node_sound_wood_defaults() + _sound_def = { + key = "node_sound_wood_defaults", + }, }) end @@ -124,6 +148,7 @@ homedecor_roofing.register_slope = function(modname, subname, recipeitem, groups if type(slope_image) ~= "table" then tiles = { "homedecor_slope_outer_corner_"..slope_image..".png" } end + groups.axey=5 minetest.register_node(":"..modname..":shingle_side_" .. subname, { description = description, @@ -134,9 +159,14 @@ homedecor_roofing.register_slope = function(modname, subname, recipeitem, groups paramtype2 = "facedir", selection_box = slope_cbox, collision_box = slope_cbox, + use_texture_alpha = "blend", groups = groups, + is_ground_content = false, + _mcl_hardness=1.6, on_place = minetest.rotate_node, - sounds = default.node_sound_wood_defaults() + _sound_def = { + key = "node_sound_wood_defaults", + }, }) -- convert between flat shingles and slopes @@ -259,19 +289,19 @@ end -- corners homedecor_roofing.register_roof("homedecor", "wood", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_wood.png" }, S("Wood Shingles") ) homedecor_roofing.register_roof("homedecor", "asphalt", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_asphalt.png" }, S("Asphalt Shingles") ) homedecor_roofing.register_roof("homedecor", "terracotta", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_terracotta.png" }, S("Terracotta Shingles") ) @@ -280,46 +310,57 @@ homedecor_roofing.register_roof("homedecor", "terracotta", homedecor_roofing.register_slope("homedecor", "wood", "homedecor:shingles_wood", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_wood.png" }, S("Wood Shingles") ) homedecor_roofing.register_slope("homedecor", "asphalt", "homedecor:shingles_asphalt", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_asphalt.png" }, S("Asphalt Shingles") ) homedecor_roofing.register_slope("homedecor", "terracotta", "homedecor:shingles_terracotta", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_terracotta.png" }, S("Terracotta Shingles") ) homedecor_roofing.register_slope("homedecor", "glass", "homedecor:shingles_glass", - { snappy = 3 }, + { snappy = 3, dig_tree = 2 }, { "homedecor_shingles_glass.png", "homedecor_shingles_wood.png" }, S("Glass Shingles") ) +local brick_tex = homedecor.textures.brick homedecor.register("chimney", { description = S("Chimney"), mesh = "homedecor_chimney.obj", tiles = { "homedecor_chimney_tb.png", - "default_brick.png" + brick_tex }, selection_box = homedecor.nodebox.bar_y(0.25), - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults() + groups = {cracky=3, dig_tree = 2}, + _sound_def = { + key = "node_sound_stone_defaults", + }, }) -- crafting +minetest.register_craft({ + output = "homedecor:chimney 2", + recipe = { + { "default:clay_brick", "", "default:clay_brick" }, + { "default:clay_brick", "", "default:clay_brick" }, + { "default:clay_brick", "", "default:clay_brick" }, + }, +}) minetest.register_craft( { output = "homedecor:skylight 4", diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.de.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.de.tr index 01741266..005f347f 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.de.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.de.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (Innenecke) -@1 (outer corner)=@1 (Aussenecke) -Asphalt Shingles=Asphaltschindeln -Chimney=Schornstein -Glass Shingles=Glasschindeln Glass Skylight=Glasdachfenster Glass Skylight Frosted=Milchglasdachfenster -Shingles (@1)=Schindeln (@1) -Terracotta Shingles=Terrakottaschindeln -Wood Shingles=Holzschindeln asphalt=Asphalt terracotta=Terrakotta wood=Holz +Shingles (@1)=Schindeln (@1) +@1 (outer corner)=@1 (Aussenecke) +@1 (inner corner)=@1 (Innenecke) +Wood Shingles=Holzschindeln +Asphalt Shingles=Asphaltschindeln +Terracotta Shingles=Terrakottaschindeln +Glass Shingles=Glasschindeln +Chimney=Schornstein diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.es.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.es.tr index dbec9c88..4552d38a 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.es.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.es.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (esquina interior) -@1 (outer corner)=@1 (esquina exterior) -Asphalt Shingles=Tejado de asfalto -Chimney=Chimenea -Glass Shingles=Claraboya de cristal Glass Skylight=Claraboya de cristal Glass Skylight Frosted=Claraboya de cristal esmerilado -Shingles (@1)=Tejas (@1) -Terracotta Shingles=Tejado de terracota -Wood Shingles=Tejado de madera asphalt=asfalto terracotta=terracota wood=madera +Shingles (@1)=Tejas (@1) +@1 (outer corner)=@1 (esquina exterior) +@1 (inner corner)=@1 (esquina interior) +Wood Shingles=Tejado de madera +Asphalt Shingles=Tejado de asfalto +Terracotta Shingles=Tejado de terracota +Glass Shingles=Claraboya de cristal +Chimney=Chimenea diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.fr.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.fr.tr index 482d1bf8..355b934c 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.fr.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.fr.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (coin intérieur) -@1 (outer corner)=@1 (coin extérieur) -Asphalt Shingles=Bardeaux d'asphalte -Chimney=Cheminée -Glass Shingles=Bardeaux de verre Glass Skylight=Lucarne en verre Glass Skylight Frosted=Lucarne en verre givrée -Shingles (@1)=Bardeaux (@1) -Terracotta Shingles=Bardeaux de terre cuite -Wood Shingles=Bardeaux de bois asphalt=asphalte terracotta=terre cuite wood=bois +Shingles (@1)=Bardeaux (@1) +@1 (outer corner)=@1 (coin extérieur) +@1 (inner corner)=@1 (coin intérieur) +Wood Shingles=Bardeaux de bois +Asphalt Shingles=Bardeaux d'asphalte +Terracotta Shingles=Bardeaux de terre cuite +Glass Shingles=Bardeaux de verre +Chimney=Cheminée diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.it.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.it.tr index 70cee243..3f376b47 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.it.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.it.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=Tegole in legno (angolo interno) -@1 (outer corner)=Tegole in legno (angolo esterno) -Asphalt Shingles=Mattonelle di asfalto -Chimney= -Glass Shingles=Mattonelle di asfalto Glass Skylight=Lucernario di vetro Glass Skylight Frosted=Lucernario di vetro satinato -Shingles (@1)=Tegole in legno -Terracotta Shingles=Tegole di terracotta -Wood Shingles=Tegole in legno asphalt= terracotta=Tegole di terracotta wood= +Shingles (@1)=Scandole del tetto (@1) +@1 (outer corner)=@1 (angolo esterno) +@1 (inner corner)=@1 (angolo interno) +Wood Shingles=Tegole in legno +Asphalt Shingles=Mattonelle di asfalto +Terracotta Shingles=Tegole di terracotta +Glass Shingles=Mattonelle di asfalto +Chimney= diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ms.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ms.tr index b83978b0..5f71ae66 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ms.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ms.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (bucu dalam) -@1 (outer corner)=@1 (bucu luar) -Asphalt Shingles=Genting Asfalt -Chimney=Serombong -Glass Shingles=Genting Kaca Glass Skylight=Bumbung Kaca Glass Skylight Frosted=Bumbung Kaca Berkabut -Shingles (@1)=Genting (@1) -Terracotta Shingles=Genting Terracotta -Wood Shingles=Genting Kayu asphalt=Asfalt terracotta=Terracotta wood=Kayu +Shingles (@1)=Genting (@1) +@1 (outer corner)=@1 (bucu luar) +@1 (inner corner)=@1 (bucu dalam) +Wood Shingles=Genting Kayu +Asphalt Shingles=Genting Asfalt +Terracotta Shingles=Genting Terracotta +Glass Shingles=Genting Kaca +Chimney=Serombong diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt.tr index 3c774ea4..d29f79d1 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (canto interno) -@1 (outer corner)=@1 (canto externo) -Asphalt Shingles=Telhas de Asfalto -Chimney=Chaminé -Glass Shingles=Telhas de Vidro Glass Skylight=Claraboia de Vidro Glass Skylight Frosted=Claraboia de Vidro Fosco -Shingles (@1)=Telhas (@1) -Terracotta Shingles=Telhas de Terracota -Wood Shingles=Telhas de Madeira asphalt=asfalto terracotta=terracota wood=madeira +Shingles (@1)=Telhas (@1) +@1 (outer corner)=@1 (canto externo) +@1 (inner corner)=@1 (canto interno) +Wood Shingles=Telhas de Madeira +Asphalt Shingles=Telhas de Asfalto +Terracotta Shingles=Telhas de Terracota +Glass Shingles=Telhas de Vidro +Chimney=Chaminé diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt_BR.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt_BR.tr index 3c774ea4..d29f79d1 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.pt_BR.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (canto interno) -@1 (outer corner)=@1 (canto externo) -Asphalt Shingles=Telhas de Asfalto -Chimney=Chaminé -Glass Shingles=Telhas de Vidro Glass Skylight=Claraboia de Vidro Glass Skylight Frosted=Claraboia de Vidro Fosco -Shingles (@1)=Telhas (@1) -Terracotta Shingles=Telhas de Terracota -Wood Shingles=Telhas de Madeira asphalt=asfalto terracotta=terracota wood=madeira +Shingles (@1)=Telhas (@1) +@1 (outer corner)=@1 (canto externo) +@1 (inner corner)=@1 (canto interno) +Wood Shingles=Telhas de Madeira +Asphalt Shingles=Telhas de Asfalto +Terracotta Shingles=Telhas de Terracota +Glass Shingles=Telhas de Vidro +Chimney=Chaminé diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ru.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ru.tr index 5b22b9b1..67fbcfa6 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ru.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.ru.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1 (внутренний угол) -@1 (outer corner)=@1 (внешний угол) -Asphalt Shingles=Асфальтовая черепица -Chimney=Дымоход -Glass Shingles=Стеклянная черепица Glass Skylight=Стеклянный люк Glass Skylight Frosted=Матовый стеклянный люк -Shingles (@1)=Черепица (@1) -Terracotta Shingles=Терракотовая черепица -Wood Shingles=Деревянная черепица asphalt=асфальт terracotta=терракотовый wood=дерево +Shingles (@1)=Черепица (@1) +@1 (outer corner)=@1 (внешний угол) +@1 (inner corner)=@1 (внутренний угол) +Wood Shingles=Деревянная черепица +Asphalt Shingles=Асфальтовая черепица +Terracotta Shingles=Терракотовая черепица +Glass Shingles=Стеклянная черепица +Chimney=Дымоход diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.zh_CN.tr b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.zh_CN.tr index 0eba4758..29fd09f8 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_roofing/locale/homedecor_roofing.zh_CN.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)=@1(内角) -@1 (outer corner)=@1(外角) -Asphalt Shingles=沥青瓦 -Chimney=烟囱 -Glass Shingles=玻璃瓦 Glass Skylight=玻璃天窗 Glass Skylight Frosted=磨砂玻璃天窗 -Shingles (@1)=瓦(@1) -Terracotta Shingles=陶瓦 -Wood Shingles=木头瓦 asphalt=沥青 terracotta=陶土 wood=木材 +Shingles (@1)=瓦(@1) +@1 (outer corner)=@1(外角) +@1 (inner corner)=@1(内角) +Wood Shingles=木头瓦 +Asphalt Shingles=沥青瓦 +Terracotta Shingles=陶瓦 +Glass Shingles=玻璃瓦 +Chimney=烟囱 diff --git a/mods/homedecor_modpack/homedecor_roofing/locale/template.txt b/mods/homedecor_modpack/homedecor_roofing/locale/template.txt index 35ee14d2..8e57e7bc 100644 --- a/mods/homedecor_modpack/homedecor_roofing/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_roofing/locale/template.txt @@ -1,18 +1,14 @@ # textdomain: homedecor_roofing - - -### init.lua ### - -@1 (inner corner)= -@1 (outer corner)= -Asphalt Shingles= -Chimney= -Glass Shingles= Glass Skylight= Glass Skylight Frosted= -Shingles (@1)= -Terracotta Shingles= -Wood Shingles= asphalt= terracotta= wood= +Shingles (@1)= +@1 (outer corner)= +@1 (inner corner)= +Wood Shingles= +Asphalt Shingles= +Terracotta Shingles= +Glass Shingles= +Chimney= diff --git a/mods/homedecor_modpack/homedecor_roofing/mod.conf b/mods/homedecor_modpack/homedecor_roofing/mod.conf index 2457e4cf..7bca6cb6 100644 --- a/mods/homedecor_modpack/homedecor_roofing/mod.conf +++ b/mods/homedecor_modpack/homedecor_roofing/mod.conf @@ -1,3 +1,3 @@ name = homedecor_roofing description = Homedecor mod: roofing -depends = homedecor_common, default, dye +depends = homedecor_common diff --git a/mods/homedecor_modpack/homedecor_seating/.luacheckrc b/mods/homedecor_modpack/homedecor_seating/.luacheckrc deleted file mode 100644 index afda9303..00000000 --- a/mods/homedecor_modpack/homedecor_seating/.luacheckrc +++ /dev/null @@ -1,23 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "creative", - "default", - "homedecor", - "unifieddyes", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_seating/README.txt b/mods/homedecor_modpack/homedecor_seating/README.txt deleted file mode 100644 index c86df3c2..00000000 --- a/mods/homedecor_modpack/homedecor_seating/README.txt +++ /dev/null @@ -1,67 +0,0 @@ -Living Room Furniture (lrfurn) mod for Minetest - - -by thefamilygrog66 - -Description: -Coloured Long Sofas (3 blocks wide), Sofas (2 blocks wide), Armchairs, Coffee Tables and End Tables, loosely based on PilzAdam's beds mod. There are 9 colours in all: red, orange, yellow, green, blue, violet, black, grey and white. - -When you right-click on a long sofa, sofa or armchair, it transports you onto it, and replenishes your HP. Good if you've just escaped nasty mobs, didn't fare so well in battle, or just had a bad fall. The coffee table - which isn't coloured, just wooden - is pretty much just for decoration. It stands half a block high and nearly 2 blocks long. The end table is similar to the coffee table, though roughly half the length (i.e. only one block) and square. - -Recipes: - - Long Sofa - - +---------------+---------------+---------------+ - | coloured wool | coloured wool | coloured wool | - +---------------+---------------+---------------+ - | wood slab | wood slab | wood slab | - +---------------+---------------+---------------+ - | stick | stick | stick | - +---------------+---------------+---------------+ - - Sofa - - +---------------+---------------+-------+ - | coloured wool | coloured wool | | - +---------------+---------------+-------+ - | wood slab | wood slab | | - +---------------+---------------+-------+ - | stick | stick | | - +---------------+---------------+-------+ - - Armchair - - +---------------+-------+-------+ - | coloured wool | | | - +---------------+-------+-------+ - | wood slab | | | - +---------------+-------+-------+ - | stick | | | - +---------------+-------+-------+ - - Coffee Table (only wood texture) - - +-----------+-----------+-----------+ - | | | | - +-----------+-----------+-----------+ - | wood slab | wood slab | wood slab | - +-----------+-----------+-----------+ - | stick | | stick | - +-----------+-----------+-----------+ - - End Table (only wood texture) - - +-----------+-----------+-----------+ - | | | | - +-----------+-----------+-----------+ - | wood slab | wood slab | | - +-----------+-----------+-----------+ - | stick | stick | | - +-----------+-----------+-----------+ - - -Mod dependencies: default, wool - -See also: -http://minetest.net/ diff --git a/mods/homedecor_modpack/homedecor_seating/armchairs.lua b/mods/homedecor_modpack/homedecor_seating/armchairs.lua index 609ce827..2c7d1c3b 100644 --- a/mods/homedecor_modpack/homedecor_seating/armchairs.lua +++ b/mods/homedecor_modpack/homedecor_seating/armchairs.lua @@ -19,8 +19,12 @@ minetest.register_node(":lrfurn:armchair", { paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", inventory_image = "lrfurn_armchair_inv.png", - groups = {snappy=3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = armchair_cbox, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) @@ -28,35 +32,36 @@ minetest.register_node(":lrfurn:armchair", { on_dig = unifieddyes.on_dig, on_rotate = unifieddyes.fix_after_screwdriver_nsew, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not clicker:is_player() then - return itemstack - end - pos.y = pos.y-0.5 - clicker:setpos(pos) - clicker:set_hp(20) - return itemstack - end + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) homedecor.register("armchair", { description = S("Armchair"), mesh = "forniture_armchair.obj", tiles = { - "wool_white.png", - { name = "wool_dark_grey.png", color = 0xffffffff }, - { name = "default_wood.png", color = 0xffffffff } + homedecor.textures.wool.white, + { name = homedecor.textures.wool.dark_grey, color = 0xffffffff }, + { name = homedecor.textures.wood.apple.planks, color = 0xffffffff } }, inventory_image = "homedecor_armchair_inv.png", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - groups = {snappy=3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = armchair_cbox, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) end, on_dig = unifieddyes.on_dig, on_rotate = unifieddyes.fix_after_screwdriver_nsew, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) -- crafts @@ -65,7 +70,7 @@ minetest.register_craft({ output = "lrfurn:armchair", recipe = { {"wool:white", "", "", }, - {"stairs:slab_wood", "", "", }, + {homedecor.materials.slab_wood, "", "", }, {"group:stick", "", "", } } }) @@ -93,9 +98,9 @@ unifieddyes.register_color_craft({ minetest.register_craft({ output = "homedecor:armchair 2", recipe = { - { "wool:white",""}, + { homedecor.materials.wool_white,""}, { "group:wood","group:wood" }, - { "wool:white","wool:white" }, + { homedecor.materials.wool_white,homedecor.materials.wool_white }, }, }) diff --git a/mods/homedecor_modpack/homedecor_seating/init.lua b/mods/homedecor_modpack/homedecor_seating/init.lua index 3587e090..c4c0bf9e 100644 --- a/mods/homedecor_modpack/homedecor_seating/init.lua +++ b/mods/homedecor_modpack/homedecor_seating/init.lua @@ -72,12 +72,162 @@ end function lrfurn.fix_sofa_rotation_nsew(pos, placer, itemstack, pointed_thing) local node = minetest.get_node(pos) local colorbits = node.param2 - (node.param2 % 8) - local yaw = placer:get_look_yaw() - local dir = minetest.yaw_to_dir(yaw-1.5) + local yaw = placer:get_look_horizontal() + local dir = minetest.yaw_to_dir(yaw) local fdir = minetest.dir_to_wallmounted(dir) minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) end +local seated_cache = {} + +minetest.register_entity("homedecor_seating:seat", { + initial_properties = { + visual = "cube", + --comment out the following when testing so you can see it + textures = {"blank.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png"}, + collisionbox = { -0.01, -0.01, -0.01, 0.01, 0.01, 0.01 }, + selectionbox = { -0.01, -0.01, -0.01, 0.01, 0.01, 0.01, rotate = false }, + static_save = false, + }, + on_punch = function(self) + self.object:remove() + end, +}) + +--we only care about 4 rotations, but just in case someone worldedits, etc - do something other than crash +--radians are stupid, using degrees and then converting +local p2r = { + 0*math.pi/180, + 0*math.pi/180, --correct + 180*math.pi/180, --correct + 90*math.pi/180, --correct + 270*math.pi/180, --correct + 0*math.pi/180, + 0*math.pi/180, + 0*math.pi/180, +} +p2r[0] = p2r[1] + +local p2r_sofa = { + 0*math.pi/180, + 90*math.pi/180, --correct + 270*math.pi/180, --correct + 180*math.pi/180, --correct + 0*math.pi/180, --correct + 0*math.pi/180, + 0*math.pi/180, + 0*math.pi/180, +} +p2r_sofa[0] = p2r_sofa[1] + +local p2r_facedir = { + [0] = 180*math.pi/180, + [1] = 90*math.pi/180, + [2] = 0*math.pi/180, + [3] = 270*math.pi/180, +} + +function lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, seats) + if not clicker:is_player() then + return itemstack + end + + local name = clicker:get_player_name() + if seated_cache[name] then --already sitting + lrfurn.stand(clicker) + return itemstack + end + + --conversion table for param2 to dir + local p2d = { + vector.new(0, 0, 0), + vector.new(0, 0, -1), + vector.new(0, 0, 1), + vector.new(1, 0, 0), + vector.new(-1, 0, 0), + vector.new(0, 0, 0), + vector.new(0, 0, 0) + } + + --generate posible seat positions + local valid_seats = {[minetest.hash_node_position(pos)] = pos} + if seats > 1 then + for i=1,seats-1 do + --since this are hardware colored nodes, node.param2 gives us a actual param to get a dir from + local npos = vector.add(pos, vector.multiply(p2d[node.param2 % 8], i)) + valid_seats[minetest.hash_node_position(npos)] = npos + end + end + + --see if we can find a non occupied seat + local sit_pos + for hash, spos in pairs(valid_seats) do + local pstatus = false + for _, ref in pairs(minetest.get_objects_inside_radius(spos, 0.5)) do + if ref:is_player() then + pstatus = true + end + end + if not pstatus then sit_pos = spos end + end + if not sit_pos then + minetest.chat_send_player(name, "sorry, this seat is currently occupied") + return itemstack + end + + --seat the player + clicker:set_pos(sit_pos) + + local entity = minetest.add_entity(sit_pos, "homedecor_seating:seat") + if not entity then return itemstack end --catch for when the entity fails to spawn just in case + + clicker:set_attach(entity, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}, true) + local nodedef = minetest.registered_nodes[node.name] + if nodedef.paramtype2 == "facedir" then + entity:set_rotation({x = 0, y = p2r_facedir[node.param2 % 4], z = 0}) + elseif string.find(node.name, "sofa") then + entity:set_rotation({x = 0, y = p2r_sofa[node.param2 % 8], z = 0}) + else + entity:set_rotation({x = 0, y = p2r[node.param2 % 8], z = 0}) + end + + xcompat.player.player_attached[name] = true + xcompat.player.set_animation(clicker, "sit", 0) + seated_cache[name] = minetest.hash_node_position(pos) + + return itemstack +end + +function lrfurn.stand(clicker) + local name = clicker:get_player_name() + xcompat.player.player_attached[name] = false + if seated_cache[name] then + local attached_to = clicker:get_attach() + if attached_to then --check, a stupid clearobjects might have been called, etc + attached_to:remove() --removing also detaches + end + seated_cache[name] = nil + end +end + +function lrfurn.on_seat_destruct(pos) --called when a seat is destroyed + for name, seatpos in pairs(seated_cache) do + if seatpos == minetest.hash_node_position(pos) then + local player = minetest.get_player_by_name(name) + if player then + lrfurn.stand(player) + end + end + end +end + +--if the player gets killed in the seat, handle it +minetest.register_on_dieplayer(function(player) + if seated_cache[player:get_player_name()] then + lrfurn.stand(player) + end +end) + dofile(modpath.."/longsofas.lua") dofile(modpath.."/sofas.lua") dofile(modpath.."/armchairs.lua") diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.de.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.de.tr index 8939d515..6521c68d 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.de.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.de.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Sessel - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Jemanden gehört schon die Stelle, wo das mittlere oder ferne Stück hingehen würde. Someone else owns the spot where the other end goes!=Jemanden gehört schon die Stelle, wo das andere Ende hingehen würde. - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Jemanden gehört schon die Stelle, wo das mittlere oder ferne Stück hingehen würde. Long Sofa=Langes Sofa - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Kein Platz, um das Sofa zu platzieren! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Sofa diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.es.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.es.tr index 54483ade..5ef5a964 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.es.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.es.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Sillón - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Alguien ya es dueño del lugar donde va la cabecera. Someone else owns the spot where the other end goes!=Alguien ya es dueño del lugar donde va la cabecera. - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Alguien ya es dueño del lugar donde va la cabecera. Long Sofa=Sofá largo - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=¡No hay lugar para colocar el sofá! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Sofá diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.fr.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.fr.tr index 5ba01a47..e6d9b3e2 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.fr.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.fr.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Fauteuil - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va le milieu ou l'autre bout ! Someone else owns the spot where the other end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va l'autre bout ! - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va le milieu ou l'autre bout ! Long Sofa=Canapé long - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Pas assez de place pour poser le canapé ! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Canapé diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.it.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.it.tr index 66a37614..bb1d0bc7 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.it.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.it.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Poltrona - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!= Someone else owns the spot where the other end goes!= - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!= Long Sofa= - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!= - -### sofas.lua ### - -Sofa= +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= +Sofa=sofà diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ms.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ms.tr index 71a16813..5a2e8d4e 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ms.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ms.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Kerusi Berlengan - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Tempat untuk letak pertengahan atau hujung objek itu kawasan kepunyaan orang lain! Someone else owns the spot where the other end goes!=Tempat untuk letak hujung objek itu kawasan kepunyaan orang lain! - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Tempat untuk letak pertengahan atau hujung objek itu kawasan kepunyaan orang lain! Long Sofa=Sofa Panjang - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Tiada ruang untuk letak sofa! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Sofa diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt.tr index bfd9a3c7..371eafd3 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Poltrona - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Long Sofa=Sofá Grande - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Sem espaço para colocar o sofá! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Sofá diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt_BR.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt_BR.tr index bfd9a3c7..371eafd3 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.pt_BR.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Poltrona - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Long Sofa=Sofá Grande - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Sem espaço para colocar o sofá! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Sofá diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ru.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ru.tr index 37ed4222..4b6d6c99 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ru.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.ru.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=Кресло - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=Кому-то другому принадлежит точка, куда выходит средний или дальний конец! Someone else owns the spot where the other end goes!=Кому-то другому принадлежит точка, где выходит другой конец! - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=Кому-то другому принадлежит точка, куда выходит средний или дальний конец! Long Sofa=Длинный диван - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=Нет места для дивана! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=Диван diff --git a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.zh_CN.tr b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.zh_CN.tr index 7420e1ed..26db9d31 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_seating/locale/homedecor_seating.zh_CN.tr @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair=扶手椅 - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!=中间或远端去的地方是别人的! Someone else owns the spot where the other end goes!=另一端去的地方是别人的! - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!=中间或远端去的地方是别人的! Long Sofa=长沙发 - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!=没有地方放沙发! - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa=沙发 diff --git a/mods/homedecor_modpack/homedecor_seating/locale/template.txt b/mods/homedecor_modpack/homedecor_seating/locale/template.txt index 07705d29..4c619b32 100644 --- a/mods/homedecor_modpack/homedecor_seating/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_seating/locale/template.txt @@ -1,24 +1,15 @@ # textdomain: homedecor_seating - - -### armchairs.lua ### - Armchair= - -### init.lua ### - -Someone else owns the spot where the middle or far end goes!= Someone else owns the spot where the other end goes!= - -### longsofas.lua ### - +Someone else owns the spot where the middle or far end goes!= Long Sofa= - -### longsofas.lua ### -### sofas.lua ### - No room to place the sofa!= - -### sofas.lua ### - +Deck Chair= +Deck Chair (blue striped)= +Simple Bench= +Garden Bench (style 1)= +Garden Bench (style 2)= +Kitchen chair= +Basic office chair= +Upscale office chair= Sofa= diff --git a/mods/homedecor_modpack/homedecor_seating/longsofas.lua b/mods/homedecor_modpack/homedecor_seating/longsofas.lua index 90099509..4f1c7c96 100644 --- a/mods/homedecor_modpack/homedecor_seating/longsofas.lua +++ b/mods/homedecor_modpack/homedecor_seating/longsofas.lua @@ -18,8 +18,12 @@ minetest.register_node(":lrfurn:longsofa", { palette = "unifieddyes_palette_colorwallmounted.png", inventory_image = "lrfurn_longsofa_inv.png", wield_scale = { x = 0.6, y = 0.6, z = 0.6 }, - groups = {snappy=3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = longsofa_cbox, node_box = longsofa_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, @@ -31,7 +35,7 @@ minetest.register_node(":lrfurn:longsofa", { local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false) if lrfurn.check_right(pos, fdir, true, placer) then - if not creative.is_enabled_for(playername) then + if not minetest.is_creative_enabled(playername) then itemstack:take_item() end else @@ -42,20 +46,16 @@ minetest.register_node(":lrfurn:longsofa", { end, on_dig = unifieddyes.on_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not clicker:is_player() then - return itemstack - end - pos.y = pos.y-0.5 - clicker:setpos(pos) - return itemstack - end + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 3) + end, + on_destruct = lrfurn.on_seat_destruct, }) minetest.register_craft({ output = "lrfurn:longsofa", recipe = { - {"wool:white", "wool:white", "wool:white", }, - {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood", }, + {homedecor.materials.wool_white, homedecor.materials.wool_white, homedecor.materials.wool_white, }, + {homedecor.materials.slab_wood, homedecor.materials.slab_wood, homedecor.materials.slab_wood, }, {"group:stick", "group:stick", "group:stick", } } }) @@ -63,7 +63,7 @@ minetest.register_craft({ minetest.register_craft({ output = "lrfurn:longsofa", recipe = { - {"wool:white", "wool:white", "wool:white", }, + {homedecor.materials.wool_white, homedecor.materials.wool_white, homedecor.materials.wool_white, }, {"moreblocks:slab_wood", "moreblocks:slab_wood", "moreblocks:slab_wood", }, {"group:stick", "group:stick", "group:stick", } } diff --git a/mods/homedecor_modpack/homedecor_seating/misc.lua b/mods/homedecor_modpack/homedecor_seating/misc.lua index 57ddfc5b..386de67c 100644 --- a/mods/homedecor_modpack/homedecor_seating/misc.lua +++ b/mods/homedecor_modpack/homedecor_seating/misc.lua @@ -1,6 +1,8 @@ -- this component contains all of the random types of seating previously -- scattered among homedecor's other mods +local S = minetest.get_translator("homedecor_seating") + local dc_cbox = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, 0, 1 } @@ -9,13 +11,19 @@ local dc_cbox = { homedecor.register("deckchair", { mesh = "homedecor_deckchair.obj", tiles = {"homedecor_deckchair.png"}, - description = "Deck Chair", - groups = { snappy = 3 }, + description = S("Deck Chair"), + groups = { snappy = 3, dig_tree=2 }, expand = { forward="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = dc_cbox, collision_box = dc_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) minetest.register_alias("homedecor:deckchair_foot", "homedecor:deckchair") @@ -24,19 +32,25 @@ minetest.register_alias("homedecor:deckchair_head", "air") homedecor.register("deckchair_striped_blue", { mesh = "homedecor_deckchair.obj", tiles = {"homedecor_deckchair_striped_blue.png"}, - description = "Deck Chair (blue striped)", - groups = { snappy = 3 }, + description = S("Deck Chair (blue striped)"), + groups = { snappy = 3, dig_tree=2 }, expand = { forward="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = dc_cbox, collision_box = dc_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) homedecor.register("simple_bench", { tiles = { "homedecor_generic_wood_old.png" }, - description = "Simple Bench", - groups = {snappy=3}, + description = S("Simple Bench"), + groups = {snappy=3, dig_tree=2}, node_box = { type = "fixed", fixed = { @@ -45,7 +59,13 @@ homedecor.register("simple_bench", { { 0.3, -0.5, 0.1, 0.4, -0.15, 0.3}, } }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) local bl1_sbox = { @@ -67,11 +87,13 @@ homedecor.register("bench_large_1", { "homedecor_generic_wood_old.png", "homedecor_generic_metal_wrought_iron.png" }, - description = "Garden Bench (style 1)", + description = S("Garden Bench (style 1)"), inventory_image = "homedecor_bench_large_1_inv.png", - groups = { snappy = 3 }, + groups = { snappy = 3, dig_tree=2 }, expand = { right="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = bl1_sbox, node_box = bl1_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, @@ -94,15 +116,17 @@ local bl2_cbox = { } homedecor.register("bench_large_2", { - description = "Garden Bench (style 2)", + description = S("Garden Bench (style 2)"), mesh = "homedecor_bench_large_2.obj", tiles = { "homedecor_generic_wood_old.png" }, inventory_image = "homedecor_bench_large_2_inv.png", - groups = {snappy=3}, + groups = {snappy=3, dig_tree=2}, selection_box = bl2_sbox, node_box = bl2_cbox, expand = { right="placeholder" }, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, }) @@ -115,7 +139,7 @@ local kc_cbox = { } homedecor.register("kitchen_chair_wood", { - description = "Kitchen chair", + description = S("Kitchen chair"), mesh = "homedecor_kitchen_chair.obj", tiles = { homedecor.plain_wood, @@ -126,22 +150,23 @@ homedecor.register("kitchen_chair_wood", { selection_box = kc_cbox, collision_box = kc_cbox, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, after_place_node = unifieddyes.fix_rotation_nsew, on_rotate = unifieddyes.fix_after_screwdriver_nsew, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - pos.y = pos.y+0 -- where do I put my ass ? - homedecor.sit(pos, node, clicker) - return itemstack - end + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) homedecor.register("kitchen_chair_padded", { - description = "Kitchen chair", + description = S("Kitchen chair"), mesh = "homedecor_kitchen_chair.obj", tiles = { homedecor.plain_wood, - "wool_white.png", + homedecor.textures.wool.white, }, inventory_image = "homedecor_chair_padded_inv.png", paramtype2 = "colorwallmounted", @@ -149,17 +174,18 @@ homedecor.register("kitchen_chair_padded", { selection_box = kc_cbox, collision_box = kc_cbox, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, after_place_node = function(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) end, on_dig = unifieddyes.on_dig, on_rotate = unifieddyes.fix_after_screwdriver_nsew, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - pos.y = pos.y+0 -- where do I put my ass ? - homedecor.sit(pos, node, clicker) - return itemstack - end + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) local ofchairs_sbox = { @@ -177,8 +203,8 @@ local ofchairs_cbox = { } local chairs = { - { "basic", "Basic office chair" }, - { "upscale", "Upscale office chair" }, + { "basic", S("Basic office chair") }, + { "upscale", S("Upscale office chair") }, } for _, c in pairs(chairs) do @@ -188,12 +214,18 @@ for _, c in pairs(chairs) do drawtype = "mesh", tiles = { "homedecor_office_chair_"..name..".png" }, mesh = "homedecor_office_chair_"..name..".obj", - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, dig_tree=2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = ofchairs_sbox, collision_box = ofchairs_cbox, expand = { top = "placeholder" }, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) + end, + on_destruct = lrfurn.on_seat_destruct, }) end @@ -213,7 +245,7 @@ minetest.register_craft( { recipe = { { "homedecor:shutter_oak", "homedecor:shutter_oak", "homedecor:shutter_oak" }, { "group:wood", "group:wood", "group:wood" }, - { "stairs:slab_wood", "", "stairs:slab_wood" } + { homedecor.materials.slab_wood, "", homedecor.materials.slab_wood } }, }) @@ -229,8 +261,8 @@ minetest.register_craft( { minetest.register_craft( { output = "homedecor:simple_bench", recipe = { - { "stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood" }, - { "stairs:slab_wood", "", "stairs:slab_wood" } + { homedecor.materials.slab_wood, homedecor.materials.slab_wood, homedecor.materials.slab_wood }, + { homedecor.materials.slab_wood, "", homedecor.materials.slab_wood } }, }) @@ -275,7 +307,7 @@ minetest.register_craft({ output = "homedecor:kitchen_chair_padded", recipe = { "homedecor:kitchen_chair_wood", - "wool:white", + homedecor.materials.wool_white, }, }) @@ -306,8 +338,8 @@ minetest.register_craft({ minetest.register_craft({ output = "homedecor:office_chair_basic", recipe = { - { "", "", "wool:black" }, - { "", "wool:black", "default:steel_ingot" }, + { "", "", homedecor.materials.wool_black }, + { "", homedecor.materials.wool_black, homedecor.materials.steel_ingot }, { "group:stick", "basic_materials:steel_bar", "group:stick" } }, }) @@ -315,8 +347,8 @@ minetest.register_craft({ minetest.register_craft({ output = "homedecor:office_chair_upscale", recipe = { - { "dye:black", "building_blocks:sticks", "group:wool" }, - { "basic_materials:plastic_sheet", "group:wool", "default:steel_ingot" }, + { homedecor.materials.dye_black, "building_blocks:sticks", "group:wool" }, + { "basic_materials:plastic_sheet", "group:wool", homedecor.materials.steel_ingot }, { "building_blocks:sticks", "basic_materials:steel_bar", "building_blocks:sticks" } }, }) diff --git a/mods/homedecor_modpack/homedecor_seating/mod.conf b/mods/homedecor_modpack/homedecor_seating/mod.conf index 8bf5957e..5d17db39 100644 --- a/mods/homedecor_modpack/homedecor_seating/mod.conf +++ b/mods/homedecor_modpack/homedecor_seating/mod.conf @@ -1,4 +1,4 @@ name = homedecor_seating description = Homedecor mod: seating -depends = default, wool, homedecor_common, unifieddyes, basic_materials -optional_depends = screwdriver +depends = homedecor_common +optional_depends = screwdriver, wool, default, unifieddyes, basic_materials diff --git a/mods/homedecor_modpack/homedecor_seating/sofas.lua b/mods/homedecor_modpack/homedecor_seating/sofas.lua index abc85c86..130f9c58 100644 --- a/mods/homedecor_modpack/homedecor_seating/sofas.lua +++ b/mods/homedecor_modpack/homedecor_seating/sofas.lua @@ -18,8 +18,12 @@ minetest.register_node(":lrfurn:sofa", { palette = "unifieddyes_palette_colorwallmounted.png", inventory_image = "lrfurn_sofa_inv.png", wield_scale = { x = 0.6, y = 0.6, z = 0.6 }, - groups = {snappy=3, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, ud_param2_colorable = 1, dig_tree=2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = sofa_cbox, node_box = sofa_cbox, on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil, @@ -31,7 +35,7 @@ minetest.register_node(":lrfurn:sofa", { local fdir = minetest.dir_to_facedir(placer:get_look_dir(), false) if lrfurn.check_right(pos, fdir, false, placer) then - if not creative.is_enabled_for(playername) then + if not minetest.is_creative_enabled(playername) then itemstack:take_item() end else @@ -42,20 +46,16 @@ minetest.register_node(":lrfurn:sofa", { end, on_dig = unifieddyes.on_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not clicker:is_player() then - return itemstack - end - pos.y = pos.y-0.5 - clicker:setpos(pos) - return itemstack - end + return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 2) + end, + on_destruct = lrfurn.on_seat_destruct, }) minetest.register_craft({ output = "lrfurn:sofa", recipe = { - {"wool:white", "wool:white", "", }, - {"stairs:slab_wood", "stairs:slab_wood", "", }, + {homedecor.materials.wool_white, homedecor.materials.wool_white, "", }, + {homedecor.materials.slab_wood, homedecor.materials.slab_wood, "", }, {"group:stick", "group:stick", "", } } }) @@ -63,7 +63,7 @@ minetest.register_craft({ minetest.register_craft({ output = "lrfurn:sofa", recipe = { - {"wool:white", "wool:white", "", }, + {homedecor.materials.wool_white, homedecor.materials.wool_white, "", }, {"moreblocks:slab_wood", "moreblocks:slab_wood", "", }, {"group:stick", "group:stick", "", } } diff --git a/mods/homedecor_modpack/homedecor_tables/.luacheckrc b/mods/homedecor_modpack/homedecor_tables/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_tables/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_tables/coffeetable.lua b/mods/homedecor_modpack/homedecor_tables/coffeetable.lua index 3e73e664..16af01e8 100644 --- a/mods/homedecor_modpack/homedecor_tables/coffeetable.lua +++ b/mods/homedecor_modpack/homedecor_tables/coffeetable.lua @@ -57,8 +57,13 @@ minetest.register_node(":lrfurn:coffeetable", { }, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "blend", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = { type = "fixed", fixed = { @@ -107,7 +112,7 @@ minetest.register_craft({ output = "lrfurn:coffeetable", recipe = { {"", "", "", }, - {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood", }, + {homedecor.materials.slab_wood, homedecor.materials.slab_wood, homedecor.materials.slab_wood, }, {"group:stick", "", "group:stick", } } }) diff --git a/mods/homedecor_modpack/homedecor_tables/endtable.lua b/mods/homedecor_modpack/homedecor_tables/endtable.lua index d28b5c4b..e772d4a8 100644 --- a/mods/homedecor_modpack/homedecor_tables/endtable.lua +++ b/mods/homedecor_modpack/homedecor_tables/endtable.lua @@ -15,8 +15,13 @@ minetest.register_node(":lrfurn:endtable", { }, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "blend", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_wood_defaults", + }, node_box = { type = "fixed", fixed = { @@ -42,7 +47,7 @@ minetest.register_craft({ output = "lrfurn:endtable", recipe = { {"", "", "", }, - {"stairs:slab_wood", "stairs:slab_wood", "", }, + {homedecor.materials.slab_wood, homedecor.materials.slab_wood, "", }, {"group:stick", "group:stick", "", } } }) diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.de.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.de.tr index 8755fcb3..4b0f3c5b 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.de.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.de.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Jemanden gehört schon die Stelle, wo das andere Ende hingehen würde. +Someone else owns the spot where the middle or far end goes!=Jemanden gehört schon die Stelle, wo das mittlere oder ferne Stück hingehen würde. Coffee Table=Kaffeetisch No room to place the coffee table!=Kein Platz, um den Kaffeetisch zu platzieren! -Someone else owns the spot where the middle or far end goes!=Jemanden gehört schon die Stelle, wo das mittlere oder ferne Stück hingehen würde. -Someone else owns the spot where the other end goes!=Jemanden gehört schon die Stelle, wo das andere Ende hingehen würde. - -### endtable.lua ### - End Table=Beitisch - -### misc.lua ### - -Large glass table piece=Großes Glastischteil -Large wooden table piece=Großes Holztischteil -Legs for Utility Table=Tischbeine für Werkzeugtisch -Small round glass table=Kleiner runder Glastisch -Small round wooden table=Kleiner runder Holztisch -Small square glass table=Kleiner quadratischer Glastisch -Small square wooden table=Kleiner quadratischer Holztisch -Table Legs (@1)=Tischbeine (@1) -Utility Table=Werkzeugtisch +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=Messing wrought iron=Schmiedeeisen +wood= +Table Legs (@1)=Tischbeine (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.es.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.es.tr index 1da8a3e3..d098c7ce 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.es.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.es.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Alguien ya es dueño del lugar donde va la cabecera. +Someone else owns the spot where the middle or far end goes!=Alguien ya es dueño del lugar donde va la cabecera. Coffee Table=Mesa de café No room to place the coffee table!=¡No hay lugar para colocar la mesa de café! -Someone else owns the spot where the middle or far end goes!=Alguien ya es dueño del lugar donde va la cabecera. -Someone else owns the spot where the other end goes!=Alguien ya es dueño del lugar donde va la cabecera. - -### endtable.lua ### - End Table=Mesa final - -### misc.lua ### - -Large glass table piece=Mesa grande de vídrio -Large wooden table piece=Mesa grande de madera -Legs for Utility Table=Patas para mesa utilitaria -Small round glass table=Mesa redonda pequeña de vídrio -Small round wooden table=Mesa redonda pequeña de madera -Small square glass table=Mesa cuadrada pequeña de vídrio -Small square wooden table=Mesa cuadrada pequeña de madera -Table Legs (@1)=Patas de mesa (@1) -Utility Table=Mesa utilitaria +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=latón wrought iron=hierro forjado +wood= +Table Legs (@1)=Patas de mesa (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.fr.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.fr.tr index 3882f3da..532d49c0 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.fr.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.fr.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va l'autre bout ! +Someone else owns the spot where the middle or far end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va le milieu ou l'autre bout ! Coffee Table=Table basse No room to place the coffee table!=Pas assez de place pour poser la table basse ! -Someone else owns the spot where the middle or far end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va le milieu ou l'autre bout ! -Someone else owns the spot where the other end goes!=Quelqu'un d'autre est propriétaire de l'endroit où va l'autre bout ! - -### endtable.lua ### - End Table=Extrémité de table - -### misc.lua ### - -Large glass table piece=Élément de grande table en verre -Large wooden table piece=Élément de grande table en bois -Legs for Utility Table=Pieds pour plan de travail -Small round glass table=Petite table ronde en verre -Small round wooden table=Petite table ronde en bois -Small square glass table=Petite table carrée en verre -Small square wooden table=Petite table carrée en bois -Table Legs (@1)=Pieds de table (@1) -Utility Table=Plan de travail +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=laiton wrought iron=fer forgé +wood= +Table Legs (@1)=Pieds de table (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.it.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.it.tr index 768d408d..7955ee02 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.it.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.it.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!= +Someone else owns the spot where the middle or far end goes!= Coffee Table=Tavolo No room to place the coffee table!= -Someone else owns the spot where the middle or far end goes!= -Someone else owns the spot where the other end goes!= - -### endtable.lua ### - End Table=Tavolo - -### misc.lua ### - -Large glass table piece= -Large wooden table piece= -Legs for Utility Table=Gambe per il tavolo da lavoro -Small round glass table=Altoparlante audio surround piccolo -Small round wooden table=Altoparlante audio surround piccolo -Small square glass table= -Small square wooden table=Bauletto in legno -Table Legs (@1)=Gambe in ottone del tavolo -Utility Table=Tavolo di lavoro +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass= wrought iron=Palo di ferro battuto +wood= +Table Legs (@1)=Gambe del tavolo (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ms.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ms.tr index 6b8a14c5..9ea31529 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ms.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ms.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Tempat untuk letak hujung objek itu kawasan kepunyaan orang lain! +Someone else owns the spot where the middle or far end goes!=Tempat untuk letak pertengahan atau hujung objek itu kawasan kepunyaan orang lain! Coffee Table=Meja Kopi No room to place the coffee table!=Tiada ruang untuk letak meja kopi! -Someone else owns the spot where the middle or far end goes!=Tempat untuk letak pertengahan atau hujung objek itu kawasan kepunyaan orang lain! -Someone else owns the spot where the other end goes!=Tempat untuk letak hujung objek itu kawasan kepunyaan orang lain! - -### endtable.lua ### - End Table=Meja Hujung - -### misc.lua ### - -Large glass table piece=Kepingan Kaca Meja Besar -Large wooden table piece=Kepingan Meja Kayu Besar -Legs for Utility Table=Kaki untuk Meja Utiliti -Small round glass table=Kaca Meja Bulat Kecil -Small round wooden table=Kepingan Meja Kayu Bulat Kecil -Small square glass table=Kaca Meja Segi Empat Kecil -Small square wooden table=Kepingan Meja Kayu Segi Empat Kecil -Table Legs (@1)=Kaki Meja (@1) -Utility Table=Kepingan Meja Utiliti +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=Loyang wrought iron=Besi Tempaan +wood= +Table Legs (@1)=Kaki Meja (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt.tr index 4851e5c6..9af79cf6 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. +Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Coffee Table=Mesa de Café No room to place the coffee table!=Sem espaço para colocar a mesa de café -Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. -Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. - -### endtable.lua ### - End Table=Mesa - -### misc.lua ### - -Large glass table piece=Mesa grande de vidro -Large wooden table piece=Mesa grande de madeira -Legs for Utility Table=Pernas para Mesa de Trabalho -Small round glass table=Mesa pequena circular de vidro -Small round wooden table=Mesa pequena circular de madeira -Small square glass table=Mesa pequena quadrada de vidro -Small square wooden table=Mesa pequena quadrada de madeira -Table Legs (@1)=Pernas de Mesa (@1) -Utility Table=Mesa de Trabalho +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=latão wrought iron=ferro forjado +wood= +Table Legs (@1)=Pernas de Mesa (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt_BR.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt_BR.tr index 4851e5c6..9af79cf6 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.pt_BR.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. +Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. Coffee Table=Mesa de Café No room to place the coffee table!=Sem espaço para colocar a mesa de café -Someone else owns the spot where the middle or far end goes!=Alguém já é proprietário do local onde a cabeceira vai. -Someone else owns the spot where the other end goes!=Alguém já é proprietário do local onde a cabeceira vai. - -### endtable.lua ### - End Table=Mesa - -### misc.lua ### - -Large glass table piece=Mesa grande de vidro -Large wooden table piece=Mesa grande de madeira -Legs for Utility Table=Pernas para Mesa de Trabalho -Small round glass table=Mesa pequena circular de vidro -Small round wooden table=Mesa pequena circular de madeira -Small square glass table=Mesa pequena quadrada de vidro -Small square wooden table=Mesa pequena quadrada de madeira -Table Legs (@1)=Pernas de Mesa (@1) -Utility Table=Mesa de Trabalho +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=latão wrought iron=ferro forjado +wood= +Table Legs (@1)=Pernas de Mesa (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ru.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ru.tr index a9a965ce..1ca6c951 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ru.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.ru.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=Кому-то другому принадлежит точка, где выходит другой конец! +Someone else owns the spot where the middle or far end goes!=Кому-то другому принадлежит точка, куда выходит средний или дальний конец! Coffee Table=Кофейный столик No room to place the coffee table!=Нет места для установки кофейного столика! -Someone else owns the spot where the middle or far end goes!=Кому-то другому принадлежит точка, куда выходит средний или дальний конец! -Someone else owns the spot where the other end goes!=Кому-то другому принадлежит точка, где выходит другой конец! - -### endtable.lua ### - End Table=Оконечный стол - -### misc.lua ### - -Large glass table piece=Большая стеклянная столешница -Large wooden table piece=Большая деревянная столешница -Legs for Utility Table=Ножки вспомогательного стола -Small round glass table=Маленький круглый стеклянный столик -Small round wooden table=Маленький круглый деревянный столик -Small square glass table=Маленький квадратный стеклянный столик -Small square wooden table=Маленький квадратный деревянный столик -Table Legs (@1)=Ножки стола (@1) -Utility Table=Вспомогательный стол +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=латунь wrought iron=кованное железо +wood= +Table Legs (@1)=Ножки стола (@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.zh_CN.tr b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.zh_CN.tr index df898614..ce118835 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_tables/locale/homedecor_tables.zh_CN.tr @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!=另一端去的地方是别人的! +Someone else owns the spot where the middle or far end goes!=中间或远端去的地方是别人的! Coffee Table=咖啡桌 No room to place the coffee table!=没有地方放咖啡桌! -Someone else owns the spot where the middle or far end goes!=中间或远端去的地方是别人的! -Someone else owns the spot where the other end goes!=另一端去的地方是别人的! - -### endtable.lua ### - End Table=结束表 - -### misc.lua ### - -Large glass table piece=大玻璃桌片 -Large wooden table piece=大木桌片 -Legs for Utility Table=通用桌腿 -Small round glass table=小圆形玻璃桌 -Small round wooden table=小圆桌 -Small square glass table=小方形玻璃桌 -Small square wooden table=小方木桌 -Table Legs (@1)=桌腿(@1) -Utility Table=效用表 +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass=黄铜 wrought iron=锻铁 +wood= +Table Legs (@1)=桌腿(@1) +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/locale/template.txt b/mods/homedecor_modpack/homedecor_tables/locale/template.txt index 5fe784d1..958e28cf 100644 --- a/mods/homedecor_modpack/homedecor_tables/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_tables/locale/template.txt @@ -1,27 +1,19 @@ # textdomain: homedecor_tables - - -### coffeetable.lua ### - +Someone else owns the spot where the other end goes!= +Someone else owns the spot where the middle or far end goes!= Coffee Table= No room to place the coffee table!= -Someone else owns the spot where the middle or far end goes!= -Someone else owns the spot where the other end goes!= - -### endtable.lua ### - End Table= - -### misc.lua ### - -Large glass table piece= -Large wooden table piece= -Legs for Utility Table= -Small round glass table= -Small round wooden table= -Small square glass table= -Small square wooden table= -Table Legs (@1)= -Utility Table= +Small square glass tabletop= +Small round glass tabletop= +Large glass tabletop piece= +Small square wooden tabletop= +Small round wooden tabletop= +Large wooden tabletop piece= brass= wrought iron= +wood= +Table Legs (@1)= +Table= +Mahogany Table= +White Table= diff --git a/mods/homedecor_modpack/homedecor_tables/misc.lua b/mods/homedecor_modpack/homedecor_tables/misc.lua index de062240..1cf74504 100644 --- a/mods/homedecor_modpack/homedecor_tables/misc.lua +++ b/mods/homedecor_modpack/homedecor_tables/misc.lua @@ -19,7 +19,7 @@ local tabletop_materials = { } } -leg_materials = { +local leg_materials = { { "brass", S("brass") }, { "wrought_iron", S("wrought iron") }, { "wood", S("wood") } @@ -34,8 +34,11 @@ for _, t in ipairs(leg_materials) do inventory_image = "homedecor_table_legs_"..name..".png", wield_image = "homedecor_table_legs_"..name..".png", walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + use_texture_alpha = "blend", + groups = {snappy=3, dig_tree=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = { type = "fixed", fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 } @@ -54,13 +57,13 @@ local tables_cbox = { } for i, mat in ipairs(tabletop_materials) do - local m, small_s, small_r, large = unpack(mat) + local m = unpack(mat) local s if m == "glass" then - s = default.node_sound_glass_defaults() + s = "node_sound_glass_defaults" else - s = default.node_sound_wood_defaults() + s = "node_sound_wood_defaults" end for _, shape in ipairs(table_shapes) do @@ -71,13 +74,16 @@ for i, mat in ipairs(tabletop_materials) do tiles = { 'homedecor_'..m..'_table_'..shape..'.png', 'homedecor_'..m..'_table_edges.png', - 'homedecor_blanktile.png', - 'homedecor_blanktile.png', - 'homedecor_blanktile.png', + 'blank.png', + 'blank.png', + 'blank.png', }, wield_image = 'homedecor_'..m..'_table_'..shape..'_inv.png', - groups = { snappy = 3 }, - sounds = s, + use_texture_alpha = "blend", + groups = { snappy = 3, dig_tree=2 }, + _sound_def = { + key = s, + }, selection_box = tables_cbox, collision_box = tables_cbox, on_place = function(itemstack, placer, pointed_thing) @@ -99,25 +105,28 @@ for i, mat in ipairs(tabletop_materials) do }) for _, l in ipairs(leg_materials) do - local leg_mat, desc = unpack(l) + local leg_mat = unpack(l) homedecor.register(string.format("%s_table_%s_with_%s_legs", m, shape, leg_mat), { description = string.format("%s %s table with %s legs", shape, m, leg_mat), mesh = "homedecor_table_"..shape..".obj", tiles = { - 'homedecor_blanktile.png', - 'homedecor_blanktile.png', + 'blank.png', + 'blank.png', 'homedecor_'..m..'_table_'..shape..'.png', 'homedecor_'..m..'_table_edges.png', "homedecor_table_legs_"..leg_mat..".png", }, - groups = { snappy = 3 }, - sounds = s, + use_texture_alpha = "blend", + groups = { snappy = 3, dig_tree=2 }, + _sound_def = { + key = s + }, }) end end - minetest.register_alias('homedecor:'..m..'_table_large_b', 'homedecor:'..m..'_table_large') + minetest.register_alias('homedecor:'..m..'_table_large_square_b', 'homedecor:'..m..'_table_large_square') minetest.register_alias('homedecor:'..m..'_table_small_square_b', 'homedecor:'..m..'_table_small_square') minetest.register_alias('homedecor:'..m..'_table_small_round_b', 'homedecor:'..m..'_table_small_round') minetest.register_alias('homedecor:'..m..'_table_large', 'homedecor:'..m..'_table_large_square') @@ -153,7 +162,9 @@ for _, t in ipairs(table_colors) do }, }, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, }) end @@ -162,9 +173,9 @@ end minetest.register_craft( { output = "homedecor:glass_table_small_round_b 15", recipe = { - { "", "default:glass", "" }, - { "default:glass", "default:glass", "default:glass" }, - { "", "default:glass", "" }, + { "", homedecor.materials.glass_block, "" }, + { homedecor.materials.glass_block, homedecor.materials.glass_block, homedecor.materials.glass_block }, + { "", homedecor.materials.glass_block, "" }, }, }) @@ -176,7 +187,7 @@ minetest.register_craft( { }) minetest.register_craft( { - output = "homedecor:glass_table_large_b 2", + output = "homedecor:glass_table_large_square_b 2", recipe = { { "homedecor:glass_table_small_square", "homedecor:glass_table_small_square" }, } @@ -199,7 +210,7 @@ minetest.register_craft( { }) minetest.register_craft( { - output = "homedecor:wood_table_large_b 2", + output = "homedecor:wood_table_large_square_b 2", recipe = { { "homedecor:wood_table_small_square", "homedecor:wood_table_small_square" }, } @@ -221,7 +232,7 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", - recipe = "homedecor:wood_table_large_b", + recipe = "homedecor:wood_table_large_square_b", burntime = 30, }) @@ -229,9 +240,9 @@ minetest.register_craft({ minetest.register_craft( { output = "homedecor:table_legs_wrought_iron 3", recipe = { - { "", "default:iron_lump", "" }, - { "", "default:iron_lump", "" }, - { "default:iron_lump", "default:iron_lump", "default:iron_lump" }, + { "", homedecor.materials.iron_lump, "" }, + { "", homedecor.materials.iron_lump, "" }, + { homedecor.materials.iron_lump, homedecor.materials.iron_lump, homedecor.materials.iron_lump }, }, }) @@ -287,7 +298,7 @@ minetest.register_craft({ output = "homedecor:table_mahogany", recipe = { "homedecor:table", - "dye:brown", + homedecor.materials.dye_brown, }, }) @@ -305,7 +316,7 @@ minetest.register_craft({ output = "homedecor:table_white", recipe = { "homedecor:table", - "dye:white", + homedecor.materials.dye_white, }, }) diff --git a/mods/homedecor_modpack/homedecor_tables/mod.conf b/mods/homedecor_modpack/homedecor_tables/mod.conf index 32011ac5..858b8e68 100644 --- a/mods/homedecor_modpack/homedecor_tables/mod.conf +++ b/mods/homedecor_modpack/homedecor_tables/mod.conf @@ -1,4 +1,4 @@ name = homedecor_tables description = Homedecor mod: tables -depends = homedecor_common, default, basic_materials -optional_depends = creative +depends = homedecor_common +optional_depends = creative, default, basic_materials diff --git a/mods/homedecor_modpack/homedecor_trash_cans/.luacheckrc b/mods/homedecor_modpack/homedecor_trash_cans/.luacheckrc deleted file mode 100644 index 4f0848c8..00000000 --- a/mods/homedecor_modpack/homedecor_trash_cans/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_trash_cans/init.lua b/mods/homedecor_modpack/homedecor_trash_cans/init.lua index 092f4f92..cd03dda1 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/init.lua +++ b/mods/homedecor_modpack/homedecor_trash_cans/init.lua @@ -13,19 +13,28 @@ homedecor.register("trash_can_green", { tiles = { { name = "homedecor_generic_plastic.png", color = trashcan_green } }, inventory_image = "homedecor_trash_can_green_inv.png", description = S("Green Trash Can"), - groups = {snappy=3}, + groups = {snappy=3, dig_stone=3}, selection_box = tg_cbox, collision_box = tg_cbox, on_punch = function(pos, node, puncher, pointed_thing) minetest.set_node(pos, {name = "homedecor:trash_can_green_open", param2 = node.param2}) - end + end, + crafts = { + { + recipe = { + { "basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "dye_green", "basic_materials:plastic_sheet" }, + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } + }, + } + } }) homedecor.register("trash_can_green_open", { drawtype = "mesh", mesh = "homedecor_trash_can_green_open.obj", tiles = { { name = "homedecor_generic_plastic.png", color = trashcan_green } }, - groups = {snappy=3, not_in_creative_inventory=1}, + groups = {snappy=3, not_in_creative_inventory=1, dig_stone=3}, selection_box = tg_cbox, collision_box = tg_cbox, drop = "homedecor:trash_can_green", @@ -35,7 +44,7 @@ homedecor.register("trash_can_green_open", { infotext=S("Trash Can"), inventory= { size = 9, - formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. + formspec = "size[8,9]".. "button[2.5,3.8;3,1;empty;Empty Trash]".. "list[context;main;2.5,0.5;3,3;]".. "list[current_player;main;0,5;8,4;]" .. @@ -61,27 +70,17 @@ homedecor.register("trash_can", { tiles = { "homedecor_trash_can.png" }, inventory_image = "homedecor_trash_can_inv.png", description = S("Small Trash Can"), - groups = {snappy=3}, + use_texture_alpha = "clip", + groups = {snappy=3, dig_stone=3}, selection_box = trash_cbox, collision_box = trash_cbox, -}) - --- crafting - - -minetest.register_craft( { - output = "homedecor:trash_can 3", - recipe = { - { "basic_materials:steel_wire", "", "basic_materials:steel_wire" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } - }, -}) - -minetest.register_craft({ - output = "homedecor:trash_can_green", - recipe = { - { "basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "dye:green", "basic_materials:plastic_sheet" }, - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } - }, + crafts = { + { + output = "homedecor:trash_can 3", + recipe = { + { "basic_materials:steel_wire", "", "basic_materials:steel_wire" }, + { "steel_ingot", "steel_ingot", "steel_ingot" } + }, + }, + } }) diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.de.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.de.tr index 98f4612f..3a8f7337 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.de.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Grüner Mülleimer -Small Trash Can=Kleiner Mülleimer Trash Can=Mülleimer +Small Trash Can=Kleiner Mülleimer diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.es.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.es.tr index d2623e90..4535fa66 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.es.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.es.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Bote de basura verde -Small Trash Can=Bote de basura pequeño Trash Can=Bote de basura +Small Trash Can=Bote de basura pequeño diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.fr.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.fr.tr index aae427d4..891b59f9 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.fr.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Poubelle verte -Small Trash Can=Corbeille à papier Trash Can=Poubelle +Small Trash Can=Corbeille à papier diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ms.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ms.tr index c26cbf87..a09b62f6 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ms.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ms.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Tong Sampah Hijau -Small Trash Can=Tong Sampah Kecil Trash Can=Tong Sampah +Small Trash Can=Tong Sampah Kecil diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt.tr index b77d87bc..0902bcce 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Lixeira Verde -Small Trash Can=Lixeira pequena Trash Can=Lixeira +Small Trash Can=Lixeira pequena diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt_BR.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt_BR.tr index b77d87bc..0902bcce 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.pt_BR.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Lixeira Verde -Small Trash Can=Lixeira pequena Trash Can=Lixeira +Small Trash Can=Lixeira pequena diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ru.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ru.tr index 864493e6..006d3fe1 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ru.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.ru.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=Зелёный мусорный контейнер -Small Trash Can=Малый мусорный контейнер Trash Can=Мусорный контейнер +Small Trash Can=Малый мусорный контейнер diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.zh_CN.tr b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.zh_CN.tr index 8f776bf9..42a30b8a 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/homedecor_trash_cans.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can=绿色垃圾桶 -Small Trash Can=小垃圾桶 Trash Can=垃圾桶 +Small Trash Can=小垃圾桶 diff --git a/mods/homedecor_modpack/homedecor_trash_cans/locale/template.txt b/mods/homedecor_modpack/homedecor_trash_cans/locale/template.txt index 0b4bb47b..41d74cac 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_trash_cans/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_trash_cans - - -### init.lua ### - Green Trash Can= -Small Trash Can= Trash Can= +Small Trash Can= diff --git a/mods/homedecor_modpack/homedecor_trash_cans/mod.conf b/mods/homedecor_modpack/homedecor_trash_cans/mod.conf index b2947cc4..71062005 100644 --- a/mods/homedecor_modpack/homedecor_trash_cans/mod.conf +++ b/mods/homedecor_modpack/homedecor_trash_cans/mod.conf @@ -1,3 +1,4 @@ name = homedecor_trash_cans description = Homedecor mod: trash cans -depends = homedecor_common, default, basic_materials, dye +depends = homedecor_common +optional_depends = default, basic_materials, dye diff --git a/mods/homedecor_modpack/homedecor_wardrobe/init.lua b/mods/homedecor_modpack/homedecor_wardrobe/init.lua index c7d279c0..07be366c 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/init.lua +++ b/mods/homedecor_modpack/homedecor_wardrobe/init.lua @@ -1,5 +1,13 @@ +if not minetest.get_modpath("player_api") then + minetest.log( + "action", + "[homedecor_wardrobe]: minetest game not detected, disabling as this mod is minetest game only at this time" + ) + return +end + local S = minetest.get_translator("homedecor_wardrobe") -modpath = minetest.get_modpath("homedecor_wardrobe") +local modpath = minetest.get_modpath("homedecor_wardrobe") local wd_cbox = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}} @@ -26,6 +34,9 @@ if skinsdb_mod_path then skin_obj:set_preview("homedecor_clothes_"..skin_name.."_preview.png") skin_obj:set_texture("homedecor_clothes_"..skin_name..".png") + if skin_obj.set_hand_from_texture then + skin_obj:set_hand_from_texture() + end skin_obj:set_meta("name", S("Wardrobe").." "..skin_name) skin_obj:set_meta("author", 'Calinou and Jordach') skin_obj:set_meta("license", 'CC-by-SA-4.0') @@ -82,7 +93,9 @@ local def = { paramtype = "light", paramtype2 = "facedir", - groups = {snappy = 3}, + groups = {snappy = 3, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, selection_box = wd_cbox, collision_box = wd_cbox, sounds = default.node_sound_wood_defaults(), @@ -173,7 +186,7 @@ if not skinsdb_mod_path then -- If not managed by skinsdb minetest.register_on_joinplayer(function(player) - local skin = player:get_attribute("homedecor:player_skin") + local skin = player:get_meta():get("homedecor:player_skin") if skin and skin ~= "" then @@ -188,7 +201,7 @@ end minetest.register_craft( { output = "homedecor:wardrobe", recipe = { - { "homedecor:drawer_small", "homedecor:kitchen_cabinet" }, + { "homedecor:drawer_small", "homedecor:kitchen_cabinet_colorable" }, { "homedecor:drawer_small", "group:wood" }, { "homedecor:drawer_small", "group:wood" } }, diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.de.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.de.tr index 211248ae..3e1e6f01 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.de.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.de.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Kleiderschrank Clothes=Kleidung Storage=Lagerraum -Wardrobe=Kleiderschrank diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.es.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.es.tr index 29b8b468..54df714c 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.es.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.es.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Guardarropa Clothes=Ropa Storage=Almacenamiento -Wardrobe=Guardarropa diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.fr.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.fr.tr index 6a816e84..f4ed015e 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.fr.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.fr.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Garde-robe Clothes=Vêtements Storage=Rangement -Wardrobe=Garde-robe diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.it.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.it.tr index 869af94e..46f870f5 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.it.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.it.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe= Clothes= Storage= -Wardrobe= diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ms.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ms.tr index 66c44bb3..157b2eba 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ms.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ms.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Almari Pakaian Clothes=Pakaian Storage=Simpanan -Wardrobe=Almari Pakaian diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt.tr index 73158523..0f916c9b 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Guarda Roupa Clothes=Roupas Storage=Armazenamento -Wardrobe=Guarda Roupa diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt_BR.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt_BR.tr index 73158523..0f916c9b 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.pt_BR.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Guarda Roupa Clothes=Roupas Storage=Armazenamento -Wardrobe=Guarda Roupa diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ru.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ru.tr index d1606573..8b9970b8 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ru.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.ru.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=Гардероб Clothes=Одежда Storage=Хранилище -Wardrobe=Гардероб diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.zh_CN.tr b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.zh_CN.tr index d4a881d5..c7ca1ab2 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/homedecor_wardrobe.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe=衣柜 Clothes=衣服 Storage=储藏间" -Wardrobe=衣柜 diff --git a/mods/homedecor_modpack/homedecor_wardrobe/locale/template.txt b/mods/homedecor_modpack/homedecor_wardrobe/locale/template.txt index 869af94e..46f870f5 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_wardrobe/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: homedecor_wardrobe - - -### init.lua ### - +Wardrobe= Clothes= Storage= -Wardrobe= diff --git a/mods/homedecor_modpack/homedecor_wardrobe/mod.conf b/mods/homedecor_modpack/homedecor_wardrobe/mod.conf index 8e9f955f..37baceda 100644 --- a/mods/homedecor_modpack/homedecor_wardrobe/mod.conf +++ b/mods/homedecor_modpack/homedecor_wardrobe/mod.conf @@ -1,4 +1,4 @@ name = homedecor_wardrobe description = Homedecor mod: wardrobe -depends = homedecor_common, default, player_api -optional_depends = homedecor_kitchen, homedecor_misc, 3d_armor, skinsdb, screwdriver +depends = homedecor_common +optional_depends = homedecor_kitchen, homedecor_misc, 3d_armor, skinsdb, screwdriver, default, player_api diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/.luacheckrc b/mods/homedecor_modpack/homedecor_windows_and_treatments/.luacheckrc deleted file mode 100644 index d0265b52..00000000 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "homedecor", - "unifieddyes", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/init.lua b/mods/homedecor_modpack/homedecor_windows_and_treatments/init.lua index 350ed45a..d65ff5a2 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/init.lua +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/init.lua @@ -12,9 +12,11 @@ homedecor.register("window_quartered", { "homedecor_window_quartered.png", "homedecor_window_quartered.png" }, - use_texture_alpha = true, - groups = {snappy=3}, - sounds = default.node_sound_glass_defaults(), + use_texture_alpha = "blend", + groups = {snappy=3, dig_glass=2}, + _sound_def = { + key = "node_sound_glass_defaults", + }, node_box = { type = "fixed", fixed = { @@ -43,9 +45,11 @@ homedecor.register("window_plain", { "homedecor_window_frame.png", "homedecor_window_frame.png" }, - use_texture_alpha = true, - groups = {snappy=3}, - sounds = default.node_sound_glass_defaults(), + use_texture_alpha = "blend", + groups = {snappy=3, dig_glass=2}, + _sound_def = { + key = "node_sound_glass_defaults", + }, node_box = { type = "fixed", fixed = { @@ -76,8 +80,10 @@ homedecor.register("blinds_thick", { "homedecor_windowblinds.png" }, walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_glass=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = wb1_cbox }) @@ -95,20 +101,24 @@ homedecor.register("blinds_thin", { "homedecor_windowblinds.png" }, walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), + groups = {snappy=3, dig_glass=2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = wb2_cbox }) -minetest.register_node(":homedecor:curtain_closed", { +homedecor.register("curtain_closed", { description = S("Curtains"), tiles = { "homedecor_curtain.png" }, inventory_image = "homedecor_curtain.png", drawtype = 'signlike', - use_texture_alpha = true, + use_texture_alpha = "blend", walkable = false, - groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory=1 }, - sounds = default.node_sound_leaves_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory=1, dig_glass=2 }, + _sound_def = { + key = "node_sound_leaves_defaults", + }, paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", @@ -123,15 +133,17 @@ minetest.register_node(":homedecor:curtain_closed", { end }) -minetest.register_node(":homedecor:curtain_open", { +homedecor.register("curtain_open", { description = S("Curtains (open)"), tiles = { "homedecor_curtain_open.png" }, inventory_image = "homedecor_curtain_open.png", drawtype = 'signlike', - use_texture_alpha = true, + use_texture_alpha = "blend", walkable = false, - groups = { snappy = 3, ud_param2_colorable = 1 }, - sounds = default.node_sound_leaves_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_glass=2 }, + _sound_def = { + key = "node_sound_leaves_defaults", + }, paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", @@ -149,7 +161,7 @@ minetest.register_node(":homedecor:curtain_open", { local mats = { { "brass", S("brass"), "homedecor_generic_metal_brass.png" }, { "wrought_iron", S("wrought iron"), "homedecor_generic_metal_wrought_iron.png" }, - { "wood", S("wood"), "default_wood.png" } + { "wood", S("wood"), homedecor.textures.wood.apple.planks } } for _, m in ipairs(mats) do @@ -158,7 +170,7 @@ for _, m in ipairs(mats) do tiles = { texture }, inventory_image = "homedecor_curtainrod_"..material.."_inv.png", description = S("Curtain Rod (@1)", mat_name), - groups = { snappy = 3 }, + groups = { snappy = 3, dig_glass=2 }, node_box = { type = "fixed", fixed = { @@ -178,8 +190,11 @@ homedecor.register("window_flowerbox", { "homedecor_flowerbox_sides.png" }, inventory_image = "homedecor_flowerbox_inv.png", - sounds = default.node_sound_stone_defaults(), - groups = { snappy = 3 }, + _sound_def = { + key = "node_sound_stone_defaults", + }, + use_texture_alpha = "clip", + groups = { snappy = 3, dig_wood=2 }, node_box = { type = "fixed", fixed = { @@ -194,10 +209,12 @@ homedecor.register("stained_glass", { description = S("Stained Glass"), tiles = {"homedecor_stained_glass.png"}, inventory_image = "homedecor_stained_glass.png", - groups = {snappy=3}, - use_texture_alpha = true, + groups = {snappy=3, dig_glass=2}, + use_texture_alpha = "blend", light_source = 3, - sounds = default.node_sound_glass_defaults(), + _sound_def = { + key = "node_sound_glass_defaults", + }, node_box = { type = "fixed", fixed = { {-0.5, -0.5, 0.46875, 0.5, 0.5, 0.5} } @@ -239,8 +256,10 @@ homedecor.register("shutter", { paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", airbrush_replacement_node = "homedecor:shutter_colored", - groups = { snappy = 3, ud_param2_colorable = 1 }, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3, ud_param2_colorable = 1, dig_wood = 2 }, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = shutter_cbox, node_box = shutter_cbox, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -257,8 +276,10 @@ homedecor.register("shutter_colored", { wield_image = "homedecor_window_shutter_inv.png", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", - groups = { snappy = 3 , not_in_creative_inventory = 1, ud_param2_colorable = 1}, - sounds = default.node_sound_wood_defaults(), + groups = { snappy = 3 , not_in_creative_inventory = 1, ud_param2_colorable = 1, dig_wood = 2}, + _sound_def = { + key = "node_sound_wood_defaults", + }, selection_box = shutter_cbox, node_box = shutter_cbox, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -387,9 +408,9 @@ minetest.register_craft({ minetest.register_craft( { output = "homedecor:curtain_open 4", recipe = { - { "wool:white", "", ""}, - { "wool:white", "", ""}, - { "wool:white", "", ""}, + { homedecor.materials.wool_white, "", ""}, + { homedecor.materials.wool_white, "", ""}, + { homedecor.materials.wool_white, "", ""}, }, }) @@ -445,10 +466,10 @@ minetest.register_craft({ type = "shapeless", output = "homedecor:window_plain 8", recipe = { - "dye:white", - "dye:white", - "dye:white", - "dye:white", + homedecor.materials.dye_white, + homedecor.materials.dye_white, + homedecor.materials.dye_white, + homedecor.materials.dye_white, "building_blocks:woodglass" } }) @@ -457,7 +478,7 @@ minetest.register_craft({ type = "shapeless", output = "homedecor:window_quartered", recipe = { - "dye:white", + homedecor.materials.dye_white, "group:stick", "group:stick", "homedecor:window_plain" @@ -485,8 +506,8 @@ minetest.register_craft({ minetest.register_craft( { output = "homedecor:window_flowerbox", recipe = { - { "homedecor:roof_tile_terracotta", "default:dirt", "homedecor:roof_tile_terracotta" }, - { "", "homedecor:roof_tile_terracotta", "" }, + { "homedecor:roof_tile_terracotta", homedecor.materials.dirt, "homedecor:roof_tile_terracotta" }, + { "", "homedecor:roof_tile_terracotta", "" }, }, }) diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.de.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.de.tr index 6baf79c5..e92c758d 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.de.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.de.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Gardinenstange (@1) -Curtains=Gardinen -Curtains (open)=Gardinen -Stained Glass=Buntglas -Window (plain)=Fenster (schlicht) Window (quartered)=Fenster (geviertelt) +Window (plain)=Fenster (schlicht) Window Blinds (thick)=Jalousie (dick) Window Blinds (thin)=Jalousie (dünn) -Window flowerbox=Fensterblumenkasten -Wooden Shutter=Holzrolladen +Curtains=Gardinen +Curtains (open)=Gardinen brass=Messing -wood=Holz wrought iron=Schmiedeeisen +wood=Holz +Curtain Rod (@1)=Gardinenstange (@1) +Window flowerbox=Fensterblumenkasten +Stained Glass=Buntglas +Wooden Shutter=Holzrolladen diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.es.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.es.tr index 4f51a052..9fb727d3 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.es.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.es.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Palo de cortinas (@1) -Curtains=Cortinas -Curtains (open)=Cortinas -Stained Glass=Vídrio coloreado -Window (plain)=Ventana (lisa) Window (quartered)=Ventana (cuarteada) +Window (plain)=Ventana (lisa) Window Blinds (thick)=Persianas (gruesas) Window Blinds (thin)=Persianas (finas) -Window flowerbox=Caja de flores de ventana -Wooden Shutter=Postigo de madera +Curtains=Cortinas +Curtains (open)=Cortinas brass=latón -wood=madera wrought iron=hierro forjado +wood=madera +Curtain Rod (@1)=Palo de cortinas (@1) +Window flowerbox=Caja de flores de ventana +Stained Glass=Vídrio coloreado +Wooden Shutter=Postigo de madera diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.fr.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.fr.tr index 034c9077..14f505cb 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.fr.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.fr.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Tringle à rideaux (@1) -Curtains=Rideaux -Curtains (open)=Rideaux -Stained Glass=Vitreaux -Window (plain)=Fenêtre Window (quartered)=Fenêtre à petits carreaux +Window (plain)=Fenêtre Window Blinds (thick)=Store (épais) Window Blinds (thin)=Store (fin) -Window flowerbox=Jardinière -Wooden Shutter=Store en bois +Curtains=Rideaux +Curtains (open)=Rideaux brass=laiton -wood=bois wrought iron=fer forgé +wood=bois +Curtain Rod (@1)=Tringle à rideaux (@1) +Window flowerbox=Jardinière +Stained Glass=Vitreaux +Wooden Shutter=Store en bois diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.it.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.it.tr index 95a625b3..25f6f379 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.it.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.it.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Tende (%s) -Curtains=Tende (%s) -Curtains (open)=Tende (%s) -Stained Glass= -Window (plain)= Window (quartered)= +Window (plain)= Window Blinds (thick)=Luce fosforescente bianca (spessa) Window Blinds (thin)=Luce fosforescente bianca (sottile) -Window flowerbox= -Wooden Shutter=Persiana in legno (rossa) +Curtains=Tende +Curtains (open)=Tende (aprire) brass= -wood= wrought iron=Palo di ferro battuto +wood= +Curtain Rod (@1)=Tende (@1) +Window flowerbox= +Stained Glass= +Wooden Shutter=Persiana in legno (rossa) diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ms.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ms.tr index 1ab8a563..a374dbc5 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ms.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ms.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Alang Langsir -Curtains=Langsir -Curtains (open)=Langsir (Terbuka) -Stained Glass=Kaca Berwarna -Window (plain)=Tingkap (Biasa) Window (quartered)=Tingkap (Berpalang) +Window (plain)=Tingkap (Biasa) Window Blinds (thick)=Bidai Tingkap (Tebal) Window Blinds (thin)=Bidai Tingkap (Nipis) -Window flowerbox=Kotak Bunga Tingkap -Wooden Shutter=Pengatup Kayu +Curtains=Langsir +Curtains (open)=Langsir (Terbuka) brass=Loyang -wood=Kayu wrought iron=Besi Tempaan +wood=Kayu +Curtain Rod (@1)=Alang Langsir (@1) +Window flowerbox=Kotak Bunga Tingkap +Stained Glass=Kaca Berwarna +Wooden Shutter=Pengatup Kayu diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt.tr index 76b2ce18..489d14cf 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Suporte de Cortina (@1) -Curtains=Cortinas -Curtains (open)=Cortinas -Stained Glass=Vitral -Window (plain)=Janela (Sem Acabamento) Window (quartered)=Janela (dividida em 4) +Window (plain)=Janela (Sem Acabamento) Window Blinds (thick)=Persiana (grossa) Window Blinds (thin)=Persiana (fina) -Window flowerbox=Janela com Caixa de Flores -Wooden Shutter=Obturador de Madeira +Curtains=Cortinas +Curtains (open)=Cortinas brass=latão -wood=madeira wrought iron=ferro forjado +wood=madeira +Curtain Rod (@1)=Suporte de Cortina (@1) +Window flowerbox=Janela com Caixa de Flores +Stained Glass=Vitral +Wooden Shutter=Obturador de Madeira diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt_BR.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt_BR.tr index 76b2ce18..489d14cf 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt_BR.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.pt_BR.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Suporte de Cortina (@1) -Curtains=Cortinas -Curtains (open)=Cortinas -Stained Glass=Vitral -Window (plain)=Janela (Sem Acabamento) Window (quartered)=Janela (dividida em 4) +Window (plain)=Janela (Sem Acabamento) Window Blinds (thick)=Persiana (grossa) Window Blinds (thin)=Persiana (fina) -Window flowerbox=Janela com Caixa de Flores -Wooden Shutter=Obturador de Madeira +Curtains=Cortinas +Curtains (open)=Cortinas brass=latão -wood=madeira wrought iron=ferro forjado +wood=madeira +Curtain Rod (@1)=Suporte de Cortina (@1) +Window flowerbox=Janela com Caixa de Flores +Stained Glass=Vitral +Wooden Shutter=Obturador de Madeira diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ru.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ru.tr index f0bb9e67..95de1820 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ru.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.ru.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=Карниз для штор (@1) -Curtains=Шторы -Curtains (open)=Шторы -Stained Glass=Витражное стекло -Window (plain)=Окно (простое) Window (quartered)=Окно (разделённое) +Window (plain)=Окно (простое) Window Blinds (thick)=Жалюзи (широкие) Window Blinds (thin)=Жалюзи (узкие) -Window flowerbox=Оконный цветочный ящик -Wooden Shutter=Деревянные ставни +Curtains=Шторы +Curtains (open)=Шторы brass=латунь -wood=дерево wrought iron=кованное железо +wood=дерево +Curtain Rod (@1)=Карниз для штор (@1) +Window flowerbox=Оконный цветочный ящик +Stained Glass=Витражное стекло +Wooden Shutter=Деревянные ставни diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.zh_CN.tr b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.zh_CN.tr index 2a6a51ef..769d6fc5 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.zh_CN.tr +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/homedecor_windows_and_treatments.zh_CN.tr @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)=窗帘杆(@1) -Curtains=窗帘 -Curtains (open)=窗帘(打开) -Stained Glass=彩色玻璃 -Window (plain)=窗口(普通) Window (quartered)=窗户(四分之一) +Window (plain)=窗口(普通) Window Blinds (thick)=百叶窗(厚) Window Blinds (thin)=百叶窗(薄) -Window flowerbox=窗花箱 -Wooden Shutter=木快门 +Curtains=窗帘 +Curtains (open)=窗帘(打开) brass=黄铜 -wood=木材 wrought iron=锻铁 +wood=木材 +Curtain Rod (@1)=窗帘杆(@1) +Window flowerbox=窗花箱 +Stained Glass=彩色玻璃 +Wooden Shutter=木快门 diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/template.txt b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/template.txt index 4efd4a54..c03fdad8 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/template.txt +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/locale/template.txt @@ -1,18 +1,14 @@ # textdomain: homedecor_windows_and_treatments - - -### init.lua ### - -Curtain Rod (@1)= -Curtains= -Curtains (open)= -Stained Glass= -Window (plain)= Window (quartered)= +Window (plain)= Window Blinds (thick)= Window Blinds (thin)= -Window flowerbox= -Wooden Shutter= +Curtains= +Curtains (open)= brass= -wood= wrought iron= +wood= +Curtain Rod (@1)= +Window flowerbox= +Stained Glass= +Wooden Shutter= diff --git a/mods/homedecor_modpack/homedecor_windows_and_treatments/mod.conf b/mods/homedecor_modpack/homedecor_windows_and_treatments/mod.conf index 66e2374e..b3bbbeeb 100644 --- a/mods/homedecor_modpack/homedecor_windows_and_treatments/mod.conf +++ b/mods/homedecor_modpack/homedecor_windows_and_treatments/mod.conf @@ -1,4 +1,4 @@ name = homedecor_windows_and_treatments description = Homedecor mod: windows and treatments -depends = homedecor_common, default, basic_materials, unifieddyes -optional_depends = building_blocks +depends = homedecor_common +optional_depends = building_blocks, default, basic_materials, unifieddyes diff --git a/mods/homedecor_modpack/inbox/.luacheckrc b/mods/homedecor_modpack/inbox/.luacheckrc deleted file mode 100644 index 2ef25d14..00000000 --- a/mods/homedecor_modpack/inbox/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/inbox/locale/template.txt b/mods/homedecor_modpack/inbox/locale/template.txt deleted file mode 100644 index 0036dc96..00000000 --- a/mods/homedecor_modpack/inbox/locale/template.txt +++ /dev/null @@ -1,7 +0,0 @@ -# textdomain: inbox - - -### init.lua ### - -@1's Mailbox= -Mailbox= diff --git a/mods/homedecor_modpack/inbox/mod.conf b/mods/homedecor_modpack/inbox/mod.conf deleted file mode 100644 index c36bc793..00000000 --- a/mods/homedecor_modpack/inbox/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = inbox -depends = default, homedecor_common -optional_depends = screwdriver diff --git a/mods/homedecor_modpack/itemframes/.luacheckrc b/mods/homedecor_modpack/itemframes/.luacheckrc deleted file mode 100644 index 61cf46a2..00000000 --- a/mods/homedecor_modpack/itemframes/.luacheckrc +++ /dev/null @@ -1,21 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "mesecon", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/itemframes/init.lua b/mods/homedecor_modpack/itemframes/init.lua index cfd77e19..76fade2a 100644 --- a/mods/homedecor_modpack/itemframes/init.lua +++ b/mods/homedecor_modpack/itemframes/init.lua @@ -4,12 +4,14 @@ local tmp = {} local sd_disallow = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil minetest.register_entity("itemframes:item",{ - hp_max = 1, - visual="wielditem", - visual_size={x = 0.33, y = 0.33}, - collisionbox = {0, 0, 0, 0, 0, 0}, - physical = false, - textures = {"air"}, + initial_properties = { + hp_max = 1, + visual = "wielditem", + visual_size = {x = 0.33, y = 0.33}, + collisionbox = {0, 0, 0, 0, 0, 0}, + physical = false, + textures = {"air"}, + }, on_activate = function(self, staticdata) if tmp.nodename ~= nil and tmp.texture ~= nil then self.nodename = tmp.nodename @@ -135,9 +137,13 @@ minetest.register_node("itemframes:frame",{ paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {choppy = 2, dig_immediate = 2}, + groups = {choppy = 2, dig_immediate = 2, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), + _sound_def = { + key = "node_sound_wood_defaults", + }, on_rotate = sd_disallow or nil, after_place_node = function(pos, placer, itemstack) local meta = minetest.get_meta(pos) @@ -213,8 +219,12 @@ minetest.register_node("itemframes:pedestal",{ --}, tiles = {"itemframes_pedestal.png"}, paramtype = "light", - groups = {cracky = 3}, - sounds = default.node_sound_stone_defaults(), + groups = {cracky = 3, dig_stone = 2, pickaxey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_stone_defaults", + }, on_rotate = sd_disallow or nil, after_place_node = function(pos, placer, itemstack) local meta = minetest.get_meta(pos) @@ -308,7 +318,7 @@ minetest.register_craft({ output = 'itemframes:frame', recipe = { {'group:stick', 'group:stick', 'group:stick'}, - {'group:stick', 'default:paper', 'default:stick'}, + {'group:stick', homedecor.materials.paper, 'default:stick'}, {'group:stick', 'group:stick', 'group:stick'}, } }) @@ -316,9 +326,9 @@ minetest.register_craft({ minetest.register_craft({ output = 'itemframes:pedestal', recipe = { - {'default:stone', 'default:stone', 'default:stone'}, - {'', 'default:stone', ''}, - {'default:stone', 'default:stone', 'default:stone'}, + {homedecor.materials.stone, homedecor.materials.stone, homedecor.materials.stone}, + {'', homedecor.materials.stone, ''}, + {homedecor.materials.stone, homedecor.materials.stone, homedecor.materials.stone}, } }) diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.de.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.de.tr index 062fe6fb..efd5f8f1 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.de.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.de.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Ausstellrahmen Item frame (owned by @1)=Ausstellrahmen (gehört @1) Pedestal=Podest diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.es.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.es.tr index 451ed9de..3a402fcb 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.es.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.es.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Marco para objetos Item frame (owned by @1)=Marco para objetos (propiedad de @1) Pedestal=Pedestal diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.fr.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.fr.tr index 929c728e..ffdde537 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.fr.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.fr.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Cadre Item frame (owned by @1)=Cadre (propriété de @1) Pedestal=Piédestal diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.it.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.it.tr index 90d8fd9f..cd692745 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.it.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.it.tr @@ -1,9 +1,5 @@ # textdomain: itemframes - - -### init.lua ### - -Item frame= -Item frame (owned by @1)=%s (di proprietà di %s) -Pedestal= -Pedestal (owned by @1)=%s (di proprietà di %s) +Item frame=Cornice dell'articolo +Item frame (owned by @1)=Cornice dell'articolo (di proprietà di @1) +Pedestal=Piedistallo +Pedestal (owned by @1)=Piedistallo (di proprietà di @1) diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.ms.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.ms.tr index 3d9c4e1a..a523c564 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.ms.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.ms.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Bingkai Item Item frame (owned by @1)=Bingkai Item (hak milik @1) Pedestal=Kekaki diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.pt.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.pt.tr index 8f906cb4..7ff34eb5 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.pt.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.pt.tr @@ -1,9 +1,5 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Quadro de Item -Item frame (owned by @1)=Quadro de item (pertence a @l) +Item frame (owned by @1)=Quadro de item (pertence a @1) Pedestal=Pedestal -Pedestal (owned by @1)=Pedestal (pertence a @l) +Pedestal (owned by @1)=Pedestal (pertence a @1) diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.pt_BR.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.pt_BR.tr index 8f906cb4..7ff34eb5 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.pt_BR.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.pt_BR.tr @@ -1,9 +1,5 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Quadro de Item -Item frame (owned by @1)=Quadro de item (pertence a @l) +Item frame (owned by @1)=Quadro de item (pertence a @1) Pedestal=Pedestal -Pedestal (owned by @1)=Pedestal (pertence a @l) +Pedestal (owned by @1)=Pedestal (pertence a @1) diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.ru.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.ru.tr index 32ac14e0..3123f9aa 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.ru.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.ru.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=Рамка предметов Item frame (owned by @1)=Рамка предметов (принадлежит @1) Pedestal=Пьедестал diff --git a/mods/homedecor_modpack/itemframes/locale/itemframes.zh_CN.tr b/mods/homedecor_modpack/itemframes/locale/itemframes.zh_CN.tr index f8cba6de..5ce5eac4 100644 --- a/mods/homedecor_modpack/itemframes/locale/itemframes.zh_CN.tr +++ b/mods/homedecor_modpack/itemframes/locale/itemframes.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame=项目框架 Item frame (owned by @1)=物品框架(归@1所有) Pedestal=底座 diff --git a/mods/homedecor_modpack/itemframes/locale/template.txt b/mods/homedecor_modpack/itemframes/locale/template.txt index 0e61b28b..56a2e8b6 100644 --- a/mods/homedecor_modpack/itemframes/locale/template.txt +++ b/mods/homedecor_modpack/itemframes/locale/template.txt @@ -1,8 +1,4 @@ # textdomain: itemframes - - -### init.lua ### - Item frame= Item frame (owned by @1)= Pedestal= diff --git a/mods/homedecor_modpack/itemframes/mod.conf b/mods/homedecor_modpack/itemframes/mod.conf index 32db2200..eb240ac9 100644 --- a/mods/homedecor_modpack/itemframes/mod.conf +++ b/mods/homedecor_modpack/itemframes/mod.conf @@ -1,3 +1,3 @@ name = itemframes -depends = default, homedecor_common -optional_depends = mesecons_mvps, screwdriver +depends = homedecor_common +optional_depends = mesecons_mvps, screwdriver, default diff --git a/mods/homedecor_modpack/lavalamp/.luacheckrc b/mods/homedecor_modpack/lavalamp/.luacheckrc deleted file mode 100644 index 25049b92..00000000 --- a/mods/homedecor_modpack/lavalamp/.luacheckrc +++ /dev/null @@ -1,20 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", - "unifieddyes", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/lavalamp/init.lua b/mods/homedecor_modpack/lavalamp/init.lua index 74d2f7b2..72a3171f 100644 --- a/mods/homedecor_modpack/lavalamp/init.lua +++ b/mods/homedecor_modpack/lavalamp/init.lua @@ -22,7 +22,7 @@ minetest.register_node("lavalamp:lavalamp", { }, }, }, - use_texture_alpha = true, + use_texture_alpha = "blend", inventory_image = "lavalamp_lamp_inv.png", paramtype = "light", paramtype2 = "color", @@ -34,8 +34,12 @@ minetest.register_node("lavalamp:lavalamp", { type = "fixed", fixed = { -0.25, -0.5, -0.25, 0.25,0.5, 0.25 }, }, - groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, ud_param2_colorable = 1}, - sounds = default.node_sound_glass_defaults(), + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, ud_param2_colorable = 1, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_glass_defaults", + }, on_construct = unifieddyes.on_construct, on_dig = unifieddyes.on_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) @@ -62,8 +66,12 @@ minetest.register_node("lavalamp:lavalamp_off", { type = "fixed", fixed = { -0.25, -0.5, -0.25, 0.25,0.5, 0.25 }, }, - groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, not_in_creative_inventory=1}, - sounds = default.node_sound_glass_defaults(), + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, not_in_creative_inventory=1, axey=5}, + is_ground_content = false, + _mcl_hardness=1.6, + _sound_def = { + key = "node_sound_glass_defaults", + }, on_construct = unifieddyes.on_construct, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) node.name = "lavalamp:lavalamp" @@ -80,9 +88,9 @@ minetest.register_node("lavalamp:lavalamp_off", { minetest.register_craft({ output = "lavalamp:lavalamp", recipe = { - {"", "wool:white", "", }, - {"", "bucket:bucket_water", "", }, - {"", "wool:black", "", } + {"", homedecor.materials.wool_white, "", }, + {"", homedecor.materials.water_bucket, "", }, + {"", homedecor.materials.wool_black, "", } } }) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.de.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.de.tr index f6dbb70a..1d98991f 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.de.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.de.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lavalampe Lava Lamp/Light (off)=Lavalampe (aus) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.es.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.es.tr index f5d85673..758ce835 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.es.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.es.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lámpara de lava Lava Lamp/Light (off)=Lámpara de lava (apagada) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.fr.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.fr.tr index 53152404..17c8dd9c 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.fr.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.fr.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lampe à lave Lava Lamp/Light (off)=Lampe à lave (éteinte) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.it.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.it.tr index cb588376..3c733459 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.it.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.it.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lampada da tavolo Lava Lamp/Light (off)= diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.ms.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.ms.tr index af93e50b..2db5eafb 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.ms.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.ms.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lampu Lava Lava Lamp/Light (off)=Lampu Lava (tutup) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt.tr index 3ab7b561..436368c1 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lâmpada de Lava Lava Lamp/Light (off)=Lâmpada de Lava (desligada) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt_BR.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt_BR.tr index 3ab7b561..436368c1 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt_BR.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.pt_BR.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Lâmpada de Lava Lava Lamp/Light (off)=Lâmpada de Lava (desligada) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.ru.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.ru.tr index 78ace11e..8c26fcdd 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.ru.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.ru.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=Лавовый светильник Lava Lamp/Light (off)=Лавовый светильник (выключен) diff --git a/mods/homedecor_modpack/lavalamp/locale/lavalamp.zh_CN.tr b/mods/homedecor_modpack/lavalamp/locale/lavalamp.zh_CN.tr index 3d8cbb88..32088b8f 100644 --- a/mods/homedecor_modpack/lavalamp/locale/lavalamp.zh_CN.tr +++ b/mods/homedecor_modpack/lavalamp/locale/lavalamp.zh_CN.tr @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light=岩浆灯 Lava Lamp/Light (off)=岩浆灯(关闭) diff --git a/mods/homedecor_modpack/lavalamp/locale/template.txt b/mods/homedecor_modpack/lavalamp/locale/template.txt index 1ae8f3e3..698a77eb 100644 --- a/mods/homedecor_modpack/lavalamp/locale/template.txt +++ b/mods/homedecor_modpack/lavalamp/locale/template.txt @@ -1,7 +1,3 @@ # textdomain: lavalamp - - -### init.lua ### - Lava Lamp/Light= Lava Lamp/Light (off)= diff --git a/mods/homedecor_modpack/lavalamp/mod.conf b/mods/homedecor_modpack/lavalamp/mod.conf index 87daabb3..2fbb5156 100644 --- a/mods/homedecor_modpack/lavalamp/mod.conf +++ b/mods/homedecor_modpack/lavalamp/mod.conf @@ -1,2 +1,3 @@ name = lavalamp -depends = wool, bucket, homedecor_common, unifieddyes +depends = homedecor_common +optional_depends = wool, bucket, unifieddyes diff --git a/mods/homedecor_modpack/listnodes.sh b/mods/homedecor_modpack/listnodes.sh deleted file mode 100644 index 23320801..00000000 --- a/mods/homedecor_modpack/listnodes.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -echo "Node listing as of "`date` > nodes.txt - -for i in *.lua; do - echo -e "\nIn $i:\n" >> nodes.txt - cat $i | grep "minetest.register_node(" | \ - sed "s/minetest.register_node(.homedecor:/homedecor:/; s/., {//" | \ - sort >> nodes.txt -done - -less nodes.txt -rm -f nodes.txt diff --git a/mods/homedecor_modpack/modpack.txt b/mods/homedecor_modpack/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/homedecor_modpack/plasmascreen/.luacheckrc b/mods/homedecor_modpack/plasmascreen/.luacheckrc deleted file mode 100644 index 4002b90d..00000000 --- a/mods/homedecor_modpack/plasmascreen/.luacheckrc +++ /dev/null @@ -1,19 +0,0 @@ -unused_args = false -allow_defined_top = true -max_comment_line_length = 999 - -read_globals = { - "DIR_DELIM", - "minetest", "core", - "unpack", - "dump", - table = { fields = { "copy", "getn" } }, - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "screwdriver", -} - -globals = { -} - diff --git a/mods/homedecor_modpack/plasmascreen/README.md b/mods/homedecor_modpack/plasmascreen/README.md deleted file mode 100644 index 867c2621..00000000 --- a/mods/homedecor_modpack/plasmascreen/README.md +++ /dev/null @@ -1,14 +0,0 @@ -PLASMASCREEN -============ - -Mod adding a plasma screen TV for Minetest. - -This mod adds a 2x3 plasma screen TV using a single large mesh node. - -Point at the bottom center position where you want the TV to go, when placing. - -Note: If you're at a really steep view angle when trying to place a screen, -the mod may occasionally refuse to place it (or it just appears for a moment). -Just move over a bit, so that your target position is more directly in front -of you. - diff --git a/mods/homedecor_modpack/plasmascreen/mod.conf b/mods/homedecor_modpack/plasmascreen/mod.conf deleted file mode 100644 index ea247cfb..00000000 --- a/mods/homedecor_modpack/plasmascreen/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = plasmascreen -depends = default, homedecor_common, homedecor_electronics -optional_depends = screwdriver diff --git a/mods/ilights/depends.txt b/mods/ilights/depends.txt deleted file mode 100644 index fe6a422a..00000000 --- a/mods/ilights/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -unifieddyes -intllib? -mesecons? -digilines? diff --git a/mods/ilights/description.txt b/mods/ilights/description.txt deleted file mode 100644 index 18f81dbf..00000000 --- a/mods/ilights/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds various lights. diff --git a/mods/ilights/init.lua b/mods/ilights/init.lua index d8e8316b..3bb4b81e 100644 --- a/mods/ilights/init.lua +++ b/mods/ilights/init.lua @@ -3,19 +3,7 @@ ilights = {} --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.global_exists("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - S = intllib.make_gettext_pair() - else - -- Old method using text files. - S = intllib.Getter() - end -else - S = function(s) return s end -end +local S = minetest.get_translator(minetest.get_current_modname()) if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then ilights.expect_infinite_stacks = false @@ -185,8 +173,9 @@ for _, onoff in ipairs({"on", "off"}) do { name = "ilights_lamp_bulb_base.png", color = 0xffffffff }, "ilights_lamp_lens_"..onoff..".png" }, - use_texture_alpha = true, + use_texture_alpha = "clip", groups = {cracky=3, ud_param2_colorable = 1, not_in_creative_inventory = nici}, + is_ground_content = false, paramtype = "light", paramtype2 = "colorwallmounted", palette = "unifieddyes_palette_colorwallmounted.png", diff --git a/mods/ilights/mod.conf b/mods/ilights/mod.conf index f34535b7..740a90c9 100644 --- a/mods/ilights/mod.conf +++ b/mods/ilights/mod.conf @@ -1,2 +1,6 @@ name = ilights +title = Ilights +description = Adds various lights. +depends = default, unifieddyes +optional_depends = mesecons, digilines min_minetest_version = 5.2.0 diff --git a/mods/letters/.luacheckrc b/mods/letters/.luacheckrc new file mode 100644 index 00000000..205b47ae --- /dev/null +++ b/mods/letters/.luacheckrc @@ -0,0 +1,17 @@ +max_line_length = 180 +unused_args = true + +globals = { + "letters" +} + +read_globals = { + "minetest", + "vector", + "default", + table = { + fields = { + "copy" + } + } +} diff --git a/mods/letters/api.lua b/mods/letters/api.lua new file mode 100644 index 00000000..85234846 --- /dev/null +++ b/mods/letters/api.lua @@ -0,0 +1,76 @@ +local lettersmod = minetest.get_current_modname() +local letterspath = minetest.get_modpath(lettersmod) +local letter_cutter = letters.letter_cutter + +letter_cutter.known_nodes = {} + +-- Use files in the textures folder to populate letter group tables. +letter_cutter.names_upper = {} +letter_cutter.names_lower = {} +letter_cutter.names_digit = {} +for _, tile in ipairs(minetest.get_dir_list(letterspath .. "/textures", false)) do + local char, group = tile:match("_([%d%u%l])(%l)_overlay") + if char and group then + if group == "d" then + table.insert(letter_cutter.names_digit, "letter_" ..char..group) + elseif group == "u" then + table.insert(letter_cutter.names_upper, "letter_" ..char..group) + elseif group == "l" then + table.insert(letter_cutter.names_lower, "letter_" ..char..group) + end + end +end + +--- Register a node for use as a material in letter cutters. +-- @param modname is the mod that the node belongs to. +-- @param subname is the actual name of the node. +-- @param from_node is the node that the letters will be crafted from (Usually modname:subname). +-- @param description is the description of the node. +-- @param tiles defines the image that will be used with the node. +-- @param basedef (optional) may contain additional node definition parameters. Some might be overwritten to make the letters look and work as intended. +function letters.register_letters(modname, subname, from_node, description, tiles, basedef) + basedef = basedef and table.copy(basedef) or {} + + --default node + basedef.drawtype = "signlike" + basedef.paramtype = "light" + basedef.paramtype2 = basedef.paramtype2 or "wallmounted" + basedef.sunlight_propagates = true + basedef.is_ground_content = false + basedef.walkable = false + basedef.selection_box = { + type = "wallmounted" + --wall_top = + --wall_bottom = + --wall_side = + } + basedef.groups = basedef.groups or { + not_in_creative_inventory = 1, + not_in_craft_guide = 1, + oddly_breakable_by_hand = 1, + attached_node = 1 + } + basedef.legacy_wallmounted = false + + -- Register a new node for each letter using the provided from_node as the material. + for _, tile in ipairs(minetest.get_dir_list(letterspath .. "/textures", false)) do + local char, group = tile:match("_([%d%u%l])(%l)_overlay") + if char and group then + local def = table.copy(basedef) + + if group == "d" then + def.description = description.. " " ..char + elseif group == "u" then + def.description = description.. " " ..char:upper() + elseif group == "l" then + def.description = description.. " " ..char + end + def.inventory_image = tiles.. "^" ..tile.. "^[makealpha:255,126,126" + def.wield_image = def.inventory_image + def.tiles = {def.inventory_image} + + minetest.register_node(":" ..modname..":"..subname.. "_letter_" ..char..group,def) + end + end + letter_cutter.known_nodes[from_node] = {modname, subname} +end \ No newline at end of file diff --git a/mods/letters/depends.txt b/mods/letters/depends.txt deleted file mode 100644 index 03cd6c57..00000000 --- a/mods/letters/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -darkage? -colouredstonebricks? diff --git a/mods/letters/description.txt b/mods/letters/description.txt index a266ce25..3b15343d 100644 --- a/mods/letters/description.txt +++ b/mods/letters/description.txt @@ -1 +1 @@ -Adds a letter cutting tool with letter "signlike" nodes. +Adds a letter cutting tool with letter "signlike" nodes. \ No newline at end of file diff --git a/mods/letters/init.lua b/mods/letters/init.lua index 935655be..db1c6153 100644 --- a/mods/letters/init.lua +++ b/mods/letters/init.lua @@ -1,647 +1,13 @@ letters = { - {"al", "au", "a", "A"}, - {"bl", "bu", "b", "B"}, - {"cl", "cu", "c", "C"}, - {"dl", "du", "d", "D"}, - {"el", "eu", "e", "E"}, - {"fl", "fu", "f", "F"}, - {"gl", "gu", "g", "G"}, - {"hl", "hu", "h", "H"}, - {"il", "iu", "i", "I"}, - {"jl", "ju", "j", "J"}, - {"kl", "ku", "k", "K"}, - {"ll", "lu", "l", "L"}, - {"ml", "mu", "m", "M"}, - {"nl", "nu", "n", "N"}, - {"ol", "ou", "o", "O"}, - {"pl", "pu", "p", "P"}, - {"ql", "qu", "q", "Q"}, - {"rl", "ru", "r", "R"}, - {"sl", "su", "s", "S"}, - {"tl", "tu", "t", "T"}, - {"ul", "uu", "u", "U"}, - {"vl", "vu", "v", "V"}, - {"wl", "wu", "w", "W"}, - {"xl", "xu", "x", "X"}, - {"yl", "yu", "y", "Y"}, - {"zl", "zu", "z", "Z"}, + letter_cutter = {} } -letters_reversed = {} +local MP = minetest.get_modpath(minetest.get_current_modname()) +dofile(MP..'/api.lua') +dofile(MP..'/itemlist.lua') -for i, t in ipairs(letters) do - letters_reversed[t[3]] = i +if minetest.get_modpath("default") then + dofile(MP..'/letter_cutter.lua') end -letter_cutter = {} -letter_cutter.known_nodes = {} - -letter_cutter.show_item_list = dofile( - minetest.get_modpath(minetest.get_current_modname())..'/itemlist.lua') - -function letters.register_letters(modname, subname, from_node, description, tiles, def) - - def = def and table.copy(def) or {} - - --default node - def.drawtype = "signlike" - def.paramtype = "light" - def.paramtype2 = def.paramtype2 or "wallmounted" - def.sunlight_propagates = true - def.is_ground_content = false - def.walkable = false - def.selection_box = { - type = "wallmounted" - --wall_top = - --wall_bottom = - --wall_side = - } - def.groups = def.groups or { - not_in_creative_inventory = 1, - not_in_craft_guide = 1, - oddly_breakable_by_hand = 1, - attached_node = 1 - } - def.legacy_wallmounted = false - - - for _, row in ipairs(letters) do - - def = table.copy(def) - def.description = description.. " " ..row[3] - def.inventory_image = tiles.. "^letters_" ..row[1].. "_overlay.png^[makealpha:255,126,126" - def.wield_image = def.inventory_image - def.tiles = {def.inventory_image} - - minetest.register_node(":" ..modname..":"..subname.. "_letter_" ..row[1],def) - - def = table.copy(def) - def.description = description.. " " ..row[4] - def.inventory_image = tiles.. "^letters_" ..row[2].. "_overlay.png^[makealpha:255,126,126" - def.wield_image = def.inventory_image - def.tiles = {def.inventory_image} - - minetest.register_node(":" ..modname..":"..subname.. "_letter_" ..row[2], def) - - --[[minetest.register_craft({ - output = from_node, - recipe = { - {modname..":"..name, modname..":"..name, modname..":"..name}, - {modname..":"..name, modname..":"..name, modname..":"..name}, - {modname..":"..name, modname..":"..name, modname..":"..name}, - }, - })--]] - end - letter_cutter.known_nodes[from_node] = {modname, subname} -end - -cost = 0.110 - -letter_cutter.names_lower = { - {"letter_al"}, - {"letter_bl"}, - {"letter_cl"}, - {"letter_dl"}, - {"letter_el"}, - {"letter_fl"}, - {"letter_gl"}, - {"letter_hl"}, - {"letter_il"}, - {"letter_jl"}, - {"letter_kl"}, - {"letter_ll"}, - {"letter_ml"}, - {"letter_nl"}, - {"letter_ol"}, - {"letter_pl"}, - {"letter_ql"}, - {"letter_rl"}, - {"letter_sl"}, - {"letter_tl"}, - {"letter_ul"}, - {"letter_vl"}, - {"letter_wl"}, - {"letter_xl"}, - {"letter_yl"}, - {"letter_zl"}, -} - -letter_cutter.names_upper = { - {"letter_au"}, - {"letter_bu"}, - {"letter_cu"}, - {"letter_du"}, - {"letter_eu"}, - {"letter_fu"}, - {"letter_gu"}, - {"letter_hu"}, - {"letter_iu"}, - {"letter_ju"}, - {"letter_ku"}, - {"letter_lu"}, - {"letter_mu"}, - {"letter_nu"}, - {"letter_ou"}, - {"letter_pu"}, - {"letter_qu"}, - {"letter_ru"}, - {"letter_su"}, - {"letter_tu"}, - {"letter_uu"}, - {"letter_vu"}, - {"letter_wu"}, - {"letter_xu"}, - {"letter_yu"}, - {"letter_zu"}, -} - -function letter_cutter:get_output_inv_lower(modname, subname, amount, max) - - local list = {} - if amount < 1 then - return list - end - - for i, t in ipairs(letter_cutter.names_lower) do - table.insert(list, modname .. ":" .. subname .. "_" .. t[1] - .. " " .. math.min(math.floor(amount/cost), max)) - end - return list -end - -function letter_cutter:get_output_inv_upper(modname, subname, amount, max) - - local list = {} - if amount < 1 then - return list - end - - for i, t in ipairs(letter_cutter.names_upper) do - table.insert(list, modname .. ":" .. subname .. "_" .. t[1] - .. " " .. math.min(math.floor(amount/cost), max)) - end - return list -end - -function letter_cutter:reset_lower(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - inv:set_list("input", {}) - inv:set_list("output", {}) - meta:set_int("anz", 0) - - meta:set_string("infotext", - "Letter Cutter (Lower) is empty (owned by ".. - meta:get_string("owner")..")") -end - -function letter_cutter:reset_upper(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - inv:set_list("input", {}) - inv:set_list("output", {}) - meta:set_int("anz", 0) - - meta:set_string("infotext", - "Letter Cutter (Upper) is empty (owned by ".. - meta:get_string("owner")..")") -end - -function letter_cutter:update_inventory_lower(pos, amount) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - amount = meta:get_int("anz") + amount - - if amount < 1 then -- If the last block is taken out. - self:reset_lower(pos) - return - end - - local stack = inv:get_stack("input", 1) - if stack:is_empty() then - self:reset_lower(pos) - return - - end - local node_name = stack:get_name() or "" - local name_parts = letter_cutter.known_nodes[node_name] or "" - local modname = name_parts[1] or "" - local material = name_parts[2] or "" - - inv:set_list("input", { - node_name.. " " .. math.floor(amount) - }) - - -- Display: - inv:set_list("output", - self:get_output_inv_lower(modname, material, amount, - meta:get_int("max_offered"))) - -- Store how many microblocks are available: - meta:set_int("anz", amount) - - meta:set_string("infotext", - "Letter Cutter (Lower) is working (owned by ".. - meta:get_string("owner")..")") -end - -function letter_cutter:update_inventory_upper(pos, amount) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - amount = meta:get_int("anz") + amount - - if amount < 1 then -- If the last block is taken out. - self:reset_upper(pos) - return - end - - local stack = inv:get_stack("input", 1) - if stack:is_empty() then - self:reset_upper(pos) - return - - end - local node_name = stack:get_name() or "" - local name_parts = letter_cutter.known_nodes[node_name] or "" - local modname = name_parts[1] or "" - local material = name_parts[2] or "" - - inv:set_list("input", { - node_name.. " " .. math.floor(amount) - }) - - -- Display: - inv:set_list("output", - self:get_output_inv_upper(modname, material, amount, - meta:get_int("max_offered"))) - -- Store how many microblocks are available: - meta:set_int("anz", amount) - - meta:set_string("infotext", - "Letter Cutter (Upper) is working (owned by ".. - meta:get_string("owner")..")") -end - - -function letter_cutter.allow_metadata_inventory_move( - pos, from_list, from_index, to_list, to_index, count, player) - return 0 -end - - --- Only input- and recycle-slot are intended as input slots: -function letter_cutter.allow_metadata_inventory_put( - pos, listname, index, stack, player) - -- The player is not allowed to put something in there: - if listname == "output" then - return 0 - end - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stackname = stack:get_name() - local count = stack:get_count() - - -- Only accept certain blocks as input which are known to be craftable into stairs: - if listname == "input" then - if not inv:is_empty("input") and - inv:get_stack("input", index):get_name() ~= stackname then - return 0 - end - for name, t in pairs(letter_cutter.known_nodes) do - if name == stackname and inv:room_for_item("input", stack) then - return count - end - end - return 0 - end -end - -function letter_cutter.on_metadata_inventory_put_lower( - pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stackname = stack:get_name() - local count = stack:get_count() - - if listname == "input" then - letter_cutter:update_inventory_lower(pos, count) - end -end - -function letter_cutter.on_metadata_inventory_put_upper( - pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stackname = stack:get_name() - local count = stack:get_count() - - if listname == "input" then - letter_cutter:update_inventory_upper(pos, count) - end -end - -function letter_cutter.on_metadata_inventory_take_lower( - pos, listname, index, stack, player) - if listname == "output" then - -- We do know how much each block at each position costs: - letter_cutter:update_inventory_lower(pos, 8 * -cost) - elseif listname == "input" then - -- Each normal (= full) block taken costs 8 microblocks: - letter_cutter:update_inventory_lower(pos, 8 * -stack:get_count()) - end - -- The recycle field plays no role here since it is processed immediately. -end - -function letter_cutter.on_metadata_inventory_take_upper( - pos, listname, index, stack, player) - if listname == "output" then - -- We do know how much each block at each position costs: - letter_cutter:update_inventory_upper(pos, 8 * -cost) - elseif listname == "input" then - -- Each normal (= full) block taken costs 8 microblocks: - letter_cutter:update_inventory_upper(pos, 8 * -stack:get_count()) - end - -- The recycle field plays no role here since it is processed immediately. -end - -function letter_cutter.remove_from_input(pos, origname, count) - local node = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - - local cutterinv = meta:get_inventory() - - local removed = cutterinv:remove_item("input", origname .. " " .. tostring(count)) - if node.name == "letters:letter_cutter_upper" then - letter_cutter:update_inventory_upper(pos, -removed:get_count()) - else - letter_cutter:update_inventory_lower(pos, -removed:get_count()) - end -end - -gui_slots = "listcolors[#606060AA;#808080;#101010;#202020;#FFF]" - -local function update_cutter_formspec(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", "size[11,9]" ..gui_slots.. - "label[0,0;Input\nmaterial]" .. - "list[current_name;input;1.5,0;1,1;]" .. - "list[current_name;output;2.8,0;8,4;]" .. - "button[0,1;2.5,1;itemlist;Cuttable materials]" .. - "list[current_player;main;1.5,5;8,4;]" .. - "field[0.5,4.3;3,1;text;Enter text;${text}]" .. - "button[3.5,4;2,1;make_text;Make text]" .. - "label[5.5,4.2;" .. minetest.formspec_escape(meta:get_string("message")) .. "]") -end - -local function cut_from_text(pos, input_text, player) - local playername = player:get_player_name() - - local node = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - - local cutterinv = meta:get_inventory() - local cutterinput = cutterinv:get_list("input") - local cuttercount = cutterinput[1]:get_count() - - if cuttercount < 1 then - meta:set_string("message", "No materials.") - update_cutter_formspec(pos) - return - end - - local origname = cutterinput[1]:get_name() - - local playerinv = player:get_inventory() - local playermain = playerinv:get_list("main") - - meta:set_string("text", input_text) - - local totalcost = 0 - local throwawayinv = minetest.create_detached_inventory("letter_cutter:throwaway", {}, playername) - - throwawayinv:set_size("main", playerinv:get_size("main")) - throwawayinv:set_list("main", playerinv:get_list("main")) - - for i = 1, #input_text do - local char = input_text:sub(i, i) - - if char:match("[%u%l]") then - local isupper = char == char:upper() - local charset = isupper and letter_cutter.names_upper or letter_cutter.names_lower - local lettername = origname .. "_" .. charset[letters_reversed[char:lower()]][1] - - if cuttercount < totalcost + cost then - meta:set_string("message", "Not enough materials.") - update_cutter_formspec(pos) - - minetest.remove_detached_inventory("letter_cutter:throwaway") - return - end - - if lettername and not throwawayinv:room_for_item("main", lettername) then - meta:set_string("message", "Not enough room.") - update_cutter_formspec(pos) - - minetest.remove_detached_inventory("letter_cutter:throwaway") - return - end - - totalcost = totalcost + cost - - throwawayinv:add_item("main", lettername) - end - end - - meta:set_string("message", "Successfully added letters to inventory.") - update_cutter_formspec(pos) - - letter_cutter.remove_from_input(pos, origname, tostring(math.ceil(totalcost))) - playerinv:set_list("main", throwawayinv:get_list("main")) - - minetest.remove_detached_inventory("letter_cutter:throwaway") -end - -function letter_cutter.on_construct_lower(pos) - local meta = minetest.get_meta(pos) - update_cutter_formspec(pos) - - meta:set_int("anz", 0) -- No microblocks inside yet. - meta:set_string("max_offered", 9) -- How many items of this kind are offered by default? - meta:set_string("infotext", "Letter Cutter (Lower) is empty") - - meta:set_string("text", "") - meta:set_string("message", "") - - local inv = meta:get_inventory() - inv:set_size("input", 1) -- Input slot for full blocks of material x. - inv:set_size("output", 4*8) -- 4x8 versions of stair-parts of material x. - - letter_cutter:reset_lower(pos) -end - -function letter_cutter.on_construct_upper(pos) - local meta = minetest.get_meta(pos) - update_cutter_formspec(pos) - - meta:set_int("anz", 0) -- No microblocks inside yet. - meta:set_string("max_offered", 9) -- How many items of this kind are offered by default? - meta:set_string("infotext", "Letter Cutter (Upper) is empty") - - meta:set_string("text", "") - meta:set_string("message", "") - - local inv = meta:get_inventory() - inv:set_size("input", 1) -- Input slot for full blocks of material x. - inv:set_size("output", 4*8) -- 4x8 versions of stair-parts of material x. - - letter_cutter:reset_upper(pos) -end - - -function letter_cutter.can_dig(pos,player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if not inv:is_empty("input") then - return false - end - return true -end - -function letter_cutter.on_receive_fields(pos, formname, fields, sender) - if fields.itemlist then - local list = {} - for name, t in pairs(letter_cutter.known_nodes) do - list[#list+1] = name - end - letter_cutter.show_item_list(sender, 'Cuttable materials', list, pos) - return - end - - if fields.make_text and fields.text then - cut_from_text(pos, fields.text, sender) - return - end -end - -minetest.register_node("letters:letter_cutter_lower", { - description = "Lower Case Leter Cutter", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.4375, -0.5, -0.4375, -0.3125, 0.125, -0.3125}, -- NodeBox1 - {-0.4375, -0.5, 0.3125, -0.3125, 0.125, 0.4375}, -- NodeBox2 - {0.3125, -0.5, 0.3125, 0.4375, 0.125, 0.4375}, -- NodeBox3 - {0.3125, -0.5, -0.4375, 0.4375, 0.125, -0.3125}, -- NodeBox4 - {-0.5, 0.0625, -0.5, 0.5, 0.25, 0.5}, -- NodeBox5 - {-0.125, 0.25, 0.125, 0.125, 0.3125, 0.1875}, -- NodeBox6 - {0.125, 0.25, 0.0625, 0.1875, 0.3125, 0.125}, -- NodeBox7 - {0.1875, 0.25, -0.1875, 0.25, 0.3125, 0.1875}, -- NodeBox8 - {-0.1875, 0.25, 0.0625, -0.125, 0.3125, 0.125}, -- NodeBox9 - {-0.25, 0.25, -0.1875, -0.1875, 0.3125, 0.0625}, -- NodeBox10 - {-0.1875, 0.25, -0.25, -0.125, 0.3125, -0.1875}, -- NodeBox11 - {-0.125, 0.25, -0.3125, 0.125, 0.3125, -0.25}, -- NodeBox12 - {0.125, 0.25, -0.25, 0.375, 0.3125, -0.1875}, -- NodeBox13 - {0.3125, 0.25, -0.1875, 0.375, 0.3125, -0.125}, -- NodeBox14 - }, - }, - tiles = {"letters_letter_cutter_lower_top.png", - "default_tree.png", - "letters_letter_cutter_side.png"}, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy = 2,oddly_breakable_by_hand = 2}, - sounds = default.node_sound_wood_defaults(), - on_construct = letter_cutter.on_construct_lower, - can_dig = letter_cutter.can_dig, - -- Set the owner of this circular saw. - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local owner = placer and placer:get_player_name() or "" - meta:set_string("owner", owner) - meta:set_string("infotext", - "Letter Cutter (Lower) is empty (owned by " - ..meta:get_string("owner")..")") - end, - allow_metadata_inventory_move = letter_cutter.allow_metadata_inventory_move, - -- Only input- and recycle-slot are intended as input slots: - allow_metadata_inventory_put = letter_cutter.allow_metadata_inventory_put, - -- Taking is allowed from all slots (even the internal microblock slot). Moving is forbidden. - -- Putting something in is slightly more complicated than taking anything because we have to make sure it is of a suitable material: - on_metadata_inventory_put = letter_cutter.on_metadata_inventory_put_lower, - on_metadata_inventory_take = letter_cutter.on_metadata_inventory_take_lower, - on_receive_fields = letter_cutter.on_receive_fields, -}) - -minetest.register_craft({ - output = "letters:letter_cutter_lower", - recipe = { - {"default:tree", "default:tree", "default:tree"}, - {"default:wood", "default:steel_ingot", "default:wood"}, - {"default:tree", "", "default:tree"}, - }, -}) - -minetest.register_node("letters:letter_cutter_upper", { - description = "Upper Case Leter Cutter", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.4375, -0.5, -0.4375, -0.3125, 0.125, -0.3125}, -- NodeBox1 - {-0.4375, -0.5, 0.3125, -0.3125, 0.125, 0.4375}, -- NodeBox2 - {0.3125, -0.5, 0.3125, 0.4375, 0.125, 0.4375}, -- NodeBox3 - {0.3125, -0.5, -0.4375, 0.4375, 0.125, -0.3125}, -- NodeBox4 - {-0.5, 0.0625, -0.5, 0.5, 0.25, 0.5}, -- NodeBox5 - {0.1875, 0.25, -0.125, 0.125, 0.3125, -0.3125}, -- NodeBox6 - {0.125, 0.25, 0.125, 0.0625, 0.3125, -0.125}, -- NodeBox7 - {0.0625, 0.25, 0.3125, -0.0625, 0.3125, 0.0625}, -- NodeBox8 - {-0.0625, 0.25, 0.125, -0.125, 0.3125, -0.125}, -- NodeBox9 - {-0.125, 0.25, -0.125, -0.1875, 0.3125, -0.3125}, -- NodeBox10 - {0.125, 0.25, -0.125, -0.125, 0.3125, -0.1875}, -- NodeBox11 - }, - }, - tiles = {"letters_letter_cutter_upper_top.png", - "default_tree.png", - "letters_letter_cutter_side.png"}, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy = 2,oddly_breakable_by_hand = 2}, - sounds = default.node_sound_wood_defaults(), - on_construct = letter_cutter.on_construct_upper, - can_dig = letter_cutter.can_dig, - -- Set the owner of this circular saw. - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local owner = placer and placer:get_player_name() or "" - meta:set_string("owner", owner) - meta:set_string("infotext", - "Letter Cutter (Upper) is empty (owned by " - ..meta:get_string("owner")..")") - end, - allow_metadata_inventory_move = letter_cutter.allow_metadata_inventory_move, - -- Only input- and recycle-slot are intended as input slots: - allow_metadata_inventory_put = letter_cutter.allow_metadata_inventory_put, - -- Taking is allowed from all slots (even the internal microblock slot). Moving is forbidden. - -- Putting something in is slightly more complicated than taking anything because we have to make sure it is of a suitable material: - on_metadata_inventory_put = letter_cutter.on_metadata_inventory_put_upper, - on_metadata_inventory_take = letter_cutter.on_metadata_inventory_take_upper, - on_receive_fields = letter_cutter.on_receive_fields, -}) - -minetest.register_craft({ - output = "letters:letter_cutter_upper", - recipe = { - {"default:tree", "default:tree", "default:tree"}, - {"default:wood", "default:steel_ingot", "default:wood"}, - {"default:tree", "default:steel_ingot", "default:tree"}, - }, -}) - -dofile(minetest.get_modpath("letters").."/registrations.lua") +dofile(MP..'/registrations.lua') diff --git a/mods/letters/itemlist.lua b/mods/letters/itemlist.lua index 16723ef3..3eab8d44 100644 --- a/mods/letters/itemlist.lua +++ b/mods/letters/itemlist.lua @@ -198,9 +198,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) --- Only exposed function - Entry point - -local function show_item_list(player, title, item_list, pos_context) +-- namespaced "show_item_list" for mod-internal use +function letters.show_item_list(player, title, item_list, pos_context) local context = get_context(player) context.items = item_list_prepare(item_list) context.title = title @@ -209,4 +208,6 @@ local function show_item_list(player, title, item_list, pos_context) show_item_list_formspec(player) end -return show_item_list +-- "exported" show_item_list function (see comment on top) +-- preserved for backwards compatibility +return letters.show_item_list \ No newline at end of file diff --git a/mods/letters/letter_cutter.lua b/mods/letters/letter_cutter.lua new file mode 100644 index 00000000..ea3a82d7 --- /dev/null +++ b/mods/letters/letter_cutter.lua @@ -0,0 +1,488 @@ +local letter_cutter = letters.letter_cutter +local cost = 0.110 + +-- Collect items to display in letter cutter output inventory. +function letter_cutter.get_output_inv(modname, subname, amount, max, group) + local list = {} + if amount < 1 then + return list + end + + for _, name in ipairs(group) do + table.insert(list, modname .. ":" .. subname .. "_" .. name + .. " " .. math.min(math.floor(amount/cost), max)) + end + return list +end + +-- Reset letter cutter to its empty state. +function letter_cutter:reset(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_list("input", {}) + inv:set_list("output", {}) + meta:set_int("anz", 0) + + local groupname = self.group_name(pos) + meta:set_string("infotext", + "Letter Cutter ("..groupname..") is empty (owned by ".. + meta:get_string("owner")..")") +end + +-- Update letter cutter inventories with available material count. +function letter_cutter:update_inventory(pos, amount) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + amount = meta:get_int("anz") + amount + + local groupname = self.group_name(pos) + if amount < 1 then -- If the last block is taken out. + self:reset(pos) + return + end + + local stack = inv:get_stack("input", 1) + if stack:is_empty() then + self:reset(pos) + return + + end + local node_name = stack:get_name() or "" + local name_parts = letter_cutter.known_nodes[node_name] or "" + local modname = name_parts[1] or "" + local material = name_parts[2] or "" + + inv:set_list("input", { + node_name.. " " .. math.floor(amount) + }) + + local max_offered = meta:get_int("max_offered") + local output = self.get_output_inv(modname, material, amount, max_offered, self.group(pos)) + -- Display: + inv:set_list("output", output) + -- Store how many microblocks are available: + meta:set_int("anz", amount) + + meta:set_string("infotext", + "Letter Cutter ("..groupname..") is working (owned by ".. + meta:get_string("owner")..")") +end + +-- Implement allow_metadata_inventory_move. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Moving is forbidden. +function letter_cutter.allow_metadata_inventory_move(_pos, _from_list, _from_index, _to_list, _to_index, _count, _player) + return 0 +end + + +-- Implement allow_metadata_inventory_put. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Only input- and recycle-slot are intended as input slots: +function letter_cutter.allow_metadata_inventory_put(pos, listname, index, stack, _player) + -- The player is not allowed to put something in there: + if listname == "output" then + return 0 + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stackname = stack:get_name() + local count = stack:get_count() + + -- Only accept certain blocks as input which are known to be craftable into stairs: + if listname == "input" then + if not inv:is_empty("input") and + inv:get_stack("input", index):get_name() ~= stackname then + return 0 + end + for name, _ in pairs(letter_cutter.known_nodes) do + if name == stackname and inv:room_for_item("input", stack) then + return count + end + end + return 0 + end +end + +-- Implement on_metadata_inventory_put. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Add craftable letters to the letter cutter inventory. +function letter_cutter.on_metadata_inventory_put(pos, listname, _index, stack, _player) + local count = stack:get_count() + + if listname == "input" then + letter_cutter:update_inventory(pos, count) + end +end + +-- Implement on_metadata_inventory_take. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Taking is allowed from all slots (even the internal microblock slot). +function letter_cutter.on_metadata_inventory_take(pos, listname, _index, stack, _player) + if listname == "output" then + -- We do know how much each block at each position costs: + letter_cutter:update_inventory(pos, 8 * -cost) + elseif listname == "input" then + -- Each normal (= full) block taken costs 8 microblocks: + letter_cutter:update_inventory(pos, 8 * -stack:get_count()) + end + -- The recycle field plays no role here since it is processed immediately. +end + +-- The name of the group of letters managed by this letter cutter. +function letter_cutter.group_name(pos) + local node = minetest.get_node(pos) + if node.name == "letters:letter_cutter_digit" then + return "Digit" + elseif node.name == "letters:letter_cutter_upper" then + return "Upper" + elseif node.name == "letters:letter_cutter_lower" then + return "Lower" + end +end + +-- The group of letters managed by this letter cutter. +function letter_cutter.group(pos) + local node = minetest.get_node(pos) + if node.name == "letters:letter_cutter_digit" then + return letter_cutter.names_digit + elseif node.name == "letters:letter_cutter_upper" then + return letter_cutter.names_upper + elseif node.name == "letters:letter_cutter_lower" then + return letter_cutter.names_lower + end +end + +-- Consume the input material and update inventories. +function letter_cutter.remove_from_input(pos, origname, count) + local meta = minetest.get_meta(pos) + + local cutterinv = meta:get_inventory() + + local removed = cutterinv:remove_item("input", origname .. " " .. tostring(count)) + letter_cutter:update_inventory(pos, -removed:get_count()) +end + +local gui_slots = "listcolors[#606060AA;#808080;#101010;#202020;#FFF]" + +-- Update formspec. +local function update_cutter_formspec(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "size[11,9]" ..gui_slots.. + "label[0,0;Input\nmaterial]" .. + "list[current_name;input;1.5,0;1,1;]" .. + "list[current_name;output;2.8,0;8,4;]" .. + "button[0,1;2.5,1;itemlist;Cuttable materials]" .. + "list[current_player;main;1.5,5;8,4;]" .. + "field[0.5,4.3;3,1;text;Enter text;${text}]" .. + "button[3.5,4;2,1;make_text;Make text]" .. + "label[5.5,4.2;" .. minetest.formspec_escape(meta:get_string("message")) .. "]") +end + +-- Create letter nodes from player-supplied text string. +local function cut_from_text(pos, input_text, player) + local playername = player:get_player_name() + + local meta = minetest.get_meta(pos) + + local cutterinv = meta:get_inventory() + local cutterinput = cutterinv:get_list("input") + local cuttercount = cutterinput[1]:get_count() + + if cuttercount < 1 then + meta:set_string("message", "No materials.") + update_cutter_formspec(pos) + return + end + + local origname = cutterinput[1]:get_name() + + local playerinv = player:get_inventory() + + meta:set_string("text", input_text) + + local totalcost = 0 + local throwawayinv = minetest.create_detached_inventory("letter_cutter:throwaway", {}, playername) + + throwawayinv:set_size("main", playerinv:get_size("main")) + throwawayinv:set_list("main", playerinv:get_list("main")) + + for i = 1, #input_text do + -- Determine letter group. + local char = input_text:sub(i, i) + local group + if char:match("%d") then + group = "d" + elseif char:match("%u") then + group = "u" + char = char:lower() + elseif char:match("%l") then + group = "l" + else + goto continue -- unrecognized, skip it + end + + local lettername = origname .. "_" .. "letter_" ..char:lower() ..group + if cuttercount < totalcost + cost then + meta:set_string("message", "Not enough materials.") + update_cutter_formspec(pos) + + minetest.remove_detached_inventory("letter_cutter:throwaway") + return + end + + if lettername and not throwawayinv:room_for_item("main", lettername) then + meta:set_string("message", "Not enough room.") + update_cutter_formspec(pos) + + minetest.remove_detached_inventory("letter_cutter:throwaway") + return + end + + totalcost = totalcost + cost + + throwawayinv:add_item("main", lettername) + ::continue:: + end + + meta:set_string("message", "Successfully added letters to inventory.") + update_cutter_formspec(pos) + + letter_cutter.remove_from_input(pos, origname, tostring(math.ceil(totalcost))) + playerinv:set_list("main", throwawayinv:get_list("main")) + + minetest.remove_detached_inventory("letter_cutter:throwaway") +end + +-- Implement on_construct. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Initialize a new letter cutter. +function letter_cutter.on_construct(pos) + local meta = minetest.get_meta(pos) + local groupname = letter_cutter.group_name(pos) + update_cutter_formspec(pos) + + meta:set_int("anz", 0) -- No microblocks inside yet. + meta:set_string("max_offered", 9) -- How many items of this kind are offered by default? + meta:set_string("infotext", "Letter Cutter ("..groupname..") is empty") + + meta:set_string("text", "") + meta:set_string("message", "") + + local inv = meta:get_inventory() + inv:set_size("input", 1) -- Input slot for full blocks of material x. + inv:set_size("output", 4*8) -- 4x8 versions of stair-parts of material x. + + letter_cutter:reset(pos) +end + +-- Implement can_dig. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Allow digging if the letter cutter is empty. +function letter_cutter.can_dig(pos, _player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("input") then + return false + end + return true +end + +-- Implement on_receive_fields. +-- https://minetest.gitlab.io/minetest/definition-tables/#node-definition +-- +-- Handle formspec update. +function letter_cutter.on_receive_fields(pos, _formname, fields, sender) + if fields.itemlist then + local list = {} + for name, _ in pairs(letter_cutter.known_nodes) do + list[#list+1] = name + end + letters.show_item_list(sender, 'Cuttable materials', list, pos) + return + end + + if fields.make_text and fields.text then + cut_from_text(pos, fields.text, sender) + return + end +end + +minetest.register_node("letters:letter_cutter_lower", { + description = "Lower Case Leter Cutter", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, -0.3125, 0.125, -0.3125}, + {-0.4375, -0.5, 0.3125, -0.3125, 0.125, 0.4375}, + {0.3125, -0.5, 0.3125, 0.4375, 0.125, 0.4375}, + {0.3125, -0.5, -0.4375, 0.4375, 0.125, -0.3125}, + {-0.5, 0.0625, -0.5, 0.5, 0.25, 0.5}, + {-0.125, 0.25, 0.125, 0.125, 0.3125, 0.1875}, + {0.125, 0.25, 0.0625, 0.1875, 0.3125, 0.125}, + {0.1875, 0.25, -0.1875, 0.25, 0.3125, 0.1875}, + {-0.1875, 0.25, 0.0625, -0.125, 0.3125, 0.125}, + {-0.25, 0.25, -0.1875, -0.1875, 0.3125, 0.0625}, + {-0.1875, 0.25, -0.25, -0.125, 0.3125, -0.1875}, + {-0.125, 0.25, -0.3125, 0.125, 0.3125, -0.25}, + {0.125, 0.25, -0.25, 0.375, 0.3125, -0.1875}, + {0.3125, 0.25, -0.1875, 0.375, 0.3125, -0.125}, + }, + }, + tiles = {"letters_letter_cutter_lower_top.png", + "default_tree.png", + "letters_letter_cutter_side.png"}, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy = 2,oddly_breakable_by_hand = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = letter_cutter.on_construct, + can_dig = letter_cutter.can_dig, + -- Set the cutter type and owner. + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + meta:set_string("owner", owner) + meta:set_string("infotext", + "Letter Cutter (Lower) is empty (owned by " + ..meta:get_string("owner")..")") + end, + allow_metadata_inventory_move = letter_cutter.allow_metadata_inventory_move, + allow_metadata_inventory_put = letter_cutter.allow_metadata_inventory_put, + on_metadata_inventory_put = letter_cutter.on_metadata_inventory_put, + on_metadata_inventory_take = letter_cutter.on_metadata_inventory_take, + on_receive_fields = letter_cutter.on_receive_fields, +}) + +minetest.register_craft({ + output = "letters:letter_cutter_lower", + recipe = { + {"default:tree", "default:tree", "default:tree"}, + {"default:wood", "default:steel_ingot", "default:wood"}, + {"default:tree", "", "default:tree"}, + }, +}) + +minetest.register_node("letters:letter_cutter_upper", { + description = "Upper Case Leter Cutter", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, -0.3125, 0.125, -0.3125}, + {-0.4375, -0.5, 0.3125, -0.3125, 0.125, 0.4375}, + {0.3125, -0.5, 0.3125, 0.4375, 0.125, 0.4375}, + {0.3125, -0.5, -0.4375, 0.4375, 0.125, -0.3125}, + {-0.5, 0.0625, -0.5, 0.5, 0.25, 0.5}, + {0.1875, 0.25, -0.125, 0.125, 0.3125, -0.3125}, + {0.125, 0.25, 0.125, 0.0625, 0.3125, -0.125}, + {0.0625, 0.25, 0.3125, -0.0625, 0.3125, 0.0625}, + {-0.0625, 0.25, 0.125, -0.125, 0.3125, -0.125}, + {-0.125, 0.25, -0.125, -0.1875, 0.3125, -0.3125}, + {0.125, 0.25, -0.125, -0.125, 0.3125, -0.1875}, + }, + }, + tiles = {"letters_letter_cutter_upper_top.png", + "default_tree.png", + "letters_letter_cutter_side.png"}, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy = 2,oddly_breakable_by_hand = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = letter_cutter.on_construct, + can_dig = letter_cutter.can_dig, + -- Set the cutter type and owner. + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + meta:set_string("owner", owner) + meta:set_string("infotext", + "Letter Cutter (Upper) is empty (owned by " + ..meta:get_string("owner")..")") + end, + allow_metadata_inventory_move = letter_cutter.allow_metadata_inventory_move, + allow_metadata_inventory_put = letter_cutter.allow_metadata_inventory_put, + on_metadata_inventory_put = letter_cutter.on_metadata_inventory_put, + on_metadata_inventory_take = letter_cutter.on_metadata_inventory_take, + on_receive_fields = letter_cutter.on_receive_fields, +}) + +minetest.register_craft({ + output = "letters:letter_cutter_upper", + recipe = { + {"default:tree", "default:tree", "default:tree"}, + {"default:wood", "default:steel_ingot", "default:wood"}, + {"default:tree", "default:steel_ingot", "default:tree"}, + }, +}) + +minetest.register_node("letters:letter_cutter_digit", { + description = "Digit Cutter", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, -0.3125, 0.125, -0.3125}, + {-0.4375, -0.5, 0.3125, -0.3125, 0.125, 0.4375}, + {0.3125, -0.5, 0.3125, 0.4375, 0.125, 0.4375}, + {0.3125, -0.5, -0.4375, 0.4375, 0.125, -0.3125}, + {-0.5, 0.0625, -0.5, 0.5, 0.25, 0.5}, + {-0.0625, 0.25, 0.3125, 0, 0.3125, 0.1875}, + {0.125, 0.25, 0.3125, 0.1875, 0.3125, 0.1875}, + {-0.25, 0.25, 0.125, 0.25, 0.3125, 0.1875}, + {-0.125, 0.25, -0.0625, -0.0625, 0.3125, 0.125}, + {0.0625, 0.25, -0.0625, 0.125, 0.3125, 0.125}, + {-0.25, 0.25, -0.0625, 0.25, 0.3125, -0.125}, + {-0.1875, 0.25, -0.125, -0.125, 0.3125, -0.25}, + {0, 0.25, -0.125, 0.0625, 0.3125, -0.25}, + }, + }, + tiles = {"letters_letter_cutter_digit_top.png", + "default_tree.png", + "letters_letter_cutter_side.png"}, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy = 2,oddly_breakable_by_hand = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = letter_cutter.on_construct, + can_dig = letter_cutter.can_dig, + -- Set the cutter type and owner. + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + meta:set_string("owner", owner) + meta:set_string("infotext", + "Letter Cutter (Digit) is empty (owned by " + ..meta:get_string("owner")..")") + end, + allow_metadata_inventory_move = letter_cutter.allow_metadata_inventory_move, + allow_metadata_inventory_put = letter_cutter.allow_metadata_inventory_put, + on_metadata_inventory_put = letter_cutter.on_metadata_inventory_put, + on_metadata_inventory_take = letter_cutter.on_metadata_inventory_take, + on_receive_fields = letter_cutter.on_receive_fields, +}) + +minetest.register_craft({ + output = "letters:letter_cutter_digit", + recipe = { + {"default:tree", "default:tree", "default:tree"}, + {"default:wood", "default:copper_ingot", "default:wood"}, + {"default:tree", "", "default:tree"}, + }, +}) diff --git a/mods/letters/mod.conf b/mods/letters/mod.conf index 95e68515..203d16f7 100644 --- a/mods/letters/mod.conf +++ b/mods/letters/mod.conf @@ -1 +1,2 @@ name = letters +optional_depends = darkage, colouredstonebricks, default \ No newline at end of file diff --git a/mods/letters/registrations.lua b/mods/letters/registrations.lua index f36253a4..ee9ff662 100644 --- a/mods/letters/registrations.lua +++ b/mods/letters/registrations.lua @@ -1,37 +1,39 @@ -local default_nodes = { - {"stone", "stone"}, - {"cobble", "cobble",}, - {"mossycobble", "mossycobble"}, - {"brick", "brick"}, - {"sandstone", "sandstone" }, - {"steelblock", "steel_block"}, - {"goldblock", "gold_block"}, - {"copperblock", "copper_block"}, - {"bronzeblock", "bronze_block"}, - {"diamondblock", "diamond_block"}, - {"desert_stone", "desert_stone"}, - {"desert_cobble", "desert_cobble"}, - {"tree", "tree"}, - {"wood", "wood"}, - {"jungletree", "jungletree"}, - {"junglewood", "junglewood"}, - {"obsidian", "obsidian"}, - {"stonebrick", "stone_brick"}, - {"desert_stonebrick", "desert_stone_brick"}, - {"sandstonebrick", "sandstone_brick"}, - {"obsidianbrick", "obsidian_brick"}, - {"pine_tree", "pine_tree"}, - {"pine_wood", "pine_wood"}, -} -for _, row in pairs(default_nodes) do - local nodename = "default:" ..row[1] - local ndef = minetest.registered_nodes[nodename] - local texture = "default_" ..row[2].. ".png" - letters.register_letters("default", row[1], nodename, ndef.description, texture) +if minetest.get_modpath("default") then + local default_nodes = { + {"stone", "stone"}, + {"cobble", "cobble",}, + {"mossycobble", "mossycobble"}, + {"brick", "brick"}, + {"sandstone", "sandstone" }, + {"steelblock", "steel_block"}, + {"goldblock", "gold_block"}, + {"copperblock", "copper_block"}, + {"bronzeblock", "bronze_block"}, + {"diamondblock", "diamond_block"}, + {"desert_stone", "desert_stone"}, + {"desert_cobble", "desert_cobble"}, + {"tree", "tree"}, + {"wood", "wood"}, + {"jungletree", "jungletree"}, + {"junglewood", "junglewood"}, + {"obsidian", "obsidian"}, + {"stonebrick", "stone_brick"}, + {"desert_stonebrick", "desert_stone_brick"}, + {"sandstonebrick", "sandstone_brick"}, + {"obsidianbrick", "obsidian_brick"}, + {"pine_tree", "pine_tree"}, + {"pine_wood", "pine_wood"}, + } + + for _, row in pairs(default_nodes) do + local nodename = "default:" ..row[1] + local ndef = minetest.registered_nodes[nodename] + local texture = "default_" ..row[2].. ".png" + letters.register_letters("default", row[1], nodename, ndef.description, texture) + end end - if minetest.get_modpath("darkage") then letters.register_letters("darkage", "marble", "darkage:marble", "Marble", "darkage_marble.png") letters.register_letters("darkage", "basalt", "darkage:basalt", "Basalt", "darkage_basalt.png") @@ -41,7 +43,7 @@ if minetest.get_modpath("darkage") then letters.register_letters("darkage", "slate", "darkage:slate", "Slate", "darkage_slate.png") letters.register_letters("darkage", "gneiss", "darkage:gneiss", "Gneiss", "darkage_gneiss.png") letters.register_letters("darkage", "chalk", "darkage:chalk", "Chalk", "darkage_chalk.png") - letters.register_letters("darkage", "ors_cobble", "darkage:ors_cobble", "Old Red Sandstone Cobble", "darkage_ors_brick.png") + letters.register_letters("darkage", "ors_cobble", "darkage:ors_cobble", "Old Red Sandstone Cobble", "darkage_ors_brick.png") letters.register_letters("darkage", "slate_cobble", "darkage:slate_cobble", "Slate Cobble", "darkage_slate_brick.png") letters.register_letters("darkage", "gneiss_cobble", "darkage:gneiss_cobble", "Gneiss Cobble", "darkage_gneiss_brick.png") letters.register_letters("darkage", "basalt_cobble", "darkage:basalt_cobble", "Basalt Cobble", "darkage_basalt_brick.png") diff --git a/mods/letters/textures/letters_0d_overlay.png b/mods/letters/textures/letters_0d_overlay.png new file mode 100644 index 00000000..6856679f Binary files /dev/null and b/mods/letters/textures/letters_0d_overlay.png differ diff --git a/mods/letters/textures/letters_1d_overlay.png b/mods/letters/textures/letters_1d_overlay.png new file mode 100644 index 00000000..98a8e69c Binary files /dev/null and b/mods/letters/textures/letters_1d_overlay.png differ diff --git a/mods/letters/textures/letters_2d_overlay.png b/mods/letters/textures/letters_2d_overlay.png new file mode 100644 index 00000000..e87cf161 Binary files /dev/null and b/mods/letters/textures/letters_2d_overlay.png differ diff --git a/mods/letters/textures/letters_3d_overlay.png b/mods/letters/textures/letters_3d_overlay.png new file mode 100644 index 00000000..2299449d Binary files /dev/null and b/mods/letters/textures/letters_3d_overlay.png differ diff --git a/mods/letters/textures/letters_4d_overlay.png b/mods/letters/textures/letters_4d_overlay.png new file mode 100644 index 00000000..974dbd5c Binary files /dev/null and b/mods/letters/textures/letters_4d_overlay.png differ diff --git a/mods/letters/textures/letters_5d_overlay.png b/mods/letters/textures/letters_5d_overlay.png new file mode 100644 index 00000000..6488d605 Binary files /dev/null and b/mods/letters/textures/letters_5d_overlay.png differ diff --git a/mods/letters/textures/letters_6d_overlay.png b/mods/letters/textures/letters_6d_overlay.png new file mode 100644 index 00000000..552aaae8 Binary files /dev/null and b/mods/letters/textures/letters_6d_overlay.png differ diff --git a/mods/letters/textures/letters_7d_overlay.png b/mods/letters/textures/letters_7d_overlay.png new file mode 100644 index 00000000..0a6dd2fd Binary files /dev/null and b/mods/letters/textures/letters_7d_overlay.png differ diff --git a/mods/letters/textures/letters_8d_overlay.png b/mods/letters/textures/letters_8d_overlay.png new file mode 100644 index 00000000..94289772 Binary files /dev/null and b/mods/letters/textures/letters_8d_overlay.png differ diff --git a/mods/letters/textures/letters_9d_overlay.png b/mods/letters/textures/letters_9d_overlay.png new file mode 100644 index 00000000..de344412 Binary files /dev/null and b/mods/letters/textures/letters_9d_overlay.png differ diff --git a/mods/letters/textures/letters_letter_cutter_digit_top.png b/mods/letters/textures/letters_letter_cutter_digit_top.png new file mode 100644 index 00000000..32abe900 Binary files /dev/null and b/mods/letters/textures/letters_letter_cutter_digit_top.png differ diff --git a/mods/lib_mount/.luacheckrc b/mods/lib_mount/.luacheckrc index 8fc3db9a..9dd25f4f 100644 --- a/mods/lib_mount/.luacheckrc +++ b/mods/lib_mount/.luacheckrc @@ -1,6 +1,6 @@ unused_args = false allow_defined_top = true -max_line_length = 999 +max_line_length = false globals = { "lib_mount", "player_api", @@ -10,8 +10,8 @@ read_globals = { string = {fields = {"split", "trim"}}, table = {fields = {"copy", "getn"}}, - "minetest", "mobs", + "minetest", "mobs", "vector", } -files["init.lua"].ignore = { "eye_offset", "attach_at", +files["init.lua"].ignore = { "eye_offset", "attach_at", "set_animation", "new_velo" } diff --git a/mods/lib_mount/LICENSE.md b/mods/lib_mount/LICENSE.md index d29a6ea4..2e0e3b13 100644 --- a/mods/lib_mount/LICENSE.md +++ b/mods/lib_mount/LICENSE.md @@ -1,5 +1,5 @@ Copyright (C) 2016 blert2112 and contributors\ -Copyright (C) 2019-2021 Panquesito7 (halfpacho@gmail.com) and contributors +Copyright (C) 2019-2023 Panquesito7 (halfpacho@gmail.com) and contributors GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 diff --git a/mods/lib_mount/README.md b/mods/lib_mount/README.md index 047bbd75..75589303 100644 --- a/mods/lib_mount/README.md +++ b/mods/lib_mount/README.md @@ -1,13 +1,12 @@ -# Library Mount [![Build status](https://github.com/minetest-mods/lib_mount/workflows/build/badge.svg)](https://github.com/minetest-mods/lib_mount/actions) [![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) [![ContentDB](https://content.minetest.net/packages/Panquesito7/lib_mount/shields/downloads/)](https://content.minetest.net/packages/Panquesito7/lib_mount/) +# Library Mount [![LuaCheck status](https://github.com/minetest-mods/lib_mount/workflows/luacheck/badge.svg)](https://github.com/minetest-mods/lib_mount/actions) [![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) [![ContentDB](https://content.minetest.net/packages/Panquesito7/lib_mount/shields/downloads/)](https://content.minetest.net/packages/Panquesito7/lib_mount/) Made by [blert2112](https://github.com/blert2112).\ Handed over to [Panquesito7](https://github.com/Panquesito7). -Current version: 1.3 +Current version: 1.4 ## Dependencies -- `default` (included in [Minetest Game](https://github.com/minetest/minetest_game)) - `player_api` (included in [Minetest Game](https://github.com/minetest/minetest_game)) ### Optional dependencies @@ -22,7 +21,7 @@ Current version: 1.3 ## License Copyright (C) 2016 blert2112 and contributors\ -Copyright (C) 2019-2021 Panquesito7 (halfpacho@gmail.com) and contributors +Copyright (C) 2019-2023 Panquesito7 (halfpacho@gmail.com) and contributors Based on the Boats mod by [PilzAdam](https://github.com/PilzAdam).\ See [`LICENSE.md`](LICENSE.md) for information. diff --git a/mods/lib_mount/depends.txt b/mods/lib_mount/depends.txt index 4c9c4bf8..9abacbe5 100644 --- a/mods/lib_mount/depends.txt +++ b/mods/lib_mount/depends.txt @@ -1,3 +1,2 @@ -default player_api mobs? diff --git a/mods/lib_mount/init.lua b/mods/lib_mount/init.lua index 8a6f80bf..36168cad 100644 --- a/mods/lib_mount/init.lua +++ b/mods/lib_mount/init.lua @@ -2,7 +2,7 @@ An API framework for mounting objects. Copyright (C) 2016 blert2112 and contributors - Copyright (C) 2019-2021 David Leal (halfpacho@gmail.com) and contributors + Copyright (C) 2019-2023 David Leal (halfpacho@gmail.com) and contributors This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,7 @@ --]] lib_mount = { - passengers = {} + passengers = { } } local crash_threshold = 6.5 -- ignored if enable_crash is disabled @@ -70,32 +70,116 @@ end local function get_velocity(v, yaw, y) local x = -math.sin(yaw) * v local z = math.cos(yaw) * v - return {x = x, y = y, z = z} + return vector.new(x, y, z) end local function get_v(v) return math.sqrt(v.x ^ 2 + v.z ^ 2) end +local function ensure_passengers_exists(entity) + if entity.passengers ~= nil then + return + end + entity.passengers = {} + if entity.passenger ~= nil or + entity.passenger_attach_at ~= nil or + entity.passenger_eye_offset ~= nil then + table.insert(entity.passengers,{ + player=entity.passenger, + attach_at=entity.passenger_attach_at, + eye_offset=entity.passenger_eye_offset + }) + else + return + end + if entity.passenger2 ~= nil or + entity.passenger2_attach_at ~= nil or + entity.passenger2_eye_offset ~= nil then + table.insert(entity.passengers,{ + player=entity.passenger2, + attach_at=entity.passenger2_attach_at, + eye_offset=entity.passenger2_eye_offset + }) + else + return + end + if entity.passenger3 ~= nil or + entity.passenger3_attach_at ~= nil or + entity.passenger3_eye_offset ~= nil then + table.insert(entity.passengers,{ + player=entity.passenger3, + attach_at=entity.passenger3_attach_at, + eye_offset=entity.passenger3_eye_offset + }) + end +end +-- Copies the specified passenger to the older api. Note that this is one-directional. +-- If something changed in the old api before this is called it is lost. +-- In code you control be sure to always use the newer API and to call this function on every change. +-- If you would like to improove preformance (memory & CPU) by not updating the old API, set +-- entity.new_api to true. This will return from the funciton instead of doing anything. +local function old_copy_passenger(entity,index,player,attach,eye) + if entity.new_api then + return + end + ensure_passengers_exists(entity) + if index==1 then -- Don't forget! Lua indexes start at 1 + if player then + entity.passenger = entity.passengers[index].player + end + if attach then + entity.passenger_attach_at = entity.passengers[index].attach_at + end + if eye then + entity.passenger_eye_offset = entity.passengers[index].eye_offset + end + elseif index==2 then + if player then + entity.passenger2 = entity.passengers[index].player + end + if attach then + entity.passenger2_attach_at = entity.passengers[index].attach_at + end + if eye then + entity.passenger2_eye_offset = entity.passengers[index].eye_offset + end + elseif index==3 then + if player then + entity.passenger3 = entity.passengers[index].player + end + if attach then + entity.passenger3_attach_at = entity.passengers[index].attach_at + end + if eye then + entity.passenger3_eye_offset = entity.passengers[index].eye_offset + end + end +end + local function force_detach(player) local attached_to = player:get_attach() if attached_to then local entity = attached_to:get_luaentity() if entity.driver and entity.driver == player then entity.driver = nil - elseif entity.passenger and entity.passenger == player then - entity.passenger = nil - lib_mount.passengers[player] = nil - elseif entity.passenger2 and entity.passenger2 == player then - entity.passenger2 = nil - lib_mount.passengers[player] = nil - elseif entity.passenger3 and entity.passenger3 == player then - entity.passenger3 = nil - lib_mount.passengers[player] = nil + else + ensure_passengers_exists(entity) + for i,passenger in ipairs(entity.passengers) do + if passenger.player == player then -- If it's nil it won't match + entity.passengers[i].player = nil -- This maintains the behavior where you could have passenger 1 leave but passenger 2 is still there, and they don't move + lib_mount.passengers[player] = nil + + -- Legacy support + old_copy_passenger(entity,i,true,false,false) + + break -- No need to continue looping. We found them. + end + end end player:set_detach() player_api.player_attached[player:get_player_name()] = false - player:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset(vector.new(0,0,0), vector.new(0,0,0)) end end @@ -127,61 +211,38 @@ function lib_mount.attach(entity, player, is_passenger, passenger_number) end if not entity.player_rotation then - entity.player_rotation = {x=0, y=0, z=0} + entity.player_rotation = vector.new(0,0,0) end - local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end + if is_passenger == true then + -- Legacy support + ensure_passengers_exists(entity) - if is_passenger == true and passenger_number == 1 then - if not entity.passenger_attach_at then - entity.passenger_attach_at = {x=0, y=0, z=0} + local attach_updated=false + if not entity.passengers[passenger_number].attach_at then + entity.passengers[passenger_number].attach_at = vector.new(0,0,0) + attach_updated=true end - if not entity.passenger_eye_offset then - entity.passenger_eye_offset = {x=0, y=0, z=0} + local eye_updated=false + if not entity.passengers[passenger_number].eye_offset then + entity.passengers[passenger_number].eye_offset = vector.new(0,0,0) + eye_updated=true end - attach_at = entity.passenger_attach_at - eye_offset = entity.passenger_eye_offset + attach_at = entity.passengers[passenger_number].attach_at + eye_offset = entity.passengers[passenger_number].eye_offset - entity.passenger = player - lib_mount.passengers[entity.passenger] = player + entity.passengers[passenger_number].player = player + lib_mount.passengers[player] = player - elseif is_passenger == true and passenger_number == 2 then - if not entity.passenger2_attach_at then - entity.passenger2_attach_at = {x=0, y=0, z=0} - end - if not entity.passenger2_eye_offset then - entity.passenger2_eye_offset = {x=0, y=0, z=0} - end - - attach_at = entity.passenger2_attach_at - eye_offset = entity.passenger2_eye_offset - - entity.passenger2 = player - lib_mount.passengers[entity.passenger2] = player - - elseif is_passenger == true and passenger_number == 3 then - if not entity.passenger3_attach_at then - entity.passenger3_attach_at = {x=0, y=0, z=0} - end - if not entity.passenger3_eye_offset then - entity.passenger3_eye_offset = {x=0, y=0, z=0} - end - - attach_at = entity.passenger3_attach_at - eye_offset = entity.passenger3_eye_offset - - entity.passenger3 = player - lib_mount.passengers[entity.passenger3] = player + -- Legacy support + old_copy_passenger(entity,passenger_number,true,attach_updated,eye_updated) else if not entity.driver_attach_at then - entity.driver_attach_at = {x=0, y=0, z=0} + entity.driver_attach_at = vector.new(0,0,0) end if not entity.driver_eye_offset then - entity.driver_eye_offset = {x=0, y=0, z=0} + entity.driver_eye_offset = vector.new(0,0,0) end attach_at = entity.driver_attach_at eye_offset = entity.driver_eye_offset @@ -192,11 +253,11 @@ function lib_mount.attach(entity, player, is_passenger, passenger_number) player:set_attach(entity.object, "", attach_at, entity.player_rotation) player_api.player_attached[player:get_player_name()] = true - player:set_eye_offset(eye_offset, {x=0, y=0, z=0}) + player:set_eye_offset(eye_offset, vector.new(0,0,0)) minetest.after(0.2, function() player_api.set_animation(player, "sit", 30) end) - player:set_look_horizontal(entity.object:get_yaw() - rot_view) + player:set_look_horizontal(entity.object:get_yaw() + math.rad(entity.player_rotation.y or 90)) end function lib_mount.detach(player, offset) @@ -211,18 +272,18 @@ end local aux_timer = 0 -function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_height, can_fly, can_go_down, can_go_up, enable_crash) +function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_height, can_fly, can_go_down, can_go_up, enable_crash, moveresult) -- Sanity checks if entity.driver and not entity.driver:get_attach() then entity.driver = nil end - if entity.passenger and not entity.passenger:get_attach() then - entity.passenger = nil - end - if entity.passenger2 and not entity.passenger2:get_attach() then - entity.passenger2 = nil - end - if entity.passenger3 and not entity.passenger3:get_attach() then - entity.passenger3 = nil + -- Legacy support + ensure_passengers_exists(entity) + for i,passenger in ipairs(entity.passengers) do + if passenger.player and not passenger.player:get_attach() then + entity.passengers[i].player = nil + -- Legacy support + old_copy_passenger(entity,i,true,false,false) + end end aux_timer = aux_timer + dtime @@ -231,9 +292,9 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he jump_height = 0 end - local rot_steer, rot_view = math.pi/2, 0 + local rot_steer, rot_view = math.pi/2, 0 -- luacheck: ignore if entity.player_rotation.y == 90 then - rot_steer, rot_view = 0, math.pi/2 + rot_steer, rot_view = 0, math.pi/2 -- luacheck: ignore end local acce_y = 0 @@ -271,7 +332,33 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he entity.object:set_yaw(entity.object:get_yaw()-get_sign(entity.v)*math.rad(1+dtime)*entity.turn_spd) end else - entity.object:set_yaw(entity.driver:get_look_yaw() - rot_steer) + if minetest.settings:get_bool("lib_mount.limited_turn_speed") then + -- WIP and may contain bugs. + local yaw = entity.object:get_yaw() + local yaw_delta = entity.driver:get_look_horizontal() - yaw + math.rad(entity.player_rotation.y or 90) + if yaw_delta > math.pi then + yaw_delta = yaw_delta - math.pi * 2 + elseif yaw_delta < - math.pi then + yaw_delta = yaw_delta + math.pi * 2 + end + + local yaw_sign = get_sign(yaw_delta) + if yaw_sign == 0 then + yaw_sign = 1 + end + + yaw_delta = math.abs(yaw_delta) + if yaw_delta > math.pi / 2 then + yaw_delta = math.pi / 2 + end + + local yaw_speed = yaw_delta * entity.turn_spd + yaw_speed = yaw_speed * dtime + + entity.object:set_yaw(yaw + yaw_sign*yaw_speed) + else + entity.object:set_yaw(entity.driver:get_look_horizontal() + math.rad(entity.player_rotation.y or 90)) + end end if ctrl.jump then if jump_height > 0 and velo.y == 0 then @@ -312,7 +399,7 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he local s = get_sign(entity.v) entity.v = entity.v - 0.02 * s if s ~= get_sign(entity.v) then - entity.object:set_velocity({x=0, y=0, z=0}) + entity.object:set_velocity(vector.new(0,0,0)) entity.v = 0 return end @@ -324,12 +411,12 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he velo.y = velo.y - 0.02 * s2 acce_y = acce_y - 0.02 * s3 if s2 ~= get_sign(velo.y) then - entity.object:set_velocity({x=0, y=0, z=0}) + entity.object:set_velocity(vector.new(0,0,0)) velo.y = 0 return end if s3 ~= get_sign(acce_y) then - entity.object:set_velocity({x=0, y=0, z=0}) + entity.object:set_velocity(vector.new(0,0,0)) acce_y = 0 -- luacheck: ignore return end @@ -365,8 +452,8 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he -- Set position, velocity and acceleration local p = entity.object:get_pos() - local new_velo = {x=0, y=0, z=0} - local new_acce = {x=0, y=-9.8, z=0} + local new_velo = vector.new(0,0,0) + local new_acce = vector.new(0,-9.8,0) p.y = p.y - 0.5 local ni = node_is(p) @@ -419,30 +506,18 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he else if entity.driver then local drvr = entity.driver - lib_mount.detach(drvr, {x=0, y=0, z=0}) + lib_mount.detach(drvr, vector.new(0,0,0)) drvr:set_velocity(new_velo) drvr:set_hp(drvr:get_hp() - intensity) end - - if entity.passenger then - local pass = entity.passenger - lib_mount.detach(pass, {x=0, y=0, z=0}) - pass:set_velocity(new_velo) - pass:set_hp(pass:get_hp() - intensity) - end - - if entity.passenger2 then - local pass = entity.passenger2 - lib_mount.detach(pass, {x=0, y=0, z=0}) - pass:set_velocity(new_velo) - pass:set_hp(pass:get_hp() - intensity) - end - - if entity.passenger3 then - local pass = entity.passenger3 - lib_mount.detach(pass, {x=0, y=0, z=0}) - pass:set_velocity(new_velo) - pass:set_hp(pass:get_hp() - intensity) + ensure_passengers_exists(entity)-- Legacy support + for _,passenger in ipairs(entity.passengers) do + if passenger.player then + local pass = passenger.player + lib_mount.detach(pass, vector.new(0,0,0)) -- This function already copies to old API + pass:set_velocity(new_velo) + pass:set_hp(pass:get_hp() - intensity) + end end local pos = entity.object:get_pos() @@ -472,3 +547,11 @@ function lib_mount.drive(entity, dtime, is_mob, moving_anim, stand_anim, jump_he entity.v2 = v end + +-- Print after the mod was loaded successfully +local load_message = "[MOD] Library Mount loaded!" +if minetest.log then + minetest.log("info", load_message) -- Aims at state of the MT software art +else + print(load_message) -- Aims at legacy MT software used in the field +end diff --git a/mods/lib_mount/mod.conf b/mods/lib_mount/mod.conf index f530e55a..f15f76cd 100644 --- a/mods/lib_mount/mod.conf +++ b/mods/lib_mount/mod.conf @@ -1,8 +1,6 @@ name = lib_mount -depends = default, player_api +title = Library Mount +depends = player_api optional_depends = mobs description = API framework for mounting objects. -license = LGPLv2.1 -author = Panquesito7 min_minetest_version = 5.0.0 -version = 1.3 diff --git a/mods/lib_mount/settingtypes.txt b/mods/lib_mount/settingtypes.txt new file mode 100644 index 00000000..967159b8 --- /dev/null +++ b/mods/lib_mount/settingtypes.txt @@ -0,0 +1 @@ +lib_mount.limited_turn_speed (If enabled, mouselook speed will be limited to the entity's given value) bool false diff --git a/mods/mesecons/.luacheckrc b/mods/mesecons/.luacheckrc new file mode 100644 index 00000000..d079c764 --- /dev/null +++ b/mods/mesecons/.luacheckrc @@ -0,0 +1,61 @@ +std = "lua51c" + +ignore = { + "21/_+", -- Unused variable, except "_", "__", etc. + "213", -- Unused loop variable + "421", -- Shadowing a local variable + "422", -- Shadowing an argument + "423", -- Shadowing a loop variable + "431", -- Shadowing an upvalue + "432", -- Shadowing an upvalue argument + "433", -- Shadowing an upvalue loop variable + "542", -- Empty if branch +} + +max_line_length = 200 + +read_globals = { + "default", + "digiline", + "doors", + "dump", + "jit", + "minetest", + "screwdriver", + "string.split", + "table.copy", + "table.insert_all", + "vector", + "VoxelArea", + "mcl_dyes", + "mcl_sounds", +} + +globals = {"mesecon"} + +files["mesecons/actionqueue.lua"] = { + globals = {"minetest.registered_globalsteps"}, +} + +-- Test-specific stuff follows. + +local test_conf = { + read_globals = { + "assert", + "fixture", + "mineunit", + "Player", + "sourcefile", + "world", + }, +} +files["*/spec/*.lua"] = test_conf +files[".test_fixtures/*.lua"] = test_conf + +files[".test_fixtures/screwdriver.lua"] = { + globals = {"screwdriver"}, +} + +files[".test_fixtures/mesecons_fpga.lua"] = { + globals = {"minetest.register_on_player_receive_fields"}, +} diff --git a/mods/mesecons/.test/minetest.conf b/mods/mesecons/.test/minetest.conf new file mode 100644 index 00000000..7e7b767f --- /dev/null +++ b/mods/mesecons/.test/minetest.conf @@ -0,0 +1,3 @@ +mg_name = singlenode +mesecon.internal_test = true +random_mod_load_order = true diff --git a/mods/mesecons/.test/run.sh b/mods/mesecons/.test/run.sh new file mode 100755 index 00000000..eb8c1987 --- /dev/null +++ b/mods/mesecons/.test/run.sh @@ -0,0 +1,31 @@ +#!/bin/bash +tempdir=$(mktemp -d) +confpath=$tempdir/minetest.conf +worldpath=$tempdir/world +trap 'rm -rf "$tempdir" || :' EXIT + +[ -f mesecons/mod.conf ] || { echo "Must be run in modpack root folder." >&2; exit 1; } + +command -v docker >/dev/null || { echo "Docker is not installed." >&2; exit 1; } +mtg=.test/minetest_game +[ -d $mtg ] || echo "A source checkout of minetest_game was not found. This can fail if your docker image does not ship a game." >&2 + +mkdir "$worldpath" +cp -v .test/minetest.conf "$confpath" +chmod -R 777 "$tempdir" + +args=( + -v "$confpath":/etc/minetest/minetest.conf + -v "$tempdir":/var/lib/minetest/.minetest + -v "$PWD":/var/lib/minetest/.minetest/world/worldmods/mesecons +) +[ -d $mtg ] && args+=( + -v "$(realpath $mtg)":/var/lib/minetest/.minetest/games/minetest_game +) +args+=("$DOCKER_IMAGE") +[ -d $mtg ] && args+=(--gameid minetest) +docker run --rm -i "${args[@]}" + +ls -la "$worldpath" +test -f "$worldpath/mesecon_actionqueue" || exit 1 +exit 0 diff --git a/mods/mesecons/.test_fixtures/mesecons.lua b/mods/mesecons/.test_fixtures/mesecons.lua new file mode 100644 index 00000000..2acd6f6d --- /dev/null +++ b/mods/mesecons/.test_fixtures/mesecons.lua @@ -0,0 +1,156 @@ +mineunit("core") +mineunit("server") +mineunit("voxelmanip") + +mineunit:set_current_modname("mesecons") +mineunit:set_modpath("mesecons", "../mesecons") +sourcefile("../mesecons/init") + +-- Utility node: this conductor is used to test the connectivity and state of adjacent wires. +do + local off_spec = {conductor = { + state = mesecon.state.off, + rules = mesecon.rules.alldirs, + onstate = "mesecons:test_conductor_on", + }} + local on_spec = {conductor = { + state = mesecon.state.on, + rules = mesecon.rules.alldirs, + offstate = "mesecons:test_conductor_off", + }} + mesecon.register_node("mesecons:test_conductor", { + description = "Test Conductor", + }, {mesecons = off_spec}, {mesecons = on_spec}) +end + +-- Utility node: this receptor is used to test power sources. +do + local off_spec = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.alldirs, + }} + local on_spec = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.alldirs, + }} + mesecon.register_node("mesecons:test_receptor", { + description = "Test Receptor", + }, {mesecons = off_spec}, {mesecons = on_spec}) +end + +-- Utility node: this effector is used to test circuit outputs. +do + -- This is a list of actions in the form {, }, + -- where is "on", "off", or "overheat". + mesecon._test_effector_events = {} + local function action_on(pos, node) + table.insert(mesecon._test_effector_events, {"on", pos}) + node.param2 = node.param2 % 64 + 128 -- Turn on bit 7 + minetest.swap_node(pos, node) + end + local function action_off(pos, node) + table.insert(mesecon._test_effector_events, {"off", pos}) + node.param2 = node.param2 % 64 -- Turn off bit 7 + minetest.swap_node(pos, node) + end + local function action_change(pos, node, rule_name, new_state) + if mesecon.do_overheat(pos) then + table.insert(mesecon._test_effector_events, {"overheat", pos}) + minetest.remove_node(pos) + return + end + -- Set the value of a bit in param2 according to the rule name and new state. + local bit = tonumber(rule_name.name, 2) + local bits_above = node.param2 - node.param2 % (bit * 2) + local bits_below = node.param2 % bit + local bits_flipped = new_state == mesecon.state.on and bit or 0 + node.param2 = bits_above + bits_flipped + bits_below + minetest.swap_node(pos, node) + end + minetest.register_node("mesecons:test_effector", { + description = "Test Effector", + mesecons = {effector = { + action_on = action_on, + action_off = action_off, + action_change = action_change, + rules = { + {x = 1, y = 0, z = 0, name = "000001"}, + {x = -1, y = 0, z = 0, name = "000010"}, + {x = 0, y = 1, z = 0, name = "000100"}, + {x = 0, y = -1, z = 0, name = "001000"}, + {x = 0, y = 0, z = 1, name = "010000"}, + {x = 0, y = 0, z = -1, name = "100000"}, + } + }}, + }) +end + +-- Utility node: this conductor is used to test rotation. +do + local get_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}, {x = -1, y = 0, z = 0}}) + local off_spec = {conductor = { + state = mesecon.state.off, + rules = get_rules, + onstate = "mesecons:test_conductor_rot_on", + }} + local on_spec = {conductor = { + state = mesecon.state.on, + rules = get_rules, + offstate = "mesecons:test_conductor_rot_off", + }} + mesecon.register_node("mesecons:test_conductor_rot", { + description = "Rotatable Test Conductor", + on_rotate = mesecon.on_rotate_horiz, + }, {mesecons = off_spec}, {mesecons = on_spec}) +end + +-- Utility node: this is used to test multiple conductors within a single node. +do + local mesecons_spec = {conductor = { + rules = { + {{x = 1, y = 0, z = 0}, {x = 0, y = -1, z = 0}}, + {{x = 0, y = 1, z = 0}, {x = 0, y = 0, z = -1}}, + {{x = 0, y = 0, z = 1}, {x = -1, y = 0, z = 0}}, + }, + states = { + "mesecons:test_multiconductor_off", "mesecons:test_multiconductor_001", + "mesecons:test_multiconductor_010", "mesecons:test_multiconductor_011", + "mesecons:test_multiconductor_100", "mesecons:test_multiconductor_101", + "mesecons:test_multiconductor_110", "mesecons:test_multiconductor_on", + }, + }} + for _, state in ipairs(mesecons_spec.conductor.states) do + minetest.register_node(state, { + description = "Test Multiconductor", + mesecons = mesecons_spec, + }) + end +end + +mesecon._test_autoconnects = {} +mesecon.register_autoconnect_hook("test", function(pos, node) + table.insert(mesecon._test_autoconnects, {pos, node}) +end) + +function mesecon._test_dig(pos) + local node = minetest.get_node(pos) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) +end + +function mesecon._test_place(pos, node) + world.set_node(pos, node) + mesecon.on_placenode(pos, minetest.get_node(pos)) +end + +function mesecon._test_reset() + -- First let circuits settle by simulating many globalsteps. + for i = 1, 10 do + mineunit:execute_globalstep(60) + end + mesecon.queue.actions = {} + mesecon._test_effector_events = {} + mesecon._test_autoconnects = {} +end + +mineunit:execute_globalstep(mesecon.setting("resumetime", 4) + 1) diff --git a/mods/mesecons/.test_fixtures/mesecons_fpga.lua b/mods/mesecons/.test_fixtures/mesecons_fpga.lua new file mode 100644 index 00000000..ba4440a3 --- /dev/null +++ b/mods/mesecons/.test_fixtures/mesecons_fpga.lua @@ -0,0 +1,59 @@ +mineunit("player") + +fixture("mesecons") +fixture("mesecons_gamecompat") + +local registered_on_player_receive_fields = {} +local old_register_on_player_receive_fields = minetest.register_on_player_receive_fields +function minetest.register_on_player_receive_fields(func) + old_register_on_player_receive_fields(func) + table.insert(registered_on_player_receive_fields, func) +end + +mineunit:set_current_modname("mesecons_fpga") +mineunit:set_modpath("mesecons_fpga", "../mesecons_fpga") +sourcefile("../mesecons_fpga/init") + +local fpga_user = Player("mesecons_fpga_user") + +function mesecon._test_program_fpga(pos, program) + local node = minetest.get_node(pos) + assert.equal("mesecons_fpga:fpga", node.name:sub(1, 18)) + + local fields = {program = true} + for i, instr in ipairs(program) do + -- Translate the instruction into formspec fields. + local op1, act, op2, dst + if #instr == 3 then + act, op2, dst = unpack(instr) + else + assert.equal(4, #instr) + op1, act, op2, dst = unpack(instr) + end + fields[i .. "op1"] = op1 + fields[i .. "act"] = (" "):rep(4 - #act) .. act + fields[i .. "op2"] = op2 + fields[i .. "dst"] = dst + end + + minetest.registered_nodes[node.name].on_rightclick(pos, node, fpga_user) + + for _, func in ipairs(registered_on_player_receive_fields) do + if func(fpga_user, "mesecons:fpga", fields) then + break + end + end +end + +function mesecon._test_copy_fpga_program(pos) + fpga_user:get_inventory():set_stack("main", 1, "mesecons_fpga:programmer") + local pt = {type = "node", under = vector.new(pos), above = vector.offset(pos, 0, 1, 0)} + fpga_user:do_place(pt) + return fpga_user:get_wielded_item() +end + +function mesecon._test_paste_fpga_program(pos, tool) + fpga_user:get_inventory():set_stack("main", 1, tool) + local pt = {type = "node", under = vector.new(pos), above = vector.offset(pos, 0, 1, 0)} + fpga_user:do_use(pt) +end diff --git a/mods/mesecons/.test_fixtures/mesecons_gamecompat.lua b/mods/mesecons/.test_fixtures/mesecons_gamecompat.lua new file mode 100644 index 00000000..07bffd00 --- /dev/null +++ b/mods/mesecons/.test_fixtures/mesecons_gamecompat.lua @@ -0,0 +1,5 @@ +fixture("mesecons") + +mineunit:set_current_modname("mesecons_gamecompat") +mineunit:set_modpath("mesecons_gamecompat", "../mesecons_gamecompat") +sourcefile("../mesecons_gamecompat/init") diff --git a/mods/mesecons/.test_fixtures/mesecons_luacontroller.lua b/mods/mesecons/.test_fixtures/mesecons_luacontroller.lua new file mode 100644 index 00000000..9090b477 --- /dev/null +++ b/mods/mesecons/.test_fixtures/mesecons_luacontroller.lua @@ -0,0 +1,12 @@ +fixture("mesecons") +fixture("mesecons_gamecompat") + +mineunit:set_current_modname("mesecons_luacontroller") +mineunit:set_modpath("mesecons_luacontroller", "../mesecons_luacontroller") +sourcefile("../mesecons_luacontroller/init") + +function mesecon._test_program_luac(pos, code) + local node = minetest.get_node(pos) + assert.equal("mesecons_luacontroller:luacontroller", node.name:sub(1, 36)) + return minetest.registered_nodes[node.name].mesecons.luacontroller.set_program(pos, code) +end diff --git a/mods/mesecons/.test_fixtures/mesecons_mvps.lua b/mods/mesecons/.test_fixtures/mesecons_mvps.lua new file mode 100644 index 00000000..b15774c1 --- /dev/null +++ b/mods/mesecons/.test_fixtures/mesecons_mvps.lua @@ -0,0 +1,45 @@ +mineunit("protection") + +fixture("mesecons") + +mineunit:set_current_modname("mesecons_mvps") +mineunit:set_modpath("mesecons_mvps", "../mesecons_mvps") +sourcefile("../mesecons_mvps/init") + +minetest.register_node("mesecons_mvps:test_stopper", { + description = "Test Stopper", +}) +mesecon.register_mvps_stopper("mesecons_mvps:test_stopper") + +minetest.register_node("mesecons_mvps:test_stopper_cond", { + description = "Test Stopper (Conditional)", +}) +mesecon.register_mvps_stopper("mesecons_mvps:test_stopper_cond", function(node) + return node.param2 == 0 +end) + +minetest.register_node("mesecons_mvps:test_sticky", { + description = "Test Sticky", + mvps_sticky = function(pos) + local connected = {} + for i, rule in ipairs(mesecon.rules.alldirs) do + connected[i] = vector.add(pos, rule) + end + return connected + end, +}) + +mesecon._test_moves = {} +minetest.register_node("mesecons_mvps:test_on_move", { + description = "Test Moveable", + mesecon = { + on_mvps_move = function(pos, node, oldpos, meta) + table.insert(mesecon._test_moves, {pos, node, oldpos, meta}) + end + }, +}) +local old_reset = mesecon._test_reset +function mesecon._test_reset() + mesecon._test_moves = {} + old_reset() +end diff --git a/mods/mesecons/.test_fixtures/screwdriver.lua b/mods/mesecons/.test_fixtures/screwdriver.lua new file mode 100644 index 00000000..1a98de06 --- /dev/null +++ b/mods/mesecons/.test_fixtures/screwdriver.lua @@ -0,0 +1,6 @@ +mineunit:set_current_modname("screwdriver") + +screwdriver = {} + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 diff --git a/mods/mesecons/COPYING.txt b/mods/mesecons/COPYING.txt new file mode 100644 index 00000000..61bf7e2a --- /dev/null +++ b/mods/mesecons/COPYING.txt @@ -0,0 +1,30 @@ +The Mesecons Mod for Minetest is + Copyright (C) 2011-2016 Mesecons Mod Developer Team and contributors + +See the version control system log for information about other authors. + +License of source code +---------------------- +Copyright (C) 2011-2016 Mesecons Mod Developer Team and contributors + +This program is free software; you can redistribute the Mesecons Mod and/or +modify it under the terms of the GNU Lesser General Public License version 3 +published by the Free Software Foundation. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301, USA. + +License of media (textures, sounds and documentation) +----------------------------------------------------- +Copyright (C) 2011-2016 Mesecons Mod Developer Team and contributors + +All textures, sounds and documentation files are licensed under the +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/mesecons/LICENSE.txt b/mods/mesecons/LICENSE.txt new file mode 100644 index 00000000..5df6546b --- /dev/null +++ b/mods/mesecons/LICENSE.txt @@ -0,0 +1,538 @@ +The LGPLv3 applies to all code in this project. +The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code. + +The file mesecons_detector/textures/mesecons_detector_side.png is an unmodified copy of +"default_steel_block.png" by Jean-Patrick Guerrero , which can be found at +. +"default_steel_block.png" is licensed under a CC BY-SA 3.0 license. This license can be found later in this document, and can also be found at +. The artwork is reportedly copyright (C) 2010-2018 kilbith. + +================================================================= + +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. + +================================================================= + +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at http://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at http://creativecommons.org/. diff --git a/mods/mesecons/README.md b/mods/mesecons/README.md new file mode 100644 index 00000000..4e40e98c --- /dev/null +++ b/mods/mesecons/README.md @@ -0,0 +1,90 @@ + ######################################################################## + ## __ __ _____ _____ _____ _____ _____ _ _ _____ ## + ## | \ / | | ___| | ___| | ___| | ___| | _ | | \ | | | ___| ## + ## | \/ | | |___ | |___ | |___ | | | | | | | \| | | |___ ## + ## | |\__/| | | ___| |___ | | ___| | | | | | | | | |___ | ## + ## | | | | | |___ ___| | | |___ | |___ | |_| | | |\ | ___| | ## + ## |_| |_| |_____| |_____| |_____| |_____| |_____| |_| \_| |_____| ## + ## ## + ######################################################################## + +MESECONS by Jeija and contributors + +Mezzee-what? +------------ + +[Mesecons](https://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay. + +Mesecons is a mod for [Minetest](https://www.minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks. + +Mesecons has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics. + +OK, I want in. +-------------- + +Go get it! + +[![ContentDB](https://content.minetest.net/packages/Jeija/mesecons/shields/downloads/)](https://content.minetest.net/packages/Jeija/mesecons/) + +Install it directly from your client by searching it in the Online Content tab. + +**Or** if you've downloaded a ZIP file check out [this page](https://wiki.minetest.net/Mods) over at the official Minetest Wiki. For your convenience, here's a quick summary: + +1. If Mesecons is still in a ZIP file, extract the folder inside to somewhere on the computer. +2. Make sure that when you open the folder, you can directly find `README.md` in the listing. If you just see another folder, move that folder up one level and delete the old one. +3. Open up the Minetest mods folder - called `mods`. +4. Copy the Mesecons folder into the mods folder. + +Don't like some parts of Mesecons? Open up the Mesecons folder and delete the subfolder containing the mod you don't want. If you didn't want movestones, for example, all you have to do is delete the `mesecons_movestones` folder and they will no longer be available. + +There are no dependencies - it will work right after installing! + +How do I use this thing? +------------------------ + +How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)? + +Or maybe a [comprehensive reference](https://mesecons.net/items.html) is your style? + +An overview for the very newest of new beginners? How does [this one](https://uberi.mesecons.net/projects/MeseconsBasics/index.html) look? + +Want to get more into building? Why not check out the [Mesecons Laboratory](https://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders? + +Want to contribute to Mesecons itself? Check out the [source code](https://github.com/minetest-mods/mesecons)! + +Who wrote it anyways? +--------------------- + +These awesome people made Mesecons possible! (as of 2016) + +| Contributor | Contribution | +| --------------- | -------------------------------- | +| Hawk777 | Code for VoxelManip caching | +| Jat15 | Various tweaks. | +| Jeija | **Main developer! Everything.** | +| Jordach | Noteblock sounds. | +| khonkhortistan | Code, recipes, textures. | +| Kotolegokot | Nodeboxes for items. | +| minerd247 | Textures. | +| Nore/Novatux | Code. | +| RealBadAngel | Fixes, improvements. | +| sfan5 | Code, recipes, textures. | +| suzenako | Piston sounds. | +| Uberi/Temperest | Code, textures, documentation. | +| VanessaE | Code, recipes, textures, design. | +| Whiskers75 | Logic gates implementation. | + +There are also a whole bunch of other people helping with everything from code to testing and feedback. Mesecons would also not be possible without their help! + +Check out the [entire contributor list](https://github.com/minetest-mods/mesecons/graphs/contributors) on GitHub. + +Alright, how can I use it? +-------------------------- + +All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic). +That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one. + +All code in this project is licensed under the LGPL version 3. +That means you have unlimited freedom to distribute and modify the work however you see fit, provided that if you decide to distribute it or any modified versions of it, you must also use the same license. The LGPL also grants the additional freedom to write extensions for the software and distribute them without the extensions being subject to the terms of the LGPL, although the software itself retains its license. + +No warranty is provided, express or implied, for any part of the project. diff --git a/mods/mesecons/bower.json b/mods/mesecons/bower.json new file mode 100644 index 00000000..8c850f57 --- /dev/null +++ b/mods/mesecons/bower.json @@ -0,0 +1,12 @@ +{ + "name": "mesecons", + "description": "Mesecons is a mod for Minetest that implements items related to digital circuitry: wires, buttons, lights, and programmable controllers.", + "homepage": "https://mesecons.net", + "authors": ["Jeija"], + "license": "LGPL-3.0", + "keywords": [ + "mesecons", + "minetest", + "mod" + ] +} diff --git a/mods/mesecons/documentation.json b/mods/mesecons/documentation.json new file mode 100644 index 00000000..b12dc6d2 --- /dev/null +++ b/mods/mesecons/documentation.json @@ -0,0 +1,65 @@ +{ + "Conductors" : { + "Mesecon" : "mesecons_wires/doc/mesecon", + "Insulated Wire" : "mesecons_insulated/doc/insulated", + "T-Junction" : "mesecons_extrawires/doc/tjunction", + "Crossing" : "mesecons_extrawires/doc/crossing", + "Corner" : "mesecons_extrawires/doc/corner", + "Vertical Wire" : "mesecons_extrawires/doc/vertical", + "Mese" : "mesecons_extrawires/doc/mese" + }, + "Receptors" : { + "Power Plant" : "mesecons_powerplant/doc/powerplant", + "Blinky Plant" : "mesecons_blinkyplant/doc/blinkyplant", + "Switch" : "mesecons_switch/doc/switch", + "Object Detector" : "mesecons_detector/doc/objectdetector", + "Node Detector" : "mesecons_detector/doc/nodedetector", + "Wall Lever" : "mesecons_walllever/doc/walllever", + "Pressure Plate" : "mesecons_pressureplates/doc/pressureplate_wood", + "Pressure Plate" : "mesecons_pressureplates/doc/pressureplate_stone", + "Water Turbine" : "mesecons_hydroturbine/doc/waterturbine", + "Solar Panel" : "mesecons_solarpanel/doc/solarpanel", + "Wall Button" : "mesecons_button/doc/button" + }, + "Effectors" : { + "Noteblock" : "mesecons_noteblock/doc/noteblock", + "Lamp" : "mesecons_lamp/doc/lamp", + "Piston" : "mesecons_pistons/doc/piston", + "Sticky Piston" : "mesecons_pistons/doc/piston_sticky", + "Movestone" : "mesecons_movestones/doc/movestone", + "Sticky Movestone" : "mesecons_movestones/doc/movestone_sticky", + "Removestone" : "mesecons_random/doc/removestone", + "Ghoststone" : "mesecons_random/doc/ghoststone", + "Command Block" : "mesecons_commandblock/doc/commandblock", + "Lightstones" : { + "Dark Grey" : "mesecons_lightstone/doc/lightstone_darkgrey", + "Light Grey" : "mesecons_lightstone/doc/lightstone_lightgrey", + "Green" : "mesecons_lightstone/doc/lightstone_green", + "Red" : "mesecons_lightstone/doc/lightstone_red", + "Blue" : "mesecons_lightstone/doc/lightstone_blue", + "Yellow" : "mesecons_lightstone/doc/lightstone_yellow" + } + }, + "Logic" : { + "Luacontroller" : "mesecons_luacontroller/doc/luacontroller", + "Microcontroller" : "mesecons_microcontroller/doc/microcontroler", + "FPGA" : "mesecons_fpga/doc/fpga", + "FPGA Programmer" : "mesecons_fpga/doc/programmer", + "Torch" : "mesecons_torch/doc/torch", + "Delayer" : "mesecons_delayer/doc/delayer", + "Gates" : { + "Diode" : "mesecons_gates/doc/diode", + "NOT Gate" : "mesecons_gates/doc/not", + "AND Gate" : "mesecons_gates/doc/and", + "NAND Gate" : "mesecons_gates/doc/nand", + "OR Gate" : "mesecons_gates/doc/or", + "NOR Gate" : "mesecons_gates/doc/nor", + "XOR Gate" : "mesecons_gates/doc/xor" + } + }, + "Crafts" : { + "Silicon" : "mesecons_materials/doc/silicon", + "Glue" : "mesecons_materials/doc/glue", + "Fiber" : "mesecons_materials/doc/fiber" + } +} diff --git a/mods/mesecons/mesecons/actionqueue.lua b/mods/mesecons/mesecons/actionqueue.lua new file mode 100644 index 00000000..b3118f06 --- /dev/null +++ b/mods/mesecons/mesecons/actionqueue.lua @@ -0,0 +1,143 @@ +--[[ +Mesecons uses something it calls an ActionQueue. + +The ActionQueue holds functions and actions. +Functions are added on load time with a specified name. +Actions are preserved over server restarts. + +Each action consists of a position, the name of an added function to be called, +the params that should be used in this function call (additionally to the pos), +the time after which it should be executed, an optional overwritecheck and a +priority. + +If time = 0, the action will be executed in the next globalstep, otherwise the +earliest globalstep when it will be executed is the after next globalstep. + +It is guaranteed, that for two actions ac1, ac2 where ac1 ~= ac2, +ac1.time == ac2.time, ac1.priority == ac2.priority and ac1 was added earlier +than ac2, ac1 will be executed before ac2 (but in the same globalstep). + +Note: Do not pass references in params, as they can not be preserved. + +Also note: Some of the guarantees here might be dropped at some time. +]] + + +-- localize for speed +local queue = mesecon.queue + +queue.actions = {} -- contains all ActionQueue actions + +function queue:add_function(name, func) + self.funcs[name] = func +end + +-- If add_action with twice the same overwritecheck and same position are called, the first one is overwritten +-- use overwritecheck nil to never overwrite, but just add the event to the queue +-- priority specifies the order actions are executed within one globalstep, highest first +-- should be between 0 and 1 +function queue:add_action(pos, func, params, time, overwritecheck, priority) + -- Create Action Table: + time = time or 0 -- time <= 0 --> execute, time > 0 --> wait time until execution + priority = priority or 1 + local action = { + pos = mesecon.tablecopy(pos), + func = func, + params = mesecon.tablecopy(params or {}), + time = time, + owcheck = (overwritecheck and mesecon.tablecopy(overwritecheck)) or nil, + priority = priority + } + + -- check if old action has to be overwritten / removed: + if overwritecheck then + for i, ac in ipairs(self.actions) do + if vector.equals(pos, ac.pos) + and mesecon.cmpAny(overwritecheck, ac.owcheck) then + -- remove the old action + table.remove(self.actions, i) + break + end + end + end + + table.insert(self.actions, action) +end + +-- execute the stored functions on a globalstep +-- if however, the pos of a function is not loaded (get_node_or_nil == nil), do NOT execute the function +-- this makes sure that resuming mesecons circuits when restarting minetest works fine (hm, where do we do this?) +-- However, even that does not work in some cases, that's why we delay the time the globalsteps +-- start to be execute by 4 seconds + +local m_time = 0 +local resumetime = mesecon.setting("resumetime", 4) + +local function globalstep_func(dtime) + -- don't even try if server has not been running for XY seconds; resumetime = time to wait + -- after starting the server before processing the ActionQueue, don't set this too low + if m_time < resumetime then + m_time = m_time + dtime + return + end + + local actions = queue.actions + -- split into two categories: + -- actions_now: actions to execute now + -- queue.actions: actions to execute later + local actions_now = {} + queue.actions = {} + + for _, ac in ipairs(actions) do + if ac.time > 0 then + -- action ac is to be executed later + -- ~> insert into queue.actions + ac.time = ac.time - dtime + table.insert(queue.actions, ac) + else + -- action ac is to be executed now + -- ~> insert into actions_now + table.insert(actions_now, ac) + end + end + + -- stable-sort the executed actions after their priority + -- some constructions might depend on the execution order, hence we first + -- execute the actions that had a lower index in actions_now + local old_action_order = {} + for i, ac in ipairs(actions_now) do + old_action_order[ac] = i + end + table.sort(actions_now, function(ac1, ac2) + if ac1.priority ~= ac2.priority then + return ac1.priority > ac2.priority + else + return old_action_order[ac1] < old_action_order[ac2] + end + end) + + -- execute highest priorities first, until all are executed + for _, ac in ipairs(actions_now) do + queue:execute(ac) + end +end + +minetest.register_globalstep(globalstep_func) + +function queue:execute(action) + -- ignore if action queue function name doesn't exist, + -- (e.g. in case the action queue savegame was written by an old mesecons version) + if self.funcs[action.func] then + self.funcs[action.func](action.pos, unpack(action.params)) + end +end + + +-- Store and read the ActionQueue to / from a file +-- so that upcoming actions are remembered when the game +-- is restarted +queue.actions = mesecon.file2table("mesecon_actionqueue") + +minetest.register_on_shutdown(function() + mesecon.table2file("mesecon_actionqueue", queue.actions) +end) diff --git a/mods/mesecons/mesecons/fifo_queue.lua b/mods/mesecons/mesecons/fifo_queue.lua new file mode 100644 index 00000000..a71c71bc --- /dev/null +++ b/mods/mesecons/mesecons/fifo_queue.lua @@ -0,0 +1,62 @@ + +-- a simple first-in-first-out queue +-- very similar to the one in https://github.com/minetest/minetest/pull/7683 + +local fifo_queue = {} + +local metatable = {__index = fifo_queue} + +-- creates a new empty queue +function fifo_queue.new() + local q = {n_in = 0, n_out = 0, i_out = 1, buf_in = {}, buf_out = {}} + setmetatable(q, metatable) + return q +end + +-- adds an element to the queue +function fifo_queue.add(self, v) + local n = self.n_in + 1 + self.n_in = n + self.buf_in[n] = v +end + +-- removes and returns the next element, or nil of empty +function fifo_queue.take(self) + local i_out = self.i_out + if i_out <= self.n_out then + local v = self.buf_out[i_out] + self.i_out = i_out + 1 + self.buf_out[i_out] = true + return v + end + + -- buf_out is empty, try to swap + self.i_out = 1 + self.n_out = 0 + if self.n_in == 0 then + return nil -- empty + end + + -- swap + self.n_out = self.n_in + self.n_in = 0 + self.buf_out, self.buf_in = self.buf_in, self.buf_out + + local v = self.buf_out[1] + self.i_out = 2 + self.buf_out[1] = true + return v +end + +-- returns whether the queue is empty +function fifo_queue.is_empty(self) + return self.n_out == self.i_out + 1 and self.n_in == 0 +end + +-- returns stuff for iteration in a for loop, like pairs +-- adding new elements while iterating is no problem +function fifo_queue.iter(self) + return fifo_queue.take, self, nil +end + +return fifo_queue diff --git a/mods/mesecons/mesecons/init.lua b/mods/mesecons/mesecons/init.lua new file mode 100644 index 00000000..9a45a407 --- /dev/null +++ b/mods/mesecons/mesecons/init.lua @@ -0,0 +1,133 @@ +-- |\ /| ____ ____ ____ _____ ____ _____ +-- | \ / | | | | | | | |\ | | +-- | \/ | |___ ____ |___ | | | | \ | |____ +-- | | | | | | | | | \ | | +-- | | |___ ____| |___ |____ |____| | \| ____| +-- by Jeija, Uberi (Temperest), sfan5, VanessaE, Hawk777 and contributors +-- +-- +-- +-- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest. +-- See the documentation on the forum for additional information, especially about crafting +-- +-- +-- For basic development resources, see http://mesecons.net/developers.html +-- +-- +-- +--Quick draft for the mesecons array in the node's definition +--mesecons = +--{ +-- receptor = +-- { +-- state = mesecon.state.on/off +-- rules = rules/get_rules +-- }, +-- effector = +-- { +-- action_on = function +-- action_off = function +-- action_change = function +-- rules = rules/get_rules +-- }, +-- conductor = +-- { +-- state = mesecon.state.on/off +-- offstate = opposite state (for state = on only) +-- onstate = opposite state (for state = off only) +-- rules = rules/get_rules +-- } +--} + +-- PUBLIC VARIABLES +mesecon={} -- contains all functions and all global variables +mesecon.queue={} -- contains the ActionQueue +mesecon.queue.funcs={} -- contains all ActionQueue functions + +-- Settings +dofile(minetest.get_modpath("mesecons").."/settings.lua") + +-- Utilities like comparing positions, +-- adding positions and rules, +-- mostly things that make the source look cleaner +dofile(minetest.get_modpath("mesecons").."/util.lua"); + +-- Presets (eg default rules) +dofile(minetest.get_modpath("mesecons").."/presets.lua"); + +-- The ActionQueue +-- Saves all the actions that have to be execute in the future +dofile(minetest.get_modpath("mesecons").."/actionqueue.lua"); + +-- Internal stuff +-- This is the most important file +-- it handles signal transmission and basically everything else +-- It is also responsible for managing the nodedef things, +-- like calling action_on/off/change +dofile(minetest.get_modpath("mesecons").."/internal.lua"); + +-- API +-- these are the only functions you need to remember + +mesecon.queue:add_function("receptor_on", function (pos, rules) + mesecon.vm_begin() + + rules = rules or mesecon.rules.default + + -- Call turnon on all linking positions + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + mesecon.turnon(np, rulename) + end + end + + mesecon.vm_commit() +end) + +function mesecon.receptor_on(pos, rules) + mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) +end + +mesecon.queue:add_function("receptor_off", function (pos, rules) + rules = rules or mesecon.rules.default + + -- Call turnoff on all linking positions + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + mesecon.vm_begin() + + -- Turnoff returns true if turnoff process was successful, no onstate receptor + -- was found along the way. Commit changes that were made in voxelmanip. If turnoff + -- returns true, an onstate receptor was found, abort voxelmanip transaction. + if (mesecon.turnoff(np, rulename)) then + mesecon.vm_commit() + else + mesecon.vm_abort() + end + end + end +end) + +function mesecon.receptor_off(pos, rules) + mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) +end + + +-- Deprecated stuff +-- To be removed in future releases +dofile(minetest.get_modpath("mesecons").."/legacy.lua"); + +--Services like turnoff receptor on dignode and so on +dofile(minetest.get_modpath("mesecons").."/services.lua"); + +-- Automated test run +if mesecon.setting("internal_test", false) then + -- currently does nothing, we only fail if some error happens right on startup + minetest.after(5, function() + minetest.request_shutdown() + end) +end diff --git a/mods/mesecons/mesecons/internal.lua b/mods/mesecons/mesecons/internal.lua new file mode 100644 index 00000000..49690d96 --- /dev/null +++ b/mods/mesecons/mesecons/internal.lua @@ -0,0 +1,624 @@ +-- Internal.lua - The core of mesecons +-- +-- For more practical developer resources see http://mesecons.net/developers.php +-- +-- Function overview +-- mesecon.get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename +-- mesecon.get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename +-- mesecon.get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename +-- mesecon.get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector +-- mesecon.get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor + +-- RECEPTORS +-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor +-- mesecon.is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on +-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off +-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) + +-- EFFECTORS +-- mesecon.is_effector(nodename) --> Returns true if nodename is an effector +-- mesecon.is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off +-- mesecon.is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on +-- mesecon.effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified) + +-- SIGNALS +-- mesecon.activate(pos, node, depth) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher depths are executed later +-- mesecon.deactivate(pos, node, depth) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), higher depths are executed later +-- mesecon.changesignal(pos, node, rulename, newstate, depth) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), higher depths are executed later + +-- CONDUCTORS +-- mesecon.is_conductor(nodename) --> Returns true if nodename is a conductor +-- mesecon.is_conductor_on(node --> Returns true if node is a conductor with state = mesecon.state.on +-- mesecon.is_conductor_off(node) --> Returns true if node is a conductor with state = mesecon.state.off +-- mesecon.get_conductor_on(node_off) --> Returns the onstate nodename of the conductor +-- mesecon.get_conductor_off(node_on) --> Returns the offstate nodename of the conductor +-- mesecon.conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified) + +-- HIGH-LEVEL Internals +-- mesecon.is_power_on(pos) --> Returns true if pos emits power in any way +-- mesecon.is_power_off(pos) --> Returns true if pos does not emit power in any way +-- mesecon.is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor + +-- RULES ROTATION helpers +-- mesecon.rotate_rules_right(rules) +-- mesecon.rotate_rules_left(rules) +-- mesecon.rotate_rules_up(rules) +-- mesecon.rotate_rules_down(rules) +-- These functions return rules that have been rotated in the specific direction + +-- See fifo_queue.lua for documentation. +mesecon.fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua") + +-- General +function mesecon.get_effector(nodename) + local def = minetest.registered_nodes[nodename] + return def and def.mesecons and def.mesecons.effector +end + +function mesecon.get_receptor(nodename) + local def = minetest.registered_nodes[nodename] + return def and def.mesecons and def.mesecons.receptor +end + +function mesecon.get_conductor(nodename) + local def = minetest.registered_nodes[nodename] + return def and def.mesecons and def.mesecons.conductor +end + +function mesecon.get_any_outputrules(node) + if not node then return nil end + + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_receptor(node.name) then + return mesecon.receptor_get_rules(node) + end +end + +function mesecon.get_any_inputrules(node) + if not node then return nil end + + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_effector(node.name) then + return mesecon.effector_get_rules(node) + end +end + +function mesecon.get_any_rules(node) + return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node), + mesecon.get_any_outputrules(node)) +end + +-- Receptors +-- Nodes that can power mesecons +function mesecon.is_receptor_on(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor and receptor.state == mesecon.state.on then + return true + end + return false +end + +function mesecon.is_receptor_off(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor and receptor.state == mesecon.state.off then + return true + end + return false +end + +function mesecon.is_receptor(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor then + return true + end + return false +end + +function mesecon.receptor_get_rules(node) + local receptor = mesecon.get_receptor(node.name) + if receptor then + local rules = receptor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + + return mesecon.rules.default +end + +-- Effectors +-- Nodes that can be powered by mesecons +function mesecon.is_effector_on(nodename) + local effector = mesecon.get_effector(nodename) + if effector and effector.action_off then + return true + end + return false +end + +function mesecon.is_effector_off(nodename) + local effector = mesecon.get_effector(nodename) + if effector and effector.action_on then + return true + end + return false +end + +function mesecon.is_effector(nodename) + local effector = mesecon.get_effector(nodename) + if effector then + return true + end + return false +end + +function mesecon.effector_get_rules(node) + local effector = mesecon.get_effector(node.name) + if effector then + local rules = effector.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + return mesecon.rules.default +end + +-- ####################### +-- # Signals (effectors) # +-- ####################### + +-- Activation: +mesecon.queue:add_function("activate", function (pos, rulename) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_on then + effector.action_on(pos, node, rulename) + end +end) + +function mesecon.activate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.activate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "activate", {rulename}, nil, rulename, 1 / depth) +end + + +-- Deactivation +mesecon.queue:add_function("deactivate", function (pos, rulename) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_off then + effector.action_off(pos, node, rulename) + end +end) + +function mesecon.deactivate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.deactivate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "deactivate", {rulename}, nil, rulename, 1 / depth) +end + + +-- Change +mesecon.queue:add_function("change", function (pos, rulename, changetype) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_change then + effector.action_change(pos, node, rulename, changetype) + end +end) + +function mesecon.changesignal(pos, node, rulename, newstate, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.changesignal(pos, node, rule, newstate, depth + 1) + end + return + end + + -- Include "change" in overwritecheck so that it cannot be overwritten + -- by "active" / "deactivate" that will be called upon the node at the same time. + local overwritecheck = {"change", rulename} + mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, overwritecheck, 1 / depth) +end + +-- Conductors + +function mesecon.is_conductor_on(node, rulename) + if not node then return false end + + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.on + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) ~= 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return mesecon.get_bit(binstate, bit) + end + end + + return false +end + +function mesecon.is_conductor_off(node, rulename) + if not node then return false end + + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.off + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) == 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return not mesecon.get_bit(binstate, bit) + end + end + + return false +end + +function mesecon.is_conductor(nodename) + local conductor = mesecon.get_conductor(nodename) + if conductor then + return true + end + return false +end + +function mesecon.get_conductor_on(node_off, rulename) + local conductor = mesecon.get_conductor(node_off.name) + if conductor then + if conductor.onstate then + return conductor.onstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_off)) + local binstate = mesecon.getbinstate(node_off.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "1") + return conductor.states[tonumber(binstate,2)+1] + end + end + return nil +end + +function mesecon.get_conductor_off(node_on, rulename) + local conductor = mesecon.get_conductor(node_on.name) + if conductor then + if conductor.offstate then + return conductor.offstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_on)) + local binstate = mesecon.getbinstate(node_on.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "0") + return conductor.states[tonumber(binstate,2)+1] + end + end + return nil +end + +function mesecon.conductor_get_rules(node) + local conductor = mesecon.get_conductor(node.name) + if conductor then + local rules = conductor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + return mesecon.rules.default +end + +-- some more general high-level stuff + +function mesecon.is_power_on(pos, rulename) + local node = mesecon.get_node_force(pos) + if node and (mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name)) then + return true + end + return false +end + +function mesecon.is_power_off(pos, rulename) + local node = mesecon.get_node_force(pos) + if node and (mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name)) then + return true + end + return false +end + +-- The set of conductor states which require light updates when they change. +local light_update_conductors + +-- Calculate the contents of the above set if they have not been calculated. +local function find_light_update_conductors() + -- The expensive calculation is only done the first time. + if light_update_conductors then return end + + light_update_conductors = {} + + -- Find conductors whose lighting characteristics change depending on their state. + local checked = {} + for name, def in pairs(minetest.registered_nodes) do + local conductor = mesecon.get_conductor(name) + if conductor and not checked[name] then + -- Find the other states of the conductor besides the current one. + local other_states + if conductor.onstate then + other_states = {conductor.onstate} + elseif conductor.offstate then + other_states = {conductor.offstate} + else + other_states = conductor.states + end + + -- Check the conductor. Other states are marked as checked. + for _, other_state in ipairs(other_states) do + local other_def = minetest.registered_nodes[other_state] + if (def.paramtype == "light") ~= (other_def.paramtype == "light") + or def.sunlight_propagates ~= other_def.sunlight_propagates + or def.light_source ~= other_def.light_source then + -- The light characteristics change depending on the state. + -- The states are added to the set. + light_update_conductors[name] = true + for _, other_state in ipairs(other_states) do + light_update_conductors[other_state] = true + checked[other_state] = true + end + break + end + checked[other_state] = true + end + end + end +end + +-- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`. +-- Breadth-first search. Map is abstracted away in a voxelmanip. +-- Follow all all conductor paths replacing conductors that were already +-- looked at, activating / changing all effectors along the way. +function mesecon.turnon(pos, link) + find_light_update_conductors() + + local frontiers = mesecon.fifo_queue.new() + frontiers:add({pos = pos, link = link}) + local pos_can_be_skipped = {} + + local depth = 1 + for f in frontiers:iter() do + local node = mesecon.get_node_force(f.pos) + + if not node then + -- Area does not exist; do nothing + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + elseif mesecon.is_conductor(node.name) then + local rules = mesecon.conductor_get_rules(node) + + if mesecon.is_conductor_off(node, f.link) then + -- Call turnon on neighbors + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = vector.add(f.pos, r) + if not pos_can_be_skipped[minetest.hash_node_position(np)] then + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + frontiers:add({pos = np, link = l}) + end + end + end + + mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link), light_update_conductors[node.name] ~= nil) + end + + -- Only conductors with flat rules can be reliably skipped later + if not rules[1] or rules[1].x then + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + end + elseif mesecon.is_effector(node.name) then + mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) + if mesecon.is_effector_off(node.name) then + mesecon.activate(f.pos, node, f.link, depth) + end + else + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + end + depth = depth + 1 + end +end + +-- Turn on an equipotential section starting at `pos`, which outputs in the direction of `link`. +-- Breadth-first search. Map is abstracted away in a voxelmanip. +-- Follow all all conductor paths replacing conductors that were already +-- looked at, deactivating / changing all effectors along the way. +-- In case an onstate receptor is discovered, abort the process by returning false, which will +-- cause `receptor_off` to discard all changes made in the voxelmanip. +-- Contrary to turnon, turnoff has to cache all change and deactivate signals so that they will only +-- be called in the very end when we can be sure that no conductor was found along the path. +-- +-- Signal table entry structure: +-- { +-- pos = position of effector, +-- node = node descriptor (name, param1 and param2), +-- link = link the effector is connected to, +-- depth = indicates order in which signals wire fired, higher is later +-- } +function mesecon.turnoff(pos, link) + find_light_update_conductors() + + local frontiers = mesecon.fifo_queue.new() + frontiers:add({pos = pos, link = link}) + local signals = {} + local pos_can_be_skipped = {} + + local depth = 1 + for f in frontiers:iter() do + local node = mesecon.get_node_force(f.pos) + + if not node then + -- Area does not exist; do nothing + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + elseif mesecon.is_conductor(node.name) then + local rules = mesecon.conductor_get_rules(node) + + if mesecon.is_conductor_on(node, f.link) then + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = vector.add(f.pos, r) + + if not pos_can_be_skipped[minetest.hash_node_position(np)] then + -- Check if an onstate receptor is connected. If that is the case, + -- abort this turnoff process by returning false. `receptor_off` will + -- discard all the changes that we made in the voxelmanip: + if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then + if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then + return false + end + end + + -- Call turnoff on neighbors + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + frontiers:add({pos = np, link = l}) + end + end + end + + mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link), light_update_conductors[node.name] ~= nil) + end + + -- Only conductors with flat rules can be reliably skipped later + if not rules[1] or rules[1].x then + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + end + elseif mesecon.is_effector(node.name) then + table.insert(signals, { + pos = f.pos, + node = node, + link = f.link, + depth = depth + }) + else + pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true + end + depth = depth + 1 + end + + for _, sig in ipairs(signals) do + -- If sig.depth is 1, it has not yet been checked that the power source is actually off. + if sig.depth > 1 or not mesecon.is_powered(sig.pos, sig.link) then + mesecon.changesignal(sig.pos, sig.node, sig.link, mesecon.state.off, sig.depth) + if mesecon.is_effector_on(sig.node.name) and not mesecon.is_powered(sig.pos) then + mesecon.deactivate(sig.pos, sig.node, sig.link, sig.depth) + end + end + end + + return true +end + +-- Get all linking inputrules of inputnode (effector or conductor) that is connected to +-- outputnode (receptor or conductor) at position `output` and has an output in direction `rule` +function mesecon.rules_link_rule_all(output, rule) + local input = vector.add(output, rule) + local inputnode = mesecon.get_node_force(input) + local inputrules = mesecon.get_any_inputrules(inputnode) + if not inputrules then + return {} + end + local rules = {} + + for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do + -- Check if input accepts from output + if vector.equals(vector.add(input, inputrule), output) then + table.insert(rules, inputrule) + end + end + + return rules +end + +-- Get all linking outputnodes of outputnode (receptor or conductor) that is connected to +-- inputnode (effector or conductor) at position `input` and has an input in direction `rule` +function mesecon.rules_link_rule_all_inverted(input, rule) + local output = vector.add(input, rule) + local outputnode = mesecon.get_node_force(output) + local outputrules = mesecon.get_any_outputrules(outputnode) + if not outputrules then + return {} + end + local rules = {} + + for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do + if vector.equals(vector.add(output, outputrule), input) then + table.insert(rules, mesecon.invertRule(outputrule)) + end + end + return rules +end + +function mesecon.is_powered(pos, rule) + local node = mesecon.get_node_force(pos) + local rules = mesecon.get_any_inputrules(node) + if not rules then return false end + + -- List of nodes that send out power to pos + local sourcepos = {} + + if not rule then + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + for _, rname in ipairs(rulenames) do + local np = vector.add(pos, rname) + local nn = mesecon.get_node_force(np) + + if (mesecon.is_conductor_on(nn, mesecon.invertRule(rname)) + or mesecon.is_receptor_on(nn.name)) then + table.insert(sourcepos, np) + end + end + end + else + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + for _, rname in ipairs(rulenames) do + local np = vector.add(pos, rname) + local nn = mesecon.get_node_force(np) + if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) + or mesecon.is_receptor_on (nn.name)) then + table.insert(sourcepos, np) + end + end + end + + -- Return FALSE if not powered, return list of sources if is powered + if (#sourcepos == 0) then return false + else return sourcepos end +end diff --git a/mods/mesecons/mesecons/legacy.lua b/mods/mesecons/mesecons/legacy.lua new file mode 100644 index 00000000..2a8eae64 --- /dev/null +++ b/mods/mesecons/mesecons/legacy.lua @@ -0,0 +1,14 @@ +-- Un-forceload any forceloaded mapblocks from older versions of Mesecons which +-- used forceloading instead of VoxelManipulators. +local BLOCKSIZE = 16 + +-- convert block hash --> node position +local function unhash_blockpos(hash) + return vector.multiply(minetest.get_position_from_hash(hash), BLOCKSIZE) +end + +local old_forceloaded_blocks = mesecon.file2table("mesecon_forceloaded") +for hash, _ in pairs(old_forceloaded_blocks) do + minetest.forceload_free_block(unhash_blockpos(hash)) +end +os.remove(minetest.get_worldpath().."/mesecon_forceloaded") diff --git a/mods/mesecons/mesecons/locale/mesecons.de.tr b/mods/mesecons/mesecons/locale/mesecons.de.tr new file mode 100644 index 00000000..520c5aeb --- /dev/null +++ b/mods/mesecons/mesecons/locale/mesecons.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons + +Mesecons=Mesecons diff --git a/mods/mesecons/mesecons/locale/mesecons.eo.tr b/mods/mesecons/mesecons/locale/mesecons.eo.tr new file mode 100644 index 00000000..76961f0e --- /dev/null +++ b/mods/mesecons/mesecons/locale/mesecons.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons + +### oldwires.lua ### +Mesecons=Mesekonduktilo diff --git a/mods/mesecons/mesecons/locale/mesecons.fr.tr b/mods/mesecons/mesecons/locale/mesecons.fr.tr new file mode 100644 index 00000000..2b51d695 --- /dev/null +++ b/mods/mesecons/mesecons/locale/mesecons.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons + +### oldwires.lua ### +Mesecons=Mesecons diff --git a/mods/mesecons/mesecons/locale/template.txt b/mods/mesecons/mesecons/locale/template.txt new file mode 100644 index 00000000..ca5f5d18 --- /dev/null +++ b/mods/mesecons/mesecons/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons + +### oldwires.lua ### +Mesecons= diff --git a/mods/mesecons/mesecons/mod.conf b/mods/mesecons/mesecons/mod.conf new file mode 100644 index 00000000..b49e9a83 --- /dev/null +++ b/mods/mesecons/mesecons/mod.conf @@ -0,0 +1,4 @@ +name = mesecons +# default is an optional dependency as some mods may expect it as a transitory +# dependency when they depend on mesecons. +optional_depends = default diff --git a/mods/mesecons/mesecons/oldwires.lua b/mods/mesecons/mesecons/oldwires.lua new file mode 100644 index 00000000..dfbe0677 --- /dev/null +++ b/mods/mesecons/mesecons/oldwires.lua @@ -0,0 +1,40 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("mesecons:mesecon_off", { + drawtype = "raillike", + tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"}, + inventory_image = "jeija_mesecon_off.png", + wield_image = "jeija_mesecon_off.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + }, + groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1}, + description= S("Mesecons"), + mesecons = {conductor={ + state = mesecon.state.off, + onstate = "mesecons:mesecon_on" + }} +}) + +minetest.register_node("mesecons:mesecon_on", { + drawtype = "raillike", + tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"}, + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + }, + groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1}, + drop = "mesecons:mesecon_off 1", + light_source = minetest.LIGHT_MAX-11, + mesecons = {conductor={ + state = mesecon.state.on, + offstate = "mesecons:mesecon_off" + }} +}) diff --git a/mods/mesecons/mesecons/presets.lua b/mods/mesecons/mesecons/presets.lua new file mode 100644 index 00000000..bf16d993 --- /dev/null +++ b/mods/mesecons/mesecons/presets.lua @@ -0,0 +1,88 @@ +mesecon.rules = {} +mesecon.state = {} + +mesecon.rules.default = { + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 1, z = 0}, + {x = 1, y = -1, z = 0}, + {x = -1, y = 1, z = 0}, + {x = -1, y = -1, z = 0}, + {x = 0, y = 1, z = 1}, + {x = 0, y = -1, z = 1}, + {x = 0, y = 1, z = -1}, + {x = 0, y = -1, z = -1}, +} + +mesecon.rules.floor = mesecon.merge_rule_sets(mesecon.rules.default, {{x = 0, y = -1, z = 0}}) + +mesecon.rules.pplate = mesecon.merge_rule_sets(mesecon.rules.floor, {{x = 0, y = -2, z = 0}}) + +mesecon.rules.buttonlike = { + {x = 1, y = 0, z = 0}, + {x = 1, y = 1, z = 0}, + {x = 1, y = -1, z = 0}, + {x = 1, y = -1, z = 1}, + {x = 1, y = -1, z = -1}, + {x = 2, y = 0, z = 0}, +} + +mesecon.rules.flat = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, +} + +mesecon.rules.alldirs = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, +} + +local rules_wallmounted = { + xp = mesecon.rotate_rules_down(mesecon.rules.floor), + xn = mesecon.rotate_rules_up(mesecon.rules.floor), + yp = mesecon.rotate_rules_up(mesecon.rotate_rules_up(mesecon.rules.floor)), + yn = mesecon.rules.floor, + zp = mesecon.rotate_rules_left(mesecon.rotate_rules_up(mesecon.rules.floor)), + zn = mesecon.rotate_rules_right(mesecon.rotate_rules_up(mesecon.rules.floor)), +} + +local rules_buttonlike = { + xp = mesecon.rules.buttonlike, + xn = mesecon.rotate_rules_right(mesecon.rotate_rules_right(mesecon.rules.buttonlike)), + yp = mesecon.rotate_rules_down(mesecon.rules.buttonlike), + yn = mesecon.rotate_rules_up(mesecon.rules.buttonlike), + zp = mesecon.rotate_rules_right(mesecon.rules.buttonlike), + zn = mesecon.rotate_rules_left(mesecon.rules.buttonlike), +} + +local function rules_from_dir(ruleset, dir) + if not dir then return {} end + + if dir.x == 1 then return ruleset.xp end + if dir.y == 1 then return ruleset.yp end + if dir.z == 1 then return ruleset.zp end + if dir.x == -1 then return ruleset.xn end + if dir.y == -1 then return ruleset.yn end + if dir.z == -1 then return ruleset.zn end +end + +mesecon.rules.wallmounted_get = function(node) + local dir = minetest.wallmounted_to_dir(node.param2) + return rules_from_dir(rules_wallmounted, dir) +end + +mesecon.rules.buttonlike_get = function(node) + local dir = minetest.facedir_to_dir(node.param2) + return rules_from_dir(rules_buttonlike, dir) +end + +mesecon.state.on = "on" +mesecon.state.off = "off" diff --git a/mods/mesecons/mesecons/services.lua b/mods/mesecons/mesecons/services.lua new file mode 100644 index 00000000..f33aee42 --- /dev/null +++ b/mods/mesecons/mesecons/services.lua @@ -0,0 +1,139 @@ +-- Dig and place services + +mesecon.on_placenode = function(pos, node) + mesecon.execute_autoconnect_hooks_now(pos, node) + node = minetest.get_node(pos) -- Update the node in case it was just changed. + + -- Receptors: Send on signal when active + if mesecon.is_receptor_on(node.name) then + mesecon.receptor_on(pos, mesecon.receptor_get_rules(node)) + end + + -- Conductors: Send turnon signal when powered or replace by respective offstate conductor + -- if placed conductor is an onstate one + if mesecon.is_conductor(node.name) then + local conductor = mesecon.get_conductor(node.name) + if conductor.state ~= mesecon.state.off then + -- Turn the conductor off. + node.name = conductor.offstate or conductor.states[1] + minetest.swap_node(pos, node) + end + local sources = mesecon.is_powered(pos) + if sources then + mesecon.vm_begin() + for _, s in ipairs(sources) do + local rule = vector.subtract(s, pos) + mesecon.turnon(pos, rule) + end + mesecon.vm_commit() + end + end + + -- Effectors: Send changesignal and activate or deactivate + if mesecon.is_effector(node.name) then + local powered_rules = {} + local unpowered_rules = {} + + -- for each input rule, check if powered + for _, r in ipairs(mesecon.effector_get_rules(node)) do + local powered = mesecon.is_powered(pos, r) + if powered then table.insert(powered_rules, r) + else table.insert(unpowered_rules, r) end + + local state = powered and mesecon.state.on or mesecon.state.off + mesecon.changesignal(pos, node, r, state, 1) + end + + if (#powered_rules > 0) then + for _, r in ipairs(powered_rules) do + mesecon.activate(pos, node, r, 1) + end + else + for _, r in ipairs(unpowered_rules) do + mesecon.deactivate(pos, node, r, 1) + end + end + end +end + +mesecon.on_dignode = function(pos, node) + if mesecon.is_conductor_on(node) then + mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) + elseif mesecon.is_receptor_on(node.name) then + mesecon.receptor_off(pos, mesecon.receptor_get_rules(node)) + end + + mesecon.execute_autoconnect_hooks_queue(pos, node) +end + +function mesecon.on_blastnode(pos) + local node = minetest.get_node(pos) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) + return minetest.get_node_drops(node.name, "") +end + +minetest.register_on_placenode(mesecon.on_placenode) +minetest.register_on_dignode(mesecon.on_dignode) + +-- Overheating service for fast circuits +local OVERHEAT_MAX = mesecon.setting("overheat_max", 20) +local COOLDOWN_TIME = mesecon.setting("cooldown_time", 2.0) +local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5) +local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME +local cooldown_timer = 0.0 +local object_heat = {} + +-- returns true if heat is too high +function mesecon.do_overheat(pos) + local id = minetest.hash_node_position(pos) + local heat = (object_heat[id] or 0) + 1 + object_heat[id] = heat + if heat >= OVERHEAT_MAX then + minetest.log("action", "Node overheats at " .. minetest.pos_to_string(pos)) + object_heat[id] = nil + return true + end + return false +end + +function mesecon.do_cooldown(pos) + local id = minetest.hash_node_position(pos) + object_heat[id] = nil +end + +function mesecon.get_heat(pos) + local id = minetest.hash_node_position(pos) + return object_heat[id] or 0 +end + +function mesecon.move_hot_nodes(moved_nodes) + local new_heat = {} + for _, n in ipairs(moved_nodes) do + local old_id = minetest.hash_node_position(n.oldpos) + local new_id = minetest.hash_node_position(n.pos) + new_heat[new_id] = object_heat[old_id] + object_heat[old_id] = nil + end + for id, heat in pairs(new_heat) do + object_heat[id] = heat + end +end + +local function global_cooldown(dtime) + cooldown_timer = cooldown_timer + dtime + if cooldown_timer < COOLDOWN_STEP then + return -- don't overload the CPU + end + local cooldown = COOLDOWN_MULTIPLIER * cooldown_timer + cooldown_timer = 0 + for id, heat in pairs(object_heat) do + heat = heat - cooldown + if heat <= 0 then + object_heat[id] = nil -- free some RAM + else + object_heat[id] = heat + end + end +end +minetest.register_globalstep(global_cooldown) diff --git a/mods/mesecons/mesecons/settings.lua b/mods/mesecons/mesecons/settings.lua new file mode 100644 index 00000000..02207073 --- /dev/null +++ b/mods/mesecons/mesecons/settings.lua @@ -0,0 +1,15 @@ +-- SETTINGS +function mesecon.setting(setting, default) + if type(default) == "boolean" then + local read = minetest.settings:get_bool("mesecon."..setting) + if read == nil then + return default + else + return read + end + elseif type(default) == "string" then + return minetest.settings:get("mesecon."..setting) or default + elseif type(default) == "number" then + return tonumber(minetest.settings:get("mesecon."..setting) or default) + end +end diff --git a/mods/mesecons/mesecons/spec/action_spec.lua b/mods/mesecons/mesecons/spec/action_spec.lua new file mode 100644 index 00000000..55f75d8c --- /dev/null +++ b/mods/mesecons/mesecons/spec/action_spec.lua @@ -0,0 +1,62 @@ +require("mineunit") + +fixture("mesecons") + +describe("action queue", function() + local layout = { + {{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"}, + {{x = 0, y = 0, z = 0}, "mesecons:test_conductor_off"}, + {{x = -1, y = 0, z = 0}, "mesecons:test_conductor_off"}, + {{x = 0, y = 1, z = 0}, "mesecons:test_effector"}, + {{x = -1, y = 1, z = 0}, "mesecons:test_effector"}, + } + + before_each(function() + world.layout(layout) + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("executes in order", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal(2, #mesecon._test_effector_events) + assert.same({"on", layout[4][1]}, mesecon._test_effector_events[1]) + assert.same({"on", layout[5][1]}, mesecon._test_effector_events[2]) + + world.set_node(layout[1][1], "mesecons:test_receptor_off") + mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_off action + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal(4, #mesecon._test_effector_events) + assert.same({"off", layout[4][1]}, mesecon._test_effector_events[3]) + assert.same({"off", layout[5][1]}, mesecon._test_effector_events[4]) + end) + + it("discards outdated/overwritten node events", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + world.set_node(layout[1][1], "mesecons:test_receptor_off") + mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_off action + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal(0, #mesecon._test_effector_events) + end) + + it("delays actions", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.queue:add_action(layout[1][1], "receptor_on", {mesecon.rules.alldirs}, 1, nil) + mineunit:execute_globalstep(0.1) + mineunit:execute_globalstep(1) + assert.equal(0, #mesecon._test_effector_events) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal(0, #mesecon._test_effector_events) + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal(2, #mesecon._test_effector_events) + end) +end) diff --git a/mods/mesecons/mesecons/spec/mineunit.conf b/mods/mesecons/mesecons/spec/mineunit.conf new file mode 100644 index 00000000..81bd36ce --- /dev/null +++ b/mods/mesecons/mesecons/spec/mineunit.conf @@ -0,0 +1 @@ +fixture_paths = {"../.test_fixtures"} diff --git a/mods/mesecons/mesecons/spec/service_spec.lua b/mods/mesecons/mesecons/spec/service_spec.lua new file mode 100644 index 00000000..7b6fa0ab --- /dev/null +++ b/mods/mesecons/mesecons/spec/service_spec.lua @@ -0,0 +1,192 @@ +require("mineunit") + +fixture("mesecons") +fixture("screwdriver") + +describe("placement/digging service", function() + local layout = { + {{x = 1, y = 0, z = 0}, "mesecons:test_receptor_on"}, + {{x = 0, y = 0, z = 0}, "mesecons:test_conductor_on"}, + {{x = -1, y = 0, z = 0}, "mesecons:test_conductor_on"}, + {{x = 0, y = 1, z = 0}, "mesecons:test_effector"}, + {{x = -2, y = 0, z = 0}, "mesecons:test_effector"}, + {{x = 2, y = 0, z = 0}, "mesecons:test_effector"}, + } + + before_each(function() + world.layout(layout) + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("updates components when a receptor changes", function() + -- Dig then replace a receptor and check that the connected effectors changed. + + mesecon._test_dig(layout[1][1]) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_off", world.get_node(layout[2][1]).name) + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal(3, #mesecon._test_effector_events) + + mesecon._test_place(layout[1][1], "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_conductor_on", world.get_node(layout[2][1]).name) + mineunit:execute_globalstep() -- Execute activate/change action + assert.equal(6, #mesecon._test_effector_events) + end) + + it("updates components when a conductor changes", function() + -- Dig then replace a powered conductor and check that the connected effectors changed. + + mesecon._test_dig(layout[2][1]) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name) + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal(2, #mesecon._test_effector_events) + + mesecon._test_place(layout[2][1], "mesecons:test_conductor_off") + assert.equal("mesecons:test_conductor_on", world.get_node(layout[2][1]).name) + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal(4, #mesecon._test_effector_events) + end) + + it("updates effectors on placement", function() + local pos = {x = 0, y = 0, z = 1} + mesecon._test_place(pos, "mesecons:test_effector") + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal(tonumber("10100000", 2), world.get_node(pos).param2) + end) + + it("updates multiconductors on placement", function() + local pos = {x = 0, y = 0, z = 1} + mesecon._test_place(pos, "mesecons:test_multiconductor_off") + assert.equal("mesecons:test_multiconductor_010", world.get_node(pos).name) + end) + + it("turns off conductors on placement", function() + local pos = {x = 3, y = 0, z = 0} + mesecon._test_place(pos, "mesecons:test_conductor_on") + assert.equal("mesecons:test_conductor_off", world.get_node(pos).name) + end) + + it("turns off multiconductors on placement", function() + local pos = {x = 3, y = 0, z = 0} + mesecon._test_place(pos, "mesecons:test_multiconductor_on") + assert.equal("mesecons:test_multiconductor_off", world.get_node(pos).name) + end) + + it("triggers autoconnect hooks", function() + mesecon._test_dig(layout[2][1]) + mineunit:execute_globalstep() -- Execute delayed hook + assert.equal(1, #mesecon._test_autoconnects) + + mesecon._test_place(layout[2][1], layout[2][2]) + assert.equal(2, #mesecon._test_autoconnects) + end) +end) + +describe("overheating service", function() + local layout = { + {{x = 0, y = 0, z = 0}, "mesecons:test_receptor_off"}, + {{x = 1, y = 0, z = 0}, "mesecons:test_effector"}, + {{x = 2, y = 0, z = 0}, "mesecons:test_receptor_on"}, + } + + before_each(function() + world.layout(layout) + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("tracks heat", function() + mesecon.do_overheat(layout[2][1]) + assert.equal(1, mesecon.get_heat(layout[2][1])) + mesecon.do_cooldown(layout[2][1]) + assert.equal(0, mesecon.get_heat(layout[2][1])) + end) + + it("cools over time", function() + mesecon.do_overheat(layout[2][1]) + assert.equal(1, mesecon.get_heat(layout[2][1])) + mineunit:execute_globalstep(60) + mineunit:execute_globalstep(60) + mineunit:execute_globalstep(60) + assert.equal(0, mesecon.get_heat(layout[2][1])) + end) + + it("tracks movement", function() + local oldpos = layout[2][1] + local pos = vector.offset(oldpos, 0, 1, 0) + mesecon.do_overheat(oldpos) + mesecon.move_hot_nodes({{pos = pos, oldpos = oldpos}}) + assert.equal(0, mesecon.get_heat(oldpos)) + assert.equal(1, mesecon.get_heat(pos)) + end) + + it("causes overheating", function() + -- Switch the first receptor on and off until it overheats/breaks a receptor. + repeat + if mesecon.flipstate(layout[1][1], minetest.get_node(layout[1][1])) == "on" then + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + else + mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs) + end + mineunit:execute_globalstep(0) -- Execute receptor_on/receptor_off/activate/deactivate/change actions + until minetest.get_node(layout[2][1]).name ~= "mesecons:test_effector" + assert.same({"overheat", layout[2][1]}, mesecon._test_effector_events[#mesecon._test_effector_events]) + assert.equal(0, mesecon.get_heat(layout[2][1])) + end) +end) + +describe("screwdriver service", function() + local layout = { + {{x = 0, y = 0, z = 0}, "mesecons:test_conductor_rot_on"}, + {{x = 1, y = 0, z = 0}, "mesecons:test_receptor_on"}, + {{x = -1, y = 0, z = 0}, "mesecons:test_conductor_on"}, + {{x = 0, y = 0, z = 1}, "mesecons:test_receptor_on"}, + {{x = 0, y = 0, z = -1}, "mesecons:test_conductor_off"}, + } + + local function rotate(new_param2) + local pos = layout[1][1] + local node = world.get_node(pos) + local on_rotate = minetest.registered_nodes[node.name].on_rotate + on_rotate(pos, node, nil, screwdriver.ROTATE_FACE, new_param2) + end + + before_each(function() + world.layout(layout) + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("updates conductors", function() + -- Rotate a conductor and see that the circuit state changes. + rotate(1) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name) + assert.equal("mesecons:test_conductor_on", world.get_node(layout[5][1]).name) + rotate(2) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + assert.equal("mesecons:test_conductor_off", world.get_node(layout[5][1]).name) + rotate(3) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name) + assert.equal("mesecons:test_conductor_on", world.get_node(layout[5][1]).name) + rotate(0) + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + assert.equal("mesecons:test_conductor_off", world.get_node(layout[5][1]).name) + end) +end) diff --git a/mods/mesecons/mesecons/spec/state_spec.lua b/mods/mesecons/mesecons/spec/state_spec.lua new file mode 100644 index 00000000..c66871bb --- /dev/null +++ b/mods/mesecons/mesecons/spec/state_spec.lua @@ -0,0 +1,147 @@ +require("mineunit") + +fixture("mesecons") + +describe("state", function() + local layout = { + {{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"}, + {{x = 0, y = 1, z = 0}, "mesecons:test_receptor_off"}, + {{x = 0, y = 0, z = 0}, "mesecons:test_conductor_off"}, + {{x = -1, y = 0, z = 0}, "mesecons:test_effector"}, + {{x = 2, y = 0, z = 0}, "mesecons:test_effector"}, + {{x = 0, y = -1, z = 0}, "mesecons:test_effector"}, + } + + before_each(function() + world.layout(layout) + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("turns on", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2) + assert.equal(tonumber("10000010", 2), world.get_node(layout[5][1]).param2) + assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2) + + world.set_node(layout[2][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2) + assert.equal(tonumber("10000010", 2), world.get_node(layout[5][1]).param2) + assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2) + end) + + it("turns off", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + world.set_node(layout[2][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on actions + + world.set_node(layout[1][1], "mesecons:test_receptor_off") + mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_off and activate/change actions + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name) + assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2) + assert.equal(tonumber("00000000", 2), world.get_node(layout[5][1]).param2) + assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2) + + world.set_node(layout[2][1], "mesecons:test_receptor_off") + mesecon.receptor_off(layout[2][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_off action + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name) + assert.equal(tonumber("00000000", 2), world.get_node(layout[4][1]).param2) + assert.equal(tonumber("00000000", 2), world.get_node(layout[5][1]).param2) + assert.equal(tonumber("00000000", 2), world.get_node(layout[6][1]).param2) + end) +end) + +describe("rotation", function() + local layout = { + {{x = 0, y = 0, z = 0}, "mesecons:test_receptor_off"}, + {{x = 1, y = 0, z = 0}, {name = "mesecons:test_conductor_rot_off", param2 = 0}}, + {{x = 0, y = 0, z = 1}, {name = "mesecons:test_conductor_rot_off", param2 = 1}}, + {{x = -1, y = 0, z = 0}, {name = "mesecons:test_conductor_rot_off", param2 = 2}}, + {{x = 0, y = 0, z = -1}, {name = "mesecons:test_conductor_rot_off", param2 = 3}}, + } + + before_each(function() + for _, entry in ipairs(layout) do + world.set_node(entry[1], entry[2]) + end + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("works", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[2][1]).name) + assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[3][1]).name) + assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[4][1]).name) + assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[5][1]).name) + end) +end) + +describe("multiconductor", function() + local layout = { + {{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"}, + {{x = 0, y = 1, z = 0}, "mesecons:test_receptor_off"}, + {{x = 0, y = 0, z = 1}, "mesecons:test_receptor_off"}, + {{x = 0, y = 0, z = 0}, "mesecons:test_multiconductor_off"}, + } + + before_each(function() + world.layout(layout) + end) + + after_each(function() + world.clear() + mesecon._test_reset() + end) + + it("separates its subparts", function() + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_multiconductor_001", world.get_node(layout[4][1]).name) + + world.set_node(layout[2][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_multiconductor_011", world.get_node(layout[4][1]).name) + + world.set_node(layout[3][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[3][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_multiconductor_on", world.get_node(layout[4][1]).name) + end) + + it("loops through itself", function() + -- Make a loop. + world.set_node({x = 0, y = -1, z = 0}, "mesecons:test_conductor_off") + world.set_node({x = -1, y = -1, z = 0}, "mesecons:test_conductor_off") + world.set_node({x = -1, y = 0, z = 0}, "mesecons:test_conductor_off") + + world.set_node(layout[1][1], "mesecons:test_receptor_on") + mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs) + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_multiconductor_101", world.get_node(layout[4][1]).name) + end) +end) diff --git a/mods/mesecons/mesecons/textures/jeija_close_window.png b/mods/mesecons/mesecons/textures/jeija_close_window.png new file mode 100644 index 00000000..8ab7783e Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_close_window.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_A.png b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_A.png new file mode 100644 index 00000000..6f8f056f Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_A.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_B.png b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_B.png new file mode 100644 index 00000000..7cc58eaf Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_B.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_C.png b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_C.png new file mode 100644 index 00000000..3046d24c Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_C.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_D.png b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_D.png new file mode 100644 index 00000000..ed46d974 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_luacontroller_LED_D.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_microcontroller_bottom.png b/mods/mesecons/mesecons/textures/jeija_microcontroller_bottom.png new file mode 100644 index 00000000..7ae955c1 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_microcontroller_bottom.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_microcontroller_sides.png b/mods/mesecons/mesecons/textures/jeija_microcontroller_sides.png new file mode 100644 index 00000000..40f4b60c Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_microcontroller_sides.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_inv.png b/mods/mesecons/mesecons/textures/mesecons_wire_inv.png new file mode 100644 index 00000000..db2676c2 Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_inv.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_off.png b/mods/mesecons/mesecons/textures/mesecons_wire_off.png new file mode 100644 index 00000000..d41f6263 Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_off.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_on.png b/mods/mesecons/mesecons/textures/mesecons_wire_on.png new file mode 100644 index 00000000..239356a0 Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_on.png differ diff --git a/mods/mesecons/mesecons/util.lua b/mods/mesecons/mesecons/util.lua new file mode 100644 index 00000000..e467aeef --- /dev/null +++ b/mods/mesecons/mesecons/util.lua @@ -0,0 +1,523 @@ +function mesecon.move_node(pos, newpos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos):to_table() + minetest.remove_node(pos) + minetest.set_node(newpos, node) + minetest.get_meta(pos):from_table(meta) +end + +-- An on_rotate callback for mesecons components. +function mesecon.on_rotate(pos, node, _, _, new_param2) + local new_node = {name = node.name, param1 = node.param1, param2 = new_param2} + minetest.swap_node(pos, new_node) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(pos, new_node) + minetest.check_for_falling(pos) + return true +end + +-- An on_rotate callback for components which stay horizontal. +function mesecon.on_rotate_horiz(pos, node, user, mode, new_param2) + if not minetest.global_exists("screwdriver") or mode ~= screwdriver.ROTATE_FACE then + return false + end + return mesecon.on_rotate(pos, node, user, mode, new_param2) +end + +-- Rules rotation Functions: +function mesecon.rotate_rules_right(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.z, + y = rule.y, + z = rule.x, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_left(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.z, + y = rule.y, + z = -rule.x, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_down(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.y, + y = rule.x, + z = rule.z, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_up(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.y, + y = -rule.x, + z = rule.z, + name = rule.name}) + end + return nr +end + +-- Returns a rules getter function that returns different rules depending on the node's horizontal rotation. +-- If param2 % 4 == 0, then the rules returned by the getter are a copy of base_rules. +function mesecon.horiz_rules_getter(base_rules) + local rotations = {mesecon.tablecopy(base_rules)} + for i = 2, 4 do + local right_rules = rotations[i - 1] + if not right_rules[1] or right_rules[1].x then + -- flat rules + rotations[i] = mesecon.rotate_rules_left(right_rules) + else + -- not flat + rotations[i] = {} + for j, rules in ipairs(right_rules) do + rotations[i][j] = mesecon.rotate_rules_left(rules) + end + end + end + return function(node) + return rotations[node.param2 % 4 + 1] + end +end + +function mesecon.flattenrules(allrules) +--[[ + { + { + {xyz}, + {xyz}, + }, + { + {xyz}, + {xyz}, + }, + } +--]] + if allrules[1] and + allrules[1].x then + return allrules + end + + local shallowrules = {} + for _, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + table.insert(shallowrules, rule) + end + end + return shallowrules +--[[ + { + {xyz}, + {xyz}, + {xyz}, + {xyz}, + } +--]] +end + +function mesecon.rule2bit(findrule, allrules) + --get the bit of the metarule the rule is in, or bit 1 + if (allrules[1] and + allrules[1].x) or + not findrule then + return 1 + end + for m,metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if vector.equals(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2metaindex(findrule, allrules) + --get the metarule the rule is in, or allrules + if allrules[1].x then + return nil + end + + if not(findrule) then + return mesecon.flattenrules(allrules) + end + + for m, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if vector.equals(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2meta(findrule, allrules) + if #allrules == 0 then return {} end + + local index = mesecon.rule2metaindex(findrule, allrules) + if index == nil then + if allrules[1].x then + return allrules + else + return {} + end + end + return allrules[index] +end + +function mesecon.dec2bin(n) + local x, y = math.floor(n / 2), n % 2 + if (n > 1) then + return mesecon.dec2bin(x)..y + else + return ""..y + end +end + +function mesecon.getstate(nodename, states) + for state, name in ipairs(states) do + if name == nodename then + return state + end + end + error(nodename.." doesn't mention itself in "..dump(states)) +end + +function mesecon.getbinstate(nodename, states) + return mesecon.dec2bin(mesecon.getstate(nodename, states)-1) +end + +function mesecon.get_bit(binary,bit) + bit = bit or 1 + local len = binary:len() + if bit > len then return false end + local c = len-(bit-1) + return binary:sub(c,c) == "1" +end + +function mesecon.set_bit(binary,bit,value) + if value == "1" then + if not mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)+math.pow(2,bit-1)) + end + elseif value == "0" then + if mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)-math.pow(2,bit-1)) + end + end + return binary + +end + +function mesecon.invertRule(r) + return vector.multiply(r, -1) +end + +function mesecon.tablecopy(obj) -- deep copy + if type(obj) == "table" then + return table.copy(obj) + end + return obj +end + +-- Returns whether two values are equal. +-- In tables, keys are compared for identity but values are compared recursively. +-- There is no protection from infinite recursion. +function mesecon.cmpAny(t1, t2) + if type(t1) ~= type(t2) then return false end + if type(t1) ~= "table" then return t1 == t2 end + + -- Check that for each key of `t1` both tables have the same value + for i, e in pairs(t1) do + if not mesecon.cmpAny(e, t2[i]) then return false end + end + + -- Check that all keys of `t2` are also keys of `t1` so were checked in the previous loop + for i, _ in pairs(t2) do + if t1[i] == nil then return false end + end + + return true +end + +-- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate. +function mesecon.mergetable(source, dest) + minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable")) + local rval = mesecon.tablecopy(dest) + + for k, v in pairs(source) do + rval[k] = dest[k] or mesecon.tablecopy(v) + end + for i, v in ipairs(source) do + table.insert(rval, mesecon.tablecopy(v)) + end + + return rval +end + +-- Merges several rule sets in one. Order may not be preserved. Nil arguments +-- are ignored. +-- The rule sets must be of the same kind (either all single-level or all two-level). +-- The function may be changed to normalize the resulting set in some way. +function mesecon.merge_rule_sets(...) + local rval = {} + for _, t in pairs({...}) do -- ignores nils automatically + table.insert_all(rval, mesecon.tablecopy(t)) + end + return rval +end + +-- Merges two tables, with entries from `replacements` taking precedence over +-- those from `base`. Returns the new table. +-- Values are deep-copied from either table, keys are referenced. +-- Numerical indices aren’t handled specially. +function mesecon.merge_tables(base, replacements) + local ret = mesecon.tablecopy(replacements) -- these are never overriden so have to be copied in any case + for k, v in pairs(base) do + if ret[k] == nil then -- it could be `false` + ret[k] = mesecon.tablecopy(v) + end + end + return ret +end + +function mesecon.register_node(name, spec_common, spec_off, spec_on) + spec_common.drop = spec_common.drop or name .. "_off" + spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode + spec_common.__mesecon_basename = name + spec_on.__mesecon_state = "on" + spec_off.__mesecon_state = "off" + + spec_on = mesecon.merge_tables(spec_common, spec_on); + spec_off = mesecon.merge_tables(spec_common, spec_off); + + minetest.register_node(name .. "_on", spec_on) + minetest.register_node(name .. "_off", spec_off) +end + +-- swap onstate and offstate nodes, returns new state +function mesecon.flipstate(pos, node) + local nodedef = minetest.registered_nodes[node.name] + local newstate + if (nodedef.__mesecon_state == "on") then newstate = "off" end + if (nodedef.__mesecon_state == "off") then newstate = "on" end + + minetest.swap_node(pos, {name = nodedef.__mesecon_basename .. "_" .. newstate, + param2 = node.param2}) + + return newstate +end + +-- File writing / reading utilities +local wpath = minetest.get_worldpath() +function mesecon.file2table(filename) + local f = io.open(wpath.."/"..filename, "r") + if f == nil then return {} end + local t = f:read("*all") + f:close() + if t == "" or t == nil then return {} end + return minetest.deserialize(t) +end + +function mesecon.table2file(filename, table) + local f = io.open(wpath.."/"..filename, "w") + f:write(minetest.serialize(table)) + f:close() +end + +-- Block position "hashing" (convert to integer) functions for voxelmanip cache +local BLOCKSIZE = 16 + +-- convert node position --> block hash +local function hash_blockpos(pos) + return minetest.hash_node_position({ + x = math.floor(pos.x/BLOCKSIZE), + y = math.floor(pos.y/BLOCKSIZE), + z = math.floor(pos.z/BLOCKSIZE) + }) +end + +-- Maps from a hashed mapblock position (as returned by hash_blockpos) to a +-- table. +-- +-- Contents of the table are: +-- “vm” → the VoxelManipulator +-- “dirty” → true if data has been modified +-- +-- Nil if no VM-based transaction is in progress. +local vm_cache = nil + +-- Cache from node position hashes to nodes (represented as tables). +local vm_node_cache = nil + +-- Whether the current transaction will need a light update afterward. +local vm_update_light = false + +-- Starts a VoxelManipulator-based transaction. +-- +-- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a +-- cached copy of the world loaded via VoxelManipulators. That cache can later +-- be committed to the real map by means of vm_commit or discarded by means of +-- vm_abort. +function mesecon.vm_begin() + vm_cache = {} + vm_node_cache = {} + vm_update_light = false +end + +-- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data +-- and writing back any modified areas. +function mesecon.vm_commit() + for hash, tbl in pairs(vm_cache) do + if tbl.dirty then + local vm = tbl.vm + vm:write_to_map(vm_update_light) + vm:update_map() + end + end + vm_cache = nil + vm_node_cache = nil +end + +-- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing +-- away any modified areas. +function mesecon.vm_abort() + vm_cache = nil + vm_node_cache = nil +end + +-- Gets the cache entry covering a position, populating it if necessary. +local function vm_get_or_create_entry(pos) + local hash = hash_blockpos(pos) + local tbl = vm_cache[hash] + if not tbl then + tbl = {vm = minetest.get_voxel_manip(pos, pos), dirty = false} + vm_cache[hash] = tbl + end + return tbl +end + +-- Gets the node at a given position during a VoxelManipulator-based +-- transaction. +function mesecon.vm_get_node(pos) + local hash = minetest.hash_node_position(pos) + local node = vm_node_cache[hash] + if not node then + node = vm_get_or_create_entry(pos).vm:get_node_at(pos) + vm_node_cache[hash] = node + end + return node.name ~= "ignore" and {name = node.name, param1 = node.param1, param2 = node.param2} or nil +end + +-- Sets a node’s name during a VoxelManipulator-based transaction. +-- +-- Existing param1, param2, and metadata are left alone. +-- +-- The swap will necessitate a light update unless update_light equals false. +function mesecon.vm_swap_node(pos, name, update_light) + -- If one node needs a light update, all VMs should use light updates to + -- prevent newly calculated light from being overwritten by other VMs. + vm_update_light = vm_update_light or update_light ~= false + + local tbl = vm_get_or_create_entry(pos) + local hash = minetest.hash_node_position(pos) + local node = vm_node_cache[hash] + if not node then + node = tbl.vm:get_node_at(pos) + vm_node_cache[hash] = node + end + node.name = name + tbl.vm:set_node_at(pos, node) + tbl.dirty = true +end + +-- Gets the node at a given position, regardless of whether it is loaded or +-- not, respecting a transaction if one is in progress. +-- +-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into +-- the server’s main map data cache and then accessed from there. +-- +-- Inside a VM transaction, the transaction’s VM cache is used. +function mesecon.get_node_force(pos) + if vm_cache then + return mesecon.vm_get_node(pos) + else + local node = minetest.get_node_or_nil(pos) + if node == nil then + -- Node is not currently loaded; use a VoxelManipulator to prime + -- the mapblock cache and try again. + minetest.get_voxel_manip(pos, pos) + node = minetest.get_node_or_nil(pos) + end + return node + end +end + +-- Swaps the node at a given position, regardless of whether it is loaded or +-- not, respecting a transaction if one is in progress. +-- +-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into +-- the server’s main map data cache and then accessed from there. +-- +-- Inside a VM transaction, the transaction’s VM cache is used. +-- +-- This function can only be used to change the node’s name, not its parameters +-- or metadata. +-- +-- The swap will necessitate a light update unless update_light equals false. +function mesecon.swap_node_force(pos, name, update_light) + if vm_cache then + return mesecon.vm_swap_node(pos, name, update_light) + else + -- This serves to both ensure the mapblock is loaded and also hand us + -- the old node table so we can preserve param2. + local node = mesecon.get_node_force(pos) + node.name = name + minetest.swap_node(pos, node) + end +end + +-- Autoconnect Hooks +-- Nodes like conductors may change their appearance and their connection rules +-- right after being placed or after being dug, e.g. the default wires use this +-- to automatically connect to linking nodes after placement. +-- After placement, the update function will be executed immediately so that the +-- possibly changed rules can be taken into account when recalculating the circuit. +-- After digging, the update function will be queued and executed after +-- recalculating the circuit. The update function must take care of updating the +-- node at the given position itself, but also all of the other nodes the given +-- position may have (had) a linking connection to. +mesecon.autoconnect_hooks = {} + +-- name: A unique name for the hook, e.g. "foowire". Used to name the actionqueue function. +-- fct: The update function with parameters function(pos, node) +function mesecon.register_autoconnect_hook(name, fct) + mesecon.autoconnect_hooks[name] = fct + mesecon.queue:add_function("autoconnect_hook_"..name, fct) +end + +function mesecon.execute_autoconnect_hooks_now(pos, node) + for _, fct in pairs(mesecon.autoconnect_hooks) do + fct(pos, node) + end +end + +function mesecon.execute_autoconnect_hooks_queue(pos, node) + for name in pairs(mesecon.autoconnect_hooks) do + mesecon.queue:add_action(pos, "autoconnect_hook_"..name, {node}) + end +end diff --git a/mods/mesecons/mesecons_alias/init.lua b/mods/mesecons/mesecons_alias/init.lua new file mode 100644 index 00000000..395c3682 --- /dev/null +++ b/mods/mesecons/mesecons_alias/init.lua @@ -0,0 +1,38 @@ +-- This file registers aliases for the /give /giveme commands. + +minetest.register_alias("mesecons:removestone", "mesecons_random:removestone") +minetest.register_alias("mesecons:power_plant", "mesecons_powerplant:power_plant") +minetest.register_alias("mesecons:powerplant", "mesecons_powerplant:power_plant") +minetest.register_alias("mesecons:meselamp", "mesecons_lamp:lamp_off") +minetest.register_alias("mesecons:mesecon", "mesecons:wire_00000000_off") +minetest.register_alias("mesecons:object_detector", "mesecons_detector:object_detector_off") +minetest.register_alias("mesecons:wireless_inverter", "mesecons_wireless:wireless_inverter_on") +minetest.register_alias("mesecons:wireless_receiver", "mesecons_wireless:wireless_receiver_off") +minetest.register_alias("mesecons:wireless_transmitter", "mesecons_wireless:wireless_transmitter_off") +minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off") +minetest.register_alias("mesecons:button", "mesecons_button:button_off") +minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal_off") +minetest.register_alias("mesecons:blinky_plant", "mesecons_blinkyplant:blinky_plant_off") +minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on") +minetest.register_alias("mesecons:torch", "mesecons_torch:mesecon_torch_on") +minetest.register_alias("mesecons:hydro_turbine", "mesecons_hydroturbine:hydro_turbine_off") +minetest.register_alias("mesecons:pressure_plate_stone", "mesecons_pressureplates:pressure_plate_stone_off") +minetest.register_alias("mesecons:pressure_plate_wood", "mesecons_pressureplates:pressure_plate_wood_off") +minetest.register_alias("mesecons:mesecon_socket", "mesecons_temperest:mesecon_socket_off") +minetest.register_alias("mesecons:mesecon_inverter", "mesecons_temperest:mesecon_inverter_on") +minetest.register_alias("mesecons:movestone", "mesecons_movestones:movestone") +minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone") +minetest.register_alias("mesecons:noteblock", "mesecons_noteblock:noteblock") +minetest.register_alias("mesecons:microcontroller", "mesecons_microcontroller:microcontroller0000") +minetest.register_alias("mesecons:delayer", "mesecons_delayer:delayer_off_1") +minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off") + + +--Backwards compatibility +minetest.register_alias("mesecons:mesecon_off", "mesecons:wire_00000000_off") +minetest.register_alias("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky_on") +minetest.register_alias("mesecons_pistons:piston_normal", "mesecons_pistons:piston_normal_on") +minetest.register_alias("mesecons_pistons:piston_up_normal", "mesecons_pistons:piston_up_normal_on") +minetest.register_alias("mesecons_pistons:piston_down_normal", "mesecons_pistons:piston_down_normal_on") +minetest.register_alias("mesecons_pistons:piston_up_sticky", "mesecons_pistons:piston_up_sticky_on") +minetest.register_alias("mesecons_pistons:piston_down_sticky", "mesecons_pistons:piston_down_sticky_on") diff --git a/mods/mesecons/mesecons_alias/mod.conf b/mods/mesecons/mesecons_alias/mod.conf new file mode 100644 index 00000000..533d54c8 --- /dev/null +++ b/mods/mesecons/mesecons_alias/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_alias +depends = mesecons diff --git a/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/description.html b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/description.html new file mode 100644 index 00000000..0d987a56 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/description.html @@ -0,0 +1,2 @@ +The blinky plants toggles between on and off state every three seconds. Can be used to make clocks. Also works after having restarted the game. +It stops blinking in an inactive block, then starts again when the block becomes active. diff --git a/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/preview.png b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/preview.png new file mode 100644 index 00000000..4c93b5ff Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/preview.png differ diff --git a/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/recipe.png b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/recipe.png new file mode 100644 index 00000000..afd572a4 Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/recipe.png differ diff --git a/mods/mesecons/mesecons_blinkyplant/init.lua b/mods/mesecons/mesecons_blinkyplant/init.lua new file mode 100644 index 00000000..44dd3ffd --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/init.lua @@ -0,0 +1,60 @@ +-- The BLINKY_PLANT + +local S = minetest.get_translator(minetest.get_current_modname()) + +local toggle_timer = function (pos) + local timer = minetest.get_node_timer(pos) + if timer:is_started() then + timer:stop() + else + timer:start(mesecon.setting("blinky_plant_interval", 3)) + end +end + +local on_timer = function (pos) + local node = minetest.get_node(pos) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) + end + toggle_timer(pos) +end + +mesecon.register_node("mesecons_blinkyplant:blinky_plant", { + description= S("Blinky Plant"), + drawtype = "plantlike", + inventory_image = "jeija_blinky_plant_off.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + sounds = mesecon.node_sound.leaves, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, + }, + on_timer = on_timer, + on_rightclick = function(pos, _, clicker) + if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then + return + end + + toggle_timer(pos) + end, + on_construct = toggle_timer +},{ + tiles = {"jeija_blinky_plant_off.png"}, + groups = {dig_immediate=3}, + mesecons = {receptor = { state = mesecon.state.off }} +},{ + tiles = {"jeija_blinky_plant_on.png"}, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + mesecons = {receptor = { state = mesecon.state.on }} +}) + +minetest.register_craft({ + output = "mesecons_blinkyplant:blinky_plant_off 1", + recipe = { {"","group:mesecon_conductor_craftable",""}, + {"","group:mesecon_conductor_craftable",""}, + {"group:sapling","group:sapling","group:sapling"}} +}) diff --git a/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.de.tr b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.de.tr new file mode 100644 index 00000000..1f1e3eb0 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_blinkyplant +Blinky Plant=Blinkpflanze diff --git a/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.eo.tr b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.eo.tr new file mode 100644 index 00000000..db628ba5 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_blinkyplant + +### init.lua ### +Blinky Plant=Palpebruma Planto diff --git a/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.fr.tr b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.fr.tr new file mode 100644 index 00000000..410d7448 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_blinkyplant + +### init.lua ### +Blinky Plant=Plante clignotante diff --git a/mods/mesecons/mesecons_blinkyplant/locale/template.txt b/mods/mesecons/mesecons_blinkyplant/locale/template.txt new file mode 100644 index 00000000..e2f5e443 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_blinkyplant + +### init.lua ### +Blinky Plant= diff --git a/mods/mesecons/mesecons_blinkyplant/mod.conf b/mods/mesecons/mesecons_blinkyplant/mod.conf new file mode 100644 index 00000000..3f234489 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_blinkyplant +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png new file mode 100644 index 00000000..a8c22fc4 Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png differ diff --git a/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png new file mode 100644 index 00000000..3ac576db Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png differ diff --git a/mods/mesecons/mesecons_button/doc/button/description.html b/mods/mesecons/mesecons_button/doc/button/description.html new file mode 100644 index 00000000..ae6bf07f --- /dev/null +++ b/mods/mesecons/mesecons_button/doc/button/description.html @@ -0,0 +1 @@ +This receptor can be attached to walls. It turns on for 1 second if it's punched. diff --git a/mods/mesecons/mesecons_button/doc/button/preview.png b/mods/mesecons/mesecons_button/doc/button/preview.png new file mode 100644 index 00000000..8c54020a Binary files /dev/null and b/mods/mesecons/mesecons_button/doc/button/preview.png differ diff --git a/mods/mesecons/mesecons_button/doc/button/recipe.png b/mods/mesecons/mesecons_button/doc/button/recipe.png new file mode 100644 index 00000000..67d83cf5 Binary files /dev/null and b/mods/mesecons/mesecons_button/doc/button/recipe.png differ diff --git a/mods/mesecons/mesecons_button/init.lua b/mods/mesecons/mesecons_button/init.lua new file mode 100644 index 00000000..878a6e1e --- /dev/null +++ b/mods/mesecons/mesecons_button/init.lua @@ -0,0 +1,111 @@ +-- WALL BUTTON +-- A button that when pressed emits power for 1 second +-- and then turns off again +local S = minetest.get_translator(minetest.get_current_modname()) + +mesecon.button_turnoff = function (pos) + local node = minetest.get_node(pos) + if node.name ~= "mesecons_button:button_on" then -- has been dug + return + end + minetest.swap_node(pos, {name = "mesecons_button:button_off", param2 = node.param2}) + minetest.sound_play("mesecons_button_pop", { pos = pos }, true) + local rules = mesecon.rules.buttonlike_get(node) + mesecon.receptor_off(pos, rules) +end + +local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil + +minetest.register_node("mesecons_button:button_off", { + drawtype = "nodebox", + tiles = { + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_off.png" + }, + use_texture_alpha = use_texture_alpha, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + legacy_wallmounted = true, + walkable = false, + on_rotate = mesecon.buttonlike_onrotate, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = { + { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button + { -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself + } + }, + groups = {dig_immediate=2, mesecon_needs_receiver = 1}, + description = S("Button"), + on_rightclick = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2}) + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + minetest.sound_play("mesecons_button_push", { pos = pos }, true) + minetest.get_node_timer(pos):start(1) + end, + sounds = mesecon.node_sound.stone, + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.buttonlike_get + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_button:button_on", { + drawtype = "nodebox", + tiles = { + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_on.png" + }, + use_texture_alpha = use_texture_alpha, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + legacy_wallmounted = true, + walkable = false, + on_rotate = false, + light_source = minetest.LIGHT_MAX-7, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = { + { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, + { -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 } + } + }, + groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon_needs_receiver = 1}, + drop = 'mesecons_button:button_off', + description = S("Button"), + sounds = mesecon.node_sound.stone, + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.buttonlike_get + }}, + on_timer = mesecon.button_turnoff, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = "mesecons_button:button_off 2", + recipe = { + {"group:mesecon_conductor_craftable","mesecons_gamecompat:stone"}, + } +}) diff --git a/mods/mesecons/mesecons_button/locale/mesecons_button.de.tr b/mods/mesecons/mesecons_button/locale/mesecons_button.de.tr new file mode 100644 index 00000000..18811773 --- /dev/null +++ b/mods/mesecons/mesecons_button/locale/mesecons_button.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_button +Button=Taster diff --git a/mods/mesecons/mesecons_button/locale/mesecons_button.eo.tr b/mods/mesecons/mesecons_button/locale/mesecons_button.eo.tr new file mode 100644 index 00000000..463f65bf --- /dev/null +++ b/mods/mesecons/mesecons_button/locale/mesecons_button.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_button + +### init.lua ### +Button=Butono diff --git a/mods/mesecons/mesecons_button/locale/mesecons_button.fr.tr b/mods/mesecons/mesecons_button/locale/mesecons_button.fr.tr new file mode 100644 index 00000000..9ef7de50 --- /dev/null +++ b/mods/mesecons/mesecons_button/locale/mesecons_button.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_button + +### init.lua ### +Button=Bouton diff --git a/mods/mesecons/mesecons_button/locale/template.txt b/mods/mesecons/mesecons_button/locale/template.txt new file mode 100644 index 00000000..2a4d5b9a --- /dev/null +++ b/mods/mesecons/mesecons_button/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_button + +### init.lua ### +Button= diff --git a/mods/mesecons/mesecons_button/mod.conf b/mods/mesecons/mesecons_button/mod.conf new file mode 100644 index 00000000..cf67a2e9 --- /dev/null +++ b/mods/mesecons/mesecons_button/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_button +depends = mesecons, mesecons_gamecompat, mesecons_receiver diff --git a/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg b/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg new file mode 100644 index 00000000..9d56bb8c Binary files /dev/null and b/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg differ diff --git a/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg b/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg new file mode 100644 index 00000000..53d45c18 Binary files /dev/null and b/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png new file mode 100644 index 00000000..d55f7c0a Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png new file mode 100644 index 00000000..2286f539 Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png new file mode 100644 index 00000000..59c72404 Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png differ diff --git a/mods/mesecons/mesecons_commandblock/doc/commandblock/description.html b/mods/mesecons/mesecons_commandblock/doc/commandblock/description.html new file mode 100644 index 00000000..9ba7ce58 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/doc/commandblock/description.html @@ -0,0 +1,2 @@ +There is no crafting recipe as this should only be available for server admins. Quite similar to the Minecraft counterpart. Executes server commands. +It works in inactive blocks. diff --git a/mods/mesecons/mesecons_commandblock/doc/commandblock/preview.png b/mods/mesecons/mesecons_commandblock/doc/commandblock/preview.png new file mode 100644 index 00000000..50e2cc76 Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/doc/commandblock/preview.png differ diff --git a/mods/mesecons/mesecons_commandblock/init.lua b/mods/mesecons/mesecons_commandblock/init.lua new file mode 100644 index 00000000..fd1c7d22 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/init.lua @@ -0,0 +1,216 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_chatcommand("say", { + params = "", + description = S("Say as the server"), + privs = {server=true}, + func = function(name, param) + minetest.chat_send_all(name .. ": " .. param) + end +}) + +minetest.register_chatcommand("tell", { + params = " ", + description = S("Say to privately"), + privs = {shout=true}, + func = function(name, param) + local found, _, target, message = param:find("^([^%s]+)%s+(.*)$") + if found == nil then + minetest.chat_send_player(name, "Invalid usage: " .. param) + return + end + if not minetest.get_player_by_name(target) then + minetest.chat_send_player(name, "Invalid target: " .. target) + end + minetest.chat_send_player(target, name .. " whispers: " .. message, false) + end +}) + +minetest.register_chatcommand("hp", { + params = " ", + description = S("Set health of to hitpoints"), + privs = {ban=true}, + func = function(name, param) + local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$") + if found == nil then + minetest.chat_send_player(name, "Invalid usage: " .. param) + return + end + local player = minetest.get_player_by_name(target) + if player then + player:set_hp(value) + else + minetest.chat_send_player(name, "Invalid target: " .. target) + end + end +}) + +local function initialize_data(meta) + local commands = minetest.formspec_escape(meta:get_string("commands")) + meta:set_string("formspec", + "size[9,5]" .. + "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. + "label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" .. + "button_exit[3.3,4.5;2,1;submit;Submit]") + local owner = meta:get_string("owner") + if owner == "" then + owner = "not owned" + else + owner = "owned by " .. owner + end + meta:set_string("infotext", "Command Block\n" .. + "(" .. owner .. ")\n" .. + "Commands: "..commands) +end + +local function construct(pos) + local meta = minetest.get_meta(pos) + + meta:set_string("commands", "tell @nearest Commandblock unconfigured") + + meta:set_string("owner", "") + + initialize_data(meta) +end + +local function after_place(pos, placer) + if placer then + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + initialize_data(meta) + end +end + +local function receive_fields(pos, _, fields, sender) + if not fields.submit then + return + end + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= "" and sender:get_player_name() ~= owner then + return + end + meta:set_string("commands", fields.commands) + + initialize_data(meta) +end + +local function resolve_commands(commands, pos) + local players = minetest.get_connected_players() + + -- No players online: remove all commands containing + -- @nearest, @farthest and @random + if #players == 0 then + commands = commands:gsub("[^\r\n]+", function (line) + if line:find("@nearest") then return "" end + if line:find("@farthest") then return "" end + if line:find("@random") then return "" end + return line + end) + return commands + end + + local nearest, farthest = nil, nil + local min_distance, max_distance = math.huge, -1 + for index, player in pairs(players) do + local distance = vector.distance(pos, player:get_pos()) + if distance < min_distance then + min_distance = distance + nearest = player:get_player_name() + end + if distance > max_distance then + max_distance = distance + farthest = player:get_player_name() + end + end + local random = players[math.random(#players)]:get_player_name() + commands = commands:gsub("@nearest", nearest) + commands = commands:gsub("@farthest", farthest) + commands = commands:gsub("@random", random) + return commands +end + +local function commandblock_action_on(pos, node) + if node.name ~= "mesecons_commandblock:commandblock_off" then + return + end + + minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"}) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner == "" then + return + end + + local commands = resolve_commands(meta:get_string("commands"), pos) + for _, command in pairs(commands:split("\n")) do + local pos = command:find(" ") + local cmd, param = command, "" + if pos then + cmd = command:sub(1, pos - 1) + param = command:sub(pos + 1) + end + local cmddef = minetest.chatcommands[cmd] + if not cmddef then + minetest.chat_send_player(owner, "The command "..cmd.." does not exist") + return + end + local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs) + if not has_privs then + minetest.chat_send_player(owner, "You don't have permission " + .."to run "..cmd + .." (missing privileges: " + ..table.concat(missing_privs, ", ")..")") + return + end + cmddef.func(owner, param) + end +end + +local function commandblock_action_off(pos, node) + if node.name == "mesecons_commandblock:commandblock_on" then + minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_off"}) + end +end + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + return owner == "" or owner == player:get_player_name() or + minetest.check_player_privs(player, "protection_bypass") +end + +minetest.register_node("mesecons_commandblock:commandblock_off", { + description = S("Command Block"), + tiles = {"jeija_commandblock_off.png"}, + inventory_image = minetest.inventorycube("jeija_commandblock_off.png"), + is_ground_content = false, + groups = {cracky=2, mesecon_effector_off=1}, + on_construct = construct, + after_place_node = after_place, + on_receive_fields = receive_fields, + can_dig = can_dig, + sounds = mesecon.node_sound.stone, + mesecons = {effector = { + action_on = commandblock_action_on + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_commandblock:commandblock_on", { + tiles = {"jeija_commandblock_on.png"}, + is_ground_content = false, + groups = {cracky=2, mesecon_effector_on=1, not_in_creative_inventory=1}, + light_source = 10, + drop = "mesecons_commandblock:commandblock_off", + on_construct = construct, + after_place_node = after_place, + on_receive_fields = receive_fields, + can_dig = can_dig, + sounds = mesecon.node_sound.stone, + mesecons = {effector = { + action_off = commandblock_action_off + }}, + on_blast = mesecon.on_blastnode, +}) diff --git a/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.de.tr new file mode 100644 index 00000000..592e7e51 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_commandblock +Say as the server= als Server sagen +Say to privately= an privat senden +Set health of to hitpoints=Gesundheit von auf Trefferpunkte setzen +Command Block=Befehlsblock diff --git a/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.eo.tr b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.eo.tr new file mode 100644 index 00000000..3a9f0775 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.eo.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_commandblock + +### init.lua ### +Say as the server=Diru kiel la servilo +Say to privately=Diru al private +Set health of to hitpoints=Agordu sanon de al +Command Block=Komando-Bloko diff --git a/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.fr.tr b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.fr.tr new file mode 100644 index 00000000..fa97d767 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_commandblock + +### init.lua ### +Say as the server=Dire au serveur +Say to privately=Dire à en privé +Set health of to hitpoints=Définir la vie de sur cœurs +Command Block=Bloc de commandes diff --git a/mods/mesecons/mesecons_commandblock/locale/template.txt b/mods/mesecons/mesecons_commandblock/locale/template.txt new file mode 100644 index 00000000..1fdd37c3 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mesecons_commandblock + +### init.lua ### +Say as the server= +Say to privately= +Set health of to hitpoints= +Command Block= diff --git a/mods/mesecons/mesecons_commandblock/mod.conf b/mods/mesecons/mesecons_commandblock/mod.conf new file mode 100644 index 00000000..68cdc9ea --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_commandblock +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png new file mode 100644 index 00000000..1d989d9b Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png differ diff --git a/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png new file mode 100644 index 00000000..555f8a3d Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png differ diff --git a/mods/mesecons/mesecons_delayer/doc/delayer/description.html b/mods/mesecons/mesecons_delayer/doc/delayer/description.html new file mode 100644 index 00000000..966d7292 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/doc/delayer/description.html @@ -0,0 +1 @@ +The delayer delays the signal from the input for a determined time. The time can be set by punching the delayer. Possible delays are: 0.1 seconds, 0.3 seconds, 0.5 seconds and 1 second. You may try to use it for creating songs with the noteblock. It works in unloaded blocks. diff --git a/mods/mesecons/mesecons_delayer/doc/delayer/preview.png b/mods/mesecons/mesecons_delayer/doc/delayer/preview.png new file mode 100644 index 00000000..d1909008 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/doc/delayer/preview.png differ diff --git a/mods/mesecons/mesecons_delayer/doc/delayer/recipe.png b/mods/mesecons/mesecons_delayer/doc/delayer/recipe.png new file mode 100644 index 00000000..3713b39a Binary files /dev/null and b/mods/mesecons/mesecons_delayer/doc/delayer/recipe.png differ diff --git a/mods/mesecons/mesecons_delayer/init.lua b/mods/mesecons/mesecons_delayer/init.lua new file mode 100644 index 00000000..ab0063e2 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/init.lua @@ -0,0 +1,159 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Function that get the input/output rules of the delayer +local delayer_get_output_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}}) + +local delayer_get_input_rules = mesecon.horiz_rules_getter({{x = -1, y = 0, z = 0}}) + +-- Functions that are called after the delay time + +local delayer_activate = function(pos, node) + local def = minetest.registered_nodes[node.name] + local time = def.delayer_time + minetest.swap_node(pos, {name = def.delayer_onstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(node)}, time, nil) +end + +local delayer_deactivate = function(pos, node) + local def = minetest.registered_nodes[node.name] + local time = def.delayer_time + minetest.swap_node(pos, {name = def.delayer_offstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_off", {delayer_get_output_rules(node)}, time, nil) +end + +-- Register the 2 (states) x 4 (delay times) delayers + +local delaytime = { 0.1, 0.3, 0.5, 1.0 } + +for i = 1, 4 do + +-- Delayer definition defaults +local def = { + drawtype = "nodebox", + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil, + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + { -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 } + }, + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + delayer_time = delaytime[i], + sounds = mesecon.node_sound.stone, + on_blast = mesecon.on_blastnode, + drop = "mesecons_delayer:delayer_off_1", + delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i), + delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i), +} + +-- Deactivated delayer definition defaults +local off_groups = {bendy=2,snappy=1,dig_immediate=2} +if i > 1 then + off_groups.not_in_creative_inventory = 1 +end + +local off_state = { + description = S("Delayer"), + inventory_image = "jeija_gate_off.png^jeija_delayer.png", + wield_image = "jeija_gate_off.png^jeija_delayer.png", + tiles = { + "jeija_microcontroller_bottom.png^jeija_gate_output_off.png^jeija_gate_off.png^".. + "jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png", + "jeija_microcontroller_bottom.png^jeija_gate_output_off.png", + "jeija_gate_side.png^jeija_gate_side_output_off.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + }, + groups = off_groups, + on_punch = function(pos, node, puncher) + if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then + return + end + + minetest.swap_node(pos, { + name = "mesecons_delayer:delayer_off_"..tostring(i % 4 + 1), + param2 = node.param2 + }) + end, + mesecons = { + receptor = + { + state = mesecon.state.off, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + action_off = delayer_deactivate, + action_on = delayer_activate + } + }, +} +for k, v in pairs(def) do + off_state[k] = off_state[k] or v +end +minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), off_state) + +-- Activated delayer definition defaults +local on_state = { + description = S("You hacker you"), + inventory_image = "jeija_gate_on.png^jeija_delayer.png", + wield_image = "jeija_gate_on.png^jeija_delayer.png", + tiles = { + "jeija_microcontroller_bottom.png^jeija_gate_output_on.png^jeija_gate_on.png^".. + "jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png", + "jeija_microcontroller_bottom.png^jeija_gate_output_on.png", + "jeija_gate_side.png^jeija_gate_side_output_on.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + }, + groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, + on_punch = function(pos, node, puncher) + if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then + return + end + + minetest.swap_node(pos, { + name = "mesecons_delayer:delayer_on_"..tostring(i % 4 + 1), + param2 = node.param2 + }) + end, + mesecons = { + receptor = + { + state = mesecon.state.on, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + action_off = delayer_deactivate, + action_on = delayer_activate + } + }, +} +for k, v in pairs(def) do + on_state[k] = on_state[k] or v +end +minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), on_state) + +end + +minetest.register_craft({ + output = "mesecons_delayer:delayer_off_1", + recipe = { + {"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"}, + {"mesecons_gamecompat:cobble","mesecons_gamecompat:cobble", "mesecons_gamecompat:cobble"}, + } +}) diff --git a/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.de.tr b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.de.tr new file mode 100644 index 00000000..15db723c --- /dev/null +++ b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_delayer +Delayer=Verzögerer +You hacker you=Du Hacker, Du diff --git a/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.eo.tr b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.eo.tr new file mode 100644 index 00000000..f6d43501 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.eo.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_delayer + +### init.lua ### +Delayer=Prokrasto +You hacker you=Vi hakisto diff --git a/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.fr.tr b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.fr.tr new file mode 100644 index 00000000..c4ff30eb --- /dev/null +++ b/mods/mesecons/mesecons_delayer/locale/mesecons_delayer.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_delayer + +### init.lua ### +Delayer=Retardateur +You hacker you=Vous êtes un pirate informatique diff --git a/mods/mesecons/mesecons_delayer/locale/template.txt b/mods/mesecons/mesecons_delayer/locale/template.txt new file mode 100644 index 00000000..e5e06f27 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_delayer + +### init.lua ### +Delayer= +You hacker you= diff --git a/mods/mesecons/mesecons_delayer/mod.conf b/mods/mesecons/mesecons_delayer/mod.conf new file mode 100644 index 00000000..33a2ef58 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_delayer +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_delayer.png b/mods/mesecons/mesecons_delayer/textures/jeija_delayer.png new file mode 100644 index 00000000..e33fe12f Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_delayer.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_off.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_off.png new file mode 100644 index 00000000..2f77aeb1 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_off.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_on.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_on.png new file mode 100644 index 00000000..406e4f6e Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_on.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_off.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_off.png new file mode 100644 index 00000000..bee3942d Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_off.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_on.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_on.png new file mode 100644 index 00000000..b3b6d217 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_output_on.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_side.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side.png new file mode 100644 index 00000000..1223b54d Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_off.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_off.png new file mode 100644 index 00000000..785e7c6b Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_off.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_on.png b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_on.png new file mode 100644 index 00000000..0aaa4a5d Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_on.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_1.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_1.png new file mode 100644 index 00000000..973d6849 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_1.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_2.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_2.png new file mode 100644 index 00000000..a5f0b9f3 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_2.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_3.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_3.png new file mode 100644 index 00000000..c8bf24e5 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_3.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_4.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_4.png new file mode 100644 index 00000000..74a59127 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_4.png differ diff --git a/mods/mesecons/mesecons_detector/doc/nodedetector/description.html b/mods/mesecons/mesecons_detector/doc/nodedetector/description.html new file mode 100644 index 00000000..4c62359b --- /dev/null +++ b/mods/mesecons/mesecons_detector/doc/nodedetector/description.html @@ -0,0 +1,11 @@ +The node detector is a receptor. It changes its state when either any node +or a specific node is detected. Right-click it to set a nodename to scan for. +It can also receive digiline signals. For example, you can send +{distance=4, scanname="default:dirt"} +to set distance to 4 and scan for dirt. You can omit either parameter. +There is also a command parameter: {command="get"} will respond +with the detected nodename and {command="scan"} will respond with +a boolean using the distance and nodename of the detector. +Nodenames must include the mod they reside in, so for instance default:dirt, not just dirt. +The distance parameter specifies how many blocks are between the node detector and the node to detect. +Automatic scanning with Mesecons output only works when the detector is in an active block, but Digilines queries always work. diff --git a/mods/mesecons/mesecons_detector/doc/nodedetector/preview.png b/mods/mesecons/mesecons_detector/doc/nodedetector/preview.png new file mode 100644 index 00000000..759a9fa9 Binary files /dev/null and b/mods/mesecons/mesecons_detector/doc/nodedetector/preview.png differ diff --git a/mods/mesecons/mesecons_detector/doc/nodedetector/recipe.png b/mods/mesecons/mesecons_detector/doc/nodedetector/recipe.png new file mode 100644 index 00000000..13ab5703 Binary files /dev/null and b/mods/mesecons/mesecons_detector/doc/nodedetector/recipe.png differ diff --git a/mods/mesecons/mesecons_detector/doc/objectdetector/description.html b/mods/mesecons/mesecons_detector/doc/objectdetector/description.html new file mode 100644 index 00000000..a9284346 --- /dev/null +++ b/mods/mesecons/mesecons_detector/doc/objectdetector/description.html @@ -0,0 +1,5 @@ +The object detector is a receptor. It changes its state when a player approaches. +Right-click it to set a name to scan for. +You can also search for comma-separated lists of players where the detector gets activated if any of the names in the list are found. +It can also receive digiline signals which are the name to scan for on the specified channel in the right-click menu. +Automatic scanning with Mesecons output only works when the detector is in an active block, but Digilines queries always work. diff --git a/mods/mesecons/mesecons_detector/doc/objectdetector/preview.png b/mods/mesecons/mesecons_detector/doc/objectdetector/preview.png new file mode 100644 index 00000000..edee1109 Binary files /dev/null and b/mods/mesecons/mesecons_detector/doc/objectdetector/preview.png differ diff --git a/mods/mesecons/mesecons_detector/doc/objectdetector/recipe.png b/mods/mesecons/mesecons_detector/doc/objectdetector/recipe.png new file mode 100644 index 00000000..0081b360 Binary files /dev/null and b/mods/mesecons/mesecons_detector/doc/objectdetector/recipe.png differ diff --git a/mods/mesecons/mesecons_detector/init.lua b/mods/mesecons/mesecons_detector/init.lua new file mode 100644 index 00000000..2653174c --- /dev/null +++ b/mods/mesecons/mesecons_detector/init.lua @@ -0,0 +1,332 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local side_texture = mesecon.texture.steel_block or "mesecons_detector_side.png" + +local GET_COMMAND = "GET" + + +local function comma_list_to_table(comma_list) + local tbl = {} + for _, str in ipairs(string.split(comma_list:gsub("%s", ""), ",")) do + tbl[str] = true + end + return tbl +end + + +-- Object detector +-- Detects players in a certain radius +-- The radius can be specified in mesecons/settings.lua + +local function object_detector_make_formspec(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "size[9,2.5]" .. + "field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]".. + "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. + "button_exit[7,0.75;2,3;;Save]") +end + +local function object_detector_on_receive_fields(pos, _, fields, sender) + if not fields.scanname or not fields.digiline_channel then return end + + if minetest.is_protected(pos, sender:get_player_name()) then return end + + local meta = minetest.get_meta(pos) + meta:set_string("scanname", fields.scanname) + meta:set_string("digiline_channel", fields.digiline_channel) + object_detector_make_formspec(pos) +end + +-- returns true if player was found, false if not +local function object_detector_scan(pos) + local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6)) + + -- abort if no scan results were found + if next(objs) == nil then return false end + + local scanname = minetest.get_meta(pos):get_string("scanname") + local scan_for = comma_list_to_table(scanname) + + local every_player = scanname == "" + for _, obj in pairs(objs) do + -- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= "" + local foundname = obj:get_player_name() + if foundname ~= "" then + if every_player or scan_for[foundname] then + return true + end + end + end + + return false +end + +-- set player name when receiving a digiline signal on a specific channel +local object_detector_digiline = { + effector = { + action = function(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + if channel == meta:get_string("digiline_channel") and + (type(msg) == "string" or type(msg) == "number") then + meta:set_string("scanname", msg) + object_detector_make_formspec(pos) + end + end, + } +} + +minetest.register_node("mesecons_detector:object_detector_off", { + tiles = {side_texture, side_texture, "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"}, + paramtype = "light", + is_ground_content = false, + walkable = true, + groups = {cracky=3}, + description= S("Player Detector"), + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.pplate + }}, + on_construct = object_detector_make_formspec, + on_receive_fields = object_detector_on_receive_fields, + sounds = mesecon.node_sound.stone, + digiline = object_detector_digiline, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_detector:object_detector_on", { + tiles = {side_texture, side_texture, "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"}, + paramtype = "light", + is_ground_content = false, + walkable = true, + groups = {cracky=3,not_in_creative_inventory=1}, + drop = 'mesecons_detector:object_detector_off', + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.pplate + }}, + on_construct = object_detector_make_formspec, + on_receive_fields = object_detector_on_receive_fields, + sounds = mesecon.node_sound.stone, + digiline = object_detector_digiline, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = 'mesecons_detector:object_detector_off', + recipe = { + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_luacontroller:luacontroller0000", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = 'mesecons_detector:object_detector_off', + recipe = { + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_microcontroller:microcontroller0000", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"}, + } +}) + +minetest.register_abm({ + nodenames = {"mesecons_detector:object_detector_off"}, + interval = 1, + chance = 1, + action = function(pos, node) + if not object_detector_scan(pos) then return end + + node.name = "mesecons_detector:object_detector_on" + minetest.swap_node(pos, node) + mesecon.receptor_on(pos, mesecon.rules.pplate) + end, +}) + +minetest.register_abm({ + nodenames = {"mesecons_detector:object_detector_on"}, + interval = 1, + chance = 1, + action = function(pos, node) + if object_detector_scan(pos) then return end + + node.name = "mesecons_detector:object_detector_off" + minetest.swap_node(pos, node) + mesecon.receptor_off(pos, mesecon.rules.pplate) + end, +}) + +-- Node detector +-- Detects the node in front of it + +local function node_detector_make_formspec(pos) + local meta = minetest.get_meta(pos) + if meta:get_string("distance") == "" then meta:set_string("distance", "0") end + meta:set_string("formspec", "size[9,2.5]" .. + "field[0.3, 0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]".. + "field[0.3,1.5;2.5,2;distance;Distance (0-"..mesecon.setting("node_detector_distance_max", 10).."):;${distance}]".. + "field[3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. + "button_exit[7,0.75;2,3;;Save]") +end + +local function node_detector_on_receive_fields(pos, _, fields, sender) + if not fields.scanname or not fields.digiline_channel then return end + + if minetest.is_protected(pos, sender:get_player_name()) then return end + + local meta = minetest.get_meta(pos) + meta:set_string("scanname", fields.scanname) + meta:set_string("distance", fields.distance or "0") + meta:set_string("digiline_channel", fields.digiline_channel) + node_detector_make_formspec(pos) +end + +-- returns true if node was found, false if not +local function node_detector_scan(pos) + local node = minetest.get_node_or_nil(pos) + if not node then return end + + local meta = minetest.get_meta(pos) + + local distance = meta:get_int("distance") + local distance_max = mesecon.setting("node_detector_distance_max", 10) + if distance < 0 then distance = 0 end + if distance > distance_max then distance = distance_max end + + local frontname = minetest.get_node( + vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1)) + ).name + local scanname = meta:get_string("scanname") + local scan_for = comma_list_to_table(scanname) + + return (scan_for[frontname]) or + (frontname ~= "air" and frontname ~= "ignore" and scanname == "") +end + +local function node_detector_send_node_name(pos, node, channel, meta) + local distance = meta:get_int("distance") + local distance_max = mesecon.setting("node_detector_distance_max", 10) + if distance < 0 then distance = 0 end + if distance > distance_max then distance = distance_max end + local nodename = minetest.get_node( + vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1)) + ).name + + digiline:receptor_send(pos, digiline.rules.default, channel, nodename) +end + +-- set player name when receiving a digiline signal on a specific channel +local node_detector_digiline = { + effector = { + action = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + + if channel ~= meta:get_string("digiline_channel") then return end + + if type(msg) == "table" then + if msg.distance or msg.scanname then + if type(msg.distance) == "number" or type(msg.distance) == "string" then + meta:set_string("distance", msg.distance) + end + if type(msg.scanname) == "string" then + meta:set_string("scanname", msg.scanname) + end + node_detector_make_formspec(pos) + end + if msg.command == "get" then + node_detector_send_node_name(pos, node, channel, meta) + elseif msg.command == "scan" then + local result = node_detector_scan(pos) + digiline:receptor_send(pos, digiline.rules.default, channel, result) + end + else + if msg == GET_COMMAND then + node_detector_send_node_name(pos, node, channel, meta) + elseif type(msg) == "string" then + meta:set_string("scanname", msg) + node_detector_make_formspec(pos) + end + end + end, + }, + receptor = {} +} + +minetest.register_node("mesecons_detector:node_detector_off", { + tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_off.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = true, + groups = {cracky=3}, + description = S("Node Detector"), + mesecons = {receptor = { + state = mesecon.state.off + }}, + on_construct = node_detector_make_formspec, + on_receive_fields = node_detector_on_receive_fields, + sounds = mesecon.node_sound.stone, + digiline = node_detector_digiline, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_detector:node_detector_on", { + tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_on.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = true, + groups = {cracky=3,not_in_creative_inventory=1}, + drop = 'mesecons_detector:node_detector_off', + mesecons = {receptor = { + state = mesecon.state.on + }}, + on_construct = node_detector_make_formspec, + on_receive_fields = node_detector_on_receive_fields, + sounds = mesecon.node_sound.stone, + digiline = node_detector_digiline, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = 'mesecons_detector:node_detector_off', + recipe = { + {"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_luacontroller:luacontroller0000", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = 'mesecons_detector:node_detector_off', + recipe = { + {"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_microcontroller:microcontroller0000", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"}, + } +}) + +minetest.register_abm({ + nodenames = {"mesecons_detector:node_detector_off"}, + interval = 1, + chance = 1, + action = function(pos, node) + if not node_detector_scan(pos) then return end + + node.name = "mesecons_detector:node_detector_on" + minetest.swap_node(pos, node) + mesecon.receptor_on(pos) + end, +}) + +minetest.register_abm({ + nodenames = {"mesecons_detector:node_detector_on"}, + interval = 1, + chance = 1, + action = function(pos, node) + if node_detector_scan(pos) then return end + + node.name = "mesecons_detector:node_detector_off" + minetest.swap_node(pos, node) + mesecon.receptor_off(pos) + end, +}) diff --git a/mods/mesecons/mesecons_detector/locale/mesecons_detector.de.tr b/mods/mesecons/mesecons_detector/locale/mesecons_detector.de.tr new file mode 100644 index 00000000..d58625e8 --- /dev/null +++ b/mods/mesecons/mesecons_detector/locale/mesecons_detector.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_detector +Player Detector=Spielerdetektor +Node Detector=Blockdetektor diff --git a/mods/mesecons/mesecons_detector/locale/mesecons_detector.eo.tr b/mods/mesecons/mesecons_detector/locale/mesecons_detector.eo.tr new file mode 100644 index 00000000..0db21e2a --- /dev/null +++ b/mods/mesecons/mesecons_detector/locale/mesecons_detector.eo.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_detector + +### init.lua ### +Player Detector=Ludanta Detektilo +Node Detector=Noda Detektilo diff --git a/mods/mesecons/mesecons_detector/locale/mesecons_detector.fr.tr b/mods/mesecons/mesecons_detector/locale/mesecons_detector.fr.tr new file mode 100644 index 00000000..dadfa903 --- /dev/null +++ b/mods/mesecons/mesecons_detector/locale/mesecons_detector.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_detector + +### init.lua ### +Player Detector=Détecteur de joueur +Node Detector=Détecteur de bloc diff --git a/mods/mesecons/mesecons_detector/locale/template.txt b/mods/mesecons/mesecons_detector/locale/template.txt new file mode 100644 index 00000000..1a8a6a78 --- /dev/null +++ b/mods/mesecons/mesecons_detector/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_detector + +### init.lua ### +Player Detector= +Node Detector= diff --git a/mods/mesecons/mesecons_detector/mod.conf b/mods/mesecons/mesecons_detector/mod.conf new file mode 100644 index 00000000..6d5a0e6d --- /dev/null +++ b/mods/mesecons/mesecons_detector/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_detector +depends = mesecons, mesecons_gamecompat, mesecons_materials diff --git a/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png new file mode 100644 index 00000000..bfd7b214 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png new file mode 100644 index 00000000..69305ea3 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png new file mode 100644 index 00000000..104a12b0 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png new file mode 100644 index 00000000..ccbdccbc Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png differ diff --git a/mods/mesecons/mesecons_detector/textures/mesecons_detector_side.png b/mods/mesecons/mesecons_detector/textures/mesecons_detector_side.png new file mode 100644 index 00000000..5e421f02 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/mesecons_detector_side.png differ diff --git a/mods/mesecons/mesecons_doors/init.lua b/mods/mesecons/mesecons_doors/init.lua new file mode 100644 index 00000000..8b6b33cb --- /dev/null +++ b/mods/mesecons/mesecons_doors/init.lua @@ -0,0 +1,145 @@ +-- Modified, from minetest_game/mods/doors/init.lua +local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) + pos.y = pos.y + dir + if minetest.get_node(pos).name ~= check_name then + return + end + local p2 = minetest.get_node(pos).param2 + p2 = params[p2 + 1] + + minetest.swap_node(pos, {name = replace_dir, param2 = p2}) + + pos.y = pos.y - dir + minetest.swap_node(pos, {name = replace, param2 = p2}) + + if (minetest.get_meta(pos):get_int("right") ~= 0) == (params[1] ~= 3) then + minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) + else + minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) + end +end + +local function meseconify_door(name) + if minetest.registered_items[name .. "_b_1"] then + -- old style double-node doors + if minetest.registered_items[name .. "_b_1"].mesecons then + minetest.log("info", "[mesecons_doors] Not touching door " .. name) + return + end + + local function toggle_state1 (pos) + on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + end + + local function toggle_state2 (pos) + on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + end + + minetest.override_item(name.."_b_1", { + mesecons = {effector = { + action_on = toggle_state1, + action_off = toggle_state1, + rules = mesecon.rules.pplate + }} + }) + + minetest.override_item(name.."_b_2", { + mesecons = {effector = { + action_on = toggle_state2, + action_off = toggle_state2, + rules = mesecon.rules.pplate + }} + }) + elseif minetest.registered_items[name .. "_a"] then + -- new style mesh node based doors + if minetest.registered_items[name .. "_a"].mesecons then + minetest.log("info", "[mesecons_doors] Not touching door " .. name) + return + end + local override = { + mesecons = {effector = { + action_on = function(pos) + local door = doors.get(pos) + if door then + door:open() + end + end, + action_off = function(pos) + local door = doors.get(pos) + if door then + door:close() + end + end, + rules = mesecon.rules.pplate + }} + } + minetest.override_item(name .. "_a", override) + minetest.override_item(name .. "_b", override) + if minetest.registered_items[name .. "_c"] then + minetest.override_item(name .. "_c", override) + minetest.override_item(name .. "_d", override) + end + end +end + +-- Trapdoor +local function trapdoor_switch(name) + return function(pos, node) + local state = minetest.get_meta(pos):get_int("state") + if state == 1 then + minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) + minetest.set_node(pos, {name=name, param2 = node.param2}) + else + minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) + minetest.set_node(pos, {name=name.."_open", param2 = node.param2}) + end + minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1) + end +end + +local function meseconify_trapdoor(name) + local override + if doors and doors.get then + override = { + mesecons = {effector = { + action_on = function(pos) + local door = doors.get(pos) + if door then + door:open() + end + end, + action_off = function(pos) + local door = doors.get(pos) + if door then + door:close() + end + end, + }}, + } + else + override = { + mesecons = {effector = { + action_on = trapdoor_switch(name), + action_off = trapdoor_switch(name) + }}, + } + end + + if minetest.registered_items[name] then + minetest.override_item(name, override) + minetest.override_item(name.."_open", override) + end +end + +minetest.register_on_mods_loaded(function() + for k,_ in pairs(doors.registered_doors) do + if k:find("_a$") then + meseconify_door(k:sub(1,-3)) + end + end + for k,_ in pairs(doors.registered_trapdoors) do + if not k:find("_open$") then + meseconify_trapdoor(k) + end + end +end) diff --git a/mods/mesecons/mesecons_doors/mod.conf b/mods/mesecons/mesecons_doors/mod.conf new file mode 100644 index 00000000..4daab347 --- /dev/null +++ b/mods/mesecons/mesecons_doors/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_doors +depends = mesecons, doors +optional_depends = xpanes diff --git a/mods/mesecons/mesecons_extrawires/corner.lua b/mods/mesecons/mesecons_extrawires/corner.lua new file mode 100644 index 00000000..6d85b6b0 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/corner.lua @@ -0,0 +1,77 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local corner_selectionbox = { + type = "fixed", + fixed = { -16/32, -16/32, -16/32, 5/32, -12/32, 5/32 }, +} + +local corner_get_rules = mesecon.horiz_rules_getter({ + {x = 0, y = 0, z = -1}, + {x = -1, y = 0, z = 0}, +}) + +minetest.register_node("mesecons_extrawires:corner_on", { + drawtype = "mesh", + mesh = "mesecons_extrawires_corner.obj", + tiles = { + { name = "jeija_insulated_wire_sides_on.png", backface_culling = true }, + { name = "jeija_insulated_wire_ends_on.png", backface_culling = true }, + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = corner_selectionbox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_extrawires:corner_off", + sounds = mesecon.node_sound.default, + mesecons = {conductor = + { + state = mesecon.state.on, + rules = corner_get_rules, + offstate = "mesecons_extrawires:corner_off" + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_node("mesecons_extrawires:corner_off", { + drawtype = "mesh", + description = S("Insulated Mesecon Corner"), + mesh = "mesecons_extrawires_corner.obj", + tiles = { + { name = "jeija_insulated_wire_sides_off.png", backface_culling = true }, + { name = "jeija_insulated_wire_ends_off.png", backface_culling = true }, + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = corner_selectionbox, + groups = {dig_immediate = 3}, + sounds = mesecon.node_sound.default, + mesecons = {conductor = + { + state = mesecon.state.off, + rules = corner_get_rules, + onstate = "mesecons_extrawires:corner_on" + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_craft({ + output = "mesecons_extrawires:corner_off 3", + recipe = { + {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}, + {"", "mesecons_insulated:insulated_off"}, + } +}) + +minetest.register_craft({ + output = "mesecons_insulated:insulated_off", + type = "shapeless", + recipe = {"mesecons_extrawires:corner_off"} +}) diff --git a/mods/mesecons/mesecons_extrawires/crossover.lua b/mods/mesecons/mesecons_extrawires/crossover.lua new file mode 100644 index 00000000..1001467a --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/crossover.lua @@ -0,0 +1,143 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local crossover_rules = { + {--first wire + {x=-1,y=0,z=0}, + {x=1,y=0,z=0}, + }, + {--second wire + {x=0,y=0,z=-1}, + {x=0,y=0,z=1}, + }, +} + +local crossover_states = { + "mesecons_extrawires:crossover_off", + "mesecons_extrawires:crossover_01", + "mesecons_extrawires:crossover_10", + "mesecons_extrawires:crossover_on", +} + +minetest.register_node("mesecons_extrawires:crossover_off", { + description = S("Insulated Mesecon Crossover"), + drawtype = "mesh", + mesh = "mesecons_extrawires_crossover.b3d", + tiles = { + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + is_ground_content = false, + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, + groups = {dig_immediate=3, mesecon=3}, + sounds = mesecon.node_sound.default, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_rules, + } + }, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_extrawires:crossover_01", { + description = S("You hacker you!"), + drop = "mesecons_extrawires:crossover_off", + drawtype = "mesh", + mesh = "mesecons_extrawires_crossover.b3d", + tiles = { + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + is_ground_content = false, + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + sounds = mesecon.node_sound.default, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_rules, + } + }, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_extrawires:crossover_10", { + description = S("You hacker you!"), + drop = "mesecons_extrawires:crossover_off", + drawtype = "mesh", + mesh = "mesecons_extrawires_crossover.b3d", + tiles = { + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + is_ground_content = false, + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + sounds = mesecon.node_sound.default, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_rules, + } + }, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_extrawires:crossover_on", { + description = S("You hacker you!"), + drop = "mesecons_extrawires:crossover_off", + drawtype = "mesh", + mesh = "mesecons_extrawires_crossover.b3d", + tiles = { + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + is_ground_content = false, + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + sounds = mesecon.node_sound.default, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_rules, + } + }, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_extrawires:crossover_off", + recipe = { + "mesecons_insulated:insulated_off", + "mesecons_insulated:insulated_off", + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_insulated:insulated_off 2", + recipe = { + "mesecons_extrawires:crossover_off", + }, +}) diff --git a/mods/mesecons/mesecons_extrawires/doc/corner/description.html b/mods/mesecons/mesecons_extrawires/doc/corner/description.html new file mode 100644 index 00000000..fc420d11 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doc/corner/description.html @@ -0,0 +1 @@ +Insulated corners are conductors that only conduct between the inputs (also not up or down). When placing they always point to the left in direction of your vision. Like uninsulated wires, they work through unloaded blocks. diff --git a/mods/mesecons/mesecons_extrawires/doc/corner/preview.png b/mods/mesecons/mesecons_extrawires/doc/corner/preview.png new file mode 100644 index 00000000..7fbb0dc3 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/corner/preview.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/corner/recipe.png b/mods/mesecons/mesecons_extrawires/doc/corner/recipe.png new file mode 100644 index 00000000..ce6e86ea Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/corner/recipe.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/crossing/description.html b/mods/mesecons/mesecons_extrawires/doc/crossing/description.html new file mode 100644 index 00000000..5f023828 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doc/crossing/description.html @@ -0,0 +1 @@ +Insulated crossing are conductors that conduct two signals between the opposing sides, the signals are insulated to each other. Like uninsulated wires, they work through unloaded blocks. diff --git a/mods/mesecons/mesecons_extrawires/doc/crossing/preview.png b/mods/mesecons/mesecons_extrawires/doc/crossing/preview.png new file mode 100644 index 00000000..b5466a57 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/crossing/preview.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/crossing/recipe.png b/mods/mesecons/mesecons_extrawires/doc/crossing/recipe.png new file mode 100644 index 00000000..6beac96d Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/crossing/recipe.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/mese/description.html b/mods/mesecons/mesecons_extrawires/doc/mese/description.html new file mode 100644 index 00000000..b29e92c2 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doc/mese/description.html @@ -0,0 +1 @@ +The basic prerequesite for mesecons, can be crafted into wires and other stuff. Have a look at the Minetest Wiki for more information. Mese is a conductor. It conducts in all six directions: Up/Down/Left/Right/Forward/Backward. Like horizontal wires, Mese conduction works through unloaded blocks. diff --git a/mods/mesecons/mesecons_extrawires/doc/mese/preview.png b/mods/mesecons/mesecons_extrawires/doc/mese/preview.png new file mode 100644 index 00000000..ed1a1628 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/mese/preview.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/mese/recipe.png b/mods/mesecons/mesecons_extrawires/doc/mese/recipe.png new file mode 100644 index 00000000..e4bb08c1 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/mese/recipe.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/tjunction/description.html b/mods/mesecons/mesecons_extrawires/doc/tjunction/description.html new file mode 100644 index 00000000..647bba6a --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doc/tjunction/description.html @@ -0,0 +1 @@ +Insulated T-Junctions are conductors that only conduct between the inputs (also not up or down). Like uninsulated wires, they work through unloaded blocks. diff --git a/mods/mesecons/mesecons_extrawires/doc/tjunction/preview.png b/mods/mesecons/mesecons_extrawires/doc/tjunction/preview.png new file mode 100644 index 00000000..8407d15b Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/tjunction/preview.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/tjunction/recipe.png b/mods/mesecons/mesecons_extrawires/doc/tjunction/recipe.png new file mode 100644 index 00000000..7358d913 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/tjunction/recipe.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/vertical/description.html b/mods/mesecons/mesecons_extrawires/doc/vertical/description.html new file mode 100644 index 00000000..85085424 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doc/vertical/description.html @@ -0,0 +1 @@ +Vertical Mesecons only conduct up and down. Plates appear at the ends, at that place they also conduct to the side. Like horizontal wires, they work through unloaded blocks. diff --git a/mods/mesecons/mesecons_extrawires/doc/vertical/preview.png b/mods/mesecons/mesecons_extrawires/doc/vertical/preview.png new file mode 100644 index 00000000..eea55714 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/vertical/preview.png differ diff --git a/mods/mesecons/mesecons_extrawires/doc/vertical/recipe.png b/mods/mesecons/mesecons_extrawires/doc/vertical/recipe.png new file mode 100644 index 00000000..b12ccdea Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/doc/vertical/recipe.png differ diff --git a/mods/mesecons/mesecons_extrawires/doublecorner.lua b/mods/mesecons/mesecons_extrawires/doublecorner.lua new file mode 100644 index 00000000..36059e18 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/doublecorner.lua @@ -0,0 +1,78 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local doublecorner_selectionbox = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, +} + +local doublecorner_get_rules = mesecon.horiz_rules_getter({ + { + { x = 1, y = 0, z = 0 }, + { x = 0, y = 0, z = 1 }, + }, + { + { x = -1, y = 0, z = 0 }, + { x = 0, y = 0, z = -1 }, + }, +}) + +local doublecorner_states = { + "mesecons_extrawires:doublecorner_00", + "mesecons_extrawires:doublecorner_01", + "mesecons_extrawires:doublecorner_10", + "mesecons_extrawires:doublecorner_11", +} +local wire1_states = { "off", "off", "on", "on" } +local wire2_states = { "off", "on", "off", "on" } + +for k, state in ipairs(doublecorner_states) do + local w1 = wire1_states[k] + local w2 = wire2_states[k] + local groups = { dig_immediate = 3 } + if k ~= 1 then groups.not_in_creative_inventory = 1 end + minetest.register_node(state, { + drawtype = "mesh", + mesh = "mesecons_extrawires_doublecorner.obj", + description = S("Insulated Mesecon Double Corner"), + tiles = { + { name = "jeija_insulated_wire_sides_" .. w1 .. ".png", backface_culling = true }, + { name = "jeija_insulated_wire_ends_" .. w1 .. ".png", backface_culling = true }, + { name = "jeija_insulated_wire_sides_" .. w2 .. ".png", backface_culling = true }, + { name = "jeija_insulated_wire_ends_" .. w2 .. ".png", backface_culling = true }, + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = doublecorner_selectionbox, + groups = groups, + drop = doublecorner_states[1], + sounds = mesecon.node_sound.default, + mesecons = { + conductor = { + states = doublecorner_states, + rules = doublecorner_get_rules, + }, + }, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, + }) +end + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_extrawires:doublecorner_00", + recipe = { + "mesecons_extrawires:corner_off", + "mesecons_extrawires:corner_off", + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_extrawires:corner_off 2", + recipe = { + "mesecons_extrawires:doublecorner_00", + }, +}) diff --git a/mods/mesecons/mesecons_extrawires/init.lua b/mods/mesecons/mesecons_extrawires/init.lua new file mode 100644 index 00000000..02dc1a6c --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/init.lua @@ -0,0 +1,6 @@ +dofile(minetest.get_modpath("mesecons_extrawires").."/crossover.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/doublecorner.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/mesewire.lua"); diff --git a/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.de.tr b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.de.tr new file mode 100644 index 00000000..5df510e1 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.de.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_extrawires +Insulated Mesecon Corner=Isolierte Meseconecke +Insulated Mesecon Crossover=Isolierter Meseconübergang +You hacker you!=Sie Hacker! +Insulated Mesecon Double Corner=Isolierte Mesecondoppelecke +Mese Wire=Mesedraht +Insulated Mesecon T-junction=Isolierte Mesecongabelung +Vertical Mesecon=Vertikaler Mesecon diff --git a/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.eo.tr b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.eo.tr new file mode 100644 index 00000000..e8d8415c --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.eo.tr @@ -0,0 +1,20 @@ +# textdomain: mesecons_extrawires + +### corner.lua ### +Insulated Mesecon Corner=Izolita Mesekonduktila Angulo + +### crossover.lua ### +Insulated Mesecon Crossover=Izolita Mesekonduktila Interkruciĝo +You hacker you!=Vi hakisto + +### doublecorner.lua ### +Insulated Mesecon Double Corner=Izolita Mesekonduktila Duobla Angulo + +### mesewire.lua ### +Mese Wire=Mesea Drato + +### tjunction.lua ### +Insulated Mesecon T-junction=Izolita Mesekonduktila T-Kruciĝo + +### vertical.lua ### +Vertical Mesecon=Vertikala Mesekonduktilo diff --git a/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.fr.tr b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.fr.tr new file mode 100644 index 00000000..46992a6f --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.fr.tr @@ -0,0 +1,20 @@ +# textdomain: mesecons_extrawires + +### corner.lua ### +Insulated Mesecon Corner=Coin de Mesecon isolé + +### crossover.lua ### +Insulated Mesecon Crossover=Croisement de Mesecon isolé +You hacker you!=Vous êtes un pirate informatique ! + +### doublecorner.lua ### +Insulated Mesecon Double Corner=Double coin de Mesecon isolé + +### mesewire.lua ### +Mese Wire=Câble de Mesecon + +### tjunction.lua ### +Insulated Mesecon T-junction=Croisement en T de Mesecon isolé + +### vertical.lua ### +Vertical Mesecon=Mesecon vertical diff --git a/mods/mesecons/mesecons_extrawires/locale/template.txt b/mods/mesecons/mesecons_extrawires/locale/template.txt new file mode 100644 index 00000000..44d3abb9 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/locale/template.txt @@ -0,0 +1,20 @@ +# textdomain: mesecons_extrawires + +### corner.lua ### +Insulated Mesecon Corner= + +### crossover.lua ### +Insulated Mesecon Crossover= +You hacker you!= + +### doublecorner.lua ### +Insulated Mesecon Double Corner= + +### mesewire.lua ### +Mese Wire= + +### tjunction.lua ### +Insulated Mesecon T-junction= + +### vertical.lua ### +Vertical Mesecon= diff --git a/mods/mesecons/mesecons_extrawires/mesewire.lua b/mods/mesecons/mesecons_extrawires/mesewire.lua new file mode 100644 index 00000000..cdb87a8d --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/mesewire.lua @@ -0,0 +1,58 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local mese_nodename = minetest.registered_aliases["mesecons_gamecompat:mese"] +if mese_nodename then + -- Convert placeholders. + minetest.register_alias("mesecons_extrawires:mese", mese_nodename) +else + -- Register placeholder. + mese_nodename = "mesecons_extrawires:mese" + minetest.register_node("mesecons_extrawires:mese", { + description = S("Mese Wire"), + tiles = {"mesecons_wire_off.png"}, + paramtype = "light", + light_source = 3, + groups = {cracky = 1}, + sounds = mesecon.node_sound.stone, + }) +end + +local mesewire_rules = +{ + {x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}, +} + +minetest.override_item(mese_nodename, { + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:mese_powered", + rules = mesewire_rules + }} +}) + +-- Copy node definition of powered mese from normal mese +-- and brighten texture tiles to indicate mese is powered +local unpowered_def = minetest.registered_nodes[mese_nodename] +local powered_def = mesecon.merge_tables(unpowered_def, { + drop = mese_nodename, + paramtype = "light", + light_source = math.min(unpowered_def.light_source + 2, minetest.LIGHT_MAX), + mesecons = {conductor = { + state = mesecon.state.on, + offstate = mese_nodename, + rules = mesewire_rules + }}, + groups = mesecon.merge_tables(unpowered_def.groups or {}, {not_in_creative_inventory = 1}), + on_blast = mesecon.on_blastnode, +}) + +for i, v in pairs(powered_def.tiles) do + powered_def.tiles[i] = v .. "^[brighten" +end + +minetest.register_node("mesecons_extrawires:mese_powered", powered_def) diff --git a/mods/mesecons/mesecons_extrawires/mod.conf b/mods/mesecons/mesecons_extrawires/mod.conf new file mode 100644 index 00000000..cd9e2d3c --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_extrawires +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_corner.obj b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_corner.obj new file mode 100644 index 00000000..c7b6b160 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_corner.obj @@ -0,0 +1,125 @@ +# Вершины +# Провод 1 +# 1 (ниж. внутр.) +v 0.093750 -0.531250 -0.501000 +v 0.093750 -0.531250 -0.331726 +v 0.331726 -0.531250 -0.093750 +v 0.501000 -0.531250 -0.093750 +# 5 (ниж. наруж.) +v -0.093750 -0.531250 -0.501000 +v -0.093750 -0.531250 -0.254061 +v 0.254061 -0.531250 0.093750 +v 0.501000 -0.531250 0.093750 +# 9 (верх. внутр.) +v 0.093750 -0.406250 -0.501000 +v 0.093750 -0.406250 -0.331726 +v 0.331726 -0.406250 -0.093750 +v 0.501000 -0.406250 -0.093750 +# 13 (верх. наруж.) +v -0.093750 -0.406250 -0.501000 +v -0.093750 -0.406250 -0.254061 +v 0.254061 -0.406250 0.093750 +v 0.501000 -0.406250 0.093750 +# Текстурные координаты +# 1 (ниж.) +vt 0.000000 0.406250 +vt 0.168274 0.406250 +vt 0.331726 0.406250 +vt 0.668274 0.406250 +vt 0.831726 0.406250 +vt 1.000000 0.406250 +vt 0.000000 0.593750 +vt 0.245939 0.593750 +vt 0.254061 0.593750 +vt 0.745939 0.593750 +vt 0.754061 0.593750 +vt 1.000000 0.593750 +# 13 (верх.) +vt 0.000000 0.406250 +vt 0.245939 0.406250 +vt 0.254061 0.406250 +vt 0.745939 0.406250 +vt 0.754061 0.406250 +vt 1.000000 0.406250 +vt 0.000000 0.593750 +vt 0.168274 0.593750 +vt 0.331726 0.593750 +vt 0.668274 0.593750 +vt 0.831726 0.593750 +vt 1.000000 0.593750 +# 25 (внутр.) +vt 1.000000 0.093750 +vt 0.831726 0.093750 +vt 0.668274 0.093750 +vt 0.331726 0.093750 +vt 0.168274 0.093750 +vt 0.000000 0.093750 +vt 1.000000 -0.031250 +vt 0.831726 -0.031250 +vt 0.668274 -0.031250 +vt 0.331726 -0.031250 +vt 0.168274 -0.031250 +vt 0.000000 -0.031250 +# 37 (внеш.) +vt 0.000000 -0.031250 +vt 0.245939 -0.031250 +vt 0.254061 -0.031250 +vt 0.745939 -0.031250 +vt 0.754061 -0.031250 +vt 1.000000 -0.031250 +vt 0.000000 0.093750 +vt 0.245939 0.093750 +vt 0.254061 0.093750 +vt 0.745939 0.093750 +vt 0.754061 0.093750 +vt 1.000000 0.093750 +# 49 (торец) +vt 0.406250 -0.031250 +vt 0.406250 0.093750 +vt 0.593750 -0.031250 +vt 0.593750 0.093750 +# Нормали +# 1 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.707107 0.000000 0.707107 +# 5 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.707107 0.000000 -0.707107 +# Грани +g Sides1 +# Часть 1 +f 5/37/1 6/38/1 14/44/1 +f 5/37/1 14/44/1 13/43/1 +f 13/13/2 14/14/2 10/20/2 +f 13/13/2 10/20/2 9/19/2 +f 9/25/5 10/26/5 2/32/5 +f 9/25/5 2/32/5 1/31/5 +f 1/1/6 2/2/6 6/8/6 +f 1/1/6 6/8/6 5/7/6 +# Часть 2 +f 6/39/4 7/40/4 15/46/4 +f 6/39/4 15/46/4 14/45/4 +f 14/15/2 15/16/2 11/22/2 +f 14/15/2 11/22/2 10/21/2 +f 10/27/8 11/28/8 3/34/8 +f 10/27/8 3/34/8 2/33/8 +f 2/3/6 3/4/6 7/10/6 +f 2/3/6 7/10/6 6/9/6 +# Часть 3 +f 7/41/3 8/42/3 16/48/3 +f 7/41/3 16/48/3 15/47/3 +f 15/17/2 16/18/2 12/24/2 +f 15/17/2 12/24/2 11/23/2 +f 11/29/7 12/30/7 4/36/7 +f 11/29/7 4/36/7 3/35/7 +f 3/5/6 4/6/6 8/12/6 +f 3/5/6 8/12/6 7/11/6 +g Ends1 +f 1/49/3 5/51/3 13/52/3 +f 1/49/3 13/52/3 9/50/3 +f 4/49/1 12/50/1 16/52/1 +f 4/49/1 16/52/1 8/51/1 diff --git a/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_crossover.b3d b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_crossover.b3d new file mode 100644 index 00000000..e776535a Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_crossover.b3d differ diff --git a/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_doublecorner.obj b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_doublecorner.obj new file mode 100644 index 00000000..a74aa019 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_doublecorner.obj @@ -0,0 +1,180 @@ +# Вершины +# Провод 1 +# 1 (ниж. внутр.) +v 0.093750 -0.531250 -0.501000 +v 0.093750 -0.531250 -0.331726 +v 0.331726 -0.531250 -0.093750 +v 0.501000 -0.531250 -0.093750 +# 5 (ниж. наруж.) +v -0.093750 -0.531250 -0.501000 +v -0.093750 -0.531250 -0.254061 +v 0.254061 -0.531250 0.093750 +v 0.501000 -0.531250 0.093750 +# 9 (верх. внутр.) +v 0.093750 -0.406250 -0.501000 +v 0.093750 -0.406250 -0.331726 +v 0.331726 -0.406250 -0.093750 +v 0.501000 -0.406250 -0.093750 +# 13 (верх. наруж.) +v -0.093750 -0.406250 -0.501000 +v -0.093750 -0.406250 -0.254061 +v 0.254061 -0.406250 0.093750 +v 0.501000 -0.406250 0.093750 +# Провод 2 +# 17 (ниж. внутр.) +v -0.093750 -0.531250 0.501000 +v -0.093750 -0.531250 0.331726 +v -0.331726 -0.531250 0.093750 +v -0.501000 -0.531250 0.093750 +# 21 (ниж. наруж.) +v 0.093750 -0.531250 0.501000 +v 0.093750 -0.531250 0.254061 +v -0.254061 -0.531250 -0.093750 +v -0.501000 -0.531250 -0.093750 +# 25 (верх. внутр.) +v -0.093750 -0.406250 0.501000 +v -0.093750 -0.406250 0.331726 +v -0.331726 -0.406250 0.093750 +v -0.501000 -0.406250 0.093750 +# 29 (верх. наруж.) +v 0.093750 -0.406250 0.501000 +v 0.093750 -0.406250 0.254061 +v -0.254061 -0.406250 -0.093750 +v -0.501000 -0.406250 -0.093750 +# Текстурные координаты +# 1 (ниж.) +vt 0.000000 0.406250 +vt 0.168274 0.406250 +vt 0.331726 0.406250 +vt 0.668274 0.406250 +vt 0.831726 0.406250 +vt 1.000000 0.406250 +vt 0.000000 0.593750 +vt 0.245939 0.593750 +vt 0.254061 0.593750 +vt 0.745939 0.593750 +vt 0.754061 0.593750 +vt 1.000000 0.593750 +# 13 (верх.) +vt 0.000000 0.406250 +vt 0.245939 0.406250 +vt 0.254061 0.406250 +vt 0.745939 0.406250 +vt 0.754061 0.406250 +vt 1.000000 0.406250 +vt 0.000000 0.593750 +vt 0.168274 0.593750 +vt 0.331726 0.593750 +vt 0.668274 0.593750 +vt 0.831726 0.593750 +vt 1.000000 0.593750 +# 25 (внутр.) +vt 1.000000 0.093750 +vt 0.831726 0.093750 +vt 0.668274 0.093750 +vt 0.331726 0.093750 +vt 0.168274 0.093750 +vt 0.000000 0.093750 +vt 1.000000 -0.031250 +vt 0.831726 -0.031250 +vt 0.668274 -0.031250 +vt 0.331726 -0.031250 +vt 0.168274 -0.031250 +vt 0.000000 -0.031250 +# 37 (внеш.) +vt 0.000000 -0.031250 +vt 0.245939 -0.031250 +vt 0.254061 -0.031250 +vt 0.745939 -0.031250 +vt 0.754061 -0.031250 +vt 1.000000 -0.031250 +vt 0.000000 0.093750 +vt 0.245939 0.093750 +vt 0.254061 0.093750 +vt 0.745939 0.093750 +vt 0.754061 0.093750 +vt 1.000000 0.093750 +# 49 (торец) +vt 0.406250 -0.031250 +vt 0.406250 0.093750 +vt 0.593750 -0.031250 +vt 0.593750 0.093750 +# Нормали +# 1 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.707107 0.000000 0.707107 +# 5 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.707107 0.000000 -0.707107 +# Грани +# Грани +g Sides1 +# Часть 1 +f 5/37/1 6/38/1 14/44/1 +f 5/37/1 14/44/1 13/43/1 +f 13/13/2 14/14/2 10/20/2 +f 13/13/2 10/20/2 9/19/2 +f 9/25/5 10/26/5 2/32/5 +f 9/25/5 2/32/5 1/31/5 +f 1/1/6 2/2/6 6/8/6 +f 1/1/6 6/8/6 5/7/6 +# Часть 2 +f 6/39/4 7/40/4 15/46/4 +f 6/39/4 15/46/4 14/45/4 +f 14/15/2 15/16/2 11/22/2 +f 14/15/2 11/22/2 10/21/2 +f 10/27/8 11/28/8 3/34/8 +f 10/27/8 3/34/8 2/33/8 +f 2/3/6 3/4/6 7/10/6 +f 2/3/6 7/10/6 6/9/6 +# Часть 3 +f 7/41/3 8/42/3 16/48/3 +f 7/41/3 16/48/3 15/47/3 +f 15/17/2 16/18/2 12/24/2 +f 15/17/2 12/24/2 11/23/2 +f 11/29/7 12/30/7 4/36/7 +f 11/29/7 4/36/7 3/35/7 +f 3/5/6 4/6/6 8/12/6 +f 3/5/6 8/12/6 7/11/6 +g Ends1 +f 1/49/3 5/51/3 13/52/3 +f 1/49/3 13/52/3 9/50/3 +f 4/49/1 12/50/1 16/52/1 +f 4/49/1 16/52/1 8/51/1 +g Sides2 +# Часть 1 +f 21/37/1 22/38/1 30/44/1 +f 21/37/1 30/44/1 29/43/1 +f 29/13/2 30/14/2 26/20/2 +f 29/13/2 26/20/2 25/19/2 +f 25/25/5 26/26/5 18/32/5 +f 25/25/5 18/32/5 17/31/5 +f 17/1/6 18/2/6 22/8/6 +f 17/1/6 22/8/6 21/7/6 +# Часть 2 +f 22/39/4 23/40/4 31/46/4 +f 22/39/4 31/46/4 30/45/4 +f 30/15/2 31/16/2 27/22/2 +f 30/15/2 27/22/2 26/21/2 +f 26/27/8 27/28/8 19/34/8 +f 26/27/8 19/34/8 18/33/8 +f 18/3/6 19/4/6 23/10/6 +f 18/3/6 23/10/6 22/9/6 +# Часть 3 +f 23/41/3 24/42/3 32/48/3 +f 23/41/3 32/48/3 31/47/3 +f 31/17/2 32/18/2 28/24/2 +f 31/17/2 28/24/2 27/23/2 +f 27/29/7 28/30/7 20/36/7 +f 27/29/7 20/36/7 19/35/7 +f 19/5/6 20/6/6 24/12/6 +f 19/5/6 24/12/6 23/11/6 +g Ends2 +f 17/49/3 21/51/3 29/52/3 +f 17/49/3 29/52/3 25/50/3 +f 20/49/1 28/50/1 32/52/1 +f 20/49/1 32/52/1 24/51/1 diff --git a/mods/mesecons/mesecons_extrawires/src/mesecons_extrawires_crossover.blend b/mods/mesecons/mesecons_extrawires/src/mesecons_extrawires_crossover.blend new file mode 100644 index 00000000..9ad37496 Binary files /dev/null and b/mods/mesecons/mesecons_extrawires/src/mesecons_extrawires_crossover.blend differ diff --git a/mods/mesecons/mesecons_extrawires/tjunction.lua b/mods/mesecons/mesecons_extrawires/tjunction.lua new file mode 100644 index 00000000..d6186f21 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/tjunction.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local tjunction_nodebox = { + type = "fixed", + -- ±0.001 is to prevent z-fighting + fixed = {{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32+0.001, 3/32, -13/32, -3/32},} +} + +local tjunction_selectionbox = { + type = "fixed", + fixed = { -16/32, -16/32, -16/32, 16/32, -12/32, 7/32 }, +} + +local tjunction_get_rules = mesecon.horiz_rules_getter({ + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = -1, y = 0, z = 0}, +}) + +minetest.register_node("mesecons_extrawires:tjunction_on", { + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_tjunction_tb_on.png", + "jeija_insulated_wire_tjunction_tb_on.png^[transformR180", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = tjunction_selectionbox, + node_box = tjunction_nodebox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_extrawires:tjunction_off", + sounds = mesecon.node_sound.default, + mesecons = {conductor = + { + state = mesecon.state.on, + rules = tjunction_get_rules, + offstate = "mesecons_extrawires:tjunction_off" + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_node("mesecons_extrawires:tjunction_off", { + drawtype = "nodebox", + description = S("Insulated Mesecon T-junction"), + tiles = { + "jeija_insulated_wire_tjunction_tb_off.png", + "jeija_insulated_wire_tjunction_tb_off.png^[transformR180", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = tjunction_selectionbox, + node_box = tjunction_nodebox, + groups = {dig_immediate = 3}, + sounds = mesecon.node_sound.default, + mesecons = {conductor = + { + state = mesecon.state.off, + rules = tjunction_get_rules, + onstate = "mesecons_extrawires:tjunction_on" + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_craft({ + output = "mesecons_extrawires:tjunction_off 3", + recipe = { + {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}, + {"", "mesecons_insulated:insulated_off", ""}, + } +}) diff --git a/mods/mesecons/mesecons_extrawires/vertical.lua b/mods/mesecons/mesecons_extrawires/vertical.lua new file mode 100644 index 00000000..636bb377 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/vertical.lua @@ -0,0 +1,193 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local vertical_box = { + type = "fixed", + fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16} +} + +local top_box = { + type = "fixed", + fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}} +} + +local bottom_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, + {-1/16, -7/16, -1/16, 1/16, 8/16, 1/16}, + } +} + +local vertical_rules = { + {x=0, y=1, z=0}, + {x=0, y=-1, z=0} +} + +local top_rules = { + {x=1,y=0, z=0}, + {x=-1,y=0, z=0}, + {x=0,y=0, z=1}, + {x=0,y=0, z=-1}, + {x=0,y=-1, z=0} +} + +local bottom_rules = { + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=1, z=0}, + {x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above +} + +local function is_vertical_conductor(nodename) + local def = minetest.registered_nodes[nodename] + return def and def.is_vertical_conductor +end + +local vertical_updatepos = function (pos) + local node = minetest.get_node(pos) + if not is_vertical_conductor(node.name) then + return + end + + local node_above = minetest.get_node(vector.add(pos, vertical_rules[1])) + local node_below = minetest.get_node(vector.add(pos, vertical_rules[2])) + + local above = is_vertical_conductor(node_above.name) + local below = is_vertical_conductor(node_below.name) + + mesecon.on_dignode(pos, node) + + -- Always place offstate conductor and let mesecon.on_placenode take care + local newname = "mesecons_extrawires:vertical_" + if above and below then -- above and below: vertical mesecon + newname = newname .. "off" + elseif above and not below then -- above only: bottom + newname = newname .. "bottom_off" + elseif not above and below then -- below only: top + newname = newname .. "top_off" + else -- no vertical wire above, no vertical wire below: use bottom + newname = newname .. "bottom_off" + end + + minetest.set_node(pos, {name = newname}) + mesecon.on_placenode(pos, {name = newname}) +end + +local vertical_update = function (pos) + vertical_updatepos(pos) -- this one + vertical_updatepos(vector.add(pos, vertical_rules[1])) -- above + vertical_updatepos(vector.add(pos, vertical_rules[2])) -- below +end + +-- Vertical wire +mesecon.register_node("mesecons_extrawires:vertical", { + description = S("Vertical Mesecon"), + drawtype = "nodebox", + walkable = false, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + selection_box = vertical_box, + node_box = vertical_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update, + sounds = mesecon.node_sound.default, +},{ + tiles = {"mesecons_wire_off.png"}, + groups = {dig_immediate=3}, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_on", + rules = vertical_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_off", + rules = vertical_rules, + }} +}) + +-- Vertical wire top +mesecon.register_node("mesecons_extrawires:vertical_top", { + description = S("Vertical Mesecon"), + drawtype = "nodebox", + walkable = false, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + selection_box = top_box, + node_box = top_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update, + sounds = mesecon.node_sound.default, +},{ + tiles = {"mesecons_wire_off.png"}, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_top_on", + rules = top_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_top_off", + rules = top_rules, + }} +}) + +-- Vertical wire bottom +mesecon.register_node("mesecons_extrawires:vertical_bottom", { + description = S("Vertical Mesecon"), + drawtype = "nodebox", + walkable = false, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + selection_box = bottom_box, + node_box = bottom_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update, + sounds = mesecon.node_sound.default, +},{ + tiles = {"mesecons_wire_off.png"}, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_bottom_on", + rules = bottom_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_bottom_off", + rules = bottom_rules, + }} +}) + +minetest.register_craft({ + output = "mesecons_extrawires:vertical_off 3", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"group:mesecon_conductor_craftable"}, + {"group:mesecon_conductor_craftable"}, + } +}) + +minetest.register_craft({ + output = "mesecons:wire_00000000_off", + recipe = {{"mesecons_extrawires:vertical_off"}} +}) diff --git a/mods/mesecons/mesecons_fpga/doc/fpga/description.html b/mods/mesecons/mesecons_fpga/doc/fpga/description.html new file mode 100644 index 00000000..a4cbeed0 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/doc/fpga/description.html @@ -0,0 +1,6 @@ +FPGAs can be used to chain multiple logic gates together in a compact manner. +They come with 4 I/O ports and 10 internal registers, +which can then be connected with each other to form logic circuits. +They work fine in unloaded blocks.
+Supported gate types: AND, OR, NOT, XOR, NAND, XNOR, Buffer (=)
+I/O ports: A B C D; Registers: numbered 0 to 9 diff --git a/mods/mesecons/mesecons_fpga/doc/fpga/preview.png b/mods/mesecons/mesecons_fpga/doc/fpga/preview.png new file mode 100644 index 00000000..b4a2994f Binary files /dev/null and b/mods/mesecons/mesecons_fpga/doc/fpga/preview.png differ diff --git a/mods/mesecons/mesecons_fpga/doc/fpga/recipe.png b/mods/mesecons/mesecons_fpga/doc/fpga/recipe.png new file mode 100644 index 00000000..edb14f4b Binary files /dev/null and b/mods/mesecons/mesecons_fpga/doc/fpga/recipe.png differ diff --git a/mods/mesecons/mesecons_fpga/doc/programmer/description.html b/mods/mesecons/mesecons_fpga/doc/programmer/description.html new file mode 100644 index 00000000..39e23744 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/doc/programmer/description.html @@ -0,0 +1,3 @@ +The FPGA programmer can be used to copy gate configurations from one FPGA to another.
+Shift+Right-Click an FPGA to read its configuration and "remember" it. +Left-click (punch) FPGAs to write the saved configuration to them. diff --git a/mods/mesecons/mesecons_fpga/doc/programmer/preview.png b/mods/mesecons/mesecons_fpga/doc/programmer/preview.png new file mode 100644 index 00000000..b1bae7a2 Binary files /dev/null and b/mods/mesecons/mesecons_fpga/doc/programmer/preview.png differ diff --git a/mods/mesecons/mesecons_fpga/doc/programmer/recipe.png b/mods/mesecons/mesecons_fpga/doc/programmer/recipe.png new file mode 100644 index 00000000..a7c691b3 Binary files /dev/null and b/mods/mesecons/mesecons_fpga/doc/programmer/recipe.png differ diff --git a/mods/mesecons/mesecons_fpga/init.lua b/mods/mesecons/mesecons_fpga/init.lua new file mode 100644 index 00000000..0af9d1bd --- /dev/null +++ b/mods/mesecons/mesecons_fpga/init.lua @@ -0,0 +1,464 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local plg = {} +plg.rules = {} +-- per-player formspec positions +plg.open_formspecs = {} + +local lcore = dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/logic.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/tool.lua")(plg) + +plg.register_nodes = function(template) + -- each loop is for one of the 4 IO ports + for a = 0, 1 do + for b = 0, 1 do + for c = 0, 1 do + for d = 0, 1 do + local ndef = table.copy(template) + local nodename = "mesecons_fpga:fpga" + .. tostring(d) .. tostring(c) .. tostring(b) .. tostring(a) + + -- build top texture string + local texture = "jeija_fpga_top.png" + if a == 1 then texture = texture .. "^jeija_luacontroller_LED_A.png" end + if b == 1 then texture = texture .. "^jeija_luacontroller_LED_B.png" end + if c == 1 then texture = texture .. "^jeija_luacontroller_LED_C.png" end + if d == 1 then texture = texture .. "^jeija_luacontroller_LED_D.png" end + ndef.tiles[1] = texture + ndef.inventory_image = texture + + if (a + b + c + d) > 0 then + ndef.groups["not_in_creative_inventory"] = 1 + end + + -- interaction with mesecons (input / output) + local rules_out = {} + if a == 1 then table.insert(rules_out, {x = -1, y = 0, z = 0}) end + if b == 1 then table.insert(rules_out, {x = 0, y = 0, z = 1}) end + if c == 1 then table.insert(rules_out, {x = 1, y = 0, z = 0}) end + if d == 1 then table.insert(rules_out, {x = 0, y = 0, z = -1}) end + plg.rules[nodename] = rules_out + + local rules_in = {} + if a == 0 then table.insert(rules_in, {x = -1, y = 0, z = 0}) end + if b == 0 then table.insert(rules_in, {x = 0, y = 0, z = 1}) end + if c == 0 then table.insert(rules_in, {x = 1, y = 0, z = 0}) end + if d == 0 then table.insert(rules_in, {x = 0, y = 0, z = -1}) end + ndef.mesecons.effector.rules = rules_in + + if (a + b + c + d) > 0 then + ndef.mesecons.receptor = { + state = mesecon.state.on, + rules = rules_out, + } + end + + minetest.register_node(nodename, ndef) + end + end + end + end +end + +plg.register_nodes({ + description = S("FPGA"), + drawtype = "nodebox", + tiles = { + "", -- replaced later + "jeija_microcontroller_bottom.png", + "jeija_fpga_sides.png", + "jeija_fpga_sides.png", + "jeija_fpga_sides.png", + "jeija_fpga_sides.png" + }, + inventory_image = "", -- replaced later + is_ground_content = false, + sunlight_propagates = true, + paramtype = "light", + walkable = true, + groups = {dig_immediate = 2, mesecon = 3, overheat = 1}, + drop = "mesecons_fpga:fpga0000", + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + { -5/16, -7/16, -5/16, 5/16, -6/16, 5/16 }, -- circuit board + { -3/16, -6/16, -3/16, 3/16, -5/16, 3/16 }, -- IC + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local is = { {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} } + + meta:set_string("instr", lcore.serialize(is)) + meta:set_int("valid", 0) + meta:set_string("infotext", "FPGA") + end, + on_rightclick = function(pos, _, clicker) + if not minetest.is_player(clicker) then + return + end + local meta = minetest.get_meta(pos) + local name = clicker:get_player_name() + -- Erase formspecs of old FPGAs + meta:set_string("formspec", "") + + plg.open_formspecs[name] = pos + local is = lcore.deserialize(meta:get_string("instr")) + minetest.show_formspec(name, "mesecons:fpga", plg.to_formspec_string(is, nil)) + end, + sounds = mesecon.node_sound.stone, + mesecons = { + effector = { + rules = {}, -- replaced later + action_change = function(pos, _, rule, newstate) + if plg.ports_changed(pos, rule, newstate) then + plg.update(pos) + end + end + } + }, + after_dig_node = function(pos, node) + mesecon.receptor_off(pos, plg.rules[node.name]) + for name, open_pos in pairs(plg.open_formspecs) do + if vector.equals(pos, open_pos) then + minetest.close_formspec(name, "mesecons:fpga") + plg.open_formspecs[name] = nil + end + end + end, + on_blast = mesecon.on_blastnode, + on_rotate = function(pos, _, user, mode) + local abcd1 = {"A", "B", "C", "D"} + local abcd2 = {A = 1, B = 2, C = 3, D = 4} + local ops = {"op1", "op2", "dst"} + local dir = 0 + if mode == screwdriver.ROTATE_FACE then -- clock-wise + dir = 1 + if user and user:is_player() then + minetest.chat_send_player(user:get_player_name(), + "FPGA ports have been rotated clockwise.") + end + elseif mode == screwdriver.ROTATE_AXIS then -- counter-clockwise + dir = -1 + if user and user:is_player() then + minetest.chat_send_player(user:get_player_name(), + "FPGA ports have been rotated counter-clockwise.") + end + end + + local meta = minetest.get_meta(pos) + local instr = lcore.deserialize(meta:get_string("instr")) + for i = 1, #instr do + for _, op in ipairs(ops) do + local o = instr[i][op] + if o and o.type == "io" then + local num = abcd2[o.port] + num = num + dir + if num > 4 then num = 1 + elseif num < 1 then num = 4 end + instr[i][op].port = abcd1[num] + end + end + end + + meta:set_string("instr", lcore.serialize(instr)) + plg.update_meta(pos, instr) + return true + end, +}) + +plg.to_formspec_string = function(is, err) + local function dropdown_op(x, y, name, val) + local s = "dropdown[" .. tostring(x) .. "," .. tostring(y) .. ";" + .. "0.75,0.5;" .. name .. ";" -- the height seems to be ignored? + s = s .. " ,A,B,C,D,0,1,2,3,4,5,6,7,8,9;" + if val == nil then + s = s .. "0" -- actually selects no field at all + elseif val.type == "io" then + local mapping = { + ["A"] = 1, + ["B"] = 2, + ["C"] = 3, + ["D"] = 4, + } + s = s .. tostring(1 + mapping[val.port]) + else -- "reg" + s = s .. tostring(6 + val.n) + end + return s .. "]" + end + local function dropdown_action(x, y, name, val) + local selected = 0 + local titles = { " " } + for i, data in ipairs(lcore.get_operations()) do + titles[i + 1] = data.fs_name + if val == data.gate then + selected = i + 1 + end + end + return ("dropdown[%f,%f;1.125,0.5;%s;%s;%i]"):format( + x, y, name, table.concat(titles, ","), selected) + end + local s = "size[9,9]".. + "label[3.4,-0.15;FPGA gate configuration]".. + "button[7,7.5;2,2.5;program;Program]".. + "box[4.2,0.5;0.03,7;#ffffff]".. + "label[0.25,0.25;op. 1]".. + "label[1.0,0.25;gate type]".. + "label[2.125,0.25;op. 2]".. + "label[3.15,0.25;dest]".. + "label[4.5,0.25;op. 1]".. + "label[5.25,0.25;gate type]".. + "label[6.375,0.25;op. 2]".. + "label[7.4,0.25;dest]" + local x = 1 - 0.75 + local y = 1 - 0.25 + for i = 1, 14 do + local cur = is[i] + s = s .. dropdown_op (x , y, tostring(i).."op1", cur.op1) + s = s .. dropdown_action(x+0.75 , y, tostring(i).."act", cur.action) + s = s .. dropdown_op (x+1.875, y, tostring(i).."op2", cur.op2) + s = s .. "label[" .. tostring(x+2.625) .. "," .. tostring(y+0.1) .. "; ->]" + s = s .. dropdown_op (x+2.9 , y, tostring(i).."dst", cur.dst) + y = y + 1 + + if i == 7 then + x = 4.5 + y = 1 - 0.25 + end + end + if err then + local fmsg = minetest.colorize("#ff0000", minetest.formspec_escape(err.msg)) + s = s .. plg.red_box_around(err.i) .. + "label[0.25,8.25;The gate configuration is erroneous in the marked area:]".. + "label[0.25,8.5;" .. fmsg .. "]" + end + return s +end + +plg.from_formspec_fields = function(fields) + local function read_op(s) + if s == nil or s == " " then + return nil + elseif s == "A" or s == "B" or s == "C" or s == "D" then + return {type = "io", port = s} + else + return {type = "reg", n = tonumber(s)} + end + end + local function read_action(s) + for i, data in ipairs(lcore.get_operations()) do + if data.fs_name == s then + return data.gate + end + end + end + local is = {} + for i = 1, 14 do + local cur = {} + cur.op1 = read_op(fields[tonumber(i) .. "op1"]) + cur.action = read_action(fields[tonumber(i) .. "act"]) + cur.op2 = read_op(fields[tonumber(i) .. "op2"]) + cur.dst = read_op(fields[tonumber(i) .. "dst"]) + is[#is + 1] = cur + end + return is +end + +plg.update_meta = function(pos, is) + if type(is) == "string" then -- serialized string + is = lcore.deserialize(is) + end + local meta = minetest.get_meta(pos) + + local err = lcore.validate(is) + if err == nil then + meta:set_int("valid", 1) + meta:set_string("infotext", "FPGA (functional)") + else + meta:set_int("valid", 0) + meta:set_string("infotext", "FPGA") + end + + -- reset ports and run programmed logic + plg.setports(pos, false, false, false, false) + plg.update(pos) + + -- Refresh open formspecs + local form = plg.to_formspec_string(is, err) + for name, open_pos in pairs(plg.open_formspecs) do + if vector.equals(pos, open_pos) then + minetest.show_formspec(name, "mesecons:fpga", form) + end + end + return err +end + +plg.red_box_around = function(i) + local x, y + if i > 7 then + x = 4.5 + y = 0.75 + (i - 8) + else + x = 0.25 + y = 0.75 + (i - 1) + end + return string.format("box[%f,%f;3.8,0.8;#ff0000]", x-0.1, y-0.05) +end + + +plg.update = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("valid") ~= 1 then + return + elseif mesecon.do_overheat(pos) then + plg.setports(pos, false, false, false, false) + meta:set_int("valid", 0) + meta:set_string("infotext", "FPGA (overheated)") + return + end + + local is = lcore.deserialize(meta:get_string("instr")) + local A, B, C, D = plg.getports(pos) + A, B, C, D = lcore.interpret(is, A, B, C, D) + plg.setports(pos, A, B, C, D) +end + +-- Updates the port states according to the signal change. +-- Returns whether the port states actually changed. +plg.ports_changed = function(pos, rule, newstate) + if rule == nil then return false end + local meta = minetest.get_meta(pos) + local states + + local s = meta:get_string("portstates") + if s == nil then + states = {false, false, false, false} + else + states = { + s:sub(1, 1) == "1", + s:sub(2, 2) == "1", + s:sub(3, 3) == "1", + s:sub(4, 4) == "1", + } + end + + -- trick to transform rules (see register_node) into port number + local portno = ({4, 1, nil, 3, 2})[3 + rule.x + 2*rule.z] + states[portno] = (newstate == "on") + + local new_portstates = + (states[1] and "1" or "0") .. (states[2] and "1" or "0") .. + (states[3] and "1" or "0") .. (states[4] and "1" or "0") + if new_portstates ~= s then + meta:set_string("portstates", new_portstates) + return true + end + return false +end + +plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT + local sin, sout + + local s = minetest.get_meta(pos):get_string("portstates") + if s == nil then + sin = {false, false, false, false} + else + sin = { + s:sub(1, 1) == "1", + s:sub(2, 2) == "1", + s:sub(3, 3) == "1", + s:sub(4, 4) == "1", + } + end + + local name = minetest.get_node(pos).name + assert(name:find("mesecons_fpga:fpga") == 1) + local off = #"mesecons_fpga:fpga" + sout = { + name:sub(off+4, off+4) == "1", + name:sub(off+3, off+3) == "1", + name:sub(off+2, off+2) == "1", + name:sub(off+1, off+1) == "1", + } + + return unpack({ + sin[1] or sout[1], + sin[2] or sout[2], + sin[3] or sout[3], + sin[4] or sout[4], + }) +end + +plg.setports = function(pos, A, B, C, D) -- sets states of OUTPUT + local base = "mesecons_fpga:fpga" + + local name = base + .. (D and "1" or "0") .. (C and "1" or "0") + .. (B and "1" or "0") .. (A and "1" or "0") + minetest.swap_node(pos, {name = name, param2 = minetest.get_node(pos).param2}) + + if A ~= nil then + local ru = plg.rules[base .. "0001"] + if A then mesecon.receptor_on(pos, ru) else mesecon.receptor_off(pos, ru) end + end + if B ~= nil then + local ru = plg.rules[base .. "0010"] + if B then mesecon.receptor_on(pos, ru) else mesecon.receptor_off(pos, ru) end + end + if C ~= nil then + local ru = plg.rules[base .. "0100"] + if C then mesecon.receptor_on(pos, ru) else mesecon.receptor_off(pos, ru) end + end + if D ~= nil then + local ru = plg.rules[base .. "1000"] + if D then mesecon.receptor_on(pos, ru) else mesecon.receptor_off(pos, ru) end + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local player_name = player:get_player_name() + + if formname ~= "mesecons:fpga" or fields.quit then + plg.open_formspecs[player_name] = nil -- potential garbage + return + end + if not fields.program then + return -- we only care when the user clicks "Program" + end + local pos = plg.open_formspecs[player_name] + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + + local meta = minetest.get_meta(pos) + local is = plg.from_formspec_fields(fields) + + meta:set_string("instr", lcore.serialize(is)) + local err = plg.update_meta(pos, is) + + if not err then + plg.open_formspecs[player_name] = nil + -- Close on success + minetest.close_formspec(player_name, "mesecons:fpga") + end +end) + +minetest.register_on_leaveplayer(function(player) + plg.open_formspecs[player:get_player_name()] = nil +end) + +minetest.register_craft({ + output = "mesecons_fpga:fpga0000 2", + recipe = { + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon', 'mesecons_materials:silicon'}, + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable'}, + } +}) diff --git a/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.de.tr b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.de.tr new file mode 100644 index 00000000..b3f0dd26 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_fpga +FPGA=FPGA +FPGA Programmer=FPGA-Programmierer diff --git a/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.eo.tr b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.eo.tr new file mode 100644 index 00000000..5ad42b1d --- /dev/null +++ b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.eo.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_fpga + +### init.lua ### +FPGA=FPGA + +### tool.lua ### +FPGA Programmer=FPGA Programilo diff --git a/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.fr.tr b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.fr.tr new file mode 100644 index 00000000..c0fccab3 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/locale/mesecons_fpga.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_fpga + +### init.lua ### +FPGA=Circuit logique programmable (FPGA) + +### tool.lua ### +FPGA Programmer=Programmateur de circuit logique diff --git a/mods/mesecons/mesecons_fpga/locale/template.txt b/mods/mesecons/mesecons_fpga/locale/template.txt new file mode 100644 index 00000000..5764150e --- /dev/null +++ b/mods/mesecons/mesecons_fpga/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mesecons_fpga + +### init.lua ### +FPGA= + +### tool.lua ### +FPGA Programmer= diff --git a/mods/mesecons/mesecons_fpga/logic.lua b/mods/mesecons/mesecons_fpga/logic.lua new file mode 100644 index 00000000..0e268a2a --- /dev/null +++ b/mods/mesecons/mesecons_fpga/logic.lua @@ -0,0 +1,222 @@ + +local lg = {} + +local operations = { + -- table index: Index in the formspec dropdown + -- gate: Internal name + -- short: Serialized form, single character + -- fs_name: Display name, padded to 4 characters + -- func: Function that applies the operation + -- unary: Whether this gate only has one input + { gate = "and", short = "&", fs_name = " AND", func = function(a, b) return a and b end }, + { gate = "or", short = "|", fs_name = " OR", func = function(a, b) return a or b end }, + { gate = "not", short = "~", fs_name = " NOT", func = function(_, b) return not b end, unary = true }, + { gate = "xor", short = "^", fs_name = " XOR", func = function(a, b) return a ~= b end }, + { gate = "nand", short = "?", fs_name = "NAND", func = function(a, b) return not (a and b) end }, + { gate = "buf", short = "_", fs_name = " =", func = function(_, b) return b end, unary = true }, + { gate = "xnor", short = "=", fs_name = "XNOR", func = function(a, b) return a == b end }, + { gate = "nor", short = "!", fs_name = " NOR", func = function(a, b) return not (a or b) end }, +} + +lg.get_operations = function() + return operations +end + +-- (de)serialize +lg.serialize = function(t) + local function _op(t) + if t == nil then + return " " + elseif t.type == "io" then + return t.port + else -- t.type == "reg" + return tostring(t.n) + end + end + -- Serialize actions (gates) from eg. "and" to "&" + local function _action(action) + for i, data in ipairs(operations) do + if data.gate == action then + return data.short + end + end + return " " + end + + local s = "" + for i = 1, 14 do + local cur = t[i] + if next(cur) ~= nil then + s = s .. _op(cur.op1) .. _action(cur.action) .. _op(cur.op2) .. _op(cur.dst) + end + s = s .. "/" + end + return s +end + +lg.deserialize = function(s) + local function _op(c) + if c == "A" or c == "B" or c == "C" or c == "D" then + return {type = "io", port = c} + elseif c == " " then + return nil + else + return {type = "reg", n = tonumber(c)} + end + end + -- Deserialize actions (gates) from eg. "&" to "and" + local function _action(action) + for i, data in ipairs(operations) do + if data.short == action then + return data.gate + end + end + -- nil + end + + local ret = {} + for part in s:gmatch("(.-)/") do + local parsed + if part == "" then + parsed = {} + else + parsed = { + action = _action( part:sub(2,2) ), + op1 = _op( part:sub(1,1) ), + op2 = _op( part:sub(3,3) ), + dst = _op( part:sub(4,4) ), + } + end + ret[#ret + 1] = parsed + end + -- More than 14 instructions (write to all 10 regs + 4 outputs) + -- will not pass the write-once requirement of the validator + assert(#ret == 14) + return ret +end + +-- validation +lg.validate_single = function(t, i) + local function is_reg_written_to(t, n, max) + for i = 1, max-1 do + if next(t[i]) ~= nil + and t[i].dst and t[i].dst.type == "reg" + and t[i].dst.n == n then + return true + end + end + return false + end + local function compare_op(t1, t2, allow_same_io) + if t1 == nil or t2 == nil then + return false + elseif t1.type ~= t2.type then + return false + end + if t1.type == "reg" and t1.n == t2.n then + return true + elseif t1.type == "io" and t1.port == t2.port then + return not allow_same_io + end + return false + end + local elem = t[i] + + local gate_data + for j, data in ipairs(operations) do + if data.gate == elem.action then + gate_data = data + break + end + end + + -- check for completeness + if not gate_data then + return {i = i, msg = "Gate type is required"} + elseif gate_data.unary then + if elem.op1 ~= nil or elem.op2 == nil or elem.dst == nil then + return {i = i, msg = "Second operand (only) and destination are required"} + end + else + if elem.op1 == nil or elem.op2 == nil or elem.dst == nil then + return {i = i, msg = "Operands and destination are required"} + end + end + -- check whether operands/destination are identical + if compare_op(elem.op1, elem.op2) then + return {i = i, msg = "Operands cannot be identical"} + end + if compare_op(elem.op1, elem.dst, true) or compare_op(elem.op2, elem.dst, true) then + return {i = i, msg = "Destination and operands must be different"} + end + -- check whether operands point to defined registers + if elem.op1 ~= nil and elem.op1.type == "reg" + and not is_reg_written_to(t, elem.op1.n, i) then + return {i = i, msg = "First operand is undefined register"} + end + if elem.op2.type == "reg" and not is_reg_written_to(t, elem.op2.n, i) then + return {i = i, msg = "Second operand is undefined register"} + end + -- check whether destination points to undefined register + if elem.dst.type == "reg" and is_reg_written_to(t, elem.dst.n, i) then + return {i = i, msg = "Destination is already used register"} + end + + return nil +end + +lg.validate = function(t) + for i = 1, 14 do + if next(t[i]) ~= nil then + local r = lg.validate_single(t, i) + if r ~= nil then + return r + end + end + end + return nil +end + +-- interpreter +lg.interpret = function(t, a, b, c, d) + local function _action(s, v1, v2) + for i, data in ipairs(operations) do + if data.gate == s then + return data.func(v1, v2) + end + end + return false -- unknown gate + end + local function _op(t, regs, io_in) + if t.type == "reg" then + return regs[t.n] + else -- t.type == "io" + return io_in[t.port] + end + end + + local io_in = {A=a, B=b, C=c, D=d} + local regs = {} + local io_out = {} + for i = 1, 14 do + local cur = t[i] + if next(cur) ~= nil then + local v1, v2 + if cur.op1 ~= nil then + v1 = _op(cur.op1, regs, io_in) + end + v2 = _op(cur.op2, regs, io_in) + + local result = _action(cur.action, v1, v2) + + if cur.dst.type == "reg" then + regs[cur.dst.n] = result + else -- cur.dst.type == "io" + io_out[cur.dst.port] = result + end + end + end + return io_out.A, io_out.B, io_out.C, io_out.D +end + +return lg diff --git a/mods/mesecons/mesecons_fpga/mod.conf b/mods/mesecons/mesecons_fpga/mod.conf new file mode 100644 index 00000000..5cd52f54 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_fpga +depends = mesecons, mesecons_gamecompat +optional_depends = screwdriver diff --git a/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_copy.ogg b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_copy.ogg new file mode 100644 index 00000000..259a1bd2 Binary files /dev/null and b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_copy.ogg differ diff --git a/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_fail.ogg b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_fail.ogg new file mode 100644 index 00000000..5e9059f8 Binary files /dev/null and b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_fail.ogg differ diff --git a/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_write.ogg b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_write.ogg new file mode 100644 index 00000000..e781bff9 Binary files /dev/null and b/mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_write.ogg differ diff --git a/mods/mesecons/mesecons_fpga/spec/helper_spec.lua b/mods/mesecons/mesecons_fpga/spec/helper_spec.lua new file mode 100644 index 00000000..5f71c038 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/spec/helper_spec.lua @@ -0,0 +1,106 @@ +require("mineunit") + +fixture("mesecons_fpga") +fixture("screwdriver") + +local pos = {x = 0, y = 0, z = 0} +local pos_a = {x = -1, y = 0, z = 0} +local pos_b = {x = 0, y = 0, z = 1} +local pos_c = {x = 1, y = 0, z = 0} +local pos_d = {x = 0, y = 0, z = -1} + +describe("FPGA rotation", function() + before_each(function() + world.set_node(pos, "mesecons_fpga:fpga0000") + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("rotates I/O operands clockwise", function() + mesecon._test_program_fpga(pos, {{"A", "OR", "B", "C"}}) + + local node = world.get_node(pos) + minetest.registered_nodes[node.name].on_rotate(pos, node, nil, screwdriver.ROTATE_FACE) + + mesecon._test_place(pos_b, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons_fpga:fpga1000", world.get_node(pos).name) + + mesecon._test_dig(pos_b) + mesecon._test_place(pos_c, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal("mesecons_fpga:fpga1000", world.get_node(pos).name) + end) + + it("rotates I/O operands counterclockwise", function() + mesecon._test_program_fpga(pos, {{"A", "OR", "B", "C"}}) + + local node = world.get_node(pos) + minetest.registered_nodes[node.name].on_rotate(pos, node, nil, screwdriver.ROTATE_AXIS) + + mesecon._test_place(pos_d, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + + mesecon._test_dig(pos_d) + mesecon._test_place(pos_a, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + end) + + it("updates ports", function() + mesecon._test_program_fpga(pos, {{"NOT", "A", "B"}}) + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + + local node = world.get_node(pos) + minetest.registered_nodes[node.name].on_rotate(pos, node, nil, screwdriver.ROTATE_AXIS) + assert.equal("mesecons_fpga:fpga0001", world.get_node(pos).name) + end) +end) + +describe("FPGA programmer", function() + local pos2 = {x = 10, y = 0, z = 0} + + before_each(function() + world.set_node(pos, "mesecons_fpga:fpga0000") + world.set_node(pos2, "mesecons_fpga:fpga0000") + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("transfers instructions", function() + mesecon._test_program_fpga(pos2, {{"NOT", "A", "B"}}) + mesecon._test_paste_fpga_program(pos, mesecon._test_copy_fpga_program(pos2)) + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + end) + + it("does not copy from new FPGAs", function() + mesecon._test_program_fpga(pos, {{"NOT", "A", "B"}}) + mesecon._test_paste_fpga_program(pos, mesecon._test_copy_fpga_program(pos2)) + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + end) + + it("does not copy from cleared FPGAs", function() + mesecon._test_program_fpga(pos, {{"NOT", "A", "B"}}) + mesecon._test_program_fpga(pos2, {{"=", "A", "B"}}) + mesecon._test_program_fpga(pos2, {}) + mesecon._test_paste_fpga_program(pos, mesecon._test_copy_fpga_program(pos2)) + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + end) + + it("does not copy from non-FPGA nodes", function() + mesecon._test_program_fpga(pos, {{"NOT", "A", "B"}}) + mesecon._test_paste_fpga_program(pos, mesecon._test_copy_fpga_program(vector.add(pos2, 1))) + assert.equal("mesecons_fpga:fpga0010", world.get_node(pos).name) + end) +end) diff --git a/mods/mesecons/mesecons_fpga/spec/logic_spec.lua b/mods/mesecons/mesecons_fpga/spec/logic_spec.lua new file mode 100644 index 00000000..73882dd6 --- /dev/null +++ b/mods/mesecons/mesecons_fpga/spec/logic_spec.lua @@ -0,0 +1,235 @@ +require("mineunit") + +fixture("mesecons_fpga") + +describe("FPGA logic", function() + local pos = {x = 0, y = 0, z = 0} + local pos_a = {x = -1, y = 0, z = 0} + local pos_b = {x = 0, y = 0, z = 1} + local pos_c = {x = 1, y = 0, z = 0} + local pos_d = {x = 0, y = 0, z = -1} + + local fpga_set = false + + local function set_fpga() + if not fpga_set then + world.set_node(pos, "mesecons_fpga:fpga0000") + fpga_set = true + end + end + before_each(set_fpga) + + local function reset_world() + if fpga_set then + mesecon._test_reset() + world.clear() + fpga_set = false + end + end + after_each(reset_world) + + local function test_program(inputs, outputs, program) + set_fpga() + + mesecon._test_program_fpga(pos, program) + + if inputs.a then mesecon._test_place(pos_a, "mesecons:test_receptor_on") end + if inputs.b then mesecon._test_place(pos_b, "mesecons:test_receptor_on") end + if inputs.c then mesecon._test_place(pos_c, "mesecons:test_receptor_on") end + if inputs.d then mesecon._test_place(pos_d, "mesecons:test_receptor_on") end + mineunit:execute_globalstep() -- Execute receptor_on actions + mineunit:execute_globalstep() -- Execute activate/change actions + + local expected_name = "mesecons_fpga:fpga" + .. (outputs.d and 1 or 0) .. (outputs.c and 1 or 0) + .. (outputs.b and 1 or 0) .. (outputs.a and 1 or 0) + assert.equal(expected_name, world.get_node(pos).name) + + reset_world() + end + + it("operator and", function() + local prog = {{"A", "AND", "B", "C"}} + test_program({}, {}, prog) + test_program({a = true}, {}, prog) + test_program({b = true}, {}, prog) + test_program({a = true, b = true}, {c = true}, prog) + end) + + it("operator or", function() + local prog = {{"A", "OR", "B", "C"}} + test_program({}, {}, prog) + test_program({a = true}, {c = true}, prog) + test_program({b = true}, {c = true}, prog) + test_program({a = true, b = true}, {c = true}, prog) + end) + + it("operator not", function() + local prog = {{"NOT", "A", "B"}} + test_program({}, {b = true}, prog) + test_program({a = true}, {}, prog) + end) + + it("operator xor", function() + local prog = {{"A", "XOR", "B", "C"}} + test_program({}, {}, prog) + test_program({a = true}, {c = true}, prog) + test_program({b = true}, {c = true}, prog) + test_program({a = true, b = true}, {}, prog) + end) + + it("operator nand", function() + local prog = {{"A", "NAND", "B", "C"}} + test_program({}, {c = true}, prog) + test_program({a = true}, {c = true}, prog) + test_program({b = true}, {c = true}, prog) + test_program({a = true, b = true}, {}, prog) + end) + + it("operator buf", function() + local prog = {{"=", "A", "B"}} + test_program({}, {}, prog) + test_program({a = true}, {b = true}, prog) + end) + + it("operator xnor", function() + local prog = {{"A", "XNOR", "B", "C"}} + test_program({}, {c = true}, prog) + test_program({a = true}, {}, prog) + test_program({b = true}, {}, prog) + test_program({a = true, b = true}, {c = true}, prog) + end) + + it("operator nor", function() + local prog = {{"A", "NOR", "B", "C"}} + test_program({}, {c = true}, prog) + test_program({a = true}, {}, prog) + test_program({b = true}, {}, prog) + test_program({a = true, b = true}, {}, prog) + end) + + it("rejects duplicate operands", function() + test_program({a = true}, {}, {{"A", "OR", "A", "B"}}) + test_program({a = true}, {}, {{"=", "A", "0"}, {"0", "OR", "0", "B"}}) + end) + + it("rejects unassigned memory operands", function() + test_program({a = true}, {}, {{"A", "OR", "0", "B"}}) + test_program({a = true}, {}, {{"0", "OR", "A", "B"}}) + end) + + it("rejects double memory assignment", function() + test_program({a = true}, {}, {{"=", "A", "0"}, {"=", "A", "0"}, {"=", "0", "B"}}) + end) + + it("rejects assignment to memory operand", function() + test_program({a = true}, {}, {{"=", "A", "0"}, {"A", "OR", "0", "0"}, {"=", "0", "B"}}) + end) + + it("allows double port assignment", function() + test_program({a = true}, {b = true}, {{"NOT", "A", "B"}, {"=", "A", "B"}}) + end) + + it("allows assignment to port operand", function() + test_program({a = true}, {b = true}, {{"A", "OR", "B", "B"}}) + end) + + it("preserves initial pin states", function() + test_program({a = true}, {b = true}, {{"=", "A", "B"}, {"=", "B", "C"}}) + end) + + it("rejects binary operations with single operands", function() + test_program({a = true}, {}, {{"=", "A", "B"}, {" ", "OR", "A", "C"}}) + test_program({a = true}, {}, {{"=", "A", "B"}, {"A", "OR", " ", "C"}}) + end) + + it("rejects unary operations with first operands", function() + test_program({a = true}, {}, {{"=", "A", "B"}, {"A", "=", " ", "C"}}) + end) + + it("rejects operations without destinations", function() + test_program({a = true}, {}, {{"=", "A", "B"}, {"=", "A", " "}}) + end) + + it("allows blank statements", function() + test_program({a = true}, {b = true, c = true}, { + {" ", " ", " ", " "}, + {"=", "A", "B"}, + {" ", " ", " ", " "}, + {" ", " ", " ", " "}, + {"=", "A", "C"}, + }) + end) + + it("transmits output signals to adjacent nodes", function() + mesecon._test_program_fpga(pos, { + {"=", "A", "B"}, + {"=", "A", "C"}, + {"NOT", "A", "D"}, + }) + mesecon._test_place(pos_b, "mesecons:test_effector") + mesecon._test_place(pos_c, "mesecons:test_effector") + mesecon._test_place(pos_d, "mesecons:test_effector") + mineunit:execute_globalstep() -- Execute receptor_on actions + mineunit:execute_globalstep() -- Execute activate/change actions + + -- Makes an object from the last three effector events in the list for use with assert.same. + -- This is necessary to ignore the ordering of events. + local function event_tester(list) + local o = {list[#list - 2], list[#list - 1], list[#list - 0]} + table.sort(o, function(a, b) + local fmt = "%s %d %d %d" + return fmt:format(a[1], a[2].x, a[2].y, a[2].z) < fmt:format(b[1], b[2].x, b[2].y, b[2].z) + end) + return o + end + + mesecon._test_place(pos_a, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal("mesecons_fpga:fpga0110", world.get_node(pos).name) + assert.same(event_tester({{"on", pos_b}, {"on", pos_c}, {"off", pos_d}}), event_tester(mesecon._test_effector_events)) + + mesecon._test_dig(pos_a) + mineunit:execute_globalstep() -- Execute receptor_off action + mineunit:execute_globalstep() -- Execute deactivate/change actions + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal("mesecons_fpga:fpga1000", world.get_node(pos).name) + assert.same(event_tester({{"off", pos_b}, {"off", pos_c}, {"on", pos_d}}), event_tester(mesecon._test_effector_events)) + end) + + it("considers past outputs in determining inputs", function() + -- Memory cell: Turning on A turns on C; turning on B turns off C. + mesecon._test_program_fpga(pos, { + {"A", "OR", "C", "0"}, + {"B", "OR", "D", "1"}, + {"NOT", "A", "2"}, + {"NOT", "B", "3"}, + {"0", "AND", "3", "C"}, + {"1", "AND", "2", "D"}, + }) + + mesecon._test_place(pos_a, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on actions + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons_fpga:fpga0100", world.get_node(pos).name) + + mesecon._test_dig(pos_a) + mineunit:execute_globalstep() -- Execute receptor_off actions + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal("mesecons_fpga:fpga0100", world.get_node(pos).name) + + mesecon._test_place(pos_b, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on actions + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons_fpga:fpga1000", world.get_node(pos).name) + + mesecon._test_dig(pos_b) + mineunit:execute_globalstep() -- Execute receptor_off actions + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal("mesecons_fpga:fpga1000", world.get_node(pos).name) + end) +end) diff --git a/mods/mesecons/mesecons_fpga/spec/mineunit.conf b/mods/mesecons/mesecons_fpga/spec/mineunit.conf new file mode 100644 index 00000000..81bd36ce --- /dev/null +++ b/mods/mesecons/mesecons_fpga/spec/mineunit.conf @@ -0,0 +1 @@ +fixture_paths = {"../.test_fixtures"} diff --git a/mods/mesecons/mesecons_fpga/textures/jeija_fpga_programmer.png b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_programmer.png new file mode 100644 index 00000000..78e7fb1f Binary files /dev/null and b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_programmer.png differ diff --git a/mods/mesecons/mesecons_fpga/textures/jeija_fpga_sides.png b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_sides.png new file mode 100644 index 00000000..ed4f97dd Binary files /dev/null and b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_sides.png differ diff --git a/mods/mesecons/mesecons_fpga/textures/jeija_fpga_top.png b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_top.png new file mode 100644 index 00000000..8382486f Binary files /dev/null and b/mods/mesecons/mesecons_fpga/textures/jeija_fpga_top.png differ diff --git a/mods/mesecons/mesecons_fpga/tool.lua b/mods/mesecons/mesecons_fpga/tool.lua new file mode 100644 index 00000000..e0aff3bc --- /dev/null +++ b/mods/mesecons/mesecons_fpga/tool.lua @@ -0,0 +1,73 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +return function(plg) + + +minetest.register_tool("mesecons_fpga:programmer", { + description = S("FPGA Programmer"), + inventory_image = "jeija_fpga_programmer.png", + stack_max = 1, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name:find("mesecons_fpga:fpga") ~= 1 then + return itemstack + end + + local meta = minetest.get_meta(pos) + if meta:get_string("instr") == "//////////////" then + minetest.chat_send_player(placer:get_player_name(), "This FPGA is unprogrammed.") + minetest.sound_play("mesecons_fpga_fail", { pos = placer:get_pos(), gain = 0.1, max_hear_distance = 4 }, true) + return itemstack + end + itemstack:get_meta():set_string("", meta:get_string("instr")) + minetest.chat_send_player(placer:get_player_name(), "FPGA gate configuration was successfully copied!") + minetest.sound_play("mesecons_fpga_copy", { pos = placer:get_pos(), gain = 0.1, max_hear_distance = 4 }, true) + + return itemstack + end, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name:find("mesecons_fpga:fpga") ~= 1 then + return itemstack + end + local player_name = user:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + local imeta = itemstack:get_meta():get_string("") + if imeta == "" then + minetest.chat_send_player(player_name, "Use shift+right-click to copy a gate configuration first.") + minetest.sound_play("mesecons_fpga_fail", { pos = user:get_pos(), gain = 0.1, max_hear_distance = 4 }, true) + return itemstack + end + + local meta = minetest.get_meta(pos) + meta:set_string("instr", imeta) + plg.update_meta(pos, imeta) + minetest.chat_send_player(player_name, "Gate configuration was successfully written to FPGA!") + minetest.sound_play("mesecons_fpga_write", { pos = user:get_pos(), gain = 0.1, max_hear_distance = 4 }, true) + + return itemstack + end +}) + +minetest.register_craft({ + output = "mesecons_fpga:programmer", + recipe = { + {'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon'}, + } +}) + + +end diff --git a/mods/mesecons/mesecons_gamecompat/compat_mcl.lua b/mods/mesecons/mesecons_gamecompat/compat_mcl.lua new file mode 100644 index 00000000..10e1a8a1 --- /dev/null +++ b/mods/mesecons/mesecons_gamecompat/compat_mcl.lua @@ -0,0 +1,43 @@ + +--Aliases + +minetest.register_alias("mesecons_gamecompat:chest", "mcl_chests:chest") +minetest.register_alias("mesecons_gamecompat:chest_locked", "mcl_chests:chest") +minetest.register_alias("mesecons_gamecompat:coalblock", "mcl_core:coalblock") +minetest.register_alias("mesecons_gamecompat:cobble", "mcl_core:cobble") +minetest.register_alias("mesecons_gamecompat:glass", "mcl_core:glass") +minetest.register_alias("mesecons_gamecompat:lava_source", "mcl_core:lava_source") +minetest.register_alias("mesecons_gamecompat:mese", "mesecons:redstoneblock") +minetest.register_alias("mesecons_gamecompat:mese_crystal", "mesecoms:redstone") +minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "mesecons:redstone") +minetest.register_alias("mesecons_gamecompat:obsidian_glass", "mcl_core:glass") +minetest.register_alias("mesecons_gamecompat:stone", "mcl_core:stone") +minetest.register_alias("mesecons_gamecompat:steel_ingot", "mcl_core:iron_ingot") +minetest.register_alias("mesecons_gamecompat:steelblock", "mcl_core:steelblock") +minetest.register_alias("mesecons_gamecompat:torch", "mcl_torches:torch") + +if minetest.get_modpath("mcl_dyes") then + for color, def in ipairs(mcl_dyes.colors) do + minetest.register_alias("mesecons_gamecompat:dye_" .. def.mcl2, "mcl_dyes:" .. color) + end +end + +-- Sounds + +mesecon.node_sound.default = mcl_sounds.node_sound_defaults() +mesecon.node_sound.glass = mcl_sounds.node_sound_glass_defaults() +mesecon.node_sound.leaves = mcl_sounds.node_sound_leaves_defaults() +mesecon.node_sound.stone = mcl_sounds.node_sound_stone_defaults() +mesecon.node_sound.wood = mcl_sounds.node_sound_wood_defaults() + +if minetest.get_modpath("mcl_fire") then + mesecon.sound_name.fire = "fire_fire" +end + +if minetest.get_modpath("mcl_tnt") then + mesecon.sound_name.explode = "tnt_explode" +end + +-- Textures + +mesecon.texture.steel_block = "default_steel_block.png" diff --git a/mods/mesecons/mesecons_gamecompat/compat_mtg.lua b/mods/mesecons/mesecons_gamecompat/compat_mtg.lua new file mode 100644 index 00000000..e658880d --- /dev/null +++ b/mods/mesecons/mesecons_gamecompat/compat_mtg.lua @@ -0,0 +1,75 @@ +--Aliases + +minetest.register_alias("mesecons_gamecompat:chest", "default:chest") +minetest.register_alias("mesecons_gamecompat:chest_locked", "default:chest_locked") +minetest.register_alias("mesecons_gamecompat:coalblock", "default:coalblock") +minetest.register_alias("mesecons_gamecompat:cobble", "default:cobble") +minetest.register_alias("mesecons_gamecompat:glass", "default:glass") +minetest.register_alias("mesecons_gamecompat:lava_source", "default:lava_source") +minetest.register_alias("mesecons_gamecompat:mese", "default:mese") +minetest.register_alias("mesecons_gamecompat:mese_crystal", "default:mese_crystal") +minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "default:mese_crystal_fragment") +minetest.register_alias("mesecons_gamecompat:obsidian_glass", "default:obsidian_glass") +minetest.register_alias("mesecons_gamecompat:stone", "default:stone") +minetest.register_alias("mesecons_gamecompat:steel_ingot", "default:steel_ingot") +minetest.register_alias("mesecons_gamecompat:steelblock", "default:steelblock") +minetest.register_alias("mesecons_gamecompat:torch", "default:torch") + +if minetest.get_modpath("dye") then + for _, color in ipairs(mesecon.dye_colors) do + minetest.register_alias("mesecons_gamecompat:dye_" .. color, "dye:" .. color) + end +end + +-- Sounds + +mesecon.node_sound.default = default.node_sound_defaults() +mesecon.node_sound.glass = default.node_sound_glass_defaults() +mesecon.node_sound.leaves = default.node_sound_leaves_defaults() +mesecon.node_sound.stone = default.node_sound_stone_defaults() +mesecon.node_sound.wood = default.node_sound_wood_defaults() + +if minetest.get_modpath("fire") then + mesecon.sound_name.fire = "fire_fire" +end + +if minetest.get_modpath("tnt") then + mesecon.sound_name.explode = "tnt_explode" +end + +-- Textures + +mesecon.texture.steel_block = "default_steel_block.png" + +-- MVPS stoppers + +if minetest.get_modpath("mesecons_mvps") then + -- All of the locked and internal nodes in Minetest Game + for _, name in ipairs({ + "default:chest_locked", + "default:chest_locked_open", + "doors:door_steel_b_1", -- old style doors + "doors:door_steel_b_2", -- + "doors:door_steel_t_1", -- + "doors:door_steel_t_2", -- + "doors:door_steel_a", -- new style doors + "doors:door_steel_b", -- + "doors:door_steel_c", -- + "doors:door_steel_d", -- + "doors:hidden", + "doors:trapdoor_steel", + "doors:trapdoor_steel_open", + "beds:bed_bottom", + "beds:bed_top", + "beds:fancy_bed_bottom", + "beds:fancy_bed_top", + "xpanes:door_steel_bar_a", + "xpanes:door_steel_bar_b", + "xpanes:door_steel_bar_c", + "xpanes:door_steel_bar_d", + "xpanes:trapdoor_steel_bar", + "xpanes:trapdoor_steel_bar_open", + }) do + mesecon.register_mvps_stopper(name) + end +end diff --git a/mods/mesecons/mesecons_gamecompat/init.lua b/mods/mesecons/mesecons_gamecompat/init.lua new file mode 100644 index 00000000..95c088e9 --- /dev/null +++ b/mods/mesecons/mesecons_gamecompat/init.lua @@ -0,0 +1,20 @@ +mesecon.node_sound = {} + +mesecon.sound_name = {} + +mesecon.texture = {} + +mesecon.dye_colors = { + "red", "green", "blue", "grey", "dark_grey", "yellow", + "orange", "white", "pink", "magenta", "cyan", "violet", +} + +if minetest.get_modpath("default") then + minetest.log("info", "Mesecons: detected Minetest Game for game compatibility") + dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mtg.lua") +end + +if minetest.get_modpath("mcl_core") then + minetest.log("info", "Mesecons: detected MineClonia Game for game compatibility") + dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mcl.lua") +end diff --git a/mods/mesecons/mesecons_gamecompat/mod.conf b/mods/mesecons/mesecons_gamecompat/mod.conf new file mode 100644 index 00000000..997f41f1 --- /dev/null +++ b/mods/mesecons/mesecons_gamecompat/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_gamecompat +depends = mesecons +optional_depends = fire, default, dye, mesecons_mvps, tnt, mcl_fire, mcl_core, mcl_dye, mcl_tnt diff --git a/mods/mesecons/mesecons_gates/doc/and/description.html b/mods/mesecons/mesecons_gates/doc/and/description.html new file mode 100644 index 00000000..e8aff919 --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/and/description.html @@ -0,0 +1,2 @@ +AND gates power their output if both inputs (from left and right) are powered. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/and/preview.png b/mods/mesecons/mesecons_gates/doc/and/preview.png new file mode 100644 index 00000000..d3b29365 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/and/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/and/recipe.png b/mods/mesecons/mesecons_gates/doc/and/recipe.png new file mode 100644 index 00000000..b81680a1 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/and/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/diode/description.html b/mods/mesecons/mesecons_gates/doc/diode/description.html new file mode 100644 index 00000000..b96aced5 --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/diode/description.html @@ -0,0 +1,2 @@ +Diodes conduct signals in one direction only. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/diode/preview.png b/mods/mesecons/mesecons_gates/doc/diode/preview.png new file mode 100644 index 00000000..dc961d90 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/diode/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/diode/recipe.png b/mods/mesecons/mesecons_gates/doc/diode/recipe.png new file mode 100644 index 00000000..bce3562d Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/diode/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/nand/description.html b/mods/mesecons/mesecons_gates/doc/nand/description.html new file mode 100644 index 00000000..c46a7e1a --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/nand/description.html @@ -0,0 +1,2 @@ +NAND gates do not power their output if both inputs (from left and right) are powered, but power it in every other case. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/nand/preview.png b/mods/mesecons/mesecons_gates/doc/nand/preview.png new file mode 100644 index 00000000..364d6c37 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/nand/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/nand/recipe.png b/mods/mesecons/mesecons_gates/doc/nand/recipe.png new file mode 100644 index 00000000..a1ee6189 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/nand/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/nor/description.html b/mods/mesecons/mesecons_gates/doc/nor/description.html new file mode 100644 index 00000000..7d539536 --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/nor/description.html @@ -0,0 +1,2 @@ +NOR gates only power their output if none of their two inputs is powered. They are basically OR gates with a NOT gate at their output. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/nor/preview.png b/mods/mesecons/mesecons_gates/doc/nor/preview.png new file mode 100644 index 00000000..d733fd7d Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/nor/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/nor/recipe.png b/mods/mesecons/mesecons_gates/doc/nor/recipe.png new file mode 100644 index 00000000..a801d8ff Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/nor/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/not/description.html b/mods/mesecons/mesecons_gates/doc/not/description.html new file mode 100644 index 00000000..5a08423e --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/not/description.html @@ -0,0 +1,2 @@ +NOT gates invert signals, just like a mesecon torch does, but faster. The input is at the opposite side of the output. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/not/preview.png b/mods/mesecons/mesecons_gates/doc/not/preview.png new file mode 100644 index 00000000..3680c155 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/not/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/not/recipe.png b/mods/mesecons/mesecons_gates/doc/not/recipe.png new file mode 100644 index 00000000..b5ec6a87 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/not/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/or/description.html b/mods/mesecons/mesecons_gates/doc/or/description.html new file mode 100644 index 00000000..15d598f7 --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/or/description.html @@ -0,0 +1,2 @@ +OR gates power their output if either of their inputs (or both) are powered. You could basically get the same behaviour with two diodes, but OR gates save some space. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/or/preview.png b/mods/mesecons/mesecons_gates/doc/or/preview.png new file mode 100644 index 00000000..0c46aa1e Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/or/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/or/recipe.png b/mods/mesecons/mesecons_gates/doc/or/recipe.png new file mode 100644 index 00000000..58a12564 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/or/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/doc/xor/description.html b/mods/mesecons/mesecons_gates/doc/xor/description.html new file mode 100644 index 00000000..74f8b5fd --- /dev/null +++ b/mods/mesecons/mesecons_gates/doc/xor/description.html @@ -0,0 +1,2 @@ +XOR gates power their output if only one input is powered, they're off if either both or none of the inputs is powered. +They work in unloaded blocks. diff --git a/mods/mesecons/mesecons_gates/doc/xor/preview.png b/mods/mesecons/mesecons_gates/doc/xor/preview.png new file mode 100644 index 00000000..0bc24c6c Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/xor/preview.png differ diff --git a/mods/mesecons/mesecons_gates/doc/xor/recipe.png b/mods/mesecons/mesecons_gates/doc/xor/recipe.png new file mode 100644 index 00000000..f7108993 Binary files /dev/null and b/mods/mesecons/mesecons_gates/doc/xor/recipe.png differ diff --git a/mods/mesecons/mesecons_gates/init.lua b/mods/mesecons/mesecons_gates/init.lua new file mode 100644 index 00000000..7e21f2fb --- /dev/null +++ b/mods/mesecons/mesecons_gates/init.lua @@ -0,0 +1,183 @@ +local selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } +} + +local nodebox = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + { -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 } + }, +} + +local gate_get_output_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}}) + +local gate_get_input_rules_oneinput = mesecon.horiz_rules_getter({{x =-1, y = 0, z = 0}}) + +local gate_get_input_rules_twoinputs = mesecon.horiz_rules_getter({ + {x = 0, y = 0, z = 1, name = "input1"}, + {x = 0, y = 0, z = -1, name = "input2"}, +}) + +local function set_gate(pos, node, state) + local gate = minetest.registered_nodes[node.name] + + local new_nodename = state and gate.onstate or gate.offstate + minetest.swap_node(pos, {name = new_nodename, param2 = node.param2}) + if new_nodename ~= node.name then + if mesecon.do_overheat(pos) then + minetest.remove_node(pos) + mesecon.receptor_off(pos, gate_get_output_rules(node)) + minetest.add_item(pos, gate.drop) + elseif state then + mesecon.receptor_on(pos, gate_get_output_rules(node)) + else + mesecon.receptor_off(pos, gate_get_output_rules(node)) + end + end +end + +local function update_gate(pos, node, link, newstate) + local gate = minetest.registered_nodes[node.name] + + if gate.inputnumber == 1 then + set_gate(pos, node, gate.assess(newstate == "on")) + elseif gate.inputnumber == 2 then + -- Inputs are stored in param2. Bit 5 is always set. + -- input1 is bit 6 and input2 is bit 7. + local val1, val2 + if node.param2 >= 32 then + -- Bit 5 is set, so param2 is in the proper format. + if link.name == "input1" then + val1 = newstate == "on" + val2 = node.param2 >= 128 + else + val1 = node.param2 % 128 >= 64 + val2 = newstate == "on" + end + else + -- Migrate old gates where the inputs are stored as metadata. + -- This also triggers for newly placed gates. + local meta = minetest.get_meta(pos) + if link.name == "input1" then + val1 = newstate == "on" + val2 = meta:get_int("input2") == 1 + else + val1 = meta:get_int("input1") == 1 + val2 = newstate == "on" + end + -- Set bit 5 so this won't happen again. + node.param2 = node.param2 + 32 + -- Clear the metadata. + meta:set_string("input1", "") + meta:set_string("input2", "") + end + node.param2 = node.param2 % 64 + (val1 and 64 or 0) + (val2 and 128 or 0) + set_gate(pos, node, gate.assess(val1, val2)) + end +end + +local function register_gate(name, inputnumber, assess, recipe, description) + local get_inputrules = inputnumber == 2 and gate_get_input_rules_twoinputs or + gate_get_input_rules_oneinput + + local basename = "mesecons_gates:"..name + mesecon.register_node(basename, { + description = description, + inventory_image = "jeija_gate_off.png^jeija_gate_"..name..".png", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drawtype = "nodebox", + drop = basename.."_off", + selection_box = selection_box, + node_box = nodebox, + walkable = true, + sounds = mesecon.node_sound.stone, + assess = assess, + onstate = basename.."_on", + offstate = basename.."_off", + inputnumber = inputnumber, + after_dig_node = mesecon.do_cooldown, + on_rotate = mesecon.on_rotate_horiz, + },{ + tiles = { + "jeija_microcontroller_bottom.png^".."jeija_gate_off.png^".. + "jeija_gate_output_off.png^".."jeija_gate_"..name..".png", + "jeija_microcontroller_bottom.png^".."jeija_gate_output_off.png^".. + "[transformFY", + "jeija_gate_side.png^".."jeija_gate_side_output_off.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + "jeija_gate_side.png" + }, + groups = {dig_immediate = 2, overheat = 1}, + mesecons = { receptor = { + state = "off", + rules = gate_get_output_rules + }, effector = { + rules = get_inputrules, + action_change = update_gate + }} + },{ + tiles = { + "jeija_microcontroller_bottom.png^".."jeija_gate_on.png^".. + "jeija_gate_output_on.png^".."jeija_gate_"..name..".png", + "jeija_microcontroller_bottom.png^".."jeija_gate_output_on.png^".. + "[transformFY", + "jeija_gate_side.png^".."jeija_gate_side_output_on.png", + "jeija_gate_side.png", + "jeija_gate_side.png", + "jeija_gate_side.png" + }, + groups = {dig_immediate = 2, not_in_creative_inventory = 1, overheat = 1}, + mesecons = { receptor = { + state = "on", + rules = gate_get_output_rules + }, effector = { + rules = get_inputrules, + action_change = update_gate + }} + }) + + minetest.register_craft({output = basename.."_off", recipe = recipe}) +end + +register_gate("diode", 1, function (input) return input end, + {{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons_torch:mesecon_torch_on"}}, + "Diode") + +register_gate("not", 1, function (input) return not input end, + {{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons:mesecon"}}, + "NOT Gate") + +register_gate("and", 2, function (val1, val2) return val1 and val2 end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons:mesecon"}, + {"mesecons:mesecon", "", ""}}, + "AND Gate") + +register_gate("nand", 2, function (val1, val2) return not (val1 and val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons_torch:mesecon_torch_on"}, + {"mesecons:mesecon", "", ""}}, + "NAND Gate") + +register_gate("xor", 2, function (val1, val2) return (val1 or val2) and not (val1 and val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons_materials:silicon"}, + {"mesecons:mesecon", "", ""}}, + "XOR Gate") + +register_gate("nor", 2, function (val1, val2) return not (val1 or val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons:mesecon", "mesecons_torch:mesecon_torch_on"}, + {"mesecons:mesecon", "", ""}}, + "NOR Gate") + +register_gate("or", 2, function (val1, val2) return (val1 or val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons:mesecon", "mesecons:mesecon"}, + {"mesecons:mesecon", "", ""}}, + "OR Gate") diff --git a/mods/mesecons/mesecons_gates/mod.conf b/mods/mesecons/mesecons_gates/mod.conf new file mode 100644 index 00000000..f89c8842 --- /dev/null +++ b/mods/mesecons/mesecons_gates/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_gates +depends = mesecons, mesecons_gamecompat, mesecons_microcontroller, mesecons_delayer, mesecons_torch, mesecons_materials diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png new file mode 100644 index 00000000..825a22be Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png new file mode 100644 index 00000000..49c2076a Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png new file mode 100644 index 00000000..f14567bc Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_nor.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_nor.png new file mode 100644 index 00000000..c4218bc1 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_nor.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png new file mode 100644 index 00000000..27b7281a Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_or.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_or.png new file mode 100644 index 00000000..3180add9 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_or.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png new file mode 100644 index 00000000..df13e969 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/description.html b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/description.html new file mode 100644 index 00000000..6153d515 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/description.html @@ -0,0 +1,2 @@ +Water turbines are receptors that turn on if flowing water is above them. +They only work in active blocks; in inactive blocks they keep their old state. diff --git a/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/preview.png b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/preview.png new file mode 100644 index 00000000..b45ca238 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/preview.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/recipe.png b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/recipe.png new file mode 100644 index 00000000..8c8141ee Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/doc/waterturbine/recipe.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/init.lua b/mods/mesecons/mesecons_hydroturbine/init.lua new file mode 100644 index 00000000..6d0038cc --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/init.lua @@ -0,0 +1,106 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- HYDRO_TURBINE +-- Water turbine: +-- Active if flowing >water< above it +-- (does not work with other liquids) + +minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", { + drawtype = "mesh", + mesh = "jeija_hydro_turbine_off.obj", + tiles = { + "jeija_hydro_turbine_sides_off.png", + "jeija_hydro_turbine_top_bottom.png", + "jeija_hydro_turbine_turbine_top_bottom_off.png", + "jeija_hydro_turbine_turbine_misc_off.png" + }, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil, + inventory_image = "jeija_hydro_turbine_inv.png", + is_ground_content = false, + wield_scale = {x=0.75, y=0.75, z=0.75}, + groups = {dig_immediate=2}, + description = S("Water Turbine"), + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, + }, + sounds = mesecon.node_sound.metal, + mesecons = {receptor = { + state = mesecon.state.off + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", { + drawtype = "mesh", + is_ground_content = false, + mesh = "jeija_hydro_turbine_on.obj", + wield_scale = {x=0.75, y=0.75, z=0.75}, + tiles = { + "jeija_hydro_turbine_sides_on.png", + "jeija_hydro_turbine_top_bottom.png", + { name = "jeija_hydro_turbine_turbine_top_bottom_on.png", + animation = {type = "vertical_frames", aspect_w = 128, aspect_h = 16, length = 1.6} }, + { name = "jeija_hydro_turbine_turbine_misc_on.png", + animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} } + }, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil, + inventory_image = "jeija_hydro_turbine_inv.png", + drop = "mesecons_hydroturbine:hydro_turbine_off 1", + groups = {dig_immediate=2,not_in_creative_inventory=1}, + description = S("Water Turbine"), + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, + }, + sounds = mesecon.node_sound.metal, + mesecons = {receptor = { + state = mesecon.state.on + }}, + on_blast = mesecon.on_blastnode, +}) + + +local function is_flowing_water(pos) + local name = minetest.get_node(pos).name + local is_water = minetest.get_item_group(name, "water") > 0 + local def = minetest.registered_items[name] + return is_water and (def and def.liquidtype == "flowing") +end + +minetest.register_abm({ +nodenames = {"mesecons_hydroturbine:hydro_turbine_off"}, + interval = 1, + chance = 1, + action = function(pos) + local waterpos={x=pos.x, y=pos.y+1, z=pos.z} + if is_flowing_water(waterpos) then + minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"}) + mesecon.receptor_on(pos) + end + end, +}) + +minetest.register_abm({ +nodenames = {"mesecons_hydroturbine:hydro_turbine_on"}, + interval = 1, + chance = 1, + action = function(pos) + local waterpos={x=pos.x, y=pos.y+1, z=pos.z} + if not is_flowing_water(waterpos) then + minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"}) + mesecon.receptor_off(pos) + end + end, +}) + +minetest.register_craft({ + output = "mesecons_hydroturbine:hydro_turbine_off 2", + recipe = { + {"","group:stick", ""}, + {"group:stick", "mesecons_gamecompat:steel_ingot", "group:stick"}, + {"","group:stick", ""}, + } +}) diff --git a/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.de.tr b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.de.tr new file mode 100644 index 00000000..6c5d8f96 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_hydroturbine +Water Turbine=Wasserturbine diff --git a/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.eo.tr b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.eo.tr new file mode 100644 index 00000000..7ca3172c --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_hydroturbine + +### init.lua ### +Water Turbine=Akva Turbino diff --git a/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.fr.tr b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.fr.tr new file mode 100644 index 00000000..14e1267b --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_hydroturbine + +### init.lua ### +Water Turbine=Détecteur de courant diff --git a/mods/mesecons/mesecons_hydroturbine/locale/template.txt b/mods/mesecons/mesecons_hydroturbine/locale/template.txt new file mode 100644 index 00000000..ebf89211 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_hydroturbine + +### init.lua ### +Water Turbine= diff --git a/mods/mesecons/mesecons_hydroturbine/mod.conf b/mods/mesecons/mesecons_hydroturbine/mod.conf new file mode 100644 index 00000000..98a3090b --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_hydroturbine +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_off.obj b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_off.obj new file mode 100644 index 00000000..5cd5c969 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_off.obj @@ -0,0 +1,429 @@ +# Blender v2.72 (sub 0) OBJ File: 'mesecons-water-turbine.blend' +# www.blender.org +o Cylinder.002_Cylinder.003 +v 0.000000 0.496094 -0.150000 +v 0.000000 0.562500 -0.150000 +v 0.106066 0.496094 -0.106066 +v 0.106066 0.562500 -0.106066 +v 0.150000 0.496094 0.000000 +v 0.150000 0.562500 0.000000 +v 0.106066 0.496094 0.106066 +v 0.106066 0.562500 0.106066 +v -0.000000 0.496094 0.150000 +v -0.000000 0.562500 0.150000 +v -0.106066 0.496094 0.106066 +v -0.106066 0.562500 0.106066 +v -0.150000 0.496094 -0.000000 +v -0.150000 0.562500 -0.000000 +v -0.106066 0.496094 -0.106066 +v -0.106066 0.562500 -0.106066 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490393 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.625000 -0.097545 +v 0.415735 0.625000 -0.277785 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490393 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 0.656250 -0.097545 +v 0.415735 0.656250 -0.277785 +v 0.277785 0.656250 -0.415735 +v 0.116233 0.634645 -0.436100 +v 0.116233 1.482640 -0.436100 +v 0.299524 0.634645 -0.186124 +v 0.299524 1.482640 -0.186124 +v 0.343405 0.634645 0.080186 +v 0.343405 1.482640 0.080186 +v 0.186124 0.634645 0.299524 +v 0.186124 1.482640 0.299524 +v -0.080186 0.634645 0.343405 +v -0.080186 1.482640 0.343405 +v -0.299524 0.634645 0.186124 +v -0.299524 1.482640 0.186124 +v -0.343405 0.634645 -0.080186 +v -0.343405 1.482640 -0.080186 +v -0.186124 0.634645 -0.299524 +v -0.186124 1.482640 -0.299524 +v 0.080186 0.634645 -0.343405 +v 0.080186 1.482640 -0.343405 +v 0.390559 1.482640 -0.226180 +v 0.390559 0.634645 -0.226180 +v 0.436100 1.482640 0.116233 +v 0.436100 0.634645 0.116233 +v 0.226180 1.482640 0.390559 +v 0.226180 0.634645 0.390559 +v -0.116233 1.482640 0.436100 +v -0.116233 0.634645 0.436100 +v -0.390559 1.482640 0.226180 +v -0.390559 0.634645 0.226180 +v -0.436100 1.482640 -0.116233 +v -0.436100 0.634645 -0.116233 +v -0.226180 1.482640 -0.390559 +v -0.226180 0.634645 -0.390559 +v 0.108975 0.634645 -0.430778 +v 0.292266 0.634645 -0.180802 +v 0.292266 1.482640 -0.180802 +v 0.108975 1.482640 -0.430778 +v 0.381664 0.634645 -0.227549 +v 0.334509 0.634645 0.078817 +v 0.334509 1.482640 0.078817 +v 0.381664 1.482640 -0.227549 +v 0.430778 0.634645 0.108975 +v 0.180802 0.634645 0.292266 +v 0.180802 1.482640 0.292266 +v 0.430778 1.482640 0.108975 +v 0.227549 0.634645 0.381664 +v -0.078817 0.634645 0.334509 +v -0.078817 1.482640 0.334509 +v 0.227549 1.482640 0.381664 +v -0.108975 0.634645 0.430778 +v -0.292266 0.634645 0.180802 +v -0.292266 1.482640 0.180802 +v -0.108975 1.482640 0.430778 +v -0.381664 0.634645 0.227549 +v -0.334509 0.634645 -0.078817 +v -0.334509 1.482640 -0.078817 +v -0.381664 1.482640 0.227549 +v -0.227549 0.634645 -0.381663 +v 0.078817 0.634645 -0.334509 +v 0.078817 1.482640 -0.334509 +v -0.227549 1.482640 -0.381663 +v -0.430779 0.634645 -0.108975 +v -0.180802 0.634645 -0.292266 +v -0.180802 1.482640 -0.292266 +v -0.430779 1.482640 -0.108975 +v 0.097545 1.496094 -0.490393 +v -0.097545 1.496094 -0.490393 +v -0.277785 1.496094 -0.415735 +v -0.415735 1.496094 -0.277785 +v -0.490393 1.496094 -0.097545 +v -0.490393 1.496094 0.097545 +v -0.415735 1.496094 0.277785 +v -0.277785 1.496094 0.415735 +v -0.097545 1.496094 0.490393 +v 0.097545 1.496094 0.490393 +v 0.277785 1.496094 0.415735 +v 0.415735 1.496094 0.277785 +v 0.490393 1.496094 0.097545 +v 0.490393 1.496094 -0.097545 +v 0.415735 1.496094 -0.277785 +v 0.277785 1.496094 -0.415735 +v 0.097545 1.464844 -0.490393 +v -0.097545 1.464844 -0.490393 +v -0.277785 1.464844 -0.415735 +v -0.415735 1.464844 -0.277785 +v -0.490393 1.464844 -0.097545 +v -0.490393 1.464844 0.097545 +v -0.415735 1.464844 0.277785 +v -0.277785 1.464844 0.415735 +v -0.097545 1.464844 0.490393 +v 0.097545 1.464844 0.490393 +v 0.277785 1.464844 0.415735 +v 0.415735 1.464844 0.277785 +v 0.490393 1.464844 0.097545 +v 0.490393 1.464844 -0.097545 +v 0.415735 1.464844 -0.277785 +v 0.277785 1.464844 -0.415735 +v 0.025624 0.559630 -0.061863 +v 0.025624 1.481372 -0.061863 +v 0.061863 0.559630 -0.025624 +v 0.061863 1.481372 -0.025624 +v 0.061863 0.559630 0.025624 +v 0.061863 1.481372 0.025624 +v 0.025624 0.559630 0.061863 +v 0.025624 1.481372 0.061863 +v -0.025624 0.559630 0.061863 +v -0.025624 1.481372 0.061863 +v -0.061863 0.559630 0.025624 +v -0.061863 1.481372 0.025624 +v -0.061863 0.559630 -0.025624 +v -0.061863 1.481372 -0.025624 +v -0.025624 0.559630 -0.061863 +v -0.025624 1.481372 -0.061863 +v 0.496094 -0.496094 -0.496094 +v 0.496094 -0.496094 0.496094 +v -0.496094 -0.496094 0.496094 +v -0.496094 -0.496094 -0.496094 +v 0.496094 0.496094 -0.496094 +v 0.496094 0.496094 0.496094 +v -0.496094 0.496094 0.496094 +v -0.496094 0.496094 -0.496094 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.400544 1.000000 +vt 0.599456 1.000000 +vt 0.783227 0.923880 +vt 0.923880 0.783227 +vt 1.000000 0.599456 +vt 1.000000 0.400544 +vt 0.923880 0.216773 +vt 0.783227 0.076120 +vt 0.599456 0.000000 +vt 0.400544 0.000000 +vt 0.216773 0.076121 +vt 0.076120 0.216773 +vt 0.000000 0.400544 +vt 0.000000 0.599456 +vt 0.076121 0.783227 +vt 0.216773 0.923880 +vt 0.500000 0.343750 +vt 0.531250 0.343750 +vt 0.531250 0.375000 +vt 0.500000 0.375000 +vt 0.531250 0.406250 +vt 0.500000 0.406250 +vt 0.500000 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.500000 0.500000 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.437500 +vt 0.593750 0.468750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.687500 0.468750 +vt 0.687500 0.500000 +vt 0.656250 0.531250 +vt 0.625000 0.531250 +vt 0.593750 0.500000 +vt 0.500000 0.312500 +vt 0.531250 0.312500 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.156250 0.750000 +vt 0.156250 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.750000 +vt 0.156250 0.625000 +vt 0.125000 0.625000 +vt 0.156250 0.500000 +vt 0.125000 0.500000 +vt 0.156250 0.375000 +vt 0.125000 0.375000 +vt 0.156250 0.250000 +vt 0.125000 0.250000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.218750 0.625000 +vt 0.218750 0.500000 +vt 0.156250 0.125000 +vt 0.125000 0.125000 +vt 0.156250 -0.000000 +vt 0.125000 -0.000000 +vt 0.250000 0.375000 +vt 0.218750 0.375000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 0.218750 1.000000 +vt 0.218750 0.875000 +vt 0.250000 0.250000 +vt 0.218750 0.250000 +vt 0.250000 0.750000 +vt 0.218750 0.750000 +vt 0.250000 0.125000 +vt 0.218750 0.125000 +vt 0.250000 -0.000000 +vt 0.218750 -0.000000 +vt 0.156250 1.000000 +vt 0.125000 1.000000 +vt 0.781250 0.593750 +vt 0.781250 0.968750 +vt 0.656250 0.968750 +vt 0.656250 0.593750 +vt 0.625000 0.593750 +vt 0.625000 0.968750 +vt 0.500000 0.968750 +vt 0.500000 0.593750 +vt 0.406250 -0.000000 +vt 0.437500 -0.000000 +vt 0.437500 0.125000 +vt 0.406250 0.125000 +vt 0.312500 0.875000 +vt 0.343750 0.875000 +vt 0.343750 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.750000 +vt 0.343750 0.750000 +vt 0.312500 0.625000 +vt 0.343750 0.625000 +vt 0.312500 0.500000 +vt 0.343750 0.500000 +vt 0.406250 0.750000 +vt 0.437500 0.750000 +vt 0.437500 0.875000 +vt 0.406250 0.875000 +vt 0.312500 0.375000 +vt 0.343750 0.375000 +vt 0.312500 0.250000 +vt 0.343750 0.250000 +vt 0.406250 0.625000 +vt 0.437500 0.625000 +vt 0.312500 0.125000 +vt 0.343750 0.125000 +vt 0.406250 0.500000 +vt 0.437500 0.500000 +vt 0.312500 -0.000000 +vt 0.343750 -0.000000 +vt 0.406250 0.375000 +vt 0.437500 0.375000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.406250 0.250000 +vt 0.437500 0.250000 +vt 0.031250 0.937500 +vt 0.062500 0.937500 +vt 0.062500 0.968750 +vt 0.031250 0.968750 +vt 0.031250 0.718750 +vt 0.062500 0.718750 +vt 0.062500 0.750000 +vt 0.031250 0.750000 +vt 0.062500 0.781250 +vt 0.031250 0.781250 +vt 0.062500 0.812500 +vt 0.031250 0.812500 +vt 0.062500 0.843750 +vt 0.031250 0.843750 +vt 0.062500 0.875000 +vt 0.031250 0.875000 +vt 0.031250 0.906250 +vt 0.062500 0.906250 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.382700 0.000000 -0.923900 +vn 0.923900 0.000000 -0.382700 +vn 0.923900 0.000000 0.382700 +vn 0.382700 0.000000 0.923900 +vn -0.382700 0.000000 0.923900 +vn -0.923900 0.000000 0.382700 +vn -0.382700 0.000000 -0.923900 +vn -0.923900 0.000000 -0.382700 +vn 0.707100 0.000000 0.707100 +vn -0.707100 0.000000 0.707100 +vn 0.707100 0.000000 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.806400 0.000000 -0.591300 +vn 0.988400 0.000000 0.152100 +vn 0.591300 0.000000 0.806400 +vn -0.152100 0.000000 0.988400 +vn -0.806400 0.000000 0.591300 +vn -0.988400 0.000000 -0.152100 +vn 0.152100 0.000000 -0.988400 +vn -0.591300 0.000000 -0.806400 +g Cylinder.002_Cylinder.003_sides +s off +f 161/1/1 165/2/1 166/3/1 162/4/1 +f 162/1/2 166/2/2 167/3/2 163/4/2 +f 163/4/3 167/3/3 168/2/3 164/1/3 +f 165/2/4 161/1/4 164/4/4 168/3/4 +g Cylinder.002_Cylinder.003_top-bottom +f 161/2/5 162/1/5 163/4/5 164/3/5 +f 165/2/6 168/3/6 167/4/6 166/1/6 +g Cylinder.002_Cylinder.003_turbine-top-bottom +f 130/5/5 129/6/5 144/7/5 143/8/5 142/9/5 141/10/5 140/11/5 139/12/5 138/13/5 137/14/5 136/15/5 135/16/5 134/17/5 133/18/5 132/19/5 131/20/5 +f 18/5/5 17/6/5 32/7/5 31/8/5 30/9/5 29/10/5 28/11/5 27/12/5 26/13/5 25/14/5 24/15/5 23/16/5 22/17/5 21/18/5 20/19/5 19/20/5 +f 33/6/6 34/5/6 35/20/6 36/19/6 37/18/6 38/17/6 39/16/6 40/15/6 41/14/6 42/13/6 43/12/6 44/11/6 45/10/6 46/9/6 47/8/6 48/7/6 +f 113/6/6 114/5/6 115/20/6 116/19/6 117/18/6 118/17/6 119/16/6 120/15/6 121/14/6 122/13/6 123/12/6 124/11/6 125/10/6 126/9/6 127/8/6 128/7/6 +g Cylinder.002_Cylinder.003_turbine-blades-etc +f 1/21/7 2/22/7 4/23/7 3/24/7 +f 3/24/8 4/23/8 6/25/8 5/26/8 +f 5/27/9 6/28/9 8/29/9 7/30/9 +f 7/30/10 8/29/10 10/31/10 9/32/10 +f 9/32/11 10/31/11 12/33/11 11/34/11 +f 11/34/12 12/33/12 14/25/12 13/26/12 +f 4/35/6 2/36/6 16/37/6 14/38/6 12/39/6 10/40/6 8/41/6 6/42/6 +f 15/43/13 16/44/13 2/22/13 1/21/13 +f 13/45/14 14/46/14 16/44/14 15/43/14 +f 27/47/15 28/48/15 44/49/15 43/50/15 +f 26/51/10 27/47/10 43/50/10 42/52/10 +f 25/53/2 26/51/2 42/52/2 41/54/2 +f 24/55/11 25/53/11 41/54/11 40/56/11 +f 23/57/16 24/55/16 40/56/16 39/58/16 +f 17/59/4 18/60/4 34/61/4 33/62/4 +f 22/63/12 23/57/12 39/58/12 38/64/12 +f 21/65/3 22/63/3 38/64/3 37/66/3 +f 32/67/7 17/59/7 33/62/7 48/68/7 +f 20/69/14 21/70/14 37/71/14 36/72/14 +f 31/73/17 32/67/17 48/68/17 47/74/17 +f 19/75/18 20/69/18 36/72/18 35/76/18 +f 30/77/8 31/73/8 47/74/8 46/78/8 +f 18/60/13 19/75/13 35/76/13 34/61/13 +f 29/79/1 30/77/1 46/78/1 45/80/1 +f 28/48/9 29/81/9 45/82/9 44/49/9 +f 49/83/19 50/84/19 52/85/19 51/86/19 +f 68/86/20 67/83/20 54/84/20 53/85/20 +f 70/83/21 69/84/21 56/85/21 55/86/21 +f 72/84/22 71/85/22 58/86/22 57/83/22 +f 74/83/23 73/84/23 60/85/23 59/86/23 +f 76/83/24 75/84/24 62/85/24 61/86/24 +f 80/84/25 79/85/25 66/86/25 65/83/25 +f 78/83/26 77/84/26 64/85/26 63/86/26 +f 81/87/23 82/88/23 83/89/23 84/90/23 +f 85/88/24 86/89/24 87/90/24 88/87/24 +f 89/89/26 90/90/26 91/87/26 92/88/26 +f 93/90/25 94/87/25 95/88/25 96/89/25 +f 97/90/19 98/87/19 99/88/19 100/89/19 +f 101/87/20 102/88/20 103/89/20 104/90/20 +f 105/90/22 106/87/22 107/88/22 108/89/22 +f 109/89/21 110/90/21 111/87/21 112/88/21 +f 75/88/22 76/87/22 101/86/22 104/85/22 +f 71/88/20 72/87/20 93/86/20 96/85/20 +f 67/86/25 68/85/25 85/88/25 88/87/25 +f 79/86/24 80/85/24 105/88/24 108/87/24 +f 77/88/23 78/87/23 109/86/23 112/85/23 +f 73/88/21 74/87/21 97/86/21 100/85/21 +f 69/86/19 70/85/19 89/88/19 92/87/19 +f 50/86/26 49/85/26 81/88/26 84/87/26 +f 123/91/15 139/92/15 140/93/15 124/94/15 +f 122/95/10 138/96/10 139/97/10 123/98/10 +f 121/99/2 137/100/2 138/96/2 122/95/2 +f 120/101/11 136/102/11 137/100/11 121/99/11 +f 119/103/16 135/104/16 136/102/16 120/101/16 +f 113/105/4 129/106/4 130/107/4 114/108/4 +f 118/109/12 134/110/12 135/104/12 119/103/12 +f 117/111/3 133/112/3 134/110/3 118/109/3 +f 128/113/7 144/114/7 129/106/7 113/105/7 +f 116/115/14 132/116/14 133/112/14 117/111/14 +f 127/117/17 143/118/17 144/114/17 128/113/17 +f 115/119/18 131/120/18 132/116/18 116/115/18 +f 126/121/8 142/122/8 143/118/8 127/117/8 +f 114/108/13 130/107/13 131/123/13 115/124/13 +f 125/125/1 141/126/1 142/122/1 126/121/1 +f 124/94/9 140/93/9 141/126/9 125/125/9 +f 145/127/17 146/128/17 148/129/17 147/130/17 +f 147/131/1 148/132/1 150/133/1 149/134/1 +f 149/134/15 150/133/15 152/135/15 151/136/15 +f 151/136/2 152/135/2 154/137/2 153/138/2 +f 153/138/16 154/137/16 156/139/16 155/140/16 +f 155/140/3 156/139/3 158/141/3 157/142/3 +f 159/143/4 160/144/4 146/128/4 145/127/4 +f 157/142/18 158/141/18 160/144/18 159/143/18 diff --git a/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_on.obj b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_on.obj new file mode 100644 index 00000000..52f87682 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_on.obj @@ -0,0 +1,2059 @@ +# Blender v2.72 (sub 0) OBJ File: 'mesecons-water-turbine_on.blend' +# www.blender.org +o Cylinder.002_Cylinder.003 +v 0.000000 0.496094 -0.150000 +v 0.000000 0.562500 -0.150000 +v 0.106066 0.496094 -0.106066 +v 0.106066 0.562500 -0.106066 +v 0.150000 0.496094 0.000000 +v 0.150000 0.562500 0.000000 +v 0.106066 0.496094 0.106066 +v 0.106066 0.562500 0.106066 +v -0.000000 0.496094 0.150000 +v -0.000000 0.562500 0.150000 +v -0.106066 0.496094 0.106066 +v -0.106066 0.562500 0.106066 +v -0.150000 0.496094 -0.000000 +v -0.150000 0.562500 -0.000000 +v -0.106066 0.496094 -0.106066 +v -0.106066 0.562500 -0.106066 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490393 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.625000 -0.097545 +v 0.415735 0.625000 -0.277785 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490393 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 0.656250 -0.097545 +v 0.415735 0.656250 -0.277785 +v 0.277785 0.656250 -0.415735 +v 0.080186 0.634645 -0.343405 +v 0.080186 1.482640 -0.343405 +v -0.226180 1.482640 -0.390559 +v -0.226180 0.634645 -0.390559 +v -0.227549 0.634645 -0.381663 +v 0.078817 0.634645 -0.334509 +v 0.078817 1.482640 -0.334509 +v -0.227549 1.482640 -0.381663 +v 0.097545 1.496094 -0.490393 +v -0.097545 1.496094 -0.490393 +v -0.277785 1.496094 -0.415735 +v -0.415735 1.496094 -0.277785 +v -0.490393 1.496094 -0.097545 +v -0.490393 1.496094 0.097545 +v -0.415735 1.496094 0.277785 +v -0.277785 1.496094 0.415735 +v -0.097545 1.496094 0.490393 +v 0.097545 1.496094 0.490393 +v 0.277785 1.496094 0.415735 +v 0.415735 1.496094 0.277785 +v 0.490393 1.496094 0.097545 +v 0.490393 1.496094 -0.097545 +v 0.415735 1.496094 -0.277785 +v 0.277785 1.496094 -0.415735 +v 0.097545 1.464844 -0.490393 +v -0.097545 1.464844 -0.490393 +v -0.277785 1.464844 -0.415735 +v -0.415735 1.464844 -0.277785 +v -0.490393 1.464844 -0.097545 +v -0.490393 1.464844 0.097545 +v -0.415735 1.464844 0.277785 +v -0.277785 1.464844 0.415735 +v -0.097545 1.464844 0.490393 +v 0.097545 1.464844 0.490393 +v 0.277785 1.464844 0.415735 +v 0.415735 1.464844 0.277785 +v 0.490393 1.464844 0.097545 +v 0.490393 1.464844 -0.097545 +v 0.415735 1.464844 -0.277785 +v 0.277785 1.464844 -0.415735 +v 0.025624 0.559630 -0.061863 +v 0.025624 1.481372 -0.061863 +v 0.061863 0.559630 -0.025624 +v 0.061863 1.481372 -0.025624 +v 0.061863 0.559630 0.025624 +v 0.061863 1.481372 0.025624 +v 0.025624 0.559630 0.061863 +v 0.025624 1.481372 0.061863 +v -0.025624 0.559630 0.061863 +v -0.025624 1.481372 0.061863 +v -0.061863 0.559630 0.025624 +v -0.061863 1.481372 0.025624 +v -0.061863 0.559630 -0.025624 +v -0.061863 1.481372 -0.025624 +v -0.025624 0.559630 -0.061863 +v -0.025624 1.481372 -0.061863 +v 0.496094 -0.496094 -0.496094 +v 0.496094 -0.496094 0.496094 +v -0.496094 -0.496094 0.496094 +v -0.496094 -0.496094 -0.496094 +v 0.496094 0.496094 -0.496094 +v 0.496094 0.496094 0.496094 +v -0.496094 0.496094 0.496094 +v -0.496094 0.496094 -0.496094 +v 0.299524 0.634645 -0.186124 +v 0.299524 1.482640 -0.186124 +v 0.116233 1.482640 -0.436100 +v 0.116233 0.634645 -0.436100 +v 0.108975 0.634645 -0.430778 +v 0.292266 0.634645 -0.180802 +v 0.292266 1.482640 -0.180802 +v 0.108975 1.482640 -0.430778 +v 0.343405 0.634645 0.080186 +v 0.343405 1.482640 0.080186 +v 0.390559 1.482640 -0.226180 +v 0.390559 0.634645 -0.226180 +v 0.381663 0.634645 -0.227549 +v 0.334509 0.634645 0.078817 +v 0.334509 1.482640 0.078817 +v 0.381663 1.482640 -0.227549 +v 0.186124 0.634645 0.299524 +v 0.186124 1.482640 0.299524 +v 0.436100 1.482640 0.116233 +v 0.436100 0.634645 0.116233 +v 0.430778 0.634645 0.108975 +v 0.180802 0.634645 0.292266 +v 0.180802 1.482640 0.292266 +v 0.430778 1.482640 0.108975 +v -0.080186 0.634645 0.343405 +v -0.080186 1.482640 0.343405 +v 0.226180 1.482640 0.390559 +v 0.226180 0.634645 0.390559 +v 0.227549 0.634645 0.381663 +v -0.078817 0.634645 0.334509 +v -0.078817 1.482640 0.334509 +v 0.227549 1.482640 0.381663 +v -0.299524 0.634645 0.186124 +v -0.299524 1.482640 0.186124 +v -0.116233 1.482640 0.436100 +v -0.116233 0.634645 0.436100 +v -0.108975 0.634645 0.430778 +v -0.292266 0.634645 0.180802 +v -0.292266 1.482640 0.180802 +v -0.108975 1.482640 0.430778 +v -0.343404 0.634645 -0.080186 +v -0.343404 1.482640 -0.080186 +v -0.390559 1.482640 0.226180 +v -0.390559 0.634645 0.226180 +v -0.381663 0.634645 0.227549 +v -0.334509 0.634645 -0.078817 +v -0.334509 1.482640 -0.078817 +v -0.381663 1.482640 0.227549 +v -0.186124 0.634645 -0.299524 +v -0.186124 1.482640 -0.299524 +v -0.436100 1.482640 -0.116233 +v -0.436100 0.634645 -0.116233 +v -0.430778 0.634645 -0.108975 +v -0.180802 0.634645 -0.292266 +v -0.180802 1.482640 -0.292266 +v -0.430778 1.482640 -0.108975 +v 0.145640 0.634645 -0.321163 +v 0.145640 1.482640 -0.321163 +v -0.145640 1.482640 -0.427180 +v -0.145640 0.634645 -0.427180 +v -0.148718 0.634645 -0.418723 +v 0.142562 0.634645 -0.312705 +v 0.142562 1.482640 -0.312705 +v -0.148718 1.482640 -0.418723 +v 0.330079 0.634645 -0.124113 +v 0.330079 1.482640 -0.124113 +v 0.199079 1.482640 -0.405045 +v 0.199079 0.634645 -0.405045 +v 0.190922 0.634645 -0.401241 +v 0.321922 0.634645 -0.120310 +v 0.321922 1.482640 -0.120310 +v 0.190922 1.482640 -0.401241 +v 0.321163 0.634645 0.145640 +v 0.321163 1.482640 0.145640 +v 0.427180 1.482640 -0.145640 +v 0.427180 0.634645 -0.145640 +v 0.418723 0.634645 -0.148718 +v 0.312705 0.634645 0.142562 +v 0.312705 1.482640 0.142562 +v 0.418723 1.482640 -0.148718 +v 0.124113 0.634645 0.330079 +v 0.124113 1.482640 0.330079 +v 0.405045 1.482640 0.199079 +v 0.405045 0.634645 0.199079 +v 0.401241 0.634645 0.190922 +v 0.120310 0.634645 0.321922 +v 0.120310 1.482640 0.321922 +v 0.401241 1.482640 0.190922 +v -0.145640 0.634645 0.321163 +v -0.145640 1.482640 0.321163 +v 0.145640 1.482640 0.427180 +v 0.145640 0.634645 0.427180 +v 0.148718 0.634645 0.418723 +v -0.142562 0.634645 0.312705 +v -0.142562 1.482640 0.312705 +v 0.148718 1.482640 0.418723 +v -0.330079 0.634645 0.124113 +v -0.330079 1.482640 0.124113 +v -0.199079 1.482640 0.405045 +v -0.199079 0.634645 0.405045 +v -0.190922 0.634645 0.401241 +v -0.321923 0.634645 0.120309 +v -0.321923 1.482640 0.120309 +v -0.190922 1.482640 0.401241 +v -0.321163 0.634645 -0.145640 +v -0.321163 1.482640 -0.145640 +v -0.427180 1.482640 0.145640 +v -0.427180 0.634645 0.145640 +v -0.418723 0.634645 0.148718 +v -0.312705 0.634645 -0.142562 +v -0.312705 1.482640 -0.142562 +v -0.418723 1.482640 0.148718 +v -0.124113 0.634645 -0.330079 +v -0.124113 1.482640 -0.330079 +v -0.405045 1.482640 -0.199079 +v -0.405045 0.634645 -0.199079 +v -0.401241 0.634645 -0.190922 +v -0.120309 0.634645 -0.321923 +v -0.120309 1.482640 -0.321923 +v -0.401241 1.482640 -0.190922 +v 0.205497 0.634645 -0.286579 +v 0.205497 1.482640 -0.286579 +v -0.059503 1.482640 -0.447385 +v -0.059503 0.634645 -0.447385 +v -0.064172 0.634645 -0.439690 +v 0.200828 0.634645 -0.278884 +v 0.200828 1.482640 -0.278884 +v -0.064172 1.482640 -0.439690 +v 0.347950 0.634645 -0.057333 +v 0.347950 1.482640 -0.057333 +v 0.274274 1.482640 -0.358424 +v 0.274274 0.634645 -0.358424 +v 0.265532 0.634645 -0.356284 +v 0.339208 0.634645 -0.055194 +v 0.339208 1.482640 -0.055194 +v 0.265532 1.482640 -0.356284 +v 0.286579 0.634645 0.205497 +v 0.286579 1.482640 0.205497 +v 0.447385 1.482640 -0.059503 +v 0.447385 0.634645 -0.059503 +v 0.439690 0.634645 -0.064172 +v 0.278884 0.634645 0.200828 +v 0.278884 1.482640 0.200828 +v 0.439690 1.482640 -0.064172 +v 0.057333 0.634645 0.347950 +v 0.057333 1.482640 0.347950 +v 0.358423 1.482640 0.274274 +v 0.358423 0.634645 0.274274 +v 0.356284 0.634645 0.265532 +v 0.055194 0.634645 0.339208 +v 0.055194 1.482640 0.339208 +v 0.356284 1.482640 0.265532 +v -0.205497 0.634645 0.286579 +v -0.205497 1.482640 0.286579 +v 0.059503 1.482640 0.447385 +v 0.059503 0.634645 0.447385 +v 0.064172 0.634645 0.439690 +v -0.200828 0.634645 0.278884 +v -0.200828 1.482640 0.278884 +v 0.064172 1.482640 0.439690 +v -0.347950 0.634645 0.057333 +v -0.347950 1.482640 0.057333 +v -0.274274 1.482640 0.358423 +v -0.274274 0.634645 0.358423 +v -0.265532 0.634645 0.356284 +v -0.339208 0.634645 0.055194 +v -0.339208 1.482640 0.055194 +v -0.265532 1.482640 0.356284 +v -0.286579 0.634645 -0.205497 +v -0.286579 1.482640 -0.205497 +v -0.447385 1.482640 0.059503 +v -0.447385 0.634645 0.059503 +v -0.439690 0.634645 0.064172 +v -0.278884 0.634645 -0.200828 +v -0.278884 1.482640 -0.200828 +v -0.439690 1.482640 0.064172 +v -0.057333 0.634645 -0.347950 +v -0.057333 1.482640 -0.347950 +v -0.358423 1.482640 -0.274274 +v -0.358423 0.634645 -0.274274 +v -0.356284 0.634645 -0.265532 +v -0.055194 0.634645 -0.339208 +v -0.055194 1.482640 -0.339208 +v -0.356284 1.482640 -0.265532 +v 0.257457 0.634645 -0.240981 +v 0.257457 1.482640 -0.240981 +v 0.028921 1.482640 -0.450397 +v 0.028921 0.634645 -0.450397 +v 0.022841 0.634645 -0.443761 +v 0.251377 0.634645 -0.234346 +v 0.251377 1.482640 -0.234346 +v 0.022841 1.482640 -0.443761 +v 0.352450 0.634645 0.011650 +v 0.352450 1.482640 0.011650 +v 0.338929 1.482640 -0.298028 +v 0.338929 0.634645 -0.298028 +v 0.329937 0.634645 -0.297636 +v 0.343458 0.634645 0.012043 +v 0.343458 1.482640 0.012043 +v 0.329937 1.482640 -0.297636 +v 0.240981 0.634645 0.257458 +v 0.240981 1.482640 0.257458 +v 0.450397 1.482640 0.028921 +v 0.450397 0.634645 0.028921 +v 0.443761 0.634645 0.022841 +v 0.234346 0.634645 0.251377 +v 0.234346 1.482640 0.251377 +v 0.443761 1.482640 0.022841 +v -0.011650 0.634645 0.352450 +v -0.011650 1.482640 0.352450 +v 0.298028 1.482640 0.338929 +v 0.298028 0.634645 0.338929 +v 0.297636 0.634645 0.329937 +v -0.012043 0.634645 0.343458 +v -0.012043 1.482640 0.343458 +v 0.297636 1.482640 0.329937 +v -0.257458 0.634645 0.240981 +v -0.257458 1.482640 0.240981 +v -0.028921 1.482640 0.450397 +v -0.028921 0.634645 0.450397 +v -0.022841 0.634645 0.443761 +v -0.251377 0.634645 0.234346 +v -0.251377 1.482640 0.234346 +v -0.022841 1.482640 0.443761 +v -0.352450 0.634645 -0.011650 +v -0.352450 1.482640 -0.011650 +v -0.338929 1.482640 0.298028 +v -0.338929 0.634645 0.298028 +v -0.329937 0.634645 0.297636 +v -0.343458 0.634645 -0.012043 +v -0.343458 1.482640 -0.012043 +v -0.329937 1.482640 0.297636 +v -0.240981 0.634645 -0.257458 +v -0.240981 1.482640 -0.257458 +v -0.450397 1.482640 -0.028921 +v -0.450397 0.634645 -0.028921 +v -0.443761 0.634645 -0.022841 +v -0.234346 0.634645 -0.251377 +v -0.234346 1.482640 -0.251377 +v -0.443761 1.482640 -0.022841 +v 0.011651 0.634645 -0.352450 +v 0.011651 1.482640 -0.352450 +v -0.298028 1.482640 -0.338929 +v -0.298028 0.634645 -0.338929 +v -0.297635 0.634645 -0.329937 +v 0.012043 0.634645 -0.343458 +v 0.012043 1.482640 -0.343458 +v -0.297635 1.482640 -0.329937 +v 0.191342 0.625000 -0.461940 +v 0.000000 0.625000 -0.500000 +v -0.191342 0.625000 -0.461940 +v -0.353553 0.625000 -0.353554 +v -0.461940 0.625000 -0.191342 +v -0.500000 0.625000 -0.000000 +v -0.461940 0.625000 0.191342 +v -0.353553 0.625000 0.353553 +v -0.191342 0.625000 0.461940 +v -0.000000 0.625000 0.500000 +v 0.191342 0.625000 0.461940 +v 0.353553 0.625000 0.353553 +v 0.461940 0.625000 0.191341 +v 0.500000 0.625000 -0.000000 +v 0.461940 0.625000 -0.191342 +v 0.353553 0.625000 -0.353554 +v 0.191342 0.656250 -0.461940 +v 0.000000 0.656250 -0.500000 +v -0.191342 0.656250 -0.461940 +v -0.353553 0.656250 -0.353554 +v -0.461940 0.656250 -0.191342 +v -0.500000 0.656250 -0.000000 +v -0.461940 0.656250 0.191342 +v -0.353553 0.656250 0.353553 +v -0.191342 0.656250 0.461940 +v -0.000000 0.656250 0.500000 +v 0.191342 0.656250 0.461940 +v 0.353553 0.656250 0.353553 +v 0.461940 0.656250 0.191341 +v 0.500000 0.656250 -0.000000 +v 0.461940 0.656250 -0.191342 +v 0.353553 0.656250 -0.353554 +v 0.191342 1.496094 -0.461940 +v 0.000000 1.496094 -0.500000 +v -0.191342 1.496094 -0.461940 +v -0.353553 1.496094 -0.353554 +v -0.461940 1.496094 -0.191342 +v -0.500000 1.496094 -0.000000 +v -0.461940 1.496094 0.191342 +v -0.353553 1.496094 0.353553 +v -0.191342 1.496094 0.461940 +v -0.000000 1.496094 0.500000 +v 0.191341 1.496094 0.461940 +v 0.353553 1.496094 0.353553 +v 0.461940 1.496094 0.191342 +v 0.500000 1.496094 0.000000 +v 0.461940 1.496094 -0.191342 +v 0.353553 1.496094 -0.353554 +v 0.191342 1.464844 -0.461940 +v 0.000000 1.464844 -0.500000 +v -0.191342 1.464844 -0.461940 +v -0.353553 1.464844 -0.353554 +v -0.461940 1.464844 -0.191342 +v -0.500000 1.464844 -0.000000 +v -0.461940 1.464844 0.191342 +v -0.353553 1.464844 0.353553 +v -0.191342 1.464844 0.461940 +v -0.000000 1.464844 0.500000 +v 0.191341 1.464844 0.461940 +v 0.353553 1.464844 0.353553 +v 0.461940 1.464844 0.191342 +v 0.500000 1.464844 0.000000 +v 0.461940 1.464844 -0.191342 +v 0.353553 1.464844 -0.353554 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490392 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.625000 -0.097545 +v 0.415735 0.625000 -0.277786 +v 0.277785 0.656250 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490392 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 0.656250 -0.097545 +v 0.415735 0.656250 -0.277786 +v 0.277785 1.496094 -0.415735 +v 0.097545 1.496094 -0.490393 +v -0.097545 1.496094 -0.490393 +v -0.277785 1.496094 -0.415735 +v -0.415735 1.496094 -0.277785 +v -0.490393 1.496094 -0.097545 +v -0.490393 1.496094 0.097545 +v -0.415735 1.496094 0.277785 +v -0.277785 1.496094 0.415735 +v -0.097545 1.496094 0.490393 +v 0.097545 1.496094 0.490393 +v 0.277785 1.496094 0.415735 +v 0.415735 1.496094 0.277785 +v 0.490393 1.496094 0.097545 +v 0.490393 1.496094 -0.097545 +v 0.415735 1.496094 -0.277785 +v 0.277785 1.464844 -0.415735 +v 0.097545 1.464844 -0.490393 +v -0.097545 1.464844 -0.490393 +v -0.277785 1.464844 -0.415735 +v -0.415735 1.464844 -0.277785 +v -0.490393 1.464844 -0.097545 +v -0.490393 1.464844 0.097545 +v -0.415735 1.464844 0.277785 +v -0.277785 1.464844 0.415735 +v -0.097545 1.464844 0.490393 +v 0.097545 1.464844 0.490393 +v 0.277785 1.464844 0.415735 +v 0.415735 1.464844 0.277785 +v 0.490393 1.464844 0.097545 +v 0.490393 1.464844 -0.097545 +v 0.415735 1.464844 -0.277785 +v 0.353554 0.625000 -0.353554 +v 0.191342 0.625000 -0.461940 +v 0.000000 0.625000 -0.500000 +v -0.191342 0.625000 -0.461940 +v -0.353553 0.625000 -0.353554 +v -0.461940 0.625000 -0.191342 +v -0.500000 0.625000 -0.000000 +v -0.461940 0.625000 0.191341 +v -0.353554 0.625000 0.353553 +v -0.191342 0.625000 0.461940 +v 0.000000 0.625000 0.500000 +v 0.191342 0.625000 0.461940 +v 0.353554 0.625000 0.353553 +v 0.461940 0.625000 0.191341 +v 0.500000 0.625000 -0.000000 +v 0.461940 0.625000 -0.191342 +v 0.353554 0.656250 -0.353554 +v 0.191342 0.656250 -0.461940 +v 0.000000 0.656250 -0.500000 +v -0.191342 0.656250 -0.461940 +v -0.353553 0.656250 -0.353554 +v -0.461940 0.656250 -0.191342 +v -0.500000 0.656250 -0.000000 +v -0.461940 0.656250 0.191341 +v -0.353554 0.656250 0.353553 +v -0.191342 0.656250 0.461940 +v 0.000000 0.656250 0.500000 +v 0.191342 0.656250 0.461940 +v 0.353554 0.656250 0.353553 +v 0.461940 0.656250 0.191341 +v 0.500000 0.656250 -0.000000 +v 0.461940 0.656250 -0.191342 +v 0.353553 1.496094 -0.353553 +v 0.191342 1.496094 -0.461940 +v 0.000000 1.496094 -0.500000 +v -0.191342 1.496094 -0.461940 +v -0.353554 1.496094 -0.353553 +v -0.461940 1.496094 -0.191342 +v -0.500000 1.496094 -0.000000 +v -0.461940 1.496094 0.191342 +v -0.353554 1.496094 0.353553 +v -0.191342 1.496094 0.461940 +v -0.000000 1.496094 0.500000 +v 0.191342 1.496094 0.461940 +v 0.353554 1.496094 0.353553 +v 0.461940 1.496094 0.191342 +v 0.500000 1.496094 -0.000000 +v 0.461940 1.496094 -0.191342 +v 0.353553 1.464844 -0.353553 +v 0.191342 1.464844 -0.461940 +v 0.000000 1.464844 -0.500000 +v -0.191342 1.464844 -0.461940 +v -0.353554 1.464844 -0.353553 +v -0.461940 1.464844 -0.191342 +v -0.500000 1.464844 -0.000000 +v -0.461940 1.464844 0.191342 +v -0.353554 1.464844 0.353553 +v -0.191342 1.464844 0.461940 +v -0.000000 1.464844 0.500000 +v 0.191342 1.464844 0.461940 +v 0.353554 1.464844 0.353553 +v 0.461940 1.464844 0.191342 +v 0.500000 1.464844 -0.000000 +v 0.461940 1.464844 -0.191342 +v 0.415735 0.625000 -0.277785 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490393 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.625000 -0.097546 +v 0.415735 0.656250 -0.277785 +v 0.277785 0.656250 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490393 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 0.656250 -0.097546 +v 0.415735 1.496094 -0.277785 +v 0.277785 1.496094 -0.415735 +v 0.097545 1.496094 -0.490392 +v -0.097545 1.496094 -0.490393 +v -0.277785 1.496094 -0.415735 +v -0.415735 1.496094 -0.277785 +v -0.490393 1.496094 -0.097545 +v -0.490393 1.496094 0.097545 +v -0.415735 1.496094 0.277785 +v -0.277785 1.496094 0.415735 +v -0.097545 1.496094 0.490393 +v 0.097545 1.496094 0.490393 +v 0.277785 1.496094 0.415735 +v 0.415735 1.496094 0.277785 +v 0.490393 1.496094 0.097545 +v 0.490393 1.496094 -0.097545 +v 0.415735 1.464844 -0.277785 +v 0.277785 1.464844 -0.415735 +v 0.097545 1.464844 -0.490392 +v -0.097545 1.464844 -0.490393 +v -0.277785 1.464844 -0.415735 +v -0.415735 1.464844 -0.277785 +v -0.490393 1.464844 -0.097545 +v -0.490393 1.464844 0.097545 +v -0.415735 1.464844 0.277785 +v -0.277785 1.464844 0.415735 +v -0.097545 1.464844 0.490393 +v 0.097545 1.464844 0.490393 +v 0.277785 1.464844 0.415735 +v 0.415735 1.464844 0.277785 +v 0.490393 1.464844 0.097545 +v 0.490393 1.464844 -0.097545 +v 0.461939 0.625000 -0.191342 +v 0.353554 0.625000 -0.353553 +v 0.191342 0.625000 -0.461940 +v -0.000000 0.625000 -0.500000 +v -0.191342 0.625000 -0.461940 +v -0.353554 0.625000 -0.353554 +v -0.461940 0.625000 -0.191342 +v -0.500000 0.625000 -0.000000 +v -0.461940 0.625000 0.191341 +v -0.353554 0.625000 0.353553 +v -0.191342 0.625000 0.461940 +v -0.000000 0.625000 0.500000 +v 0.191342 0.625000 0.461940 +v 0.353554 0.625000 0.353553 +v 0.461939 0.625000 0.191342 +v 0.500000 0.625000 -0.000000 +v 0.461939 0.656250 -0.191342 +v 0.353554 0.656250 -0.353553 +v 0.191342 0.656250 -0.461940 +v -0.000000 0.656250 -0.500000 +v -0.191342 0.656250 -0.461940 +v -0.353554 0.656250 -0.353554 +v -0.461940 0.656250 -0.191342 +v -0.500000 0.656250 -0.000000 +v -0.461940 0.656250 0.191341 +v -0.353554 0.656250 0.353553 +v -0.191342 0.656250 0.461940 +v -0.000000 0.656250 0.500000 +v 0.191342 0.656250 0.461940 +v 0.353554 0.656250 0.353553 +v 0.461939 0.656250 0.191342 +v 0.500000 0.656250 -0.000000 +v 0.461939 1.496094 -0.191342 +v 0.353553 1.496094 -0.353553 +v 0.191342 1.496094 -0.461940 +v -0.000000 1.496094 -0.500000 +v -0.191342 1.496094 -0.461940 +v -0.353554 1.496094 -0.353553 +v -0.461940 1.496094 -0.191342 +v -0.500000 1.496094 -0.000000 +v -0.461940 1.496094 0.191342 +v -0.353554 1.496094 0.353553 +v -0.191342 1.496094 0.461940 +v -0.000000 1.496094 0.500000 +v 0.191342 1.496094 0.461940 +v 0.353553 1.496094 0.353553 +v 0.461939 1.496094 0.191342 +v 0.500000 1.496094 -0.000000 +v 0.461939 1.464844 -0.191342 +v 0.353553 1.464844 -0.353553 +v 0.191342 1.464844 -0.461940 +v -0.000000 1.464844 -0.500000 +v -0.191342 1.464844 -0.461940 +v -0.353554 1.464844 -0.353553 +v -0.461940 1.464844 -0.191342 +v -0.500000 1.464844 -0.000000 +v -0.461940 1.464844 0.191342 +v -0.353554 1.464844 0.353553 +v -0.191342 1.464844 0.461940 +v -0.000000 1.464844 0.500000 +v 0.191342 1.464844 0.461940 +v 0.353553 1.464844 0.353553 +v 0.461939 1.464844 0.191342 +v 0.500000 1.464844 -0.000000 +v 0.490393 0.625000 -0.097545 +v 0.415735 0.625000 -0.277785 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490393 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.656250 -0.097545 +v 0.415735 0.656250 -0.277785 +v 0.277785 0.656250 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490393 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 1.496094 -0.097545 +v 0.415735 1.496094 -0.277785 +v 0.277785 1.496094 -0.415735 +v 0.097545 1.496094 -0.490393 +v -0.097545 1.496094 -0.490393 +v -0.277785 1.496094 -0.415735 +v -0.415735 1.496094 -0.277785 +v -0.490393 1.496094 -0.097545 +v -0.490393 1.496094 0.097545 +v -0.415735 1.496094 0.277785 +v -0.277785 1.496094 0.415735 +v -0.097545 1.496094 0.490393 +v 0.097545 1.496094 0.490393 +v 0.277785 1.496094 0.415735 +v 0.415735 1.496094 0.277785 +v 0.490393 1.496094 0.097545 +v 0.490393 1.464844 -0.097545 +v 0.415735 1.464844 -0.277785 +v 0.277785 1.464844 -0.415735 +v 0.097545 1.464844 -0.490393 +v -0.097545 1.464844 -0.490393 +v -0.277785 1.464844 -0.415735 +v -0.415735 1.464844 -0.277785 +v -0.490393 1.464844 -0.097545 +v -0.490393 1.464844 0.097545 +v -0.415735 1.464844 0.277785 +v -0.277785 1.464844 0.415735 +v -0.097545 1.464844 0.490393 +v 0.097545 1.464844 0.490393 +v 0.277785 1.464844 0.415735 +v 0.415735 1.464844 0.277785 +v 0.490393 1.464844 0.097545 +v 0.500001 0.625000 -0.000000 +v 0.461940 0.625000 -0.191342 +v 0.353554 0.625000 -0.353553 +v 0.191342 0.625000 -0.461940 +v 0.000000 0.625000 -0.500000 +v -0.191342 0.625000 -0.461940 +v -0.353553 0.625000 -0.353553 +v -0.461939 0.625000 -0.191342 +v -0.500000 0.625000 -0.000000 +v -0.461939 0.625000 0.191342 +v -0.353553 0.625000 0.353553 +v -0.191342 0.625000 0.461940 +v 0.000001 0.625000 0.500000 +v 0.191342 0.625000 0.461940 +v 0.353554 0.625000 0.353553 +v 0.461940 0.625000 0.191341 +v 0.500001 0.656250 -0.000000 +v 0.461940 0.656250 -0.191342 +v 0.353554 0.656250 -0.353553 +v 0.191342 0.656250 -0.461940 +v 0.000000 0.656250 -0.500000 +v -0.191342 0.656250 -0.461940 +v -0.353553 0.656250 -0.353553 +v -0.461939 0.656250 -0.191342 +v -0.500000 0.656250 -0.000000 +v -0.461939 0.656250 0.191342 +v -0.353553 0.656250 0.353553 +v -0.191342 0.656250 0.461940 +v 0.000001 0.656250 0.500000 +v 0.191342 0.656250 0.461940 +v 0.353554 0.656250 0.353553 +v 0.461940 0.656250 0.191341 +v 0.500000 1.496094 -0.000000 +v 0.461940 1.496094 -0.191342 +v 0.353554 1.496094 -0.353553 +v 0.191342 1.496094 -0.461940 +v 0.000000 1.496094 -0.500000 +v -0.191342 1.496094 -0.461940 +v -0.353553 1.496094 -0.353553 +v -0.461939 1.496094 -0.191342 +v -0.500000 1.496094 -0.000000 +v -0.461939 1.496094 0.191342 +v -0.353554 1.496094 0.353553 +v -0.191342 1.496094 0.461940 +v 0.000000 1.496094 0.500000 +v 0.191342 1.496094 0.461940 +v 0.353554 1.496094 0.353553 +v 0.461940 1.496094 0.191341 +v 0.500000 1.464844 -0.000000 +v 0.461940 1.464844 -0.191342 +v 0.353554 1.464844 -0.353553 +v 0.191342 1.464844 -0.461940 +v 0.000000 1.464844 -0.500000 +v -0.191342 1.464844 -0.461940 +v -0.353553 1.464844 -0.353553 +v -0.461939 1.464844 -0.191342 +v -0.500000 1.464844 -0.000000 +v -0.461939 1.464844 0.191342 +v -0.353554 1.464844 0.353553 +v -0.191342 1.464844 0.461940 +v 0.000000 1.464844 0.500000 +v 0.191342 1.464844 0.461940 +v 0.353554 1.464844 0.353553 +v 0.461940 1.464844 0.191341 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.050068 0.998878 +vt 0.074932 0.998878 +vt 0.097903 0.922758 +vt 0.115485 0.782105 +vt 0.125000 0.598334 +vt 0.125000 0.399421 +vt 0.115485 0.215651 +vt 0.097903 0.074998 +vt 0.074932 -0.001122 +vt 0.050068 -0.001122 +vt 0.027097 0.074998 +vt 0.009515 0.215650 +vt 0.000000 0.399421 +vt 0.000000 0.598334 +vt 0.009515 0.782105 +vt 0.027097 0.922758 +vt 0.175068 0.998878 +vt 0.199932 0.998878 +vt 0.222903 0.922758 +vt 0.240485 0.782105 +vt 0.250000 0.598334 +vt 0.250000 0.399421 +vt 0.240485 0.215651 +vt 0.222903 0.074998 +vt 0.199932 -0.001122 +vt 0.175068 -0.001122 +vt 0.152097 0.074998 +vt 0.134515 0.215650 +vt 0.134515 0.782105 +vt 0.152097 0.922758 +vt 0.300068 0.998878 +vt 0.324932 0.998878 +vt 0.347903 0.922758 +vt 0.365485 0.782105 +vt 0.375000 0.598334 +vt 0.375000 0.399421 +vt 0.365485 0.215651 +vt 0.347903 0.074998 +vt 0.324932 -0.001122 +vt 0.300068 -0.001122 +vt 0.277097 0.074998 +vt 0.259515 0.215650 +vt 0.259515 0.782105 +vt 0.277097 0.922758 +vt 0.425068 0.998878 +vt 0.449932 0.998878 +vt 0.472903 0.922758 +vt 0.490485 0.782105 +vt 0.500000 0.598334 +vt 0.500000 0.399421 +vt 0.490485 0.215651 +vt 0.472903 0.074998 +vt 0.449932 -0.001122 +vt 0.425068 -0.001122 +vt 0.402097 0.074998 +vt 0.384515 0.215650 +vt 0.384515 0.782105 +vt 0.402097 0.922758 +vt 0.550068 0.998878 +vt 0.574932 0.998878 +vt 0.597903 0.922758 +vt 0.615485 0.782105 +vt 0.625000 0.598334 +vt 0.625000 0.399421 +vt 0.615485 0.215651 +vt 0.597903 0.074998 +vt 0.574932 -0.001122 +vt 0.550068 -0.001122 +vt 0.527097 0.074998 +vt 0.509515 0.215650 +vt 0.509515 0.782105 +vt 0.527097 0.922758 +vt 0.675068 0.998878 +vt 0.699932 0.998878 +vt 0.722903 0.922758 +vt 0.740485 0.782105 +vt 0.750000 0.598334 +vt 0.750000 0.399421 +vt 0.740485 0.215651 +vt 0.722903 0.074998 +vt 0.699932 -0.001122 +vt 0.675068 -0.001122 +vt 0.652097 0.074998 +vt 0.634515 0.215650 +vt 0.634515 0.782105 +vt 0.652097 0.922758 +vt 0.800068 0.998878 +vt 0.824932 0.998878 +vt 0.847903 0.922758 +vt 0.865485 0.782105 +vt 0.875000 0.598334 +vt 0.875000 0.399421 +vt 0.865485 0.215651 +vt 0.847903 0.074998 +vt 0.824932 -0.001122 +vt 0.800068 -0.001122 +vt 0.777097 0.074998 +vt 0.759515 0.215650 +vt 0.759515 0.782105 +vt 0.777097 0.922758 +vt 0.925068 0.998878 +vt 0.949932 0.998878 +vt 0.972903 0.922758 +vt 0.990485 0.782105 +vt 1.000000 0.598334 +vt 1.000000 0.399421 +vt 0.990485 0.215651 +vt 0.972903 0.074998 +vt 0.949932 -0.001122 +vt 0.925068 -0.001122 +vt 0.902097 0.074998 +vt 0.884515 0.215650 +vt 0.884515 0.782105 +vt 0.902097 0.922758 +vt 0.062500 0.343750 +vt 0.066406 0.343750 +vt 0.066406 0.375000 +vt 0.062500 0.375000 +vt 0.066406 0.406250 +vt 0.062500 0.406250 +vt 0.062500 0.531250 +vt 0.066406 0.531250 +vt 0.066406 0.500000 +vt 0.062500 0.500000 +vt 0.066406 0.468750 +vt 0.062500 0.468750 +vt 0.066406 0.437500 +vt 0.062500 0.437500 +vt 0.074219 0.468750 +vt 0.078125 0.437500 +vt 0.082031 0.437500 +vt 0.085938 0.468750 +vt 0.085938 0.500000 +vt 0.082031 0.531250 +vt 0.078125 0.531250 +vt 0.074219 0.500000 +vt 0.062500 0.312500 +vt 0.066406 0.312500 +vt 0.062500 0.281250 +vt 0.066406 0.281250 +vt 0.023438 0.750000 +vt 0.023438 0.875000 +vt 0.019531 0.875000 +vt 0.019531 0.750000 +vt 0.023438 0.625000 +vt 0.019531 0.625000 +vt 0.023438 0.500000 +vt 0.019531 0.500000 +vt 0.023438 0.375000 +vt 0.019531 0.375000 +vt 0.023438 0.250000 +vt 0.019531 0.250000 +vt 0.035156 0.500000 +vt 0.035156 0.625000 +vt 0.027344 0.625000 +vt 0.027344 0.500000 +vt 0.023438 0.125000 +vt 0.019531 0.125000 +vt 0.023438 0.000000 +vt 0.019531 0.000000 +vt 0.035156 0.375000 +vt 0.027344 0.375000 +vt 0.035156 0.875000 +vt 0.035156 1.000000 +vt 0.027344 1.000000 +vt 0.027344 0.875000 +vt 0.035156 0.250000 +vt 0.027344 0.250000 +vt 0.035156 0.750000 +vt 0.027344 0.750000 +vt 0.035156 0.125000 +vt 0.027344 0.125000 +vt 0.035156 0.000000 +vt 0.027344 0.000000 +vt 0.023438 1.000000 +vt 0.019531 1.000000 +vt 0.078125 0.593750 +vt 0.078125 0.968750 +vt 0.062500 0.968750 +vt 0.062500 0.593750 +vt 0.082031 0.593750 +vt 0.097656 0.593750 +vt 0.097656 0.968750 +vt 0.082031 0.968750 +vt 0.046875 0.000000 +vt 0.054688 0.000000 +vt 0.054688 0.125000 +vt 0.046875 0.125000 +vt 0.039062 0.875000 +vt 0.042969 0.875000 +vt 0.042969 1.000000 +vt 0.039062 1.000000 +vt 0.039062 0.750000 +vt 0.042969 0.750000 +vt 0.039062 0.625000 +vt 0.042969 0.625000 +vt 0.039062 0.500000 +vt 0.042969 0.500000 +vt 0.046875 0.750000 +vt 0.054688 0.750000 +vt 0.054688 0.875000 +vt 0.046875 0.875000 +vt 0.039062 0.375000 +vt 0.042969 0.375000 +vt 0.039062 0.250000 +vt 0.042969 0.250000 +vt 0.046875 0.625000 +vt 0.054688 0.625000 +vt 0.039062 0.125000 +vt 0.042969 0.125000 +vt 0.046875 0.500000 +vt 0.054688 0.500000 +vt 0.039062 0.000000 +vt 0.042969 0.000000 +vt 0.046875 0.375000 +vt 0.054688 0.375000 +vt 0.054688 1.000000 +vt 0.046875 1.000000 +vt 0.046875 0.250000 +vt 0.054688 0.250000 +vt 0.003906 0.937500 +vt 0.007812 0.937500 +vt 0.007812 0.968750 +vt 0.003906 0.968750 +vt 0.003906 0.718750 +vt 0.007812 0.718750 +vt 0.007812 0.750000 +vt 0.003906 0.750000 +vt 0.007812 0.781250 +vt 0.003906 0.781250 +vt 0.007812 0.812500 +vt 0.003906 0.812500 +vt 0.007812 0.843750 +vt 0.003906 0.843750 +vt 0.007812 0.875000 +vt 0.003906 0.875000 +vt 0.003906 0.906250 +vt 0.007812 0.906250 +vt 0.203125 0.593750 +vt 0.203125 0.968750 +vt 0.187500 0.968750 +vt 0.187500 0.593750 +vt 0.207031 0.593750 +vt 0.222656 0.593750 +vt 0.222656 0.968750 +vt 0.207031 0.968750 +vt 0.328125 0.593750 +vt 0.328125 0.968750 +vt 0.312500 0.968750 +vt 0.312500 0.593750 +vt 0.332031 0.593750 +vt 0.347656 0.593750 +vt 0.347656 0.968750 +vt 0.332031 0.968750 +vt 0.453125 0.593750 +vt 0.453125 0.968750 +vt 0.437500 0.968750 +vt 0.437500 0.593750 +vt 0.457031 0.593750 +vt 0.472656 0.593750 +vt 0.472656 0.968750 +vt 0.457031 0.968750 +vt 0.148438 0.750000 +vt 0.148438 0.875000 +vt 0.144531 0.875000 +vt 0.144531 0.750000 +vt 0.148438 0.625000 +vt 0.144531 0.625000 +vt 0.148438 0.500000 +vt 0.144531 0.500000 +vt 0.148438 0.375000 +vt 0.144531 0.375000 +vt 0.148438 0.250000 +vt 0.144531 0.250000 +vt 0.160156 0.500000 +vt 0.160156 0.625000 +vt 0.152344 0.625000 +vt 0.152344 0.500000 +vt 0.148438 0.125000 +vt 0.144531 0.125000 +vt 0.148438 0.000000 +vt 0.144531 0.000000 +vt 0.160156 0.375000 +vt 0.152344 0.375000 +vt 0.160156 0.875000 +vt 0.160156 1.000000 +vt 0.152344 1.000000 +vt 0.152344 0.875000 +vt 0.160156 0.250000 +vt 0.152344 0.250000 +vt 0.160156 0.750000 +vt 0.152344 0.750000 +vt 0.160156 0.125000 +vt 0.152344 0.125000 +vt 0.160156 0.000000 +vt 0.152344 0.000000 +vt 0.148438 1.000000 +vt 0.144531 1.000000 +vt 0.171875 0.000000 +vt 0.179688 0.000000 +vt 0.179688 0.125000 +vt 0.171875 0.125000 +vt 0.164062 0.875000 +vt 0.167969 0.875000 +vt 0.167969 1.000000 +vt 0.164062 1.000000 +vt 0.164062 0.750000 +vt 0.167969 0.750000 +vt 0.164062 0.625000 +vt 0.167969 0.625000 +vt 0.164062 0.500000 +vt 0.167969 0.500000 +vt 0.171875 0.750000 +vt 0.179688 0.750000 +vt 0.179688 0.875000 +vt 0.171875 0.875000 +vt 0.164062 0.375000 +vt 0.167969 0.375000 +vt 0.164062 0.250000 +vt 0.167969 0.250000 +vt 0.171875 0.625000 +vt 0.179688 0.625000 +vt 0.164062 0.125000 +vt 0.167969 0.125000 +vt 0.171875 0.500000 +vt 0.179688 0.500000 +vt 0.164062 0.000000 +vt 0.167969 0.000000 +vt 0.171875 0.375000 +vt 0.179688 0.375000 +vt 0.179688 1.000000 +vt 0.171875 1.000000 +vt 0.171875 0.250000 +vt 0.179688 0.250000 +vt 0.273438 0.750000 +vt 0.273438 0.875000 +vt 0.269531 0.875000 +vt 0.269531 0.750000 +vt 0.273438 0.625000 +vt 0.269531 0.625000 +vt 0.273438 0.500000 +vt 0.269531 0.500000 +vt 0.273438 0.375000 +vt 0.269531 0.375000 +vt 0.273438 0.250000 +vt 0.269531 0.250000 +vt 0.285156 0.500000 +vt 0.285156 0.625000 +vt 0.277344 0.625000 +vt 0.277344 0.500000 +vt 0.273438 0.125000 +vt 0.269531 0.125000 +vt 0.273438 0.000000 +vt 0.269531 0.000000 +vt 0.285156 0.375000 +vt 0.277344 0.375000 +vt 0.285156 0.875000 +vt 0.285156 1.000000 +vt 0.277344 1.000000 +vt 0.277344 0.875000 +vt 0.285156 0.250000 +vt 0.277344 0.250000 +vt 0.285156 0.750000 +vt 0.277344 0.750000 +vt 0.285156 0.125000 +vt 0.277344 0.125000 +vt 0.285156 0.000000 +vt 0.277344 0.000000 +vt 0.273438 1.000000 +vt 0.269531 1.000000 +vt 0.296875 0.000000 +vt 0.304688 0.000000 +vt 0.304688 0.125000 +vt 0.296875 0.125000 +vt 0.289062 0.875000 +vt 0.292969 0.875000 +vt 0.292969 1.000000 +vt 0.289062 1.000000 +vt 0.289062 0.750000 +vt 0.292969 0.750000 +vt 0.289062 0.625000 +vt 0.292969 0.625000 +vt 0.289062 0.500000 +vt 0.292969 0.500000 +vt 0.296875 0.750000 +vt 0.304688 0.750000 +vt 0.304688 0.875000 +vt 0.296875 0.875000 +vt 0.289062 0.375000 +vt 0.292969 0.375000 +vt 0.289062 0.250000 +vt 0.292969 0.250000 +vt 0.296875 0.625000 +vt 0.304688 0.625000 +vt 0.289062 0.125000 +vt 0.292969 0.125000 +vt 0.296875 0.500000 +vt 0.304688 0.500000 +vt 0.289062 0.000000 +vt 0.292969 0.000000 +vt 0.296875 0.375000 +vt 0.304688 0.375000 +vt 0.304688 1.000000 +vt 0.296875 1.000000 +vt 0.296875 0.250000 +vt 0.304688 0.250000 +vt 0.398438 0.750000 +vt 0.398438 0.875000 +vt 0.394531 0.875000 +vt 0.394531 0.750000 +vt 0.398438 0.625000 +vt 0.394531 0.625000 +vt 0.398438 0.500000 +vt 0.394531 0.500000 +vt 0.398438 0.375000 +vt 0.394531 0.375000 +vt 0.398438 0.250000 +vt 0.394531 0.250000 +vt 0.410156 0.500000 +vt 0.410156 0.625000 +vt 0.402344 0.625000 +vt 0.402344 0.500000 +vt 0.398438 0.125000 +vt 0.394531 0.125000 +vt 0.398438 0.000000 +vt 0.394531 0.000000 +vt 0.410156 0.375000 +vt 0.402344 0.375000 +vt 0.410156 0.875000 +vt 0.410156 1.000000 +vt 0.402344 1.000000 +vt 0.402344 0.875000 +vt 0.410156 0.250000 +vt 0.402344 0.250000 +vt 0.410156 0.750000 +vt 0.402344 0.750000 +vt 0.410156 0.125000 +vt 0.402344 0.125000 +vt 0.410156 0.000000 +vt 0.402344 0.000000 +vt 0.398438 1.000000 +vt 0.394531 1.000000 +vt 0.421875 0.000000 +vt 0.429688 0.000000 +vt 0.429688 0.125000 +vt 0.421875 0.125000 +vt 0.414062 0.875000 +vt 0.417969 0.875000 +vt 0.417969 1.000000 +vt 0.414062 1.000000 +vt 0.414062 0.750000 +vt 0.417969 0.750000 +vt 0.414062 0.625000 +vt 0.417969 0.625000 +vt 0.414062 0.500000 +vt 0.417969 0.500000 +vt 0.421875 0.750000 +vt 0.429688 0.750000 +vt 0.429688 0.875000 +vt 0.421875 0.875000 +vt 0.414062 0.375000 +vt 0.417969 0.375000 +vt 0.414062 0.250000 +vt 0.417969 0.250000 +vt 0.421875 0.625000 +vt 0.429688 0.625000 +vt 0.414062 0.125000 +vt 0.417969 0.125000 +vt 0.421875 0.500000 +vt 0.429688 0.500000 +vt 0.414062 0.000000 +vt 0.417969 0.000000 +vt 0.421875 0.375000 +vt 0.429688 0.375000 +vt 0.429688 1.000000 +vt 0.421875 1.000000 +vt 0.421875 0.250000 +vt 0.429688 0.250000 +vt 0.523438 0.750000 +vt 0.523438 0.875000 +vt 0.519531 0.875000 +vt 0.519531 0.750000 +vt 0.523438 0.625000 +vt 0.519531 0.625000 +vt 0.523438 0.500000 +vt 0.519531 0.500000 +vt 0.523438 0.375000 +vt 0.519531 0.375000 +vt 0.523438 0.250000 +vt 0.519531 0.250000 +vt 0.535156 0.500000 +vt 0.535156 0.625000 +vt 0.527344 0.625000 +vt 0.527344 0.500000 +vt 0.523438 0.125000 +vt 0.519531 0.125000 +vt 0.523438 0.000000 +vt 0.519531 0.000000 +vt 0.535156 0.375000 +vt 0.527344 0.375000 +vt 0.535156 0.875000 +vt 0.535156 1.000000 +vt 0.527344 1.000000 +vt 0.527344 0.875000 +vt 0.535156 0.250000 +vt 0.527344 0.250000 +vt 0.535156 0.750000 +vt 0.527344 0.750000 +vt 0.535156 0.125000 +vt 0.527344 0.125000 +vt 0.535156 0.000000 +vt 0.527344 0.000000 +vt 0.523438 1.000000 +vt 0.519531 1.000000 +vt 0.546875 0.000000 +vt 0.554688 0.000000 +vt 0.554688 0.125000 +vt 0.546875 0.125000 +vt 0.539062 0.875000 +vt 0.542969 0.875000 +vt 0.542969 1.000000 +vt 0.539062 1.000000 +vt 0.539062 0.750000 +vt 0.542969 0.750000 +vt 0.539062 0.625000 +vt 0.542969 0.625000 +vt 0.539062 0.500000 +vt 0.542969 0.500000 +vt 0.546875 0.750000 +vt 0.554688 0.750000 +vt 0.554688 0.875000 +vt 0.546875 0.875000 +vt 0.539062 0.375000 +vt 0.542969 0.375000 +vt 0.539062 0.250000 +vt 0.542969 0.250000 +vt 0.546875 0.625000 +vt 0.554688 0.625000 +vt 0.539062 0.125000 +vt 0.542969 0.125000 +vt 0.546875 0.500000 +vt 0.554688 0.500000 +vt 0.539062 0.000000 +vt 0.542969 0.000000 +vt 0.546875 0.375000 +vt 0.554688 0.375000 +vt 0.554688 1.000000 +vt 0.546875 1.000000 +vt 0.546875 0.250000 +vt 0.554688 0.250000 +vt 0.648438 0.750000 +vt 0.648438 0.875000 +vt 0.644531 0.875000 +vt 0.644531 0.750000 +vt 0.648438 0.625000 +vt 0.644531 0.625000 +vt 0.648438 0.500000 +vt 0.644531 0.500000 +vt 0.648438 0.375000 +vt 0.644531 0.375000 +vt 0.648438 0.250000 +vt 0.644531 0.250000 +vt 0.660156 0.500000 +vt 0.660156 0.625000 +vt 0.652344 0.625000 +vt 0.652344 0.500000 +vt 0.648438 0.125000 +vt 0.644531 0.125000 +vt 0.648438 0.000000 +vt 0.644531 0.000000 +vt 0.660156 0.375000 +vt 0.652344 0.375000 +vt 0.660156 0.875000 +vt 0.660156 1.000000 +vt 0.652344 1.000000 +vt 0.652344 0.875000 +vt 0.660156 0.250000 +vt 0.652344 0.250000 +vt 0.660156 0.750000 +vt 0.652344 0.750000 +vt 0.660156 0.125000 +vt 0.652344 0.125000 +vt 0.660156 0.000000 +vt 0.652344 0.000000 +vt 0.648438 1.000000 +vt 0.644531 1.000000 +vt 0.671875 0.000000 +vt 0.679688 0.000000 +vt 0.679688 0.125000 +vt 0.671875 0.125000 +vt 0.664062 0.875000 +vt 0.667969 0.875000 +vt 0.667969 1.000000 +vt 0.664062 1.000000 +vt 0.664062 0.750000 +vt 0.667969 0.750000 +vt 0.664062 0.625000 +vt 0.667969 0.625000 +vt 0.664062 0.500000 +vt 0.667969 0.500000 +vt 0.671875 0.750000 +vt 0.679688 0.750000 +vt 0.679688 0.875000 +vt 0.671875 0.875000 +vt 0.664062 0.375000 +vt 0.667969 0.375000 +vt 0.664062 0.250000 +vt 0.667969 0.250000 +vt 0.671875 0.625000 +vt 0.679688 0.625000 +vt 0.664062 0.125000 +vt 0.667969 0.125000 +vt 0.671875 0.500000 +vt 0.679688 0.500000 +vt 0.664062 0.000000 +vt 0.667969 0.000000 +vt 0.671875 0.375000 +vt 0.679688 0.375000 +vt 0.679688 1.000000 +vt 0.671875 1.000000 +vt 0.671875 0.250000 +vt 0.679688 0.250000 +vt 0.773438 0.750000 +vt 0.773438 0.875000 +vt 0.769531 0.875000 +vt 0.769531 0.750000 +vt 0.773438 0.625000 +vt 0.769531 0.625000 +vt 0.773438 0.500000 +vt 0.769531 0.500000 +vt 0.773438 0.375000 +vt 0.769531 0.375000 +vt 0.773438 0.250000 +vt 0.769531 0.250000 +vt 0.785156 0.500000 +vt 0.785156 0.625000 +vt 0.777344 0.625000 +vt 0.777344 0.500000 +vt 0.773438 0.125000 +vt 0.769531 0.125000 +vt 0.773438 0.000000 +vt 0.769531 0.000000 +vt 0.785156 0.375000 +vt 0.777344 0.375000 +vt 0.785156 0.875000 +vt 0.785156 1.000000 +vt 0.777344 1.000000 +vt 0.777344 0.875000 +vt 0.785156 0.250000 +vt 0.777344 0.250000 +vt 0.785156 0.750000 +vt 0.777344 0.750000 +vt 0.785156 0.125000 +vt 0.777344 0.125000 +vt 0.785156 0.000000 +vt 0.777344 0.000000 +vt 0.773438 1.000000 +vt 0.769531 1.000000 +vt 0.796875 0.000000 +vt 0.804688 0.000000 +vt 0.804688 0.125000 +vt 0.796875 0.125000 +vt 0.789062 0.875000 +vt 0.792969 0.875000 +vt 0.792969 1.000000 +vt 0.789062 1.000000 +vt 0.789062 0.750000 +vt 0.792969 0.750000 +vt 0.789062 0.625000 +vt 0.792969 0.625000 +vt 0.789062 0.500000 +vt 0.792969 0.500000 +vt 0.796875 0.750000 +vt 0.804688 0.750000 +vt 0.804688 0.875000 +vt 0.796875 0.875000 +vt 0.789062 0.375000 +vt 0.792969 0.375000 +vt 0.789062 0.250000 +vt 0.792969 0.250000 +vt 0.796875 0.625000 +vt 0.804688 0.625000 +vt 0.789062 0.125000 +vt 0.792969 0.125000 +vt 0.796875 0.500000 +vt 0.804688 0.500000 +vt 0.789062 0.000000 +vt 0.792969 0.000000 +vt 0.796875 0.375000 +vt 0.804688 0.375000 +vt 0.804688 1.000000 +vt 0.796875 1.000000 +vt 0.796875 0.250000 +vt 0.804688 0.250000 +vt 0.898438 0.750000 +vt 0.898438 0.875000 +vt 0.894531 0.875000 +vt 0.894531 0.750000 +vt 0.898438 0.625000 +vt 0.894531 0.625000 +vt 0.898438 0.500000 +vt 0.894531 0.500000 +vt 0.898438 0.375000 +vt 0.894531 0.375000 +vt 0.898438 0.250000 +vt 0.894531 0.250000 +vt 0.910156 0.500000 +vt 0.910156 0.625000 +vt 0.902344 0.625000 +vt 0.902344 0.500000 +vt 0.898438 0.125000 +vt 0.894531 0.125000 +vt 0.898438 0.000000 +vt 0.894531 0.000000 +vt 0.910156 0.375000 +vt 0.902344 0.375000 +vt 0.910156 0.875000 +vt 0.910156 1.000000 +vt 0.902344 1.000000 +vt 0.902344 0.875000 +vt 0.910156 0.250000 +vt 0.902344 0.250000 +vt 0.910156 0.750000 +vt 0.902344 0.750000 +vt 0.910156 0.125000 +vt 0.902344 0.125000 +vt 0.910156 0.000000 +vt 0.902344 0.000000 +vt 0.898438 1.000000 +vt 0.894531 1.000000 +vt 0.921875 0.000000 +vt 0.929688 0.000000 +vt 0.929688 0.125000 +vt 0.921875 0.125000 +vt 0.914062 0.875000 +vt 0.917969 0.875000 +vt 0.917969 1.000000 +vt 0.914062 1.000000 +vt 0.914062 0.750000 +vt 0.917969 0.750000 +vt 0.914062 0.625000 +vt 0.917969 0.625000 +vt 0.914062 0.500000 +vt 0.917969 0.500000 +vt 0.921875 0.750000 +vt 0.929688 0.750000 +vt 0.929688 0.875000 +vt 0.921875 0.875000 +vt 0.914062 0.375000 +vt 0.917969 0.375000 +vt 0.914062 0.250000 +vt 0.917969 0.250000 +vt 0.921875 0.625000 +vt 0.929688 0.625000 +vt 0.914062 0.125000 +vt 0.917969 0.125000 +vt 0.921875 0.500000 +vt 0.929688 0.500000 +vt 0.914062 0.000000 +vt 0.917969 0.000000 +vt 0.921875 0.375000 +vt 0.929688 0.375000 +vt 0.929688 1.000000 +vt 0.921875 1.000000 +vt 0.921875 0.250000 +vt 0.929688 0.250000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.382700 0.000000 -0.923900 +vn 0.923900 0.000000 -0.382700 +vn 0.923900 0.000000 0.382700 +vn 0.382700 0.000000 0.923900 +vn -0.382700 0.000000 0.923900 +vn -0.923900 0.000000 0.382700 +vn -0.382700 0.000000 -0.923900 +vn -0.923900 0.000000 -0.382700 +vn 0.707100 0.000000 0.707100 +vn -0.707100 0.000000 0.707100 +vn 0.707100 0.000000 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.152100 0.000000 -0.988400 +vn -0.152100 0.000000 0.988400 +vn -0.988400 0.000000 -0.152100 +vn 0.806400 0.000000 -0.591300 +vn -0.806400 0.000000 0.591300 +vn -0.591300 0.000000 -0.806400 +vn 0.988400 0.000000 0.152100 +vn 0.591300 0.000000 0.806400 +vn 0.342000 0.000000 -0.939700 +vn -0.342000 0.000000 0.939700 +vn -0.939700 0.000000 -0.342000 +vn 0.906300 0.000000 -0.422600 +vn -0.906300 0.000000 0.422600 +vn -0.422600 0.000000 -0.906300 +vn 0.939700 0.000000 0.342000 +vn 0.422600 0.000000 0.906300 +vn 0.518800 0.000000 -0.854900 +vn -0.518800 0.000000 0.854900 +vn -0.854900 0.000000 -0.518800 +vn 0.971300 0.000000 -0.237700 +vn -0.971300 0.000000 0.237700 +vn -0.237700 0.000000 -0.971300 +vn 0.854900 0.000000 0.518800 +vn 0.237700 0.000000 0.971300 +vn 0.675600 0.000000 -0.737300 +vn -0.675600 0.000000 0.737300 +vn -0.737300 0.000000 -0.675600 +vn 0.999000 0.000000 -0.043600 +vn -0.999000 0.000000 0.043600 +vn -0.043600 0.000000 -0.999000 +vn 0.737300 0.000000 0.675600 +vn 0.043600 0.000000 0.999000 +vn 0.555600 0.000000 0.831500 +vn 0.195100 0.000000 0.980800 +vn -0.195100 0.000000 0.980800 +vn -0.555600 0.000000 0.831500 +vn -0.831500 0.000000 0.555600 +vn 0.195100 0.000000 -0.980800 +vn -0.980800 0.000000 0.195100 +vn -0.980800 0.000000 -0.195100 +vn 0.555600 0.000000 -0.831500 +vn -0.831500 0.000000 -0.555600 +vn 0.831500 0.000000 -0.555600 +vn -0.555600 0.000000 -0.831500 +vn 0.980800 0.000000 -0.195100 +vn -0.195100 0.000000 -0.980800 +vn 0.980800 0.000000 0.195100 +vn 0.831500 0.000000 0.555600 +g Cylinder.002_Cylinder.003_sides +s off +f 105/1/1 109/2/1 110/3/1 106/4/1 +f 106/1/2 110/2/2 111/3/2 107/4/2 +f 107/4/3 111/3/3 112/2/3 108/1/3 +f 109/2/4 105/1/4 108/4/4 112/3/4 +g Cylinder.002_Cylinder.003_top-bottom +f 105/2/5 106/1/5 107/4/5 108/3/5 +f 109/2/6 112/3/6 111/4/6 110/1/6 +g Cylinder.002_Cylinder.003_turbine-top-bottom +f 74/5/5 73/6/5 88/7/5 87/8/5 86/9/5 85/10/5 84/11/5 83/12/5 82/13/5 81/14/5 80/15/5 79/16/5 78/17/5 77/18/5 76/19/5 75/20/5 +f 18/5/5 17/6/5 32/7/5 31/8/5 30/9/5 29/10/5 28/11/5 27/12/5 26/13/5 25/14/5 24/15/5 23/16/5 22/17/5 21/18/5 20/19/5 19/20/5 +f 33/6/6 34/5/6 35/20/6 36/19/6 37/18/6 38/17/6 39/16/6 40/15/6 41/14/6 42/13/6 43/12/6 44/11/6 45/10/6 46/9/6 47/8/6 48/7/6 +f 57/6/6 58/5/6 59/20/6 60/19/6 61/18/6 62/17/6 63/16/6 64/15/6 65/14/6 66/13/6 67/12/6 68/11/6 69/10/6 70/9/6 71/8/6 72/7/6 +f 410/21/5 409/22/5 424/23/5 423/24/5 422/25/5 421/26/5 420/27/5 419/28/5 418/29/5 417/30/5 416/31/5 415/32/5 414/10/5 413/9/5 412/33/5 411/34/5 +f 362/21/5 361/22/5 376/23/5 375/24/5 374/25/5 373/26/5 372/27/5 371/28/5 370/29/5 369/30/5 368/31/5 367/32/5 366/10/5 365/9/5 364/33/5 363/34/5 +f 377/22/6 378/21/6 379/34/6 380/33/6 381/9/6 382/10/6 383/32/6 384/31/6 385/30/6 386/29/6 387/28/6 388/27/6 389/26/6 390/25/6 391/24/6 392/23/6 +f 393/22/6 394/21/6 395/34/6 396/33/6 397/9/6 398/10/6 399/32/6 400/31/6 401/30/6 402/29/6 403/28/6 404/27/6 405/26/6 406/25/6 407/24/6 408/23/6 +f 474/35/5 473/36/5 488/37/5 487/38/5 486/39/5 485/40/5 484/41/5 483/42/5 482/43/5 481/44/5 480/45/5 479/46/5 478/26/5 477/25/5 476/47/5 475/48/5 +f 426/35/5 425/36/5 440/37/5 439/38/5 438/39/5 437/40/5 436/41/5 435/42/5 434/43/5 433/44/5 432/45/5 431/46/5 430/26/5 429/25/5 428/47/5 427/48/5 +f 441/36/6 442/35/6 443/48/6 444/47/6 445/25/6 446/26/6 447/46/6 448/45/6 449/44/6 450/43/6 451/42/6 452/41/6 453/40/6 454/39/6 455/38/6 456/37/6 +f 457/36/6 458/35/6 459/48/6 460/47/6 461/25/6 462/26/6 463/46/6 464/45/6 465/44/6 466/43/6 467/42/6 468/41/6 469/40/6 470/39/6 471/38/6 472/37/6 +f 538/49/5 537/50/5 552/51/5 551/52/5 550/53/5 549/54/5 548/55/5 547/56/5 546/57/5 545/58/5 544/59/5 543/60/5 542/40/5 541/39/5 540/61/5 539/62/5 +f 490/49/5 489/50/5 504/51/5 503/52/5 502/53/5 501/54/5 500/55/5 499/56/5 498/57/5 497/58/5 496/59/5 495/60/5 494/40/5 493/39/5 492/61/5 491/62/5 +f 505/50/6 506/49/6 507/62/6 508/61/6 509/39/6 510/40/6 511/60/6 512/59/6 513/58/6 514/57/6 515/56/6 516/55/6 517/54/6 518/53/6 519/52/6 520/51/6 +f 521/50/6 522/49/6 523/62/6 524/61/6 525/39/6 526/40/6 527/60/6 528/59/6 529/58/6 530/57/6 531/56/6 532/55/6 533/54/6 534/53/6 535/52/6 536/51/6 +f 602/63/5 601/64/5 616/65/5 615/66/5 614/67/5 613/68/5 612/69/5 611/70/5 610/71/5 609/72/5 608/73/5 607/74/5 606/54/5 605/53/5 604/75/5 603/76/5 +f 554/63/5 553/64/5 568/65/5 567/66/5 566/67/5 565/68/5 564/69/5 563/70/5 562/71/5 561/72/5 560/73/5 559/74/5 558/54/5 557/53/5 556/75/5 555/76/5 +f 569/64/6 570/63/6 571/76/6 572/75/6 573/53/6 574/54/6 575/74/6 576/73/6 577/72/6 578/71/6 579/70/6 580/69/6 581/68/6 582/67/6 583/66/6 584/65/6 +f 585/64/6 586/63/6 587/76/6 588/75/6 589/53/6 590/54/6 591/74/6 592/73/6 593/72/6 594/71/6 595/70/6 596/69/6 597/68/6 598/67/6 599/66/6 600/65/6 +f 666/77/5 665/78/5 680/79/5 679/80/5 678/81/5 677/82/5 676/83/5 675/84/5 674/85/5 673/86/5 672/87/5 671/88/5 670/68/5 669/67/5 668/89/5 667/90/5 +f 618/77/5 617/78/5 632/79/5 631/80/5 630/81/5 629/82/5 628/83/5 627/84/5 626/85/5 625/86/5 624/87/5 623/88/5 622/68/5 621/67/5 620/89/5 619/90/5 +f 633/78/6 634/77/6 635/90/6 636/89/6 637/67/6 638/68/6 639/88/6 640/87/6 641/86/6 642/85/6 643/84/6 644/83/6 645/82/6 646/81/6 647/80/6 648/79/6 +f 649/78/6 650/77/6 651/90/6 652/89/6 653/67/6 654/68/6 655/88/6 656/87/6 657/86/6 658/85/6 659/84/6 660/83/6 661/82/6 662/81/6 663/80/6 664/79/6 +f 730/91/5 729/92/5 744/93/5 743/94/5 742/95/5 741/96/5 740/97/5 739/98/5 738/99/5 737/100/5 736/101/5 735/102/5 734/82/5 733/81/5 732/103/5 731/104/5 +f 682/91/5 681/92/5 696/93/5 695/94/5 694/95/5 693/96/5 692/97/5 691/98/5 690/99/5 689/100/5 688/101/5 687/102/5 686/82/5 685/81/5 684/103/5 683/104/5 +f 697/92/6 698/91/6 699/104/6 700/103/6 701/81/6 702/82/6 703/102/6 704/101/6 705/100/6 706/99/6 707/98/6 708/97/6 709/96/6 710/95/6 711/94/6 712/93/6 +f 713/92/6 714/91/6 715/104/6 716/103/6 717/81/6 718/82/6 719/102/6 720/101/6 721/100/6 722/99/6 723/98/6 724/97/6 725/96/6 726/95/6 727/94/6 728/93/6 +f 794/105/5 793/106/5 808/107/5 807/108/5 806/109/5 805/110/5 804/111/5 803/112/5 802/113/5 801/114/5 800/115/5 799/116/5 798/96/5 797/95/5 796/117/5 795/118/5 +f 746/105/5 745/106/5 760/107/5 759/108/5 758/109/5 757/110/5 756/111/5 755/112/5 754/113/5 753/114/5 752/115/5 751/116/5 750/96/5 749/95/5 748/117/5 747/118/5 +f 761/106/6 762/105/6 763/118/6 764/117/6 765/95/6 766/96/6 767/116/6 768/115/6 769/114/6 770/113/6 771/112/6 772/111/6 773/110/6 774/109/6 775/108/6 776/107/6 +f 777/106/6 778/105/6 779/118/6 780/117/6 781/95/6 782/96/6 783/116/6 784/115/6 785/114/6 786/113/6 787/112/6 788/111/6 789/110/6 790/109/6 791/108/6 792/107/6 +g Cylinder.002_Cylinder.003_turbine-blades-etc +f 1/119/7 2/120/7 4/121/7 3/122/7 +f 3/122/8 4/121/8 6/123/8 5/124/8 +f 5/125/9 6/126/9 8/127/9 7/128/9 +f 7/128/10 8/127/10 10/129/10 9/130/10 +f 9/130/11 10/129/11 12/131/11 11/132/11 +f 11/132/12 12/131/12 14/123/12 13/124/12 +f 4/133/6 2/134/6 16/135/6 14/136/6 12/137/6 10/138/6 8/139/6 6/140/6 +f 15/141/13 16/142/13 2/120/13 1/119/13 +f 13/143/14 14/144/14 16/142/14 15/141/14 +f 27/145/15 28/146/15 44/147/15 43/148/15 +f 26/149/10 27/145/10 43/148/10 42/150/10 +f 25/151/2 26/149/2 42/150/2 41/152/2 +f 24/153/11 25/151/11 41/152/11 40/154/11 +f 23/155/16 24/153/16 40/154/16 39/156/16 +f 17/157/4 18/158/4 34/159/4 33/160/4 +f 22/161/12 23/155/12 39/156/12 38/162/12 +f 21/163/3 22/161/3 38/162/3 37/164/3 +f 32/165/7 17/157/7 33/160/7 48/166/7 +f 20/167/14 21/168/14 37/169/14 36/170/14 +f 31/171/17 32/165/17 48/166/17 47/172/17 +f 19/173/18 20/167/18 36/170/18 35/174/18 +f 30/175/8 31/171/8 47/172/8 46/176/8 +f 18/158/13 19/173/13 35/174/13 34/159/13 +f 29/177/1 30/175/1 46/176/1 45/178/1 +f 28/146/9 29/179/9 45/180/9 44/147/9 +f 52/181/19 51/182/19 50/183/19 49/184/19 +f 53/185/20 54/186/20 55/187/20 56/188/20 +f 51/182/21 52/181/21 53/185/21 56/188/21 +f 67/189/15 83/190/15 84/191/15 68/192/15 +f 66/193/10 82/194/10 83/195/10 67/196/10 +f 65/197/2 81/198/2 82/194/2 66/193/2 +f 64/199/11 80/200/11 81/198/11 65/197/11 +f 63/201/16 79/202/16 80/200/16 64/199/16 +f 57/203/4 73/204/4 74/205/4 58/206/4 +f 62/207/12 78/208/12 79/202/12 63/201/12 +f 61/209/3 77/210/3 78/208/3 62/207/3 +f 72/211/7 88/212/7 73/204/7 57/203/7 +f 60/213/14 76/214/14 77/210/14 61/209/14 +f 71/215/17 87/216/17 88/212/17 72/211/17 +f 59/217/18 75/218/18 76/214/18 60/213/18 +f 70/219/8 86/220/8 87/216/8 71/215/8 +f 58/206/13 74/205/13 75/221/13 59/222/13 +f 69/223/1 85/224/1 86/220/1 70/219/1 +f 68/192/9 84/191/9 85/224/9 69/223/9 +f 89/225/17 90/226/17 92/227/17 91/228/17 +f 91/229/1 92/230/1 94/231/1 93/232/1 +f 93/232/15 94/231/15 96/233/15 95/234/15 +f 95/234/2 96/233/2 98/235/2 97/236/2 +f 97/236/16 98/235/16 100/237/16 99/238/16 +f 99/238/3 100/237/3 102/239/3 101/240/3 +f 103/241/4 104/242/4 90/226/4 89/225/4 +f 101/240/18 102/239/18 104/242/18 103/241/18 +f 116/181/22 115/182/22 114/183/22 113/184/22 +f 117/185/23 118/186/23 119/187/23 120/188/23 +f 115/182/24 116/181/24 117/185/24 120/188/24 +f 124/181/25 123/182/25 122/183/25 121/184/25 +f 125/185/21 126/186/21 127/187/21 128/188/21 +f 123/182/19 124/181/19 125/185/19 128/188/19 +f 132/181/26 131/182/26 130/183/26 129/184/26 +f 133/185/24 134/186/24 135/187/24 136/188/24 +f 131/182/22 132/181/22 133/185/22 136/188/22 +f 140/181/20 139/182/20 138/183/20 137/184/20 +f 141/185/19 142/186/19 143/187/19 144/188/19 +f 139/182/25 140/181/25 141/185/25 144/188/25 +f 148/181/23 147/182/23 146/183/23 145/184/23 +f 149/185/22 150/186/22 151/187/22 152/188/22 +f 147/182/26 148/181/26 149/185/26 152/188/26 +f 156/181/21 155/182/21 154/183/21 153/184/21 +f 157/185/25 158/186/25 159/187/25 160/188/25 +f 155/182/20 156/181/20 157/185/20 160/188/20 +f 164/181/24 163/182/24 162/183/24 161/184/24 +f 165/185/26 166/186/26 167/187/26 168/188/26 +f 163/182/23 164/181/23 165/185/23 168/188/23 +f 172/243/27 171/244/27 170/245/27 169/246/27 +f 173/247/28 174/248/28 175/249/28 176/250/28 +f 171/244/29 172/243/29 173/247/29 176/250/29 +f 180/243/30 179/244/30 178/245/30 177/246/30 +f 181/247/31 182/248/31 183/249/31 184/250/31 +f 179/244/32 180/243/32 181/247/32 184/250/32 +f 188/243/33 187/244/33 186/245/33 185/246/33 +f 189/247/29 190/248/29 191/249/29 192/250/29 +f 187/244/27 188/243/27 189/247/27 192/250/27 +f 196/243/34 195/244/34 194/245/34 193/246/34 +f 197/247/32 198/248/32 199/249/32 200/250/32 +f 195/244/30 196/243/30 197/247/30 200/250/30 +f 204/243/28 203/244/28 202/245/28 201/246/28 +f 205/247/27 206/248/27 207/249/27 208/250/27 +f 203/244/33 204/243/33 205/247/33 208/250/33 +f 212/243/31 211/244/31 210/245/31 209/246/31 +f 213/247/30 214/248/30 215/249/30 216/250/30 +f 211/244/34 212/243/34 213/247/34 216/250/34 +f 220/243/29 219/244/29 218/245/29 217/246/29 +f 221/247/33 222/248/33 223/249/33 224/250/33 +f 219/244/28 220/243/28 221/247/28 224/250/28 +f 228/243/32 227/244/32 226/245/32 225/246/32 +f 229/247/34 230/248/34 231/249/34 232/250/34 +f 227/244/31 228/243/31 229/247/31 232/250/31 +f 236/251/35 235/252/35 234/253/35 233/254/35 +f 237/255/36 238/256/36 239/257/36 240/258/36 +f 235/252/37 236/251/37 237/255/37 240/258/37 +f 244/251/38 243/252/38 242/253/38 241/254/38 +f 245/255/39 246/256/39 247/257/39 248/258/39 +f 243/252/40 244/251/40 245/255/40 248/258/40 +f 252/251/41 251/252/41 250/253/41 249/254/41 +f 253/255/37 254/256/37 255/257/37 256/258/37 +f 251/252/35 252/251/35 253/255/35 256/258/35 +f 260/251/42 259/252/42 258/253/42 257/254/42 +f 261/255/40 262/256/40 263/257/40 264/258/40 +f 259/252/38 260/251/38 261/255/38 264/258/38 +f 268/251/36 267/252/36 266/253/36 265/254/36 +f 269/255/35 270/256/35 271/257/35 272/258/35 +f 267/252/41 268/251/41 269/255/41 272/258/41 +f 276/251/39 275/252/39 274/253/39 273/254/39 +f 277/255/38 278/256/38 279/257/38 280/258/38 +f 275/252/42 276/251/42 277/255/42 280/258/42 +f 284/251/37 283/252/37 282/253/37 281/254/37 +f 285/255/41 286/256/41 287/257/41 288/258/41 +f 283/252/36 284/251/36 285/255/36 288/258/36 +f 292/251/40 291/252/40 290/253/40 289/254/40 +f 293/255/42 294/256/42 295/257/42 296/258/42 +f 291/252/39 292/251/39 293/255/39 296/258/39 +f 300/259/43 299/260/43 298/261/43 297/262/43 +f 301/263/44 302/264/44 303/265/44 304/266/44 +f 299/260/45 300/259/45 301/263/45 304/266/45 +f 308/259/46 307/260/46 306/261/46 305/262/46 +f 309/263/47 310/264/47 311/265/47 312/266/47 +f 307/260/48 308/259/48 309/263/48 312/266/48 +f 316/259/49 315/260/49 314/261/49 313/262/49 +f 317/263/45 318/264/45 319/265/45 320/266/45 +f 315/260/43 316/259/43 317/263/43 320/266/43 +f 324/259/50 323/260/50 322/261/50 321/262/50 +f 325/263/48 326/264/48 327/265/48 328/266/48 +f 323/260/46 324/259/46 325/263/46 328/266/46 +f 332/259/44 331/260/44 330/261/44 329/262/44 +f 333/263/43 334/264/43 335/265/43 336/266/43 +f 331/260/49 332/259/49 333/263/49 336/266/49 +f 340/259/47 339/260/47 338/261/47 337/262/47 +f 341/263/46 342/264/46 343/265/46 344/266/46 +f 339/260/50 340/259/50 341/263/50 344/266/50 +f 348/259/45 347/260/45 346/261/45 345/262/45 +f 349/263/49 350/264/49 351/265/49 352/266/49 +f 347/260/44 348/259/44 349/263/44 352/266/44 +f 356/259/48 355/260/48 354/261/48 353/262/48 +f 357/263/50 358/264/50 359/265/50 360/266/50 +f 355/260/47 356/259/47 357/263/47 360/266/47 +f 371/267/51 372/268/51 388/269/51 387/270/51 +f 370/271/52 371/267/52 387/270/52 386/272/52 +f 369/273/53 370/271/53 386/272/53 385/274/53 +f 368/275/54 369/273/54 385/274/54 384/276/54 +f 367/277/55 368/275/55 384/276/55 383/278/55 +f 361/279/56 362/280/56 378/281/56 377/282/56 +f 366/283/57 367/277/57 383/278/57 382/284/57 +f 365/285/58 366/283/58 382/284/58 381/286/58 +f 376/287/59 361/279/59 377/282/59 392/288/59 +f 364/289/60 365/290/60 381/291/60 380/292/60 +f 375/293/61 376/287/61 392/288/61 391/294/61 +f 363/295/62 364/289/62 380/292/62 379/296/62 +f 374/297/63 375/293/63 391/294/63 390/298/63 +f 362/280/64 363/295/64 379/296/64 378/281/64 +f 373/299/65 374/297/65 390/298/65 389/300/65 +f 372/268/66 373/301/66 389/302/66 388/269/66 +f 403/303/51 419/304/51 420/305/51 404/306/51 +f 402/307/52 418/308/52 419/309/52 403/310/52 +f 401/311/53 417/312/53 418/308/53 402/307/53 +f 400/313/54 416/314/54 417/312/54 401/311/54 +f 399/315/55 415/316/55 416/314/55 400/313/55 +f 393/317/56 409/318/56 410/319/56 394/320/56 +f 398/321/57 414/322/57 415/316/57 399/315/57 +f 397/323/58 413/324/58 414/322/58 398/321/58 +f 408/325/59 424/326/59 409/318/59 393/317/59 +f 396/327/60 412/328/60 413/324/60 397/323/60 +f 407/329/61 423/330/61 424/326/61 408/325/61 +f 395/331/62 411/332/62 412/328/62 396/327/62 +f 406/333/63 422/334/63 423/330/63 407/329/63 +f 394/320/64 410/319/64 411/335/64 395/336/64 +f 405/337/65 421/338/65 422/334/65 406/333/65 +f 404/306/66 420/305/66 421/338/66 405/337/66 +f 435/339/10 436/340/10 452/341/10 451/342/10 +f 434/343/2 435/339/2 451/342/2 450/344/2 +f 433/345/11 434/343/11 450/344/11 449/346/11 +f 432/347/16 433/345/16 449/346/16 448/348/16 +f 431/349/12 432/347/12 448/348/12 447/350/12 +f 425/351/7 426/352/7 442/353/7 441/354/7 +f 430/355/3 431/349/3 447/350/3 446/356/3 +f 429/357/14 430/355/14 446/356/14 445/358/14 +f 440/359/17 425/351/17 441/354/17 456/360/17 +f 428/361/18 429/362/18 445/363/18 444/364/18 +f 439/365/8 440/359/8 456/360/8 455/366/8 +f 427/367/13 428/361/13 444/364/13 443/368/13 +f 438/369/1 439/365/1 455/366/1 454/370/1 +f 426/352/4 427/367/4 443/368/4 442/353/4 +f 437/371/9 438/369/9 454/370/9 453/372/9 +f 436/340/15 437/373/15 453/374/15 452/341/15 +f 467/375/10 483/376/10 484/377/10 468/378/10 +f 466/379/2 482/380/2 483/381/2 467/382/2 +f 465/383/11 481/384/11 482/380/11 466/379/11 +f 464/385/16 480/386/16 481/384/16 465/383/16 +f 463/387/12 479/388/12 480/386/12 464/385/12 +f 457/389/7 473/390/7 474/391/7 458/392/7 +f 462/393/3 478/394/3 479/388/3 463/387/3 +f 461/395/14 477/396/14 478/394/14 462/393/14 +f 472/397/17 488/398/17 473/390/17 457/389/17 +f 460/399/18 476/400/18 477/396/18 461/395/18 +f 471/401/8 487/402/8 488/398/8 472/397/8 +f 459/403/13 475/404/13 476/400/13 460/399/13 +f 470/405/1 486/406/1 487/402/1 471/401/1 +f 458/392/4 474/391/4 475/407/4 459/408/4 +f 469/409/9 485/410/9 486/406/9 470/405/9 +f 468/378/15 484/377/15 485/410/15 469/409/15 +f 499/411/52 500/412/52 516/413/52 515/414/52 +f 498/415/53 499/411/53 515/414/53 514/416/53 +f 497/417/54 498/415/54 514/416/54 513/418/54 +f 496/419/55 497/417/55 513/418/55 512/420/55 +f 495/421/57 496/419/57 512/420/57 511/422/57 +f 489/423/59 490/424/59 506/425/59 505/426/59 +f 494/427/58 495/421/58 511/422/58 510/428/58 +f 493/429/60 494/427/60 510/428/60 509/430/60 +f 504/431/61 489/423/61 505/426/61 520/432/61 +f 492/433/62 493/434/62 509/435/62 508/436/62 +f 503/437/63 504/431/63 520/432/63 519/438/63 +f 491/439/64 492/433/64 508/436/64 507/440/64 +f 502/441/65 503/437/65 519/438/65 518/442/65 +f 490/424/56 491/439/56 507/440/56 506/425/56 +f 501/443/66 502/441/66 518/442/66 517/444/66 +f 500/412/51 501/445/51 517/446/51 516/413/51 +f 531/447/52 547/448/52 548/449/52 532/450/52 +f 530/451/53 546/452/53 547/453/53 531/454/53 +f 529/455/54 545/456/54 546/452/54 530/451/54 +f 528/457/55 544/458/55 545/456/55 529/455/55 +f 527/459/57 543/460/57 544/458/57 528/457/57 +f 521/461/59 537/462/59 538/463/59 522/464/59 +f 526/465/58 542/466/58 543/460/58 527/459/58 +f 525/467/60 541/468/60 542/466/60 526/465/60 +f 536/469/61 552/470/61 537/462/61 521/461/61 +f 524/471/62 540/472/62 541/468/62 525/467/62 +f 535/473/63 551/474/63 552/470/63 536/469/63 +f 523/475/64 539/476/64 540/472/64 524/471/64 +f 534/477/65 550/478/65 551/474/65 535/473/65 +f 522/464/56 538/463/56 539/479/56 523/480/56 +f 533/481/66 549/482/66 550/478/66 534/477/66 +f 532/450/51 548/449/51 549/482/51 533/481/51 +f 563/483/2 564/484/2 580/485/2 579/486/2 +f 562/487/11 563/483/11 579/486/11 578/488/11 +f 561/489/16 562/487/16 578/488/16 577/490/16 +f 560/491/12 561/489/12 577/490/12 576/492/12 +f 559/493/3 560/491/3 576/492/3 575/494/3 +f 553/495/17 554/496/17 570/497/17 569/498/17 +f 558/499/14 559/493/14 575/494/14 574/500/14 +f 557/501/18 558/499/18 574/500/18 573/502/18 +f 568/503/8 553/495/8 569/498/8 584/504/8 +f 556/505/13 557/506/13 573/507/13 572/508/13 +f 567/509/1 568/503/1 584/504/1 583/510/1 +f 555/511/4 556/505/4 572/508/4 571/512/4 +f 566/513/9 567/509/9 583/510/9 582/514/9 +f 554/496/7 555/511/7 571/512/7 570/497/7 +f 565/515/15 566/513/15 582/514/15 581/516/15 +f 564/484/10 565/517/10 581/518/10 580/485/10 +f 595/519/2 611/520/2 612/521/2 596/522/2 +f 594/523/11 610/524/11 611/525/11 595/526/11 +f 593/527/16 609/528/16 610/524/16 594/523/16 +f 592/529/12 608/530/12 609/528/12 593/527/12 +f 591/531/3 607/532/3 608/530/3 592/529/3 +f 585/533/17 601/534/17 602/535/17 586/536/17 +f 590/537/14 606/538/14 607/532/14 591/531/14 +f 589/539/18 605/540/18 606/538/18 590/537/18 +f 600/541/8 616/542/8 601/534/8 585/533/8 +f 588/543/13 604/544/13 605/540/13 589/539/13 +f 599/545/1 615/546/1 616/542/1 600/541/1 +f 587/547/4 603/548/4 604/544/4 588/543/4 +f 598/549/9 614/550/9 615/546/9 599/545/9 +f 586/536/7 602/535/7 603/551/7 587/552/7 +f 597/553/15 613/554/15 614/550/15 598/549/15 +f 596/522/10 612/521/10 613/554/10 597/553/10 +f 627/555/53 628/556/53 644/557/53 643/558/53 +f 626/559/54 627/555/54 643/558/54 642/560/54 +f 625/561/55 626/559/55 642/560/55 641/562/55 +f 624/563/57 625/561/57 641/562/57 640/564/57 +f 623/565/58 624/563/58 640/564/58 639/566/58 +f 617/567/61 618/568/61 634/569/61 633/570/61 +f 622/571/60 623/565/60 639/566/60 638/572/60 +f 621/573/62 622/571/62 638/572/62 637/574/62 +f 632/575/63 617/567/63 633/570/63 648/576/63 +f 620/577/64 621/578/64 637/579/64 636/580/64 +f 631/581/65 632/575/65 648/576/65 647/582/65 +f 619/583/56 620/577/56 636/580/56 635/584/56 +f 630/585/66 631/581/66 647/582/66 646/586/66 +f 618/568/59 619/583/59 635/584/59 634/569/59 +f 629/587/51 630/585/51 646/586/51 645/588/51 +f 628/556/52 629/589/52 645/590/52 644/557/52 +f 659/591/53 675/592/53 676/593/53 660/594/53 +f 658/595/54 674/596/54 675/597/54 659/598/54 +f 657/599/55 673/600/55 674/596/55 658/595/55 +f 656/601/57 672/602/57 673/600/57 657/599/57 +f 655/603/58 671/604/58 672/602/58 656/601/58 +f 649/605/61 665/606/61 666/607/61 650/608/61 +f 654/609/60 670/610/60 671/604/60 655/603/60 +f 653/611/62 669/612/62 670/610/62 654/609/62 +f 664/613/63 680/614/63 665/606/63 649/605/63 +f 652/615/64 668/616/64 669/612/64 653/611/64 +f 663/617/65 679/618/65 680/614/65 664/613/65 +f 651/619/56 667/620/56 668/616/56 652/615/56 +f 662/621/66 678/622/66 679/618/66 663/617/66 +f 650/608/59 666/607/59 667/623/59 651/624/59 +f 661/625/51 677/626/51 678/622/51 662/621/51 +f 660/594/52 676/593/52 677/626/52 661/625/52 +f 691/627/11 692/628/11 708/629/11 707/630/11 +f 690/631/16 691/627/16 707/630/16 706/632/16 +f 689/633/12 690/631/12 706/632/12 705/634/12 +f 688/635/3 689/633/3 705/634/3 704/636/3 +f 687/637/14 688/635/14 704/636/14 703/638/14 +f 681/639/8 682/640/8 698/641/8 697/642/8 +f 686/643/18 687/637/18 703/638/18 702/644/18 +f 685/645/13 686/643/13 702/644/13 701/646/13 +f 696/647/1 681/639/1 697/642/1 712/648/1 +f 684/649/4 685/650/4 701/651/4 700/652/4 +f 695/653/9 696/647/9 712/648/9 711/654/9 +f 683/655/7 684/649/7 700/652/7 699/656/7 +f 694/657/15 695/653/15 711/654/15 710/658/15 +f 682/640/17 683/655/17 699/656/17 698/641/17 +f 693/659/10 694/657/10 710/658/10 709/660/10 +f 692/628/2 693/661/2 709/662/2 708/629/2 +f 723/663/11 739/664/11 740/665/11 724/666/11 +f 722/667/16 738/668/16 739/669/16 723/670/16 +f 721/671/12 737/672/12 738/668/12 722/667/12 +f 720/673/3 736/674/3 737/672/3 721/671/3 +f 719/675/14 735/676/14 736/674/14 720/673/14 +f 713/677/8 729/678/8 730/679/8 714/680/8 +f 718/681/18 734/682/18 735/676/18 719/675/18 +f 717/683/13 733/684/13 734/682/13 718/681/13 +f 728/685/1 744/686/1 729/678/1 713/677/1 +f 716/687/4 732/688/4 733/684/4 717/683/4 +f 727/689/9 743/690/9 744/686/9 728/685/9 +f 715/691/7 731/692/7 732/688/7 716/687/7 +f 726/693/15 742/694/15 743/690/15 727/689/15 +f 714/680/17 730/679/17 731/695/17 715/696/17 +f 725/697/10 741/698/10 742/694/10 726/693/10 +f 724/666/2 740/665/2 741/698/2 725/697/2 +f 755/699/54 756/700/54 772/701/54 771/702/54 +f 754/703/55 755/699/55 771/702/55 770/704/55 +f 753/705/57 754/703/57 770/704/57 769/706/57 +f 752/707/58 753/705/58 769/706/58 768/708/58 +f 751/709/60 752/707/60 768/708/60 767/710/60 +f 745/711/63 746/712/63 762/713/63 761/714/63 +f 750/715/62 751/709/62 767/710/62 766/716/62 +f 749/717/64 750/715/64 766/716/64 765/718/64 +f 760/719/65 745/711/65 761/714/65 776/720/65 +f 748/721/56 749/722/56 765/723/56 764/724/56 +f 759/725/66 760/719/66 776/720/66 775/726/66 +f 747/727/59 748/721/59 764/724/59 763/728/59 +f 758/729/51 759/725/51 775/726/51 774/730/51 +f 746/712/61 747/727/61 763/728/61 762/713/61 +f 757/731/52 758/729/52 774/730/52 773/732/52 +f 756/700/53 757/733/53 773/734/53 772/701/53 +f 787/735/54 803/736/54 804/737/54 788/738/54 +f 786/739/55 802/740/55 803/741/55 787/742/55 +f 785/743/57 801/744/57 802/740/57 786/739/57 +f 784/745/58 800/746/58 801/744/58 785/743/58 +f 783/747/60 799/748/60 800/746/60 784/745/60 +f 777/749/63 793/750/63 794/751/63 778/752/63 +f 782/753/62 798/754/62 799/748/62 783/747/62 +f 781/755/64 797/756/64 798/754/64 782/753/64 +f 792/757/65 808/758/65 793/750/65 777/749/65 +f 780/759/56 796/760/56 797/756/56 781/755/56 +f 791/761/66 807/762/66 808/758/66 792/757/66 +f 779/763/59 795/764/59 796/760/59 780/759/59 +f 790/765/51 806/766/51 807/762/51 791/761/51 +f 778/752/61 794/751/61 795/767/61 779/768/61 +f 789/769/52 805/770/52 806/766/52 790/765/52 +f 788/738/53 804/737/53 805/770/53 789/769/53 diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png new file mode 100644 index 00000000..7453d610 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png new file mode 100644 index 00000000..6e128340 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png new file mode 100644 index 00000000..c8a2f396 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png new file mode 100644 index 00000000..37d634fa Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_off.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_off.png new file mode 100644 index 00000000..c6ed54d2 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_off.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_on.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_on.png new file mode 100644 index 00000000..2d6b9fae Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_on.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_off.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_off.png new file mode 100644 index 00000000..fa76591f Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_off.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_on.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_on.png new file mode 100644 index 00000000..8d93f9d1 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_on.png differ diff --git a/mods/mesecons/mesecons_insulated/doc/insulated/description.html b/mods/mesecons/mesecons_insulated/doc/insulated/description.html new file mode 100644 index 00000000..deb344dc --- /dev/null +++ b/mods/mesecons/mesecons_insulated/doc/insulated/description.html @@ -0,0 +1 @@ + Insulated mesecons are conductors that only conduct in one direction (and also not up or down). Like uninsulated wires, they work through unloaded blocks. diff --git a/mods/mesecons/mesecons_insulated/doc/insulated/preview.png b/mods/mesecons/mesecons_insulated/doc/insulated/preview.png new file mode 100644 index 00000000..04356d57 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/doc/insulated/preview.png differ diff --git a/mods/mesecons/mesecons_insulated/doc/insulated/recipe.png b/mods/mesecons/mesecons_insulated/doc/insulated/recipe.png new file mode 100644 index 00000000..e2a7f44c Binary files /dev/null and b/mods/mesecons/mesecons_insulated/doc/insulated/recipe.png differ diff --git a/mods/mesecons/mesecons_insulated/init.lua b/mods/mesecons/mesecons_insulated/init.lua new file mode 100644 index 00000000..a8052306 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/init.lua @@ -0,0 +1,88 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local insulated_wire_get_rules = mesecon.horiz_rules_getter({ + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, +}) + +minetest.register_node("mesecons_insulated:insulated_on", { + drawtype = "nodebox", + description = S("Straight Insulated Mesecon"), + tiles = { + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -16/32, -16/32, -7/32, 16/32, -12/32, 7/32 } + }, + node_box = { + type = "fixed", + -- ±0.001 is to prevent z-fighting + fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 } + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_insulated:insulated_off", + sounds = mesecon.node_sound.default, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_insulated:insulated_off", + rules = insulated_wire_get_rules + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_node("mesecons_insulated:insulated_off", { + drawtype = "nodebox", + description = S("Straight Insulated Mesecon"), + tiles = { + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -16/32, -16/32, -7/32, 16/32, -12/32, 7/32 } + }, + node_box = { + type = "fixed", + -- ±0.001 is to prevent z-fighting + fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 } + }, + groups = {dig_immediate = 3}, + sounds = mesecon.node_sound.default, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_insulated:insulated_on", + rules = insulated_wire_get_rules + }}, + on_blast = mesecon.on_blastnode, + on_rotate = mesecon.on_rotate_horiz, +}) + +minetest.register_craft({ + output = "mesecons_insulated:insulated_off 3", + recipe = { + {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, + {"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"}, + {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, + } +}) diff --git a/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.de.tr b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.de.tr new file mode 100644 index 00000000..550a1219 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_insulated +Straight Insulated Mesecon=Isolierte Mesecongerade diff --git a/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.eo.tr b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.eo.tr new file mode 100644 index 00000000..878908bd --- /dev/null +++ b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_insulated + +### init.lua ### +Straight Insulated Mesecon=Rekta Izolita Mesekonduktilo diff --git a/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.fr.tr b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.fr.tr new file mode 100644 index 00000000..82faee94 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/locale/mesecons_insulated.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_insulated + +### init.lua ### +Straight Insulated Mesecon=Mesecon isolé droit diff --git a/mods/mesecons/mesecons_insulated/locale/template.txt b/mods/mesecons/mesecons_insulated/locale/template.txt new file mode 100644 index 00000000..8fbde4f5 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_insulated + +### init.lua ### +Straight Insulated Mesecon= diff --git a/mods/mesecons/mesecons_insulated/mod.conf b/mods/mesecons/mesecons_insulated/mod.conf new file mode 100644 index 00000000..2f7f5b62 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_insulated +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png new file mode 100644 index 00000000..d457dde7 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png new file mode 100644 index 00000000..48df808d Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png new file mode 100644 index 00000000..da933e0a Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png new file mode 100644 index 00000000..cdc37981 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png new file mode 100644 index 00000000..451fbc26 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png new file mode 100644 index 00000000..e30dad4f Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png differ diff --git a/mods/mesecons/mesecons_lamp/doc/lamp/description.html b/mods/mesecons/mesecons_lamp/doc/lamp/description.html new file mode 100644 index 00000000..72f24ed1 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/doc/lamp/description.html @@ -0,0 +1 @@ +Mesecon lamps are effectors that if powered emit light. diff --git a/mods/mesecons/mesecons_lamp/doc/lamp/preview.png b/mods/mesecons/mesecons_lamp/doc/lamp/preview.png new file mode 100644 index 00000000..5de07f08 Binary files /dev/null and b/mods/mesecons/mesecons_lamp/doc/lamp/preview.png differ diff --git a/mods/mesecons/mesecons_lamp/doc/lamp/recipe.png b/mods/mesecons/mesecons_lamp/doc/lamp/recipe.png new file mode 100644 index 00000000..145e6f3a Binary files /dev/null and b/mods/mesecons/mesecons_lamp/doc/lamp/recipe.png differ diff --git a/mods/mesecons/mesecons_lamp/init.lua b/mods/mesecons/mesecons_lamp/init.lua new file mode 100644 index 00000000..ff183fd8 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/init.lua @@ -0,0 +1,73 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- MESELAMPS +-- A lamp is "is an electrical device used to create artificial light" (wikipedia) +-- guess what? + +local mesecon_lamp_box = { + type = "wallmounted", + wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125}, + wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125}, + wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125}, +} + +local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil + +minetest.register_node("mesecons_lamp:lamp_on", { + drawtype = "nodebox", + tiles = {"jeija_meselamp_on.png"}, + use_texture_alpha = use_texture_alpha, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = false, + legacy_wallmounted = true, + sunlight_propagates = true, + walkable = true, + light_source = minetest.LIGHT_MAX, + node_box = mesecon_lamp_box, + selection_box = mesecon_lamp_box, + groups = {dig_immediate = 3,not_in_creative_inventory = 1, mesecon_effector_on = 1}, + drop = "mesecons_lamp:lamp_off 1", + sounds = mesecon.node_sound.glass, + mesecons = {effector = { + action_off = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2}) + end, + rules = mesecon.rules.wallmounted_get, + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_lamp:lamp_off", { + drawtype = "nodebox", + tiles = {"jeija_meselamp_off.png"}, + use_texture_alpha = use_texture_alpha, + inventory_image = "jeija_meselamp.png", + wield_image = "jeija_meselamp.png", + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = false, + sunlight_propagates = true, + walkable = true, + node_box = mesecon_lamp_box, + selection_box = mesecon_lamp_box, + groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1}, + description = S("Mesecon Lamp"), + sounds = mesecon.node_sound.glass, + mesecons = {effector = { + action_on = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2}) + end, + rules = mesecon.rules.wallmounted_get, + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = "mesecons_lamp:lamp_off 1", + recipe = { + {"", "mesecons_gamecompat:glass", ""}, + {"group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable"}, + {"", "mesecons_gamecompat:glass", ""}, + } +}) diff --git a/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.de.tr b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.de.tr new file mode 100644 index 00000000..488d5348 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_lamp +Mesecon Lamp=Meseconlampe diff --git a/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.eo.tr b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.eo.tr new file mode 100644 index 00000000..3434e652 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lamp + +### init.lua ### +Mesecon Lamp=Mesekonduktila Lampo diff --git a/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.fr.tr b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.fr.tr new file mode 100644 index 00000000..a85896e4 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/locale/mesecons_lamp.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lamp + +### init.lua ### +Mesecon Lamp=Lampe de Mesecon diff --git a/mods/mesecons/mesecons_lamp/locale/template.txt b/mods/mesecons/mesecons_lamp/locale/template.txt new file mode 100644 index 00000000..208d3c23 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_lamp + +### init.lua ### +Mesecon Lamp= diff --git a/mods/mesecons/mesecons_lamp/mod.conf b/mods/mesecons/mesecons_lamp/mod.conf new file mode 100644 index 00000000..15364470 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_lamp +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png new file mode 100644 index 00000000..b0bc8179 Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png differ diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png new file mode 100644 index 00000000..be6ad5f3 Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png differ diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png new file mode 100644 index 00000000..a91e1b1b Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/description.html new file mode 100644 index 00000000..5397a96f --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/description.html @@ -0,0 +1,2 @@ +Effector, glows blue when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/preview.png new file mode 100644 index 00000000..085c6194 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/recipe.png new file mode 100644 index 00000000..f72d00f0 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_blue/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/description.html new file mode 100644 index 00000000..aad59ea2 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/description.html @@ -0,0 +1,2 @@ +Effector, glows dark grey when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/preview.png new file mode 100644 index 00000000..f24c8ab3 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/recipe.png new file mode 100644 index 00000000..193a37da Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_green/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/description.html new file mode 100644 index 00000000..11913342 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/description.html @@ -0,0 +1,2 @@ +Effector, glows green when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_green/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/preview.png new file mode 100644 index 00000000..1cff1840 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_green/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/recipe.png new file mode 100644 index 00000000..35b3523b Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_green/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/description.html new file mode 100644 index 00000000..b3003d26 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/description.html @@ -0,0 +1,2 @@ +Effector, glows light grey when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/preview.png new file mode 100644 index 00000000..0347c216 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/recipe.png new file mode 100644 index 00000000..37dba5bb Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_red/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/description.html new file mode 100644 index 00000000..f49aeacd --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/description.html @@ -0,0 +1,2 @@ +Effector, glows red when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_red/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/preview.png new file mode 100644 index 00000000..f802d3dc Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_red/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/recipe.png new file mode 100644 index 00000000..dd5811ae Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_red/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/description.html b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/description.html new file mode 100644 index 00000000..a97839ba --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/description.html @@ -0,0 +1,2 @@ +Effector, glows yellow when powered. +It works in an inactive block. diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/preview.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/preview.png new file mode 100644 index 00000000..fa975c58 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/preview.png differ diff --git a/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/recipe.png b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/recipe.png new file mode 100644 index 00000000..1ca449f6 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/recipe.png differ diff --git a/mods/mesecons/mesecons_lightstone/init.lua b/mods/mesecons/mesecons_lightstone/init.lua new file mode 100644 index 00000000..d601f072 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/init.lua @@ -0,0 +1,75 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local lightstone_rules = { + {x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}, + {x=0, y=1, z=-1}, + {x=0, y=-1, z=-1}, + {x=0, y=-1, z=0}, +} + +function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc) + if not desc then + desc = name .. " Lightstone" + end + minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_off", { + tiles = {texture_off}, + is_ground_content = false, + groups = {cracky = 2, mesecon_effector_off = 1, mesecon = 2}, + description = desc, + sounds = mesecon.node_sound.stone, + mesecons = {effector = { + rules = lightstone_rules, + action_on = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lightstone:lightstone_" .. name .. "_on", param2 = node.param2}) + end, + }}, + on_blast = mesecon.on_blastnode, + }) + minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_on", { + tiles = {texture_on}, + is_ground_content = false, + groups = {cracky = 2, not_in_creative_inventory = 1, mesecon = 2}, + drop = "mesecons_lightstone:lightstone_" .. name .. "_off", + light_source = minetest.LIGHT_MAX - 2, + sounds = mesecon.node_sound.stone, + mesecons = {effector = { + rules = lightstone_rules, + action_off = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lightstone:lightstone_" .. name .. "_off", param2 = node.param2}) + end, + }}, + on_blast = mesecon.on_blastnode, + }) + + minetest.register_craft({ + output = "mesecons_lightstone:lightstone_" .. name .. "_off", + recipe = { + {"",base_item,""}, + {base_item,"mesecons_gamecompat:torch",base_item}, + {"","group:mesecon_conductor_craftable",""} + } + }) +end + + +mesecon.lightstone_add("red", "mesecons_gamecompat:dye_red", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png", S("Red Lightstone")) +mesecon.lightstone_add("green", "mesecons_gamecompat:dye_green", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png", S("Green Lightstone")) +mesecon.lightstone_add("blue", "mesecons_gamecompat:dye_blue", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png", S("Blue Lightstone")) +mesecon.lightstone_add("gray", "mesecons_gamecompat:dye_grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png", S("Grey Lightstone")) +mesecon.lightstone_add("darkgray", "mesecons_gamecompat:dye_dark_grey", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png", S("Dark Grey Lightstone")) +mesecon.lightstone_add("yellow", "mesecons_gamecompat:dye_yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png", S("Yellow Lightstone")) +mesecon.lightstone_add("orange", "mesecons_gamecompat:dye_orange", "jeija_lightstone_orange_off.png", "jeija_lightstone_orange_on.png", S("Orange Lightstone")) +mesecon.lightstone_add("white", "mesecons_gamecompat:dye_white", "jeija_lightstone_white_off.png", "jeija_lightstone_white_on.png", S("White Lightstone")) +mesecon.lightstone_add("pink", "mesecons_gamecompat:dye_pink", "jeija_lightstone_pink_off.png", "jeija_lightstone_pink_on.png", S("Pink Lightstone")) +mesecon.lightstone_add("magenta", "mesecons_gamecompat:dye_magenta", "jeija_lightstone_magenta_off.png", "jeija_lightstone_magenta_on.png", S("Magenta Lightstone")) +mesecon.lightstone_add("cyan", "mesecons_gamecompat:dye_cyan", "jeija_lightstone_cyan_off.png", "jeija_lightstone_cyan_on.png", S("Cyan Lightstone")) +mesecon.lightstone_add("violet", "mesecons_gamecompat:dye_violet", "jeija_lightstone_violet_off.png", "jeija_lightstone_violet_on.png", S("Violet Lightstone")) diff --git a/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.de.tr b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.de.tr new file mode 100644 index 00000000..18e88531 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.de.tr @@ -0,0 +1,13 @@ +# textdomain: mesecons_lightstone +Red Lightstone=Roter Leuchtstein +Green Lightstone=Grüner Leuchtstein +Blue Lightstone=Blauer Leuchtstein +Grey Lightstone=Grauer Leuchtstein +Dark Grey Lightstone=Dunkelgrauer Leuchtstein +Yellow Lightstone=Gelber Leuchtstein +Orange Lightstone=Orange Leuchtstein +White Lightstone=Weißer Leuchtstein +Pink Lightstone=Rosa Leuchtstein +Magenta Lightstone=Magenta Leuchtstein +Cyan Lightstone=Türkiser Leuchtstein +Violet Lightstone=Violetter Leuchtstein diff --git a/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.eo.tr b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.eo.tr new file mode 100644 index 00000000..7dab604d --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.eo.tr @@ -0,0 +1,15 @@ +# textdomain: mesecons_lightstone + +### init.lua ### +Red Lightstone=Ruĝa Lumŝtono +Green Lightstone=Verda Lumŝtono +Blue Lightstone=Blua Lumŝtono +Grey Lightstone=Griza Lumŝtono +Dark Grey Lightstone=Malhela Griza Lumŝtono +Yellow Lightstone=Flava Lumŝtono +Orange Lightstone=Oranĝa Lumŝtono +White Lightstone=Blanka Lumŝtono +Pink Lightstone=Rozkolora Lumŝtono +Magenta Lightstone=Magenta Lumŝtono +Cyan Lightstone=Cejana Lumŝtono +Violet Lightstone=Viola Lumŝtono diff --git a/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.fr.tr b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.fr.tr new file mode 100644 index 00000000..6e44c578 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.fr.tr @@ -0,0 +1,15 @@ +# textdomain: mesecons_lightstone + +### init.lua ### +Red Lightstone=Pierre lumineuse rouge +Green Lightstone=Pierre lumineuse verte +Blue Lightstone=Pierre lumineuse bleue +Grey Lightstone=Pierre lumineuse grise +Dark Grey Lightstone=Pierre lumineuse gris foncée +Yellow Lightstone=Pierre lumineuse jaune +Orange Lightstone=Pierre lumineuse orange +White Lightstone=Pierre lumineuse blanche +Pink Lightstone=Pierre lumineuse rose +Magenta Lightstone=Pierre lumineuse magenta +Cyan Lightstone=Pierre lumineuse bleu clair +Violet Lightstone=Pierre lumineuse violette diff --git a/mods/mesecons/mesecons_lightstone/locale/template.txt b/mods/mesecons/mesecons_lightstone/locale/template.txt new file mode 100644 index 00000000..884c66fa --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain: mesecons_lightstone + +### init.lua ### +Red Lightstone= +Green Lightstone= +Blue Lightstone= +Grey Lightstone= +Dark Grey Lightstone= +Yellow Lightstone= +Orange Lightstone= +White Lightstone= +Pink Lightstone= +Magenta Lightstone= +Cyan Lightstone= +Violet Lightstone= diff --git a/mods/mesecons/mesecons_lightstone/mod.conf b/mods/mesecons/mesecons_lightstone/mod.conf new file mode 100644 index 00000000..7929e49c --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_lightstone +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png new file mode 100644 index 00000000..87f753c4 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png new file mode 100644 index 00000000..008a5fe6 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_off.png new file mode 100644 index 00000000..1c9168c4 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_on.png new file mode 100644 index 00000000..92edf58b Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png new file mode 100644 index 00000000..f7ded2a1 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png new file mode 100644 index 00000000..cfffb096 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png new file mode 100644 index 00000000..1c5c28d7 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png new file mode 100644 index 00000000..ba067ba0 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png new file mode 100644 index 00000000..9051fee2 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png new file mode 100644 index 00000000..0cadbc9c Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_off.png new file mode 100644 index 00000000..9c50f684 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_on.png new file mode 100644 index 00000000..d46f2952 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_off.png new file mode 100644 index 00000000..f62bc62f Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_on.png new file mode 100644 index 00000000..e3935851 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_off.png new file mode 100644 index 00000000..89a358c6 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_on.png new file mode 100644 index 00000000..8df940b1 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png new file mode 100644 index 00000000..32c22cda Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png new file mode 100644 index 00000000..b1ffd57d Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_off.png new file mode 100644 index 00000000..514528c3 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_on.png new file mode 100644 index 00000000..d607f323 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_off.png new file mode 100644 index 00000000..ddb7ebb8 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_on.png new file mode 100644 index 00000000..9caac0c6 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png new file mode 100644 index 00000000..5280e91a Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png new file mode 100644 index 00000000..806efbe1 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png differ diff --git a/mods/mesecons/mesecons_luacontroller/doc/luacontroller/description.html b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/description.html new file mode 100644 index 00000000..8c5d0234 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/description.html @@ -0,0 +1,7 @@ +The Luacontroller is an advanced programmable component. +You can simply code it in the language Mesecons uses itself: Lua! +All the code runs in a sandbox, so it's completely safe (but I won't guarantee that for absolute certainty!). +It works fine in an unloaded block, loading the block when the program needs to run. +Events are properly delivered after a server restart. + +Documentation is available here! diff --git a/mods/mesecons/mesecons_luacontroller/doc/luacontroller/preview.png b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/preview.png new file mode 100644 index 00000000..d5babfc1 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/preview.png differ diff --git a/mods/mesecons/mesecons_luacontroller/doc/luacontroller/recipe.png b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/recipe.png new file mode 100644 index 00000000..fca9b061 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/doc/luacontroller/recipe.png differ diff --git a/mods/mesecons/mesecons_luacontroller/init.lua b/mods/mesecons/mesecons_luacontroller/init.lua new file mode 100644 index 00000000..9e2d3c82 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/init.lua @@ -0,0 +1,966 @@ +-- ______ +-- | +-- | +-- | __ ___ _ __ _ _ +-- | | | | | |\ | | |_| | | | | |_ |_| +-- |___| |______ |__| | \| | | \ |__| |_ |_ |_ |\ +-- | +-- | +-- + +-- Reference +-- ports = get_real_port_states(pos): gets if inputs are powered from outside +-- newport = merge_port_states(state1, state2): just does result = state1 or state2 for every port +-- set_port(pos, rule, state): activates/deactivates the mesecons according to the port states +-- set_port_states(pos, ports): Applies new port states to a Luacontroller at pos +-- run_inner(pos, code, event): runs code on the controller at pos and event +-- reset_formspec(pos, code, errmsg): installs new code and prints error messages, without resetting LCID +-- reset_meta(pos, code, errmsg): performs a software-reset, installs new code and prints error message +-- run(pos, event): a wrapper for run_inner which gets code & handles errors via reset_meta +-- resetn(pos): performs a hardware reset, turns off all ports +-- +-- The Sandbox +-- The whole code of the controller runs in a sandbox, +-- a very restricted environment. +-- Actually the only way to damage the server is to +-- use too much memory from the sandbox. +-- You can add more functions to the environment +-- (see where local env is defined) +-- Something nice to play is is appending minetest.env to it. + +local S = minetest.get_translator(minetest.get_current_modname()) + +local BASENAME = "mesecons_luacontroller:luacontroller" + +local rules = { + a = {x = -1, y = 0, z = 0, name="A"}, + b = {x = 0, y = 0, z = 1, name="B"}, + c = {x = 1, y = 0, z = 0, name="C"}, + d = {x = 0, y = 0, z = -1, name="D"}, +} + + +------------------ +-- Action stuff -- +------------------ +-- These helpers are required to set the port states of the luacontroller + +-- Updates the real port states according to the signal change. +-- Returns whether the real port states actually changed. +local function update_real_port_states(pos, rule_name, new_state) + local meta = minetest.get_meta(pos) + if rule_name == nil then + meta:set_int("real_portstates", 1) + return true + end + local real_portstates = meta:get_int("real_portstates") + local n = real_portstates - 1 + local L = {} + for i = 1, 4 do + L[i] = n % 2 + n = math.floor(n / 2) + end + -- (0,-1) (-1,0) (1,0) (0,1) + local pos_to_side = { 4, 1, nil, 3, 2 } + if rule_name.x == nil then + for _, rname in ipairs(rule_name) do + local port = pos_to_side[rname.x + (2 * rname.z) + 3] + L[port] = (new_state == "on") and 1 or 0 + end + else + local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3] + L[port] = (new_state == "on") and 1 or 0 + end + local new_portstates = 1 + 1 * L[1] + 2 * L[2] + 4 * L[3] + 8 * L[4] + if new_portstates ~= real_portstates then + meta:set_int("real_portstates", new_portstates) + return true + end + return false +end + + +local port_names = {"a", "b", "c", "d"} + +local function get_real_port_states(pos) + -- Determine if ports are powered (by itself or from outside) + local meta = minetest.get_meta(pos) + local L = {} + local n = meta:get_int("real_portstates") - 1 + for _, name in ipairs(port_names) do + L[name] = ((n % 2) == 1) + n = math.floor(n / 2) + end + return L +end + + +local function merge_port_states(ports, vports) + return { + a = ports.a or vports.a, + b = ports.b or vports.b, + c = ports.c or vports.c, + d = ports.d or vports.d, + } +end + +local function generate_name(ports) + local d = ports.d and 1 or 0 + local c = ports.c and 1 or 0 + local b = ports.b and 1 or 0 + local a = ports.a and 1 or 0 + return BASENAME..d..c..b..a +end + + +local function set_port(pos, rule, state) + if state then + mesecon.receptor_on(pos, {rule}) + else + mesecon.receptor_off(pos, {rule}) + end +end + + +local function clean_port_states(ports) + ports.a = ports.a and true or false + ports.b = ports.b and true or false + ports.c = ports.c and true or false + ports.d = ports.d and true or false +end + + +local function set_port_states(pos, ports) + local node = minetest.get_node(pos) + local name = node.name + clean_port_states(ports) + local vports = minetest.registered_nodes[name].virtual_portstates + local new_name = generate_name(ports) + + if name ~= new_name and vports then + -- Problem: + -- We need to place the new node first so that when turning + -- off some port, it won't stay on because the rules indicate + -- there is an onstate output port there. + -- When turning the output off then, it will however cause feedback + -- so that the luacontroller will receive an "off" event by turning + -- its output off. + -- Solution / Workaround: + -- Remember which output was turned off and ignore next "off" event. + local meta = minetest.get_meta(pos) + local ign = minetest.deserialize(meta:get_string("ignore_offevents"), true) or {} + if ports.a and not vports.a and not mesecon.is_powered(pos, rules.a) then ign.A = true end + if ports.b and not vports.b and not mesecon.is_powered(pos, rules.b) then ign.B = true end + if ports.c and not vports.c and not mesecon.is_powered(pos, rules.c) then ign.C = true end + if ports.d and not vports.d and not mesecon.is_powered(pos, rules.d) then ign.D = true end + meta:set_string("ignore_offevents", minetest.serialize(ign)) + + minetest.swap_node(pos, {name = new_name, param2 = node.param2}) + + if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end + if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end + if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end + if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end + end +end + + +----------------- +-- Overheating -- +----------------- +local function burn_controller(pos) + local node = minetest.get_node(pos) + node.name = BASENAME.."_burnt" + minetest.swap_node(pos, node) + minetest.get_meta(pos):set_string("lc_memory", ""); + -- Wait for pending operations + minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat) +end + +local function overheat(pos) + if mesecon.do_overheat(pos) then -- If too hot + burn_controller(pos) + return true + end +end + +------------------------ +-- Ignored off events -- +------------------------ + +local function ignore_event(event, meta) + if event.type ~= "off" then return false end + local ignore_offevents = minetest.deserialize(meta:get_string("ignore_offevents"), true) or {} + if ignore_offevents[event.pin.name] then + ignore_offevents[event.pin.name] = nil + meta:set_string("ignore_offevents", minetest.serialize(ignore_offevents)) + return true + end +end + +------------------------- +-- Parsing and running -- +------------------------- + +local function safe_print(param) + if mesecon.setting("luacontroller_print_behavior", "log") == "log" then + local string_meta = getmetatable("") + local sandbox = string_meta.__index + string_meta.__index = string -- Leave string sandbox temporarily + minetest.log("action", string.format("[mesecons_luacontroller] print(%s)", dump(param))) + string_meta.__index = sandbox -- Restore string sandbox + end +end + +local function safe_date() + return(os.date("*t",os.time())) +end + +-- string.rep(str, n) with a high value for n can be used to DoS +-- the server. Therefore, limit max. length of generated string. +local function safe_string_rep(str, n) + if #str * n > mesecon.setting("luacontroller_string_rep_max", 64000) then + debug.sethook() -- Clear hook + error("string.rep: string length overflow", 2) + end + + return string.rep(str, n) +end + +-- string.find with a pattern can be used to DoS the server. +-- Therefore, limit string.find to patternless matching. +local function safe_string_find(...) + if (select(4, ...)) ~= true then + debug.sethook() -- Clear hook + error("string.find: 'plain' (fourth parameter) must always be true in a Luacontroller") + end + + return string.find(...) +end + +-- do not allow pattern matching in string.split (see string.find for details) +local function safe_string_split(...) + if select(5, ...) then + debug.sethook() -- Clear hook + error("string.split: 'sep_is_pattern' (fifth parameter) may not be used in a Luacontroller") + end + + return string.split(...) +end + +local function remove_functions(x) + local tp = type(x) + if tp == "function" then + return nil + end + + -- Make sure to not serialize the same table multiple times, otherwise + -- writing mem.test = mem in the Luacontroller will lead to infinite recursion + local seen = {} + + local function rfuncs(x) + if x == nil then return end + if seen[x] then return end + seen[x] = true + if type(x) ~= "table" then return end + + for key, value in pairs(x) do + if type(key) == "function" or type(value) == "function" then + x[key] = nil + else + if type(key) == "table" then + rfuncs(key) + end + if type(value) == "table" then + rfuncs(value) + end + end + end + end + + rfuncs(x) + + return x +end + +local function validate_iid(iid) + if not iid then return true end -- nil is OK + + local limit = mesecon.setting("luacontroller_interruptid_maxlen", 256) + if type(iid) == "string" then + if #iid <= limit then return true end -- string is OK unless too long + return false, "An interrupt ID was too large!" + end + if type(iid) == "number" or type(iid) == "boolean" then return true, "Non-string interrupt IDs are deprecated" end + + local warn + local seen = {} + local function check(t) + if type(t) == "function" then + warn = "Functions cannot be used in interrupt IDs" + return false + end + if type(t) ~= "table" then + return true + end + if seen[t] then + warn = "Non-tree-like tables are forbidden as interrupt IDs" + return false + end + seen[t] = true + for k, v in pairs(t) do + if not check(k) then return false end + if not check(v) then return false end + end + return true + end + if not check(iid) then return false, warn end + + if #minetest.serialize(iid) > limit then + return false, "An interrupt ID was too large!" + end + + return true, "Table interrupt IDs are deprecated and are unreliable; use strings instead" +end + +-- The setting affects API so is not intended to be changeable at runtime +local get_interrupt +if mesecon.setting("luacontroller_lightweight_interrupts", false) then + -- use node timer + get_interrupt = function(pos, itbl, send_warning) + return (function(time, iid) + if type(time) ~= "number" then error("Delay must be a number") end + if iid ~= nil then send_warning("Interrupt IDs are disabled on this server") end + table.insert(itbl, function() minetest.get_node_timer(pos):start(time) end) + end) + end +else + -- use global action queue + -- itbl: Flat table of functions to run after sandbox cleanup, used to prevent various security hazards + get_interrupt = function(pos, itbl, send_warning) + -- iid = interrupt id + return function (time, iid) + -- NOTE: This runs within string metatable sandbox, so don't *rely* on anything of the form (""):y + -- Hence the values get moved out. Should take less time than original, so totally compatible + if type(time) ~= "number" then error("Delay must be a number") end + table.insert(itbl, function () + -- Outside string metatable sandbox, can safely run this now + local luac_id = minetest.get_meta(pos):get_int("luac_id") + local ok, warn = validate_iid(iid) + if ok then mesecon.queue:add_action(pos, "lc_interrupt", {luac_id, iid}, time, iid, 1) end + if warn then send_warning(warn) end + end) + end + end +end + +-- Given a message object passed to digiline_send, clean it up into a form +-- which is safe to transmit over the network and compute its "cost" (a very +-- rough estimate of its memory usage). +-- +-- The cleaning comprises the following: +-- 1. Functions (and userdata, though user scripts ought not to get hold of +-- those in the first place) are removed, because they break the model of +-- Digilines as a network that carries basic data, and they could exfiltrate +-- references to mutable objects from one Luacontroller to another, allowing +-- inappropriate high-bandwidth, no-wires communication. +-- 2. Tables are duplicated because, being mutable, they could otherwise be +-- modified after the send is complete in order to change what data arrives +-- at the recipient, perhaps in violation of the previous cleaning rule or +-- in violation of the message size limit. +-- +-- The cost indication is only approximate; it’s not a perfect measurement of +-- the number of bytes of memory used by the message object. +-- +-- Parameters: +-- msg -- the message to clean +-- back_references -- for internal use only; do not provide +-- +-- Returns: +-- 1. The cleaned object. +-- 2. The approximate cost of the object. +local function clean_and_weigh_digiline_message(msg, back_references) + local t = type(msg) + if t == "string" then + -- Strings are immutable so can be passed by reference, and cost their + -- length plus the size of the Lua object header (24 bytes on a 64-bit + -- platform) plus one byte for the NUL terminator. + return msg, #msg + 25 + elseif t == "number" then + -- Numbers are passed by value so need not be touched, and cost 8 bytes + -- as all numbers in Lua are doubles. NaN values are removed. + if msg ~= msg then + return nil, 0 + end + return msg, 8 + elseif t == "boolean" then + -- Booleans are passed by value so need not be touched, and cost 1 + -- byte. + return msg, 1 + elseif t == "table" then + -- Tables are duplicated. Check if this table has been seen before + -- (self-referential or shared table); if so, reuse the cleaned value + -- of the previous occurrence, maintaining table topology and avoiding + -- infinite recursion, and charge zero bytes for this as the object has + -- already been counted. + back_references = back_references or {} + local bref = back_references[msg] + if bref then + return bref, 0 + end + -- Construct a new table by cleaning all the keys and values and adding + -- up their costs, plus 8 bytes as a rough estimate of table overhead. + local cost = 8 + local ret = {} + back_references[msg] = ret + for k, v in pairs(msg) do + local k_cost, v_cost + k, k_cost = clean_and_weigh_digiline_message(k, back_references) + v, v_cost = clean_and_weigh_digiline_message(v, back_references) + if k ~= nil and v ~= nil then + -- Only include an element if its key and value are of legal + -- types. + ret[k] = v + end + -- If we only counted the cost of a table element when we actually + -- used it, we would be vulnerable to the following attack: + -- 1. Construct a huge table (too large to pass the cost limit). + -- 2. Insert it somewhere in a table, with a function as a key. + -- 3. Insert it somewhere in another table, with a number as a key. + -- 4. The first occurrence doesn’t pay the cost because functions + -- are stripped and therefore the element is dropped. + -- 5. The second occurrence doesn’t pay the cost because it’s in + -- back_references. + -- By counting the costs regardless of whether the objects will be + -- included, we avoid this attack; it may overestimate the cost of + -- some messages, but only those that won’t be delivered intact + -- anyway because they contain illegal object types. + cost = cost + k_cost + v_cost + end + return ret, cost + else + return nil, 0 + end +end + + +-- itbl: Flat table of functions to run after sandbox cleanup, used to prevent various security hazards +local function get_digiline_send(pos, itbl, send_warning) + if not minetest.global_exists("digilines") then return end + local chan_maxlen = mesecon.setting("luacontroller_digiline_channel_maxlen", 256) + local maxlen = mesecon.setting("luacontroller_digiline_maxlen", 50000) + return function(channel, msg) + -- NOTE: This runs within string metatable sandbox, so don't *rely* on anything of the form (""):y + -- or via anything that could. + -- Make sure channel is string, number or boolean + if type(channel) == "string" then + if #channel > chan_maxlen then + send_warning("Channel string too long.") + return false + end + elseif (type(channel) ~= "string" and type(channel) ~= "number" and type(channel) ~= "boolean") then + send_warning("Channel must be string, number or boolean.") + return false + end + + local msg_cost + msg, msg_cost = clean_and_weigh_digiline_message(msg) + if msg == nil or msg_cost > maxlen then + send_warning("Message was too complex, or contained invalid data.") + return false + end + + table.insert(itbl, function () + -- Runs outside of string metatable sandbox + local luac_id = minetest.get_meta(pos):get_int("luac_id") + mesecon.queue:add_action(pos, "lc_digiline_relay", {channel, luac_id, msg}) + end) + return true + end +end + +local safe_globals = { + -- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly) + "assert", "error", "ipairs", "next", "pairs", "select", + "tonumber", "tostring", "type", "unpack", "_VERSION" +} + +local function create_environment(pos, mem, event, itbl, send_warning) + -- Gather variables for the environment + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def then return end + + local vports = node_def.virtual_portstates + if not vports then return end + + local vports_copy = {} + for k, v in pairs(vports) do vports_copy[k] = v end + local rports = get_real_port_states(pos) + + -- Create new library tables on each call to prevent one Luacontroller + -- from breaking a library and messing up other Luacontrollers. + local env = { + pin = merge_port_states(vports, rports), + port = vports_copy, + event = event, + mem = mem, + heat = mesecon.get_heat(pos), + heat_max = mesecon.setting("overheat_max", 20), + print = safe_print, + interrupt = get_interrupt(pos, itbl, send_warning), + digiline_send = get_digiline_send(pos, itbl, send_warning), + sha256sum = minetest.sha256, + string = { + byte = string.byte, + char = string.char, + format = string.format, + len = string.len, + lower = string.lower, + upper = string.upper, + rep = safe_string_rep, + reverse = string.reverse, + sub = string.sub, + find = safe_string_find, + split = safe_string_split, + }, + math = { + abs = math.abs, + acos = math.acos, + asin = math.asin, + atan = math.atan, + atan2 = math.atan2, + ceil = math.ceil, + cos = math.cos, + cosh = math.cosh, + deg = math.deg, + exp = math.exp, + floor = math.floor, + fmod = math.fmod, + frexp = math.frexp, + huge = math.huge, + ldexp = math.ldexp, + log = math.log, + log10 = math.log10, + max = math.max, + min = math.min, + modf = math.modf, + pi = math.pi, + pow = math.pow, + rad = math.rad, + random = math.random, + sin = math.sin, + sinh = math.sinh, + sqrt = math.sqrt, + tan = math.tan, + tanh = math.tanh, + }, + table = { + concat = table.concat, + insert = table.insert, + maxn = table.maxn, + remove = table.remove, + sort = table.sort, + }, + os = { + clock = os.clock, + difftime = os.difftime, + time = os.time, + datetable = safe_date, + }, + } + env._G = env + + for _, name in pairs(safe_globals) do + env[name] = _G[name] + end + + return env +end + + +local function timeout() + debug.sethook() -- Clear hook + error("Code timed out!", 2) +end + + +local function create_sandbox(code, env) + if code:byte(1) == 27 then + return nil, "Binary code prohibited." + end + local f, msg = loadstring(code) + if not f then return nil, msg end + setfenv(f, env) + + -- Turn off JIT optimization for user code so that count + -- events are generated when adding debug hooks + if rawget(_G, "jit") then + jit.off(f, true) + end + + local maxevents = mesecon.setting("luacontroller_maxevents", 10000) + return function(...) + -- NOTE: This runs within string metatable sandbox, so the setting's been moved out for safety + -- Use instruction counter to stop execution + -- after luacontroller_maxevents + debug.sethook(timeout, "", maxevents) + local ok, ret = pcall(f, ...) + debug.sethook() -- Clear hook + if not ok then error(ret, 0) end + return ret + end +end + + +local function load_memory(meta) + return minetest.deserialize(meta:get_string("lc_memory"), true) or {} +end + + +local function save_memory(pos, meta, mem) + local memstring = minetest.serialize(remove_functions(mem)) + local memsize_max = mesecon.setting("luacontroller_memsize", 100000) + + if (#memstring <= memsize_max) then + meta:set_string("lc_memory", memstring) + meta:mark_as_private("lc_memory") + else + print("Error: Luacontroller memory overflow. "..memsize_max.." bytes available, " + ..#memstring.." required. Controller overheats.") + burn_controller(pos) + end +end + +-- Returns success (boolean), errmsg (string) +-- run (as opposed to run_inner) is responsible for setting up meta according to this output +local function run_inner(pos, code, event) + local meta = minetest.get_meta(pos) + -- Note: These return success, presumably to avoid changing LC ID. + if overheat(pos) then return true, "" end + if ignore_event(event, meta) then return true, "" end + + -- Load mem from meta + local mem = load_memory(meta) + + -- 'Last warning' label. + local warning = "" + local function send_warning(str) + warning = "Warning: " .. str + end + + -- Create environment + local itbl = {} + local env = create_environment(pos, mem, event, itbl, send_warning) + if not env then return false, "Env does not exist. Controller has been moved?" end + + local success, msg + -- Create the sandbox and execute code + local f + f, msg = create_sandbox(code, env) + if not f then return false, msg end + -- Start string true sandboxing + local onetruestring = getmetatable("") + -- If a string sandbox is already up yet inconsistent, something is very wrong + assert(onetruestring.__index == string) + onetruestring.__index = env.string + success, msg = pcall(f) + onetruestring.__index = string + -- End string true sandboxing + if not success then return false, msg end + if type(env.port) ~= "table" then + return false, "Ports set are invalid." + end + + -- Actually set the ports + set_port_states(pos, env.port) + + -- Save memory. This may burn the luacontroller if a memory overflow occurs. + save_memory(pos, meta, env.mem) + + -- Execute deferred tasks + for _, v in ipairs(itbl) do + local failure = v() + if failure then + return false, failure + end + end + return true, warning +end + +local function reset_formspec(meta, code, errmsg) + meta:set_string("code", code) + meta:mark_as_private("code") + code = minetest.formspec_escape(code or "") + errmsg = minetest.formspec_escape(tostring(errmsg or "")) + meta:set_string("formspec", "size[12,10]" + .."style_type[label,textarea;font=mono]" + .."background[-0.2,-0.25;12.4,10.75;jeija_luac_background.png]" + .."label[0.1,8.3;"..errmsg.."]" + .."textarea[0.2,0.2;12.2,9.5;code;;"..code.."]" + .."image_button[4.75,8.75;2.5,1;jeija_luac_runbutton.png;program;]" + .."image_button_exit[11.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]" + ) +end + +local function reset_meta(pos, code, errmsg) + local meta = minetest.get_meta(pos) + reset_formspec(meta, code, errmsg) + meta:set_int("luac_id", math.random(1, 65535)) +end + +-- Wraps run_inner with LC-reset-on-error +local function run(pos, event) + local meta = minetest.get_meta(pos) + local code = meta:get_string("code") + local ok, errmsg = run_inner(pos, code, event) + if not ok then + reset_meta(pos, code, errmsg) + else + reset_formspec(meta, code, errmsg) + end + return ok, errmsg +end + +local function reset(pos) + set_port_states(pos, {a=false, b=false, c=false, d=false}) +end + +local function node_timer(pos) + if minetest.registered_nodes[minetest.get_node(pos).name].is_burnt then + return false + end + run(pos, {type="interrupt"}) + return false +end + +----------------------- +-- A.Queue callbacks -- +----------------------- + +mesecon.queue:add_function("lc_interrupt", function (pos, luac_id, iid) + -- There is no luacontroller anymore / it has been reprogrammed / replaced / burnt + if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end + if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end + run(pos, {type="interrupt", iid = iid}) +end) + +mesecon.queue:add_function("lc_digiline_relay", function (pos, channel, luac_id, msg) + if not digiline then return end + -- This check is only really necessary because in case of server crash, old actions can be thrown into the future + if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end + if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end + -- The actual work + digiline:receptor_send(pos, digiline.rules.default, channel, msg) +end) + +----------------------- +-- Node Registration -- +----------------------- + +local output_rules = {} +local input_rules = {} + +local node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, -- Bottom slab + {-5/16, -7/16, -5/16, 5/16, -6/16, 5/16}, -- Circuit board + {-3/16, -6/16, -3/16, 3/16, -5/16, 3/16}, -- IC + } +} + +local selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, +} + +local digiline = { + receptor = {}, + effector = { + action = function(pos, _, channel, msg) + msg = clean_and_weigh_digiline_message(msg) + run(pos, {type = "digiline", channel = channel, msg = msg}) + end + } +} + +local function get_program(pos) + local meta = minetest.get_meta(pos) + return meta:get_string("code") +end + +local function set_program(pos, code) + reset(pos) + reset_meta(pos, code) + return run(pos, {type="program"}) +end + +local function on_receive_fields(pos, _, fields, sender) + if not fields.program then + return + end + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + minetest.record_protection_violation(pos, name) + return + end + local ok, err = set_program(pos, fields.code) + if not ok then + -- it's not an error from the server perspective + minetest.log("action", "Lua controller programming error: " .. tostring(err)) + end +end + +for a = 0, 1 do -- 0 = off 1 = on +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do + local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a) + local node_name = BASENAME..cid + local top = "jeija_luacontroller_top.png" + if a == 1 then + top = top.."^jeija_luacontroller_LED_A.png" + end + if b == 1 then + top = top.."^jeija_luacontroller_LED_B.png" + end + if c == 1 then + top = top.."^jeija_luacontroller_LED_C.png" + end + if d == 1 then + top = top.."^jeija_luacontroller_LED_D.png" + end + + local groups + if a + b + c + d ~= 0 then + groups = {dig_immediate=2, not_in_creative_inventory=1, overheat = 1} + else + groups = {dig_immediate=2, overheat = 1} + end + + output_rules[cid] = {} + input_rules[cid] = {} + if a == 1 then table.insert(output_rules[cid], rules.a) end + if b == 1 then table.insert(output_rules[cid], rules.b) end + if c == 1 then table.insert(output_rules[cid], rules.c) end + if d == 1 then table.insert(output_rules[cid], rules.d) end + + if a == 0 then table.insert( input_rules[cid], rules.a) end + if b == 0 then table.insert( input_rules[cid], rules.b) end + if c == 0 then table.insert( input_rules[cid], rules.c) end + if d == 0 then table.insert( input_rules[cid], rules.d) end + + local mesecons = { + effector = { + rules = input_rules[cid], + action_change = function (pos, _, rule_name, new_state) + if update_real_port_states(pos, rule_name, new_state) then + run(pos, {type=new_state, pin=rule_name}) + end + end, + }, + receptor = { + state = mesecon.state.on, + rules = output_rules[cid] + }, + luacontroller = { + get_program = get_program, + set_program = set_program, + }, + } + + minetest.register_node(node_name, { + description = S("Luacontroller"), + drawtype = "nodebox", + tiles = { + top, + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + inventory_image = top, + paramtype = "light", + is_ground_content = false, + groups = groups, + drop = BASENAME.."0000", + sunlight_propagates = true, + selection_box = selection_box, + node_box = node_box, + on_construct = reset_meta, + on_receive_fields = on_receive_fields, + sounds = mesecon.node_sound.stone, + mesecons = mesecons, + digiline = digiline, + -- Virtual portstates are the ports that + -- the node shows as powered up (light up). + virtual_portstates = { + a = a == 1, + b = b == 1, + c = c == 1, + d = d == 1, + }, + after_dig_node = function (pos) + mesecon.do_cooldown(pos) + mesecon.receptor_off(pos, output_rules) + end, + is_luacontroller = true, + on_timer = node_timer, + on_blast = mesecon.on_blastnode, + }) +end +end +end +end + +------------------------------ +-- Overheated Luacontroller -- +------------------------------ + +minetest.register_node(BASENAME .. "_burnt", { + drawtype = "nodebox", + tiles = { + "jeija_luacontroller_burnt_top.png", + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + inventory_image = "jeija_luacontroller_burnt_top.png", + is_burnt = true, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=2, not_in_creative_inventory=1}, + drop = BASENAME.."0000", + sunlight_propagates = true, + selection_box = selection_box, + node_box = node_box, + on_construct = reset_meta, + on_receive_fields = on_receive_fields, + sounds = mesecon.node_sound.stone, + virtual_portstates = {a = false, b = false, c = false, d = false}, + mesecons = { + effector = { + rules = mesecon.rules.flat, + action_change = function(pos, _, rule_name, new_state) + update_real_port_states(pos, rule_name, new_state) + end, + }, + }, + on_blast = mesecon.on_blastnode, +}) + +------------------------ +-- Craft Registration -- +------------------------ + +minetest.register_craft({ + output = BASENAME.."0000 2", + recipe = { + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''}, + } +}) diff --git a/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.de.tr b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.de.tr new file mode 100644 index 00000000..3ae02442 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_luacontroller +Luacontroller=Luacontroller diff --git a/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.eo.tr b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.eo.tr new file mode 100644 index 00000000..f477ebd6 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_luacontroller + +### init.lua ### +Luacontroller=Luaregilo diff --git a/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.fr.tr b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.fr.tr new file mode 100644 index 00000000..30fabac3 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_luacontroller + +### init.lua ### +Luacontroller=Programmateur LUA diff --git a/mods/mesecons/mesecons_luacontroller/locale/template.txt b/mods/mesecons/mesecons_luacontroller/locale/template.txt new file mode 100644 index 00000000..ece4275b --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_luacontroller + +### init.lua ### +Luacontroller= diff --git a/mods/mesecons/mesecons_luacontroller/mod.conf b/mods/mesecons/mesecons_luacontroller/mod.conf new file mode 100644 index 00000000..ca05feda --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_luacontroller +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_luacontroller/spec/lightweight_interrupt_spec.lua b/mods/mesecons/mesecons_luacontroller/spec/lightweight_interrupt_spec.lua new file mode 100644 index 00000000..045c9b47 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/spec/lightweight_interrupt_spec.lua @@ -0,0 +1,38 @@ +require("mineunit") + +-- This test is done in a separate file since it requires different configuration at startup. +mineunit("core") +minetest.settings:set("mesecon.luacontroller_lightweight_interrupts", "true") + +fixture("mesecons_luacontroller") + +describe("LuaController lightweight interrupt", function() + local pos = {x = 0, y = 0, z = 0} + + before_each(function() + mesecon._test_place(pos, "mesecons_luacontroller:luacontroller0000") + mineunit:execute_globalstep() -- Execute receptor_on action + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("works", function() + mesecon._test_program_luac(pos, [[ + if event.type == "program" then + interrupt(5) + interrupt(10) + elseif event.type == "interrupt" then + port.a = not pin.a + end + ]]) + mineunit:execute_globalstep(0.1) + mineunit:execute_globalstep(9) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + mineunit:execute_globalstep(1) + mineunit:execute_globalstep(0.1) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + end) +end) diff --git a/mods/mesecons/mesecons_luacontroller/spec/luac_spec.lua b/mods/mesecons/mesecons_luacontroller/spec/luac_spec.lua new file mode 100644 index 00000000..351b2e45 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/spec/luac_spec.lua @@ -0,0 +1,176 @@ +require("mineunit") + +fixture("mesecons_luacontroller") + +-- Digiline is not tested, since that would require the digiline mod. + +describe("LuaController", function() + local pos = {x = 0, y = 0, z = 0} + local pos_a = {x = -1, y = 0, z = 0} + + before_each(function() + mesecon._test_place(pos, "mesecons_luacontroller:luacontroller0000") + mineunit:execute_globalstep() -- Execute receptor_on action + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("rejects binary code", function() + local ok = mesecon._test_program_luac(pos, string.dump(function() end)) + assert.is_false(ok) + end) + + it("I/O", function() + mesecon._test_place(pos_a, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + mesecon._test_program_luac(pos, [[ + port.a = not pin.a + port.b = not pin.b + port.c = not pin.c + port.d = not pin.d + ]]) + assert.equal("mesecons_luacontroller:luacontroller1110", world.get_node(pos).name) + mesecon._test_dig(pos_a) + mineunit:execute_globalstep() -- Execute receptor_off action + mineunit:execute_globalstep() -- Execute deactivate/change actions + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + end) + + it("memory", function() + mesecon._test_program_luac(pos, [[ + if not mem.x then + mem.x = {} + mem.x[mem.x] = {true, "", 1.2} + else + local b, s, n = unpack(mem.x[mem.x]) + if b == true and s == "" and n == 1.2 then + port.d = true + end + end + ]]) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + mesecon._test_place(pos_a, "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + assert.equal("mesecons_luacontroller:luacontroller1000", world.get_node(pos).name) + end) + + it("interrupts without IDs", function() + mesecon._test_program_luac(pos, [[ + if event.type == "program" then + interrupt(4) + interrupt(8) + elseif event.type == "interrupt" then + port.a = not pin.a + end + ]]) + mineunit:execute_globalstep(0.1) + mineunit:execute_globalstep(3) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + mineunit:execute_globalstep(1) + mineunit:execute_globalstep(0.1) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mineunit:execute_globalstep(3) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mineunit:execute_globalstep(1) + mineunit:execute_globalstep(0.1) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) + + it("interrupts with IDs", function() + mesecon._test_program_luac(pos, [[ + if event.type == "program" then + interrupt(2, "a") + interrupt(4, "a") + interrupt(16, "b") + elseif event.type == "interrupt" then + if event.iid == "a" then + interrupt(5, "b") + interrupt(4, "b") + end + port.a = not pin.a + end + ]]) + mineunit:execute_globalstep(0.1) + mineunit:execute_globalstep(3) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + mineunit:execute_globalstep(1) + mineunit:execute_globalstep(0.1) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mineunit:execute_globalstep(3) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mineunit:execute_globalstep(1) + mineunit:execute_globalstep(0.1) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) + + it("limits interrupt ID size", function() + mesecon._test_program_luac(pos, [[ + if event.type == "program" then + interrupt(0, (" "):rep(257)) + elseif event.type == "interrupt" then + port.a = not pin.a + end + ]]) + mineunit:execute_globalstep(3) + mineunit:execute_globalstep(3) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) + + it("string.rep", function() + mesecon._test_program_luac(pos, [[ + (" "):rep(64000) + port.a = true + ]]) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mesecon._test_program_luac(pos, [[ + (" "):rep(64001) + port.b = true + ]]) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) + + it("string.find", function() + mesecon._test_program_luac(pos, [[ + port.a = (" a"):find("a", nil, true) == 2 + ]]) + assert.equal("mesecons_luacontroller:luacontroller0001", world.get_node(pos).name) + mesecon._test_program_luac(pos, [[ + (" a"):find("a", nil) + port.b = true + ]]) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) + + it("overheats", function() + mesecon._test_program_luac(pos, [[ + interrupt(0) + interrupt(0) + ]]) + mineunit:execute_globalstep() -- Execute 2 interrupts + mineunit:execute_globalstep() -- Execute 4 interrupts + mineunit:execute_globalstep() -- Execute 8 interrupts + mineunit:execute_globalstep() -- Execute 16 interrupts + assert.equal("mesecons_luacontroller:luacontroller_burnt", world.get_node(pos).name) + end) + + it("limits memory", function() + mesecon._test_program_luac(pos, [[ + port.a = true + mem.x = (" "):rep(50000) .. (" "):rep(50000) + ]]) + assert.equal("mesecons_luacontroller:luacontroller_burnt", world.get_node(pos).name) + end) + + it("limits run time", function() + mesecon._test_program_luac(pos, [[ + port.a = true + for i = 1, 1000000 do end + ]]) + assert.equal("mesecons_luacontroller:luacontroller0000", world.get_node(pos).name) + end) +end) diff --git a/mods/mesecons/mesecons_luacontroller/spec/mineunit.conf b/mods/mesecons/mesecons_luacontroller/spec/mineunit.conf new file mode 100644 index 00000000..81bd36ce --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/spec/mineunit.conf @@ -0,0 +1 @@ +fixture_paths = {"../.test_fixtures"} diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png new file mode 100644 index 00000000..f2a07e1b Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png new file mode 100644 index 00000000..f43b571c Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png new file mode 100644 index 00000000..c9e1144f Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png new file mode 100644 index 00000000..848f4171 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png differ diff --git a/mods/mesecons/mesecons_materials/doc/fiber/description.html b/mods/mesecons/mesecons_materials/doc/fiber/description.html new file mode 100644 index 00000000..23a414ac --- /dev/null +++ b/mods/mesecons/mesecons_materials/doc/fiber/description.html @@ -0,0 +1 @@ +Craftitem: It can't be placed! Made by cooking glue in the furnace. Used for insulated mesecon crafting. diff --git a/mods/mesecons/mesecons_materials/doc/fiber/preview.png b/mods/mesecons/mesecons_materials/doc/fiber/preview.png new file mode 100644 index 00000000..4b5dc058 Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/fiber/preview.png differ diff --git a/mods/mesecons/mesecons_materials/doc/fiber/recipe.png b/mods/mesecons/mesecons_materials/doc/fiber/recipe.png new file mode 100644 index 00000000..689adf68 Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/fiber/recipe.png differ diff --git a/mods/mesecons/mesecons_materials/doc/glue/description.html b/mods/mesecons/mesecons_materials/doc/glue/description.html new file mode 100644 index 00000000..a18490c2 --- /dev/null +++ b/mods/mesecons/mesecons_materials/doc/glue/description.html @@ -0,0 +1 @@ +Craftitem: It can't be placed! Made by cooking saplings in furnace. Used for sticky pistons and sticky movestones. diff --git a/mods/mesecons/mesecons_materials/doc/glue/preview.png b/mods/mesecons/mesecons_materials/doc/glue/preview.png new file mode 100644 index 00000000..71a58ef7 Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/glue/preview.png differ diff --git a/mods/mesecons/mesecons_materials/doc/glue/recipe.png b/mods/mesecons/mesecons_materials/doc/glue/recipe.png new file mode 100644 index 00000000..763e369b Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/glue/recipe.png differ diff --git a/mods/mesecons/mesecons_materials/doc/silicon/description.html b/mods/mesecons/mesecons_materials/doc/silicon/description.html new file mode 100644 index 00000000..a2ae598c --- /dev/null +++ b/mods/mesecons/mesecons_materials/doc/silicon/description.html @@ -0,0 +1 @@ +Silicon is just a craftitem: It can't be placed. You'll need it in order to craft other items. diff --git a/mods/mesecons/mesecons_materials/doc/silicon/preview.png b/mods/mesecons/mesecons_materials/doc/silicon/preview.png new file mode 100644 index 00000000..452ed403 Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/silicon/preview.png differ diff --git a/mods/mesecons/mesecons_materials/doc/silicon/recipe.png b/mods/mesecons/mesecons_materials/doc/silicon/recipe.png new file mode 100644 index 00000000..d73a6c28 Binary files /dev/null and b/mods/mesecons/mesecons_materials/doc/silicon/recipe.png differ diff --git a/mods/mesecons/mesecons_materials/init.lua b/mods/mesecons/mesecons_materials/init.lua new file mode 100644 index 00000000..ae95eb5d --- /dev/null +++ b/mods/mesecons/mesecons_materials/init.lua @@ -0,0 +1,43 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Glue and fiber +minetest.register_craftitem("mesecons_materials:glue", { + image = "mesecons_glue.png", + on_place_on_ground = minetest.craftitem_place_item, + description = S("Glue"), +}) + +minetest.register_craftitem("mesecons_materials:fiber", { + image = "mesecons_fiber.png", + on_place_on_ground = minetest.craftitem_place_item, + description = S("Fiber"), +}) + +minetest.register_craft({ + output = "mesecons_materials:glue 2", + type = "cooking", + recipe = "group:sapling", + cooktime = 2 +}) + +minetest.register_craft({ + output = "mesecons_materials:fiber 6", + type = "cooking", + recipe = "mesecons_materials:glue", + cooktime = 4 +}) + +-- Silicon +minetest.register_craftitem("mesecons_materials:silicon", { + image = "mesecons_silicon.png", + on_place_on_ground = minetest.craftitem_place_item, + description = S("Silicon"), +}) + +minetest.register_craft({ + output = "mesecons_materials:silicon 4", + recipe = { + {"group:sand", "group:sand"}, + {"group:sand", "mesecons_gamecompat:steel_ingot"}, + } +}) diff --git a/mods/mesecons/mesecons_materials/locale/mesecons_materials.de.tr b/mods/mesecons/mesecons_materials/locale/mesecons_materials.de.tr new file mode 100644 index 00000000..56a350c5 --- /dev/null +++ b/mods/mesecons/mesecons_materials/locale/mesecons_materials.de.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_materials +Glue=Klebstoff +Fiber=Faser +Silicon=Silizium diff --git a/mods/mesecons/mesecons_materials/locale/mesecons_materials.eo.tr b/mods/mesecons/mesecons_materials/locale/mesecons_materials.eo.tr new file mode 100644 index 00000000..501c3869 --- /dev/null +++ b/mods/mesecons/mesecons_materials/locale/mesecons_materials.eo.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_materials + +### init.lua ### +Glue=Gluo +Fiber=Fibro +Silicon=Silicio diff --git a/mods/mesecons/mesecons_materials/locale/mesecons_materials.fr.tr b/mods/mesecons/mesecons_materials/locale/mesecons_materials.fr.tr new file mode 100644 index 00000000..ddec8293 --- /dev/null +++ b/mods/mesecons/mesecons_materials/locale/mesecons_materials.fr.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_materials + +### init.lua ### +Glue=Colle +Fiber=Fibre +Silicon=Silicone diff --git a/mods/mesecons/mesecons_materials/locale/template.txt b/mods/mesecons/mesecons_materials/locale/template.txt new file mode 100644 index 00000000..4c1eb74e --- /dev/null +++ b/mods/mesecons/mesecons_materials/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mesecons_materials + +### init.lua ### +Glue= +Fiber= +Silicon= diff --git a/mods/mesecons/mesecons_materials/mod.conf b/mods/mesecons/mesecons_materials/mod.conf new file mode 100644 index 00000000..6e109498 --- /dev/null +++ b/mods/mesecons/mesecons_materials/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_materials +depends = mesecons_gamecompat diff --git a/mods/mesecons/mesecons_materials/textures/mesecons_fiber.png b/mods/mesecons/mesecons_materials/textures/mesecons_fiber.png new file mode 100644 index 00000000..2a4b231b Binary files /dev/null and b/mods/mesecons/mesecons_materials/textures/mesecons_fiber.png differ diff --git a/mods/mesecons/mesecons_materials/textures/mesecons_glue.png b/mods/mesecons/mesecons_materials/textures/mesecons_glue.png new file mode 100644 index 00000000..28171f46 Binary files /dev/null and b/mods/mesecons/mesecons_materials/textures/mesecons_glue.png differ diff --git a/mods/mesecons/mesecons_materials/textures/mesecons_silicon.png b/mods/mesecons/mesecons_materials/textures/mesecons_silicon.png new file mode 100644 index 00000000..7014f3ff Binary files /dev/null and b/mods/mesecons/mesecons_materials/textures/mesecons_silicon.png differ diff --git a/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.html b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.html new file mode 100644 index 00000000..af1e5c30 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.html @@ -0,0 +1,64 @@ + +

The Microcontroller is a semi-advanced programmable component with a persistent +256 bit EEPROM memory.

+

Warning: This device is largely considered deprecated and might contain bugs. It +is recommended to use a Luacontroller instead.

+

Detailed documentation can be found below:

+
    +
  • The Microcontroller's code is executed whenever any of the following events +happens:
      +
    • The Microcontroller is programmed. In this case the EEPROM and ports are all +reset to 0 before.
    • +
    • An incoming signal changes its state.
    • +
    • An after event happens (see command after below).
    • +
    +
  • +
  • There are 4 I/O ports (ABCD) and 256 EEPROM bits (1 to 256).
  • +
  • The code consists of a sequence of commands.
  • +
  • Everything after : is a comment.
  • +
  • Strings are enclosed in "s.
  • +
  • Spaces and tabs outside of strings are ignored.
  • +
  • Basic command syntax:
        command_name`(`param1`,` param2`,` ...`)`
    +
    +
  • +
  • Commands:
      +
    • if(condition) commands [> else_commands];: +Evaluates the given condition and takes the corresponding branch. +The else branch is optional (as indicated by the [ and ]). The > is part +of the syntax and indicates the start of the else branch. The ; marks the +end of the if command.
    • +
    • on(port1, port2, ...): +Sets the given ports to 1.
    • +
    • off(port1, port2, ...): +Sets the given ports to 0.
    • +
    • print("string" or codition, ...): +Evaluates the conditions and prints the concatenation of all params to stdout +(only useful in singleplayer).
    • +
    • after(time, "more commands"): +Executes the commands in the string after the given time in seconds. +There can only be one waiting after event at once. +Warning: This is not reliable, ie. minetest.after is used.
    • +
    • sbi(port_or_eeprom, condition): +Evaluates the condition and sets the port or EEPROM bit to the resulting value. +Note: EEPROM indices don't use # here, ie. it's sbi(1, #2), not sbi(#1, #2).
    • +
    +
  • +
  • Conditions (sorted by descending precedence; they are all evaluated from left +to right):
      +
    • 0, 1: constant
    • +
    • A, ..., D: value of a port. Takes writes that already happened during the +current execution into account.
    • +
    • #1, ..., #256: value of an EEPROM bit. Takes writes that already happened +during the current execution into account.
    • +
    • !condition: negation (can only be applied once, ie. not !!1)
    • +
    • condition1 = condition2: XNOR (equality)
    • +
    • condition1 op condition2 where op is one of:
        +
      • &: AND
      • +
      • |: OR
      • +
      • ~: XOR (inequality)
      • +
      +
    • +
    • Note: Explicit precedence using parentheses is not supported.
    • +
    +
  • +
diff --git a/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.md b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.md new file mode 100644 index 00000000..a723537b --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.md @@ -0,0 +1,59 @@ + + +The Microcontroller is a semi-advanced programmable component with a persistent +256 bit EEPROM memory. + +Warning: This device is largely considered deprecated and might contain bugs. It +is recommended to use a Luacontroller instead. + +Detailed documentation can be found below: + +* The Microcontroller's code is executed whenever any of the following events + happens: + * The Microcontroller is programmed. In this case the EEPROM and ports are all + reset to `0` before. + * An incoming signal changes its state. + * An `after` event happens (see command `after` below). +* There are 4 I/O ports (ABCD) and 256 EEPROM bits (1 to 256). +* The code consists of a sequence of commands. +* Everything after `:` is a comment. +* Strings are enclosed in `"`s. +* Spaces and tabs outside of strings are ignored. +* Basic command syntax: + ``` + command_name`(`param1`,` param2`,` ...`)` + ``` +* Commands: + * `if(condition) commands [> else_commands];`: + Evaluates the given condition and takes the corresponding branch. + The else branch is optional (as indicated by the `[` and `]`). The `>` is part + of the syntax and indicates the start of the else branch. The `;` marks the + end of the if command. + * `on(port1, port2, ...)`: + Sets the given ports to `1`. + * `off(port1, port2, ...)`: + Sets the given ports to `0`. + * `print("string" or codition, ...)`: + Evaluates the conditions and prints the concatenation of all params to stdout + (only useful in singleplayer). + * `after(time, "more commands")`: + Executes the commands in the string after the given time in seconds. + There can only be one waiting `after` event at once. + Warning: This is not reliable, ie. `minetest.after` is used. + * `sbi(port_or_eeprom, condition)`: + Evaluates the condition and sets the port or EEPROM bit to the resulting value. + Note: EEPROM indices don't use `#` here, ie. it's `sbi(1, #2)`, not `sbi(#1, #2)`. +* Conditions (sorted by descending precedence; they are all evaluated from left + to right): + * `0`, `1`: constant + * `A`, ..., `D`: value of a port. Takes writes that already happened during the + current execution into account. + * `#1`, ..., `#256`: value of an EEPROM bit. Takes writes that already happened + during the current execution into account. + * `!condition`: negation (can only be applied once, ie. not `!!1`) + * `condition1 = condition2`: XNOR (equality) + * `condition1 op condition2` where `op` is one of: + * `&`: AND + * `|`: OR + * `~`: XOR (inequality) + * Note: Explicit precedence using parentheses is not supported. diff --git a/mods/mesecons/mesecons_microcontroller/doc/microcontroller/preview.png b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/preview.png new file mode 100644 index 00000000..cf158824 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/preview.png differ diff --git a/mods/mesecons/mesecons_microcontroller/doc/microcontroller/recipe.png b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/recipe.png new file mode 100644 index 00000000..bf6ebd33 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/doc/microcontroller/recipe.png differ diff --git a/mods/mesecons/mesecons_microcontroller/init.lua b/mods/mesecons/mesecons_microcontroller/init.lua new file mode 100644 index 00000000..271b17dc --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/init.lua @@ -0,0 +1,729 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local EEPROM_SIZE = 255 + +local microc_rules = {} +local yc = {} + +for a = 0, 1 do +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do +local nodename = "mesecons_microcontroller:microcontroller"..tostring(d)..tostring(c)..tostring(b)..tostring(a) +local top = "jeija_microcontroller_top.png" +if tostring(a) == "1" then + top = top.."^jeija_luacontroller_LED_A.png" +end +if tostring(b) == "1" then + top = top.."^jeija_luacontroller_LED_B.png" +end +if tostring(c) == "1" then + top = top.."^jeija_luacontroller_LED_C.png" +end +if tostring(d) == "1" then + top = top.."^jeija_luacontroller_LED_D.png" +end +local groups +if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then + groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3, overheat = 1} +else + groups = {dig_immediate=2, mesecon = 3, overheat = 1} +end +local rules={} +if (a == 1) then table.insert(rules, {x = -1, y = 0, z = 0}) end +if (b == 1) then table.insert(rules, {x = 0, y = 0, z = 1}) end +if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end +if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end + +local input_rules={} +if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0, name = "A"}) end +if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1, name = "B"}) end +if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0, name = "C"}) end +if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1, name = "D"}) end +microc_rules[nodename] = rules + +local mesecons = {effector = +{ + rules = input_rules, + action_change = function (pos, node, rulename, newstate) + if yc.update_real_portstates(pos, node, rulename, newstate) then + yc.update(pos) + end + end +}} +if nodename ~= "mesecons_microcontroller:microcontroller0000" then + mesecons.receptor = { + state = mesecon.state.on, + rules = rules + } +end + +minetest.register_node(nodename, { + description = S("Microcontroller"), + drawtype = "nodebox", + tiles = { + top, + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + + sunlight_propagates = true, + paramtype = "light", + is_ground_content = false, + walkable = true, + groups = groups, + drop = "mesecons_microcontroller:microcontroller0000 1", + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + { -5/16, -7/16, -5/16, 5/16, -6/16, 5/16 }, -- circuit board + { -3/16, -6/16, -3/16, 3/16, -5/16, 3/16 }, -- IC + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("code", "") + meta:set_string("formspec", "size[9,2.5]".. + "field[0.256,-0.2;9,2;code;Code:;]".. + "button[0 ,0.2;1.5,3;band;AND]".. + "button[1.5,0.2;1.5,3;bxor;XOR]".. + "button[3 ,0.2;1.5,3;bnot;NOT]".. + "button[4.5,0.2;1.5,3;bnand;NAND]".. + "button[6 ,0.2;1.5,3;btflop;T-Flop]".. + "button[7.5,0.2;1.5,3;brsflop;RS-Flop]".. + "button_exit[3.5,1;2,3;program;Program]") + meta:set_string("infotext", "Unprogrammed Microcontroller") + local r = "" + for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" + meta:set_string("eeprom", r) + end, + on_receive_fields = function(pos, _, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) and + not minetest.check_player_privs(player_name, {protection_bypass=true}) then + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + if fields.band then + fields.code = "sbi(C, A&B) :A and B are inputs, C is output" + elseif fields.bxor then + fields.code = "sbi(C, A~B) :A and B are inputs, C is output" + elseif fields.bnot then + fields.code = "sbi(B, !A) :A is input, B is output" + elseif fields.bnand then + fields.code = "sbi(C, !A|!B) :A and B are inputs, C is output" + elseif fields.btflop then + fields.code = "if(A)sbi(1,1);if(!A)sbi(B,!B)sbi(1,0); if(C)off(B); :A is input, B is output (Q), C is reset, toggles with falling edge" + elseif fields.brsflop then + fields.code = "if(A)on(C);if(B)off(C); :A is S (Set), B is R (Reset), C is output (R dominates)" + end + if fields.code == nil then return end + + meta:set_string("code", fields.code) + meta:set_string("formspec", "size[9,2.5]".. + "field[0.256,-0.2;9,2;code;Code:;"..minetest.formspec_escape(fields.code).."]".. + "button[0 ,0.2;1.5,3;band;AND]".. + "button[1.5,0.2;1.5,3;bxor;XOR]".. + "button[3 ,0.2;1.5,3;bnot;NOT]".. + "button[4.5,0.2;1.5,3;bnand;NAND]".. + "button[6 ,0.2;1.5,3;btflop;T-Flop]".. + "button[7.5,0.2;1.5,3;brsflop;RS-Flop]".. + "button_exit[3.5,1;2,3;program;Program]") + meta:set_string("infotext", "Programmed Microcontroller") + yc.reset (pos) + yc.update(pos) + end, + sounds = mesecon.node_sound.stone, + mesecons = mesecons, + after_dig_node = function (pos, node) + rules = microc_rules[node.name] + mesecon.receptor_off(pos, rules) + end, + on_blast = mesecon.on_blastnode, +}) +end +end +end +end + +if minetest.get_modpath("mesecons_luacontroller") then + minetest.register_craft({ + type = "shapeless", + output = "mesecons_microcontroller:microcontroller0000", + recipe = {"mesecons_luacontroller:luacontroller0000"}, + }) + minetest.register_craft({ + type = "shapeless", + output = "mesecons_luacontroller:luacontroller0000", + recipe = {"mesecons_microcontroller:microcontroller0000"}, + }) +else + minetest.register_craft({ + output = 'craft "mesecons_microcontroller:microcontroller0000" 2', + recipe = { + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''}, + } + }) +end + +yc.reset = function(pos) + yc.action(pos, {a=false, b=false, c=false, d=false}) + local meta = minetest.get_meta(pos) + meta:set_int("afterid", 0) + local r = "" + for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" + meta:set_string("eeprom", r) +end + +yc.update = function(pos) + local meta = minetest.get_meta(pos) + + if (mesecon.do_overheat(pos)) then + minetest.remove_node(pos) + minetest.after(0.2, function (pos) + mesecon.receptor_off(pos, mesecon.rules.flat) + end , pos) -- wait for pending parsings + minetest.add_item(pos, "mesecons_microcontroller:microcontroller0000") + end + + local code = meta:get_string("code") + code = yc.code_remove_commentary(code) + code = string.gsub(code, " ", "") --Remove all spaces + code = string.gsub(code, " ", "") --Remove all tabs + if yc.parsecode(code, pos) == nil then + meta:set_string("infotext", "Code not valid!\n"..code) + else + meta:set_string("infotext", "Working Microcontroller\n"..code) + end +end + + +--Code Parsing +yc.code_remove_commentary = function(code) + local is_string = false + for i = 1, #code do + if code:sub(i, i) == '"' then + is_string = not is_string --toggle is_string + elseif code:sub(i, i) == ":" and not is_string then + return code:sub(1, i-1) + end + end + return code +end + +yc.parsecode = function(code, pos) + local meta = minetest.get_meta(pos) + local endi = 1 + local Lreal = yc.get_real_portstates(pos) + local Lvirtual = yc.get_virtual_portstates(pos) + if Lvirtual == nil then return nil end + local eeprom = meta:get_string("eeprom") + while true do + local command, params + command, endi = yc.parse_get_command(code, endi) + if command == nil then return nil end + if command == true then break end --end of code + if command == "if" then + local r + r, endi = yc.command_if(code, endi, yc.merge_portstates(Lreal, Lvirtual), eeprom) + if r == nil then return nil end + if r == true then -- nothing + elseif r == false then + local endi_new = yc.skip_to_else (code, endi) + if endi_new == nil then --else > not found + endi = yc.skip_to_endif(code, endi) + else + endi = endi_new + end + if endi == nil then return nil end + end + else + params, endi = yc.parse_get_params(code, endi) + if not params then return nil end + end + if command == "on" then + Lvirtual = yc.command_on (params, Lvirtual) + elseif command == "off" then + Lvirtual = yc.command_off(params, Lvirtual) + elseif command == "print" then + local su = yc.command_print(params, eeprom, yc.merge_portstates(Lreal, Lvirtual)) + if su ~= true then return nil end + elseif command == "after" then + local su = yc.command_after(params, pos) + if su == nil then return nil end + elseif command == "sbi" then + local new_eeprom + new_eeprom, Lvirtual = yc.command_sbi (params, eeprom, yc.merge_portstates(Lreal, Lvirtual), Lvirtual) + if new_eeprom == nil then return nil + else eeprom = new_eeprom end + elseif command == "if" then --nothing + else + return nil + end + if Lvirtual == nil then return nil end + if eeprom == nil then return nil else + minetest.get_meta(pos):set_string("eeprom", eeprom) end + end + yc.action(pos, Lvirtual) + return true +end + +yc.parse_get_command = function(code, starti) + local i = starti + local s + while s ~= "" do + s = string.sub(code, i, i) + if s == "(" then + return string.sub(code, starti, i-1), i + 1 -- i: ( i+1 after ( + end + if s == ";" and starti == i then + starti = starti + 1 + i = starti + elseif s == ">" then + starti = yc.skip_to_endif(code, starti) + if starti == nil then return nil end + i = starti + else + i = i + 1 + end + end + + if starti == i-1 then + return true, true + end + return nil, nil +end + +yc.parse_get_params = function(code, starti) + local i = starti + local s + local params = {} + local is_string = false + while s ~= "" do + s = string.sub(code, i, i) + if code:sub(i, i) == '"' then + is_string = (is_string==false) --toggle is_string + end + if s == ")" and is_string == false then + table.insert(params, string.sub(code, starti, i-1)) -- i: ) i+1 after ) + return params, i + 1 + end + if s == "," and is_string == false then + table.insert(params, string.sub(code, starti, i-1)) -- i: ) i+1 after ) + starti = i + 1 + end + i = i + 1 + end + return nil, nil +end + +yc.parse_get_eeprom_param = function(cond, starti) + local i = starti + local s + local addr + while s ~= "" do + s = string.sub(cond, i, i) + local b = s:byte() + if s == "" or 48 > b or b > 57 then + addr = string.sub(cond, starti, i-1) -- i: last number i+1 after last number + return addr, i + end + if s == "," then return nil, nil end + i = i + 1 + end + return nil, nil +end + +yc.skip_to_endif = function(code, starti) + local i = starti + local s = false + local open_ifs = 1 + while s ~= nil and s~= "" do + s = code:sub(i, i) + if s == "i" and code:sub(i+1, i+1) == "f" then --if in µCScript + open_ifs = open_ifs + 1 + end + if s == ";" then + open_ifs = open_ifs - 1 + end + if open_ifs == 0 then + return i + 1 + end + i = i + 1 + end + return nil +end + +yc.skip_to_else = function(code, starti) + local i = starti + local s = false + local open_ifs = 1 + while s ~= nil and s~= "" do + s = code:sub(i, i) + if s == "i" and code:sub(i+1, i+1) == "f" then --if in µCScript + open_ifs = open_ifs + 1 + end + if s == ";" then + open_ifs = open_ifs - 1 + end + if open_ifs == 1 and s == ">" then + return i + 1 + end + i = i + 1 + end + return nil +end + +--Commands +yc.command_on = function(params, L) + for i, port in ipairs(params) do + L = yc.set_portstate (port, true, L) + end + return L +end + +yc.command_off = function(params, L) + for i, port in ipairs(params) do + L = yc.set_portstate (port, false, L) + end + return L +end + +yc.command_print = function(params, eeprom, L) + local s = "" + for i, param in ipairs(params) do + if param:sub(1,1) == '"' and param:sub(#param, #param) == '"' then + s = s..param:sub(2, #param-1) + else + local r = yc.command_parsecondition(param, L, eeprom) + if r == "1" or r == "0" then + s = s..r + else return nil end + end + end + print(s) --don't remove + return true +end + +yc.command_sbi = function(params, eeprom, L, Lv) + if params[1]==nil or params[2]==nil or params[3] ~=nil then return nil end + local status = yc.command_parsecondition(params[2], L, eeprom) + + if status == nil then return nil, nil end + + if #params[1]==1 then + local b = params[1]:byte() + if 65 <= b and b <= 68 then -- is a port + if status == "1" then + Lv = yc.set_portstate (params[1], true, Lv) + else + Lv = yc.set_portstate (params[1], false, Lv) + end + return eeprom, Lv; + end + end + + --is an eeprom address + local new_eeprom = ""; + for i=1, #eeprom do + if tonumber(params[1])==i then + new_eeprom = new_eeprom..status + else + new_eeprom = new_eeprom..eeprom:sub(i, i) + end + end + return new_eeprom, Lv +end + +-- after (delay) +yc.command_after = function(params, pos) + if params[1] == nil or params[2] == nil or params[3] ~= nil then return nil end + + --get time (maximum time is 200) + local time = tonumber(params[1]) + if time == nil or time > 200 then + return nil + end + + --get code in quotes "code" + if string.sub(params[2], 1, 1) ~= '"' or string.sub(params[2], #params[2], #params[2]) ~= '"' then return nil end + local code = string.sub(params[2], 2, #params[2] - 1) + + local afterid = math.random(10000) + local meta = minetest.get_meta(pos) + meta:set_int("afterid", afterid) + minetest.after(time, yc.command_after_execute, {pos = pos, code = code, afterid = afterid}) + return true +end + +yc.command_after_execute = function(params) + local meta = minetest.get_meta(params.pos) + if meta:get_int("afterid") == params.afterid then --make sure the node has not been changed + if yc.parsecode(params.code, params.pos) == nil then + meta:set_string("infotext", "Code in after() not valid!") + else + if params.code ~= nil then + meta:set_string("infotext", "Working Microcontroller\n"..params.code) + else + meta:set_string("infotext", "Working Microcontroller") + end + end + end +end + +--If +yc.command_if = function(code, starti, L, eeprom) + local cond, endi = yc.command_if_getcondition(code, starti) + if cond == nil then return nil end + + cond = yc.command_parsecondition(cond, L, eeprom) + + local result + if cond == "0" then result = false + elseif cond == "1" then result = true end + if not result then end + return result, endi --endi from local cond, endi = yc.command_if_getcondition(code, starti) +end + +--Condition parsing +yc.command_if_getcondition = function(code, starti) + local i = starti + local s + local brackets = 1 --1 Bracket to close + while s ~= "" do + s = string.sub(code, i, i) + + if s == ")" then + brackets = brackets - 1 + end + + if s == "(" then + brackets = brackets + 1 + end + + if brackets == 0 then + return string.sub(code, starti, i-1), i + 1 -- i: ( i+1 after ( + end + + i = i + 1 + end + return nil, nil +end + +yc.command_parsecondition = function(cond, L, eeprom) + cond = string.gsub(cond, "A", tonumber(L.a and 1 or 0)) + cond = string.gsub(cond, "B", tonumber(L.b and 1 or 0)) + cond = string.gsub(cond, "C", tonumber(L.c and 1 or 0)) + cond = string.gsub(cond, "D", tonumber(L.d and 1 or 0)) + + + local i = 1 + local l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + if s == "#" then + local addr, endi = yc.parse_get_eeprom_param(cond, i+1) + local buf = yc.eeprom_read(tonumber(addr), eeprom) + if buf == nil then return nil end + local call = cond:sub(i, endi-1) + cond = string.gsub(cond, call, buf) + i = 0 + l = string.len(cond) + end + i = i + 1 + end + + cond = string.gsub(cond, "!0", "1") + cond = string.gsub(cond, "!1", "0") + + i = 2 + l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + local b = tonumber(cond:sub(i-1, i-1)) + local a = tonumber(cond:sub(i+1, i+1)) + if cond:sub(i+1, i+1) == nil then break end + if s == "=" then + if a==nil then return nil end + if b==nil then return nil end + local buf = a == b and "1" or "0" + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + i = i + 1 + end + + i = 2 + l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + local b = tonumber(cond:sub(i-1, i-1)) + local a = tonumber(cond:sub(i+1, i+1)) + if cond:sub(i+1, i+1) == nil then break end + if s == "&" then + if a==nil then return nil end + if b==nil then return nil end + local buf = ((a==1) and (b==1)) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + if s == "|" then + if a==nil then return nil end + if b==nil then return nil end + local buf = ((a == 1) or (b == 1)) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + if s == "~" then + if a==nil then return nil end + if b==nil then return nil end + local buf = (((a == 1) or (b == 1)) and not((a==1) and (b==1))) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + i = i + 1 + end + + return cond +end + +--Virtual-Hardware functions +yc.eeprom_read = function(number, eeprom) + if not number then return end + return eeprom:sub(number, number) +end + +--Real I/O functions +yc.action = function(pos, L) --L-->Lvirtual + local Lv = yc.get_virtual_portstates(pos) + local name = "mesecons_microcontroller:microcontroller" + ..tonumber(L.d and 1 or 0) + ..tonumber(L.c and 1 or 0) + ..tonumber(L.b and 1 or 0) + ..tonumber(L.a and 1 or 0) + local node = minetest.get_node(pos) + minetest.swap_node(pos, {name = name, param2 = node.param2}) + + yc.action_setports(pos, L, Lv) +end + +yc.action_setports = function(pos, L, Lv) + local name = "mesecons_microcontroller:microcontroller" + local rules + if Lv.a ~= L.a then + rules = microc_rules[name.."0001"] + if L.a == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.b ~= L.b then + rules = microc_rules[name.."0010"] + if L.b == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.c ~= L.c then + rules = microc_rules[name.."0100"] + if L.c == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.d ~= L.d then + rules = microc_rules[name.."1000"] + if L.d == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end +end + +yc.set_portstate = function(port, state, L) + if port == "A" then L.a = state + elseif port == "B" then L.b = state + elseif port == "C" then L.c = state + elseif port == "D" then L.d = state + else return nil end + return L +end + +-- Updates the real port states according to the signal change. +-- Returns whether the real port states actually changed. +yc.update_real_portstates = function(pos, _, rulename, newstate) + local meta = minetest.get_meta(pos) + if rulename == nil then + meta:set_int("real_portstates", 1) + return true + end + local real_portstates = meta:get_int("real_portstates") + local n = real_portstates - 1 + local L = {} + for i = 1, 4 do + L[i] = n%2 + n = math.floor(n/2) + end + if rulename.x == nil then + for _, rname in ipairs(rulename) do + local port = ({4, 1, nil, 3, 2})[rname.x+2*rname.z+3] + L[port] = (newstate == "on") and 1 or 0 + end + else + local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3] + L[port] = (newstate == "on") and 1 or 0 + end + local new_portstates = 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4] + if new_portstates ~= real_portstates then + meta:set_int("real_portstates", new_portstates) + return true + end + return false +end + +yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside) + local meta = minetest.get_meta(pos) + local L = {} + local n = meta:get_int("real_portstates") - 1 + for _, index in ipairs({"a", "b", "c", "d"}) do + L[index] = ((n%2) == 1) + n = math.floor(n/2) + end + return L +end + +yc.get_virtual_portstates = function(pos) -- portstates according to the name + local name = minetest.get_node(pos).name + local _, a = string.find(name, ":microcontroller") + if a == nil then return nil end + a = a + 1 + + local Lvirtual = {a=false, b=false, c=false, d=false} + if name:sub(a , a ) == "1" then Lvirtual.d = true end + if name:sub(a+1, a+1) == "1" then Lvirtual.c = true end + if name:sub(a+2, a+2) == "1" then Lvirtual.b = true end + if name:sub(a+3, a+3) == "1" then Lvirtual.a = true end + return Lvirtual +end + +yc.merge_portstates = function(Lreal, Lvirtual) + local L = {a=false, b=false, c=false, d=false} + if Lvirtual.a or Lreal.a then L.a = true end + if Lvirtual.b or Lreal.b then L.b = true end + if Lvirtual.c or Lreal.c then L.c = true end + if Lvirtual.d or Lreal.d then L.d = true end + return L +end diff --git a/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.de.tr b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.de.tr new file mode 100644 index 00000000..1348a6fd --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_microcontroller +Microcontroller=Mikrocontroller diff --git a/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.eo.tr b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.eo.tr new file mode 100644 index 00000000..39c2c907 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_microcontroller + +### init.lua ### +Microcontroller=Mikroregilo diff --git a/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.fr.tr b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.fr.tr new file mode 100644 index 00000000..c81a75b8 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_microcontroller + +### init.lua ### +Microcontroller=Micro-controlleur diff --git a/mods/mesecons/mesecons_microcontroller/locale/template.txt b/mods/mesecons/mesecons_microcontroller/locale/template.txt new file mode 100644 index 00000000..f4274a02 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_microcontroller + +### init.lua ### +Microcontroller= diff --git a/mods/mesecons/mesecons_microcontroller/mod.conf b/mods/mesecons/mesecons_microcontroller/mod.conf new file mode 100644 index 00000000..a61475b2 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_microcontroller +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png new file mode 100644 index 00000000..e8ec99e8 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png differ diff --git a/mods/mesecons/mesecons_movestones/doc/movestone/description.html b/mods/mesecons/mesecons_movestones/doc/movestone/description.html new file mode 100644 index 00000000..b7138a00 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/doc/movestone/description.html @@ -0,0 +1,2 @@ +Movestones are effectors that push the blocks in front of them. They move along on the right side of a mesecon wire track. +A movestone trying to move into, or push other nodes into, an unloaded block doesn't move. diff --git a/mods/mesecons/mesecons_movestones/doc/movestone/preview.png b/mods/mesecons/mesecons_movestones/doc/movestone/preview.png new file mode 100644 index 00000000..fb6ab7cc Binary files /dev/null and b/mods/mesecons/mesecons_movestones/doc/movestone/preview.png differ diff --git a/mods/mesecons/mesecons_movestones/doc/movestone/recipe.png b/mods/mesecons/mesecons_movestones/doc/movestone/recipe.png new file mode 100644 index 00000000..61165b1c Binary files /dev/null and b/mods/mesecons/mesecons_movestones/doc/movestone/recipe.png differ diff --git a/mods/mesecons/mesecons_movestones/doc/movestone_sticky/description.html b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/description.html new file mode 100644 index 00000000..f19d6a5e --- /dev/null +++ b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/description.html @@ -0,0 +1,3 @@ +Movestones are effectors that push the blocks in front of them. They move along on the right side of a mesecon wire track. Sticky ones also pull blocks. +A sticky movestone trying to move into, or push other nodes into, an unloaded block doesn't move. +A sticky movestone trying to pull nodes from an unloaded block moves but leaves them behind. diff --git a/mods/mesecons/mesecons_movestones/doc/movestone_sticky/preview.png b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/preview.png new file mode 100644 index 00000000..b9b2302f Binary files /dev/null and b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/preview.png differ diff --git a/mods/mesecons/mesecons_movestones/doc/movestone_sticky/recipe.png b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/recipe.png new file mode 100644 index 00000000..4ad08d94 Binary files /dev/null and b/mods/mesecons/mesecons_movestones/doc/movestone_sticky/recipe.png differ diff --git a/mods/mesecons/mesecons_movestones/init.lua b/mods/mesecons/mesecons_movestones/init.lua new file mode 100644 index 00000000..715e75c6 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/init.lua @@ -0,0 +1,238 @@ +-- MOVESTONE +-- Non-sticky: +-- Moves along mesecon lines +-- Pushes all blocks in front of it +-- +-- Sticky one +-- Moves along mesecon lines +-- Pushes all block in front of it +-- Pull all blocks in its back + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- settings: +local timer_interval = 1 / mesecon.setting("movestone_speed", 3) +local max_push = mesecon.setting("movestone_max_push", 50) +local max_pull = mesecon.setting("movestone_max_pull", 50) + +-- helper functions: +local function get_movestone_direction(rulename, is_vertical) + if is_vertical then + if rulename.z > 0 then + return {x = 0, y = -1, z = 0} + elseif rulename.z < 0 then + return {x = 0, y = 1, z = 0} + elseif rulename.x > 0 then + return {x = 0, y = -1, z = 0} + elseif rulename.x < 0 then + return {x = 0, y = 1, z = 0} + end + else + if rulename.z > 0 then + return {x = -1, y = 0, z = 0} + elseif rulename.z < 0 then + return {x = 1, y = 0, z = 0} + elseif rulename.x > 0 then + return {x = 0, y = 0, z = -1} + elseif rulename.x < 0 then + return {x = 0, y = 0, z = 1} + end + end +end + +-- registration functions: +function mesecon.register_movestone(name, def, is_sticky, is_vertical) + local function movestone_move(pos, node, rulename) + local direction = get_movestone_direction(rulename, is_vertical) + local frontpos = vector.add(pos, direction) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + -- ### Step 1: Push nodes in front ### + local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, max_push, owner) + if not success then + if stack == "protected" then + meta:set_string("infotext", "Can't move: protected area on the way") + return + end + minetest.get_node_timer(pos):start(timer_interval) + return + end + mesecon.mvps_move_objects(frontpos, direction, oldstack) + + -- ### Step 2: Move the movestone ### + minetest.set_node(frontpos, node) + local meta2 = minetest.get_meta(frontpos) + meta2:set_string("owner", owner) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(frontpos, node) + minetest.get_node_timer(frontpos):start(timer_interval) + minetest.sound_play("movestone", { pos = pos, max_hear_distance = 20, gain = 0.5 }, true) + + -- ### Step 3: If sticky, pull stack behind ### + if is_sticky then + local backpos = vector.subtract(pos, direction) + local success, _, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull, owner) + if success then + mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1) + end + end + + -- ### Step 4: Let things fall ### + minetest.check_for_falling(vector.add(pos, {x=0, y=1, z=0})) + end + + def.is_ground_content = false + + def.mesecons = {effector = { + action_on = function(pos, node, rulename) + if rulename and not minetest.get_node_timer(pos):is_started() then + movestone_move(pos, node, rulename) + end + end, + rules = mesecon.rules.default, + }} + + def.after_place_node = mesecon.mvps_set_owner + + def.on_punch = function(pos, _, player) + local player_name = player and player.get_player_name and player:get_player_name() + if mesecon.mvps_claim(pos, player_name) then + minetest.get_node_timer(pos):start(timer_interval) + minetest.chat_send_player(player_name, "Reclaimed movestone") + end + end + + def.on_timer = function(pos) + local sourcepos = mesecon.is_powered(pos) + if not sourcepos then + return + end + local rulename = vector.subtract(sourcepos[1], pos) + mesecon.activate(pos, minetest.get_node(pos), rulename, 0) + end + + def.on_blast = mesecon.on_blastnode + + minetest.register_node(name, def) +end + + +-- registration: +mesecon.register_movestone("mesecons_movestones:movestone", { + tiles = { + "jeija_movestone_side.png", + "jeija_movestone_side.png", + "jeija_movestone_arrows.png^[transformFX", + "jeija_movestone_arrows.png^[transformFX", + "jeija_movestone_arrows.png", + "jeija_movestone_arrows.png", + }, + groups = {cracky = 3}, + description = S("Movestone"), + sounds = mesecon.node_sound.stone +}, false, false) + +mesecon.register_movestone("mesecons_movestones:sticky_movestone", { + tiles = { + "jeija_movestone_side.png", + "jeija_movestone_side.png", + "jeija_sticky_movestone.png^[transformFX", + "jeija_sticky_movestone.png^[transformFX", + "jeija_sticky_movestone.png", + "jeija_sticky_movestone.png", + }, + groups = {cracky = 3}, + description = S("Sticky Movestone"), + sounds = mesecon.node_sound.stone, +}, true, false) + +mesecon.register_movestone("mesecons_movestones:movestone_vertical", { + tiles = { + "jeija_movestone_side.png", + "jeija_movestone_side.png", + "jeija_movestone_arrows.png^[transformFXR90", + "jeija_movestone_arrows.png^[transformR90", + "jeija_movestone_arrows.png^[transformFXR90", + "jeija_movestone_arrows.png^[transformR90", + }, + groups = {cracky = 3}, + description = S("Vertical Movestone"), + sounds = mesecon.node_sound.stone +}, false, true) + +mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", { + tiles = { + "jeija_movestone_side.png^(mesecons_glue.png^[opacity:127)", + "jeija_movestone_side.png^(mesecons_glue.png^[opacity:127)", + "jeija_movestone_arrows.png^[transformFXR90", + "jeija_movestone_arrows.png^[transformR90", + "jeija_movestone_arrows.png^[transformFXR90", + "jeija_movestone_arrows.png^[transformR90", + }, + groups = {cracky = 3}, + description = S("Vertical Sticky Movestone"), + sounds = mesecon.node_sound.stone, +}, true, true) + + +-- crafting: +-- base recipe: +minetest.register_craft({ + output = "mesecons_movestones:movestone 2", + recipe = { + {"mesecons_gamecompat:stone", "mesecons_gamecompat:stone", "mesecons_gamecompat:stone"}, + {"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"}, + {"mesecons_gamecompat:stone", "mesecons_gamecompat:stone", "mesecons_gamecompat:stone"}, + } +}) + +-- conversation: +minetest.register_craft({ + type = "shapeless", + output = "mesecons_movestones:movestone", + recipe = {"mesecons_movestones:movestone_vertical"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_movestones:movestone_vertical", + recipe = {"mesecons_movestones:movestone"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_movestones:sticky_movestone", + recipe = {"mesecons_movestones:sticky_movestone_vertical"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_movestones:sticky_movestone_vertical", + recipe = {"mesecons_movestones:sticky_movestone"}, +}) + +-- make sticky: +minetest.register_craft({ + output = "mesecons_movestones:sticky_movestone", + recipe = { + {"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"}, + } +}) + +minetest.register_craft({ + output = "mesecons_movestones:sticky_movestone_vertical", + recipe = { + {"mesecons_materials:glue"}, + {"mesecons_movestones:movestone_vertical"}, + {"mesecons_materials:glue"}, + } +}) + + +-- legacy code: +minetest.register_alias("mesecons_movestones:movestone_active", + "mesecons_movestones:movestone") +minetest.register_alias("mesecons_movestones:sticky_movestone_active", + "mesecons_movestones:sticky_movestone") diff --git a/mods/mesecons/mesecons_movestones/locale/mesecons_movestone.fr.tr b/mods/mesecons/mesecons_movestones/locale/mesecons_movestone.fr.tr new file mode 100644 index 00000000..3547c932 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/locale/mesecons_movestone.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_movestones + +### init.lua ### +Movestone=Pierre mouvante +Sticky Movestone=Pierre collante mouvante +Vertical Movestone=Pierre mouvante verticalement +Vertical Sticky Movestone=Pierre collante mouvante verticalement diff --git a/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.de.tr b/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.de.tr new file mode 100644 index 00000000..3f11ea27 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.de.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_movestones +Movestone=Laufstein +Sticky Movestone=Klebriger Laufstein +Vertical Movestone=Vertikaler Laufstein +Vertical Sticky Movestone=Vertikaler klebriger Laufstein diff --git a/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.eo.tr b/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.eo.tr new file mode 100644 index 00000000..b4f8d372 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/locale/mesecons_movestones.eo.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_movestones + +### init.lua ### +Movestone=Movŝtono +Sticky Movestone=Glueca Movŝtono +Vertical Movestone=Vertikala Movŝtono +Vertical Sticky Movestone=Vertikala Glueca Movŝtono diff --git a/mods/mesecons/mesecons_movestones/locale/template.txt b/mods/mesecons/mesecons_movestones/locale/template.txt new file mode 100644 index 00000000..a35e6bc0 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mesecons_movestones + +### init.lua ### +Movestone= +Sticky Movestone= +Vertical Movestone= +Vertical Sticky Movestone= diff --git a/mods/mesecons/mesecons_movestones/mod.conf b/mods/mesecons/mesecons_movestones/mod.conf new file mode 100644 index 00000000..6ece2798 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_movestones +depends = mesecons, mesecons_gamecompat, mesecons_materials, mesecons_mvps diff --git a/mods/mesecons/mesecons_movestones/sounds/movestone.ogg b/mods/mesecons/mesecons_movestones/sounds/movestone.ogg new file mode 100644 index 00000000..1910d0cb Binary files /dev/null and b/mods/mesecons/mesecons_movestones/sounds/movestone.ogg differ diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png new file mode 100644 index 00000000..e1f2172b Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png differ diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png new file mode 100644 index 00000000..971ee76f Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png differ diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png b/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png new file mode 100644 index 00000000..cab3e965 Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png differ diff --git a/mods/mesecons/mesecons_mvps/init.lua b/mods/mesecons/mesecons_mvps/init.lua new file mode 100644 index 00000000..aacef336 --- /dev/null +++ b/mods/mesecons/mesecons_mvps/init.lua @@ -0,0 +1,340 @@ +--register stoppers for movestones/pistons + +mesecon.mvps_stoppers = {} +mesecon.on_mvps_move = {} +mesecon.mvps_unmov = {} + +--- Objects (entities) that cannot be moved +function mesecon.register_mvps_unmov(objectname) + mesecon.mvps_unmov[objectname] = true; +end + +function mesecon.is_mvps_unmov(objectname) + return mesecon.mvps_unmov[objectname] +end + +-- Nodes that cannot be pushed / pulled by movestones, pistons +function mesecon.is_mvps_stopper(node, pushdir, stack, stackid) + -- unknown nodes are always stoppers + if not minetest.registered_nodes[node.name] then + return true + end + + local get_stopper = mesecon.mvps_stoppers[node.name] + if type (get_stopper) == "function" then + get_stopper = get_stopper(node, pushdir, stack, stackid) + end + + return get_stopper +end + +function mesecon.register_mvps_stopper(nodename, get_stopper) + if get_stopper == nil then + get_stopper = true + end + mesecon.mvps_stoppers[nodename] = get_stopper +end + +-- Functions to be called on mvps movement +function mesecon.register_on_mvps_move(callback) + mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback +end + +local function on_mvps_move(moved_nodes) + for _, callback in ipairs(mesecon.on_mvps_move) do + callback(moved_nodes) + end +end + +function mesecon.mvps_process_stack() + -- This function is kept for compatibility. + -- It used to call on_placenode on moved nodes, but that is now done automatically. +end + +-- tests if the node can be pushed into, e.g. air, water, grass +local function node_replaceable(name) + local nodedef = minetest.registered_nodes[name] + + -- everything that can be an mvps stopper (unknown nodes and nodes in the + -- mvps_stoppers table) must not be replacable + -- Note: ignore (a stopper) is buildable_to, but we do not want to push into it + if not nodedef or mesecon.mvps_stoppers[name] then + return false + end + + return nodedef.buildable_to or false +end + +function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) + -- determine the number of nodes to be pushed + local nodes = {} + local pos_set = {} + local frontiers = mesecon.fifo_queue.new() + frontiers:add(vector.new(pos)) + + for np in frontiers:iter() do + local np_hash = minetest.hash_node_position(np) + local nn = not pos_set[np_hash] and minetest.get_node(np) + if nn and not node_replaceable(nn.name) then + pos_set[np_hash] = true + table.insert(nodes, {node = nn, pos = np}) + if #nodes > maximum then return nil end + + -- add connected nodes to frontiers + local nndef = minetest.registered_nodes[nn.name] + if nndef and nndef.mvps_sticky then + local connected = nndef.mvps_sticky(np, nn) + for _, cp in ipairs(connected) do + frontiers:add(cp) + end + end + + frontiers:add(vector.add(np, dir)) + + -- If adjacent node is sticky block and connects add that + -- position + for _, r in ipairs(mesecon.rules.alldirs) do + local adjpos = vector.add(np, r) + local adjnode = minetest.get_node(adjpos) + local adjdef = minetest.registered_nodes[adjnode.name] + if adjdef and adjdef.mvps_sticky then + local sticksto = adjdef.mvps_sticky(adjpos, adjnode) + + -- connects to this position? + for _, link in ipairs(sticksto) do + if vector.equals(link, np) then + frontiers:add(adjpos) + end + end + end + end + + if all_pull_sticky then + frontiers:add(vector.subtract(np, dir)) + end + end + end + + return nodes +end + +function mesecon.mvps_set_owner(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer.get_player_name and placer:get_player_name() + if owner and owner ~= "" then + meta:set_string("owner", owner) + else + meta:set_string("owner", "$unknown") -- to distinguish from older pistons + end +end + +function mesecon.mvps_claim(pos, player_name) + if not player_name or player_name == "" then return end + local meta = minetest.get_meta(pos) + if meta:get_string("infotext") == "" then return end + if meta:get_string("owner") == player_name then return end -- already owned + if minetest.is_protected(pos, player_name) then + minetest.chat_send_player(player_name, "Can't reclaim: protected") + return + end + meta:set_string("owner", player_name) + meta:set_string("infotext", "") + return true +end + +local function add_pos(positions, pos) + local hash = minetest.hash_node_position(pos) + positions[hash] = pos +end + +local function are_protected(positions, player_name) + local mode = mesecon.setting("mvps_protection_mode", "compat") + if mode == "ignore" then + return false + end + local name = player_name + if player_name == "" or not player_name then -- legacy MVPS + if mode == "normal" then + name = "$unknown" -- sentinel, for checking for *any* protection + elseif mode == "compat" then + return false + elseif mode == "restrict" then + return true + else + error("Invalid protection mode") + end + end + local is_protected = minetest.is_protected + for _, pos in pairs(positions) do + if is_protected(pos, name) then + return true + end + end + return false +end + +function mesecon.mvps_push(pos, dir, maximum, player_name) + return mesecon.mvps_push_or_pull(pos, dir, dir, maximum, false, player_name) +end + +function mesecon.mvps_pull_all(pos, dir, maximum, player_name) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, true, player_name) +end + +function mesecon.mvps_pull_single(pos, dir, maximum, player_name) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, false, player_name) +end + +-- pos: pos of mvps +-- stackdir: direction of building the stack +-- movedir: direction of actual movement +-- maximum: maximum nodes to be pushed +-- all_pull_sticky: All nodes are sticky in the direction that they are pulled from +-- player_name: Player responsible for the action. +-- - empty string means legacy MVPS, actual check depends on configuration +-- - "$unknown" is a sentinel for forcing the check +function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sticky, player_name) + local nodes = mesecon.mvps_get_stack(pos, movedir, maximum, all_pull_sticky) + + if not nodes then return end + + local protection_check_set = {} + if vector.equals(stackdir, movedir) then -- pushing + add_pos(protection_check_set, pos) + end + -- determine if one of the nodes blocks the push / pull + for id, n in ipairs(nodes) do + if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then + return + end + add_pos(protection_check_set, n.pos) + add_pos(protection_check_set, vector.add(n.pos, movedir)) + end + if are_protected(protection_check_set, player_name) then + return false, "protected" + end + + -- remove all nodes + for _, n in ipairs(nodes) do + n.meta = minetest.get_meta(n.pos):to_table() + local node_timer = minetest.get_node_timer(n.pos) + if node_timer:is_started() then + n.node_timer = {node_timer:get_timeout(), node_timer:get_elapsed()} + end + minetest.remove_node(n.pos) + end + + local oldstack = mesecon.tablecopy(nodes) + + -- update mesecons for removed nodes ( has to be done after all nodes have been removed ) + for _, n in ipairs(nodes) do + mesecon.on_dignode(n.pos, n.node) + end + + -- add nodes + for _, n in ipairs(nodes) do + local np = vector.add(n.pos, movedir) + + -- Turn off conductors in transit + local conductor = mesecon.get_conductor(n.node.name) + if conductor and conductor.state ~= mesecon.state.off then + n.node.name = conductor.offstate or conductor.states[1] + end + + minetest.set_node(np, n.node) + minetest.get_meta(np):from_table(n.meta) + if n.node_timer then + minetest.get_node_timer(np):set(unpack(n.node_timer)) + end + end + + local moved_nodes = {} + for i in ipairs(nodes) do + moved_nodes[i] = {} + moved_nodes[i].oldpos = nodes[i].pos + nodes[i].pos = vector.add(nodes[i].pos, movedir) + moved_nodes[i].pos = nodes[i].pos + moved_nodes[i].node = nodes[i].node + moved_nodes[i].meta = nodes[i].meta + moved_nodes[i].node_timer = nodes[i].node_timer + end + + on_mvps_move(moved_nodes) + + return true, nodes, oldstack +end + +function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor) + local dir_k + local dir_l + for k, v in pairs(dir) do + if v ~= 0 then + dir_k = k + dir_l = v + break + end + end + movefactor = movefactor or 1 + dir = vector.multiply(dir, movefactor) + for id, obj in pairs(minetest.get_objects_inside_radius(pos, #nodestack + 1)) do + local obj_pos = obj:get_pos() + local cbox = obj:get_properties().collisionbox + local min_pos = vector.add(obj_pos, vector.new(cbox[1], cbox[2], cbox[3])) + local max_pos = vector.add(obj_pos, vector.new(cbox[4], cbox[5], cbox[6])) + local ok = true + for k, v in pairs(pos) do + local edge1, edge2 + if k ~= dir_k then + edge1 = v - 0.51 -- More than 0.5 to move objects near to the stack. + edge2 = v + 0.51 + else + edge1 = v - 0.5 * dir_l + edge2 = v + (#nodestack + 0.5 * movefactor) * dir_l + -- Make sure, edge1 is bigger than edge2: + if edge1 > edge2 then + edge1, edge2 = edge2, edge1 + end + end + if min_pos[k] > edge2 or max_pos[k] < edge1 then + ok = false + break + end + end + if ok then + local ent = obj:get_luaentity() + if obj:is_player() or (ent and not mesecon.is_mvps_unmov(ent.name)) then + local np = vector.add(obj_pos, dir) + -- Move only if destination is not solid or object is inside stack: + local nn = minetest.get_node(np) + local node_def = minetest.registered_nodes[nn.name] + local obj_offset = dir_l * (obj_pos[dir_k] - pos[dir_k]) + if (node_def and not node_def.walkable) or + (obj_offset >= 0 and + obj_offset <= #nodestack - 0.5) then + obj:move_to(np) + end + end + end + end +end + +-- Never push into unloaded blocks. Don’t try to pull from them, either. +-- TODO: load blocks instead, as with wires. +mesecon.register_mvps_stopper("ignore") + +mesecon.register_on_mvps_move(mesecon.move_hot_nodes) +mesecon.register_on_mvps_move(function(moved_nodes) + for i = 1, #moved_nodes do + local moved_node = moved_nodes[i] + mesecon.on_placenode(moved_node.pos, moved_node.node) + minetest.after(0, function() + minetest.check_for_falling(moved_node.oldpos) + minetest.check_for_falling(moved_node.pos) + end) + local node_def = minetest.registered_nodes[moved_node.node.name] + if node_def and node_def.mesecon and node_def.mesecon.on_mvps_move then + node_def.mesecon.on_mvps_move(moved_node.pos, moved_node.node, + moved_node.oldpos, moved_node.meta) + end + end +end) diff --git a/mods/mesecons/mesecons_mvps/mod.conf b/mods/mesecons/mesecons_mvps/mod.conf new file mode 100644 index 00000000..3e347879 --- /dev/null +++ b/mods/mesecons/mesecons_mvps/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_mvps +depends = mesecons diff --git a/mods/mesecons/mesecons_mvps/spec/mineunit.conf b/mods/mesecons/mesecons_mvps/spec/mineunit.conf new file mode 100644 index 00000000..81bd36ce --- /dev/null +++ b/mods/mesecons/mesecons_mvps/spec/mineunit.conf @@ -0,0 +1 @@ +fixture_paths = {"../.test_fixtures"} diff --git a/mods/mesecons/mesecons_mvps/spec/node_spec.lua b/mods/mesecons/mesecons_mvps/spec/node_spec.lua new file mode 100644 index 00000000..2a9d1705 --- /dev/null +++ b/mods/mesecons/mesecons_mvps/spec/node_spec.lua @@ -0,0 +1,297 @@ +require("mineunit") + +fixture("mesecons_mvps") + +world.set_default_node("air") + +describe("node movement", function() + after_each(function() + mesecon._test_reset() + world.clear() + end) + + it("works with no moved nodes", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + + assert.same({true, {}, {}}, {mesecon.mvps_push(pos, dir, 1, "")}) + assert.same({true, {}, {}}, {mesecon.mvps_pull_all(pos, dir, 1, "")}) + assert.same({true, {}, {}}, {mesecon.mvps_pull_single(pos, dir, 1, "")}) + end) + + it("works with simple stack", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + world.set_node(vector.add(pos, dir), "mesecons:test_conductor_off") + + assert.is_true((mesecon.mvps_push(pos, dir, 2, ""))) + assert.equal("air", world.get_node(pos).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.add(pos, dir)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.add(pos, vector.multiply(dir, 2))).name) + + assert.is_true((mesecon.mvps_pull_all(vector.add(pos, dir), vector.multiply(dir, -1), 2, ""))) + assert.equal("mesecons:test_conductor_off", world.get_node(pos).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.add(pos, dir)).name) + assert.equal("air", world.get_node(vector.add(pos, vector.multiply(dir, 2))).name) + + assert.is_true((mesecon.mvps_pull_single(pos, vector.multiply(dir, -1), 1, ""))) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.subtract(pos, dir)).name) + assert.equal("air", world.get_node(pos).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.add(pos, dir)).name) + end) + + it("works with sticky nodes", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 0, y = 1, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + world.set_node(vector.offset(pos, 0, 1, 0), "mesecons_mvps:test_sticky") + world.set_node(vector.offset(pos, 1, 1, 0), "mesecons:test_conductor_off") + world.set_node(vector.offset(pos, 1, 2, 0), "mesecons:test_conductor_off") + + assert.is_true((mesecon.mvps_push(pos, dir, 4, ""))) + assert.equal("air", world.get_node(vector.offset(pos, 1, 1, 0)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.offset(pos, 1, 2, 0)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.offset(pos, 1, 3, 0)).name) + + assert.is_true((mesecon.mvps_pull_all(vector.add(pos, dir), vector.multiply(dir, -1), 4, ""))) + assert.equal("air", world.get_node(vector.offset(pos, 1, 0, 0)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.offset(pos, 1, 1, 0)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.offset(pos, 1, 2, 0)).name) + + assert.is_true((mesecon.mvps_pull_single(pos, vector.multiply(dir, -1), 3, ""))) + assert.equal("air", world.get_node(vector.offset(pos, 1, -1, 0)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(vector.offset(pos, 1, 0, 0)).name) + assert.equal("air", world.get_node(vector.offset(pos, 1, 1, 0)).name) + end) + + it("respects maximum", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + world.set_node(vector.add(pos, dir), "mesecons:test_conductor_off") + + assert.is_true(not mesecon.mvps_push(pos, dir, 1, "")) + end) + + it("is blocked by basic stopper", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons_mvps:test_stopper") + + assert.is_true(not mesecon.mvps_push(pos, dir, 1, "")) + end) + + it("is blocked by conditional stopper", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + + world.set_node(pos, {name = "mesecons_mvps:test_stopper_cond", param2 = 0}) + assert.is_true(not mesecon.mvps_push(pos, dir, 1, "")) + + world.set_node(pos, {name = "mesecons_mvps:test_stopper_cond", param2 = 1}) + assert.is_true((mesecon.mvps_push(pos, dir, 1, ""))) + end) + + -- TODO: I think this is supposed to work? + pending("is blocked by ignore", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + world.set_node(vector.add(pos, dir), "ignore") + + assert.is_true(not mesecon.mvps_push(pos, dir, 1, "")) + end) + + it("moves metadata", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + minetest.get_meta(pos):set_string("foo", "bar") + minetest.get_node_timer(pos):set(12, 34) + + mesecon.mvps_push(pos, dir, 1, "") + assert.equal("bar", minetest.get_meta(vector.add(pos, dir)):get("foo")) + local moved_timer = minetest.get_node_timer(vector.add(pos, dir)) + assert.equal(12, moved_timer:get_timeout()) + assert.equal(34, moved_timer:get_elapsed()) + moved_timer:stop() + assert.same({}, minetest.get_meta(pos):to_table().fields) + assert.is_false(minetest.get_node_timer(pos):is_started()) + end) + + it("calls move callbacks", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, {name = "mesecons_mvps:test_on_move", param2 = 123}) + minetest.get_meta(pos):set_string("foo", "bar") + local move_info = {vector.add(pos, dir), world.get_node(pos), pos, minetest.get_meta(pos):to_table()} + + mesecon.mvps_push(pos, dir, 1, "") + assert.equal(1, #mesecon._test_moves) + assert.same(move_info, mesecon._test_moves[1]) + end) + + it("executes autoconnect hooks", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + mesecon.mvps_push(pos, dir, 1, "") + mineunit:execute_globalstep() -- Execute delayed autoconnect hook + assert.equal(2, #mesecon._test_autoconnects) + end) + + it("updates moved receptors", function() + local pos1 = {x = 0, y = 0, z = 0} + local pos2 = vector.offset(pos1, 0, 1, 0) + local pos3 = vector.offset(pos1, 2, 0, 0) + local pos4 = vector.offset(pos1, 0, 0, 1) + local dir = {x = 1, y = 0, z = 0} + mesecon._test_place(pos1, "mesecons:test_receptor_on") + mesecon._test_place(pos2, "mesecons:test_conductor_off") + mesecon._test_place(pos3, "mesecons:test_conductor_off") + mesecon._test_place(pos4, "mesecons:test_conductor_off") + mesecon._test_place(vector.add(pos4, dir), "mesecons:test_conductor_off") + mineunit:execute_globalstep() -- Execute receptor_on action + + mesecon.mvps_push(pos1, dir, 1, "") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + assert.equal("mesecons:test_conductor_off", world.get_node(pos2).name) + assert.equal("mesecons:test_conductor_on", world.get_node(pos3).name) + assert.equal("mesecons:test_conductor_on", world.get_node(pos4).name) + end) + + it("updates moved conductors", function() + local pos1 = {x = 0, y = 0, z = 0} + local pos2 = vector.offset(pos1, 0, 1, 0) + local pos3 = vector.offset(pos1, 0, -1, 0) + local dir = {x = 1, y = 0, z = 0} + mesecon._test_place(pos1, "mesecons:test_conductor_off") + mesecon._test_place(pos2, "mesecons:test_receptor_on") + mesecon._test_place(pos3, "mesecons:test_conductor_off") + mineunit:execute_globalstep() -- Execute receptor_on action + + mesecon.mvps_push(pos1, dir, 1, "") + mineunit:execute_globalstep() -- Execute receptor_off action + assert.equal("mesecons:test_conductor_off", world.get_node(vector.add(pos1, dir)).name) + assert.equal("mesecons:test_conductor_off", world.get_node(pos3).name) + + mesecon.mvps_pull_all(vector.add(pos1, dir), vector.multiply(dir, -1), 1, "") + mineunit:execute_globalstep() -- Execute receptor_on action + assert.equal("mesecons:test_conductor_on", world.get_node(pos1).name) + assert.equal("mesecons:test_conductor_on", world.get_node(pos3).name) + end) + + it("updates moved effectors", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + mesecon._test_place(pos, "mesecons:test_effector") + mesecon._test_place(vector.offset(pos, 0, 1, 0), "mesecons:test_receptor_on") + mesecon._test_place(vector.add(pos, dir), "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + + mesecon.mvps_push(pos, dir, 2, "") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal(tonumber("10000001", 2), world.get_node(vector.add(pos, dir)).param2) + + mineunit:execute_globalstep() -- Let the component cool down + + mesecon.mvps_pull_single(vector.add(pos, dir), vector.multiply(dir, -1), 1, "") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal(tonumber("10000100", 2), world.get_node(pos).param2) + end) + + -- Since turnon is called before turnoff when pushing, effectors may be incorrectly turned off. + it("does not overwrite turnon with receptor_off", function() + local pos = {x = 0, y = 0, z = 0} + local dir = {x = 1, y = 0, z = 0} + mesecon._test_place(pos, "mesecons:test_effector") + mesecon._test_place(vector.add(pos, dir), "mesecons:test_conductor_off") + mesecon._test_place(vector.add(pos, vector.multiply(dir, 2)), "mesecons:test_receptor_on") + mineunit:execute_globalstep() -- Execute receptor_on action + mineunit:execute_globalstep() -- Execute activate/change actions + + mesecon.mvps_push(pos, dir, 3, "") + mineunit:execute_globalstep() -- Execute receptor_on/receptor_off actions + mineunit:execute_globalstep() -- Execute activate/deactivate/change actions + assert.equal(tonumber("10000001", 2), world.get_node(vector.add(pos, dir)).param2) + end) + + -- mineunit doesn't yet implement minetest.check_for_falling. + pending("causes nodes to fall", function() + end) +end) + +describe("protection", function() + teardown(function() + minetest.settings:remove("mesecon.mvps_protection_mode") + end) + + after_each(function() + mesecon._test_reset() + world.clear() + end) + + local protected_pos = {x = 1, y = 0, z = 0} + mineunit:protect(protected_pos, "Joe") + + it("blocks movement", function() + minetest.settings:set("mesecon.mvps_protection_mode", "restrict") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.same({false, "protected"}, {mesecon.mvps_push(pos, {x = 1, y = 0, z = 0}, 1, "Bob")}) + end) + + it("allows owner's movement", function() + minetest.settings:set("mesecon.mvps_protection_mode", "restrict") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.is_true((mesecon.mvps_push(pos, {x = 1, y = 0, z = 0}, 1, "Joe"))) + end) + + it("'ignore'", function() + minetest.settings:set("mesecon.mvps_protection_mode", "ignore") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.is_true((mesecon.mvps_push(pos, {x = 1, y = 0, z = 0}, 1, "Bob"))) + end) + + it("'normal'", function() + minetest.settings:set("mesecon.mvps_protection_mode", "normal") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.same({false, "protected"}, {mesecon.mvps_push(pos, {x = 1, y = 0, z = 0}, 1, "")}) + + assert.is_true((mesecon.mvps_push(pos, {x = 0, y = 1, z = 0}, 1, ""))) + end) + + it("'compat'", function() + minetest.settings:set("mesecon.mvps_protection_mode", "compat") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.is_true((mesecon.mvps_push(pos, {x = 1, y = 0, z = 0}, 1, ""))) + end) + + it("'restrict'", function() + minetest.settings:set("mesecon.mvps_protection_mode", "restrict") + + local pos = {x = 0, y = 0, z = 0} + world.set_node(pos, "mesecons:test_conductor_off") + + assert.same({false, "protected"}, {mesecon.mvps_push(pos, {x = 0, y = 1, z = 0}, 1, "")}) + end) +end) diff --git a/mods/mesecons/mesecons_mvps/spec/object_spec.lua b/mods/mesecons/mesecons_mvps/spec/object_spec.lua new file mode 100644 index 00000000..cc2ca8d0 --- /dev/null +++ b/mods/mesecons/mesecons_mvps/spec/object_spec.lua @@ -0,0 +1,3 @@ +-- mineunit doesn't yet implement minetest.get_objects_inside_radius +pending("object movement", function() +end) diff --git a/mods/mesecons/mesecons_noteblock/README.txt b/mods/mesecons/mesecons_noteblock/README.txt new file mode 100644 index 00000000..e0ad34ca --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/README.txt @@ -0,0 +1,15 @@ +Credits of sound files: + +Note: Most sounds have not been used verbatim, but tweaked a little to be more suitable for the noteblock mod. + +* mesecons_noteblock_litecrash.ogg + * License: CC BY 3.0 + * by freesound.org user ani_music + * Source: https://freesound.org/people/ani_music/sounds/219612/ + +Everything else: +Created by Mesecons authors, licensed CC BY 3.0. + +-------------------- +License links: +* CC BY 3.0: http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/mesecons/mesecons_noteblock/doc/noteblock/description.html b/mods/mesecons/mesecons_noteblock/doc/noteblock/description.html new file mode 100644 index 00000000..a98c0f93 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/doc/noteblock/description.html @@ -0,0 +1,13 @@ +This effector makes a sound if powered and can be used for making music. Normally it makes piano sounds. The sound frequency can be changed by punching the block (only works for piano). There are some special sounds that depend on the block below: + + + + + + + + + + + +
Block BelowEffect
Glass or Obsidian GlassHi-hat
Any stoneKick
Chest or Locked ChestSnare
Any treeCrash
Any wooden planksLite Crash
Coal BlockExplosion sound (fixed pitch)
Lava SourceFire sound (fixed pitch)
Steel BlockPiano (high pitch, one octave higher than normal)
Any other blockPiano (low pitch)
diff --git a/mods/mesecons/mesecons_noteblock/doc/noteblock/preview.png b/mods/mesecons/mesecons_noteblock/doc/noteblock/preview.png new file mode 100644 index 00000000..81a82f51 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/doc/noteblock/preview.png differ diff --git a/mods/mesecons/mesecons_noteblock/doc/noteblock/recipe.png b/mods/mesecons/mesecons_noteblock/doc/noteblock/recipe.png new file mode 100644 index 00000000..2023b44e Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/doc/noteblock/recipe.png differ diff --git a/mods/mesecons/mesecons_noteblock/init.lua b/mods/mesecons/mesecons_noteblock/init.lua new file mode 100644 index 00000000..847c40be --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/init.lua @@ -0,0 +1,120 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("mesecons_noteblock:noteblock", { + description = S("Noteblock"), + tiles = {"mesecons_noteblock.png"}, + is_ground_content = false, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + on_punch = function(pos, node, puncher) -- change sound when punched + if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then + return + end + + node.param2 = (node.param2+1)%12 + mesecon.noteblock_play(pos, node.param2) + minetest.set_node(pos, node) + end, + sounds = mesecon.node_sound.wood, + mesecons = {effector = { -- play sound when activated + action_on = function(pos, node) + mesecon.noteblock_play(pos, node.param2) + end + }}, + place_param2 = 11, -- initialize at C note + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = "mesecons_noteblock:noteblock 1", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +local soundnames = { + [0] = "mesecons_noteblock_csharp", + "mesecons_noteblock_d", + "mesecons_noteblock_dsharp", + "mesecons_noteblock_e", + "mesecons_noteblock_f", + "mesecons_noteblock_fsharp", + "mesecons_noteblock_g", + "mesecons_noteblock_gsharp", + + "mesecons_noteblock_a", + "mesecons_noteblock_asharp", + "mesecons_noteblock_b", + "mesecons_noteblock_c" -- << noteblock is initialized here +} + +local node_sounds = {} +for alias, sound in pairs({ + ["mesecons_gamecompat:lava_source"] = mesecon.sound_name.fire, + ["mesecons_gamecompat:chest"] = "mesecons_noteblock_snare", + ["mesecons_gamecompat:chest_locked"] = "mesecons_noteblock_snare", + ["mesecons_gamecompat:coalblock"] = mesecon.sound_name.explode, + ["mesecons_gamecompat:glass"] = "mesecons_noteblock_hihat", + ["mesecons_gamecompat:obsidian_glass"] = "mesecons_noteblock_hihat", +}) do + local nodename = minetest.registered_aliases[alias] + if nodename then + node_sounds[nodename] = sound + end +end + +local node_sounds_group = { + ["stone"] = "mesecons_noteblock_kick", + ["tree"] = "mesecons_noteblock_crash", + ["wood"] = "mesecons_noteblock_litecrash", +} + +local steelblock_nodename = minetest.registered_aliases["mesecons_gamecompat:steelblock"] +mesecon.noteblock_play = function(pos, param2) + pos.y = pos.y-1 + local nodeunder = minetest.get_node(pos).name + local soundname = node_sounds[nodeunder] + local use_pitch = true + local pitch + -- Special sounds + if not soundname then + for k,v in pairs(node_sounds_group) do + local g = minetest.get_item_group(nodeunder, k) + if g ~= 0 then + soundname = v + break + end + end + end + -- Piano + if not soundname then + soundname = soundnames[param2] + if not soundname then + minetest.log("error", "[mesecons_noteblock] No soundname found, test param2") + return + end + if nodeunder == steelblock_nodename then + soundname = soundname.. 2 + end + use_pitch = false + end + -- Disable pitch for fire and explode because they'd sound too odd + if soundname == "fire_fire" or soundname == "tnt_explode" then + use_pitch = false + end + if use_pitch then + -- Calculate pitch + -- Adding 1 to param2 because param2=11 is *lowest* pitch sound + local val = (param2+1)%12 + pitch = 2^((val-6)/12) + end + pos.y = pos.y+1 + if soundname == "fire_fire" then + -- Smoothly fade out fire sound + local handle = minetest.sound_play(soundname, {pos = pos, loop = true}) + minetest.after(3.0, minetest.sound_fade, handle, -1.5, 0.0) + else + minetest.sound_play(soundname, {pos = pos, pitch = pitch}, true) + end +end diff --git a/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.de.tr b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.de.tr new file mode 100644 index 00000000..88d82c37 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_noteblock +Noteblock=Notenblock diff --git a/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.eo.tr b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.eo.tr new file mode 100644 index 00000000..bea37358 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_noteblock + +### init.lua ### +Noteblock=Sonbloko diff --git a/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.fr.tr b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.fr.tr new file mode 100644 index 00000000..8a2d6321 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_noteblock + +### init.lua ### +Noteblock=Bloc de musique diff --git a/mods/mesecons/mesecons_noteblock/locale/template.txt b/mods/mesecons/mesecons_noteblock/locale/template.txt new file mode 100644 index 00000000..bcd37547 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_noteblock + +### init.lua ### +Noteblock= diff --git a/mods/mesecons/mesecons_noteblock/mod.conf b/mods/mesecons/mesecons_noteblock/mod.conf new file mode 100644 index 00000000..261424b1 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_noteblock +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg new file mode 100644 index 00000000..331fc1cc Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg new file mode 100644 index 00000000..695b0f4e Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg new file mode 100644 index 00000000..db96aedb Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg new file mode 100644 index 00000000..27bd09df Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg new file mode 100644 index 00000000..810fe18f Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg new file mode 100644 index 00000000..3de1250d Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg new file mode 100644 index 00000000..5c60d315 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg new file mode 100644 index 00000000..724db7de Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg new file mode 100644 index 00000000..0308d11a Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg new file mode 100644 index 00000000..12c1ef38 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg new file mode 100644 index 00000000..fc7f6c88 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg new file mode 100644 index 00000000..929b7fba Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg new file mode 100644 index 00000000..dfd702b1 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg new file mode 100644 index 00000000..eb6045d4 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg new file mode 100644 index 00000000..5ac16dde Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg new file mode 100644 index 00000000..94977e0d Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg new file mode 100644 index 00000000..1dcc0c4a Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg new file mode 100644 index 00000000..221d9264 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg new file mode 100644 index 00000000..acf10dbb Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg new file mode 100644 index 00000000..7af83a8e Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg new file mode 100644 index 00000000..a96f6371 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg new file mode 100644 index 00000000..480ca367 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg new file mode 100644 index 00000000..917b2b9c Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg new file mode 100644 index 00000000..2e71fea0 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg new file mode 100644 index 00000000..941c6856 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg new file mode 100644 index 00000000..0afa7c07 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg new file mode 100644 index 00000000..10d585b8 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg new file mode 100644 index 00000000..36d83f39 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg new file mode 100644 index 00000000..83a79441 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png b/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png new file mode 100644 index 00000000..be4dd1bd Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png differ diff --git a/mods/mesecons/mesecons_pistons/doc/piston/description.html b/mods/mesecons/mesecons_pistons/doc/piston/description.html new file mode 100644 index 00000000..b9dffaab --- /dev/null +++ b/mods/mesecons/mesecons_pistons/doc/piston/description.html @@ -0,0 +1,3 @@ +Pistons are effectors, they push up to 20 blocks in front of them. The push direction can be set by placing them from different angles. +A piston pointing into an unloaded block won't extend. +A piston retracting from an unloaded block works, but gravity-sensitive nodes above the empty space may not fall. diff --git a/mods/mesecons/mesecons_pistons/doc/piston/preview.png b/mods/mesecons/mesecons_pistons/doc/piston/preview.png new file mode 100644 index 00000000..44e0ab0d Binary files /dev/null and b/mods/mesecons/mesecons_pistons/doc/piston/preview.png differ diff --git a/mods/mesecons/mesecons_pistons/doc/piston/recipe.png b/mods/mesecons/mesecons_pistons/doc/piston/recipe.png new file mode 100644 index 00000000..1b0f4a45 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/doc/piston/recipe.png differ diff --git a/mods/mesecons/mesecons_pistons/doc/piston_sticky/description.html b/mods/mesecons/mesecons_pistons/doc/piston_sticky/description.html new file mode 100644 index 00000000..580b76f6 --- /dev/null +++ b/mods/mesecons/mesecons_pistons/doc/piston_sticky/description.html @@ -0,0 +1,4 @@ +Sticky pistons are effectors, they push up to 20 blocks in front of them. The push direction can be set by placing them from different angles. Sticky ones also pull 1 block. +A sticky piston pointing into an unloaded block won't extend. +A sticky piston retracting from within an unloaded block works and pulls a node, but if it doesn't pull anything, then gravity-sensitive nodes above the empty space may not fall. +An extended sticky piston that touches the surface of an unloaded block and loses signal retracts but doesn't pull anything. diff --git a/mods/mesecons/mesecons_pistons/doc/piston_sticky/preview.png b/mods/mesecons/mesecons_pistons/doc/piston_sticky/preview.png new file mode 100644 index 00000000..2c1911bb Binary files /dev/null and b/mods/mesecons/mesecons_pistons/doc/piston_sticky/preview.png differ diff --git a/mods/mesecons/mesecons_pistons/doc/piston_sticky/recipe.png b/mods/mesecons/mesecons_pistons/doc/piston_sticky/recipe.png new file mode 100644 index 00000000..a38e8bee Binary files /dev/null and b/mods/mesecons/mesecons_pistons/doc/piston_sticky/recipe.png differ diff --git a/mods/mesecons/mesecons_pistons/init.lua b/mods/mesecons/mesecons_pistons/init.lua new file mode 100644 index 00000000..274258ee --- /dev/null +++ b/mods/mesecons/mesecons_pistons/init.lua @@ -0,0 +1,484 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local specs = { + normal = { + offname = "mesecons_pistons:piston_normal_off", + onname = "mesecons_pistons:piston_normal_on", + pusher = "mesecons_pistons:piston_pusher_normal", + }, + sticky = { + offname = "mesecons_pistons:piston_sticky_off", + onname = "mesecons_pistons:piston_sticky_on", + pusher = "mesecons_pistons:piston_pusher_sticky", + sticky = true, + }, +} + +local function get_pistonspec_name(name, part) + if part then + for spec_name, spec in pairs(specs) do + if name == spec[part] then + return spec_name, part + end + end + return + end + for spec_name, spec in pairs(specs) do + for part, value in pairs(spec) do + if name == value then + return spec_name, part + end + end + end +end + +local function get_pistonspec(name, part) + return specs[get_pistonspec_name(name, part)] +end + +local max_push = mesecon.setting("piston_max_push", 15) +local max_pull = mesecon.setting("piston_max_pull", 15) + +-- Get mesecon rules of pistons +local function piston_get_rules(node) + local dir = minetest.facedir_to_dir(node.param2) + for k, v in pairs(dir) do + if v ~= 0 then + dir = {k, -v} + break + end + end + local rules = table.copy(mesecon.rules.default) + for i, rule in ipairs(rules) do + if rule[dir[1]] == dir[2] then + table.remove(rules, i) + end + end + return rules +end + +local function piston_remove_pusher(pos, node, check_falling) + local pistonspec = get_pistonspec(node.name, "onname") + local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + local pusherpos = vector.add(pos, dir) + local pushername = minetest.get_node(pusherpos).name + + -- make sure there actually is a pusher (for compatibility reasons mainly) + if pushername ~= pistonspec.pusher then + return + end + + minetest.remove_node(pusherpos) + minetest.sound_play("piston_retract", { pos = pos, max_hear_distance = 20, gain = 0.3 }, true) + + if check_falling then + minetest.check_for_falling(pusherpos) + end +end + +local function piston_after_dig(pos, node) + piston_remove_pusher(pos, node, true) +end + +local piston_on = function(pos, node) + local pistonspec = get_pistonspec(node.name, "offname") + local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + local pusher_pos = vector.add(pos, dir) + local meta = minetest.get_meta(pos) + local success, stack, oldstack = mesecon.mvps_push(pusher_pos, dir, max_push, meta:get_string("owner")) + if not success then + if stack == "protected" then + meta:set_string("infotext", "Can't extend: protected area on the way") + end + return + end + minetest.swap_node(pos, {param2 = node.param2, name = pistonspec.onname}) + minetest.set_node(pusher_pos, {param2 = node.param2, name = pistonspec.pusher}) + minetest.sound_play("piston_extend", { pos = pos, max_hear_distance = 20, gain = 0.3 }, true) + mesecon.mvps_move_objects(pusher_pos, dir, oldstack) +end + +local function piston_off(pos, node) + local pistonspec = get_pistonspec(node.name, "onname") + minetest.swap_node(pos, {param2 = node.param2, name = pistonspec.offname}) + piston_remove_pusher(pos, node, not pistonspec.sticky) -- allow that even in protected area + + if not pistonspec.sticky then + return + end + local dir = minetest.facedir_to_dir(node.param2) + local pullpos = vector.add(pos, vector.multiply(dir, -2)) + local meta = minetest.get_meta(pos) + local success, _, oldstack = mesecon.mvps_pull_single(pullpos, dir, max_pull, meta:get_string("owner")) + if success then + mesecon.mvps_move_objects(pullpos, vector.multiply(dir, -1), oldstack, -1) + end +end + +local orientations = { + [0] = { 4, 8}, + {13, 17}, + {10, 6}, + {20, 15}, +} + +local function piston_orientate(pos, placer) + mesecon.mvps_set_owner(pos, placer) + if not placer then + return + end + local pitch = math.deg(placer:get_look_vertical()) + local node = minetest.get_node(pos) + if pitch > 55 then + node.param2 = orientations[node.param2][1] + elseif pitch < -55 then + node.param2 = orientations[node.param2][2] + else + return + end + minetest.swap_node(pos, node) + -- minetest.after, because on_placenode for unoriented piston must be processed first + minetest.after(0, mesecon.on_placenode, pos, node) +end + +local rotations = { + {0, 16, 20, 12}, + {2, 14, 22, 18}, + {1, 5, 23, 9}, + {3, 11, 21, 7}, + {4, 13, 10, 19}, + {6, 15, 8, 17}, +} + +local function get_rotation(param2) + for a = 1, #rotations do + for f = 1, #rotations[a] do + if rotations[a][f] == param2 then + return a, f + end + end + end +end + +local function rotate(param2, mode) + local axis, face = get_rotation(param2) + if mode == screwdriver.ROTATE_FACE then + face = face + 1 + if face > 4 then + face = 1 + end + elseif mode == screwdriver.ROTATE_AXIS then + axis = axis + 1 + if axis > 6 then + axis = 1 + end + face = 1 + else + return param2 + end + return rotations[axis][face] +end + +local function piston_rotate(pos, node, _, mode) + node.param2 = rotate(node.param2, mode) + minetest.swap_node(pos, node) + mesecon.execute_autoconnect_hooks_now(pos, node) + return true +end + +local function piston_rotate_on(pos, node, player, mode) + local pistonspec = get_pistonspec(node.name, "onname") + local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + local pusher_pos = vector.add(dir, pos) + local pusher_node = minetest.get_node(pusher_pos) + if pusher_node.name ~= pistonspec.pusher then + return piston_rotate(pos, node, nil, mode) + end + if mode == screwdriver.ROTATE_FACE then + piston_rotate(pusher_pos, pusher_node, nil, mode) + return piston_rotate(pos, node, nil, mode) + elseif mode ~= screwdriver.ROTATE_AXIS then + return false + end + local player_name = player and player:is_player() and player:get_player_name() or "" + local ok, dir_after, pusher_pos_after + for i = 1, 5 do + node.param2 = rotate(node.param2, mode) + dir_after = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + pusher_pos_after = vector.add(dir_after, pos) + local pusher_pos_after_node_name = minetest.get_node(pusher_pos_after).name + local pusher_pos_after_node_def = minetest.registered_nodes[pusher_pos_after_node_name] + if pusher_pos_after_node_def and pusher_pos_after_node_def.buildable_to and + not minetest.is_protected(pusher_pos_after, player_name) then + ok = true + break + end + end + if not ok then + return false + end + pusher_node.param2 = node.param2 + minetest.remove_node(pusher_pos) + minetest.set_node(pusher_pos_after, pusher_node) + minetest.swap_node(pos, node) + mesecon.execute_autoconnect_hooks_now(pos, node) + return true +end + +local function piston_rotate_pusher(pos, node, player, mode) + local pistonspec = get_pistonspec(node.name, "pusher") + local piston_pos = vector.add(pos, minetest.facedir_to_dir(node.param2)) + local piston_node = minetest.get_node(piston_pos) + if piston_node.name ~= pistonspec.onname then + minetest.remove_node(pos) -- Make it possible to remove alone pushers. + return false + end + return piston_rotate_on(piston_pos, piston_node, player, mode) +end + +local function piston_punch(pos, _, player) + local player_name = player and player.get_player_name and player:get_player_name() + if mesecon.mvps_claim(pos, player_name) then + minetest.chat_send_player(player_name, "Reclaimed piston") + end +end + + +-- Boxes: + +local pt = 3/16 -- pusher thickness + +local piston_pusher_box = { + type = "fixed", + fixed = { + {-2/16, -2/16, -.5 + pt, 2/16, 2/16, .5 + pt}, + {-.5 , -.5 , -.5 , .5 , .5 , -.5 + pt}, + }, +} + +local piston_on_box = { + type = "fixed", + fixed = { + {-.5, -.5, -.5 + pt, .5, .5, .5} + }, +} + + +-- Normal (non-sticky) Pistons: +-- offstate +minetest.register_node("mesecons_pistons:piston_normal_off", { + description = S("Piston"), + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_top.png^[transform2", + "mesecons_piston_top.png^[transform3", + "mesecons_piston_top.png^[transform1", + "mesecons_piston_back.png", + "mesecons_piston_pusher_front.png" + }, + groups = {cracky = 3}, + paramtype2 = "facedir", + is_ground_content = false, + after_place_node = piston_orientate, + sounds = mesecon.node_sound.wood, + mesecons = {effector={ + action_on = piston_on, + rules = piston_get_rules, + }}, + on_punch = piston_punch, + on_rotate = piston_rotate, + on_blast = mesecon.on_blastnode, +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_normal_on", { + description = S("Activated Piston Base"), + drawtype = "nodebox", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_top.png^[transform2", + "mesecons_piston_top.png^[transform3", + "mesecons_piston_top.png^[transform1", + "mesecons_piston_back.png", + "mesecons_piston_on_front.png" + }, + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = "mesecons_pistons:piston_normal_off", + after_dig_node = piston_after_dig, + node_box = piston_on_box, + selection_box = piston_on_box, + sounds = mesecon.node_sound.wood, + mesecons = {effector={ + action_off = piston_off, + rules = piston_get_rules, + }}, + on_rotate = piston_rotate_on, + on_blast = mesecon.on_blastnode, +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_pusher_normal", { + description = S("Piston Pusher"), + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_top.png", + "mesecons_piston_pusher_top.png^[transform2", + "mesecons_piston_pusher_top.png^[transform3", + "mesecons_piston_pusher_top.png^[transform1", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front.png" + }, + groups = {not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + diggable = false, + selection_box = piston_pusher_box, + node_box = piston_pusher_box, + on_rotate = piston_rotate_pusher, + drop = "", + sounds = mesecon.node_sound.wood, +}) + +-- Sticky ones +-- offstate +minetest.register_node("mesecons_pistons:piston_sticky_off", { + description = S("Sticky Piston"), + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_top.png^[transform2", + "mesecons_piston_top.png^[transform3", + "mesecons_piston_top.png^[transform1", + "mesecons_piston_back.png", + "mesecons_piston_pusher_front_sticky.png" + }, + groups = {cracky = 3}, + paramtype2 = "facedir", + is_ground_content = false, + after_place_node = piston_orientate, + sounds = mesecon.node_sound.wood, + mesecons = {effector={ + action_on = piston_on, + rules = piston_get_rules, + }}, + on_punch = piston_punch, + on_rotate = piston_rotate, + on_blast = mesecon.on_blastnode, +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_sticky_on", { + description = S("Activated Sticky Piston Base"), + drawtype = "nodebox", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_top.png^[transform2", + "mesecons_piston_top.png^[transform3", + "mesecons_piston_top.png^[transform1", + "mesecons_piston_back.png", + "mesecons_piston_on_front.png" + }, + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = "mesecons_pistons:piston_sticky_off", + after_dig_node = piston_after_dig, + node_box = piston_on_box, + selection_box = piston_on_box, + sounds = mesecon.node_sound.wood, + mesecons = {effector={ + action_off = piston_off, + rules = piston_get_rules, + }}, + on_rotate = piston_rotate_on, + on_blast = mesecon.on_blastnode, +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_pusher_sticky", { + description = S("Sticky Piston Pusher"), + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_top.png", + "mesecons_piston_pusher_top.png^[transform2", + "mesecons_piston_pusher_top.png^[transform3", + "mesecons_piston_pusher_top.png^[transform1", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front_sticky.png" + }, + groups = {not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + diggable = false, + selection_box = piston_pusher_box, + node_box = piston_pusher_box, + on_rotate = piston_rotate_pusher, + drop = "", + sounds = mesecon.node_sound.wood, +}) + + +-- Register pushers as stoppers if they would be seperated from the piston +local function piston_pusher_get_stopper(node, _, stack, stackid) + if (stack[stackid + 1] + and stack[stackid + 1].node.name == get_pistonspec(node.name, "pusher").onname + and stack[stackid + 1].node.param2 == node.param2) + or (stack[stackid - 1] + and stack[stackid - 1].node.name == get_pistonspec(node.name, "pusher").onname + and stack[stackid - 1].node.param2 == node.param2) then + return false + end + return true +end + +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) + + +-- Register pistons as stoppers if they would be seperated from the stopper +local function piston_get_stopper(node, _, stack, stackid) + local pistonspec = get_pistonspec(node.name, "onname") + local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + local pusherpos = vector.add(stack[stackid].pos, dir) + local pushernode = minetest.get_node(pusherpos) + if pistonspec.pusher == pushernode.name then + for _, s in ipairs(stack) do + if vector.equals(s.pos, pusherpos) -- pusher is also to be pushed + and s.node.param2 == node.param2 then + return false + end + end + end + return true +end + +mesecon.register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) + + +--craft recipes +minetest.register_craft({ + output = "mesecons_pistons:piston_normal_off 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble"}, + {"mesecons_gamecompat:cobble", "group:mesecon_conductor_craftable", "mesecons_gamecompat:cobble"}, + } +}) + +minetest.register_craft({ + output = "mesecons_pistons:piston_sticky_off", + recipe = { + {"mesecons_materials:glue"}, + {"mesecons_pistons:piston_normal_off"}, + } +}) + + +-- load legacy code +dofile(minetest.get_modpath("mesecons_pistons").."/legacy.lua") diff --git a/mods/mesecons/mesecons_pistons/legacy.lua b/mods/mesecons/mesecons_pistons/legacy.lua new file mode 100644 index 00000000..0c6dcb33 --- /dev/null +++ b/mods/mesecons/mesecons_pistons/legacy.lua @@ -0,0 +1,48 @@ +local ground_dir = { + [0] = {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, +} + +minetest.register_lbm({ + label = "Upgrade legacy pistons pointing up", + name = "mesecons_pistons:replace_legacy_piston_up", + nodenames = { + "mesecons_pistons:piston_up_normal_off", + "mesecons_pistons:piston_up_normal_on", + "mesecons_pistons:piston_up_pusher_normal", + "mesecons_pistons:piston_up_sticky_off", + "mesecons_pistons:piston_up_sticky_on", + "mesecons_pistons:piston_up_pusher_sticky", + }, + run_at_every_load = false, + action = function(pos, node) + local dir = ground_dir[math.floor(node.param2/4)] + node.param2 = minetest.dir_to_facedir(dir, true) + node.name = node.name:sub(1, 24)..node.name:sub(28) + minetest.swap_node(pos, node) + end, +}) + +minetest.register_lbm({ + label = "Upgrade legacy pistons pointing down", + name = "mesecons_pistons:replace_legacy_piston_down", + nodenames = { + "mesecons_pistons:piston_down_normal_off", + "mesecons_pistons:piston_down_normal_on", + "mesecons_pistons:piston_down_pusher_normal", + "mesecons_pistons:piston_down_sticky_off", + "mesecons_pistons:piston_down_sticky_on", + "mesecons_pistons:piston_down_pusher_sticky", + }, + run_at_every_load = false, + action = function(pos, node) + local dir = vector.multiply(ground_dir[math.floor(node.param2/4)], -1) + node.param2 = minetest.dir_to_facedir(dir, true) + node.name = node.name:sub(1, 24)..node.name:sub(30) + minetest.swap_node(pos, node) + end, +}) diff --git a/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.de.tr b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.de.tr new file mode 100644 index 00000000..b85dd92e --- /dev/null +++ b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.de.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_pistons +Piston=Kolben +Activated Piston Base=Aktivierter Kolbenkörper +Piston Pusher=Kolbenschieber +Sticky Piston=Haftender Kolben +Activated Sticky Piston Base=Aktivierter haftender Kolbenkörper +Sticky Piston Pusher=Haftender Kolbenschieber diff --git a/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.eo.tr b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.eo.tr new file mode 100644 index 00000000..0eba1cc2 --- /dev/null +++ b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.eo.tr @@ -0,0 +1,9 @@ +# textdomain: mesecons_pistons + +### init.lua ### +Piston=Piŝto +Activated Piston Base=Aktivigita Piŝta Bazo +Piston Pusher=Piŝta Pushero +Sticky Piston=Glueca Piŝto +Activated Sticky Piston Base=Aktivigita Glueca Piŝta Bazo +Sticky Piston Pusher=Glueca Piŝta Puŝilo diff --git a/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.fr.tr b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.fr.tr new file mode 100644 index 00000000..5be2ea32 --- /dev/null +++ b/mods/mesecons/mesecons_pistons/locale/mesecons_pistons.fr.tr @@ -0,0 +1,9 @@ +# textdomain: mesecons_pistons + +### init.lua ### +Piston=Piston +Activated Piston Base=Base de piston activé +Piston Pusher=Bras de piston +Sticky Piston=Piston collant +Activated Sticky Piston Base=Base de piston collant activé +Sticky Piston Pusher=Bras de piston collant diff --git a/mods/mesecons/mesecons_pistons/locale/template.txt b/mods/mesecons/mesecons_pistons/locale/template.txt new file mode 100644 index 00000000..05bed8ad --- /dev/null +++ b/mods/mesecons/mesecons_pistons/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mesecons_pistons + +### init.lua ### +Piston= +Activated Piston Base= +Piston Pusher= +Sticky Piston= +Activated Sticky Piston Base= +Sticky Piston Pusher= diff --git a/mods/mesecons/mesecons_pistons/mod.conf b/mods/mesecons/mesecons_pistons/mod.conf new file mode 100644 index 00000000..30a73a38 --- /dev/null +++ b/mods/mesecons/mesecons_pistons/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_pistons +depends = mesecons, mesecons_gamecompat, mesecons_mvps diff --git a/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg b/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg new file mode 100644 index 00000000..e234ad94 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg differ diff --git a/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg b/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg new file mode 100644 index 00000000..feb9f044 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png new file mode 100644 index 00000000..2dde41b0 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png new file mode 100644 index 00000000..f7b0f0ca Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png new file mode 100644 index 00000000..713cd9d3 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png new file mode 100644 index 00000000..3a09947b Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png new file mode 100644 index 00000000..686e7857 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png new file mode 100644 index 00000000..032215be Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png new file mode 100644 index 00000000..5b35a96e Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png differ diff --git a/mods/mesecons/mesecons_powerplant/doc/powerplant/description.html b/mods/mesecons/mesecons_powerplant/doc/powerplant/description.html new file mode 100644 index 00000000..22be4967 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/doc/powerplant/description.html @@ -0,0 +1,2 @@ +A power plant is a receptor that is always turned on: it provides energy. +It continues to work in an unloaded block. diff --git a/mods/mesecons/mesecons_powerplant/doc/powerplant/preview.png b/mods/mesecons/mesecons_powerplant/doc/powerplant/preview.png new file mode 100644 index 00000000..d64010fe Binary files /dev/null and b/mods/mesecons/mesecons_powerplant/doc/powerplant/preview.png differ diff --git a/mods/mesecons/mesecons_powerplant/doc/powerplant/recipe.png b/mods/mesecons/mesecons_powerplant/doc/powerplant/recipe.png new file mode 100644 index 00000000..94cf08bd Binary files /dev/null and b/mods/mesecons/mesecons_powerplant/doc/powerplant/recipe.png differ diff --git a/mods/mesecons/mesecons_powerplant/init.lua b/mods/mesecons/mesecons_powerplant/init.lua new file mode 100644 index 00000000..28f21b59 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/init.lua @@ -0,0 +1,35 @@ +-- The POWER_PLANT +-- Just emits power. always. + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("mesecons_powerplant:power_plant", { + drawtype = "plantlike", + visual_scale = 1, + tiles = {"jeija_power_plant.png"}, + inventory_image = "jeija_power_plant.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + groups = {dig_immediate=3, mesecon = 2}, + light_source = minetest.LIGHT_MAX-9, + description=S("Power Plant"), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, + }, + sounds = mesecon.node_sound.leaves, + mesecons = {receptor = { + state = mesecon.state.on + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = "mesecons_powerplant:power_plant 1", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"group:mesecon_conductor_craftable"}, + {"group:sapling"}, + } +}) diff --git a/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.de.tr b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.de.tr new file mode 100644 index 00000000..8417c6a9 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_powerplant +Power Plant=Energiepflanze diff --git a/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.eo.tr b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.eo.tr new file mode 100644 index 00000000..8e539c22 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_powerplant + +### init.lua ### +Power Plant=Elektra Planto diff --git a/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.fr.tr b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.fr.tr new file mode 100644 index 00000000..5098d632 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_powerplant + +### init.lua ### +Power Plant=Centrale à signal actif \ No newline at end of file diff --git a/mods/mesecons/mesecons_powerplant/locale/template.txt b/mods/mesecons/mesecons_powerplant/locale/template.txt new file mode 100644 index 00000000..71eceaf7 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_powerplant + +### init.lua ### +Power Plant= diff --git a/mods/mesecons/mesecons_powerplant/mod.conf b/mods/mesecons/mesecons_powerplant/mod.conf new file mode 100644 index 00000000..26c580be --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_powerplant +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png b/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png new file mode 100644 index 00000000..5655c6aa Binary files /dev/null and b/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png differ diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/description.html b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/description.html new file mode 100644 index 00000000..35e3fc03 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/description.html @@ -0,0 +1 @@ +This receptor turns on if there's an object above it. An object can be a player, an item, a mob... diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/preview.png b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/preview.png new file mode 100644 index 00000000..d95a0ce8 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/preview.png differ diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/recipe.png b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/recipe.png new file mode 100644 index 00000000..541d698a Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/recipe.png differ diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/description.html b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/description.html new file mode 100644 index 00000000..35e3fc03 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/description.html @@ -0,0 +1 @@ +This receptor turns on if there's an object above it. An object can be a player, an item, a mob... diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/preview.png b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/preview.png new file mode 100644 index 00000000..4fe3d9cf Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/preview.png differ diff --git a/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/recipe.png b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/recipe.png new file mode 100644 index 00000000..923e8d85 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/recipe.png differ diff --git a/mods/mesecons/mesecons_pressureplates/init.lua b/mods/mesecons/mesecons_pressureplates/init.lua new file mode 100644 index 00000000..cc4b10ca --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/init.lua @@ -0,0 +1,155 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local pp_box_off = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, +} + +local pp_box_on = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 }, +} + +local function obj_touching_plate_pos(obj_ref, plate_pos) + local obj_pos = obj_ref:get_pos() + local props = obj_ref:get_properties() + if not (props and obj_pos and not obj_ref:get_attach()) then + return false + end + + local collisionbox = props.collisionbox + local physical = props.physical + local is_player = obj_ref:is_player() + local luaentity = obj_ref:get_luaentity() + local is_item = luaentity and luaentity.name == "__builtin:item" + if not (collisionbox and physical or is_player or is_item) then + return false + end + + local plate_x_min = plate_pos.x - 7 / 16 + local plate_x_max = plate_pos.x + 7 / 16 + local plate_z_min = plate_pos.z - 7 / 16 + local plate_z_max = plate_pos.z + 7 / 16 + local plate_y_min = plate_pos.y - 8 / 16 + local plate_y_max = plate_pos.y - 6.5 / 16 + + local obj_x_min = obj_pos.x + collisionbox[1] + local obj_x_max = obj_pos.x + collisionbox[4] + local obj_z_min = obj_pos.z + collisionbox[3] + local obj_z_max = obj_pos.z + collisionbox[6] + local obj_y_min = obj_pos.y + collisionbox[2] + local obj_y_max = obj_pos.y + collisionbox[5] + + if + obj_y_min < plate_y_max and + obj_y_max > plate_y_min and + obj_x_min < plate_x_max and + obj_x_max > plate_x_min and + obj_z_min < plate_z_max and + obj_z_max > plate_z_min + then + return true + end + return false +end + +local function pp_on_timer(pos) + local node = minetest.get_node(pos) + local basename = minetest.registered_nodes[node.name].pressureplate_basename + + -- This is a workaround for a strange bug that occurs when the server is started + -- For some reason the first time on_timer is called, the pos is wrong + if not basename then return end + + local objs = minetest.get_objects_inside_radius(pos, 1) + local obj_touching = false + for k, obj in pairs(objs) do + if obj_touching_plate_pos(obj, pos) then + obj_touching = true + break + end + end + + if not obj_touching and node.name == basename .. "_on" then + minetest.set_node(pos, {name = basename .. "_off"}) + mesecon.receptor_off(pos, mesecon.rules.pplate) + elseif obj_touching and node.name == basename .. "_off" then + minetest.set_node(pos, {name = basename .. "_on"}) + mesecon.receptor_on(pos, mesecon.rules.pplate ) + end + return true +end + +-- Register a Pressure Plate +-- offstate: name of the pressure plate when inactive +-- onstate: name of the pressure plate when active +-- description: description displayed in the player's inventory +-- tiles_off: textures of the pressure plate when inactive +-- tiles_on: textures of the pressure plate when active +-- image: inventory and wield image of the pressure plate +-- recipe: crafting recipe of the pressure plate +-- groups: groups +-- sounds: sound table + +function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, groups, sounds) + if not groups then + groups = {} + end + local groups_off = table.copy(groups) + local groups_on = table.copy(groups) + groups_on.not_in_creative_inventory = 1 + + mesecon.register_node(basename, { + drawtype = "nodebox", + inventory_image = image_i, + wield_image = image_w, + paramtype = "light", + is_ground_content = false, + description = description, + pressureplate_basename = basename, + on_timer = pp_on_timer, + on_construct = function(pos) + minetest.get_node_timer(pos):start(mesecon.setting("pplate_interval", 0.1)) + end, + sounds = sounds, + },{ + mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }}, + node_box = pp_box_off, + selection_box = pp_box_off, + groups = groups_off, + tiles = textures_off + },{ + mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }}, + node_box = pp_box_on, + selection_box = pp_box_on, + groups = groups_on, + tiles = textures_on + }) + + minetest.register_craft({ + output = basename .. "_off", + recipe = recipe, + }) +end + +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_wood", + S("Wooden Pressure Plate"), + {"jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off_edges.png"}, + {"jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on_edges.png"}, + "jeija_pressure_plate_wood_wield.png", + "jeija_pressure_plate_wood_inv.png", + {{"group:wood", "group:wood"}}, + { choppy = 3, oddly_breakable_by_hand = 3 }, + mesecon.node_sound.wood) + +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_stone", + S("Stone Pressure Plate"), + {"jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off_edges.png"}, + {"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"}, + "jeija_pressure_plate_stone_wield.png", + "jeija_pressure_plate_stone_inv.png", + {{"mesecons_gamecompat:cobble", "mesecons_gamecompat:cobble"}}, + { cracky = 3, oddly_breakable_by_hand = 3 }, + mesecon.node_sound.stone) diff --git a/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr new file mode 100644 index 00000000..fd546136 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_pressureplates +Wooden Pressure Plate=Holzdruckplatte +Stone Pressure Plate=Steindruckplatte diff --git a/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.eo.tr b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.eo.tr new file mode 100644 index 00000000..8af30a03 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.eo.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_pressureplates + +### init.lua ### +Wooden Pressure Plate=Ligna Prema Plato +Stone Pressure Plate=Ŝtona Prema Plato diff --git a/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr new file mode 100644 index 00000000..23d0c5b6 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_pressureplates + +### init.lua ### +Wooden Pressure Plate=Plaque de pression en bois +Stone Pressure Plate=Plaque de pression en pierre diff --git a/mods/mesecons/mesecons_pressureplates/locale/template.txt b/mods/mesecons/mesecons_pressureplates/locale/template.txt new file mode 100644 index 00000000..22413441 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_pressureplates + +### init.lua ### +Wooden Pressure Plate= +Stone Pressure Plate= diff --git a/mods/mesecons/mesecons_pressureplates/mod.conf b/mods/mesecons/mesecons_pressureplates/mod.conf new file mode 100644 index 00000000..cebd8a68 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_pressureplates +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png new file mode 100644 index 00000000..5f35c843 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png new file mode 100644 index 00000000..544b1aa8 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png new file mode 100644 index 00000000..ad13f5b1 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png new file mode 100644 index 00000000..434b3d83 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png new file mode 100644 index 00000000..818c966c Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png new file mode 100644 index 00000000..5f35c843 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png new file mode 100644 index 00000000..5e8109af Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png new file mode 100644 index 00000000..c9ba34f3 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png new file mode 100644 index 00000000..8b101739 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png new file mode 100644 index 00000000..9ae7cc6d Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png new file mode 100644 index 00000000..97cd30ed Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png new file mode 100644 index 00000000..5e8109af Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png differ diff --git a/mods/mesecons/mesecons_random/doc/ghoststone/description.html b/mods/mesecons/mesecons_random/doc/ghoststone/description.html new file mode 100644 index 00000000..d54ef636 --- /dev/null +++ b/mods/mesecons/mesecons_random/doc/ghoststone/description.html @@ -0,0 +1,2 @@ +Ghoststones disappear when powered, just like Removestones. But in contrast to Removestones, they reappear again when not powered anymore and they are also conductive. +They work in inactive blocks. diff --git a/mods/mesecons/mesecons_random/doc/ghoststone/preview.png b/mods/mesecons/mesecons_random/doc/ghoststone/preview.png new file mode 100644 index 00000000..f3d12574 Binary files /dev/null and b/mods/mesecons/mesecons_random/doc/ghoststone/preview.png differ diff --git a/mods/mesecons/mesecons_random/doc/ghoststone/recipe.png b/mods/mesecons/mesecons_random/doc/ghoststone/recipe.png new file mode 100644 index 00000000..d1ee2013 Binary files /dev/null and b/mods/mesecons/mesecons_random/doc/ghoststone/recipe.png differ diff --git a/mods/mesecons/mesecons_random/doc/removestone/description.html b/mods/mesecons/mesecons_random/doc/removestone/description.html new file mode 100644 index 00000000..ccd3c140 --- /dev/null +++ b/mods/mesecons/mesecons_random/doc/removestone/description.html @@ -0,0 +1,2 @@ +Removestones are probably the simplest effectors possible. They simply disappear when powered. +They work in inactive blocks. diff --git a/mods/mesecons/mesecons_random/doc/removestone/preview.png b/mods/mesecons/mesecons_random/doc/removestone/preview.png new file mode 100644 index 00000000..2941db84 Binary files /dev/null and b/mods/mesecons/mesecons_random/doc/removestone/preview.png differ diff --git a/mods/mesecons/mesecons_random/doc/removestone/recipe.png b/mods/mesecons/mesecons_random/doc/removestone/recipe.png new file mode 100644 index 00000000..ed9dfe4a Binary files /dev/null and b/mods/mesecons/mesecons_random/doc/removestone/recipe.png differ diff --git a/mods/mesecons/mesecons_random/init.lua b/mods/mesecons/mesecons_random/init.lua new file mode 100644 index 00000000..5342fb3b --- /dev/null +++ b/mods/mesecons/mesecons_random/init.lua @@ -0,0 +1,80 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- REMOVESTONE + +minetest.register_node("mesecons_random:removestone", { + tiles = {"jeija_removestone.png"}, + is_ground_content = false, + inventory_image = minetest.inventorycube("jeija_removestone_inv.png"), + groups = {cracky=3}, + description = S("Removestone"), + sounds = mesecon.node_sound.stone, + mesecons = {effector = { + action_on = function (pos, node) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) + minetest.check_for_falling(vector.add(pos, vector.new(0, 1, 0))) + end + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_craft({ + output = 'mesecons_random:removestone 4', + recipe = { + {"", "mesecons_gamecompat:cobble", ""}, + {"mesecons_gamecompat:cobble", "group:mesecon_conductor_craftable", "mesecons_gamecompat:cobble"}, + {"", "mesecons_gamecompat:cobble", ""}, + } +}) + +-- GHOSTSTONE + +minetest.register_node("mesecons_random:ghoststone", { + description = S("Ghoststone"), + tiles = {"jeija_ghoststone.png"}, + is_ground_content = false, + inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"), + groups = {cracky=3}, + sounds = mesecon.node_sound.stone, + mesecons = {conductor = { + state = mesecon.state.off, + rules = mesecon.rules.alldirs, + onstate = "mesecons_random:ghoststone_active" + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_random:ghoststone_active", { + drawtype = "airlike", + pointable = false, + walkable = false, + diggable = false, + is_ground_content = false, + sunlight_propagates = true, + paramtype = "light", + drop = "mesecons_random:ghoststone", + mesecons = {conductor = { + state = mesecon.state.on, + rules = mesecon.rules.alldirs, + offstate = "mesecons_random:ghoststone" + }}, + on_construct = function(pos) + -- remove shadow + local shadowpos = vector.add(pos, vector.new(0, 1, 0)) + if (minetest.get_node(shadowpos).name == "air") then + minetest.dig_node(shadowpos) + end + end, + on_blast = mesecon.on_blastnode, +}) + + +minetest.register_craft({ + output = 'mesecons_random:ghoststone 4', + recipe = { + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot"}, + {"mesecons_gamecompat:cobble", "group:mesecon_conductor_craftable", "mesecons_gamecompat:cobble"}, + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot"}, + } +}) diff --git a/mods/mesecons/mesecons_random/locale/mesecons_random.de.tr b/mods/mesecons/mesecons_random/locale/mesecons_random.de.tr new file mode 100644 index 00000000..074b9e86 --- /dev/null +++ b/mods/mesecons/mesecons_random/locale/mesecons_random.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_random +Removestone=Verschwindestein +Ghoststone=Geisterstein diff --git a/mods/mesecons/mesecons_random/locale/mesecons_random.eo.tr b/mods/mesecons/mesecons_random/locale/mesecons_random.eo.tr new file mode 100644 index 00000000..ceca5401 --- /dev/null +++ b/mods/mesecons/mesecons_random/locale/mesecons_random.eo.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_random + +### init.lua ### +Removestone=Forigŝtono +Ghoststone=Fantomŝtono diff --git a/mods/mesecons/mesecons_random/locale/mesecons_random.fr.tr b/mods/mesecons/mesecons_random/locale/mesecons_random.fr.tr new file mode 100644 index 00000000..15bdb0ce --- /dev/null +++ b/mods/mesecons/mesecons_random/locale/mesecons_random.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_random + +### init.lua ### +Removestone=Pierre de suppression +Ghoststone=Pierre fantôme diff --git a/mods/mesecons/mesecons_random/locale/template.txt b/mods/mesecons/mesecons_random/locale/template.txt new file mode 100644 index 00000000..55a69e8d --- /dev/null +++ b/mods/mesecons/mesecons_random/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_random + +### init.lua ### +Removestone= +Ghoststone= diff --git a/mods/mesecons/mesecons_random/mod.conf b/mods/mesecons/mesecons_random/mod.conf new file mode 100644 index 00000000..af40fbb7 --- /dev/null +++ b/mods/mesecons/mesecons_random/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_random +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png b/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png new file mode 100644 index 00000000..1f36a41b Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png b/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png new file mode 100644 index 00000000..bfe3a84d Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_removestone.png b/mods/mesecons/mesecons_random/textures/jeija_removestone.png new file mode 100644 index 00000000..1f36a41b Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_removestone.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png b/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png new file mode 100644 index 00000000..bfe3a84d Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png differ diff --git a/mods/mesecons/mesecons_receiver/init.lua b/mods/mesecons/mesecons_receiver/init.lua new file mode 100644 index 00000000..8d30b339 --- /dev/null +++ b/mods/mesecons/mesecons_receiver/init.lua @@ -0,0 +1,264 @@ +local rcvboxes = { + { -3/16, -3/16, -8/16 , 3/16, 3/16 , -13/32 }, -- the smaller bump + { -1/32, -1/32, -3/2 , 1/32, 1/32 , -1/2 }, -- the wire through the block + { -2/32, -1/2 , -.5 , 2/32, 0 , -.5002+3/32 }, -- the vertical wire bit + { -2/32, -1/2 , -7/16+0.002 , 2/32, -14/32, 16/32+0.001 } -- the horizontal wire +} + +local down_rcvboxes = { + {-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate + {-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump + {-1/16, -8/16, -1/16, 1/16, -24/16, 1/16}, -- Wire through the block + {-1/16, -8/16, 6/16, 1/16, -7/16, 8/16}, -- Plate extension (North) + {-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) + {-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) + {6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East) +} + +local up_rcvboxes = { + {-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate + {-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump + {-1/16, -6/16, -1/16, 1/16, 24/16, 1/16}, -- Wire through the block + {-1/16, -8/16, 6/16, 1/16, -7/16, 8/16}, -- Plate extension (North) + {-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) + {-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) + {6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East) +} + +local receiver_get_rules = mesecon.horiz_rules_getter({ + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -2}, +}) + +mesecon.register_node("mesecons_receiver:receiver", { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + on_rotate = false, + selection_box = { + type = "fixed", + fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", + sounds = mesecon.node_sound.default, +}, { + tiles = { + "receiver_top_off.png", + "receiver_bottom_off.png", + "receiver_lr_off.png", + "receiver_lr_off.png", + "receiver_fb_off.png", + "receiver_fb_off.png", + }, + mesecons = {conductor = { + state = mesecon.state.off, + rules = receiver_get_rules, + onstate = "mesecons_receiver:receiver_on" + }} +}, { + tiles = { + "receiver_top_on.png", + "receiver_bottom_on.png", + "receiver_lr_on.png", + "receiver_lr_on.png", + "receiver_fb_on.png", + "receiver_fb_on.png", + }, + mesecons = {conductor = { + state = mesecon.state.on, + rules = receiver_get_rules, + offstate = "mesecons_receiver:receiver_off" + }} +}) + +mesecon.register_node("mesecons_receiver:receiver_up", { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + on_rotate = false, + selection_box = { + type = "fixed", + fixed = up_rcvboxes + }, + node_box = { + type = "fixed", + fixed = up_rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", + sounds = mesecon.node_sound.default, +}, { + tiles = {"mesecons_wire_off.png"}, + mesecons = {conductor = { + state = mesecon.state.off, + rules = {{x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=1, z=0}, + {x=0, y=2, z=0}}, + onstate = "mesecons_receiver:receiver_up_on" + }} +}, { + tiles = {"mesecons_wire_on.png"}, + mesecons = {conductor = { + state = mesecon.state.on, + rules = {{x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=1, z=0}, + {x=0, y=2, z=0}}, + offstate = "mesecons_receiver:receiver_up_off" + }} +}) + +mesecon.register_node("mesecons_receiver:receiver_down", { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + on_rotate = false, + selection_box = { + type = "fixed", + fixed = down_rcvboxes + }, + node_box = { + type = "fixed", + fixed = down_rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", + sounds = mesecon.node_sound.default, +}, { + tiles = {"mesecons_wire_off.png"}, + mesecons = {conductor = { + state = mesecon.state.off, + rules = {{x=1,y=0, z=0}, + {x=-1,y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=-2,z=0}}, + onstate = "mesecons_receiver:receiver_down_on" + }} +}, { + tiles = {"mesecons_wire_on.png"}, + mesecons = {conductor = { + state = mesecon.state.on, + rules = {{x=1,y=0, z=0}, + {x=-1,y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=-2,z=0}}, + offstate = "mesecons_receiver:receiver_down_off" + }} +}) + +function mesecon.receiver_get_pos_from_rcpt(pos, param2) + local rules = {{x = 2, y = 0, z = 0}} + if param2 == nil then param2 = minetest.get_node(pos).param2 end + local rcvtype = "mesecons_receiver:receiver_off" + local dir = minetest.facedir_to_dir(param2) + + if dir.x == 1 then + -- No action needed + elseif dir.z == -1 then + rules = mesecon.rotate_rules_left(rules) + elseif dir.x == -1 then + rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) + elseif dir.z == 1 then + rules = mesecon.rotate_rules_right(rules) + elseif dir.y == -1 then + rules = mesecon.rotate_rules_up(rules) + rcvtype = "mesecons_receiver:receiver_up_off" + elseif dir.y == 1 then + rules = mesecon.rotate_rules_down(rules) + rcvtype = "mesecons_receiver:receiver_down_off" + end + local np = { x = pos.x + rules[1].x, + y = pos.y + rules[1].y, + z = pos.z + rules[1].z} + return np, rcvtype +end + +function mesecon.receiver_place(rcpt_pos) + local node = minetest.get_node(rcpt_pos) + local pos, rcvtype = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2) + local nn = minetest.get_node(pos) + local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2)) + + if string.find(nn.name, "mesecons:wire_") ~= nil then + local rcv_node = {name = rcvtype, param2 = param2} + minetest.set_node(pos, rcv_node) + mesecon.on_dignode(pos, nn) + mesecon.on_placenode(pos, rcv_node) + end +end + +function mesecon.receiver_remove(rcpt_pos, dugnode) + local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2) + local nn = minetest.get_node(pos) + if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then + local node = {name = "mesecons:wire_00000000_off"} + minetest.set_node(pos, node) + mesecon.on_dignode(pos, nn) + mesecon.on_placenode(pos, node) + end +end + +minetest.register_on_placenode(function (pos, node) + if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_place(pos) + end +end) + +minetest.register_on_dignode(function(pos, node) + if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_remove(pos, node) + end +end) + +minetest.register_on_placenode(function (pos, node) + if string.find(node.name, "mesecons:wire_") ~= nil then + local rules = { {x = 2, y = 0, z = 0}, + {x =-2, y = 0, z = 0}, + {x = 0, y = 0, z = 2}, + {x = 0, y = 0, z =-2}, + {x = 0, y = 2, z = 0}, + {x = 0, y = -2, z = 0}} + local i = 1 + while rules[i] ~= nil do + local np = { x = pos.x + rules[i].x, + y = pos.y + rules[i].y, + z = pos.z + rules[i].z} + if minetest.get_item_group(minetest.get_node(np).name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_place(np) + end + i = i + 1 + end + end +end) + +function mesecon.buttonlike_onrotate(pos, node, _, _, new_param2) + local new_node = {name = node.name, param1 = node.param1, param2 = new_param2} + minetest.swap_node(pos, new_node) + mesecon.receiver_remove(pos, node) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(pos, new_node) + mesecon.receiver_place(pos) + minetest.check_for_falling(pos) + return true +end diff --git a/mods/mesecons/mesecons_receiver/mod.conf b/mods/mesecons/mesecons_receiver/mod.conf new file mode 100644 index 00000000..3e0fda0c --- /dev/null +++ b/mods/mesecons/mesecons_receiver/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_receiver +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png new file mode 100644 index 00000000..d052bda3 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png new file mode 100644 index 00000000..f97c22ba Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png new file mode 100644 index 00000000..d052bda3 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png new file mode 100644 index 00000000..f97c22ba Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png new file mode 100644 index 00000000..d052bda3 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png new file mode 100644 index 00000000..f97c22ba Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png new file mode 100644 index 00000000..d052bda3 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png new file mode 100644 index 00000000..f97c22ba Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png differ diff --git a/mods/mesecons/mesecons_solarpanel/doc/solarpanel/description.html b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/description.html new file mode 100644 index 00000000..53570cad --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/description.html @@ -0,0 +1,2 @@ +Solar panels are light receptors: they turn on if there is enough light. +They only work in active blocks; in inactive blocks they keep their old state. diff --git a/mods/mesecons/mesecons_solarpanel/doc/solarpanel/preview.png b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/preview.png new file mode 100644 index 00000000..5b3ec68f Binary files /dev/null and b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/preview.png differ diff --git a/mods/mesecons/mesecons_solarpanel/doc/solarpanel/recipe.png b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/recipe.png new file mode 100644 index 00000000..93ec873d Binary files /dev/null and b/mods/mesecons/mesecons_solarpanel/doc/solarpanel/recipe.png differ diff --git a/mods/mesecons/mesecons_solarpanel/init.lua b/mods/mesecons/mesecons_solarpanel/init.lua new file mode 100644 index 00000000..228f7a2a --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/init.lua @@ -0,0 +1,65 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Solar Panel +mesecon.register_node("mesecons_solarpanel:solar_panel", { + description = S("Solar Panel"), + drawtype = "nodebox", + tiles = {"mesecons_solarpanel.png"}, + inventory_image = "mesecons_solarpanel.png", + wield_image = "mesecons_solarpanel.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + is_ground_content = false, + node_box = { + type = "wallmounted", + wall_bottom = {-7/16, -8/16, -7/16, 7/16, -7/16, 7/16}, + wall_top = {-7/16, 7/16, -7/16, 7/16, 8/16, 7/16}, + wall_side = {-8/16, -7/16, -7/16, -7/16, 7/16, 7/16}, + }, + sounds = mesecon.node_sound.glass, + on_blast = mesecon.on_blastnode, +},{ + groups = {dig_immediate = 3}, + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.wallmounted_get + }} +},{ + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.wallmounted_get + }}, +}) + +minetest.register_craft({ + output = "mesecons_solarpanel:solar_panel_off", + recipe = { + {"mesecons_materials:silicon", "mesecons_materials:silicon"}, + {"mesecons_materials:silicon", "mesecons_materials:silicon"}, + } +}) + +minetest.register_abm({ + label = "Solar Panel On/Off", + nodenames = { + "mesecons_solarpanel:solar_panel_off", + "mesecons_solarpanel:solar_panel_on" + }, + interval = 1, + chance = 1, + catch_up = false, + action = function(pos, node) + local light = minetest.get_node_light(pos) + if light >= 12 and node.name == "mesecons_solarpanel:solar_panel_off" then + node.name = "mesecons_solarpanel:solar_panel_on" + minetest.swap_node(pos, node) + mesecon.receptor_on(pos, mesecon.rules.wallmounted_get(node)) + elseif light < 12 and node.name == "mesecons_solarpanel:solar_panel_on" then + node.name = "mesecons_solarpanel:solar_panel_off" + minetest.swap_node(pos, node) + mesecon.receptor_off(pos, mesecon.rules.wallmounted_get(node)) + end + end, +}) diff --git a/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr new file mode 100644 index 00000000..d5c0c946 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_solarpanel +Solar Panel=Solarmodul diff --git a/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.eo.tr b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.eo.tr new file mode 100644 index 00000000..cdbf0006 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_solarpanel + +### init.lua ### +Solar Panel=Suna Panelo diff --git a/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr new file mode 100644 index 00000000..ed414529 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_solarpanel + +### init.lua ### +Solar Panel=Détecteur solaire diff --git a/mods/mesecons/mesecons_solarpanel/locale/template.txt b/mods/mesecons/mesecons_solarpanel/locale/template.txt new file mode 100644 index 00000000..bb8464a6 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_solarpanel + +### init.lua ### +Solar Panel= diff --git a/mods/mesecons/mesecons_solarpanel/mod.conf b/mods/mesecons/mesecons_solarpanel/mod.conf new file mode 100644 index 00000000..ce3f7d73 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_solarpanel +depends = mesecons, mesecons_gamecompat, mesecons_materials diff --git a/mods/mesecons/mesecons_solarpanel/textures/mesecons_solarpanel.png b/mods/mesecons/mesecons_solarpanel/textures/mesecons_solarpanel.png new file mode 100644 index 00000000..8482ee1f Binary files /dev/null and b/mods/mesecons/mesecons_solarpanel/textures/mesecons_solarpanel.png differ diff --git a/mods/mesecons/mesecons_stickyblocks/init.lua b/mods/mesecons/mesecons_stickyblocks/init.lua new file mode 100644 index 00000000..cf8695f3 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/init.lua @@ -0,0 +1,21 @@ +-- Sticky blocks can be used together with pistons or movestones to push / pull +-- structures that are "glued" together using sticky blocks + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- All sides sticky block +minetest.register_node("mesecons_stickyblocks:sticky_block_all", { + -- TODO: Rename to “All-Faces Sticky Block” when other sticky blocks become available + description = S("Sticky Block"), + tiles = {"mesecons_stickyblocks_sticky.png"}, + is_ground_content = false, + groups = {choppy=3, oddly_breakable_by_hand=2}, + mvps_sticky = function (pos) + local connected = {} + for _, r in ipairs(mesecon.rules.alldirs) do + table.insert(connected, vector.add(pos, r)) + end + return connected + end, + sounds = mesecon.node_sound.wood, +}) diff --git a/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.de.tr b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.de.tr new file mode 100644 index 00000000..25cfd066 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_stickyblocks +Sticky Block=Klebeblock diff --git a/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.eo.tr b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.eo.tr new file mode 100644 index 00000000..8ac7f946 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_stickyblocks + +### init.lua ### +Sticky Block=Glueca Bloko diff --git a/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.fr.tr b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.fr.tr new file mode 100644 index 00000000..9dc82d74 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_stickyblocks + +### init.lua ### +Sticky Block=Bloc collant diff --git a/mods/mesecons/mesecons_stickyblocks/locale/template.txt b/mods/mesecons/mesecons_stickyblocks/locale/template.txt new file mode 100644 index 00000000..b96a6973 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_stickyblocks + +### init.lua ### +Sticky Block= diff --git a/mods/mesecons/mesecons_stickyblocks/mod.conf b/mods/mesecons/mesecons_stickyblocks/mod.conf new file mode 100644 index 00000000..4aa2ee22 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_stickyblocks +depends = mesecons, mesecons_gamecompat, mesecons_mvps diff --git a/mods/mesecons/mesecons_stickyblocks/textures/mesecons_stickyblocks_sticky.png b/mods/mesecons/mesecons_stickyblocks/textures/mesecons_stickyblocks_sticky.png new file mode 100644 index 00000000..3a5f6f12 Binary files /dev/null and b/mods/mesecons/mesecons_stickyblocks/textures/mesecons_stickyblocks_sticky.png differ diff --git a/mods/mesecons/mesecons_switch/doc/switch/description.html b/mods/mesecons/mesecons_switch/doc/switch/description.html new file mode 100644 index 00000000..0c8f6077 --- /dev/null +++ b/mods/mesecons/mesecons_switch/doc/switch/description.html @@ -0,0 +1 @@ +The switch is a receptor. It changes its state when punched. diff --git a/mods/mesecons/mesecons_switch/doc/switch/preview.png b/mods/mesecons/mesecons_switch/doc/switch/preview.png new file mode 100644 index 00000000..c765272a Binary files /dev/null and b/mods/mesecons/mesecons_switch/doc/switch/preview.png differ diff --git a/mods/mesecons/mesecons_switch/doc/switch/recipe.png b/mods/mesecons/mesecons_switch/doc/switch/recipe.png new file mode 100644 index 00000000..15c9b0b3 Binary files /dev/null and b/mods/mesecons/mesecons_switch/doc/switch/recipe.png differ diff --git a/mods/mesecons/mesecons_switch/init.lua b/mods/mesecons/mesecons_switch/init.lua new file mode 100644 index 00000000..a8115de5 --- /dev/null +++ b/mods/mesecons/mesecons_switch/init.lua @@ -0,0 +1,38 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- mesecons_switch + +mesecon.register_node("mesecons_switch:mesecon_switch", { + paramtype2="facedir", + description=S("Switch"), + is_ground_content = false, + sounds = mesecon.node_sound.stone, + on_rightclick = function (pos, node) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) + end + minetest.sound_play("mesecons_switch", { pos = pos }, true) + end +},{ + groups = {dig_immediate=2}, + tiles = { "mesecons_switch_side.png", "mesecons_switch_side.png", + "mesecons_switch_side.png", "mesecons_switch_side.png", + "mesecons_switch_side.png", "mesecons_switch_off.png"}, + mesecons = {receptor = { state = mesecon.state.off }} +},{ + groups = {dig_immediate=2, not_in_creative_inventory=1}, + tiles = { "mesecons_switch_side.png", "mesecons_switch_side.png", + "mesecons_switch_side.png", "mesecons_switch_side.png", + "mesecons_switch_side.png", "mesecons_switch_on.png"}, + mesecons = {receptor = { state = mesecon.state.on }} +}) + +minetest.register_craft({ + output = "mesecons_switch:mesecon_switch_off 2", + recipe = { + {"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot"}, + {"group:mesecon_conductor_craftable","", "group:mesecon_conductor_craftable"}, + } +}) diff --git a/mods/mesecons/mesecons_switch/locale/mesecons_switch.de.tr b/mods/mesecons/mesecons_switch/locale/mesecons_switch.de.tr new file mode 100644 index 00000000..a49a9aca --- /dev/null +++ b/mods/mesecons/mesecons_switch/locale/mesecons_switch.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_switch +Switch=Schalter diff --git a/mods/mesecons/mesecons_switch/locale/mesecons_switch.eo.tr b/mods/mesecons/mesecons_switch/locale/mesecons_switch.eo.tr new file mode 100644 index 00000000..abd93f03 --- /dev/null +++ b/mods/mesecons/mesecons_switch/locale/mesecons_switch.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_switch + +### init.lua ### +Switch=Ŝaltilo diff --git a/mods/mesecons/mesecons_switch/locale/mesecons_switch.fr.tr b/mods/mesecons/mesecons_switch/locale/mesecons_switch.fr.tr new file mode 100644 index 00000000..6c07c640 --- /dev/null +++ b/mods/mesecons/mesecons_switch/locale/mesecons_switch.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_switch + +### init.lua ### +Switch=Commutateur diff --git a/mods/mesecons/mesecons_switch/locale/template.txt b/mods/mesecons/mesecons_switch/locale/template.txt new file mode 100644 index 00000000..c493778b --- /dev/null +++ b/mods/mesecons/mesecons_switch/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_switch + +### init.lua ### +Switch= diff --git a/mods/mesecons/mesecons_switch/mod.conf b/mods/mesecons/mesecons_switch/mod.conf new file mode 100644 index 00000000..f6b642c6 --- /dev/null +++ b/mods/mesecons/mesecons_switch/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_switch +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg b/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg new file mode 100644 index 00000000..53d45c18 Binary files /dev/null and b/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg differ diff --git a/mods/mesecons/mesecons_switch/textures/mesecons_switch_off.png b/mods/mesecons/mesecons_switch/textures/mesecons_switch_off.png new file mode 100644 index 00000000..1dd77eae Binary files /dev/null and b/mods/mesecons/mesecons_switch/textures/mesecons_switch_off.png differ diff --git a/mods/mesecons/mesecons_switch/textures/mesecons_switch_on.png b/mods/mesecons/mesecons_switch/textures/mesecons_switch_on.png new file mode 100644 index 00000000..bc6bd75c Binary files /dev/null and b/mods/mesecons/mesecons_switch/textures/mesecons_switch_on.png differ diff --git a/mods/mesecons/mesecons_switch/textures/mesecons_switch_side.png b/mods/mesecons/mesecons_switch/textures/mesecons_switch_side.png new file mode 100644 index 00000000..9ffa4f09 Binary files /dev/null and b/mods/mesecons/mesecons_switch/textures/mesecons_switch_side.png differ diff --git a/mods/mesecons/mesecons_torch/doc/torch/description.html b/mods/mesecons/mesecons_torch/doc/torch/description.html new file mode 100644 index 00000000..60a6713e --- /dev/null +++ b/mods/mesecons/mesecons_torch/doc/torch/description.html @@ -0,0 +1,2 @@ +The torch is an inverter, it may take up to 1 second until the signal has passed through. The input is 2 blocks away in the direction of the stick, outputs are around the mesecon glow. +It doesn't work in an inactive block; it just retains its state until the block becomes active. diff --git a/mods/mesecons/mesecons_torch/doc/torch/preview.png b/mods/mesecons/mesecons_torch/doc/torch/preview.png new file mode 100644 index 00000000..edf7194e Binary files /dev/null and b/mods/mesecons/mesecons_torch/doc/torch/preview.png differ diff --git a/mods/mesecons/mesecons_torch/doc/torch/recipe.png b/mods/mesecons/mesecons_torch/doc/torch/recipe.png new file mode 100644 index 00000000..85d586dc Binary files /dev/null and b/mods/mesecons/mesecons_torch/doc/torch/recipe.png differ diff --git a/mods/mesecons/mesecons_torch/init.lua b/mods/mesecons/mesecons_torch/init.lua new file mode 100644 index 00000000..6469d7b7 --- /dev/null +++ b/mods/mesecons/mesecons_torch/init.lua @@ -0,0 +1,130 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +--MESECON TORCHES + +local rotate_torch_rules = function (rules, param2) + if param2 == 5 then + return mesecon.rotate_rules_right(rules) + elseif param2 == 2 then + return mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) --180 degrees + elseif param2 == 4 then + return mesecon.rotate_rules_left(rules) + elseif param2 == 1 then + return mesecon.rotate_rules_down(rules) + elseif param2 == 0 then + return mesecon.rotate_rules_up(rules) + else + return rules + end +end + +local torch_get_output_rules = function(node) + local rules = { + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}} + + return rotate_torch_rules(rules, node.param2) +end + +local torch_input_rules_unrotated_horizontal = {vector.new(-2, 0, 0), vector.new(-1, 1, 0)} +local torch_input_rules_unrotated_vertical = {vector.new(-2, 0, 0)} + +local torch_get_input_rules = function(node) + local rules = (node.param2 == 0 or node.param2 == 1) + and torch_input_rules_unrotated_vertical + or torch_input_rules_unrotated_horizontal + + return rotate_torch_rules(rules, node.param2) +end + +minetest.register_craft({ + output = "mesecons_torch:mesecon_torch_on 4", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"group:stick"},} +}) + +local torch_selectionbox = +{ + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.1, -0.1, -0.5+0.6, 0.1, 0.1}, +} + +minetest.register_node("mesecons_torch:mesecon_torch_off", { + drawtype = "plantlike", + tiles = {"jeija_torches_off.png"}, + inventory_image = "jeija_torches_off.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + paramtype2 = "wallmounted", + selection_box = torch_selectionbox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_torch:mesecon_torch_on", + sounds = mesecon.node_sound.default, + mesecons = {receptor = { + state = mesecon.state.off, + rules = torch_get_output_rules + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_node("mesecons_torch:mesecon_torch_on", { + drawtype = "plantlike", + tiles = {"jeija_torches_on.png"}, + inventory_image = "jeija_torches_on.png", + wield_image = "jeija_torches_on.png", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + paramtype2 = "wallmounted", + selection_box = torch_selectionbox, + groups = {dig_immediate=3}, + light_source = minetest.LIGHT_MAX-5, + description = S("Mesecon Torch"), + sounds = mesecon.node_sound.default, + mesecons = {receptor = { + state = mesecon.state.on, + rules = torch_get_output_rules + }}, + on_blast = mesecon.on_blastnode, +}) + +minetest.register_abm({ + nodenames = {"mesecons_torch:mesecon_torch_off","mesecons_torch:mesecon_torch_on"}, + interval = 1, + chance = 1, + action = function(pos, node) + local is_powered = false + for _, rule in ipairs(torch_get_input_rules(node)) do + local src = vector.add(pos, rule) + if mesecon.is_power_on(src) then + is_powered = true + end + end + + if is_powered then + if node.name == "mesecons_torch:mesecon_torch_on" then + minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_off", param2 = node.param2}) + mesecon.receptor_off(pos, torch_get_output_rules(node)) + end + elseif node.name == "mesecons_torch:mesecon_torch_off" then + minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_on", param2 = node.param2}) + mesecon.receptor_on(pos, torch_get_output_rules(node)) + end + end +}) + +-- Param2 Table (Block Attached To) +-- 5 = z-1 +-- 3 = x-1 +-- 4 = z+1 +-- 2 = x+1 +-- 0 = y+1 +-- 1 = y-1 diff --git a/mods/mesecons/mesecons_torch/locale/mesecons_torch.de.tr b/mods/mesecons/mesecons_torch/locale/mesecons_torch.de.tr new file mode 100644 index 00000000..a72a1380 --- /dev/null +++ b/mods/mesecons/mesecons_torch/locale/mesecons_torch.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_torch +Mesecon Torch=Meseconfackel diff --git a/mods/mesecons/mesecons_torch/locale/mesecons_torch.eo.tr b/mods/mesecons/mesecons_torch/locale/mesecons_torch.eo.tr new file mode 100644 index 00000000..393dc4d5 --- /dev/null +++ b/mods/mesecons/mesecons_torch/locale/mesecons_torch.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_torch + +### init.lua ### +Mesecon Torch=Mesekonduktila Torĉo diff --git a/mods/mesecons/mesecons_torch/locale/mesecons_torch.fr.tr b/mods/mesecons/mesecons_torch/locale/mesecons_torch.fr.tr new file mode 100644 index 00000000..50687b3a --- /dev/null +++ b/mods/mesecons/mesecons_torch/locale/mesecons_torch.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_torch + +### init.lua ### +Mesecon Torch=Torche de Mesecon diff --git a/mods/mesecons/mesecons_torch/locale/template.txt b/mods/mesecons/mesecons_torch/locale/template.txt new file mode 100644 index 00000000..981e8502 --- /dev/null +++ b/mods/mesecons/mesecons_torch/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_torch + +### init.lua ### +Mesecon Torch= diff --git a/mods/mesecons/mesecons_torch/mod.conf b/mods/mesecons/mesecons_torch/mod.conf new file mode 100644 index 00000000..b631be78 --- /dev/null +++ b/mods/mesecons/mesecons_torch/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_torch +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png new file mode 100644 index 00000000..92cdce63 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png new file mode 100644 index 00000000..7506c8d5 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png differ diff --git a/mods/mesecons/mesecons_walllever/doc/walllever/description.html b/mods/mesecons/mesecons_walllever/doc/walllever/description.html new file mode 100644 index 00000000..ea5a0ed9 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/doc/walllever/description.html @@ -0,0 +1 @@ +A receptor just like a switch, but it can be attached to walls. diff --git a/mods/mesecons/mesecons_walllever/doc/walllever/preview.png b/mods/mesecons/mesecons_walllever/doc/walllever/preview.png new file mode 100644 index 00000000..04819f35 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/doc/walllever/preview.png differ diff --git a/mods/mesecons/mesecons_walllever/doc/walllever/recipe.png b/mods/mesecons/mesecons_walllever/doc/walllever/recipe.png new file mode 100644 index 00000000..8714e029 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/doc/walllever/recipe.png differ diff --git a/mods/mesecons/mesecons_walllever/init.lua b/mods/mesecons/mesecons_walllever/init.lua new file mode 100644 index 00000000..651cd8d5 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/init.lua @@ -0,0 +1,66 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- WALL LEVER +-- Basically a switch that can be attached to a wall +-- Powers the block 2 nodes behind (using a receiver) +mesecon.register_node("mesecons_walllever:wall_lever", { + description = S("Lever"), + drawtype = "mesh", + inventory_image = "jeija_wall_lever_inv.png", + wield_image = "jeija_wall_lever_inv.png", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 }, + }, + sounds = mesecon.node_sound.wood, + on_rightclick = function (pos, node) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + else + mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node)) + end + minetest.sound_play("mesecons_lever", { pos = pos }, true) + end +},{ + tiles = { + "jeija_wall_lever_lever_light_off.png", + "jeija_wall_lever_front.png", + "jeija_wall_lever_front_bump.png", + "jeija_wall_lever_back_edges.png" + }, + mesh="jeija_wall_lever_off.obj", + on_rotate = mesecon.buttonlike_onrotate, + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + state = mesecon.state.off + }}, + groups = {dig_immediate = 2, mesecon_needs_receiver = 1} +},{ + tiles = { + "jeija_wall_lever_lever_light_on.png", + "jeija_wall_lever_front.png", + "jeija_wall_lever_front_bump.png", + "jeija_wall_lever_back_edges.png" + }, + mesh="jeija_wall_lever_on.obj", + on_rotate = false, + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + state = mesecon.state.on + }}, + groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1} +}) + +minetest.register_craft({ + output = "mesecons_walllever:wall_lever_off 2", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"mesecons_gamecompat:stone"}, + {"group:stick"}, + } +}) diff --git a/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.de.tr b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.de.tr new file mode 100644 index 00000000..d854ff69 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_walllever +Lever=Wandschalter diff --git a/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.eo.tr b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.eo.tr new file mode 100644 index 00000000..73d0a9ad --- /dev/null +++ b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_walllever + +### init.lua ### +Lever=Levilo diff --git a/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.fr.tr b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.fr.tr new file mode 100644 index 00000000..48217091 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/locale/mesecons_walllever.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_walllever + +### init.lua ### +Lever=Levier diff --git a/mods/mesecons/mesecons_walllever/locale/template.txt b/mods/mesecons/mesecons_walllever/locale/template.txt new file mode 100644 index 00000000..505a962e --- /dev/null +++ b/mods/mesecons/mesecons_walllever/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_walllever + +### init.lua ### +Lever= diff --git a/mods/mesecons/mesecons_walllever/mod.conf b/mods/mesecons/mesecons_walllever/mod.conf new file mode 100644 index 00000000..16467d41 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_walllever +depends = mesecons, mesecons_gamecompat, mesecons_receiver diff --git a/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj new file mode 100644 index 00000000..334b54bc --- /dev/null +++ b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj @@ -0,0 +1,216 @@ +# Blender v2.73 (sub 0) OBJ File: 'mesecons-wall-lever-off.blend' +# www.blender.org +o nodebox-5 +v 0.281250 0.156250 0.312500 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.343751 0.218750 0.375000 +v 0.343751 -0.218752 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.281250 -0.156250 0.312500 +v -0.062500 -0.055586 0.191789 +v -0.062500 -0.087939 0.312529 +v -0.062500 -0.413939 0.225178 +v -0.062500 -0.381586 0.104437 +v -0.343751 0.218750 0.375000 +v 0.062500 -0.055586 0.191789 +v 0.062500 -0.087939 0.312529 +v -0.343751 -0.218752 0.375000 +v 0.062500 -0.413939 0.225178 +v 0.062500 -0.381586 0.104437 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +v -0.281250 0.156250 0.312500 +v -0.281250 -0.156250 0.312500 +v -0.250000 0.125000 0.312500 +v -0.250000 -0.125000 0.312500 +v 0.250000 0.125000 0.312500 +v 0.250000 -0.125000 0.312500 +v -0.250000 0.125000 0.250000 +v -0.250000 -0.125000 0.250000 +v 0.250000 0.125000 0.250000 +v 0.250000 -0.125000 0.250000 +v 0.125000 -0.062500 0.187500 +v 0.125000 0.062500 0.187500 +v -0.125000 -0.062500 0.187500 +v -0.125000 0.062500 0.187500 +v 0.062500 -0.031251 0.176992 +v 0.062500 0.031250 0.176992 +v -0.062498 -0.031251 0.176992 +v -0.062498 0.031250 0.176992 +v -0.187500 -0.093750 0.208750 +v 0.187500 0.093750 0.208750 +v 0.187500 -0.093750 0.208750 +v -0.187500 0.093750 0.208750 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.437500 +vt 0.687500 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.687500 0.312500 +vt 0.187500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.796875 +vt 0.375000 0.796875 +vt 0.343750 0.765625 +vt 0.906250 0.765625 +vt 0.203125 0.875000 +vt 0.203125 0.625000 +vt 0.234375 0.593750 +vt 0.234375 0.906250 +vt 0.875000 0.890625 +vt 0.906250 0.921875 +vt 0.343750 0.921875 +vt 0.375000 0.890625 +vt 0.109375 0.875000 +vt 0.078125 0.906250 +vt 0.078125 0.593750 +vt 0.109375 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.000000 +vt 0.218880 0.343823 +vt 0.218880 0.656178 +vt 0.156408 0.718649 +vt 0.156408 0.281350 +vt 0.968592 0.718649 +vt 0.968592 0.281350 +vt 0.999827 0.125174 +vt 0.999827 0.874827 +vt 0.781120 0.656178 +vt 0.843592 0.718649 +vt 0.843592 0.281350 +vt 0.781120 0.343823 +vt 0.843592 0.156350 +vt 0.156408 0.156350 +vt 0.125173 0.000174 +vt 0.874827 0.000174 +vt 0.031408 0.718649 +vt 0.000173 0.874827 +vt 0.000173 0.125174 +vt 0.031408 0.281350 +vt 0.843592 0.843649 +vt 0.874827 0.999827 +vt 0.125173 0.999827 +vt 0.156408 0.843649 +vt 0.250000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.625000 +vt 0.187500 0.625000 +vt 0.187500 0.375000 +vt 0.625000 0.562500 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.625000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.531250 +vt 0.375000 0.437500 +vt 0.375000 0.562500 +vt 0.312500 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.593750 +vt 0.687500 0.593750 +vt 1.000000 0.000000 +vt 1.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.125000 1.000000 +vn 0.000000 -0.258800 0.965900 +vn 0.000000 -0.965900 -0.258800 +vn 0.000000 0.258800 -0.965900 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.707100 -0.707100 +vn 0.000000 -0.707100 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.141100 0.273900 -0.951300 +vn -0.054600 0.137500 -0.989000 +vn -0.054600 -0.137500 -0.989000 +vn -0.141100 -0.273900 -0.951300 +vn 0.054600 -0.137500 -0.989000 +vn 0.054600 0.137500 -0.989000 +vn 0.141100 -0.273900 -0.951300 +vn 0.141100 0.273900 -0.951300 +vn 0.269900 -0.421500 -0.865700 +vn -0.269900 -0.421500 -0.865700 +vn 0.269900 0.421500 -0.865700 +vn -0.269900 0.421500 -0.865700 +vn -0.395600 0.336800 -0.854500 +vn 0.395600 0.336800 -0.854500 +vn 0.395600 -0.336800 -0.854500 +vn -0.395600 -0.336800 -0.854500 +vn 0.000000 -0.000000 1.000000 +g nodebox-5_nodebox-5_lever-light +s off +f 17/1/1 15/2/1 10/3/1 11/4/1 +f 18/5/2 17/6/2 11/7/2 12/8/2 +f 18/9/3 12/10/3 9/11/3 14/12/3 +f 26/13/4 28/14/4 8/15/4 24/16/4 +f 25/17/4 26/18/4 24/19/4 23/20/4 +f 25/21/4 23/22/4 1/23/4 27/24/4 +f 27/25/4 1/26/4 8/27/4 28/28/4 +f 12/29/5 11/4/5 10/3/5 9/30/5 +f 18/9/6 14/12/6 15/2/6 17/1/6 +g nodebox-5_nodebox-5_front +f 8/31/7 1/32/7 4/33/7 5/34/7 +f 13/35/4 16/36/4 3/37/4 2/38/4 +f 1/32/8 23/39/8 13/40/8 4/33/8 +f 8/31/9 5/34/9 16/41/9 24/42/9 +f 24/42/10 16/41/10 13/40/10 23/39/10 +f 16/43/4 5/44/4 7/45/4 3/46/4 +f 4/47/4 6/48/4 7/49/4 5/50/4 +f 13/51/4 2/52/4 6/53/4 4/54/4 +g nodebox-5_nodebox-5_front-bump +f 31/55/11 29/56/11 25/57/11 27/58/11 +f 32/59/12 28/60/12 26/61/12 30/62/12 +f 30/62/5 26/63/5 25/64/5 29/56/5 +f 32/59/6 31/55/6 27/65/6 28/66/6 +s 1 +f 36/67/13 40/68/14 39/69/15 35/70/16 +f 37/71/17 39/69/15 40/68/14 38/72/18 +f 35/70/16 39/69/15 37/71/17 33/73/19 +f 33/73/19 37/71/17 38/72/18 34/74/20 +f 34/74/20 38/72/18 40/68/14 36/67/13 +f 33/73/19 43/75/21 41/76/22 35/70/16 +f 33/73/19 34/74/20 42/77/23 43/75/21 +f 35/70/16 41/76/22 44/78/24 36/67/13 +f 42/77/23 44/78/24 29/56/25 31/55/26 +f 43/75/21 32/59/27 30/62/28 41/76/22 +f 43/75/21 42/77/23 31/55/26 32/59/27 +f 41/76/22 30/62/28 29/56/25 44/78/24 +f 34/74/20 36/67/13 44/78/24 42/77/23 +g nodebox-5_nodebox-5_back-edges +s off +f 19/79/29 20/80/29 22/81/29 21/82/29 +f 7/82/6 6/81/6 20/83/6 19/84/6 +f 3/82/5 21/84/5 22/83/5 2/81/5 +f 48/85/12 49/80/12 51/81/12 46/86/12 +f 47/85/11 45/86/11 52/81/11 50/80/11 diff --git a/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj new file mode 100644 index 00000000..a806be87 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj @@ -0,0 +1,216 @@ +# Blender v2.73 (sub 0) OBJ File: 'mesecons-wall-lever.blend' +# www.blender.org +o nodebox-5 +v 0.281250 0.156250 0.312500 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.343751 0.218750 0.375000 +v 0.343751 -0.218752 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.281250 -0.156250 0.312500 +v -0.062500 0.075354 0.315617 +v -0.062500 0.043002 0.194876 +v -0.062500 0.369002 0.107525 +v -0.062500 0.401354 0.228266 +v -0.343751 0.218750 0.375000 +v 0.062500 0.075354 0.315617 +v 0.062500 0.043002 0.194876 +v -0.343751 -0.218752 0.375000 +v 0.062500 0.369002 0.107525 +v 0.062500 0.401354 0.228266 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +v -0.281250 0.156250 0.312500 +v -0.281250 -0.156250 0.312500 +v -0.250000 0.125000 0.312500 +v -0.250000 -0.125000 0.312500 +v 0.250000 0.125000 0.312500 +v 0.250000 -0.125000 0.312500 +v -0.250000 0.125000 0.250000 +v -0.250000 -0.125000 0.250000 +v 0.250000 0.125000 0.250000 +v 0.250000 -0.125000 0.250000 +v 0.125000 -0.062500 0.187500 +v 0.125000 0.062500 0.187500 +v -0.125000 -0.062500 0.187500 +v -0.125000 0.062500 0.187500 +v 0.062500 -0.031251 0.176992 +v 0.062500 0.031250 0.176992 +v -0.062498 -0.031251 0.176992 +v -0.062498 0.031250 0.176992 +v -0.187500 -0.093750 0.208750 +v 0.187500 0.093750 0.208750 +v 0.187500 -0.093750 0.208750 +v -0.187500 0.093750 0.208750 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.437500 +vt 0.687500 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.687500 0.312500 +vt 0.187500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.796875 +vt 0.375000 0.796875 +vt 0.343750 0.765625 +vt 0.906250 0.765625 +vt 0.203125 0.875000 +vt 0.203125 0.625000 +vt 0.234375 0.593750 +vt 0.234375 0.906250 +vt 0.875000 0.890625 +vt 0.906250 0.921875 +vt 0.343750 0.921875 +vt 0.375000 0.890625 +vt 0.109375 0.875000 +vt 0.078125 0.906250 +vt 0.078125 0.593750 +vt 0.109375 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.000000 +vt 0.218880 0.343823 +vt 0.218880 0.656178 +vt 0.156408 0.718649 +vt 0.156408 0.281350 +vt 0.968592 0.718649 +vt 0.968592 0.281350 +vt 0.999827 0.125174 +vt 0.999827 0.874827 +vt 0.781120 0.656178 +vt 0.843592 0.718649 +vt 0.843592 0.281350 +vt 0.781120 0.343823 +vt 0.843592 0.156350 +vt 0.156408 0.156350 +vt 0.125173 0.000174 +vt 0.874827 0.000174 +vt 0.031408 0.718649 +vt 0.000173 0.874827 +vt 0.000173 0.125174 +vt 0.031408 0.281350 +vt 0.843592 0.843649 +vt 0.874827 0.999827 +vt 0.125173 0.999827 +vt 0.156408 0.843649 +vt 0.250000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.625000 +vt 0.187500 0.625000 +vt 0.187500 0.375000 +vt 0.625000 0.562500 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.625000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.531250 +vt 0.375000 0.437500 +vt 0.375000 0.562500 +vt 0.312500 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.593750 +vt 0.687500 0.593750 +vt 1.000000 0.000000 +vt 1.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.125000 1.000000 +vn 0.000000 -0.258800 -0.965900 +vn 0.000000 0.965900 -0.258800 +vn 0.000000 0.258800 0.965900 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.707100 -0.707100 +vn 0.000000 -0.707100 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.141100 0.273900 -0.951300 +vn -0.054600 0.137500 -0.989000 +vn -0.054600 -0.137500 -0.989000 +vn -0.141100 -0.273900 -0.951300 +vn 0.054600 -0.137500 -0.989000 +vn 0.054600 0.137500 -0.989000 +vn 0.141100 -0.273900 -0.951300 +vn 0.141100 0.273900 -0.951300 +vn 0.269900 -0.421500 -0.865700 +vn -0.269900 -0.421500 -0.865700 +vn 0.269900 0.421500 -0.865700 +vn -0.269900 0.421500 -0.865700 +vn -0.395600 0.336800 -0.854500 +vn 0.395600 0.336800 -0.854500 +vn 0.395600 -0.336800 -0.854500 +vn -0.395600 -0.336800 -0.854500 +vn 0.000000 -0.000000 1.000000 +g nodebox-5_nodebox-5_lever-light +s off +f 17/1/1 15/2/1 10/3/1 11/4/1 +f 18/5/2 17/6/2 11/7/2 12/8/2 +f 18/9/3 12/10/3 9/11/3 14/12/3 +f 26/13/4 28/14/4 8/15/4 24/16/4 +f 25/17/4 26/18/4 24/19/4 23/20/4 +f 25/21/4 23/22/4 1/23/4 27/24/4 +f 27/25/4 1/26/4 8/27/4 28/28/4 +f 12/29/5 11/4/5 10/3/5 9/30/5 +f 18/9/6 14/12/6 15/2/6 17/1/6 +g nodebox-5_nodebox-5_front +f 8/31/7 1/32/7 4/33/7 5/34/7 +f 13/35/4 16/36/4 3/37/4 2/38/4 +f 1/32/8 23/39/8 13/40/8 4/33/8 +f 8/31/9 5/34/9 16/41/9 24/42/9 +f 24/42/10 16/41/10 13/40/10 23/39/10 +f 16/43/4 5/44/4 7/45/4 3/46/4 +f 4/47/4 6/48/4 7/49/4 5/50/4 +f 13/51/4 2/52/4 6/53/4 4/54/4 +g nodebox-5_nodebox-5_front-bump +f 31/55/11 29/56/11 25/57/11 27/58/11 +f 32/59/12 28/60/12 26/61/12 30/62/12 +f 30/62/5 26/63/5 25/64/5 29/56/5 +f 32/59/6 31/55/6 27/65/6 28/66/6 +s 1 +f 36/67/13 40/68/14 39/69/15 35/70/16 +f 37/71/17 39/69/15 40/68/14 38/72/18 +f 35/70/16 39/69/15 37/71/17 33/73/19 +f 33/73/19 37/71/17 38/72/18 34/74/20 +f 34/74/20 38/72/18 40/68/14 36/67/13 +f 33/73/19 43/75/21 41/76/22 35/70/16 +f 33/73/19 34/74/20 42/77/23 43/75/21 +f 35/70/16 41/76/22 44/78/24 36/67/13 +f 42/77/23 44/78/24 29/56/25 31/55/26 +f 43/75/21 32/59/27 30/62/28 41/76/22 +f 43/75/21 42/77/23 31/55/26 32/59/27 +f 41/76/22 30/62/28 29/56/25 44/78/24 +f 34/74/20 36/67/13 44/78/24 42/77/23 +g nodebox-5_nodebox-5_back-edges +s off +f 19/79/29 20/80/29 22/81/29 21/82/29 +f 7/82/6 6/81/6 20/83/6 19/84/6 +f 3/82/5 21/84/5 22/83/5 2/81/5 +f 48/85/12 49/80/12 51/81/12 46/86/12 +f 47/85/11 45/86/11 52/81/11 50/80/11 diff --git a/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg b/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg new file mode 100644 index 00000000..53d45c18 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png new file mode 100644 index 00000000..edc331fe Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png new file mode 100644 index 00000000..c7987ee3 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png new file mode 100644 index 00000000..3b80d7ae Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png new file mode 100644 index 00000000..f53bd742 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png new file mode 100644 index 00000000..3debb2df Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png new file mode 100644 index 00000000..746227fd Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png differ diff --git a/mods/mesecons/mesecons_wires/doc/mesecon/description.html b/mods/mesecons/mesecons_wires/doc/mesecon/description.html new file mode 100644 index 00000000..b20606bf --- /dev/null +++ b/mods/mesecons/mesecons_wires/doc/mesecon/description.html @@ -0,0 +1 @@ +Mesecons are the wires, use them to connect effectors with receptors. Wiring works through unloaded blocks; they’re loaded when the signal level changes. diff --git a/mods/mesecons/mesecons_wires/doc/mesecon/preview.png b/mods/mesecons/mesecons_wires/doc/mesecon/preview.png new file mode 100644 index 00000000..2c0e5fb0 Binary files /dev/null and b/mods/mesecons/mesecons_wires/doc/mesecon/preview.png differ diff --git a/mods/mesecons/mesecons_wires/doc/mesecon/recipe.png b/mods/mesecons/mesecons_wires/doc/mesecon/recipe.png new file mode 100644 index 00000000..3dfea78c Binary files /dev/null and b/mods/mesecons/mesecons_wires/doc/mesecon/recipe.png differ diff --git a/mods/mesecons/mesecons_wires/init.lua b/mods/mesecons/mesecons_wires/init.lua new file mode 100644 index 00000000..dc1a8ac3 --- /dev/null +++ b/mods/mesecons/mesecons_wires/init.lua @@ -0,0 +1,263 @@ +-- naming scheme: wire:(xp)(zp)(xm)(zm)(xpyp)(zpyp)(xmyp)(zmyp)_on/off +-- where x= x direction, z= z direction, y= y direction, p = +1, m = -1, e.g. xpym = {x=1, y=-1, z=0} +-- The (xp)/(zpyp)/.. statements shall be replaced by either 0 or 1 +-- Where 0 means the wire has no visual connection to that direction and +-- 1 means that the wire visually connects to that other node. + +-- ####################### +-- ## Update wire looks ## +-- ####################### + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for +local wire_getconnect = function (from_pos, self_pos) + local node = minetest.get_node(self_pos) + local def = minetest.registered_nodes[node.name] + if def and def.mesecons then + -- rules of node to possibly connect to + local rules + if def.mesecon_wire then + rules = mesecon.rules.default + else + rules = mesecon.get_any_rules(node) + end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + if (vector.equals(vector.add(self_pos, r), from_pos)) then + return true + end + end + end + return false +end + +-- Update this node +local wire_updateconnect = function (pos) + local connections = {} + + for _, r in ipairs(mesecon.rules.default) do + if wire_getconnect(pos, vector.add(pos, r)) then + table.insert(connections, r) + end + end + + local nid = {} + for _, vec in ipairs(connections) do + -- flat component + if vec.x == 1 then nid[0] = "1" end + if vec.z == 1 then nid[1] = "1" end + if vec.x == -1 then nid[2] = "1" end + if vec.z == -1 then nid[3] = "1" end + + -- slopy component + if vec.y == 1 then + if vec.x == 1 then nid[4] = "1" end + if vec.z == 1 then nid[5] = "1" end + if vec.x == -1 then nid[6] = "1" end + if vec.z == -1 then nid[7] = "1" end + end + end + + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + local state_suffix = string.find(minetest.get_node(pos).name, "_off") and "_off" or "_on" + minetest.set_node(pos, {name = "mesecons:wire_"..nodeid..state_suffix}) +end + +local update_on_place_dig = function (pos, node) + -- Update placed node (get_node again as it may have been dug) + do + local nn = minetest.get_node(pos) + local def = minetest.registered_nodes[nn.name] + if def and def.mesecon_wire then + wire_updateconnect(pos) + end + end + + -- Update nodes around it + local rules + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.mesecon_wire then + rules = mesecon.rules.default + else + rules = mesecon.get_any_rules(node) + end + if (not rules) then return end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, r) + local rdef = minetest.registered_nodes[minetest.get_node(np).name] + if rdef and rdef.mesecon_wire then + wire_updateconnect(np) + end + end +end + +mesecon.register_autoconnect_hook("wire", update_on_place_dig) + +-- ############################ +-- ## Wire node registration ## +-- ############################ +-- Nodeboxes: +local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} +local box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 } + +local nbox_nid = +{ + [0] = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}, -- x positive + [1] = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}, -- z positive + [2] = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16}, -- x negative + [3] = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16}, -- z negative + + [4] = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16}, -- x positive up + [5] = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}, -- z positive up + [6] = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}, -- x negative up + [7] = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16} -- z negative up +} + +local tiles_off = { "mesecons_wire_off.png" } +local tiles_on = { "mesecons_wire_on.png" } + +local selectionbox = +{ + type = "fixed", + fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5} +} + +-- go to the next nodeid (ex.: 01000011 --> 01000100) +local nid_inc = function() end +nid_inc = function (nid) + local i = 0 + while nid[i-1] ~= 1 do + nid[i] = (nid[i] ~= 1) and 1 or 0 + i = i + 1 + end + + -- BUT: Skip impossible nodeids: + if ((nid[0] == 0 and nid[4] == 1) or (nid[1] == 0 and nid[5] == 1) + or (nid[2] == 0 and nid[6] == 1) or (nid[3] == 0 and nid[7] == 1)) then + return nid_inc(nid) + end + + return i <= 8 +end + +local function register_wires() + local nid = {} + while true do + -- Create group specifiction and nodeid string (see note above for details) + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + -- Calculate nodebox + local nodebox = {type = "fixed", fixed={box_center}} + for i=0,7 do + if nid[i] == 1 then + table.insert(nodebox.fixed, nbox_nid[i]) + end + end + + -- Add bump to nodebox if curved + if (nid[0] == 1 and nid[1] == 1) or (nid[1] == 1 and nid[2] == 1) + or (nid[2] == 1 and nid[3] == 1) or (nid[3] == 1 and nid[0] == 1) then + table.insert(nodebox.fixed, box_bump1) + end + + -- If nothing to connect to, still make a nodebox of a straight wire + if nodeid == "00000000" then + nodebox.fixed = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} + end + + local rules = {} + if (nid[0] == 1) then table.insert(rules, vector.new( 1, 0, 0)) end + if (nid[1] == 1) then table.insert(rules, vector.new( 0, 0, 1)) end + if (nid[2] == 1) then table.insert(rules, vector.new(-1, 0, 0)) end + if (nid[3] == 1) then table.insert(rules, vector.new( 0, 0, -1)) end + + if (nid[0] == 1) then table.insert(rules, vector.new( 1, -1, 0)) end + if (nid[1] == 1) then table.insert(rules, vector.new( 0, -1, 1)) end + if (nid[2] == 1) then table.insert(rules, vector.new(-1, -1, 0)) end + if (nid[3] == 1) then table.insert(rules, vector.new( 0, -1, -1)) end + + if (nid[4] == 1) then table.insert(rules, vector.new( 1, 1, 0)) end + if (nid[5] == 1) then table.insert(rules, vector.new( 0, 1, 1)) end + if (nid[6] == 1) then table.insert(rules, vector.new(-1, 1, 0)) end + if (nid[7] == 1) then table.insert(rules, vector.new( 0, 1, -1)) end + + local meseconspec_off = { conductor = { + rules = rules, + state = mesecon.state.off, + onstate = "mesecons:wire_"..nodeid.."_on" + }} + + local meseconspec_on = { conductor = { + rules = rules, + state = mesecon.state.on, + offstate = "mesecons:wire_"..nodeid.."_off" + }} + + local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, + not_in_creative_inventory = 1, not_in_craft_guide = 1} + local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} + if nodeid ~= "00000000" then + groups_off["not_in_creative_inventory"] = 1 + groups_off["not_in_craft_guide"] = 1 + end + + mesecon.register_node(":mesecons:wire_"..nodeid, { + description = S("Mesecon"), + drawtype = "nodebox", + inventory_image = "mesecons_wire_inv.png", + wield_image = "mesecons_wire_inv.png", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + selection_box = selectionbox, + node_box = nodebox, + walkable = false, + drop = "mesecons:wire_00000000_off", + mesecon_wire = true, + sounds = mesecon.node_sound.default, + on_rotate = false, + }, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off}, + {tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on}) + + if (nid_inc(nid) == false) then return end + end +end +register_wires() + +-- ############## +-- ## Crafting ## +-- ############## +-- (Resolve aliases to avoid bug with cooking/fuel recipes.) + +if minetest.registered_aliases["mesecons_gamecompat:mese_crystal_fragment"] then + minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 2", + recipe = minetest.registered_aliases["mesecons_gamecompat:mese_crystal_fragment"], + cooktime = 3, + }) +end + +if minetest.registered_aliases["mesecons_gamecompat:mese_crystal"] then + minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 18", + recipe = minetest.registered_aliases["mesecons_gamecompat:mese_crystal"], + cooktime = 15, + }) +end + +if minetest.registered_aliases["mesecons_gamecompat:mese"] then + minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 162", + recipe = minetest.registered_aliases["mesecons_gamecompat:mese"], + cooktime = 30, + }) +end diff --git a/mods/mesecons/mesecons_wires/locale/mesecons_wires.de.tr b/mods/mesecons/mesecons_wires/locale/mesecons_wires.de.tr new file mode 100644 index 00000000..02970994 --- /dev/null +++ b/mods/mesecons/mesecons_wires/locale/mesecons_wires.de.tr @@ -0,0 +1,2 @@ +# textdomain: mesecons_wires +Mesecon=Mesecon diff --git a/mods/mesecons/mesecons_wires/locale/mesecons_wires.eo.tr b/mods/mesecons/mesecons_wires/locale/mesecons_wires.eo.tr new file mode 100644 index 00000000..9fee95a0 --- /dev/null +++ b/mods/mesecons/mesecons_wires/locale/mesecons_wires.eo.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_wires + +### init.lua ### +Mesecon=Mesekonduktilo diff --git a/mods/mesecons/mesecons_wires/locale/mesecons_wires.fr.tr b/mods/mesecons/mesecons_wires/locale/mesecons_wires.fr.tr new file mode 100644 index 00000000..cc8386c2 --- /dev/null +++ b/mods/mesecons/mesecons_wires/locale/mesecons_wires.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_wires + +### init.lua ### +Mesecon=Mesecon diff --git a/mods/mesecons/mesecons_wires/locale/template.txt b/mods/mesecons/mesecons_wires/locale/template.txt new file mode 100644 index 00000000..82de311c --- /dev/null +++ b/mods/mesecons/mesecons_wires/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_wires + +### init.lua ### +Mesecon= diff --git a/mods/mesecons/mesecons_wires/mod.conf b/mods/mesecons/mesecons_wires/mod.conf new file mode 100644 index 00000000..abbdebe8 --- /dev/null +++ b/mods/mesecons/mesecons_wires/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_wires +depends = mesecons, mesecons_gamecompat diff --git a/mods/mesecons/modpack.conf b/mods/mesecons/modpack.conf new file mode 100644 index 00000000..2878aae6 --- /dev/null +++ b/mods/mesecons/modpack.conf @@ -0,0 +1,3 @@ +name = mesecons +description = Mod that implements a ton of items related to digital circuitry. +min_minetest_version = 5.0 diff --git a/mods/mesecons/screenshot.png b/mods/mesecons/screenshot.png new file mode 100644 index 00000000..aee3934d Binary files /dev/null and b/mods/mesecons/screenshot.png differ diff --git a/mods/mesecons/settingtypes.txt b/mods/mesecons/settingtypes.txt new file mode 100644 index 00000000..688baf29 --- /dev/null +++ b/mods/mesecons/settingtypes.txt @@ -0,0 +1,62 @@ +[mesecons] + +mesecon.resumetime (Startup delay) int 4 1 10 +mesecon.overheat_max (Device heat limit) int 20 1 100 +mesecon.cooldown_time (Device cooldown time) float 2.0 0.1 10.0 +mesecon.cooldown_granularity (Cooldown step length) float 0.5 0.0 1.0 + + +[mesecons_blinkyplant] + +mesecon.blinky_plant_interval (Plant blinking interval) int 3 1 5 + + +[mesecons_detector] + +mesecon.detector_radius (Player detector scanning radius) int 6 3 16 +mesecon.node_detector_distance_max (Node detector distance limit) int 10 1 16 + + +[mesecons_luacontroller] + +mesecon.luacontroller_string_rep_max (string:rep result length limit) int 64000 1000 1000000 +mesecon.luacontroller_digiline_maxlen (Digiline message size limit) int 50000 1000 1000000 +mesecon.luacontroller_maxevents (Controller execution time limit) int 10000 1000 100000 +mesecon.luacontroller_memsize (Controller memory limit) int 100000 10000 1000000 + +# Use node timer for interrupts (runs in active blocks only). +# IID is ignored and at most one interrupt may be queued if this setting is enabled. +mesecon.luacontroller_lightweight_interrupts (Lightweight interrupts) bool false + +# Behavior of print() inside a luacontroller. By default, this emits a message into actionstream. +# Set it to noop if you wish to disable that behavior. +mesecon.luacontroller_print_behavior (Behavior of print) enum log log,noop + +[mesecons_mvps] + +# In pre-existing world, MVPS may not be labelled with the owner. +# Protection handling for them is configurable. +# - normal: allow legacy MVPS to work in unprotected areas only +# - compat: allow legacy MVPS to work everywhere +# - ignore: allow all MVPS to work everywhere +# - restrict: disallow legacy MVPS +# Note that new unowned (e.g. machine-placed) MVPS are always +# handled as in `normal` mode. +mesecon.mvps_protection_mode (MVPS [movestones, pistons] protection handling) enum compat normal,compat,ignore,restrict + +[mesecons_movestones] + +mesecon.movestone_speed (Speed) int 3 1 10 +mesecon.movestone_max_push (Max push) int 50 1 100 +mesecon.movestone_max_pull (Max pull) int 50 1 100 + + +[mesecons_pistons] + +mesecon.piston_max_push (Max push) int 15 1 100 +mesecon.piston_max_pull (Max pull) int 15 1 100 + + +[mesecons_pressureplates] + +mesecon.pplate_interval (Check interval) float 0.1 0.1 1.0 diff --git a/mods/minetest_mtg_plus/README.md b/mods/minetest_mtg_plus/README.md index 8868a1e8..b6bc7969 100644 --- a/mods/minetest_mtg_plus/README.md +++ b/mods/minetest_mtg_plus/README.md @@ -7,7 +7,7 @@ The focus lies on: * Doors * Metals -Current version: 1.1.0 +Current version: 1.1.2 For Minetest/Minetest Game 5.1.0 or later ## Special stuff @@ -43,3 +43,6 @@ They are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-s * `mtg_plus_door_icesteel_open.ogg`: Derivate work of `door_steel_door_open.ogg` by HazMatt from Minetest Game, licensed under CC-BY 3.0 * Everything else is licensed under the MIT License. +### Translators +* German: Wuzzy +* French: Duvalon diff --git a/mods/minetest_mtg_plus/brickblocks.lua b/mods/minetest_mtg_plus/brickblocks.lua index 9df36dc9..ca4a0557 100644 --- a/mods/minetest_mtg_plus/brickblocks.lua +++ b/mods/minetest_mtg_plus/brickblocks.lua @@ -297,7 +297,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "default:snowblock 4", + output = "default:snowblock", recipe = { { "mtg_plus:snow_brick" } }, }) diff --git a/mods/minetest_mtg_plus/locale/mtg_plus.fr.tr b/mods/minetest_mtg_plus/locale/mtg_plus.fr.tr new file mode 100644 index 00000000..439bea8b --- /dev/null +++ b/mods/minetest_mtg_plus/locale/mtg_plus.fr.tr @@ -0,0 +1,245 @@ +# textdomain: mtg_plus + + +### awards.lua ### + +Build 100 papyrus blocks.=Contruit 100 bloc de papyrus. +Can't dig me!=Indestructible ! +Craft 100 goldwood.=Assemble 100 morceau de bois doré. +Craft 128 dense ice tiles.=Assemble 128 tuile de glace condensée. +Craft 4 small gold-framed diamond blocks.=Assemble 4 quatre petits blocs de diamant encadrés d'or. +Craft 400 cobbled gravel.=Assemble 400 pavés de gravier. +Craft 512 cobbled sandstone.=Assemble 512 pavés de grès. +Craft 512 jungle cobblestone.=Assemble 512 pavés de la jungle. +Green Jungle=Jungle pavée +Historic City=Ville historique +Ice Crazy=Fou de glace +Let's build an igloo!=Batissons un igloo! +Luxurious Adornment=Luxe ornemental +Papyrus Panic=Panique au papyrus +Place 225 hard snow bricks.=Mettre 225 briques de neige compactées. +Place a aggregated diamond block.=Mettre un agrégat de diamant. +Rich Carpenter=Carpentier riche +Yellow Desert=Désert pavé + +### brickblocks.lua ### + +Bronze Brick=Brique de bronze +Copper Brick=Brique de cuivre +Dense Ice Tile=Tuile de glace condensée +Desert Sandstone Brick with Golden Edges=Brique de grès du désert encadrée d'or +Desert Stone Brick with Golden Edges=Roche du désert encadrée d'or +Flint Block=Bloc de silex +Gold Brick=Brique d'or +Hard Snow Brick=Brique de neige compactée +Hardened Dirt Brick=Brique de terre durcie +Ice Block=Bloc de glace +Ice Brick=Brique de glace +Ice Tile=Tuile de glace +Icy Snow Brick=Brique de neige glacée +Obsidian Brick with Golden Edges=Brique d'obsidienne encadrée d'or +Papyrus Block=Bloc de papyrus +Sandstone Brick with Golden Edges=Brique de grès encadrée d'or +Silver Sandstone Brick with Golden Edges=Brique de grès argenté encadrée d'or +Small Gold-framed Diamond Block=Petit bloc de diamant encadré d'or +Soft Dirt Brick=Brique de terre +Soft Snow Brick=Brique de neige +Steel Brick=Brique d'acier +Stone Brick with Golden Edges=Brique de pierre encadrée d'or +Tin Brick=Brique d'étain + +### cobble.lua ### + +Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material.= + + +### cobble.lua ### +### extras.lua ### + +Cobbled Desert Sandstone=Pavé de grès du désert +Cobbled Gravel=Pavé de gravier +Cobbled Sandstone=Pavé de grès +Cobbled Silver Sandstone=Pavé de grès argenté +Jungle Cobblestone=Pavé de la jungle + +### doors.lua ### + +A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.=Une porte obstrue deux blocs d'espace vertical. Elle peut être ouverte et fermée par n'importe quel joueur. + +A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate.=Un portail de bois doré précieux. Il bloque le passage mais peut être ouvert et sauté par-dessus facilement. Les autres poteaux de clôture se joignent parfaitement à ce portail. + +An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless.=Une trappe de glace bouche un trou de plancher et peut être ouverte ou fermé par n'importe qui. La trappe solide mais translucide. + +An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless.=Une trappe d'acier gelé est une combinaison d'une trappe de glace et d'une d'acier. Elle bouche un trou de plancher et ne peut être ouverte et fermée que par son propriétaire. La trappe solide mais translucide. + +Goldwood Fence Gate=Portail de bois doré +Ice Door=Porte de glace +Ice Trapdoor=Trappe de glace + +Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas.=Les portes de glaces peuvent être ouvertes et fermeés. Elles laissent passer la lumière, et donc forme un élément de décoration intéressant dans les endroits glacés. + +Icy Steel Door=Porte d'acier gelée +Icy Steel Trapdoor=Trappe d'acier gelée + +Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through.=Les portes d'acier gelée combinent une porte d'acier et une porte de glace, lesquelles ne peuvent être ouvertes ou fermeés par leur propriétaire. Elles sont solides mais translucides. + +Papyrus Door=Porte de papyrus + +Point the door to see who owns it. Use the use key on the door to open or close it (if you own it).=Pointez sur la porte pour en connaître le propriétaire. Utilisez la clef sur la porte pour l'ouvrir ou fermer (si vous l'avez). + +Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it).=Pointez sur la trappe d'acier gelé pour en connaître le propriétaire. Utilisez la clef sur la porte pour l'ouvrir ou fermer (si vous l'avez). + +Right-click the gate to open or close it.=Clic droit sur le portillon pour l'ouvrir ou le fermer. +Use the use key on it to open or close it.=Utilisez la clef dessus pour l'ouvrir ou la fermer. +Wooden Bar Door=Porte de barreaux de bois + +### extras.lua ### + +Cobbled Desert Sandstone Stool=Tabouret en pavé de grès du désert +Cobbled Desert Sandstone Table=Table en pavé de grès du désert +Cobbled Gravel Stool=Tabouret en pavé de gravier +Cobbled Gravel Table=Table en pavé de gravier +Cobbled Sandstone Stool=Tabouret en pavé de grès +Cobbled Sandstone Table=Table en pavé de grès +Cobbled Silver Sandstone Stool=Tabouret en pavé de grès argenté +Cobbled Silver Sandstone Table=Table en pavé de grès argenté +Goldwood Chair=Chaise de bois doré +Goldwood Stool=Tabouret de bois doré +Goldwood Table=Table de bois doré +Jungle Cobblestone Stool=Tabouret en pavé de la jungle +Jungle Cobblestone Table=Table en pavé de la jungle + +### extras.lua ### +### specials.lua ### + +Goldwood=Bois doré + +### ladders.lua ### + +A luxurious piece of ladder which allows you to move vertically.= + +A particulary strong piece of ladder which allows you to move vertically.= + +A piece of ladder which allows you to move vertically.=Un morceau d'échelle qui permet de grimper. +Acacia Wood Ladder=Échelle d'acacia +Apple Wood Ladder=Échelle de pommier +Aspen Wood Ladder=Échelle de tremble +Bronze Ladder=Échelle de bronze +Copper Ladder=Échelle de cuivre +Golden Ladder=Échelle d'or +Goldwood Ladder=Échelle de bois doré +Jungle Wood Ladder=Échelle de bois de la jungle +Papyrus Ladder=Échelle de papyrus +Pine Wood Ladder=Échelle de pin +Tin Ladder=Échelle d'étain + +### seethrough.lua ### + +# textdomain:mtg_plus +A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through.= + +A ornamental and mostly transparent block, made by combining glass with gold.=Un bloc ornemental transparent, assemblé de verre et d'or. + +Dirty Glass=Verre sale +Goldglass=Verre doré +Ice Window=Fenêtre de glace + +This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window.=Cette pièce de glace décorative a été confectionnée pour ressemblé à une vrai fenêtre. + + +### specials.lua ### + +Aggregated Diamond Block=Agrégat de diamant + +Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance.=Le bois doré est un bois artificel précieux créé en injectant de l'or. Le bois doré est ininflammable et remarquable de son apparence jaune brillant. + +Gravel Dirt=Gravier terreux + +Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt.=Le gravier terreux est un mélange à parts égales de gravier et de terre. Il combine certaines propriétés des deux. + +This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block.=Ce bloc est encore plus endurci que le diamant ; même les pioches de diamant ne peuvent le faire craquer. Seul le TNT peut le détruire. + + +### stairslabs.lua ### + +Bronze Brick Slab=Dalle en brique de bronze +Bronze Brick Stair=Marche en brique de bronze +Cobbled Desert Sandstone Slab=Dalle en pavé de grès du désert +Cobbled Desert Sandstone Stair=Marche en pavé de grès du désert +Cobbled Gravel Slab=Dalle en pavé de gravier +Cobbled Gravel Stair=Marche en pavé de gravier +Cobbled Sandstone Slab=Dalle en pavé de grès +Cobbled Sandstone Stair=Marche en pavé de grès +Cobbled Silver Sandstone Slab=Dalle en pavé de grès argenté +Cobbled Silver Sandstone Stair=Marche en pavé de grès argenté +Copper Brick Slab=Dalle en brique de cuivre +Copper Brick Stair=Marche en brique de cuivre +Flint Block Slab=Dalle en silex +Flint Block Stair=Marche en silex +Gold Brick Slab=Dalle en brique d'or +Gold Brick Stair=Marche en brique d'or +Goldwood Slab=Dalle en bois doré +Goldwood Stair=Marche en bois doré +Hard Snow Brick Slab=Dalle en brique de neige compactée +Hard Snow Brick Stair=Marche en brique de neige compactée +Hardened Dirt Brick Slab=Dalle en terre durcie +Hardened Dirt Brick Stair=Marche en terre durcie +Ice Block Slab=Dalle de glace +Ice Block Stair=Marche de glace +Ice Brick Slab=Dalle en brique de glace +Ice Brick Stair=Marche en brique de glace +Ice Tile Slab=Dalle en tuile de glace +Ice Tile Stair=Marche en tuile de glace +Icy Snow Brick Slab=Dalle en brique de neige glacée +Icy Snow Brick Stair=Marche en brique de neige glacée +Jungle Cobblestone Slab=Dalle en pavé de la jungle +Jungle Cobblestone Stair=Marche en pavé de la jungle +Soft Snow Brick Slab=Dalle en brique de neige +Soft Snow Brick Stair=Marche en brique de neige +Steel Brick Slab=Dalle en brique d'acier +Steel Brick Stair=Marche en brique d'acier +Tin Brick Slab=Dalle en brique d'étain +Tin Brick Stair=Marche en brique d'étain + +### wallfences.lua ### + +A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.=Un morceau de mur sert de simple barrière qui s'agence aux blocs voisins. Vous pouvez sauter par dessus les murs. + +Cobbled Desert Sandstone Wall=Mur en pavé de grès du désert +Cobbled Gravel Wall=Mur en pavé de gravier +Cobbled Sandstone Wall=Mur en pavé de grès +Cobbled Silver Sandstone Wall=Mur en pavé de grès argenté +Dense Ice Tile Wall=Mur en tuile de glace condensée +Goldwood Fence=Barrière de bois doré +Goldwood Fence Rail=Clôture de bois doré +Jungle Cobblestone Wall=Mur en pavé de la jungle + +This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over.=Cette barrière est faite de bois doré précieux. Elle s'agence proprement aux blocs voisins, ce qui rend la construction de belle clôture simple. Il est possible de sauter par dessus. + +This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over.=Cette clôture est faite de bois doré précieux. Elle s'agence proprement aux blocs voisins, ce qui rend la construction de belle clôture simple. Il est possible de sauter par dessus. + +### xpanes.lua ### + +Golden Window=Fenêtre dorée + +Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them.=Les fenêtres dorées sont des blocs décoratifs qui penvent être placé dans des trous pour obtenir de jolies fenêtres. Elles s'agencent automatiquement avec leurs nœuds avoisiants durant la construction. + +Goldglass Pane=Panneau de verre doré + +Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them.=Les panneaux de verre dorés sont de mince couche de verre doré qui s'agencent bien avec leurs nœuds avoisiants durant la construction. + +Ice Window Pane=Panneau en verre de glace + +Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them=Les panneaux en verre de glace sont plus mince que les fenêtres complète et s'agencent bien avec leurs nœuds avoisiants durant la construction. + +Paper Barrier=Barrière de papier + +Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms.=Les barrières de papier sont de minces couches solides qui s'agencent bien avec leurs nœuds avoisiants durant la construction. Elles penvent être utiles pour séparer des pièces dans une bâtisse. + +Papyrus Lattice=Trellis de papyrus + +Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them.=Les trellis de papyrus sont forment des barrières solides et s'agencent bien avec leur nœuds avoisiants durant la construction. + +Wooden Bars=Barreaux de bois. + +Wooden bars are barriers which neatly connect to their neighbors as you build them.=Les barreaux de bois forment une cloison qui s'agencent bien avec leurs nœuds avoisiants durant la construction. diff --git a/mods/minetest_mtg_plus/specials.lua b/mods/minetest_mtg_plus/specials.lua index 8ec7035a..1a6153e8 100644 --- a/mods/minetest_mtg_plus/specials.lua +++ b/mods/minetest_mtg_plus/specials.lua @@ -48,7 +48,8 @@ minetest.register_node("mtg_plus:goldwood", { _doc_items_longdesc = S("Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance."), tiles = {"mtg_plus_goldwood.png"}, is_ground_content = false, - groups = {choppy = 2, wood = 1}, + -- Intentionally not part of the 'wood' group, so it can be used for crafting wood items or as fuel + groups = {choppy = 2}, sounds = default.node_sound_wood_defaults(), }) @@ -57,9 +58,3 @@ minetest.register_craft({ type = "shapeless", recipe = { "group:wood", "default:gold_ingot" }, }) - --- Prevent goldwood from being used as furnace fuel -minetest.clear_craft({ - type = "fuel", - recipe = "mtg_plus:goldwood", -}) diff --git a/mods/mob_horse/depends.txt b/mods/mob_horse/depends.txt deleted file mode 100644 index 5ccba0d8..00000000 --- a/mods/mob_horse/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mobs -lucky_block? -intllib? diff --git a/mods/mob_horse/init.lua b/mods/mob_horse/init.lua index f43dc010..024f18ff 100644 --- a/mods/mob_horse/init.lua +++ b/mods/mob_horse/init.lua @@ -1,18 +1,11 @@ --- Load support for intllib. +-- translation and get mod path + +local S = minetest.get_translator("mob_horse") local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" -local S = minetest.get_translator and minetest.get_translator("mob_horse") or - dofile(MP .. "intllib.lua") +-- horse shoes (speed, jump, brake/reverse speed, overlay texture) --- 0.4.17 or 5.0 check -local y_off = 20 -if minetest.features.object_independent_selectionbox then - y_off = 10 -end - - --- horse shoes (speed, jump, break, overlay texture) local shoes = { ["mobs:horseshoe_steel"] = {7, 4, 2, "mobs_horseshoe_steelo.png"}, ["mobs:horseshoe_bronze"] = {7, 4, 4, "mobs_horseshoe_bronzeo.png"}, @@ -21,8 +14,8 @@ local shoes = { ["mobs:horseshoe_crystal"] = {11, 6, 9, "mobs_horseshoe_crystalo.png"} } - -- rideable horse + mobs:register_mob("mob_horse:horse", { type = "animal", visual = "mesh", @@ -30,19 +23,12 @@ mobs:register_mob("mob_horse:horse", { mesh = "mobs_horse.x", collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, animation = { - speed_normal = 15, - speed_run = 30, - stand_start = 25, - stand_end = 50, -- 75 - stand2_start = 25, - stand2_end = 25, - stand3_start = 55, - stand3_end = 75, - stand3_loop = false, - walk_start = 75, - walk_end = 100, - run_start = 75, - run_end = 100 + speed_normal = 15, speed_run = 30, + stand_start = 25, stand_end = 50, -- 75 + stand2_start = 25, stand2_end = 25, + stand3_start = 55, stand3_end = 75, stand3_loop = false, + walk_start = 75, walk_end = 100, + run_start = 75, run_end = 100 }, textures = { {"mobs_horse.png"}, -- textures by Mjollna @@ -56,14 +42,15 @@ mobs:register_mob("mob_horse:horse", { view_range = 5, follow = { "farming:wheat", "default:apple", "farming:oat", - "farming:barley", "farming:corn"}, + "farming:barley", "farming:corn" + }, passive = true, hp_min = 12, hp_max = 16, armor = 200, lava_damage = 5, - fall_damage = 5, - water_damage = 1, + fall_damage = 1, + water_damage = 0, makes_footstep_sound = true, drops = { {name = "mobs:leather", chance = 1, min = 0, max = 2} @@ -78,8 +65,8 @@ mobs:register_mob("mob_horse:horse", { self.max_speed_reverse = 2 self.accel = 6 self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = y_off, z = -2} - self.driver_eye_offset = {x = 0, y = 3, z = 0} + self.driver_attach_at = {x = 0, y = 10, z = -2} + self.driver_eye_offset = {x = 0, y = 10 + 3, z = 0} self.driver_scale = {x = 0.8, y = 0.8} -- shrink driver to fit model end @@ -123,19 +110,13 @@ mobs:register_mob("mob_horse:horse", { on_rightclick = function(self, clicker) -- make sure player is clicking - if not clicker or not clicker:is_player() then - return - end + if not clicker or not clicker:is_player() then return end -- feed, tame or heal horse - if mobs:feed_tame(self, clicker, 10, true, true) then - return - end + if mobs:feed_tame(self, clicker, 10, true, true) then return end -- applying protection rune - if mobs:protect(self, clicker) then - return - end + if mobs:protect(self, clicker) then return end local player_name = clicker:get_player_name() @@ -155,14 +136,13 @@ mobs:register_mob("mob_horse:horse", { end -- attach saddle to horse - if not self.driver - and not self.child + if not self.driver and not self.child and clicker:get_wielded_item():get_name() == "mobs:saddle" and not self.saddle then self.saddle = true self.order = "stand" - self.object:set_properties({stepheight = 1.1}) + self.object:set_properties({stepheight = 1.2}) -- take saddle from inventory inv:remove_item("main", "mobs:saddle") @@ -195,6 +175,7 @@ mobs:register_mob("mob_horse:horse", { -- apply horseshoe overlay to current horse texture if overlay then + self.texture_mods = "^" .. overlay if self.saddle then @@ -227,10 +208,16 @@ mobs:register_mob("mob_horse:horse", { if self.saddle and self.owner == player_name then mobs.attach(self, clicker) end + end, +--[[ + on_sound = function(self, def) + if def.loudness > 0.8 then -- if loud enough startle horse into jumping + self.object:set_velocity({x = 0, y = 5, z = 0}) + end end +]] }) - -- check for custom spawn.lua local input = io.open(MP .. "spawn.lua", "r") @@ -252,11 +239,12 @@ else }) end +-- spawn egg mobs:register_egg("mob_horse:horse", S("Horse"), "wool_brown.png", 1) - -- steel horseshoes + minetest.register_craftitem(":mobs:horseshoe_steel", { description = S("Steel HorseShoes (use on horse to apply)"), inventory_image = "mobs_horseshoe_steel.png", @@ -272,6 +260,7 @@ minetest.register_craft({ }) -- bronze horseshoes + minetest.register_craftitem(":mobs:horseshoe_bronze", { description = S("Bronze HorseShoes (use on horse to apply)"), inventory_image = "mobs_horseshoe_bronze.png" @@ -287,6 +276,7 @@ minetest.register_craft({ }) -- mese horseshoes + minetest.register_craftitem(":mobs:horseshoe_mese", { description = S("Mese HorseShoes (use on horse to apply)"), inventory_image = "mobs_horseshoe_mese.png" @@ -302,6 +292,7 @@ minetest.register_craft({ }) -- diamond horseshoes + minetest.register_craftitem(":mobs:horseshoe_diamond", { description = S("Diamond HorseShoes (use on horse to apply)"), inventory_image = "mobs_horseshoe_diamond.png" @@ -317,34 +308,35 @@ minetest.register_craft({ }) -- crystal horseshoes + if minetest.get_modpath("ethereal") then -minetest.register_craftitem(":mobs:horseshoe_crystal", { - description = S("Crystal HorseShoes (use on horse to apply)"), - inventory_image = "mobs_horseshoe_crystal.png" -}) - -minetest.register_craft({ - output = "mobs:horseshoe_crystal", - recipe = { - {"", "ethereal:crystal_block", ""}, - {"ethereal:crystal_ingot", "", "ethereal:crystal_ingot"}, - {"ethereal:crystal_ingot", "", "ethereal:crystal_ingot"} - } -}) + minetest.register_craftitem(":mobs:horseshoe_crystal", { + description = S("Crystal HorseShoes (use on horse to apply)"), + inventory_image = "mobs_horseshoe_crystal.png" + }) + minetest.register_craft({ + output = "mobs:horseshoe_crystal", + recipe = { + {"", "ethereal:crystal_block", ""}, + {"ethereal:crystal_ingot", "", "ethereal:crystal_ingot"}, + {"ethereal:crystal_ingot", "", "ethereal:crystal_ingot"} + } + }) end - -- lucky blocks + if minetest.get_modpath("lucky_block") then -lucky_block:add_blocks({ - {"dro", {"mobs:horseshoe_steel"}}, - {"dro", {"mobs:horseshoe_bronze"}}, - {"dro", {"mobs:horseshoe_mese"}}, - {"dro", {"mobs:horseshoe_diamond"}}, - {"dro", {"mobs:horseshoe_crystal"}} -}) - + lucky_block:add_blocks({ + {"dro", {"mobs:horseshoe_steel"}}, + {"dro", {"mobs:horseshoe_bronze"}}, + {"dro", {"mobs:horseshoe_mese"}}, + {"dro", {"mobs:horseshoe_diamond"}}, + {"dro", {"mobs:horseshoe_crystal"}} + }) end + +print("[MOD] Mobs Redo Horse loaded") diff --git a/mods/mob_horse/intllib.lua b/mods/mob_horse/intllib.lua deleted file mode 100644 index 7decdf7d..00000000 --- a/mods/mob_horse/intllib.lua +++ /dev/null @@ -1,3 +0,0 @@ --- Support for the old multi-load method -return dofile(minetest.get_modpath("intllib").."/init.lua") - diff --git a/mods/mob_horse/locale/it_IT.po b/mods/mob_horse/locale/it_IT.po deleted file mode 100644 index 2b77850a..00000000 --- a/mods/mob_horse/locale/it_IT.po +++ /dev/null @@ -1,59 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-06 00:07+0800\n" -"PO-Revision-Date: 2020-05-11 13:43+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: Hamlet \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: it_IT\n" - -#: init.lua -msgid "Horse" -msgstr "Cavallo" - -#: init.lua -msgid "Horse shoes fitted -" -msgstr "Ferri di cavallo indossati -" - -#: init.lua -msgid " speed: " -msgstr " velocità: " - -#: init.lua -msgid " , jump height: " -msgstr " , altezza di salto: " - -#: init.lua -msgid " , stop speed: " -msgstr " , velocità di arresto: " - -#: init.lua -msgid "Horse shoes only work on horses!" -msgstr "I ferri di cavallo funzionano solo sui cavalli!" - -#: init.lua -msgid "Steel HorseShoes (use on horse to apply)" -msgstr "Ferri di cavallo d'acciaio (usarli su un cavallo per applicarli)" - -#: init.lua -msgid "Bronze HorseShoes (use on horse to apply)" -msgstr "Ferri di cavallo di bronzo (usarli su un cavallo per applicarli)" - -#: init.lua -msgid "Mese HorseShoes (use on horse to apply)" -msgstr "Ferri di cavallo di mese (usarli su un cavallo per applicarli)" - -#: init.lua -msgid "Diamond HorseShoes (use on horse to apply)" -msgstr "Ferri di cavallo di diamante (usarli su un cavallo per applicarli)" diff --git a/mods/mob_horse/locale/ms.po b/mods/mob_horse/locale/ms.po deleted file mode 100644 index fa76d1a8..00000000 --- a/mods/mob_horse/locale/ms.po +++ /dev/null @@ -1,59 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-06 00:07+0800\n" -"PO-Revision-Date: 2018-02-06 00:14+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: init.lua -msgid "Horse" -msgstr "Kuda" - -#: init.lua -msgid "Horse shoes fitted -" -msgstr "Ladam telah dipasang pada kuda -" - -#: init.lua -msgid " speed: " -msgstr " kelajuan: " - -#: init.lua -msgid " , jump height: " -msgstr " , ketinggian lompat: " - -#: init.lua -msgid " , stop speed: " -msgstr " , kelajuan berhenti: " - -#: init.lua -msgid "Horse shoes only work on horses!" -msgstr "Ladam hanya boleh dipakaikan pada kuda!" - -#: init.lua -msgid "Steel HorseShoes (use on horse to apply)" -msgstr "Ladam Kuda Keluli (guna pada kuda untuk pakaikan ia)" - -#: init.lua -msgid "Bronze HorseShoes (use on horse to apply)" -msgstr "Ladam Kuda Gangsa (guna pada kuda untuk pakaikan ia)" - -#: init.lua -msgid "Mese HorseShoes (use on horse to apply)" -msgstr "Ladam Kuda Mese (guna pada kuda untuk pakaikan ia)" - -#: init.lua -msgid "Diamond HorseShoes (use on horse to apply)" -msgstr "Ladam Kuda Intan (guna pada kuda untuk pakaikan ia)" diff --git a/mods/mob_horse/locale/template.pot b/mods/mob_horse/locale/template.pot deleted file mode 100644 index 7811c0ef..00000000 --- a/mods/mob_horse/locale/template.pot +++ /dev/null @@ -1,58 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-06 00:07+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Horse" -msgstr "" - -#: init.lua -msgid "Horse shoes fitted -" -msgstr "" - -#: init.lua -msgid " speed: " -msgstr "" - -#: init.lua -msgid " , jump height: " -msgstr "" - -#: init.lua -msgid " , stop speed: " -msgstr "" - -#: init.lua -msgid "Horse shoes only work on horses!" -msgstr "" - -#: init.lua -msgid "Steel HorseShoes (use on horse to apply)" -msgstr "" - -#: init.lua -msgid "Bronze HorseShoes (use on horse to apply)" -msgstr "" - -#: init.lua -msgid "Mese HorseShoes (use on horse to apply)" -msgstr "" - -#: init.lua -msgid "Diamond HorseShoes (use on horse to apply)" -msgstr "" diff --git a/mods/mob_horse/locale/zh_CN.pot b/mods/mob_horse/locale/zh_CN.pot deleted file mode 100644 index d09bedae..00000000 --- a/mods/mob_horse/locale/zh_CN.pot +++ /dev/null @@ -1,58 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-06 00:07+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Horse" -msgstr "马" - -#: init.lua -msgid "Horse shoes fitted -" -msgstr "马蹄铁 -" - -#: init.lua -msgid " speed: " -msgstr "速度:" - -#: init.lua -msgid " , jump height: " -msgstr ",跳跃高度" - -#: init.lua -msgid " , stop speed: " -msgstr ",停止速度:" - -#: init.lua -msgid "Horse shoes only work on horses!" -msgstr "马蹄铁只对马有效!" - -#: init.lua -msgid "Steel HorseShoes (use on horse to apply)" -msgstr "钢马蹄铁(用在马匹上)" - -#: init.lua -msgid "Bronze HorseShoes (use on horse to apply)" -msgstr "青铜马蹄铁(用在马匹上)" - -#: init.lua -msgid "Mese HorseShoes (use on horse to apply)" -msgstr "黄石马蹄铁(用在马匹上)" - -#: init.lua -msgid "Diamond HorseShoes (use on horse to apply)" -msgstr "钻石马蹄铁(用在马匹上)" diff --git a/mods/mob_horse/locale/zh_CN.txt b/mods/mob_horse/locale/zh_CN.txt deleted file mode 100644 index 783bd9b3..00000000 --- a/mods/mob_horse/locale/zh_CN.txt +++ /dev/null @@ -1,12 +0,0 @@ -#Mod: mob_horse - -Horse = 马 -Horse shoes fitted - = 马蹄铁 - - speed: = 速度: - , jump height: = ,跳跃高度: - , stop speed: = ,停止速度: -Horse shoes only work on horses! = 马蹄铁只对马有效! -Steel HorseShoes (use on horse to apply) = 钢马蹄铁(用在马匹上) -Bronze HorseShoes (use on horse to apply) = 青铜马蹄铁(用在马匹上) -Mese HorseShoes (use on horse to apply) = 黄石马蹄铁(用在马匹上) -Diamond HorseShoes (use on horse to apply) = 钻石马蹄铁(用在马匹上) diff --git a/mods/mob_horse/locale/zh_TW.txt b/mods/mob_horse/locale/zh_TW.txt deleted file mode 100644 index 3511d1d5..00000000 --- a/mods/mob_horse/locale/zh_TW.txt +++ /dev/null @@ -1,12 +0,0 @@ -#Mod: mob_horse - -Horse = 馬 -Horse shoes fitted - = 馬蹄鐵 - - speed: = 速度: - , jump height: = ,跳躍高度: - , stop speed: = ,停止速度: -Horse shoes only work on horses! = 馬蹄鐵只對馬有效! -Steel HorseShoes (use on horse to apply) = 鋼馬蹄鐵(用在馬匹上) -Bronze HorseShoes (use on horse to apply) = 青銅馬蹄鐵(用在馬匹上) -Mese HorseShoes (use on horse to apply) = 黃石馬蹄鐵(用在馬匹上) -Diamond HorseShoes (use on horse to apply) = 鑽石馬蹄鐵(用在馬匹上) diff --git a/mods/mob_horse/mod.conf b/mods/mob_horse/mod.conf index 31b31ba5..ac10eb59 100644 --- a/mods/mob_horse/mod.conf +++ b/mods/mob_horse/mod.conf @@ -1,4 +1,5 @@ name = mob_horse -depends = mobs -optional_depends = lucky_block, intllib description = Adds a rideable horse into game with horse shoe upgrades. +depends = mobs +optional_depends = lucky_block +min_minetest_version = 5.0 diff --git a/mods/mobs_animal/alt_textures/mobs_cheeseblock_32px.png b/mods/mobs_animal/alt_textures/mobs_cheeseblock_32px.png new file mode 100644 index 00000000..dfa7c189 Binary files /dev/null and b/mods/mobs_animal/alt_textures/mobs_cheeseblock_32px.png differ diff --git a/mods/mobs_animal/bee.lua b/mods/mobs_animal/bee.lua index 70e4d386..957abb4c 100644 --- a/mods/mobs_animal/bee.lua +++ b/mods/mobs_animal/bee.lua @@ -1,5 +1,5 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs_animal") -- Bee by KrupnoPavel (.b3d model by sirrobzeroone) @@ -12,19 +12,15 @@ mobs:register_mob("mobs_animal:bee", { collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.5, 0.2}, visual = "mesh", mesh = "mobs_bee.b3d", - textures = { - {"mobs_bee.png"}, - }, + textures = { {"mobs_bee.png"} }, blood_texture = "mobs_bee_inv.png", blood_amount = 1, makes_footstep_sound = false, - sounds = { - random = "mobs_bee", - }, + sounds = { random = "mobs_bee" }, walk_velocity = 1, jump = true, drops = { - {name = "mobs:honey", chance = 2, min = 1, max = 2}, + {name = "mobs:honey", chance = 2, min = 1, max = 2} }, water_damage = 1, lava_damage = 2, @@ -33,46 +29,56 @@ mobs:register_mob("mobs_animal:bee", { fall_speed = -3, animation = { speed_normal = 15, - stand_start = 0, - stand_end = 30, - walk_start = 35, - walk_end = 65, + stand_start = 0, stand_end = 30, + walk_start = 35, walk_end = 65 }, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 50, 90, 0, true, "mobs_animal:bee") end, + -- after_activate = function(self, staticdata, def, dtime) -- print ("------", self.name, dtime, self.health) -- end, }) +-- where to spawn + if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:bee", - nodes = {"group:flower"}, - min_light = 14, - interval = 60, - chance = 7000, - min_height = 3, - max_height = 200, - day_toggle = true, -}) + + mobs:spawn({ + name = "mobs_animal:bee", + nodes = {"group:flower"}, + min_light = 14, + interval = 60, + chance = 7000, + min_height = 3, + max_height = 200, + day_toggle = true + }) end +-- spawn egg + mobs:register_egg("mobs_animal:bee", S("Bee"), "mobs_bee_inv.png") --- compatibility +-- compatibility (only required if moving from old mobs to mobs_redo) + mobs:alias_mob("mobs:bee", "mobs_animal:bee") -- honey + minetest.register_craftitem(":mobs:honey", { description = S("Honey"), inventory_image = "mobs_honey_inv.png", on_use = minetest.item_eat(4), - groups = {food_honey = 1, food_sugar = 1, flammable = 1}, + groups = {food_honey = 1, food_sugar = 1} }) --- beehive (when placed spawns bee) +mobs.add_eatable("mobs:honey", 4) + +-- beehive (1 in 4 chance of spawning bee when placed) + minetest.register_node(":mobs:beehive", { description = S("Beehive"), drawtype = "plantlike", @@ -82,14 +88,16 @@ minetest.register_node(":mobs:beehive", { sunlight_propagates = true, walkable = true, groups = {oddly_breakable_by_hand = 3, flammable = 1, disable_suffocation = 1}, - sounds = default.node_sound_defaults(), + is_ground_content = false, + sounds = mobs.node_sound_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) + local gui_bg = default and default.gui_bg .. default.gui_bg_img .. default.gui_slots or "" meta:set_string("formspec", "size[8,6]" - ..default.gui_bg..default.gui_bg_img..default.gui_slots + .. gui_bg .. "image[3,0.8;0.8,0.8;mobs_bee_inv.png]" .. "list[current_name;beehive;4,0.5;1,1;]" .. "list[current_player;main;0,2.35;8,4;]" @@ -104,7 +112,7 @@ minetest.register_node(":mobs:beehive", { minetest.set_node(pos, {name = "mobs:beehive", param2 = 1}) - if math.random(1, 4) == 1 then + if math.random(4) == 1 then minetest.add_entity(pos, "mobs_animal:bee") end end @@ -113,41 +121,44 @@ minetest.register_node(":mobs:beehive", { on_punch = function(pos, node, puncher) -- yep, bee's don't like having their home punched by players - puncher:set_hp(puncher:get_hp() - 4) + minetest.after(0.2, function() + + local hp = puncher and puncher:get_hp() + + if hp then puncher:set_hp(hp - 4) end + end) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "beehive" then - return 0 - end + if listname == "beehive" then return 0 end return stack:get_count() end, - can_dig = function(pos,player) + can_dig = function(pos,player) -- can only dig when no honey inside local meta = minetest.get_meta(pos) - -- only dig beehive if no honey inside return meta:get_inventory():is_empty("beehive") - end, - + end }) +-- beehive recipe + minetest.register_craft({ output = "mobs:beehive", - recipe = { - {"mobs:bee","mobs:bee","mobs:bee"}, - } + recipe = {{"mobs:bee","mobs:bee","mobs:bee"}} }) --- honey block +-- honey block and craft recipes + minetest.register_node(":mobs:honey_block", { description = S("Honey Block"), tiles = {"mobs_honey_block.png"}, groups = {snappy = 3, flammable = 2}, - sounds = default.node_sound_dirt_defaults(), + is_ground_content = false, + sounds = mobs.node_sound_dirt_defaults() }) minetest.register_craft({ @@ -155,48 +166,42 @@ minetest.register_craft({ recipe = { {"mobs:honey", "mobs:honey", "mobs:honey"}, {"mobs:honey", "mobs:honey", "mobs:honey"}, - {"mobs:honey", "mobs:honey", "mobs:honey"}, + {"mobs:honey", "mobs:honey", "mobs:honey"} } }) minetest.register_craft({ output = "mobs:honey 9", recipe = { - {"mobs:honey_block"}, + {"mobs:honey_block"} } }) -- beehive workings + minetest.register_abm({ nodenames = {"mobs:beehive"}, interval = 12, chance = 6, catch_up = false, + action = function(pos, node) -- bee's only make honey during the day local tod = (minetest.get_timeofday() or 0) * 24000 - if tod < 5500 or tod > 18500 then - return - end + if tod < 5500 or tod > 18500 then return end - -- is hive full? - local meta = minetest.get_meta(pos) - if not meta then return end -- for older beehives + local meta = minetest.get_meta(pos) ; if not meta then return end local inv = meta:get_inventory() local honey = inv:get_stack("beehive", 1):get_count() - -- is hive full? - if honey > 11 then - return - end + if honey > 11 then return end -- return if hive full -- no flowers no honey, nuff said! if #minetest.find_nodes_in_area_under_air( - {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, - {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, - "group:flower") > 3 then + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, "group:flower") > 3 then inv:add_item("beehive", "mobs:honey") end diff --git a/mods/mobs_animal/bunny.lua b/mods/mobs_animal/bunny.lua index aaff5600..be7c3f7f 100644 --- a/mods/mobs_animal/bunny.lua +++ b/mods/mobs_animal/bunny.lua @@ -1,25 +1,24 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Bunny by ExeterDad mobs:register_mob("mobs_animal:bunny", { -stepheight = 0.6, type = "animal", passive = true, reach = 1, + stepheight = 0.6, hp_min = 1, hp_max = 4, armor = 200, - collisionbox = {-0.268, -0.5, -0.268, 0.268, 0.167, 0.268}, + collisionbox = {-0.268, -0.5, -0.268, 0.268, 0.167, 0.268}, visual = "mesh", mesh = "mobs_bunny.b3d", drawtype = "front", textures = { {"mobs_bunny_grey.png"}, {"mobs_bunny_brown.png"}, - {"mobs_bunny_white.png"}, + {"mobs_bunny_white.png"} }, sounds = {}, makes_footstep_sound = false, @@ -31,26 +30,24 @@ stepheight = 0.6, jump_height = 6, drops = { {name = "mobs:rabbit_raw", chance = 1, min = 1, max = 1}, - {name = "mobs:rabbit_hide", chance = 1, min = 0, max = 1}, + {name = "mobs:rabbit_hide", chance = 1, min = 0, max = 1} }, - water_damage = 0, + water_damage = 0.01, lava_damage = 4, light_damage = 0, fear_height = 2, animation = { speed_normal = 15, - stand_start = 1, - stand_end = 15, - walk_start = 16, - walk_end = 24, - punch_start = 16, - punch_end = 24, + stand_start = 1, stand_end = 15, + walk_start = 16, walk_end = 24, + punch_start = 16, punch_end = 24 }, follow = {"farming:carrot", "farming_plus:carrot_item", "default:grass_1"}, view_range = 8, replace_rate = 10, replace_what = {"farming:carrot_7", "farming:carrot_8", "farming_plus:carrot"}, replace_with = "air", + on_rightclick = function(self, clicker) -- feed or tame @@ -60,25 +57,43 @@ stepheight = 0.6, -- Monty Python tribute local item = clicker:get_wielded_item() + local player_name = clicker:get_player_name() - if item:get_name() == "mobs:lava_orb" then + if self.owner == player_name + and item:get_name() == "mobs:lava_orb" then + -- take orb if not mobs.is_creative(clicker:get_player_name()) then item:take_item() clicker:set_wielded_item(item) end - self.object:set_properties({ - textures = {"mobs_bunny_evil.png"}, + -- set special bunny attributes + local staticdata = minetest.serialize({ + type = "monster", + attack_type = "dogfight", + health = 20, + damage = 5, + run_velocity = 3, + passive = false, + runaway = false, + runaway_from = {}, + runaway_timer = 0, + tamed = false, + base_texture = {"mobs_bunny_evil.png"} }) - self.type = "monster" - self.health = 20 - self.passive = false + -- add evil bunny + local obj = minetest.add_entity( + self.object:get_pos(), "mobs_animal:bunny", staticdata) - return + obj:set_properties({textures = {"mobs_bunny_evil.png"}, hp_max = 20}) + + -- remove old bunny + if obj:get_luaentity() then mobs:remove(self, true) end end end, + on_spawn = function(self) local pos = self.object:get_pos() ; pos.y = pos.y - 1 @@ -88,11 +103,13 @@ stepheight = 0.6, {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then self.base_texture = {"mobs_bunny_white.png"} self.object:set_properties({textures = self.base_texture}) + -- brown desert bunny elseif minetest.find_node_near(pos, 1, {"default:desert_sand", "default:desert_stone"}) then self.base_texture = {"mobs_bunny_brown.png"} self.object:set_properties({textures = self.base_texture}) + -- grey stone bunny elseif minetest.find_node_near(pos, 1, {"default:stone", "default:gravel"}) then @@ -101,78 +118,81 @@ stepheight = 0.6, end return true -- run only once, false/nil runs every activation - end, - attack_type = "dogfight", - damage = 5, + end }) - -local spawn_on = "default:dirt_with_grass" - -if minetest.get_modpath("ethereal") then - spawn_on = "ethereal:prairie_dirt" -end +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:bunny", - nodes = {spawn_on}, - neighbors = {"group:grass"}, - min_light = 14, - interval = 60, - chance = 8000, -- 15000 - min_height = 5, - max_height = 200, - day_toggle = true, -}) + + local spawn_on = "default:dirt_with_grass" + + if minetest.get_modpath("ethereal") then + spawn_on = "ethereal:prairie_dirt" + end + + mobs:spawn({ + name = "mobs_animal:bunny", + nodes = {spawn_on}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 5, + max_height = 200, + day_toggle = true + }) end +-- spawn egg mobs:register_egg("mobs_animal:bunny", S("Bunny"), "mobs_bunny_inv.png", 0) +-- compatibility (only used for older mobs compatibility) -mobs:alias_mob("mobs:bunny", "mobs_animal:bunny") -- compatibility - +mobs:alias_mob("mobs:bunny", "mobs_animal:bunny") -- raw rabbit + minetest.register_craftitem(":mobs:rabbit_raw", { description = S("Raw Rabbit"), inventory_image = "mobs_rabbit_raw.png", on_use = minetest.item_eat(3), - groups = {food_meat_raw = 1, food_rabbit_raw = 1, flammable = 2}, + groups = {food_meat_raw = 1, food_rabbit_raw = 1} }) +mobs.add_eatable("mobs:rabbit_raw", 3) + -- cooked rabbit + minetest.register_craftitem(":mobs:rabbit_cooked", { description = S("Cooked Rabbit"), inventory_image = "mobs_rabbit_cooked.png", on_use = minetest.item_eat(5), - groups = {food_meat = 1, food_rabbit = 1, flammable = 2}, + groups = {food_meat = 1, food_rabbit = 1} }) +mobs.add_eatable("mobs:rabbit_cooked", 5) + minetest.register_craft({ type = "cooking", output = "mobs:rabbit_cooked", recipe = "mobs:rabbit_raw", - cooktime = 5, + cooktime = 5 }) --- rabbit hide +-- rabbit hide and recipes + minetest.register_craftitem(":mobs:rabbit_hide", { description = S("Rabbit Hide"), inventory_image = "mobs_rabbit_hide.png", - groups = {flammable = 2, pelt = 1}, + groups = {flammable = 2, pelt = 1} }) -minetest.register_craft({ - type = "fuel", - recipe = "mobs:rabbit_hide", - burntime = 2, -}) +minetest.register_craft({type = "fuel", recipe = "mobs:rabbit_hide", burntime = 2}) minetest.register_craft({ output = "mobs:leather", --- type = "shapeless", recipe = { {"mobs:rabbit_hide", "mobs:rabbit_hide"}, {"mobs:rabbit_hide", "mobs:rabbit_hide"} diff --git a/mods/mobs_animal/chicken.lua b/mods/mobs_animal/chicken.lua index 061f3ba5..ada4b5ad 100644 --- a/mods/mobs_animal/chicken.lua +++ b/mods/mobs_animal/chicken.lua @@ -1,11 +1,10 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Chicken by JK Murray and Sirrobzeroone mobs:register_mob("mobs_animal:chicken", { -stepheight = 0.6, + stepheight = 0.6, type = "animal", passive = true, hp_min = 5, @@ -17,14 +16,13 @@ stepheight = 0.6, textures = { {"mobs_chicken.png"}, -- white {"mobs_chicken_brown.png"}, - {"mobs_chicken_black.png"}, - }, - child_texture = { - {"mobs_chick.png"}, + {"mobs_chicken_black.png"} }, + child_texture = {{"mobs_chick.png"}}, makes_footstep_sound = true, sounds = { random = "mobs_chicken", + replace = "default_dig_crumbly" }, walk_velocity = 1, run_velocity = 3, @@ -32,7 +30,7 @@ stepheight = 0.6, runaway_from = {"player", "mobs_animal:pumba"}, drops = { {name = "mobs:chicken_raw", chance = 1, min = 1, max = 1}, - {name = "mobs:chicken_feather", chance = 1, min = 0, max = 2}, + {name = "mobs:chicken_feather", chance = 1, min = 0, max = 2} }, water_damage = 1, lava_damage = 5, @@ -42,24 +40,30 @@ stepheight = 0.6, fear_height = 5, animation = { speed_normal = 15, - stand_start = 1, - stand_end = 30, - stand_speed = 28, - stand1_start = 31, - stand1_end = 70, - stand1_speed = 32, - walk_start = 71, - walk_end = 90, - walk_speed = 24, - run_start = 91, - run_end = 110, - run_speed = 24, + stand_start = 1, stand_end = 30, stand_speed = 28, + stand1_start = 31, stand1_end = 70, stand1_speed = 32, + walk_start = 71, walk_end = 90, walk_speed = 24, + run_start = 91, run_end = 110, run_speed = 24 }, follow = { "farming:seed_wheat", "farming:seed_cotton", "farming:seed_barley", - "farming:seed_oat", "farming:seed_rye" + "farming:seed_oat", "farming:seed_rye", "farming:seed_rice", + "farming:seed_hemp", "farming:seed_sunflower", "farming:seed_mint" }, view_range = 5, + replace_rate = 5, + replace_what = { + {"farming:seed_wheat", "air", 0}, + {"farming:seed_cotton", "air", 0}, + {"farming:seed_barley", "air", 0}, + {"farming:seed_oat", "air", 0}, + {"farming:seed_rye", "air", 0}, + {"farming:seed_rice", "air", 0}, + {"farming:seed_hemp", "air", 0}, + {"farming:seed_mint", "air", 0}, + {"farming:seed_sunflower", "air", 0} + }, + stay_near = {{"group:seed"}, 7}, on_rightclick = function(self, clicker) @@ -71,118 +75,115 @@ stepheight = 0.6, do_custom = function(self, dtime) self.egg_timer = (self.egg_timer or 0) + dtime - if self.egg_timer < 10 then - return - end + if self.egg_timer < 10 then return end self.egg_timer = 0 - if self.child - or math.random(1, 100) > 1 then - return - end + if self.child then return end local pos = self.object:get_pos() ; if not pos then return end - minetest.add_item(pos, "mobs:egg") + if math.random(100) == 1 then - minetest.sound_play("default_place_node_hard", { - pos = pos, - gain = 1.0, - max_hear_distance = 5, - }) - end, + minetest.add_item(pos, "mobs:egg") + + minetest.sound_play("default_place_node_hard", + {pos = pos, gain = 1.0, max_hear_distance = 5}, true) + + elseif math.random(100) < 3 then + minetest.add_item(pos, "mobs:chicken_feather") + end + end }) - -local spawn_on = {"default:dirt_with_grass"} - -if minetest.get_modpath("ethereal") then - spawn_on = {"ethereal:bamboo_dirt", "ethereal:prairie_dirt"} -end - +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:chicken", - nodes = spawn_on, - neighbors = {"group:grass"}, - min_light = 14, - interval = 60, - chance = 8000, -- 15000 - min_height = 5, - max_height = 200, - day_toggle = true, -}) + + local spawn_on = {"default:dirt_with_grass"} + + if minetest.get_modpath("ethereal") then + spawn_on = {"ethereal:bamboo_dirt", "ethereal:prairie_dirt"} + end + + mobs:spawn({ + name = "mobs_animal:chicken", + nodes = spawn_on, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 5, + max_height = 200, + day_toggle = true + }) end +-- spawn egg mobs:register_egg("mobs_animal:chicken", S("Chicken"), "mobs_chicken_inv.png", 0) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:chicken", "mobs_animal:chicken") -- compatibility - +mobs:alias_mob("mobs:chicken", "mobs_animal:chicken") -- egg entity mobs:register_arrow("mobs_animal:egg_entity", { visual = "sprite", - visual_size = {x=.5, y=.5}, + visual_size = {x = .5, y = .5}, textures = {"mobs_chicken_egg.png"}, velocity = 6, hit_player = function(self, player) + player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 1}, + damage_groups = {fleshy = 1} }, nil) end, hit_mob = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 1}, + damage_groups = {fleshy = 1} }, nil) end, hit_node = function(self, pos, node) - if math.random(10) > 1 then - return - end + if math.random(10) > 1 then return end pos.y = pos.y + 1 local nod = minetest.get_node_or_nil(pos) - if not nod - or not minetest.registered_nodes[nod.name] + if not nod or not minetest.registered_nodes[nod.name] or minetest.registered_nodes[nod.name].walkable == true then return end - local staticdata = minetest.serialize( - {child = true, tamed = true, owner = self.playername}) - - minetest.add_entity(pos, "mobs_animal:chicken", staticdata) + mobs:add_mob(pos, { + name = "mobs_animal:chicken", + child = true, + owner = self.playername, +-- nametag = "Chicky", + ignore_count = true -- ignores mob count per map area + }) end }) - --- egg throwing item +-- egg throwing function local egg_GRAVITY = 9 local egg_VELOCITY = 19 --- shoot egg local mobs_shoot_egg = function (item, player, pointed_thing) local playerpos = player:get_pos() - minetest.sound_play("default_place_node_hard", { - pos = playerpos, - gain = 1.0, - max_hear_distance = 5, - }) + minetest.sound_play("default_place_node_hard", + {pos = playerpos, gain = 1.0, max_hear_distance = 5}, true) local obj = minetest.add_entity({ x = playerpos.x, @@ -198,16 +199,10 @@ local mobs_shoot_egg = function (item, player, pointed_thing) ent._is_arrow = true -- tell advanced mob protection this is an arrow obj:set_velocity({ - x = dir.x * egg_VELOCITY, - y = dir.y * egg_VELOCITY, - z = dir.z * egg_VELOCITY - }) + x = dir.x * egg_VELOCITY, y = dir.y * egg_VELOCITY, z = dir.z * egg_VELOCITY}) obj:set_acceleration({ - x = dir.x * -3, - y = -egg_GRAVITY, - z = dir.z * -3 - }) + x = dir.x * -3, y = -egg_GRAVITY, z = dir.z * -3}) -- pass player name to egg for chick ownership local ent2 = obj:get_luaentity() @@ -219,8 +214,8 @@ local mobs_shoot_egg = function (item, player, pointed_thing) return item end - -- egg + minetest.register_node(":mobs:egg", { description = S("Chicken Egg"), tiles = {"mobs_chicken_egg.png"}, @@ -230,67 +225,73 @@ minetest.register_node(":mobs:egg", { wield_image = "mobs_chicken_egg.png", paramtype = "light", walkable = false, - is_ground_content = true, + is_ground_content = false, sunlight_propagates = true, selection_box = { type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} }, groups = {food_egg = 1, snappy = 2, dig_immediate = 3}, + sounds = mobs.node_sound_defaults(), + after_place_node = function(pos, placer, itemstack) - if placer:is_player() then - minetest.set_node(pos, {name = "mobs:egg", param2 = 1}) - end + minetest.set_node(pos, {name = "mobs:egg", param2 = 1}) end, + on_use = mobs_shoot_egg }) +-- fried egg and recipe --- fried egg minetest.register_craftitem(":mobs:chicken_egg_fried", { description = S("Fried Egg"), inventory_image = "mobs_chicken_egg_fried.png", on_use = minetest.item_eat(2), - groups = {food_egg_fried = 1, flammable = 2}, + groups = {food_egg_fried = 1} }) +mobs.add_eatable("mobs:chicken_egg_fried", 2) + minetest.register_craft({ type = "cooking", recipe = "mobs:egg", - output = "mobs:chicken_egg_fried", + output = "mobs:chicken_egg_fried" }) -- raw chicken + minetest.register_craftitem(":mobs:chicken_raw", { -description = S("Raw Chicken"), + description = S("Raw Chicken"), inventory_image = "mobs_chicken_raw.png", on_use = minetest.item_eat(2), - groups = {food_meat_raw = 1, food_chicken_raw = 1, flammable = 2}, + groups = {food_meat_raw = 1, food_chicken_raw = 1} }) --- cooked chicken +mobs.add_eatable("mobs:chicken_raw", 2) + +-- cooked chicken and recipe + minetest.register_craftitem(":mobs:chicken_cooked", { -description = S("Cooked Chicken"), + description = S("Cooked Chicken"), inventory_image = "mobs_chicken_cooked.png", on_use = minetest.item_eat(6), - groups = {food_meat = 1, food_chicken = 1, flammable = 2}, + groups = {food_meat = 1, food_chicken = 1} }) +mobs.add_eatable("mobs:chicken_cooked", 6) + minetest.register_craft({ type = "cooking", recipe = "mobs:chicken_raw", - output = "mobs:chicken_cooked", + output = "mobs:chicken_cooked" }) --- feather +-- feather and fuel + minetest.register_craftitem(":mobs:chicken_feather", { description = S("Feather"), inventory_image = "mobs_chicken_feather.png", - groups = {flammable = 2, feather = 1}, + groups = {flammable = 2, feather = 1} }) -minetest.register_craft({ - type = "fuel", - recipe = "mobs:chicken_feather", - burntime = 1, -}) +minetest.register_craft({type = "fuel", recipe = "mobs:chicken_feather", burntime = 1}) diff --git a/mods/mobs_animal/cow.lua b/mods/mobs_animal/cow.lua index bcb75f68..bc654443 100644 --- a/mods/mobs_animal/cow.lua +++ b/mods/mobs_animal/cow.lua @@ -1,6 +1,5 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Cow by sirrobzeroone @@ -19,11 +18,12 @@ mobs:register_mob("mobs_animal:cow", { mesh = "mobs_cow.b3d", textures = { {"mobs_cow.png"}, - {"mobs_cow2.png"}, + {"mobs_cow2.png"} }, makes_footstep_sound = true, sounds = { random = "mobs_cow", + replace = "default_dig_crumbly" }, walk_velocity = 1, run_velocity = 2, @@ -32,31 +32,18 @@ mobs:register_mob("mobs_animal:cow", { pushable = true, drops = { {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - {name = "mobs:leather", chance = 1, min = 0, max = 2}, + {name = "mobs:leather", chance = 1, min = 0, max = 2} }, - water_damage = 0, + water_damage = 0.01, lava_damage = 5, light_damage = 0, animation = { - stand_start = 0, - stand_end = 30, - stand_speed = 20, - stand1_start = 35, - stand1_end = 75, - stand1_speed = 20, - walk_start = 85, - walk_end = 114, - walk_speed = 20, - run_start = 120, - run_end = 140, - run_speed = 30, - punch_start = 145, - punch_end = 160, - punch_speed = 20, - die_start = 165, - die_end = 185, - die_speed = 10, - die_loop = false, + stand_start = 0, stand_end = 30, stand_speed = 20, + stand1_start = 35, stand1_end = 75, stand1_speed = 20, + walk_start = 85, walk_end = 114, walk_speed = 20, + run_start = 120, run_end = 140, run_speed = 30, + punch_start = 145, punch_end = 160, punch_speed = 20, + die_start = 165, die_end = 185, die_speed = 10, die_loop = false }, follow = { "farming:wheat", "default:grass_1", "farming:barley", @@ -70,15 +57,14 @@ mobs:register_mob("mobs_animal:cow", { }, -- stay_near = {{"farming:straw", "group:grass"}, 10}, fear_height = 2, + on_rightclick = function(self, clicker) -- feed or tame if mobs:feed_tame(self, clicker, 8, true, true) then -- if fed 7x wheat or grass then cow can be milked again - if self.food and self.food > 6 then - self.gotten = false - end + if self.food and self.food > 6 then self.gotten = false end return end @@ -88,18 +74,19 @@ mobs:register_mob("mobs_animal:cow", { local tool = clicker:get_wielded_item() local name = clicker:get_player_name() + local item = tool:get_name() -- milk cow with empty bucket - if tool:get_name() == "bucket:bucket_empty" then + if item == "bucket:bucket_empty" + or item == "wooden_bucket:bucket_wood_empty" + or item == "bucket_wooden:bucket_empty" then - --if self.gotten == true - if self.child == true then - return - end + if self.child == true then return end if self.gotten == true then - minetest.chat_send_player(name, - S("Cow already milked!")) + + minetest.chat_send_player(name, S("Cow already milked!")) + return end @@ -108,12 +95,22 @@ mobs:register_mob("mobs_animal:cow", { tool:take_item() clicker:set_wielded_item(tool) - if inv:room_for_item("main", {name = "mobs:bucket_milk"}) then - clicker:get_inventory():add_item("main", "mobs:bucket_milk") + -- which bucket are we using + local ret_item = "mobs:bucket_milk" + + if item == "wooden_bucket:bucket_wood_empty" + or item == "bucket_wooden:bucket_empty" then + ret_item = "mobs:wooden_bucket_milk" + end + + if inv:room_for_item("main", {name = ret_item}) then + clicker:get_inventory():add_item("main", ret_item) else local pos = self.object:get_pos() + pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = "mobs:bucket_milk"}) + + minetest.add_item(pos, {name = ret_item}) end self.gotten = true -- milked @@ -126,66 +123,71 @@ mobs:register_mob("mobs_animal:cow", { self.food = (self.food or 0) + 1 - -- if cow replaces 8x grass then it can be milked again - if self.food >= 8 then + if self.food >= 8 then -- replace 8x grass and can be milked again self.food = 0 self.gotten = false end - end, + end }) +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:cow", - nodes = {"default:dirt_with_grass", "ethereal:green_dirt"}, - neighbors = {"group:grass"}, - min_light = 14, - interval = 60, - chance = 8000, -- 15000 - min_height = 5, - max_height = 200, - day_toggle = true, -}) + + mobs:spawn({ + name = "mobs_animal:cow", + nodes = {"default:dirt_with_grass", "ethereal:green_dirt"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 5, + max_height = 200, + day_toggle = true + }) end +-- spawn egg mobs:register_egg("mobs_animal:cow", S("Cow"), "mobs_cow_inv.png") +-- old mobs mod compatibility -mobs:alias_mob("mobs:cow", "mobs_animal:cow") -- compatibility - +mobs:alias_mob("mobs:cow", "mobs_animal:cow") -- bucket of milk + minetest.register_craftitem(":mobs:bucket_milk", { description = S("Bucket of Milk"), inventory_image = "mobs_bucket_milk.png", stack_max = 1, on_use = minetest.item_eat(8, "bucket:bucket_empty"), - groups = {food_milk = 1, flammable = 3, drink = 1}, + groups = {food_milk = 1, drink = 1} }) --- glass of milk +mobs.add_eatable("mobs:bucket_milk", 8) + +-- glass of milk and recipes minetest.register_craftitem(":mobs:glass_milk", { description = S("Glass of Milk"), inventory_image = "mobs_glass_milk.png", on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = {food_milk_glass = 1, flammable = 3, vessel = 1, drink = 1}, + groups = {food_milk_glass = 1, vessel = 1, drink = 1} }) +mobs.add_eatable("mobs:glass_milk", 2) + minetest.register_craft({ --- type = "shapeless", output = "mobs:glass_milk 4", recipe = { {"vessels:drinking_glass", "vessels:drinking_glass"}, {"vessels:drinking_glass", "vessels:drinking_glass"}, {"mobs:bucket_milk", ""} }, - replacements = { {"mobs:bucket_milk", "bucket:bucket_empty"} } + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) minetest.register_craft({ --- type = "shapeless", output = "mobs:bucket_milk", recipe = { {"group:food_milk_glass", "group:food_milk_glass"}, @@ -197,54 +199,56 @@ minetest.register_craft({ } }) +-- butter and recipe --- butter minetest.register_craftitem(":mobs:butter", { description = S("Butter"), inventory_image = "mobs_butter.png", on_use = minetest.item_eat(1), - groups = {food_butter = 1, flammable = 2} + groups = {food_butter = 1} }) +mobs.add_eatable("mobs:butter", 1) + +local salt_item = "default:sapling" -- some saplings are high in sodium + if minetest.get_modpath("farming") and farming and farming.mod then -minetest.register_craft({ - type = "shapeless", - output = "mobs:butter", - recipe = {"mobs:bucket_milk", "farming:salt"}, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} -}) -else -- some saplings are high in sodium so makes a good replacement item -minetest.register_craft({ - type = "shapeless", - output = "mobs:butter", - recipe = {"mobs:bucket_milk", "default:sapling"}, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} -}) + salt_item = "farming:salt" end --- cheese wedge +minetest.register_craft({ + output = "mobs:butter", + recipe = {{"mobs:bucket_milk", salt_item}}, + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} +}) + +-- cheese wedge and recipe + minetest.register_craftitem(":mobs:cheese", { description = S("Cheese"), inventory_image = "mobs_cheese.png", on_use = minetest.item_eat(4), - groups = {food_cheese = 1, flammable = 2}, + groups = {food_cheese = 1} }) +mobs.add_eatable("mobs:cheese", 4) + minetest.register_craft({ type = "cooking", output = "mobs:cheese", recipe = "mobs:bucket_milk", cooktime = 5, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) --- cheese block +-- cheese block and recipe + minetest.register_node(":mobs:cheeseblock", { description = S("Cheese Block"), tiles = {"mobs_cheeseblock.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 3}, - sounds = default.node_sound_dirt_defaults() + sounds = mobs.node_sound_dirt_defaults() }) minetest.register_craft({ @@ -252,13 +256,58 @@ minetest.register_craft({ recipe = { {"group:food_cheese", "group:food_cheese", "group:food_cheese"}, {"group:food_cheese", "group:food_cheese", "group:food_cheese"}, - {"group:food_cheese", "group:food_cheese", "group:food_cheese"}, + {"group:food_cheese", "group:food_cheese", "group:food_cheese"} } }) minetest.register_craft({ output = "mobs:cheese 9", - recipe = { - {"mobs:cheeseblock"}, - } + recipe = {{"mobs:cheeseblock"}} }) + +-- check for either of the wood bucket mods and add compatibility + +local wb = minetest.get_modpath("wooden_bucket") +local bw = minetest.get_modpath("bucket_wooden") + +if wb or bw then + + local return_item = wb and "wooden_bucket:bucket_wood_empty" + or "bucket_wooden:bucket_empty" + + minetest.register_craftitem(":mobs:wooden_bucket_milk", { + description = S("Wooden Bucket of Milk"), + inventory_image = "mobs_wooden_bucket_milk.png", + stack_max = 1, + on_use = minetest.item_eat(8, return_item), + groups = {food_milk = 1, flammable = 3, drink = 1} + }) + + minetest.register_craft({ + output = "mobs:glass_milk 4", + recipe = { + {"vessels:drinking_glass", "vessels:drinking_glass"}, + {"vessels:drinking_glass", "vessels:drinking_glass"}, + {"mobs:wooden_bucket_milk", ""} + }, + replacements = {{"mobs:wooden_bucket_milk", return_item}} + }) + + minetest.register_craft({ + output = "mobs:wooden_bucket_milk", + recipe = { + {"group:food_milk_glass", "group:food_milk_glass"}, + {"group:food_milk_glass", "group:food_milk_glass"}, + {return_item, ""} + }, + replacements = { + {"group:food_milk_glass", "vessels:drinking_glass 4"} + } + }) + + minetest.register_craft({ + output = "mobs:butter", + recipe = {{"mobs:wooden_bucket_milk", salt_item}}, + replacements = {{"mobs:wooden_bucket_milk", return_item}} + }) +end diff --git a/mods/mobs_animal/depends.txt b/mods/mobs_animal/depends.txt deleted file mode 100644 index 6eca2d8a..00000000 --- a/mods/mobs_animal/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -mobs -default? -lucky_block? -intllib? diff --git a/mods/mobs_animal/description.txt b/mods/mobs_animal/description.txt deleted file mode 100644 index 85afccdd..00000000 --- a/mods/mobs_animal/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds farm animals. \ No newline at end of file diff --git a/mods/mobs_animal/init.lua b/mods/mobs_animal/init.lua index bc3041b7..fdca8c6a 100644 --- a/mods/mobs_animal/init.lua +++ b/mods/mobs_animal/init.lua @@ -1,14 +1,11 @@ --- Load support for intllib. +-- translation and mod path + +local S = minetest.get_translator("mobs_animal") local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" -local S = minetest.get_translator and minetest.get_translator("mobs_animal") or - dofile(path .. "intllib.lua") - -mobs.intllib = S - - -- Check for custom mob spawn file + local input = io.open(path .. "spawn.lua", "r") if input then @@ -17,28 +14,41 @@ if input then input = nil end +-- helper function + +local function ddoo(mob) + + if minetest.settings:get_bool("mobs_animal." .. mob) == false then + print("[Mobs_Animal] " .. mob .. " disabled!") + return + end + + dofile(path .. mob .. ".lua") +end -- Animals -dofile(path .. "chicken.lua") -- JKmurray -dofile(path .. "cow.lua") -- KrupnoPavel -dofile(path .. "rat.lua") -- PilzAdam -dofile(path .. "sheep.lua") -- PilzAdam -dofile(path .. "warthog.lua") -- KrupnoPavel -dofile(path .. "bee.lua") -- KrupnoPavel -dofile(path .. "bunny.lua") -- ExeterDad -dofile(path .. "kitten.lua") -- Jordach/BFD -dofile(path .. "penguin.lua") -- D00Med -dofile(path .. "panda.lua") -- AspireMint +ddoo("chicken") -- JKmurray +ddoo("cow") -- KrupnoPavel +ddoo("rat") -- PilzAdam +ddoo("sheep") -- PilzAdam +ddoo("warthog") -- KrupnoPavel +ddoo("bee") -- KrupnoPavel +ddoo("bunny") -- ExeterDad +ddoo("kitten") -- Jordach/BFD +ddoo("penguin") -- D00Med +ddoo("panda") -- AspireMint + +-- Load custom spawning if found --- Load custom spawning if mobs.custom_spawn_animal then dofile(path .. "spawn.lua") end - -- Lucky Blocks -dofile(path .. "lucky_block.lua") +if minetest.get_modpath("lucky_block") then + dofile(path .. "lucky_block.lua") +end print ("[MOD] Mobs Redo Animals loaded") diff --git a/mods/mobs_animal/intllib.lua b/mods/mobs_animal/intllib.lua deleted file mode 100644 index 7decdf7d..00000000 --- a/mods/mobs_animal/intllib.lua +++ /dev/null @@ -1,3 +0,0 @@ --- Support for the old multi-load method -return dofile(minetest.get_modpath("intllib").."/init.lua") - diff --git a/mods/mobs_animal/kitten.lua b/mods/mobs_animal/kitten.lua index 2b4c876c..2afe7137 100644 --- a/mods/mobs_animal/kitten.lua +++ b/mods/mobs_animal/kitten.lua @@ -1,19 +1,30 @@ -local S = mobs.intllib -local hairball = minetest.settings:get("mobs_hairball") +-- translation and hairball setting + +local S = minetest.get_translator("mobs_animal") +local hairball = minetest.settings:get_bool("mobs_animal.hairball") ~= false + +-- custom kitty types + +local kitten_types = { + + { nodes = {"farming:jackolantern_on"}, + skins = {"mobs_kitten_black.png"} + } +} -- Kitten by Jordach / BFD mobs:register_mob("mobs_animal:kitten", { -stepheight = 0.6, + stepheight = 0.6, type = "animal", -specific_attack = {"mobs_animal:rat"}, -damage = 1, -attack_type = "dogfight", -attack_animals = true, -- so it can attack rat -attack_players = false, -reach = 1, -stepheight = 1.1, + specific_attack = {"mobs_animal:rat"}, + damage = 1, + attack_type = "dogfight", + attack_animals = true, -- so it can attack rat + attack_players = false, + reach = 1, + stepheight = 1.1, passive = false, hp_min = 5, hp_max = 10, @@ -26,38 +37,55 @@ stepheight = 1.1, {"mobs_kitten_striped.png"}, {"mobs_kitten_splotchy.png"}, {"mobs_kitten_ginger.png"}, - {"mobs_kitten_sandy.png"}, + {"mobs_kitten_sandy.png"} }, makes_footstep_sound = false, - sounds = { - random = "mobs_kitten", - }, + sounds = {random = "mobs_kitten"}, walk_velocity = 0.6, walk_chance = 15, run_velocity = 2, runaway = true, jump = false, drops = { - {name = "farming:string", chance = 1, min = 0, max = 1}, + {name = "farming:string", chance = 1, min = 0, max = 1} }, - water_damage = 0, + water_damage = 0.01, lava_damage = 5, fear_height = 3, animation = { speed_normal = 42, - stand_start = 97, - stand_end = 192, - walk_start = 0, - walk_end = 96, - stoodup_start = 0, - stoodup_end = 0, + stand_start = 97, stand_end = 192, + walk_start = 0, walk_end = 96, + stoodup_start = 0, stoodup_end = 0, }, follow = { "mobs_animal:rat", "group:food_fish_raw", - "mobs_fish:tropical", "xocean:fish_edible" + "mobs_fish:tropical", "mobs_fish:clownfish", "xocean:fish_edible" }, view_range = 8, + -- check surrounding nodes and spawn a specific kitten + on_spawn = function(self) + + local pos = self.object:get_pos() ; pos.y = pos.y - 1 + local tmp + + for n = 1, #kitten_types do + + tmp = kitten_types[n] + + if minetest.find_node_near(pos, 1, tmp.nodes) then + + self.base_texture = tmp.skins + self.object:set_properties({textures = tmp.skins}) + + return true + end + end + + return true -- run only once, false/nil runs every activation + end, + on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 4, true, true) then return end @@ -71,70 +99,65 @@ stepheight = 1.1, self.order = "stand" self.state = "stand" self.object:set_velocity({x = 0, y = 0, z = 0}) - mobs:set_animation(self, "stand") + self:set_animation("stand") else self.order = "" - mobs:set_animation(self, "stoodup") + self:set_animation("stoodup") end end end, do_custom = function(self, dtime) - if hairball == "false" then - return - end + if not hairball then return end self.hairball_timer = (self.hairball_timer or 0) + dtime - if self.hairball_timer < 10 then - return - end + if self.hairball_timer < 10 then return end self.hairball_timer = 0 - if self.child - or math.random(1, 250) > 1 then - return - end + if self.child or math.random(250) > 1 then return end local pos = self.object:get_pos() minetest.add_item(pos, "mobs:hairball") minetest.sound_play("default_dig_snappy", { - pos = pos, - gain = 1.0, - max_hear_distance = 5, - }) - end, + pos = pos, gain = 1.0, max_hear_distance = 5}, true) + end }) - -local spawn_on = "default:dirt_with_grass" - -if minetest.get_modpath("ethereal") then - spawn_on = "ethereal:grove_dirt" -end +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:kitten", - nodes = {spawn_on}, - neighbors = {"group:grass"}, - min_light = 14, - interval = 60, - chance = 10000, -- 22000 - min_height = 5, - max_height = 50, - day_toggle = true, -}) + + local spawn_on = "default:dirt_with_grass" + + if minetest.get_modpath("ethereal") then + spawn_on = "ethereal:grove_dirt" + end + + mobs:spawn({ + name = "mobs_animal:kitten", + nodes = {spawn_on}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 10000, + min_height = 5, + max_height = 50, + day_toggle = true + }) end +-- spawn egg mobs:register_egg("mobs_animal:kitten", S("Kitten"), "mobs_kitten_inv.png", 0) +-- compatibility with old mobs mod -mobs:alias_mob("mobs:kitten", "mobs_animal:kitten") -- compatibility +mobs:alias_mob("mobs:kitten", "mobs_animal:kitten") +-- hairball and items local hairball_items = { "default:stick", "default:coal_lump", "default:dry_shrub", "flowers:rose", @@ -143,12 +166,14 @@ local hairball_items = { "default:clay_lump", "default:paper", "default:dry_grass_1", "dye:red", "", "farming:string", "mobs:chicken_feather", "default:acacia_bush_sapling", "", "default:bush_sapling", "default:copper_lump", "default:iron_lump", "", - "dye:black", "dye:brown", "default:obsidian_shard", "default:tin_lump" + "dye:black", "dye:brown", "default:obsidian_shard", "default:tin_lump", + "ethereal:fish_tetra" } minetest.register_craftitem(":mobs:hairball", { description = S("Hairball"), inventory_image = "mobs_hairball.png", + on_use = function(itemstack, user, pointed_thing) local pos = user:get_pos() @@ -156,19 +181,15 @@ minetest.register_craftitem(":mobs:hairball", { local newpos = {x = pos.x + dir.x, y = pos.y + dir.y + 1.5, z = pos.z + dir.z} local item = hairball_items[math.random(1, #hairball_items)] - if item ~= "" - and minetest.registered_items[item] then + if item ~= "" and minetest.registered_items[item] then minetest.add_item(newpos, {name = item}) end minetest.sound_play("default_place_node_hard", { - pos = newpos, - gain = 1.0, - max_hear_distance = 5, - }) + pos = newpos, gain = 1.0, max_hear_distance = 5}, true) itemstack:take_item() return itemstack - end, + end }) diff --git a/mods/mobs_animal/license.txt b/mods/mobs_animal/license.txt index dd62499b..ef6a88a0 100644 --- a/mods/mobs_animal/license.txt +++ b/mods/mobs_animal/license.txt @@ -1,3 +1,7 @@ + +All my models (K Pavel) and change code on valid license The MIT License + + The MIT License (MIT) Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 @@ -20,10 +24,79 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Chicken sounds from freesounds.org under CC0 +Honey block, cheese and Cheese block by TenPlus1 under CC0 + +Chicken/Cow/Panda/Pig/Sheep sounds from freesounds.org under CC0 Mutton, Pork and Rabbit meat textures by Piezo_ under CC0 -Cow textures by sirrobzeroone under CC0 - mobs_panda_viking.png by Zlo under CC0 + +Models/Textures/Media by Krupnov Pavel (WTFPL) + mobs_rat.b3d + mobs_rat.png + mobs_sheep.b3d (converted to .b3d by sirrobzerrone) + mobs_stone_monster.b3d + mobs_stone_monster.png + mobs_dirt_monster.png + mobs_sand_monster.png + mobs_tree_monster.b3d + mobs_tree_monster.png + mobs_oerkki.b3d + mobs_oerkki.png + mobs_dungeon_master.b3d + mobs_dungeon_master.png + mobs_fireball.ogg + +Models/Textures by Krupno Pavel (MIT) + mobs_bee.b3d (converted to .b3d by sirrobzerrone) + mobs_pumba.b3d (converted to .b3d by sirrobzerrone) + mobs_pumba.png + +Models/Textures by ExeterDad (CC0) + mobs_bunny.b3d + mobs_bunny_grey.png + mobs_bunny_brown.png + mobs_bunny_white.png + +Models/Textures by JK Murray (CC0) + mobs_chicken.b3d (converted to .b3d by sirrobzerrone) + mobs_chicken.png + mobs_chicken_brown.png + mobs_chicken_black.png + mobs_chick.png + +Models/Textures by sirrobzerrone (CC0) + mobs_bee.png + mobs_cow.b3d + mobs_cow.png + mobs_cow2.png + +Models/Textures by Jordach/BFD (WTFPL) + mobs_kitten.b3d + mobs_kitten_striped.png + mobs_kitten_splotchy.png + mobs_kitten_ginger.png + mobs_kitten_sandy.png + +Sounds by lolamadeus (CC0) http://freesound.org/people/lolamadeus/sounds/196251/ + mobs_kitten.ogg + +Models/Textures by AspireMint (CC BY-SA 3.0) + mobs_panda.b3d + mobs_panda.png + +Models/Textures by D00Med (CC BY-SA 3.0) + mobs_penguin.b3d + mobs_penguin.png + +Textures by LithiumSound's Summer Field Texture Pack (CC BY-SA 4.0 NC ShareAlike International) + mobs_sheep_base.png + mobs_sheep_horns.png + mobs_sheep_shaved.png + mobs_sheep_wool.png [all edited by sirrobzeroone] + +Sounds by Cyberpangolin (WTFPL) https://forum.minetest.net/viewtopic.php?t=10798 + mobs_bee.ogg + mobs_spider.ogg + mobs_rat.ogg diff --git a/mods/mobs_animal/locale/README.md b/mods/mobs_animal/locale/README.md deleted file mode 100644 index 4887b9e0..00000000 --- a/mods/mobs_animal/locale/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Convert '.po' file to '.txt' file. - -### COMMAND SAMPLE -'''' -$ lua po2tr.lua "Your Name (Your Site) " "pt_BR.po" -rm "pt_BR.tr" "mobs_animal.pt_BR.tr" -$ cat mobs_animal.pt_BR.tr | less -'''' - -Source Code: https://gitlab.com/4w/xtend/-/blob/master/xtend_default/tools/convert_po_file_to_tr_file/convert_po_file_to_tr_file.lua diff --git a/mods/mobs_animal/locale/de.po b/mods/mobs_animal/locale/de.po deleted file mode 100644 index cd6d85e2..00000000 --- a/mods/mobs_animal/locale/de.po +++ /dev/null @@ -1,203 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2016-06-10 08:58+0200\n" -"Last-Translator: Xanthin\n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: bee.lua -msgid "Bee" -msgstr "Biene" - -#: bee.lua -msgid "Honey" -msgstr "Honig" - -#: bee.lua -msgid "Beehive" -msgstr "Bienenstock" - -#: bee.lua -msgid "Honey Block" -msgstr "Honigblock" - -#: bunny.lua -msgid "Bunny" -msgstr "Häschen" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Rohes Kaninchen" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "Gekochtes Kaninchen" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Kaninchenfell" - -#: chicken.lua -msgid "Chicken" -msgstr "Huhn" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Hühnerei" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Spiegelei" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Rohes Hühnchen" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Gekochtes Hühnchen" - -#: chicken.lua -#, fuzzy -msgid "Feather" -msgstr "Feder" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Kuh ist bereits gemolken!" - -#: cow.lua -msgid "Cow" -msgstr "Kuh" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Eimer Milch" - -#: cow.lua -msgid "Cheese" -msgstr "Käse" - -#: cow.lua -msgid "Cheese Block" -msgstr "Käseblock" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOD] Mobs Redo 'Animals' geladen" - -#: kitten.lua -msgid "Kitten" -msgstr "Kätzchen" - -#: penguin.lua -#, fuzzy -msgid "Penguin" -msgstr "Pinguin" - -#: rat.lua -msgid "Rat" -msgstr "Ratte" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Gekochte Ratte" - -#: sheep.lua -msgid "Black" -msgstr "Schwarzes" - -#: sheep.lua -msgid "Blue" -msgstr "Blaues" - -#: sheep.lua -msgid "Brown" -msgstr "Braunes" - -#: sheep.lua -msgid "Cyan" -msgstr "Cyan" - -#: sheep.lua -msgid "Dark Green" -msgstr "Dunkelgrünes" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Dunkelgraues" - -#: sheep.lua -msgid "Green" -msgstr "Grünes" - -#: sheep.lua -msgid "Grey" -msgstr "Graues" - -#: sheep.lua -msgid "Magenta" -msgstr "Magenta" - -#: sheep.lua -msgid "Orange" -msgstr "Oranges" - -#: sheep.lua -msgid "Pink" -msgstr "Pinkes" - -#: sheep.lua -msgid "Red" -msgstr "Rotes" - -#: sheep.lua -msgid "Violet" -msgstr "Violettes" - -#: sheep.lua -msgid "White" -msgstr "Weißes" - -#: sheep.lua -msgid "Yellow" -msgstr "Gelbes" - -#: sheep.lua -#, fuzzy -msgid "@1 Sheep" -msgstr "@1 Schaf" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Rohes Hammelfleisch" - -#: sheep.lua -#, fuzzy -msgid "Cooked Mutton" -msgstr "Gekochtes Hammelfleisch" - -#: warthog.lua -msgid "Warthog" -msgstr "Warzenschwein" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Rohes Schweinekotelett" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Gekochtes Schweinekotelett" diff --git a/mods/mobs_animal/locale/fr.po b/mods/mobs_animal/locale/fr.po deleted file mode 100644 index 5c0d2f6f..00000000 --- a/mods/mobs_animal/locale/fr.po +++ /dev/null @@ -1,202 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2017-07-31 09:18+0200\n" -"Last-Translator: fat115 \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: bee.lua -msgid "Bee" -msgstr "Abeille" - -#: bee.lua -msgid "Honey" -msgstr "Miel" - -#: bee.lua -msgid "Beehive" -msgstr "Ruche" - -#: bee.lua -msgid "Honey Block" -msgstr "Bloc de miel" - -#: bunny.lua -msgid "Bunny" -msgstr "Lapin" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Lapin Cru" - -#: bunny.lua -#, fuzzy -msgid "Cooked Rabbit" -msgstr "Lapin Cuit" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Fourrure de Lapin" - -#: chicken.lua -msgid "Chicken" -msgstr "Poule" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Œuf" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Œuf au plat" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Poulet cru" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Poulet cuit" - -#: chicken.lua -msgid "Feather" -msgstr "Plume" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Vache déjà traite !" - -#: cow.lua -msgid "Cow" -msgstr "Vache" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Seau de lait" - -#: cow.lua -msgid "Cheese" -msgstr "Fromage" - -#: cow.lua -msgid "Cheese Block" -msgstr "Bloc de fromage" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOD] Mobs Redo 'Animals' chargé" - -#: kitten.lua -msgid "Kitten" -msgstr "Chaton" - -#: penguin.lua -msgid "Penguin" -msgstr "Manchot" - -#: rat.lua -msgid "Rat" -msgstr "Rat" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Rat cuit" - -#: sheep.lua -msgid "Black" -msgstr "noir" - -#: sheep.lua -msgid "Blue" -msgstr "bleu" - -#: sheep.lua -msgid "Brown" -msgstr "marron" - -#: sheep.lua -msgid "Cyan" -msgstr "cyan" - -#: sheep.lua -msgid "Dark Green" -msgstr "vert foncé" - -#: sheep.lua -msgid "Dark Grey" -msgstr "gris foncé" - -#: sheep.lua -msgid "Green" -msgstr "vert" - -#: sheep.lua -msgid "Grey" -msgstr "gris" - -#: sheep.lua -msgid "Magenta" -msgstr "magenta" - -#: sheep.lua -msgid "Orange" -msgstr "orange" - -#: sheep.lua -msgid "Pink" -msgstr "rose" - -#: sheep.lua -msgid "Red" -msgstr "rouge" - -#: sheep.lua -msgid "Violet" -msgstr "violet" - -#: sheep.lua -msgid "White" -msgstr "blanc" - -#: sheep.lua -msgid "Yellow" -msgstr "jaune" - -#: sheep.lua -#, fuzzy -msgid "@1 Sheep" -msgstr "Mouton @1" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Mouton Cru" - -#: sheep.lua -#, fuzzy -msgid "Cooked Mutton" -msgstr "Mouton Cuit" - -#: warthog.lua -msgid "Warthog" -msgstr "Sanglier" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Côte de sanglier crue" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Côte de sanglier cuite" diff --git a/mods/mobs_animal/locale/it.po b/mods/mobs_animal/locale/it.po deleted file mode 100644 index 8982f935..00000000 --- a/mods/mobs_animal/locale/it.po +++ /dev/null @@ -1,201 +0,0 @@ -# ITALIAN LOCALE FILE FOR THE MOBS ANMAL MODULE -# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 -# This file is distributed under the same license as the MOBS ANIMAL package. -# Hamlet , 2017. -# -msgid "" -msgstr "" -"Project-Id-Version: Italian localization file for the Mobs Animal mod\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2017-08-18 00:56+0100\n" -"Last-Translator: H4mlet \n" -"Language-Team: \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.6.10\n" - -#: bee.lua -msgid "Bee" -msgstr "Ape" - -#: bee.lua -msgid "Honey" -msgstr "Miele" - -#: bee.lua -msgid "Beehive" -msgstr "Favo" - -#: bee.lua -msgid "Honey Block" -msgstr "Blocco di miele" - -#: bunny.lua -msgid "Bunny" -msgstr "Coniglietto" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Coniglio Crudo" - -#: bunny.lua -#, fuzzy -msgid "Cooked Rabbit" -msgstr "Coniglio Cotto" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Pelle di Coniglio" - -#: chicken.lua -msgid "Chicken" -msgstr "Gallina" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Uovo di gallina" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Uovo fritto" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Pollo crudo" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Pollo cotto" - -#: chicken.lua -msgid "Feather" -msgstr "Piuma" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Mucca già munta!" - -#: cow.lua -msgid "Cow" -msgstr "Mucca" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Secchio di latte" - -#: cow.lua -msgid "Cheese" -msgstr "Formaggio" - -#: cow.lua -msgid "Cheese Block" -msgstr "Blocco di formaggio" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOD] Mobs Redo 'Animals' caricato" - -#: kitten.lua -msgid "Kitten" -msgstr "Gattino" - -#: penguin.lua -msgid "Penguin" -msgstr "Pinguino" - -#: rat.lua -msgid "Rat" -msgstr "Ratto" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Ratto cotto" - -#: sheep.lua -msgid "Black" -msgstr "Nera" - -#: sheep.lua -msgid "Blue" -msgstr "Blu" - -#: sheep.lua -msgid "Brown" -msgstr "Marrone" - -#: sheep.lua -msgid "Cyan" -msgstr "Ciano" - -#: sheep.lua -msgid "Dark Green" -msgstr "Verde scuro" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Grigio scuro" - -#: sheep.lua -msgid "Green" -msgstr "Verde" - -#: sheep.lua -msgid "Grey" -msgstr "Grigia" - -#: sheep.lua -msgid "Magenta" -msgstr "Magenta" - -#: sheep.lua -msgid "Orange" -msgstr "Arancione" - -#: sheep.lua -msgid "Pink" -msgstr "Rosa" - -#: sheep.lua -msgid "Red" -msgstr "Rossa" - -#: sheep.lua -msgid "Violet" -msgstr "Viola" - -#: sheep.lua -msgid "White" -msgstr "Bianca" - -#: sheep.lua -msgid "Yellow" -msgstr "Gialla" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "Pecora @1" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Montone Crudo" - -#: sheep.lua -#, fuzzy -msgid "Cooked Mutton" -msgstr "Montone Cotto" - -#: warthog.lua -msgid "Warthog" -msgstr "Facocero" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Bistecca di maiale cruda" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Bistecca di maiale cotta" diff --git a/mods/mobs_animal/locale/mobs_animal.eo.tr b/mods/mobs_animal/locale/mobs_animal.eo.tr new file mode 100644 index 00000000..456834d3 --- /dev/null +++ b/mods/mobs_animal/locale/mobs_animal.eo.tr @@ -0,0 +1,50 @@ +# textdomain: mobs_animal +Bee=Abelo +Honey=Mielo +Beehive=Abelujo +Honey Block=Miela bloko +Bunny=Kuniklo +Raw Rabbit=Kruda kuniklaĵo +Cooked Rabbit=Kuirita kuniklaĵo +Rabbit Hide=Kuniklofelo +Chicken=Koko +Chicken Egg=Koka ovo +Fried Egg=Kuirita ovo +Raw Chicken=Kruda kokaĵo +Cooked Chicken=Kuirita koko +Feather=Plumo +Cow already milked!=Bovo jam melkita! +Cow=Bovo +Bucket of Milk=Sitelo da lakto +Glass of Milk=Glaso da lakto +Butter=Butero +Cheese=Fromaĝo +Cheese Block=Fromaĝa bloko +Wooden Bucket of Milk=Ligna sitelo da lakto +Kitten=Katido +Hairball=Haraĵo +Panda=Ĉina urso +Penguin=Pingveno +Rat=Rato +Cooked Rat=Kuirita rataĵo +Black=Nigra +Blue=Blua +Brown=Bruna +Cyan=Bluverda +Dark Green=Malhela verda +Dark Grey=Malhela griza +Green=Verda +Grey=Griza +Magenta=Fuksina +Orange=Oranĝa +Pink=Rozkolora +Red=Ruĝa +Violet=Violkolora +White=Blanka +Yellow=Flava +@1 Sheep=@1 ŝafo +Raw Mutton=Kruda ŝafaĵo +Cooked Mutton=Kuirita ŝafaĵo +Warthog=Verukapro +Raw Porkchop=Kruda porkaĵo +Cooked Porkchop=Kuirita porkaĵo diff --git a/mods/mobs_animal/locale/mobs_animal.es.tr b/mods/mobs_animal/locale/mobs_animal.es.tr new file mode 100644 index 00000000..c6e10289 --- /dev/null +++ b/mods/mobs_animal/locale/mobs_animal.es.tr @@ -0,0 +1,46 @@ +# textdomain: mobs_animal +Bee=Abeja +Honey=Miel +Beehive=Colmena +Honey Block=Bloque de Mel +Bunny=Conejo +Raw Rabbit=Carne de Conejo +Cooked Rabbit=Conejo Asado +Rabbit Hide=Conejo oculto +Chicken=Gallina +Chicken Egg=Huevo de Gallina +Fried Egg=Huevo Frito +Raw Chicken=Gallina cruda +Cooked Chicken=Gallina Asada +Feather=Pluma +Cow already milked!=Vaca ordeñada +Cow=Vaca +Bucket of Milk=Balde de leche +Cheese=Queso +Cheese Block=Bloque de queso +[MOD] Mobs Redo 'Animals' loaded=[MOD] Mobs redo Animals cargado +Kitten=Gato +Penguin=Pinguino +Rat=Raton +Cooked Rat=Raton Asado +Black=Negro +Blue=Azul +Brown=Marrom +Cyan=Cian +Dark Green=Verde Oscuro +Dark Grey=Gris Oscuro +Green=Verde +Grey=Gris +Magenta=Magenta +Orange=Naranja +Pink=Rosa +Red=Rojo +Violet=Violeta +White=Blanco +Yellow=Amarillo +@1 Sheep=Oveja @1 +Raw Mutton=Carnero crudo +Cooked Mutton=Carnero Assado +Warthog=Javali +Raw Porkchop=Costilla de Jabali crudo +Cooked Porkchop=Costilla de Javali Assada diff --git a/mods/mobs_animal/locale/mobs_animal.pt.tr b/mods/mobs_animal/locale/mobs_animal.pt.tr index 60d9f5c1..0ed5bd26 100644 --- a/mods/mobs_animal/locale/mobs_animal.pt.tr +++ b/mods/mobs_animal/locale/mobs_animal.pt.tr @@ -1,4 +1,4 @@ -# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +# textdomain:mobs_animal Bee=Abelha Honey=Mel Beehive=Colméia diff --git a/mods/mobs_animal/locale/mobs_animal.pt_BR.tr b/mods/mobs_animal/locale/mobs_animal.pt_BR.tr index 60d9f5c1..0ed5bd26 100644 --- a/mods/mobs_animal/locale/mobs_animal.pt_BR.tr +++ b/mods/mobs_animal/locale/mobs_animal.pt_BR.tr @@ -1,4 +1,4 @@ -# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +# textdomain:mobs_animal Bee=Abelha Honey=Mel Beehive=Colméia diff --git a/mods/mobs_animal/locale/mobs_animal.ru.tr b/mods/mobs_animal/locale/mobs_animal.ru.tr index 9c05c42f..b1affb20 100644 --- a/mods/mobs_animal/locale/mobs_animal.ru.tr +++ b/mods/mobs_animal/locale/mobs_animal.ru.tr @@ -1,50 +1,49 @@ # textdomain:mobs_animal -@1 Sheep=@1 овца +@1 Sheep=@1 Овца Bee=Пчела -Beehive=Улей +Beehive=Пчелиный Улей Black=Черная Blue=Синяя Brown=Коричневая -Bucket of Milk=Ведро молока +Bucket of Milk=Ведро Молока Bunny=Кролик Butter=Масло Cheese=Сыр -Cheese Block=Блок сыра +Cheese Block=Блок Сыра Chicken=Курица -Chicken Egg=Куриное яйцо -Cooked Chicken=Приготовленная курятина -Cooked Mutton=Приготовленная баранина -Cooked Porkchop=Приготовленные свиные отбивные -Cooked Rabbit=Приготовленная крольчатина -Cooked Rat=Приготовленная крыса +Chicken Egg=Куриное Яйцо +Cooked Chicken=Приготовленная Курятина +Cooked Mutton=Приготовленная Баранина +Cooked Porkchop=Приготовленные Отбивные +Cooked Rabbit=Приготовленная Крольчатина +Cooked Rat=Приготовленная Крыса Cow=Корова -Cow already milked!=Корову уже подоили! +Cow already milked!=Корова уже подоена! Cyan=Голубая Dark Green=Темно-зеленая Dark Grey=Темно-серая Feather=Перо Fried Egg=Яичница -Glass of Milk=Стакан молока +Glass of Milk=Стакан Молока Green=Зеленая Grey=Серая Hairball=Комочек шерсти Honey=Мёд -Honey Block=Блок мёда +Honey Block=Блок Мёда Kitten=Котенок Magenta=Пурпурная Orange=Оранжевая Panda=Панда Penguin=Пингвин Pink=Розовая -Rabbit Hide=Кроличья шкурка +Rabbit Hide=Кроличья Шкурка Rat=Крыса -Raw Chicken=Сырая курятина -Raw Mutton=Сырая баранина -Raw Porkchop=Свиные отбивные -Raw Rabbit=Сырая крольчатина +Raw Chicken=Сырая Курятина +Raw Mutton=Сырая Баранина +Raw Porkchop=Свиные Отбивные +Raw Rabbit=Сырая Крольчатина Red=Красная Violet=Фиолетовая Warthog=Бородавочник White=Белая -Yellow=Желтая -#[MOD] Mobs Redo Animals loaded= +Yellow=Желтая \ No newline at end of file diff --git a/mods/mobs_animal/locale/ms.po b/mods/mobs_animal/locale/ms.po deleted file mode 100644 index 38e896da..00000000 --- a/mods/mobs_animal/locale/ms.po +++ /dev/null @@ -1,199 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-06 00:17+0800\n" -"PO-Revision-Date: 2018-02-06 00:25+0800\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" -"Language-Team: \n" -"Language: ms\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: bee.lua -msgid "Bee" -msgstr "Lebah" - -#: bee.lua -msgid "Honey" -msgstr "Madu" - -#: bee.lua -msgid "Beehive" -msgstr "Sarang Lebah" - -#: bee.lua -msgid "Honey Block" -msgstr "Blok Madu" - -#: bunny.lua -msgid "Bunny" -msgstr "Arnab" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Daging Arnab Mentah" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "Daging Arnab Bakar" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Belulang Arnab" - -#: chicken.lua -msgid "Chicken" -msgstr "Ayam" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Telur Ayam" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Telur Goreng" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Ayam Mentah" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Ayam Bakar" - -#: chicken.lua -msgid "Feather" -msgstr "Bulu" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Lembu telah diperah susunya!" - -#: cow.lua -msgid "Cow" -msgstr "Lembu" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Baldi Susu" - -#: cow.lua -msgid "Cheese" -msgstr "Keju" - -#: cow.lua -msgid "Cheese Block" -msgstr "Blok Keju" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MODS] Mobs Redo 'Animals' telah dimuatkan" - -#: kitten.lua -msgid "Kitten" -msgstr "Anak Kucing" - -#: penguin.lua -msgid "Penguin" -msgstr "Penguin" - -#: rat.lua -msgid "Rat" -msgstr "Tikus" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Tikus Bakar" - -#: sheep.lua -msgid "Black" -msgstr "Hitam" - -#: sheep.lua -msgid "Blue" -msgstr "Biru" - -#: sheep.lua -msgid "Brown" -msgstr "Perang" - -#: sheep.lua -msgid "Cyan" -msgstr "Sian" - -#: sheep.lua -msgid "Dark Green" -msgstr "Hijau Gelap" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Kelabu Gelap" - -#: sheep.lua -msgid "Green" -msgstr "Hijau" - -#: sheep.lua -msgid "Grey" -msgstr "Kelabu" - -#: sheep.lua -msgid "Magenta" -msgstr "Merah Lembayung" - -#: sheep.lua -msgid "Orange" -msgstr "Jingga" - -#: sheep.lua -msgid "Pink" -msgstr "Merah Jambu" - -#: sheep.lua -msgid "Red" -msgstr "Merah" - -#: sheep.lua -msgid "Violet" -msgstr "Ungu" - -#: sheep.lua -msgid "White" -msgstr "Putih" - -#: sheep.lua -msgid "Yellow" -msgstr "Kuning" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "Biri-biri @1" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Daging Biri-biri Mentah" - -#: sheep.lua -msgid "Cooked Mutton" -msgstr "Daging Biri-biri Bakar" - -#: warthog.lua -msgid "Warthog" -msgstr "Babi Hutan" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Daging Babi Mentah" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Daging Babi Bakar" diff --git a/mods/mobs_animal/locale/po2tr.lua b/mods/mobs_animal/locale/po2tr.lua deleted file mode 100644 index b48ea071..00000000 --- a/mods/mobs_animal/locale/po2tr.lua +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env luajit - --- Convert regular Gettext PO files to Minetest-specific TR files. If there is --- already a TR file with the same name of the PO file except the file suffix --- bneing .tr (or .TR) instead of .po (or .PO) then THIS FILE WILL BE --- OVERWRITTEN WITHOUT INFORMATION OR A WAY TO RECOVER THE PREVIOUS FILE! --- --- --- ▄██▄ --- ▀███ --- █ --- ▄▄▄▄▄ █ --- ▀▄ ▀▄ █ BACKUP --- ▄▀▀▀▄ █▄▄▄▄█▄▄ ▄▀▀▀▄ █ --- █ ▄ █ █ ▄ █ █ --- ▀▄ ▄▀ ▀▄ ▄▀ █ --- █▀▀▀ ▀▀▀ █ █ --- █ █ █ ALL --- ▄▀▄▄▀▄ █ ▄█▀█▀█▀█▀█▀█▄ █ █ --- █▒▒▒▒█ █ █████████████▄ █ █ --- █▒▒▒▒█ █ ██████████████▄ █ █ --- █▒▒▒▒█ █ ██████████████▄ █ █ --- █▒▒▒▒█ █ ██████████████ █ █ --- █▒▒▒▒█ █ ██████████████▀ █ █ THE --- █▒▒▒▒█ ██ ██████████████ █ █ --- ▀████▀ ██▀█ █████████████▀ █▄█ --- ██ ██ ▀█ █▄█▄█▄█▄█▄█▀ ▄█▀ --- ██ ██ ▀█ ▄▀▓█ --- ██ ██ ▀█▀▄▄▄▄▄▄▄▄▄▀▀▓▓▓█ --- ████ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ --- ███ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ THINGS --- ██ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ --- ██ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ !!! --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ --- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ --- --- --- The syntax of TR files according to the introducing forum post is: --- --- # textdomain: namespace --- original 1 = translation 1 --- original 2 = translation 2 --- original 3 = tralslation 3 --- original N = translation N --- --- Where namespace should be the name of the mod. Following strings have to be --- escaped using @. --- --- String | Escape --- -------+-------- --- `@` |`@@` --- `=` |`@=` --- `\n` |`@\n` --- --- See https://forum.minetest.net/viewtopic.php?t=18349 for details. - - --- Preparation -if arg[1] == nil or arg[2] == nil then - print('Provide the namesspace as first parameter') - print('Provide the path to the source PO file as second parameter') - print('Example: '..arg[0]..' mymod path/to/my/source.po') - return -end -local SEP = package.path:match('(%p)%?%.') or '/' -- wonky but hey ... :) - - --- Assign parameters to local variables -local namespace = arg[1] -local po_file = arg[2] -local tr_file = arg[2]:gsub('po$', 'tr'):gsub('PO$', 'TR') - - --- Get the translations through crude plaintext file parsing -local file_contents = {} -local translations = {} - -local po_file_handle = io.open(po_file, 'rb') -if po_file_handle == nil then print('No base file found') return end - -for line in po_file_handle:lines() do - if line:match('^msgid') or line:match('^msgstr') then - table.insert(file_contents, line) - end -end - -local escape_string = function (s) - s = s:gsub('@([^%d])', '@@%1') -- All @ not followed by a number become @@ - s = s:gsub('([^@]@)$', '%1@') -- An @ at the end of the string become @@ - s = s:gsub('=', '@=') -- All = become @= - return s -end - -for number,line_content in pairs(file_contents) do - if line_content:match('^msgid') then - local o = line_content:gsub('^msgid "(.+)"$', '%1') - local t = file_contents[number + 1]:gsub('^msgstr "(.+)"$', '%1') - if o ~= 'msgid = ""' and t ~= 'msgstr ""' then - table.insert(translations, escape_string(o)..'='..escape_string(t)) - end - end -end -print(number) -po_file_handle:close() - - --- Write translation to file -local tr_file_handle = io.open(tr_file, 'w+') -if tr_file_handle == nil then print('Could not open target file') return end -tr_file_handle:write('# textdomain: '..namespace, "\n") -for _,line in pairs(translations) do tr_file_handle:write(line, "\n") end -tr_file_handle:close() diff --git a/mods/mobs_animal/locale/pt.po b/mods/mobs_animal/locale/pt.po deleted file mode 100644 index 20f09d68..00000000 --- a/mods/mobs_animal/locale/pt.po +++ /dev/null @@ -1,199 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2021-06-20 18:51-0300\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: Lunovox Heavenfinder \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: pt_BR\n" - -#: bee.lua -msgid "Bee" -msgstr "Abelha" - -#: bee.lua -msgid "Honey" -msgstr "Mel" - -#: bee.lua -msgid "Beehive" -msgstr "Colméia" - -#: bee.lua -msgid "Honey Block" -msgstr "Bloco de Mel" - -#: bunny.lua -msgid "Bunny" -msgstr "Coelho" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Carne de Coelho (Cru)" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "Coelho (Assado)" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Pele de Coelho" - -#: chicken.lua -msgid "Chicken" -msgstr "Galinha" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Ovo de Galinha" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Ovo Frito" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Carne de Galinha (Crua)" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Galinha Assada" - -#: chicken.lua -msgid "Feather" -msgstr "Pluma" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Vaca já ordenhada!" - -#: cow.lua -msgid "Cow" -msgstr "Vaca" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Balde de leite" - -#: cow.lua -msgid "Cheese" -msgstr "Queijo" - -#: cow.lua -msgid "Cheese Block" -msgstr "Bloco de Queijo" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOBS_ANIMAL] Mod carregado completamente" - -#: kitten.lua -msgid "Kitten" -msgstr "Gato" - -#: penguin.lua -msgid "Penguin" -msgstr "Pinguim" - -#: rat.lua -msgid "Rat" -msgstr "Rato" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Rato (Assado)" - -#: sheep.lua -msgid "Black" -msgstr "Preto" - -#: sheep.lua -msgid "Blue" -msgstr "Azul" - -#: sheep.lua -msgid "Brown" -msgstr "Marrom" - -#: sheep.lua -msgid "Cyan" -msgstr "Ciano" - -#: sheep.lua -msgid "Dark Green" -msgstr "Verde Escuro" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Cinza Escuro" - -#: sheep.lua -msgid "Green" -msgstr "Verde" - -#: sheep.lua -msgid "Grey" -msgstr "Cinza" - -#: sheep.lua -msgid "Magenta" -msgstr "Rosa Magenta" - -#: sheep.lua -msgid "Orange" -msgstr "Laranja" - -#: sheep.lua -msgid "Pink" -msgstr "Rosa" - -#: sheep.lua -msgid "Red" -msgstr "Vermelho" - -#: sheep.lua -msgid "Violet" -msgstr "Violeta" - -#: sheep.lua -msgid "White" -msgstr "Branco" - -#: sheep.lua -msgid "Yellow" -msgstr "Amarelo" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "Ovelha @1 " - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Carneiro (Cru)" - -#: sheep.lua -msgid "Cooked Mutton" -msgstr "Carneiro (Assado)" - -#: warthog.lua -msgid "Warthog" -msgstr "Javali" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Costeleta de Javali (Crua)" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Costeleta de Javali Assada" diff --git a/mods/mobs_animal/locale/pt.txt b/mods/mobs_animal/locale/pt.txt deleted file mode 100644 index 60d9f5c1..00000000 --- a/mods/mobs_animal/locale/pt.txt +++ /dev/null @@ -1,46 +0,0 @@ -# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) -Bee=Abelha -Honey=Mel -Beehive=Colméia -Honey Block=Bloco de Mel -Bunny=Coelho -Raw Rabbit=Carne de Coelho (Cru) -Cooked Rabbit=Coelho (Assado) -Rabbit Hide=Pele de Coelho -Chicken=Galinha -Chicken Egg=Ovo de Galinha -Fried Egg=Ovo Frito -Raw Chicken=Carne de Galinha (Crua) -Cooked Chicken=Galinha Assada -Feather=Pluma -Cow already milked!=Vaca já ordenhada! -Cow=Vaca -Bucket of Milk=Balde de leite -Cheese=Queijo -Cheese Block=Bloco de Queijo -[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente -Kitten=Gato -Penguin=Pinguim -Rat=Rato -Cooked Rat=Rato (Assado) -Black=Preto -Blue=Azul -Brown=Marrom -Cyan=Ciano -Dark Green=Verde Escuro -Dark Grey=Cinza Escuro -Green=Verde -Grey=Cinza -Magenta=Rosa Magenta -Orange=Laranja -Pink=Rosa -Red=Vermelho -Violet=Violeta -White=Branco -Yellow=Amarelo -@1 Sheep=Ovelha @1 -Raw Mutton=Carneiro (Cru) -Cooked Mutton=Carneiro (Assado) -Warthog=Javali -Raw Porkchop=Costeleta de Javali (Crua) -Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_animal/locale/pt_BR.po b/mods/mobs_animal/locale/pt_BR.po deleted file mode 100644 index 20f09d68..00000000 --- a/mods/mobs_animal/locale/pt_BR.po +++ /dev/null @@ -1,199 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2021-06-20 18:51-0300\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: Lunovox Heavenfinder \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: pt_BR\n" - -#: bee.lua -msgid "Bee" -msgstr "Abelha" - -#: bee.lua -msgid "Honey" -msgstr "Mel" - -#: bee.lua -msgid "Beehive" -msgstr "Colméia" - -#: bee.lua -msgid "Honey Block" -msgstr "Bloco de Mel" - -#: bunny.lua -msgid "Bunny" -msgstr "Coelho" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Carne de Coelho (Cru)" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "Coelho (Assado)" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Pele de Coelho" - -#: chicken.lua -msgid "Chicken" -msgstr "Galinha" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Ovo de Galinha" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Ovo Frito" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Carne de Galinha (Crua)" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Galinha Assada" - -#: chicken.lua -msgid "Feather" -msgstr "Pluma" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Vaca já ordenhada!" - -#: cow.lua -msgid "Cow" -msgstr "Vaca" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Balde de leite" - -#: cow.lua -msgid "Cheese" -msgstr "Queijo" - -#: cow.lua -msgid "Cheese Block" -msgstr "Bloco de Queijo" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOBS_ANIMAL] Mod carregado completamente" - -#: kitten.lua -msgid "Kitten" -msgstr "Gato" - -#: penguin.lua -msgid "Penguin" -msgstr "Pinguim" - -#: rat.lua -msgid "Rat" -msgstr "Rato" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Rato (Assado)" - -#: sheep.lua -msgid "Black" -msgstr "Preto" - -#: sheep.lua -msgid "Blue" -msgstr "Azul" - -#: sheep.lua -msgid "Brown" -msgstr "Marrom" - -#: sheep.lua -msgid "Cyan" -msgstr "Ciano" - -#: sheep.lua -msgid "Dark Green" -msgstr "Verde Escuro" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Cinza Escuro" - -#: sheep.lua -msgid "Green" -msgstr "Verde" - -#: sheep.lua -msgid "Grey" -msgstr "Cinza" - -#: sheep.lua -msgid "Magenta" -msgstr "Rosa Magenta" - -#: sheep.lua -msgid "Orange" -msgstr "Laranja" - -#: sheep.lua -msgid "Pink" -msgstr "Rosa" - -#: sheep.lua -msgid "Red" -msgstr "Vermelho" - -#: sheep.lua -msgid "Violet" -msgstr "Violeta" - -#: sheep.lua -msgid "White" -msgstr "Branco" - -#: sheep.lua -msgid "Yellow" -msgstr "Amarelo" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "Ovelha @1 " - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Carneiro (Cru)" - -#: sheep.lua -msgid "Cooked Mutton" -msgstr "Carneiro (Assado)" - -#: warthog.lua -msgid "Warthog" -msgstr "Javali" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Costeleta de Javali (Crua)" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Costeleta de Javali Assada" diff --git a/mods/mobs_animal/locale/pt_BR.txt b/mods/mobs_animal/locale/pt_BR.txt deleted file mode 100644 index 60d9f5c1..00000000 --- a/mods/mobs_animal/locale/pt_BR.txt +++ /dev/null @@ -1,46 +0,0 @@ -# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) -Bee=Abelha -Honey=Mel -Beehive=Colméia -Honey Block=Bloco de Mel -Bunny=Coelho -Raw Rabbit=Carne de Coelho (Cru) -Cooked Rabbit=Coelho (Assado) -Rabbit Hide=Pele de Coelho -Chicken=Galinha -Chicken Egg=Ovo de Galinha -Fried Egg=Ovo Frito -Raw Chicken=Carne de Galinha (Crua) -Cooked Chicken=Galinha Assada -Feather=Pluma -Cow already milked!=Vaca já ordenhada! -Cow=Vaca -Bucket of Milk=Balde de leite -Cheese=Queijo -Cheese Block=Bloco de Queijo -[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente -Kitten=Gato -Penguin=Pinguim -Rat=Rato -Cooked Rat=Rato (Assado) -Black=Preto -Blue=Azul -Brown=Marrom -Cyan=Ciano -Dark Green=Verde Escuro -Dark Grey=Cinza Escuro -Green=Verde -Grey=Cinza -Magenta=Rosa Magenta -Orange=Laranja -Pink=Rosa -Red=Vermelho -Violet=Violeta -White=Branco -Yellow=Amarelo -@1 Sheep=Ovelha @1 -Raw Mutton=Carneiro (Cru) -Cooked Mutton=Carneiro (Assado) -Warthog=Javali -Raw Porkchop=Costeleta de Javali (Crua) -Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_animal/locale/ru.po b/mods/mobs_animal/locale/ru.po deleted file mode 100644 index 9699d8e8..00000000 --- a/mods/mobs_animal/locale/ru.po +++ /dev/null @@ -1,216 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-13 16:00 (UTC+5)\n" -"PO-Revision-Date: 2020-06-19 19:00 (UTC+3)\n" -"Last-Translator: YELLOW \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: bee.lua -msgid "Bee" -msgstr "Пчела" - -#: bee.lua -msgid "Honey" -msgstr "Мёд" - -#: bee.lua -msgid "Beehive" -msgstr "Улей" - -#: bee.lua -msgid "Honey Block" -msgstr "Блок мёда" - -#: bunny.lua -msgid "Bunny" -msgstr "Кролик" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "Сырая крольчатина" - -#: bunny.lua -#, fuzzy -msgid "Cooked Rabbit" -msgstr "Приготовленная крольчатина" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "Кроличья шкурка" - -#: chicken.lua -msgid "Chicken" -msgstr "Курица" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Куриное яйцо" - -#: chicken.lua -msgid "Fried Egg" -msgstr "Яичница" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Сырая курятина" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Приготовленная курятина" - -#: chicken.lua -msgid "Feather" -msgstr "Перо" - -#: cow.lua -msgid "Cow already milked!" -msgstr "Корову уже подоили!" - -#: cow.lua -msgid "Cow" -msgstr "Корова" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Ведро молока" - -#: cow.lua -msgid "Glass of Milk" -msgstr "Стакан молока" - -#: cow.lua -msgid "Butter" -msgstr "Масло" - -#: cow.lua -msgid "Cheese" -msgstr "Сыр" - -#: cow.lua -msgid "Cheese Block" -msgstr "Блок сыра" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[МОД] Mobs Redo 'Animals' загружен" - -#: kitten.lua -msgid "Kitten" -msgstr "Котенок" - -#: kitten.lua -msgid "Hairball" -msgstr "Комочек шерсти" - -#: panda.lua -msgid "Panda" -msgstr "Панда" - -#: penguin.lua -msgid "Penguin" -msgstr "Пингвин" - -#: rat.lua -msgid "Rat" -msgstr "Крыса" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Приготовленная крыса" - -#: sheep.lua -msgid "Black" -msgstr "Черная" - -#: sheep.lua -msgid "Blue" -msgstr "Синяя" - -#: sheep.lua -msgid "Brown" -msgstr "Коричневая" - -#: sheep.lua -msgid "Cyan" -msgstr "Голубая" - -#: sheep.lua -msgid "Dark Green" -msgstr "Темно-зеленая" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Темно-серая" - -#: sheep.lua -msgid "Green" -msgstr "Зеленая" - -#: sheep.lua -msgid "Grey" -msgstr "Серая" - -#: sheep.lua -msgid "Magenta" -msgstr "Пурпурная" - -#: sheep.lua -msgid "Orange" -msgstr "Оранжевая" - -#: sheep.lua -msgid "Pink" -msgstr "Розовая" - -#: sheep.lua -msgid "Red" -msgstr "Красная" - -#: sheep.lua -msgid "Violet" -msgstr "Фиолетовая" - -#: sheep.lua -msgid "White" -msgstr "Белая" - -#: sheep.lua -msgid "Yellow" -msgstr "Желтая" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "@1 овца" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "Сырая баранина" - -#: sheep.lua -#, fuzzy -msgid "Cooked Mutton" -msgstr "Приготовленная баранина" - -#: warthog.lua -msgid "Warthog" -msgstr "Бородавочник" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Свиные отбивные" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Приготовленные свиные отбивные" diff --git a/mods/mobs_animal/locale/template.pot b/mods/mobs_animal/locale/template.pot deleted file mode 100644 index 79f58ff7..00000000 --- a/mods/mobs_animal/locale/template.pot +++ /dev/null @@ -1,198 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: bee.lua -msgid "Bee" -msgstr "" - -#: bee.lua -msgid "Honey" -msgstr "" - -#: bee.lua -msgid "Beehive" -msgstr "" - -#: bee.lua -msgid "Honey Block" -msgstr "" - -#: bunny.lua -msgid "Bunny" -msgstr "" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "" - -#: chicken.lua -msgid "Chicken" -msgstr "" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "" - -#: chicken.lua -msgid "Fried Egg" -msgstr "" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "" - -#: chicken.lua -msgid "Feather" -msgstr "" - -#: cow.lua -msgid "Cow already milked!" -msgstr "" - -#: cow.lua -msgid "Cow" -msgstr "" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "" - -#: cow.lua -msgid "Cheese" -msgstr "" - -#: cow.lua -msgid "Cheese Block" -msgstr "" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "" - -#: kitten.lua -msgid "Kitten" -msgstr "" - -#: penguin.lua -msgid "Penguin" -msgstr "" - -#: rat.lua -msgid "Rat" -msgstr "" - -#: rat.lua -msgid "Cooked Rat" -msgstr "" - -#: sheep.lua -msgid "Black" -msgstr "" - -#: sheep.lua -msgid "Blue" -msgstr "" - -#: sheep.lua -msgid "Brown" -msgstr "" - -#: sheep.lua -msgid "Cyan" -msgstr "" - -#: sheep.lua -msgid "Dark Green" -msgstr "" - -#: sheep.lua -msgid "Dark Grey" -msgstr "" - -#: sheep.lua -msgid "Green" -msgstr "" - -#: sheep.lua -msgid "Grey" -msgstr "" - -#: sheep.lua -msgid "Magenta" -msgstr "" - -#: sheep.lua -msgid "Orange" -msgstr "" - -#: sheep.lua -msgid "Pink" -msgstr "" - -#: sheep.lua -msgid "Red" -msgstr "" - -#: sheep.lua -msgid "Violet" -msgstr "" - -#: sheep.lua -msgid "White" -msgstr "" - -#: sheep.lua -msgid "Yellow" -msgstr "" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "" - -#: sheep.lua -msgid "Cooked Mutton" -msgstr "" - -#: warthog.lua -msgid "Warthog" -msgstr "" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "" diff --git a/mods/mobs_animal/locale/tr.po b/mods/mobs_animal/locale/tr.po deleted file mode 100644 index f3c0b86c..00000000 --- a/mods/mobs_animal/locale/tr.po +++ /dev/null @@ -1,202 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: 2017-04-26 09:02+0200\n" -"Last-Translator: Admicos\n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: bee.lua -msgid "Bee" -msgstr "Arı" - -#: bee.lua -msgid "Honey" -msgstr "Bal" - -#: bee.lua -msgid "Beehive" -msgstr "Arı kovanı" - -#: bee.lua -msgid "Honey Block" -msgstr "Bal bloğu" - -#: bunny.lua -msgid "Bunny" -msgstr "Tavşan" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "çiğ tavşan" - -#: bunny.lua -#, fuzzy -msgid "Cooked Rabbit" -msgstr "pişmiş tavşan" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "tavşan kürkü" - -#: chicken.lua -msgid "Chicken" -msgstr "Tavuk" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "Tavuk yumurtası " - -#: chicken.lua -msgid "Fried Egg" -msgstr "Kızarmış yumurta" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "Çiğ tavuk" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "Pişmiş tavuk" - -#: chicken.lua -msgid "Feather" -msgstr "" - -#: cow.lua -msgid "Cow already milked!" -msgstr "İnekte süt yok!" - -#: cow.lua -msgid "Cow" -msgstr "İnek" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "Süt kovası" - -#: cow.lua -msgid "Cheese" -msgstr "Peynir" - -#: cow.lua -msgid "Cheese Block" -msgstr "Peynir bloğu" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[MOD] Mobs Redo 'Hayvanlar' yüklendi" - -#: kitten.lua -msgid "Kitten" -msgstr "Yavru kedi" - -#: penguin.lua -msgid "Penguin" -msgstr "" - -#: rat.lua -msgid "Rat" -msgstr "Sıçan" - -#: rat.lua -msgid "Cooked Rat" -msgstr "Pişmiş sıçan" - -#: sheep.lua -msgid "Black" -msgstr "Siyah" - -#: sheep.lua -msgid "Blue" -msgstr "Mavi" - -#: sheep.lua -msgid "Brown" -msgstr "Kahverengi" - -#: sheep.lua -msgid "Cyan" -msgstr "Camgöbeği" - -#: sheep.lua -msgid "Dark Green" -msgstr "Koyu yeşil" - -#: sheep.lua -msgid "Dark Grey" -msgstr "Koyu gri" - -#: sheep.lua -msgid "Green" -msgstr "Yeşil" - -#: sheep.lua -msgid "Grey" -msgstr "Gri" - -#: sheep.lua -msgid "Magenta" -msgstr "Macenta" - -#: sheep.lua -msgid "Orange" -msgstr "Turuncu" - -#: sheep.lua -msgid "Pink" -msgstr "Pembe" - -#: sheep.lua -msgid "Red" -msgstr "Kırmızı" - -#: sheep.lua -msgid "Violet" -msgstr "Mor" - -#: sheep.lua -msgid "White" -msgstr "Beyaz" - -#: sheep.lua -msgid "Yellow" -msgstr "Sarı" - -#: sheep.lua -#, fuzzy -msgid "@1 Sheep" -msgstr "@1 Koyun" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "çiğ kuzu" - -#: sheep.lua -#, fuzzy -msgid "Cooked Mutton" -msgstr "pişmiş kuzu" - -#: warthog.lua -msgid "Warthog" -msgstr "Domuz" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "Çiğ pirzola" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "Pişmiş pirzola" diff --git a/mods/mobs_animal/locale/zh_CN.pot b/mods/mobs_animal/locale/zh_CN.pot deleted file mode 100644 index 6c1bbb1f..00000000 --- a/mods/mobs_animal/locale/zh_CN.pot +++ /dev/null @@ -1,206 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# IFRFSX <1079092922@qq.com>, 2020. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 11:28+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: bee.lua -msgid "Bee" -msgstr "蜜蜂" - -#: bee.lua -msgid "Honey" -msgstr "蜂蜜" - -#: bee.lua -msgid "Beehive" -msgstr "蜂巢" - -#: bee.lua -msgid "Honey Block" -msgstr "蜂蜜方块" - -#: bunny.lua -msgid "Bunny" -msgstr "兔子" - -#: bunny.lua -msgid "Raw Rabbit" -msgstr "生兔肉" - -#: bunny.lua -msgid "Cooked Rabbit" -msgstr "熟兔肉" - -#: bunny.lua -msgid "Rabbit Hide" -msgstr "兔子皮" - -#: chicken.lua -msgid "Chicken" -msgstr "鸡" - -#: chicken.lua -msgid "Chicken Egg" -msgstr "鸡蛋" - -#: chicken.lua -msgid "Fried Egg" -msgstr "煎蛋" - -#: chicken.lua -msgid "Raw Chicken" -msgstr "生鸡肉" - -#: chicken.lua -msgid "Cooked Chicken" -msgstr "熟鸡肉" - -#: chicken.lua -msgid "Feather" -msgstr "羽毛" - -#: cow.lua -msgid "Cow already milked!" -msgstr "奶牛已经被挤奶了!" - -#: cow.lua -msgid "Cow" -msgstr "奶牛" - -#: cow.lua -msgid "Bucket of Milk" -msgstr "一桶牛奶" - -#: cow.lua -msgid "Glass of Milk" -msgstr "一杯牛奶" - -#: cow.lua -msgid "Cheese" -msgstr "奶酪" - -#: cow.lua -msgid "Cheese Block" -msgstr "奶酪方块" - -#: init.lua -msgid "[MOD] Mobs Redo 'Animals' loaded" -msgstr "[模组] Mobs Redo 'Animals' 已加载!" - -#: kitten.lua -msgid "Kitten" -msgstr "小猫" - -#: kitten.lua -msgid "Hairball" -msgstr "毛球" - -#: penguin.lua -msgid "Penguin" -msgstr "企鹅" - -#: rat.lua -msgid "Rat" -msgstr "老鼠" - -#: rat.lua -msgid "Cooked Rat" -msgstr "熟老鼠" - -#: sheep.lua -msgid "Black" -msgstr "黑" - -#: sheep.lua -msgid "Blue" -msgstr "蓝" - -#: sheep.lua -msgid "Brown" -msgstr "棕" - -#: sheep.lua -msgid "Cyan" -msgstr "青" - -#: sheep.lua -msgid "Dark Green" -msgstr "蓝绿" - -#: sheep.lua -msgid "Dark Grey" -msgstr "蓝灰" - -#: sheep.lua -msgid "Green" -msgstr "绿" - -#: sheep.lua -msgid "Grey" -msgstr "灰" - -#: sheep.lua -msgid "Magenta" -msgstr "品红" - -#: sheep.lua -msgid "Orange" -msgstr "橙" - -#: sheep.lua -msgid "Pink" -msgstr "粉红" - -#: sheep.lua -msgid "Red" -msgstr "红" - -#: sheep.lua -msgid "Violet" -msgstr "紫" - -#: sheep.lua -msgid "White" -msgstr "白" - -#: sheep.lua -msgid "Yellow" -msgstr "黄" - -#: sheep.lua -msgid "@1 Sheep" -msgstr "@1羊" - -#: sheep.lua -msgid "Raw Mutton" -msgstr "生羊肉" - -#: sheep.lua -msgid "Cooked Mutton" -msgstr "熟羊肉" - -#: warthog.lua -msgid "Warthog" -msgstr "野猪" - -#: warthog.lua -msgid "Raw Porkchop" -msgstr "生猪排" - -#: warthog.lua -msgid "Cooked Porkchop" -msgstr "熟猪排" diff --git a/mods/mobs_animal/locale/zh_CN.txt b/mods/mobs_animal/locale/zh_CN.txt deleted file mode 100644 index 605e24c2..00000000 --- a/mods/mobs_animal/locale/zh_CN.txt +++ /dev/null @@ -1,53 +0,0 @@ -# Template for translations of mobs_animal mod -# last update: 2020/02/13 - -Bee = 蜜蜂 -Honey = 蜂蜜 -Beehive = 蜂巢 -Honey Block = 蜂蜜方块 -Butter = 黄油 -Bunny = 兔子 -Raw Rabbit = 生兔肉 -Cooked Rabbit = 熟兔肉 -Rabbit Hide = 兔子皮 -Chicken = 鸡 -Chicken Egg = 鸡蛋 -Fried Egg = 煎蛋 -Raw Chicken = 生鸡肉 -Cooked Chicken = 熟鸡肉 -Feather = 羽毛 -Cow already milked! = 奶牛已被挤奶! -Cow = 奶牛 -Bucket of Milk = 一桶牛奶 -Cheese = 奶酪 -Cheese Block = 奶酪方块 -[MOD] Mobs Redo 'Animals' loaded = [模组] Mobs Redo 'Animals' 已加载! -Kitten = 小猫 -Penguin = 企鹅 -Rat = 老鼠 -Cooked Rat = 熟老鼠 -Black = 黑 -Blue = 蓝 -Brown = 棕 -Cyan = 青 -Dark Green = 暗绿 -Dark Grey = 暗灰 -Green = 绿 -Grey = 灰 -Magenta = 品红 -Orange = 橙 -Pink = 粉红 -Red = 红 -Violet = 紫 -White = 白 -Yellow = 黄 -@1 Sheep = @1羊 -Raw Mutton = 生羊肉 -Cooked Mutton = 熟羊肉 -Warthog = 野猪 -Raw Porkchop = 生猪排 -Cooked Porkchop = 熟猪排 -Panda = 熊猫 - -Glass of Milk = 一杯牛奶 -Hairball = 毛球 diff --git a/mods/mobs_animal/locale/zh_TW.txt b/mods/mobs_animal/locale/zh_TW.txt deleted file mode 100644 index 133db45d..00000000 --- a/mods/mobs_animal/locale/zh_TW.txt +++ /dev/null @@ -1,53 +0,0 @@ -# Template for translations of mobs_animal mod -# last update: 2020/02/13 - -Bee = 蜜蜂 -Honey = 蜂蜜 -Beehive = 蜂巢 -Honey Block = 蜂蜜方塊 -Butter = 黃油 -Bunny = 兔子 -Raw Rabbit = 生兔肉 -Cooked Rabbit = 熟兔肉 -Rabbit Hide = 兔子皮 -Chicken = 雞 -Chicken Egg = 雞蛋 -Fried Egg = 煎蛋 -Raw Chicken = 生雞肉 -Cooked Chicken = 熟雞肉 -Feather = 羽毛 -Cow already milked! = 奶牛已被擠奶! -Cow = 奶牛 -Bucket of Milk = 一桶牛奶 -Cheese = 奶酪 -Cheese Block = 奶酪方塊 -[MOD] Mobs Redo 'Animals' loaded = [模組] Mobs Redo 'Animals' 已加載! -Kitten = 小貓 -Penguin = 企鵝 -Rat = 老鼠 -Cooked Rat = 熟老鼠 -Black = 黑 -Blue = 藍 -Brown = 棕 -Cyan = 青 -Dark Green = 暗綠 -Dark Grey = 暗灰 -Green = 綠 -Grey = 灰 -Magenta = 品紅 -Orange = 橙 -Pink = 粉紅 -Red = 紅 -Violet = 紫 -White = 白 -Yellow = 黃 -@1 Sheep = @1羊 -Raw Mutton = 生羊肉 -Cooked Mutton = 熟羊肉 -Warthog = 野豬 -Raw Porkchop = 生豬排 -Cooked Porkchop = 熟豬排 -Panda = 熊貓 - -Glass of Milk = 一杯牛奶 -Hairball = 毛球 diff --git a/mods/mobs_animal/lucky_block.lua b/mods/mobs_animal/lucky_block.lua index e2b028c2..bf7f6a04 100644 --- a/mods/mobs_animal/lucky_block.lua +++ b/mods/mobs_animal/lucky_block.lua @@ -1,31 +1,33 @@ -if minetest.get_modpath("lucky_block") then +-- add lucky blocks + +lucky_block:add_blocks({ + {"spw", "mobs:sheep", 5}, + {"spw", "mobs:rat", 5}, + {"dro", {"mobs:rat_cooked"}, 5}, + {"spw", "mobs:bunny", 3}, + {"nod", "mobs:honey_block", 0}, + {"spw", "mobs:pumba", 5}, + {"nod", "mobs:cheeseblock", 0}, + {"spw", "mobs:chicken", 5}, + {"dro", {"mobs:egg"}, 5}, + {"spw", "mobs:cow", 5}, + {"dro", {"mobs:bucket_milk", "bucket:bucket_water"}, 8}, + {"spw", "mobs:kitten", 2}, + {"exp"}, + {"dro", {"mobs:hairball"}, 3}, + {"dro", {"mobs:chicken_raw", "mobs:chicken_cooked"}, 10}, + {"dro", {"mobs:pork_raw", "mobs:pork_cooked"}, 10}, + {"dro", {"mobs:mutton_raw", "mobs:mutton_cooked"}, 10}, + {"dro", {"mobs:meat_raw", "mobs:meat"}, 10}, + {"dro", {"mobs:glass_milk"}, 5} +}) + +-- if nyancat found add special block + +if minetest.registered_nodes["default:nyancat"] then lucky_block:add_blocks({ - {"spw", "mobs:sheep", 5}, - {"spw", "mobs:rat", 5}, - {"dro", {"mobs:rat_cooked"}, 5}, - {"spw", "mobs:bunny", 3}, - {"nod", "mobs:honey_block", 0}, - {"spw", "mobs:pumba", 5}, - {"nod", "mobs:cheeseblock", 0}, - {"spw", "mobs:chicken", 5}, - {"dro", {"mobs:egg"}, 5}, - {"spw", "mobs:cow", 5}, - {"dro", {"mobs:bucket_milk", "bucket:bucket_water"}, 8}, - {"spw", "mobs:kitten", 2}, - {"exp"}, - {"dro", {"mobs:hairball"}, 3}, - {"dro", {"mobs:chicken_raw", "mobs:chicken_cooked"}, 10}, - {"dro", {"mobs:pork_raw", "mobs:pork_cooked"}, 10}, - {"dro", {"mobs:mutton_raw", "mobs:mutton_cooked"}, 10}, - {"dro", {"mobs:meat_raw", "mobs:meat"}, 10}, - {"dro", {"mobs:glass_milk"}, 5}, + {"tro", "default:nyancat", "mobs_kitten", true} }) - - if minetest.registered_nodes["default:nyancat"] then - lucky_block:add_blocks({ - {"tro", "default:nyancat", "mobs_kitten", true}, - }) - end end diff --git a/mods/mobs_animal/mod.conf b/mods/mobs_animal/mod.conf index 1a31db8e..70791d9e 100644 --- a/mods/mobs_animal/mod.conf +++ b/mods/mobs_animal/mod.conf @@ -1,4 +1,5 @@ name = mobs_animal +description = Add farm animals and a few extra into your world. depends = mobs -optional_depends = default, lucky_block, intllib -description = Adds farm animals. +optional_depends = default, farming, lucky_block +min_minetest_version = 5.0 diff --git a/mods/mobs_animal/models/mobs_bunny.b3d b/mods/mobs_animal/models/mobs_bunny.b3d index ee053bd4..a8968f2e 100644 Binary files a/mods/mobs_animal/models/mobs_bunny.b3d and b/mods/mobs_animal/models/mobs_bunny.b3d differ diff --git a/mods/mobs_animal/models/mobs_sheep.b3d b/mods/mobs_animal/models/mobs_sheep.b3d index bcf2dfc5..4853e895 100644 Binary files a/mods/mobs_animal/models/mobs_sheep.b3d and b/mods/mobs_animal/models/mobs_sheep.b3d differ diff --git a/mods/mobs_animal/models/mobs_sheep_shaved.b3d b/mods/mobs_animal/models/mobs_sheep_shaved.b3d deleted file mode 100644 index 857b406a..00000000 Binary files a/mods/mobs_animal/models/mobs_sheep_shaved.b3d and /dev/null differ diff --git a/mods/mobs_animal/panda.lua b/mods/mobs_animal/panda.lua index d008e575..d8c836b2 100644 --- a/mods/mobs_animal/panda.lua +++ b/mods/mobs_animal/panda.lua @@ -1,11 +1,10 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Panda by AspireMint (CC BY-SA 3.0) mobs:register_mob("mobs_animal:panda", { -stepheight = 0.6, + stepheight = 0.6, type = "animal", passive = false, attack_type = "dogfight", @@ -20,13 +19,11 @@ stepheight = 0.6, collisionbox = {-0.4, -0.45, -0.4, 0.4, 0.45, 0.4}, visual = "mesh", mesh = "mobs_panda.b3d", - textures = { - {"mobs_panda.png"}, - }, + textures = {{"mobs_panda.png"}}, makes_footstep_sound = true, sounds = { random = "mobs_panda", - attack = "mobs_panda", + attack = "mobs_panda" }, walk_chance = 5, walk_velocity = 0.5, @@ -36,38 +33,33 @@ stepheight = 0.6, follow = {"ethereal:bamboo", "bamboo:trunk"}, view_range = 8, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 2}, + {name = "mobs:meat_raw", chance = 1, min = 1, max = 2} }, - water_damage = 0, + water_damage = 0.01, lava_damage = 5, light_damage = 0, fear_height = 6, animation = { speed_normal = 15, - stand_start = 130, - stand_end = 270, - stand1_start = 0, - stand1_end = 0, - stand2_start = 1, - stand2_end = 1, - stand3_start = 2, - stand3_end = 2, - walk_start = 10, - walk_end = 70, - run_start = 10, - run_end = 70, - punch_start = 80, - punch_end = 120, - -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + stand_start = 130, stand_end = 270, + stand1_start = 0, stand1_end = 0, -- rest + stand2_start = 1, stand2_end = 1, -- covers eyes + stand3_start = 2, stand3_end = 2, -- surprised + walk_start = 10, walk_end = 70, + run_start = 10, run_end = 70, + punch_start = 80, punch_end = 120 }, + on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 20, true, true) then return end if mobs:protect(self, clicker) then return end if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end - end, + end }) +-- where to spawn (ethereal bamboo biome only) + if minetest.get_modpath("ethereal") and not mobs.custom_spawn_animal then mobs:spawn({ @@ -76,11 +68,13 @@ if minetest.get_modpath("ethereal") and not mobs.custom_spawn_animal then neighbors = {"group:grass"}, min_light = 14, interval = 60, - chance = 8000, -- 15000 + chance = 8000, min_height = 10, max_height = 80, - day_toggle = true, + day_toggle = true }) end +-- spawn egg + mobs:register_egg("mobs_animal:panda", S("Panda"), "mobs_panda_inv.png") diff --git a/mods/mobs_animal/penguin.lua b/mods/mobs_animal/penguin.lua index f4b04ee0..d2292e24 100644 --- a/mods/mobs_animal/penguin.lua +++ b/mods/mobs_animal/penguin.lua @@ -1,6 +1,5 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Penguin by D00Med @@ -16,9 +15,7 @@ stepheight = 0.6, visual = "mesh", mesh = "mobs_penguin.b3d", visual_size = {x = 0.25, y = 0.25}, - textures = { - {"mobs_penguin.png"}, - }, + textures = {{"mobs_penguin.png"}}, sounds = {}, makes_footstep_sound = true, walk_velocity = 1, @@ -27,7 +24,7 @@ stepheight = 0.6, jump = false, stepheight = 1.1, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 1}, + {name = "mobs:meat_raw", chance = 1, min = 1, max = 1} }, water_damage = 0, lava_damage = 4, @@ -35,12 +32,9 @@ stepheight = 0.6, fear_height = 2, animation = { speed_normal = 15, - stand_start = 1, - stand_end = 20, - walk_start = 25, - walk_end = 45, - fly_start = 75, -- swim animation - fly_end = 95, + stand_start = 1, stand_end = 20, + walk_start = 25, walk_end = 45, + fly_start = 75, fly_end = 95 -- swim animation -- 50-70 is slide/water idle }, fly_in = {"default:water_source", "default:water_flowing"}, @@ -57,20 +51,25 @@ stepheight = 0.6, if mobs:feed_tame(self, clicker, 4, false, true) then return end if mobs:protect(self, clicker) then return end if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end - end, + end }) +-- where to spawn + if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:penguin", - nodes = {"default:snowblock"}, - min_light = 14, - interval = 60, - chance = 20000, - min_height = 0, - max_height = 200, - day_toggle = true, -}) + + mobs:spawn({ + name = "mobs_animal:penguin", + nodes = {"default:snowblock"}, + min_light = 14, + interval = 60, + chance = 20000, + min_height = 0, + max_height = 200, + day_toggle = true + }) end +-- spawn egg + mobs:register_egg("mobs_animal:penguin", S("Penguin"), "mobs_penguin_inv.png") diff --git a/mods/mobs_animal/rat.lua b/mods/mobs_animal/rat.lua index ee73d47c..428cc554 100644 --- a/mods/mobs_animal/rat.lua +++ b/mods/mobs_animal/rat.lua @@ -1,11 +1,10 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs_animal") - --- Rat by PilzAdam (B3D model by sirrobzeroone) +-- Rat by KPavel and PilzAdam (B3D model by sirrobzeroone) mobs:register_mob("mobs_animal:rat", { -stepheight = 0.6, + stepheight = 0.6, type = "animal", passive = true, hp_min = 1, @@ -17,11 +16,10 @@ stepheight = 0.6, textures = { {"mobs_rat.png"}, {"mobs_rat2.png"}, + {"mobs_rat3.png"} }, makes_footstep_sound = false, - sounds = { - random = "mobs_rat", - }, + sounds = {random = "mobs_rat"}, walk_velocity = 1, run_velocity = 2, runaway = true, @@ -30,6 +28,7 @@ stepheight = 0.6, lava_damage = 4, light_damage = 0, fear_height = 2, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 50, 90, 0, true, "mobs_animal:rat") end, @@ -59,6 +58,7 @@ stepheight = 0.6, ]] }) +-- example on_spawn function local function rat_spawn(self, pos) self = self:get_luaentity() @@ -67,34 +67,41 @@ local function rat_spawn(self, pos) self.health = 100 end +-- where to spawn + if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:rat", - nodes = {"default:stone"}, - min_light = 3, - max_light = 9, - interval = 60, - chance = 8000, - max_height = 0, --- on_spawn = rat_spawn, -}) + + mobs:spawn({ + name = "mobs_animal:rat", + nodes = {"default:stone"}, + min_light = 3, + max_light = 9, + interval = 60, + chance = 8000, + max_height = 0, + -- on_spawn = rat_spawn, + }) end +-- spawn egg mobs:register_egg("mobs_animal:rat", S("Rat"), "mobs_rat_inv.png") +-- compatibility with older mobs mod -mobs:alias_mob("mobs:rat", "mobs_animal:rat") -- compatibility - +mobs:alias_mob("mobs:rat", "mobs_animal:rat") -- cooked rat, yummy! + minetest.register_craftitem(":mobs:rat_cooked", { description = S("Cooked Rat"), inventory_image = "mobs_cooked_rat.png", on_use = minetest.item_eat(3), - groups = {food_rat = 1, flammable = 2} + groups = {food_rat = 1} }) +mobs.add_eatable("mobs:rat_cooked", 3) + minetest.register_craft({ type = "cooking", output = "mobs:rat_cooked", diff --git a/mods/mobs_animal/readme.md b/mods/mobs_animal/readme.md index 85d8a009..792cf56a 100644 --- a/mods/mobs_animal/readme.md +++ b/mods/mobs_animal/readme.md @@ -17,7 +17,7 @@ Wanders around eating grass/wheat and can be right-clicked with empty bucket to --- ### Kitten -Found on green grass these cute cats walk around and can be picked up and placed in inventory as pets or right-clicked with 4x live rats or raw fish (found in ethereal) and tamed. They can sometimes leave you little gifts of a hairball. +Found on green grass these cute cats walk around and can be picked up and placed in inventory as pets or right-clicked with 4x live rats or raw fish (found in ethereal) and tamed. They can sometimes leave you little gifts of a hairball, remember to check just incase it contains an item. --- ### Rat @@ -25,7 +25,7 @@ Typically found around stone they can be picked up and cooked for eating. --- ### Sheep -Green grass and wheat munchers that can be clipped using shears to give 1-3 wool. Feed sheep 8x wheat to regrow wool, tame and breed. Right-click a tamed sheep with dye to change it's colour. Will drop 1-3 raw mutton when killed. +Green grass and wheat munchers that can be clipped using shears to give 1-3 wool when tamed. Feed sheep 8x wheat to regrow wool, tame and breed. Right-click a tamed sheep with dye to change it's colour. Will drop 1-3 raw mutton when killed. --- ### Warthog diff --git a/mods/mobs_animal/screenshot.png b/mods/mobs_animal/screenshot.png index 51c24174..b6db76d9 100644 Binary files a/mods/mobs_animal/screenshot.png and b/mods/mobs_animal/screenshot.png differ diff --git a/mods/mobs_animal/settingtypes.txt b/mods/mobs_animal/settingtypes.txt new file mode 100644 index 00000000..fbc81781 --- /dev/null +++ b/mods/mobs_animal/settingtypes.txt @@ -0,0 +1,11 @@ +mobs_animal.bee (Enable Bee) bool true +mobs_animal.bunny (Enable Bunny) bool true +mobs_animal.chicken (Enable Chicken) bool true +mobs_animal.cow (Enable Cow) bool true +mobs_animal.kitten (Enable Kitten) bool true +mobs_animal.panda (Enable Panda) bool true +mobs_animal.penguin (Enable Penguin) bool true +mobs_animal.rat (Enable Rat) bool true +mobs_animal.sheep (Enable Sheep) bool true +mobs_animal.warthog (Enable Warthog) bool true +mobs_animal.hairball (Enable Kitten Hairball drops) bool true diff --git a/mods/mobs_animal/sheep.lua b/mods/mobs_animal/sheep.lua index 31daab13..5a19ac5d 100644 --- a/mods/mobs_animal/sheep.lua +++ b/mods/mobs_animal/sheep.lua @@ -1,30 +1,80 @@ -local S = mobs.intllib +-- translation and localize function + +local S = minetest.get_translator("mobs_animal") +local random = math.random + +-- sheep colour table local all_colours = { - {"black", S("Black"), "#000000b0"}, + {"black", S("Black"), "#212121b0"}, -- referenced down in mobs:spawn {"blue", S("Blue"), "#015dbb70"}, - {"brown", S("Brown"), "#663300a0"}, - {"cyan", S("Cyan"), "#01ffd870"}, + {"brown", S("Brown"), "#663300a0"}, -- referenced down in mobs:spawn + {"cyan", S("Cyan"), "#00b4bf70"}, {"dark_green", S("Dark Green"), "#005b0770"}, - {"dark_grey", S("Dark Grey"), "#303030b0"}, + {"dark_grey", S("Dark Grey"), "#444444b0"}, -- referenced down in mobs:spawn {"green", S("Green"), "#61ff0170"}, - {"grey", S("Grey"), "#5b5b5bb0"}, - {"magenta", S("Magenta"), "#ff05bb70"}, + {"grey", S("Grey"), "#919191b0"}, -- referenced down in mobs:spawn + {"magenta", S("Magenta"), "#ed03ad70"}, {"orange", S("Orange"), "#ff840170"}, - {"pink", S("Pink"), "#ff65b570"}, + {"pink", S("Pink"), "#ff85c470"}, {"red", S("Red"), "#ff0000a0"}, - {"violet", S("Violet"), "#2000c970"}, - {"white", S("White"), "#abababc0"}, - {"yellow", S("Yellow"), "#e3ff0070"}, + {"violet", S("Violet"), "#5c00c970"}, + {"white", S("White"), "#ffffffc0"}, -- referenced down in mobs:spawn + {"yellow", S("Yellow"), "#fff80070"} } - --- Sheep by PilzAdam, texture converted to minetest by AMMOnym from Summerfield pack +-- Sheep by PilzAdam/K Pavel, texture converted to minetest by AMMOnym from Summerfield pack for _, col in ipairs(all_colours) do - mobs:register_mob("mobs_animal:sheep_"..col[1], { + local drops_normal = { + {name = "mobs:mutton_raw", chance = 1, min = 1, max = 2}, + {name = "wool:" .. col[1], chance = 1, min = 1, max = 1} + } + + local drops_gotten = { + {name = "mobs:mutton_raw", chance = 1, min = 1, max = 2} + } + + local function horn_texture_sel(horns, gotten, colr) + + -- get override colours hex value from table + if colr then + + for _2, col2 in ipairs(all_colours) do + + if col2[1] == colr then + colr = col2[3] + break + end + end + end + + local base_text = "mobs_sheep_base.png" + local wool_shave_text = "mobs_sheep_wool.png" + local shav_text = "mobs_sheep_shaved.png" + local horn_text = "mobs_sheep_horns.png" + local col_override = colr and colr or col[3] + local col_text = "^[multiply:" .. col_override + + if gotten then + wool_shave_text = shav_text + col_text = "" + end + + -- results in unneccesary brackets for shaved but these are ignored by engine + local textures = base_text .. "^(" .. wool_shave_text .. col_text .. ")" + + if horns then + textures = base_text .. "^" .. horn_text .. "^(" .. wool_shave_text + .. col_text .. ")" + end + + return textures + end + + mobs:register_mob("mobs_animal:sheep_" .. col[1], { stay_near = {"farming:straw", 10}, stepheight = 0.6, type = "animal", @@ -36,13 +86,13 @@ for _, col in ipairs(all_colours) do visual = "mesh", mesh = "mobs_sheep.b3d", textures = { - {"mobs_sheep_base.png^(mobs_sheep_wool.png^[colorize:" .. col[3] .. ")"}, + {"mobs_sheep_base.png^(mobs_sheep_wool.png^[multiply:" .. col[3] .. ")"} }, - gotten_texture = {"mobs_sheep_shaved.png"}, - gotten_mesh = "mobs_sheep_shaved.b3d", + gotten_texture = {"mobs_sheep_base.png^mobs_sheep_shaved.png"}, makes_footstep_sound = true, sounds = { random = "mobs_sheep", + replace = "default_dig_crumbly" }, walk_velocity = 1, run_velocity = 2, @@ -50,26 +100,18 @@ for _, col in ipairs(all_colours) do jump = true, jump_height = 6, pushable = true, - drops = { - {name = "mobs:mutton_raw", chance = 1, min = 1, max = 2}, - {name = "wool:"..col[1], chance = 1, min = 1, max = 1}, - }, - water_damage = 0, + drops = drops_normal, + water_damage = 0.01, lava_damage = 5, light_damage = 0, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 80, - walk_start = 81, - walk_end = 100, - - die_start = 1, -- we dont have a specific death animation so we will - die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and - die_speed = 1, -- have mob rotate when dying. - die_loop = false, - die_rotate = true, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 80, + walk_start = 81, walk_end = 100, + -- no death animation so we'll re-use 2 standing frames at a speed of 1 fps + -- and have mob rotate while dying. + die_start = 1, die_end = 2, die_speed = 1, + die_loop = false, die_rotate = true }, follow = { "farming:wheat", "default:grass_1", "farming:barley", @@ -82,6 +124,7 @@ for _, col in ipairs(all_colours) do {"default:dirt_with_grass", "default:dirt", -2} }, fear_height = 3, + on_replace = function(self, pos, oldnode, newnode) self.food = (self.food or 0) + 1 @@ -91,27 +134,132 @@ for _, col in ipairs(all_colours) do self.food = 0 self.gotten = false + self.drops = drops_normal - self.object:set_properties({ - textures = {"mobs_sheep_base.png^(mobs_sheep_wool.png^[colorize:" .. col[3] .. ")"}, - mesh = "mobs_sheep.b3d", - }) + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + + -- base_texture must be kept up to date for static_save so horns persist + -- visually on server/game restart + self.base_texture = {textures} end end, + + on_breed = function(parent1, parent2) + + -- simple truth table P1/P2 horns/no_horns + local breed_out = { + ["P1_N"] = {["P2_N"] = 5 ,["P2_H"] = 50}, + ["P1_H"] = {["P2_N"] = 50,["P2_H"] = 95} + } + + local p1 = parent1.attribute_horns and "P1_H" or "P1_N" + local p2 = parent2.attribute_horns and "P2_H" or "P2_N" + local horn_chance = breed_out[p1][p2] + local horns = random(100) <= horn_chance + local pos = parent1.object:get_pos() + + -- can't see an easy way to pass horn attribute into + -- child entity def, handle all spawning here, unfortunate + -- code replication from mobs_redo api.lua line 1497+ + -- replace "self" with "parent1" and few other minor tweaks + ---------------------------------------------------- + pos.y = pos.y + 0.5 -- spawn child a little higher + + local mob = minetest.add_entity(pos, parent1.name) + local ent2 = mob:get_luaentity() + + -- remove horns from parents' texture string, lambs dont have horns + local textures = string.gsub(parent1.base_texture[1], + "%^mobs_sheep_horns.png", "") + + -- using specific child texture (if found) + if parent1.child_texture then + textures = parent1.child_texture[1] + end + + -- and resize to half height + mob:set_properties({ + textures = {textures}, + visual_size = { + x = parent1.base_size.x * .5, y = parent1.base_size.y * .5 + }, + collisionbox = { + parent1.base_colbox[1] * .5, parent1.base_colbox[2] * .5, + parent1.base_colbox[3] * .5, parent1.base_colbox[4] * .5, + parent1.base_colbox[5] * .5, parent1.base_colbox[6] * .5 + }, + selectionbox = { + parent1.base_selbox[1] * .5, parent1.base_selbox[2] * .5, + parent1.base_selbox[3] * .5, parent1.base_selbox[4] * .5, + parent1.base_selbox[5] * .5, parent1.base_selbox[6] * .5 + } + }) + + -- tamed and owned by parents' owner + ent2.child = true + ent2.tamed = true + ent2.owner = parent1.owner + ent2.attribute_horns = horns + + -- stop mobs_redo api from spawning child + return false + end, + + -- fix any issue with horns by re-checking + on_spawn = function(self) + + if self.child then return end -- baby sheep dont have horns + + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + self.base_texture = {textures} + end, + + on_grown = function(self) + + -- add the horns if we have horns when fully grown + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + self.base_texture = {textures} + + local pos = self.object:get_pos() + local prop = self.object:get_properties() + + pos.y = pos.y + (prop.collisionbox[2] * -1) - 0.4 + + self.object:set_pos(pos) + + -- jump slightly when fully grown so as not to fall into ground + self.object:set_velocity({x = 0, y = 2, z = 0 }) + end, + on_rightclick = function(self, clicker) - --are we feeding? + -- are we feeding? if mobs:feed_tame(self, clicker, 8, true, true) then + if not self.child then + + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + self.base_texture = {textures} + end + --if fed 7 times then sheep regrows wool if self.food and self.food > 6 then self.gotten = false + self.drops = drops_normal - self.object:set_properties({ - textures = {"mobs_sheep_base.png^(mobs_sheep_wool.png^[colorize:" .. col[3] .. ")"}, - mesh = "mobs_sheep.b3d", - }) + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + self.base_texture = {textures} end return @@ -121,75 +269,92 @@ for _, col in ipairs(all_colours) do local itemname = item:get_name() local name = clicker:get_player_name() - --are we giving a haircut> + -- are we giving a haircut> if itemname == "mobs:shears" then - if self.gotten ~= false - or self.child ~= false - or name ~= self.owner - or not minetest.get_modpath("wool") then + if self.gotten ~= false or self.child ~= false + or name ~= self.owner or not minetest.get_modpath("wool") then return end self.gotten = true -- shaved + self.drops = drops_gotten local obj = minetest.add_item( self.object:get_pos(), - ItemStack( "wool:" .. col[1] .. " " .. math.random(1, 3) ) + ItemStack("wool:" .. col[1] .. " " .. random(3)) ) if obj then - obj:setvelocity({ - x = math.random(-1, 1), - y = 5, - z = math.random(-1, 1) - }) + obj:set_velocity({ + x = random(-1, 1), y = 5, z = random(-1, 1)}) end item:add_wear(650) -- 100 uses clicker:set_wielded_item(item) - self.object:set_properties({ - textures = {"mobs_sheep_shaved.png"}, - mesh = "mobs_sheep_shaved.b3d", - }) + local textures = horn_texture_sel(self.attribute_horns, self.gotten) + + self.object:set_properties({textures = {textures}}) + self.base_texture = {textures} return end - --are we coloring? + -- are we coloring? if itemname:find("dye:") then - if self.gotten == false - and self.child == false - and self.tamed == true - and name == self.owner then + if self.gotten == false and self.child == false + and self.tamed == true and name == self.owner then local colr = string.split(itemname, ":")[2] for _,c in pairs(all_colours) do - if c[1] == colr then + -- only dye if colour option available and sheep not same colour + if c[1] == colr and self.name ~= "mobs_animal:sheep_" .. colr then local pos = self.object:get_pos() - self.object:remove() - + -- add new coloured sheep local mob = minetest.add_entity(pos, "mobs_animal:sheep_" .. colr) local ent = mob:get_luaentity() - ent.owner = name - ent.tamed = true + if ent then - -- take item - if not mobs.is_creative(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) + local prop = self.object:get_properties() + + -- add old sheep attributes + ent.attribute_horns = self.attribute_horns + ent._nametag = prop.nametag + ent.owner = name + ent.tamed = true + ent.protected = self.protected + ent.fire_damage = self.fire_damage + + -- set sheep texture with colour override since we're + -- calling function inside different sheep + local textures = horn_texture_sel( + self.attribute_horns, false, colr) + + ent.base_texture = {textures} + ent.object:set_properties({ + textures = {textures} + }) + + -- remove old sheep + self.object:remove() + + -- take item + if not mobs.is_creative(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + + break end - - break end end end @@ -205,50 +370,161 @@ for _, col in ipairs(all_colours) do end }) -mobs:register_egg("mobs_animal:sheep_"..col[1], S("@1 Sheep", col[2]), "wool_"..col[1]..".png^mobs_sheep_inv.png") + -- spawn egg + mobs:register_egg("mobs_animal:sheep_"..col[1], S("@1 Sheep", col[2]), + "wool_" .. col[1] .. ".png^mobs_sheep_inv.png") -- compatibility mobs:alias_mob("mobs:sheep_" .. col[1], "mobs_animal:sheep_" .. col[1]) - end +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:sheep_white", - nodes = {"default:dirt_with_grass", "ethereal:green_dirt"}, - neighbors = {"group:grass"}, - min_light = 14, - interval = 60, - chance = 8000, -- 15000 - min_height = 0, - max_height = 200, - day_toggle = true, -}) + + local max_ht = 400 + local spawn_on = {"default:dirt_with_grass", "ethereal:green_dirt"} + local mod_ethereal = minetest.get_modpath("ethereal") + local spawn_chance = mod_ethereal and 12000 or 8000 + + mobs:spawn({ + name = "mobs_animal:sheep_white", + nodes = spawn_on, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = spawn_chance, + min_height = 0, + max_height = max_ht, + day_toggle = true, + active_object_count = 3, + + -- custom function to spawn sheep herds around main mob + on_spawn = function(self, pos) + + local nat_colors = {-- reference for all_colours table + ["white"] = 14, + ["grey"] = 8, + ["dark_grey"] = 6, + ["black"] = 1, + ["brown"] = 3 + } + + local function random_sheep(pos, first) + + local types = "white" + local color = all_colours[nat_colors["white"]][3] + + -- Random colour selection + -- black(1/8), brown(1/16), dark_grey(1/32), grey(1/32), 6/8 white + local ran_col = random(32) + + if ran_col <= 8 then + if ran_col == 1 then + types = "dark_grey" + elseif ran_col == 2 then + types = "grey" + elseif ran_col >= 3 and ran_col <= 4 then + types = "brown" + else + types = "black" + end + end + + -- 1/4 chance of lamb + local lamb + + if not first then + lamb = random(4) == 1 + end + + -- store returned entity data from mobs:add_mob, "nil" indicates the + -- rules in mobs:add_mob stopped mob from being spawned/created. + local entity = mobs:add_mob(pos, + {name = "mobs_animal:sheep_" .. types, child = lamb}) + + -- nil check + if not entity then return end + + if not lamb then + -- Set horns attribute, lower height will be rarer. + -- This wont affect mobs spawned by egg those only spawn hornless sheep. + local horns = random(max_ht) <= pos.y + + if horns then + + local text = "mobs_sheep_base.png^mobs_sheep_horns.png" + .."^(mobs_sheep_wool.png^[multiply:" + .. all_colours[nat_colors[types]][3] .. ")" + + entity.object:set_properties({textures = {text}}) + entity.base_texture = {text} + entity.attribute_horns = horns + end + end + end + + -- First Sheep, Randomize color/horns + self.object:remove() + + random_sheep(pos, true) + + -- Rest of herd + local nods = minetest.find_nodes_in_area_under_air( + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, spawn_on) + + if nods and #nods > 0 then + + -- min herd of 3 + local iter = math.min(#nods, 3) + + for n = 1, iter do + + local pos2 = nods[random(#nods)] + + pos2.y = pos2.y + 2 + + if minetest.get_node(pos2).name == "air" then + + -- Add a sheep or lamb + random_sheep(pos2, false) + end + end + end + end + }) end +-- compatibility with older mobs mod -mobs:alias_mob("mobs:sheep", "mobs_animal:sheep_white") -- compatibility +mobs:alias_mob("mobs:sheep", "mobs_animal:sheep_white") -- raw mutton + minetest.register_craftitem(":mobs:mutton_raw", { description = S("Raw Mutton"), inventory_image = "mobs_mutton_raw.png", on_use = minetest.item_eat(2), - groups = {food_meat_raw = 1, food_mutton_raw = 1, flammable = 2}, + groups = {food_meat_raw = 1, food_mutton_raw = 1} }) --- cooked mutton +mobs.add_eatable("mobs:mutton_raw", 2) + +-- cooked mutton and recipe + minetest.register_craftitem(":mobs:mutton_cooked", { description = S("Cooked Mutton"), inventory_image = "mobs_mutton_cooked.png", on_use = minetest.item_eat(6), - groups = {food_meat = 1, food_mutton = 1, flammable = 2}, + groups = {food_meat = 1, food_mutton = 1} }) +mobs.add_eatable("mobs:mutton_cooked", 6) + minetest.register_craft({ type = "cooking", output = "mobs:mutton_cooked", recipe = "mobs:mutton_raw", - cooktime = 5, + cooktime = 5 }) diff --git a/mods/mobs_animal/textures/mobs_butter.png b/mods/mobs_animal/textures/mobs_butter.png index 2e843497..ccc5f565 100644 Binary files a/mods/mobs_animal/textures/mobs_butter.png and b/mods/mobs_animal/textures/mobs_butter.png differ diff --git a/mods/mobs_animal/textures/mobs_cheeseblock.png b/mods/mobs_animal/textures/mobs_cheeseblock.png index dfa7c189..85265ccb 100644 Binary files a/mods/mobs_animal/textures/mobs_cheeseblock.png and b/mods/mobs_animal/textures/mobs_cheeseblock.png differ diff --git a/mods/mobs_animal/textures/mobs_kitten_black.png b/mods/mobs_animal/textures/mobs_kitten_black.png new file mode 100755 index 00000000..045bcac9 Binary files /dev/null and b/mods/mobs_animal/textures/mobs_kitten_black.png differ diff --git a/mods/mobs_animal/textures/mobs_rat.png b/mods/mobs_animal/textures/mobs_rat.png index f854b09f..b0fd32c3 100644 Binary files a/mods/mobs_animal/textures/mobs_rat.png and b/mods/mobs_animal/textures/mobs_rat.png differ diff --git a/mods/mobs_animal/textures/mobs_rat2.png b/mods/mobs_animal/textures/mobs_rat2.png index 0c222d67..5017a775 100644 Binary files a/mods/mobs_animal/textures/mobs_rat2.png and b/mods/mobs_animal/textures/mobs_rat2.png differ diff --git a/mods/mobs_animal/textures/mobs_rat3.png b/mods/mobs_animal/textures/mobs_rat3.png new file mode 100644 index 00000000..84bbeaee Binary files /dev/null and b/mods/mobs_animal/textures/mobs_rat3.png differ diff --git a/mods/mobs_animal/textures/mobs_sheep_base.png b/mods/mobs_animal/textures/mobs_sheep_base.png index c3c2c4a1..ac5fec2f 100644 Binary files a/mods/mobs_animal/textures/mobs_sheep_base.png and b/mods/mobs_animal/textures/mobs_sheep_base.png differ diff --git a/mods/mobs_animal/textures/mobs_sheep_horns.png b/mods/mobs_animal/textures/mobs_sheep_horns.png new file mode 100644 index 00000000..960c1309 Binary files /dev/null and b/mods/mobs_animal/textures/mobs_sheep_horns.png differ diff --git a/mods/mobs_animal/textures/mobs_sheep_shaved.png b/mods/mobs_animal/textures/mobs_sheep_shaved.png index e9023a48..83c96506 100644 Binary files a/mods/mobs_animal/textures/mobs_sheep_shaved.png and b/mods/mobs_animal/textures/mobs_sheep_shaved.png differ diff --git a/mods/mobs_animal/textures/mobs_sheep_wool.png b/mods/mobs_animal/textures/mobs_sheep_wool.png index 2dca0dc8..dc871f2c 100644 Binary files a/mods/mobs_animal/textures/mobs_sheep_wool.png and b/mods/mobs_animal/textures/mobs_sheep_wool.png differ diff --git a/mods/mobs_animal/textures/mobs_wooden_bucket_milk.png b/mods/mobs_animal/textures/mobs_wooden_bucket_milk.png new file mode 100644 index 00000000..a544fd53 Binary files /dev/null and b/mods/mobs_animal/textures/mobs_wooden_bucket_milk.png differ diff --git a/mods/mobs_animal/warthog.lua b/mods/mobs_animal/warthog.lua index f28f7445..df0ea82e 100644 --- a/mods/mobs_animal/warthog.lua +++ b/mods/mobs_animal/warthog.lua @@ -1,6 +1,5 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_animal") -- Warthog originally by KrupnoPavel, B3D model by sirrobzeroone @@ -20,13 +19,11 @@ mobs:register_mob("mobs_animal:pumba", { collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.95, 0.4}, visual = "mesh", mesh = "mobs_pumba.b3d", - textures = { - {"mobs_pumba.png"}, - }, + textures = {{"mobs_pumba.png"}}, makes_footstep_sound = true, sounds = { random = "mobs_pig", - attack = "mobs_pig_angry", + attack = "mobs_pig_angry" }, walk_velocity = 2, run_velocity = 3, @@ -36,87 +33,88 @@ mobs:register_mob("mobs_animal:pumba", { follow = {"default:apple", "farming:potato"}, view_range = 10, drops = { - {name = "mobs:pork_raw", chance = 1, min = 1, max = 3}, + {name = "mobs:pork_raw", chance = 1, min = 1, max = 3} }, - water_damage = 0, + water_damage = 0.01, lava_damage = 5, light_damage = 0, fear_height = 2, animation = { speed_normal = 15, - stand_start = 25, - stand_end = 55, - walk_start = 70, - walk_end = 100, - punch_start = 70, - punch_end = 100, - - die_start = 1, -- we dont have a specific death animation so we will - die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and - die_speed = 1, -- have mob rotate when dying. - die_loop = false, - die_rotate = true, + stand_start = 25, stand_end = 55, + walk_start = 70, walk_end = 100, + punch_start = 70, punch_end = 100, + -- no specific dying animation, so use 2 frames at 1fps and rotate + die_start = 1, die_end = 2, die_speed = 1, + die_loop = false, die_rotate = true }, + on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 8, true, true) then return end if mobs:protect(self, clicker) then return end if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end - end, + end }) -local spawn_on = {"default:dirt_with_grass"} -local spawn_by = {"group:grass"} - -if minetest.get_mapgen_setting("mg_name") ~= "v6" then - spawn_on = {"default:dirt_with_dry_grass", "default:dry_dirt_with_dry_grass"} - spawn_by = {"group:dry_grass"} -end - -if minetest.get_modpath("ethereal") then - spawn_on = {"ethereal:mushroom_dirt"} - spawn_by = {"flowers:mushroom_brown", "flowers:mushroom_red"} -end +-- where to spawn if not mobs.custom_spawn_animal then -mobs:spawn({ - name = "mobs_animal:pumba", - nodes = spawn_on, - neighbors = spawn_by, - min_light = 14, - interval = 60, - chance = 8000, -- 15000 - min_height = 0, - max_height = 200, - day_toggle = true, -}) + + local spawn_on = {"default:dirt_with_grass", "default:dry_dirt_with_dry_grass"} + local spawn_by = {"group:grass"} + + if minetest.get_modpath("ethereal") then + spawn_on = {"ethereal:mushroom_dirt"} + spawn_by = {"flowers:mushroom_brown", "flowers:mushroom_red"} + end + + mobs:spawn({ + name = "mobs_animal:pumba", + nodes = spawn_on, + neighbors = spawn_by, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 0, + max_height = 200, + day_toggle = true + }) end +-- spawn egg + mobs:register_egg("mobs_animal:pumba", S("Warthog"), "mobs_pumba_inv.png") +-- old mobs mod compatibility -mobs:alias_mob("mobs:pumba", "mobs_animal:pumba") -- compatibility - +mobs:alias_mob("mobs:pumba", "mobs_animal:pumba") -- raw porkchop + minetest.register_craftitem(":mobs:pork_raw", { description = S("Raw Porkchop"), inventory_image = "mobs_pork_raw.png", on_use = minetest.item_eat(4), - groups = {food_meat_raw = 1, food_pork_raw = 1, flammable = 2}, + groups = {food_meat_raw = 1, food_pork_raw = 1} }) --- cooked porkchop +mobs.add_eatable("mobs:pork_raw", 4) + +-- cooked porkchop and recipe + minetest.register_craftitem(":mobs:pork_cooked", { description = S("Cooked Porkchop"), inventory_image = "mobs_pork_cooked.png", on_use = minetest.item_eat(8), - groups = {food_meat = 1, food_pork = 1, flammable = 2}, + groups = {food_meat = 1, food_pork = 1} }) +mobs.add_eatable("mobs:pork_cooked", 8) + minetest.register_craft({ type = "cooking", output = "mobs:pork_cooked", recipe = "mobs:pork_raw", - cooktime = 5, + cooktime = 5 }) diff --git a/mods/mobs_monster/depends.txt b/mods/mobs_monster/depends.txt deleted file mode 100644 index 8d14ca3e..00000000 --- a/mods/mobs_monster/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -mobs -default? -lucky_block? -toolranks? -intllib? diff --git a/mods/mobs_monster/description.txt b/mods/mobs_monster/description.txt deleted file mode 100644 index ac3d8870..00000000 --- a/mods/mobs_monster/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds many types of monster. diff --git a/mods/mobs_monster/dirt_monster.lua b/mods/mobs_monster/dirt_monster.lua index 3631fb26..3001784f 100644 --- a/mods/mobs_monster/dirt_monster.lua +++ b/mods/mobs_monster/dirt_monster.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs_monster") + +-- custom dirt monster type local dirt_types = { @@ -11,7 +13,6 @@ local dirt_types = { } } - -- Dirt Monster by PilzAdam mobs:register_mob("mobs_monster:dirt_monster", { @@ -29,35 +30,28 @@ mobs:register_mob("mobs_monster:dirt_monster", { mesh = "mobs_stone_monster.b3d", textures = { {"mobs_dirt_monster.png"}, - {"mobs_dirt_monster2.png"}, + {"mobs_dirt_monster2.png"} }, blood_texture = "default_dirt.png", makes_footstep_sound = true, - sounds = { - random = "mobs_dirtmonster", - }, + sounds = {random = "mobs_dirtmonster"}, view_range = 15, walk_velocity = 1, run_velocity = 3, jump = true, drops = { - {name = "default:dirt", chance = 1, min = 0, max = 2}, + {name = "default:dirt", chance = 1, min = 0, max = 2} }, water_damage = 1, lava_damage = 5, light_damage = 3, fear_height = 4, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 14, - walk_start = 15, - walk_end = 38, - run_start = 40, - run_end = 63, - punch_start = 40, - punch_end = 63, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 14, + walk_start = 15, walk_end = 38, + run_start = 40, run_end = 63, + punch_start = 40, punch_end = 63 }, -- check surrounding nodes and spawn a specific monster @@ -75,9 +69,7 @@ mobs:register_mob("mobs_monster:dirt_monster", { self.base_texture = tmp.skins self.object:set_properties({textures = tmp.skins}) - if tmp.drops then - self.drops = tmp.drops - end + if tmp.drops then self.drops = tmp.drops end return true end @@ -87,22 +79,26 @@ mobs:register_mob("mobs_monster:dirt_monster", { end }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:dirt_monster", - nodes = {"default:dirt_with_grass", "ethereal:gray_dirt", "ethereal:dry_dirt"}, - min_light = 0, - max_light = 7, - chance = 6000, - active_object_count = 2, - min_height = 0, - day_toggle = false, -}) + + mobs:spawn({ + name = "mobs_monster:dirt_monster", + nodes = {"default:dirt_with_grass", "ethereal:gray_dirt", "ethereal:dry_dirt"}, + min_light = 0, + max_light = 7, + chance = 6000, + active_object_count = 2, + min_height = 0, + day_toggle = false + }) end +-- spawn egg mobs:register_egg("mobs_monster:dirt_monster", S("Dirt Monster"), "default_dirt.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:dirt_monster", "mobs_monster:dirt_monster") -- compatibility +mobs:alias_mob("mobs:dirt_monster", "mobs_monster:dirt_monster") diff --git a/mods/mobs_monster/dungeon_master.lua b/mods/mobs_monster/dungeon_master.lua index b2f9a454..61ec8155 100644 --- a/mods/mobs_monster/dungeon_master.lua +++ b/mods/mobs_monster/dungeon_master.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs_monster") + +-- custom dungeon master types local master_types = { @@ -11,7 +13,6 @@ local master_types = { } } - -- Dungeon Master by PilzAdam mobs:register_mob("mobs_monster:dungeon_master", { @@ -25,6 +26,7 @@ mobs:register_mob("mobs_monster:dungeon_master", { reach = 3, shoot_interval = 2.2, arrow = "mobs_monster:fireball", + friendly_fire = false, shoot_offset = 1, hp_min = 42, hp_max = 75, @@ -35,12 +37,12 @@ mobs:register_mob("mobs_monster:dungeon_master", { textures = { {"mobs_dungeon_master.png"}, {"mobs_dungeon_master2.png"}, - {"mobs_dungeon_master3.png"}, + {"mobs_dungeon_master3.png"} }, makes_footstep_sound = true, sounds = { random = "mobs_dungeonmaster", - shoot_attack = "mobs_fireball", + shoot_attack = "mobs_fireball" }, walk_velocity = 1, run_velocity = 3, @@ -51,23 +53,18 @@ mobs:register_mob("mobs_monster:dungeon_master", { {name = "mobs:leather", chance = 2, min = 0, max = 2}, {name = "default:mese_crystal", chance = 3, min = 0, max = 2}, {name = "default:diamond", chance = 4, min = 0, max = 1}, - {name = "default:diamondblock", chance = 30, min = 0, max = 1}, + {name = "default:diamondblock", chance = 30, min = 0, max = 1} }, water_damage = 1, lava_damage = 1, light_damage = 0, fear_height = 3, animation = { - stand_start = 0, - stand_end = 19, - walk_start = 20, - walk_end = 35, - punch_start = 36, - punch_end = 48, - shoot_start = 36, - shoot_end = 48, - speed_normal = 15, - speed_run = 15, + stand_start = 0, stand_end = 19, + walk_start = 20, walk_end = 35, + punch_start = 36, punch_end = 48, + shoot_start = 36, shoot_end = 48, + speed_normal = 15, speed_run = 15 }, -- check surrounding nodes and spawn a specific monster @@ -85,9 +82,7 @@ mobs:register_mob("mobs_monster:dungeon_master", { self.base_texture = tmp.skins self.object:set_properties({textures = tmp.skins}) - if tmp.drops then - self.drops = tmp.drops - end + if tmp.drops then self.drops = tmp.drops end return true end @@ -97,26 +92,31 @@ mobs:register_mob("mobs_monster:dungeon_master", { end }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:dungeon_master", - nodes = {"default:stone", "nether:rack", "nether:rack_deep"}, - max_light = 5, - chance = 9000, - active_object_count = 1, - max_height = -70, -}) + + mobs:spawn({ + name = "mobs_monster:dungeon_master", + nodes = {"default:stone", "nether:rack", "nether:rack_deep"}, + max_light = 5, + chance = 9000, + active_object_count = 1, + max_height = -70 + }) end +-- spawn egg -mobs:register_egg("mobs_monster:dungeon_master", S("Dungeon Master"), "fire_basic_flame.png", 1, true) +mobs:register_egg("mobs_monster:dungeon_master", S("Dungeon Master"), + "fire_basic_flame.png", 1, true) +-- old mobs mod compatibility -mobs:alias_mob("mobs:dungeon_master", "mobs_monster:dungeon_master") -- compatibility +mobs:alias_mob("mobs:dungeon_master", "mobs_monster:dungeon_master") +-- fireball arrow --- fireball (weapon) mobs:register_arrow("mobs_monster:fireball", { visual = "sprite", visual_size = {x = 1, y = 1}, @@ -149,7 +149,7 @@ mobs:register_arrow("mobs_monster:fireball", { self.object:set_velocity({ x = dir.x * self.velocity, y = dir.y * self.velocity, - z = dir.z * self.velocity, + z = dir.z * self.velocity }) end end @@ -157,16 +157,18 @@ mobs:register_arrow("mobs_monster:fireball", { -- direct hit, no fire... just plenty of pain hit_player = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 8}, + damage_groups = {fleshy = 8} }, nil) end, hit_mob = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 8}, + damage_groups = {fleshy = 8} }, nil) end, diff --git a/mods/mobs_monster/fire_spirit.lua b/mods/mobs_monster/fire_spirit.lua index 6e9bea92..4305d33a 100644 --- a/mods/mobs_monster/fire_spirit.lua +++ b/mods/mobs_monster/fire_spirit.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +-- translation and drops + +local S = minetest.get_translator("mobs_monster") local mob_drops = { {name = "fireflies:firefly", chance = 1, min = 1, max = 1} @@ -26,14 +28,12 @@ mobs:register_mob("mobs_monster:fire_spirit", { collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, visual_scale = {x = 0.5, y = 0.5, z = 0.5}, visual = "sprite", - textures = { - {"mobs_fire_spirit.png"} - }, + textures = {{"mobs_fire_spirit.png"}}, glow = 14, blood_texture = "fire_basic_flame.png", immune_to = { - {"bucket:bucket_water", 1}, - {"bucket:bucket_river_water", 1}, + {"bucket:bucket_water", 2}, + {"bucket:bucket_river_water", 2}, {"all"} }, makes_footstep_sound = false, @@ -48,7 +48,7 @@ mobs:register_mob("mobs_monster:fire_spirit", { jump = true, jump_height = 6, drops = mob_drops, - water_damage = 1, + water_damage = 4, lava_damage = 0, fire_damage = 0, light_damage = 0, @@ -67,9 +67,7 @@ mobs:register_mob("mobs_monster:fire_spirit", { self.flame_timer = (self.flame_timer or 0) + dtime - if self.flame_timer < 0.25 then - return - end + if self.flame_timer < 0.1 then return end self.flame_timer = 0 @@ -80,19 +78,22 @@ mobs:register_mob("mobs_monster:fire_spirit", { end }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:fire_spirit", - nodes = {"default:obsidian", "caverealms:hot_cobble"}, - neighbors = {"group:fire"}, - min_light = 12, - max_light = 15, - chance = 1500, - active_object_count = 1, - max_height = -150 -}) + + mobs:spawn({ + name = "mobs_monster:fire_spirit", + nodes = {"default:obsidian", "caverealms:hot_cobble"}, + neighbors = {"group:fire"}, + min_light = 12, + max_light = 15, + chance = 1500, + active_object_count = 1, + max_height = -150 + }) end +-- spawn egg mobs:register_egg("mobs_monster:fire_spirit", S("Fire Spirit"), "fire_basic_flame.png", 1) diff --git a/mods/mobs_monster/init.lua b/mods/mobs_monster/init.lua index e00db938..d2b0145e 100644 --- a/mods/mobs_monster/init.lua +++ b/mods/mobs_monster/init.lua @@ -1,14 +1,11 @@ --- Load support for intllib. +-- translation and mod path + +local S = minetest.get_translator("mobs_monster") local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" -local S = minetest.get_translator and minetest.get_translator("mobs_monster") or - dofile(path .. "intllib.lua") - -mobs.intllib = S - - -- Check for custom mob spawn file + local input = io.open(path .. "spawn.lua", "r") if input then @@ -17,29 +14,42 @@ if input then input = nil end +-- helper function + +local function ddoo(mob) + + if minetest.settings:get_bool("mobs_monster." .. mob) == false then + print("[Mobs_Monster] " .. mob .. " disabled!") + return + end + + dofile(path .. mob .. ".lua") +end -- Monsters -dofile(path .. "dirt_monster.lua") -- PilzAdam -dofile(path .. "dungeon_master.lua") -dofile(path .. "oerkki.lua") -dofile(path .. "sand_monster.lua") -dofile(path .. "stone_monster.lua") -dofile(path .. "tree_monster.lua") -dofile(path .. "lava_flan.lua") -- Zeg9 -dofile(path .. "mese_monster.lua") -dofile(path .. "spider.lua") -- AspireMint -dofile(path .. "land_guard.lua") -dofile(path .. "fire_spirit.lua") +ddoo("dirt_monster") -- PilzAdam +ddoo("dungeon_master") +ddoo("oerkki") +ddoo("sand_monster") +ddoo("stone_monster") +ddoo("tree_monster") +ddoo("lava_flan") -- Zeg9 +ddoo("mese_monster") +ddoo("spider") -- AspireMint +ddoo("land_guard") +ddoo("fire_spirit") + +-- Load custom spawning if found --- Load custom spawning if mobs.custom_spawn_monster then dofile(path .. "spawn.lua") end - -- Lucky Blocks -dofile(path .. "lucky_block.lua") +if minetest.get_modpath("lucky_block") then + dofile(path .. "lucky_block.lua") +end print ("[MOD] Mobs Redo Monsters loaded") diff --git a/mods/mobs_monster/intllib.lua b/mods/mobs_monster/intllib.lua deleted file mode 100644 index 7decdf7d..00000000 --- a/mods/mobs_monster/intllib.lua +++ /dev/null @@ -1,3 +0,0 @@ --- Support for the old multi-load method -return dofile(minetest.get_modpath("intllib").."/init.lua") - diff --git a/mods/mobs_monster/land_guard.lua b/mods/mobs_monster/land_guard.lua index 6545b33e..950c52e3 100644 --- a/mods/mobs_monster/land_guard.lua +++ b/mods/mobs_monster/land_guard.lua @@ -1,6 +1,7 @@ -local S = mobs.intllib +-- translation and custom land guard types +local S = minetest.get_translator("mobs_monster") local guard_types = { @@ -51,9 +52,7 @@ mobs:register_mob("mobs_monster:land_guard", { {"mobs_land_guard3.png"} }, makes_footstep_sound = true, - sounds = { - random = "mobs_dungeonmaster", - }, + sounds = {random = "mobs_dungeonmaster"}, walk_velocity = 1.5, run_velocity = 3.4, jump = true, @@ -70,14 +69,10 @@ mobs:register_mob("mobs_monster:land_guard", { light_damage = 0, fear_height = 8, animation = { - stand_start = 0, - stand_end = 19, - walk_start = 20, - walk_end = 35, - punch_start = 36, - punch_end = 48, - speed_normal = 15, - speed_run = 20, + stand_start = 0, stand_end = 19, + walk_start = 20, walk_end = 35, + punch_start = 36, punch_end = 48, + speed_normal = 15, speed_run = 20, }, -- check surrounding nodes and spawn a specific guard @@ -96,9 +91,7 @@ mobs:register_mob("mobs_monster:land_guard", { self.object:set_properties({textures = self.base_texture}) self.docile_by_day = tmp.docile - if tmp.drops then - self.drops = tmp.drops - end + if tmp.drops then self.drops = tmp.drops end return true end @@ -108,20 +101,23 @@ mobs:register_mob("mobs_monster:land_guard", { end, }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:land_guard", - nodes = { - "default:snow", "default:ice", "default:stone", - "default:dry_dirt_with_dry_grass", "ethereal:dry_dirt" - }, - max_light = 7, - chance = 25000, - min_height = 0, - active_object_count = 1, -}) + + mobs:spawn({ + name = "mobs_monster:land_guard", + nodes = { + "default:snow", "default:ice", "default:stone", + "default:dry_dirt_with_dry_grass", "ethereal:dry_dirt" + }, + max_light = 7, + chance = 25000, + min_height = 0, + active_object_count = 1, + }) end +-- spawn egg mobs:register_egg("mobs_monster:land_guard", S("Land Guard"), "default_ice.png", 1) diff --git a/mods/mobs_monster/lava_flan.lua b/mods/mobs_monster/lava_flan.lua index 1e957e36..17f9213a 100644 --- a/mods/mobs_monster/lava_flan.lua +++ b/mods/mobs_monster/lava_flan.lua @@ -1,6 +1,5 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_monster") -- Lava Flan by Zeg9 (additional textures by JurajVajda) @@ -8,24 +7,24 @@ mobs:register_mob("mobs_monster:lava_flan", { type = "monster", passive = false, attack_type = "dogfight", - reach = 2, + reach = 2.5, damage = 3, - hp_min = 10, + hp_min = 20, hp_max = 35, armor = 80, collisionbox = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, visual = "mesh", - mesh = "zmobs_lava_flan.x", + mesh = "zmobs_lava_flan.b3d", textures = { {"zmobs_lava_flan.png"}, {"zmobs_lava_flan2.png"}, - {"zmobs_lava_flan3.png"}, + {"zmobs_lava_flan3.png"} }, blood_texture = "fire_basic_flame.png", makes_footstep_sound = false, sounds = { random = "mobs_lavaflan", - war_cry = "mobs_lavaflan", + war_cry = "mobs_lavaflan" }, walk_velocity = 0.5, run_velocity = 2, @@ -33,14 +32,14 @@ mobs:register_mob("mobs_monster:lava_flan", { view_range = 10, floats = 1, drops = { - {name = "mobs:lava_orb", chance = 15, min = 1, max = 1}, + {name = "mobs:lava_orb", chance = 15, min = 1, max = 1} }, water_damage = 8, lava_damage = -1, fire_damage = 0, light_damage = 0, immune_to = { - {"mobs:pick_lava", -2}, -- lava pick heals 2 health + {"mobs:pick_lava", -2} -- lava pick heals 2 health }, fly_in = {"default:lava_source", "default:lava_flowing"}, animation = { @@ -55,6 +54,8 @@ mobs:register_mob("mobs_monster:lava_flan", { punch_start = 20, punch_end = 28 }, + + -- custom death function on_die = function(self, pos) local cod = self.cause_of_death or {} @@ -67,50 +68,61 @@ mobs:register_mob("mobs_monster:lava_flan", { mobs:effect(pos, 40, "tnt_smoke.png", 3, 5, 2, 0.5, nil, false) minetest.sound_play("fire_extinguish_flame", - {pos = pos, max_hear_distance = 12, gain = 1.5}, true) + {pos = pos, max_hear_distance = 12, gain = 1.5}, true) self.object:remove() if math.random(4) == 1 then - mobs:add_mob(pos, { - name = "mobs_monster:obsidian_flan", - }) + mobs:add_mob(pos, {name = "mobs_monster:obsidian_flan"}) end else - if minetest.get_node(pos).name == "air" then + mobs:effect(pos, 40, "fire_basic_flame.png", 2, 3, 2, 5, 10, nil) + + local nods = minetest.find_nodes_in_area( + {x = pos.x, y = pos.y + 1, z = pos.z}, + {x = pos.x, y = pos.y, z = pos.z}, "air") + + -- place flame if position empty and flame exists + if nods and #nods > 0 + and minetest.registered_nodes["fire:basic_flame"] then + + pos = nods[math.random(#nods)] minetest.set_node(pos, {name = "fire:basic_flame"}) end - mobs:effect(pos, 40, "fire_basic_flame.png", 2, 3, 2, 5, 10, nil) - self.object:remove() end end, - glow = 10, + glow = 10 }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:lava_flan", - nodes = {"default:lava_source"}, - chance = 1500, - active_object_count = 1, - max_height = 0, -}) + + mobs:spawn({ + name = "mobs_monster:lava_flan", + nodes = {"default:lava_source"}, + chance = 1500, + active_object_count = 1, + max_height = 0 + }) end +-- spawn egg mobs:register_egg("mobs_monster:lava_flan", S("Lava Flan"), "default_lava.png", 1) -mobs:alias_mob("mobs:lava_flan", "mobs_monster:lava_flan") -- compatibility +-- compatibility for old mobs mod +mobs:alias_mob("mobs:lava_flan", "mobs_monster:lava_flan") -- lava orb + minetest.register_craftitem(":mobs:lava_orb", { description = S("Lava orb"), inventory_image = "zmobs_lava_orb.png", - light_source = 14, + light_source = 14 }) minetest.register_alias("zmobs:lava_orb", "mobs:lava_orb") @@ -118,57 +130,63 @@ minetest.register_alias("zmobs:lava_orb", "mobs:lava_orb") minetest.register_craft({ type = "fuel", recipe = "mobs:lava_orb", - burntime = 80, + burntime = 80 }) - --- Lava Pick (digs and smelts at same time) +-- backup and replace old function local old_handle_node_drops = minetest.handle_node_drops function minetest.handle_node_drops(pos, drops, digger) - -- does player exist? - if not digger then return end + -- are we a player using the lava pick? + if digger and digger:get_wielded_item():get_name() == ("mobs:pick_lava") then - -- are we holding Lava Pick? - if digger:get_wielded_item():get_name() ~= ("mobs:pick_lava") then - return old_handle_node_drops(pos, drops, digger) - end + local hot_drops = {} + local is_cooked - -- reset new smelted drops - local hot_drops = {} + for _, drop in ipairs(drops) do - -- loop through current node drops - for _, drop in pairs(drops) do + local stack = ItemStack(drop) - -- get cooked output of current drops - local stack = ItemStack(drop) - local output = minetest.get_craft_result({ - method = "cooking", - width = 1, - items = {drop} - }) + while not stack:is_empty() do - -- if we have cooked result then add to new list - if output - and output.item - and not output.item:is_empty() then + local output, decremented_input = minetest.get_craft_result({ + method = "cooking", width = 1, items = {stack}}) - table.insert(hot_drops, - ItemStack({ - name = output.item:get_name(), - count = output.item:to_table().count, - }) - ) - else -- if not then return normal drops - table.insert(hot_drops, stack) + if output.item:is_empty() then + table.insert_all(hot_drops, decremented_input.items) + break + else + is_cooked = true + + if not output.item:is_empty() then + table.insert(hot_drops, output.item) + end + + table.insert_all(hot_drops, output.replacements) + + stack = decremented_input.items[1] or ItemStack() + end + end + end + + drops = hot_drops -- replace normal drops with cooked versions + + if is_cooked then + + mobs:effect(pos, 1, "tnt_smoke.png", 3, 5, 2, 0.5, nil, false) + + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 5, gain = 0.05}, true) end end - return old_handle_node_drops(pos, hot_drops, digger) + return old_handle_node_drops(pos, drops, digger) end +-- lava pick, smelts nodes when you dig + minetest.register_tool(":mobs:pick_lava", { description = S("Lava Pickaxe"), inventory_image = "mobs_pick_lava.png", @@ -177,9 +195,7 @@ minetest.register_tool(":mobs:pick_lava", { max_drop_level = 3, groupcaps = { cracky = { - times = {[1] = 1.80, [2] = 0.80, [3] = 0.40}, - uses = 40, - maxlevel = 3 + times = {[1] = 1.80, [2] = 0.80, [3] = 0.40}, uses = 40, maxlevel = 3 } }, damage_groups = {fleshy = 6, fire = 1}, @@ -188,6 +204,8 @@ minetest.register_tool(":mobs:pick_lava", { light_source = 14 }) +-- recipe + minetest.register_craft({ output = "mobs:pick_lava", recipe = { @@ -197,16 +215,16 @@ minetest.register_craft({ } }) --- Add [toolranks] mod support if found +-- Add [toolranks] mod support + if minetest.get_modpath("toolranks") then -minetest.override_item("mobs:pick_lava", { - original_description = "Lava Pickaxe", - description = toolranks.create_description("Lava Pickaxe", 0, 1), - after_use = toolranks.new_afteruse}) + minetest.override_item("mobs:pick_lava", { + original_description = S("Lava Pickaxe"), + description = toolranks.create_description("Lava Pickaxe", 0, 1), + after_use = toolranks.new_afteruse}) end - -- obsidian flan mobs:register_mob("mobs_monster:obsidian_flan", { @@ -218,22 +236,17 @@ mobs:register_mob("mobs_monster:obsidian_flan", { arrow = "mobs_monster:obsidian_arrow", reach = 2, damage = 3, - hp_min = 10, + hp_min = 20, hp_max = 35, armor = 30, visual_size = {x = 0.6, y = 0.6}, collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.8, 0.3}, visual = "mesh", - mesh = "zmobs_lava_flan.x", - textures = { - {"mobs_obsidian_flan.png"}, - }, + mesh = "zmobs_lava_flan.b3d", + textures = {{"mobs_obsidian_flan.png"}}, blood_texture = "default_obsidian.png", makes_footstep_sound = true, - sounds = { - random = "mobs_lavaflan", --- war_cry = "mobs_lavaflan", - }, + sounds = {random = "mobs_lavaflan"}, walk_velocity = 0.1, run_velocity = 0.5, jump = false, @@ -241,42 +254,38 @@ mobs:register_mob("mobs_monster:obsidian_flan", { floats = 0, drops = { {name = "default:obsidian_shard", chance = 1, min = 1, max = 5}, - {name = "default:obsidian", chance = 3, min = 0, max = 2}, + {name = "default:obsidian", chance = 3, min = 0, max = 2} }, water_damage = 0, lava_damage = 8, fire_damage = 0, light_damage = 0, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 8, - walk_start = 10, - walk_end = 18, - run_start = 20, - run_end = 28, - punch_start = 20, - punch_end = 28 + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 8, + walk_start = 10, walk_end = 18, + run_start = 20, run_end = 28, + punch_start = 20, punch_end = 28 } }) +-- spawn egg + mobs:register_egg("mobs_monster:obsidian_flan", S("Obsidian Flan"), "default_obsidian.png", 1) +-- obsidian arrow and grief setting check local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false --- mese arrow (weapon) mobs:register_arrow("mobs_monster:obsidian_arrow", { visual = "sprite", --- visual = "wielditem", visual_size = {x = 0.5, y = 0.5}, textures = {"default_obsidian_shard.png"}, velocity = 6, --- rotate = 180, hit_player = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 8}, @@ -284,6 +293,7 @@ mobs:register_arrow("mobs_monster:obsidian_arrow", { end, hit_mob = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 8}, @@ -297,13 +307,10 @@ mobs:register_arrow("mobs_monster:obsidian_arrow", { end local texture = "default_dirt.png" --fallback texture - local radius = 1 - local def = minetest.registered_nodes[node] + local def = node and minetest.registered_nodes[node.name] - if def then - node = {name = node} - end + if not def then return end if def and def.tiles and def.tiles[1] then texture = def.tiles[1] @@ -338,6 +345,6 @@ mobs:register_arrow("mobs_monster:obsidian_arrow", { local snd = def.sounds and def.sounds.dug or "default_dig_crumbly" - minetest.sound_play(snd, {pos = pos, max_hear_distance = 12, gain = 1.0}, true) + minetest.sound_play(snd, {pos = pos, max_hear_distance = 8, gain = 1.0}, true) end }) diff --git a/mods/mobs_monster/license.txt b/mods/mobs_monster/license.txt index 89bf633c..1f043c1b 100644 --- a/mods/mobs_monster/license.txt +++ b/mods/mobs_monster/license.txt @@ -20,17 +20,72 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -mobs.fireball.png was originally made by Sapier and edited by Benrob: - --- Animals Mod by Sapier --- --- You may copy, use, modify or do nearly anything except removing this --- copyright notice. --- And of course you are NOT allow to pretend you have written it. --- --- (c) Sapier --- Contact sapier a t gmx net - -Textures created by wwar (cc0) +Textures created by wwar (CC0) mobs_dungeon_master_nether.png mobs_dungeon_master_netherdeep.png + mobs_stone_monster.png + mobs_dungeon_master2.png + mobs_land_guard.png + mobs_land_guard2.png + mobs_land_guard3.png + +Textures by AMMOnym (WTFPL) + mobs_stone_monster2.png + +Textures by TenPlus1 (MIT) + mobs_stone_monster3.png + mobs_fireball.png + mobs_obsidian_flan.png + +Textures by Sirrobzeroone (CC0 1.0 Universal) + mobs_stone_monster4.png + mobs_sand_monster.png + +Textures and Model created by SirrobZeroone (CC0) + mobs_mese_monster_red.png + mobs_mese_monster_blue.png + mobs_mese_monster_green.png + mobs_mese_monster_purple.png + mobs_mese_arrow.png + mobs_mese_monster.b3d + +Pavel_S and PilzAdam (WTFPL) + mobs_dirt_monster.png + mobs_dirt_monster2.png + mobs_dirt_monster3.png + mobs_dungeon_master.b3d + mobs_dungeon_master.png + mobs_dungeon_master.ogg + mobs_fireball.ogg + mobs_oerkki.b3d + mobs_oerkki.png + mobs_sand_monster.b3d [edited by SirrobZeroone] + mobs_sand_monster2.png + mobs_stone_monster.b3d [edited by SirrobZeroone] + mobs_tree_monster.b3d + mobs_tree_monster*.png (edited by TenPlus1) + +AspireMint (CC BY-SA 3.0) + mobs_spider.b3d + mobs_spider_mese.png + mobs_spider_orange.png + mobs_spider_snowy.png + mobs_spider_grey.png + mobs_spider_crystal.png + zmobs_lava_flan.b3d + zmobs_lava_flan.png + zmobs_lava_flan2.png + zmobs_lava_flan3.png + +Zeg9 (CC BY-SA 3.0) + zmobs_lava_orb.png + +Sounds by Cyberpangolin (WTFPL) https://forum.minetest.net/viewtopic.php?t=10798 + mobs_dirtmonster.ogg + mobs_dungeonmaster.ogg + mobs_lavaflan.ogg + mobs_mesemonster.ogg + mobs_oerkki.ogg + mobs_sandmonster.ogg + mobs_stonemonster.ogg + mobs_treemonster.ogg diff --git a/mods/mobs_monster/locale/de.txt b/mods/mobs_monster/locale/de.txt deleted file mode 100644 index e3dee308..00000000 --- a/mods/mobs_monster/locale/de.txt +++ /dev/null @@ -1,37 +0,0 @@ -# German Translation for mobs_monster mod -# Deutsche Übersetzung der mobs_monster Mod -# last update: 2016/June/10 -# Author: Xanthin - -#dirtmonster.lua -Dirt Monster = Erdmonster - -#dungeonmaster.lua -Dungeon Master = Kerkermeister - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monsters' geladen - -#lava_flan.lua -Lava Flan = Lavaflan -Lava orb = Lavakugel -Lava Pickaxe = Lavaspitzhacke - -#mese_monster.lua -Mese Monster = Mesemonster - -#oerkki.lua -Oerkki = Oerkki - -#sandmonster.lua -Sand Monster = Sandmonster - -#spider.lua -Spider = Spinne -Cobweb = Spinnennetz - -#stonemonster.lua -Stone Monster = Steinmonster - -#treemonster.lua -Tree Monster = Baummonster \ No newline at end of file diff --git a/mods/mobs_monster/locale/fr.txt b/mods/mobs_monster/locale/fr.txt deleted file mode 100644 index 660f6b5c..00000000 --- a/mods/mobs_monster/locale/fr.txt +++ /dev/null @@ -1,34 +0,0 @@ -# last update: 2016/June/10 - -#dirtmonster.lua -Dirt Monster = Monstre de terre - -#dungeonmaster.lua -Dungeon Master = Maître des donjons - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monstres' chargé - -#lava_flan.lua -Lava Flan = Flan de lave -Lava orb = Orbe de lave -Lava Pickaxe = Pioche de lave - -#mese_monster.lua -Mese Monster = Monstre de Mese - -#oerkki.lua -Oerkki = Oerkki - -#sandmonster.lua -Sand Monster = Monstre de sable - -#spider.lua -Spider = Araignée -Cobweb = Toile d'arraignée - -#stonemonster.lua -Stone Monster = Monstre de pierre - -#treemonster.lua -Tree Monster = Monstre de bois \ No newline at end of file diff --git a/mods/mobs_monster/locale/it.txt b/mods/mobs_monster/locale/it.txt deleted file mode 100644 index a9cbc0f2..00000000 --- a/mods/mobs_monster/locale/it.txt +++ /dev/null @@ -1,38 +0,0 @@ -# ITALIAN LOCALE FILE FOR THE MOBS MONSTER MODULE -# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 -# This file is distributed under the same license as the MOBS MONSTER package. -# Hamlet , 2017. -# - -#dirtmonster.lua -Dirt Monster = Mostro di terra - -#dungeonmaster.lua -Dungeon Master = Padrone delle segrete - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monsters' caricato - -#lava_flan.lua -Lava Flan = Sformato di lava -Lava orb = Sfera di lava -Lava Pickaxe = Piccone di lava - -#mese_monster.lua -Mese Monster = Mostro di mese - -#oerkki.lua -Oerkki = Oerkki - -#sandmonster.lua -Sand Monster = Mostro di sabbia - -#spider.lua -Spider = Ragno -Cobweb = Ragnatela - -#stonemonster.lua -Stone Monster = Mostro di pietra - -#treemonster.lua -Tree Monster = Albero mostro \ No newline at end of file diff --git a/mods/mobs_monster/locale/mobs_monster.es.tr b/mods/mobs_monster/locale/mobs_monster.es.tr new file mode 100644 index 00000000..5ab25c1f --- /dev/null +++ b/mods/mobs_monster/locale/mobs_monster.es.tr @@ -0,0 +1,14 @@ +# textdomain:mobs_monster +Cobweb=Telarania +Dirt Monster=Mounstro de tierra +Dungeon Master=Maestro de mazmorra +Lava Flan=Flan de lava +Lava Pickaxe=Hacha de lava +Lava orb=Esfera de lava +Mese Monster=Mounstro de mese +#Obsidian Flan= +Oerkki=Oerkki +Sand Monster=Mounstro de arena +Spider=Arania +Stone Monster=Mounstro de piedra +Tree Monster=Mounstro de madera diff --git a/mods/mobs_monster/locale/mobs_monster.pt_BR.tr b/mods/mobs_monster/locale/mobs_monster.pt_BR.tr new file mode 100644 index 00000000..a0b8bcad --- /dev/null +++ b/mods/mobs_monster/locale/mobs_monster.pt_BR.tr @@ -0,0 +1,14 @@ +# textdomain:mobs_monster +Cobweb=Teia de Aranha +Dirt Monster=Monstro de Terra +Dungeon Master=Mestre das Dungeons +Lava Flan=Pudim de Lava +Lava Pickaxe=Picareta de Lava +Lava orb=Orb de Lava +Mese Monster=Monstro de mese +#Obsidian Flan=Pudim de Obsidian +Oerkki=Oerkki +Sand Monster=Monstro de Areia +Spider=Aranha +Stone Monster=Monstro de pedra +Tree Monster= Arvore Monstro diff --git a/mods/mobs_monster/locale/mobs_monster.ru.tr b/mods/mobs_monster/locale/mobs_monster.ru.tr new file mode 100644 index 00000000..ce7f112f --- /dev/null +++ b/mods/mobs_monster/locale/mobs_monster.ru.tr @@ -0,0 +1,14 @@ +# textdomain:mobs_monster +Cobweb=Паутина +Dirt Monster=Земляной Монстр +Dungeon Master=Хозяйн Подземелья +Lava Flan=Лавовый Слизень +Lava Pickaxe=Лавовая Кирка +Lava orb=Лавовая сфера +Mese Monster=Месе Монстр +Obsidian Flan=Обсидиановый Слизень +Oerkki=Дух Ведьмы +Sand Monster=Песочный Монстр +Spider=Паук +Stone Monster=Каменный Монстр +Tree Monster=Древесный Монстр \ No newline at end of file diff --git a/mods/mobs_monster/locale/ms.txt b/mods/mobs_monster/locale/ms.txt deleted file mode 100644 index 5a684e76..00000000 --- a/mods/mobs_monster/locale/ms.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Malay translations of mobs_monster mod -# using template from 2016/June/10, translated on 2018/February/05 - -#dirtmonster.lua -Dirt Monster = Raksasa Tanah - -#dungeonmaster.lua -Dungeon Master = Penjaga Kurungan Bawah Tanah - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [MODS] Mobs Redo 'Monsters' telah dimuatkan - -#lava_flan.lua -Lava Flan = Raksasa Lava -Lava orb = Bola Lava -Lava Pickaxe = Beliung Lava - -#mese_monster.lua -Mese Monster = Raksasa Mese - -#oerkki.lua -Oerkki = Oerkki - -#sandmonster.lua -Sand Monster = Raksasa Pasir - -#spider.lua -Spider = Labah-labah -Cobweb = Sarang Labah-labah - -#stonemonster.lua -Stone Monster = Raksasa Batu - -#treemonster.lua -Tree Monster = Raksasa Pokok \ No newline at end of file diff --git a/mods/mobs_monster/locale/template.txt b/mods/mobs_monster/locale/template.txt deleted file mode 100644 index 3eac7612..00000000 --- a/mods/mobs_monster/locale/template.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Template for translations of mobs_monster mod -# last update: 2016/June/10 - -#dirtmonster.lua -Dirt Monster= - -#dungeonmaster.lua -Dungeon Master= - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded= - -#lava_flan.lua -Lava Flan= -Lava orb= -Lava Pickaxe= -Obsidian Flan= - -#mese_monster.lua -Mese Monster= - -#oerkki.lua -Oerkki= - -#sandmonster.lua -Sand Monster= - -#spider.lua -Spider= -Cobweb= - -#stonemonster.lua -Stone Monster= - -#treemonster.lua -Tree Monster= diff --git a/mods/mobs_monster/locale/tr.txt b/mods/mobs_monster/locale/tr.txt deleted file mode 100644 index 10f64a08..00000000 --- a/mods/mobs_monster/locale/tr.txt +++ /dev/null @@ -1,39 +0,0 @@ -# Türkçe çeviri by Admicos -# Turkish translation by Admicos - -# Son düzenleme: 26 Nisan 2017 -# Last edit: 26 April 2017 - - -#dirtmonster.lua -Dirt Monster = Toprak Canavarı - -#dungeonmaster.lua -Dungeon Master = Zindan başı - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Canavarlar' yüklendi - -#lava_flan.lua -Lava Flan = Lav Flan -Lava orb = Lav küre -Lava Pickaxe = Lav kazması - -#mese_monster.lua -Mese Monster = Mese Canavarı - -#oerkki.lua -Oerkki = Oerkki - -#sandmonster.lua -Sand Monster = Kum Canavarı - -#spider.lua -Spider = Örümcek -Cobweb = Örümcek ağı - -#stonemonster.lua -Stone Monster = Taş Canavarı - -#treemonster.lua -Tree Monster = Ağaç Canavarı \ No newline at end of file diff --git a/mods/mobs_monster/locale/zh_CN.txt b/mods/mobs_monster/locale/zh_CN.txt deleted file mode 100644 index 4f69d9aa..00000000 --- a/mods/mobs_monster/locale/zh_CN.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Template for translations of mobs_monster mod -# last update: 2016/June/10 - -#dirtmonster.lua -Dirt Monster = 泥土怪 - -#dungeonmaster.lua -Dungeon Master = 地穴之主 - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [模组] Mobs Redo 'Monsters' 已加载 - -#lava_flan.lua -Lava Flan = 岩浆饼 -Lava orb = 岩浆球 -Lava Pickaxe = 岩浆镐 -Obsidian Flan = 黑耀石饼 - -#mese_monster.lua -Mese Monster = 黄石怪 - -#oerkki.lua -Oerkki = 奥尔基 - -#sandmonster.lua -Sand Monster = 沙怪 - -#spider.lua -Spider = 蜘蛛 -Cobweb = 蜘蛛网 - -#stonemonster.lua -Stone Monster = 石头怪 - -#treemonster.lua -Tree Monster = 树怪 diff --git a/mods/mobs_monster/locale/zh_TW.txt b/mods/mobs_monster/locale/zh_TW.txt deleted file mode 100644 index b9a6d59e..00000000 --- a/mods/mobs_monster/locale/zh_TW.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Template for translations of mobs_monster mod -# last update: 2016/June/10 - -#dirtmonster.lua -Dirt Monster = 泥土怪 - -#dungeonmaster.lua -Dungeon Master = 地穴之主 - -#init.lua -[MOD] Mobs Redo 'Monsters' loaded = [模組] Mobs Redo 'Monsters' 已加載 - -#lava_flan.lua -Lava Flan = 岩漿餅 -Lava orb = 岩漿球 -Lava Pickaxe = 岩漿鎬 -Obsidian Flan = 黑耀石餅 - -#mese_monster.lua -Mese Monster = 黃石怪 - -#oerkki.lua -Oerkki = 奧爾基 - -#sandmonster.lua -Sand Monster = 沙怪 - -#spider.lua -Spider = 蜘蛛 -Cobweb = 蜘蛛網 - -#stonemonster.lua -Stone Monster = 石頭怪 - -#treemonster.lua -Tree Monster = 樹怪 diff --git a/mods/mobs_monster/lucky_block.lua b/mods/mobs_monster/lucky_block.lua index c9aeceac..ca86b2bf 100644 --- a/mods/mobs_monster/lucky_block.lua +++ b/mods/mobs_monster/lucky_block.lua @@ -1,42 +1,42 @@ -if minetest.get_modpath("lucky_block") then +-- web trap schematic - local web = {name = "mobs:cobweb"} - local web_trap = { - size = {x = 3, y = 3, z = 3}, - data = { - web, web, web, - web, web, web, - web, web, web, +local web = {name = "mobs:cobweb"} +local web_trap = { + size = {x = 3, y = 3, z = 3}, + data = { + web, web, web, + web, web, web, + web, web, web, - web, web, web, - web, web, web, - web, web, web, + web, web, web, + web, web, web, + web, web, web, - web, web, web, - web, web, web, - web, web, web, - }, + web, web, web, + web, web, web, + web, web, web } +} - lucky_block:add_schematics({ - {"webtrap", web_trap, {x = 1, y = 0, z = 1}}, - }) +lucky_block:add_schematics({ + {"webtrap", web_trap, {x = 1, y = 0, z = 1}}, +}) - lucky_block:add_blocks({ - {"sch", "webtrap", 1, true}, - {"spw", "mobs:dungeon_master", 1, nil, nil, 3, "Billy"}, - {"spw", "mobs:sand_monster", 3}, - {"spw", "mobs:stone_monster", 3, nil, nil, 3, "Bob"}, - {"spw", "mobs:dirt_monster", 3}, - {"spw", "mobs:tree_monster", 3}, - {"spw", "mobs:oerkki", 3}, - {"exp"}, - {"spw", "mobs:spider", 5}, - {"spw", "mobs:mese_monster", 2}, - {"spw", "mobs:lava_flan", 3}, - {"nod", "default:chest", 0, { - {name = "mobs:lava_orb", max = 1}}}, - }) +-- add lucky blocks -end +lucky_block:add_blocks({ + {"sch", "webtrap", 1, true}, + {"spw", "mobs:dungeon_master", 1, nil, nil, 3, "Billy"}, + {"spw", "mobs:sand_monster", 3}, + {"spw", "mobs:stone_monster", 3, nil, nil, 3, "Bob"}, + {"spw", "mobs:dirt_monster", 3}, + {"spw", "mobs:tree_monster", 3}, + {"spw", "mobs:oerkki", 3}, + {"exp"}, + {"spw", "mobs:spider", 5}, + {"spw", "mobs:mese_monster", 2}, + {"spw", "mobs:lava_flan", 3}, + {"nod", "default:chest", 0, { + {name = "mobs:lava_orb", max = 1}}}, +}) diff --git a/mods/mobs_monster/mese_monster.lua b/mods/mobs_monster/mese_monster.lua index 949a087c..b3ab5e2b 100644 --- a/mods/mobs_monster/mese_monster.lua +++ b/mods/mobs_monster/mese_monster.lua @@ -1,42 +1,181 @@ -local S = mobs.intllib +-- translation and custom mese monster types +local S = minetest.get_translator("mobs_monster") --- Mese Monster by Zeg9 +local mese_monster_types = { + + { -- red + y_min = -20, + y_max = -1000, + damage = 2, + reach = 3, + hp_min = 15, + hp_max = 25, + armor = 80, + skins = {"mobs_mese_monster_red.png"}, + immune_to = { + {"default:pick_wood", 0}, + {"default:shovel_wood", 0}, + {"default:axe_wood", 0}, + {"default:sword_wood", 0} + }, + drops = { + {name = "default:mese_crystal", chance = 15, min = 0, max = 1}, + {name = "default:mese_crystal_fragment", chance = 2, min = 0, max = 1} + }, + arrow_override = function(self) + self.velocity = 6 + self.damage = 2 + end + }, + + { -- green + y_min = -1001, + y_max = -2000, + damage = 3, + reach = 3, + hp_min = 20, + hp_max = 30, + armor = 75, + skins = {"mobs_mese_monster_green.png"}, + immune_to = { + {"default:pick_wood", 0}, + {"default:shovel_wood", 0}, + {"default:axe_wood", 0}, + {"default:sword_wood", 0}, + {"default:pick_stone", 0}, + {"default:shovel_stone", 0}, + {"default:axe_stone", 0}, + {"default:sword_stone", 0} + }, + drops = { + {name = "default:mese_crystal", chance = 12, min = 0, max = 1}, + {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 1} + }, + arrow_override = function(self) + self.velocity = 6 + self.damage = 2 + end + }, + + { -- blue + y_min = -2001, + y_max = -3000, + damage = 3, + reach = 4, + hp_min = 25, + hp_max = 35, + armor = 70, + skins = {"mobs_mese_monster_blue.png"}, + immune_to = { + {"default:pick_wood", 0}, + {"default:shovel_wood", 0}, + {"default:axe_wood", 0}, + {"default:sword_wood", 0}, + {"default:pick_stone", 0}, + {"default:shovel_stone", 0}, + {"default:axe_stone", 0}, + {"default:sword_stone", 0}, + {"default:pick_bronze", 0}, + {"default:shovel_bronze", 0}, + {"default:axe_bronze", 0}, + {"default:sword_bronze", 0} + }, + drops = { + {name = "default:mese", chance = 15, min = 0, max = 1}, + {name = "default:mese_crystal", chance = 9, min = 0, max = 2}, + {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2} + }, + arrow_override = function(self) + self.velocity = 7 + self.damage = 3 + end + }, + + { -- purple + y_min = -3000, + y_max = -31000, + damage = 4, + reach = 5, + hp_min = 30, + hp_max = 40, + armor = 60, + skins = {"mobs_mese_monster_purple.png"}, + immune_to = { + {"default:pick_wood", 0}, + {"default:shovel_wood", 0}, + {"default:axe_wood", 0}, + {"default:sword_wood", 0}, + {"default:pick_stone", 0}, + {"default:shovel_stone", 0}, + {"default:axe_stone", 0}, + {"default:sword_stone", 0}, + {"default:pick_bronze", 0}, + {"default:shovel_bronze", 0}, + {"default:axe_bronze", 0}, + {"default:sword_bronze", 0}, + {"default:pick_steel", 0}, + {"default:shovel_steel", 0}, + {"default:axe_steel", 0}, + {"default:sword_steel", 0} + }, + drops = { + {name = "default:mese", chance = 9, min = 0, max = 1}, + {name = "default:mese_crystal", chance = 6, min = 0, max = 2}, + {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 3} + }, + arrow_override = function(self) + self.velocity = 8 + self.damage = 4 + end + } +} + +-- Mese Monster by SirrobZeroone mobs:register_mob("mobs_monster:mese_monster", { type = "monster", + visual_size = {x = 10, y = 10}, -- Got scale wrong in blender by factor of 10 - S01 passive = false, - damage = 3, - attack_type = "shoot", + attack_type = "dogshoot", + damage = 4, + reach = 4, shoot_interval = 0.5, arrow = "mobs_monster:mese_arrow", - shoot_offset = 2, ---arrow_override = function(self) --- self.velocity = 20 ---end, + shoot_offset = 0.75, +-- arrow_override = function(self) +-- self.velocity = 20 +-- end, + knock_back = true, hp_min = 10, hp_max = 25, armor = 80, - collisionbox = {-0.5, -1.5, -0.5, 0.5, 0.5, 0.5}, + collisionbox = {-0.75, -0.5, -0.75, 0.75, 2.5, 0.75}, visual = "mesh", - mesh = "zmobs_mese_monster.x", - textures = { - {"zmobs_mese_monster.png"}, - }, + mesh = "mobs_mese_monster.b3d", + textures = {{"mobs_mese_monster_purple.png"}}, blood_texture = "default_mese_crystal_fragment.png", makes_footstep_sound = false, sounds = { random = "mobs_mesemonster", + damage = "default_glass_footstep" }, view_range = 10, - walk_velocity = 0.5, - run_velocity = 2, + walk_velocity = 1, + run_velocity = 3, jump = true, jump_height = 8, + can_leap = true, fall_damage = 0, fall_speed = -6, stepheight = 2.1, + immune_to = { + {"default:pick_wood", 0}, + {"default:shovel_wood", 0}, + {"default:axe_wood", 0}, + {"default:sword_wood", 0} + }, drops = { {name = "default:mese_crystal", chance = 9, min = 0, max = 2}, {name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2}, @@ -45,59 +184,122 @@ mobs:register_mob("mobs_monster:mese_monster", { lava_damage = 1, light_damage = 0, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 14, - walk_start = 15, - walk_end = 38, - run_start = 40, - run_end = 63, - punch_start = 40, - punch_end = 63, + speed_normal = 18, speed_run = 18, + walk_start = 10, walk_end = 41, walk_speed = 20, + run_start = 10, run_end = 41, run_speed = 30, + stand_start = 60, stand_end = 83, + shoot_start = 100, shoot_end = 113, + die_start = 125, die_end = 141, death_speed = 25, die_loop = false, + jump_start = 150 , jump_end = 168, jump_loop = false, + punch_start = 175, punch_end = 189 }, + + after_activate = function(self, staticdata, def, dtime) + + local tex = self and self.textures and self.textures[1] + + if tex == "zmobs_mese_monster.png" then self.object:remove() end + end, + + on_spawn = function(self) + + local pos = self.object:get_pos() + + -- quick update self function + local function update(self, def) + + self.object:set_properties({textures = def.skins}) + self.base_texture = def.skins + + -- added by mobs_redo + self.hp_min = def.hp_min + self.hp_max = def.hp_max + self.health = math.random(self.hp_min, self.hp_max) + self.damage = def.damage + self.reach = def.reach + self.armor = def.armor + self.immune_to = def.immune_to + self.drops = def.drops + self.arrow_override = def.arrow_override + end + + -- Normal spawn case + for name, def in pairs(mese_monster_types) do + + if pos.y <= def.y_min and pos.y >= def.y_max then + + update(self, def) + + return true + end + end +--[[ + -- player using egg + -- direction sets type N = red, E = green, S = blue, W = purple + -- Just for fun - S01 + + local objects = minetest.get_objects_inside_radius(pos, 10) + + for i, obj in ipairs(objects) do + + if minetest.is_player(obj) + and obj:get_wielded_item():get_name() == "mobs_monster:mese_monster" then + + local degree = (360 + math.deg(obj:get_look_horizontal())) % 360 + local compass_sel + + if degree > 45 and degree <= 135 then compass_sel = 4 + elseif degree > 135 and degree <= 225 then compass_sel = 3 + elseif degree > 225 and degree <= 315 then compass_sel = 2 + else compass_sel = 1 + end + + local def = mese_monster_types[compass_sel] + + update(self, def) + + return true + end + end +]] + -- catch case if all else fails random it + update(self, mese_monster_types[math.random(4)]) + + return true + end }) +-- mese arrow item -if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:mese_monster", - nodes = {"default:stone"}, - max_light = 7, - chance = 5000, - active_object_count = 1, - max_height = -20, +minetest.register_craftitem("mobs_monster:mese_crystal_fragment_arrow", { + description = S("Mese Monster Arrow"), + inventory_image = "mobs_mese_arrow.png", + groups = {not_in_creative_inventory = 1} }) -end +-- mese arrow -mobs:register_egg("mobs_monster:mese_monster", S("Mese Monster"), "default_mese_block.png", 1) - - -mobs:alias_mob("mobs:mese_monster", "mobs_monster:mese_monster") -- compatiblity - - --- mese arrow (weapon) mobs:register_arrow("mobs_monster:mese_arrow", { - visual = "sprite", --- visual = "wielditem", - visual_size = {x = 0.5, y = 0.5}, - textures = {"default_mese_crystal_fragment.png"}, - --textures = {"default:mese_crystal_fragment"}, - velocity = 6, --- rotate = 180, + visual = "wielditem", + visual_size = {x = 0.25, y = 0.25}, + textures = {"mobs_monster:mese_crystal_fragment_arrow"}, + velocity = 8, + rotate = 180, + damage = 2, hit_player = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 2}, + damage_groups = {fleshy = self.damage} }, nil) end, hit_mob = function(self, player) + player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 2}, + damage_groups = {fleshy = self.damage} }, nil) end, @@ -105,12 +307,33 @@ mobs:register_arrow("mobs_monster:mese_arrow", { end }) --- 9x mese crystal fragments = 1x mese crystal +-- where to spawn + +if not mobs.custom_spawn_monster then + + mobs:spawn({ + name = "mobs_monster:mese_monster", + nodes = {"default:stone"}, + max_light = 7, + chance = 5000, + active_object_count = 1, + max_height = -20 + }) +end + +-- spawn egg + +mobs:register_egg("mobs_monster:mese_monster", S("Mese Monster"), "default_mese_block.png", 1) + +-- compatibility with older mobs mod + +mobs:alias_mob("mobs:mese_monster", "mobs_monster:mese_monster") + +-- 9x mese crystal fragments = 1x mese crystal recipe + +local f = "default:mese_crystal_fragment" + minetest.register_craft({ output = "default:mese_crystal", - recipe = { - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - } + recipe = {{f, f, f}, {f, f, f}, {f, f, f}} }) diff --git a/mods/mobs_monster/mod.conf b/mods/mobs_monster/mod.conf index 921bed15..6a784d8c 100644 --- a/mods/mobs_monster/mod.conf +++ b/mods/mobs_monster/mod.conf @@ -1,4 +1,5 @@ name = mobs_monster +description = Add many different monsters into your world. depends = mobs -optional_depends = default, lucky_block, toolranks, intllib -description = Adds many types of monsters. +optional_depends = default, lucky_block, toolranks +min_minetest_version = 5.0 diff --git a/mods/mobs_monster/models/mobs_mese_monster.b3d b/mods/mobs_monster/models/mobs_mese_monster.b3d new file mode 100644 index 00000000..ba453dee Binary files /dev/null and b/mods/mobs_monster/models/mobs_mese_monster.b3d differ diff --git a/mods/mobs_monster/models/mobs_oerkki.b3d b/mods/mobs_monster/models/mobs_oerkki.b3d index 6290af38..73047690 100644 Binary files a/mods/mobs_monster/models/mobs_oerkki.b3d and b/mods/mobs_monster/models/mobs_oerkki.b3d differ diff --git a/mods/mobs_monster/models/mobs_sand_monster.b3d b/mods/mobs_monster/models/mobs_sand_monster.b3d index 97825044..893cf965 100644 Binary files a/mods/mobs_monster/models/mobs_sand_monster.b3d and b/mods/mobs_monster/models/mobs_sand_monster.b3d differ diff --git a/mods/mobs_monster/models/mobs_stone_monster.b3d b/mods/mobs_monster/models/mobs_stone_monster.b3d index d9c0c717..4460b147 100644 Binary files a/mods/mobs_monster/models/mobs_stone_monster.b3d and b/mods/mobs_monster/models/mobs_stone_monster.b3d differ diff --git a/mods/mobs_monster/models/zmobs_lava_flan.b3d b/mods/mobs_monster/models/zmobs_lava_flan.b3d new file mode 100644 index 00000000..9ec9e8e0 Binary files /dev/null and b/mods/mobs_monster/models/zmobs_lava_flan.b3d differ diff --git a/mods/mobs_monster/models/zmobs_lava_flan.x b/mods/mobs_monster/models/zmobs_lava_flan.x deleted file mode 100644 index be78ff97..00000000 --- a/mods/mobs_monster/models/zmobs_lava_flan.x +++ /dev/null @@ -1,3506 +0,0 @@ -xof 0303txt 0032 - -template XSkinMeshHeader { - <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> - WORD nMaxSkinWeightsPerVertex; - WORD nMaxSkinWeightsPerFace; - WORD nBones; -} - -template SkinWeights { - <6f0d123b-bad2-4167-a0d0-80224f25fabb> - STRING transformNodeName; - DWORD nWeights; - array DWORD vertexIndices[nWeights]; - array float weights[nWeights]; - Matrix4x4 matrixOffset; -} - -Frame Root { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame Armature { - FrameTransformMatrix { - -5.000000, 0.000001, 0.000000, 0.000000, - -0.000001,-5.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 5.000000, 0.000000, - 0.000000, 0.000000,-5.000000, 1.000000;; - } - Frame Armature_Bone { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000,-1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame Armature_Bone_001 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 2.000000, 0.000000, 1.000000;; - } - Frame Armature_Bone_002 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.300000, 0.000000, 1.000000;; - } - Frame Armature_Bone_003 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.300000, 0.000000, 1.000000;; - } - Frame Armature_Bone_004 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.400000, 0.000000, 1.000000;; - } - } // End of Armature_Bone_004 - } // End of Armature_Bone_003 - } // End of Armature_Bone_002 - } // End of Armature_Bone_001 - } // End of Armature_Bone - Frame Cube { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 1.000000;; - } - Mesh { // Cube mesh - 264; - 1.000000; 1.000000;-1.000000;, - 1.000000;-1.000000;-1.000000;, - -1.000000;-1.000000;-1.000000;, - -1.000000; 1.000000;-1.000000;, - -1.000000; 1.000000; 1.000000;, - -1.000000;-1.000000; 1.000000;, - -0.800000;-0.800000; 1.000000;, - -0.800000; 0.800000; 1.000000;, - 1.000000; 1.000000;-1.000000;, - 1.000000; 0.999999; 1.000000;, - 0.999999;-1.000001; 1.000000;, - 1.000000;-1.000000;-1.000000;, - 1.000000;-1.000000;-1.000000;, - 0.999999;-1.000001; 1.000000;, - -1.000000;-1.000000; 1.000000;, - -1.000000;-1.000000;-1.000000;, - -1.000000;-1.000000;-1.000000;, - -1.000000;-1.000000; 1.000000;, - -1.000000; 1.000000; 1.000000;, - -1.000000; 1.000000;-1.000000;, - 1.000000; 0.999999; 1.000000;, - 1.000000; 1.000000;-1.000000;, - -1.000000; 1.000000;-1.000000;, - -1.000000; 1.000000; 1.000000;, - -0.800000; 0.800000; 1.666667;, - -0.800000;-0.800000; 1.666667;, - -0.800000;-0.800000; 2.000000;, - -0.800000; 0.800000; 2.000000;, - 0.999999;-1.000001; 1.000000;, - 1.000000; 0.999999; 1.000000;, - 0.800000; 0.800000; 1.000000;, - 0.799999;-0.800001; 1.000000;, - 1.000000; 0.999999; 1.000000;, - -1.000000; 1.000000; 1.000000;, - -0.800000; 0.800000; 1.000000;, - 0.800000; 0.800000; 1.000000;, - -1.000000;-1.000000; 1.000000;, - 0.999999;-1.000001; 1.000000;, - 0.799999;-0.800001; 1.000000;, - -0.800000;-0.800000; 1.000000;, - -0.800000;-0.800000; 2.000000;, - 0.799999;-0.800001; 2.000000;, - 0.640000;-0.640000; 2.000000;, - -0.640000;-0.640000; 2.000000;, - 0.799999;-0.800001; 1.666667;, - 0.800000; 0.800000; 1.666667;, - 0.800000; 0.800000; 2.000000;, - 0.799999;-0.800001; 2.000000;, - 0.800000; 0.800000; 1.666667;, - -0.800000; 0.800000; 1.666667;, - -0.800000; 0.800000; 2.000000;, - 0.800000; 0.800000; 2.000000;, - -0.800000;-0.800000; 1.666667;, - 0.799999;-0.800001; 1.666667;, - 0.799999;-0.800001; 2.000000;, - -0.800000;-0.800000; 2.000000;, - 0.640000; 0.640000; 2.000000;, - -0.640000; 0.640000; 2.000000;, - -0.640000; 0.640000; 2.500000;, - 0.640000; 0.640000; 2.500000;, - -0.800000; 0.800000; 2.000000;, - -0.800000;-0.800000; 2.000000;, - -0.640000;-0.640000; 2.000000;, - -0.640000; 0.640000; 2.000000;, - 0.799999;-0.800001; 2.000000;, - 0.800000; 0.800000; 2.000000;, - 0.640000; 0.640000; 2.000000;, - 0.640000;-0.640000; 2.000000;, - 0.800000; 0.800000; 2.000000;, - -0.800000; 0.800000; 2.000000;, - -0.640000; 0.640000; 2.000000;, - 0.640000; 0.640000; 2.000000;, - 0.640000; 0.640000; 2.500000;, - -0.640000; 0.640000; 2.500000;, - -0.640000;-0.640000; 2.500000;, - 0.640000;-0.640000; 2.500000;, - -0.640000;-0.640000; 2.000000;, - 0.640000;-0.640000; 2.000000;, - 0.640000;-0.640000; 2.500000;, - -0.640000;-0.640000; 2.500000;, - -0.640000; 0.640000; 2.000000;, - -0.640000;-0.640000; 2.000000;, - -0.640000;-0.640000; 2.500000;, - -0.640000; 0.640000; 2.500000;, - 0.640000;-0.640000; 2.000000;, - 0.640000; 0.640000; 2.000000;, - 0.640000; 0.640000; 2.500000;, - 0.640000;-0.640000; 2.500000;, - -0.800000; 0.800000; 1.000000;, - -0.800000;-0.800000; 1.000000;, - -0.800000;-0.800000; 1.333333;, - -0.800000; 0.800000; 1.333333;, - -0.800000; 0.800000; 1.333333;, - -0.800000;-0.800000; 1.333333;, - -0.800000;-0.800000; 1.666667;, - -0.800000; 0.800000; 1.666667;, - 0.799999;-0.800001; 1.000000;, - 0.800000; 0.800000; 1.000000;, - 0.800000; 0.800000; 1.333333;, - 0.799999;-0.800001; 1.333333;, - 0.799999;-0.800001; 1.333333;, - 0.800000; 0.800000; 1.333333;, - 0.800000; 0.800000; 1.666667;, - 0.799999;-0.800001; 1.666667;, - 0.800000; 0.800000; 1.000000;, - -0.800000; 0.800000; 1.000000;, - -0.800000; 0.800000; 1.333333;, - 0.800000; 0.800000; 1.333333;, - 0.800000; 0.800000; 1.333333;, - -0.800000; 0.800000; 1.333333;, - -0.800000; 0.800000; 1.666667;, - 0.800000; 0.800000; 1.666667;, - -0.800000;-0.800000; 1.000000;, - 0.799999;-0.800001; 1.000000;, - 0.799999;-0.800001; 1.333333;, - -0.800000;-0.800000; 1.333333;, - 0.799999;-0.800001; 1.333333;, - 0.799999;-0.800001; 1.666667;, - 0.560000;-0.000000; 1.616667;, - 0.560000;-0.000000; 1.383333;, - -0.560000; 0.000000; 1.383333;, - 0.560000;-0.000000; 1.383333;, - 0.560000;-0.000000; 1.616667;, - -0.560000; 0.000000; 1.616667;, - 0.799999;-0.800001; 1.666667;, - -0.800000;-0.800000; 1.666667;, - -0.560000; 0.000000; 1.616667;, - 0.560000;-0.000000; 1.616667;, - -0.800000;-0.800000; 1.666667;, - -0.800000;-0.800000; 1.333333;, - -0.560000; 0.000000; 1.383333;, - -0.560000; 0.000000; 1.616667;, - -0.800000;-0.800000; 1.333333;, - 0.799999;-0.800001; 1.333333;, - 0.560000;-0.000000; 1.383333;, - -0.560000; 0.000000; 1.383333;, - -0.000000;-0.790000; 1.340000;, - -0.000000;-0.690000; 1.540000;, - -0.100000;-0.690000; 1.340000;, - -0.000000;-0.590000; 1.340000;, - -0.000000;-0.690000; 1.540000;, - 0.100000;-0.690000; 1.340000;, - 0.400000;-0.590000; 1.340000;, - 0.500000;-0.690000; 1.340000;, - 0.400000;-0.790000; 1.340000;, - 0.300000;-0.690000; 1.340000;, - -0.100000;-0.690000; 1.340000;, - -0.000000;-0.690000; 1.540000;, - -0.000000;-0.590000; 1.340000;, - 0.100000;-0.690000; 1.340000;, - -0.000000;-0.690000; 1.540000;, - -0.000000;-0.790000; 1.340000;, - 0.200000;-0.590000; 1.340000;, - 0.300000;-0.690000; 1.340000;, - 0.200000;-0.790000; 1.340000;, - 0.100000;-0.690000; 1.340000;, - 0.300000;-0.690000; 1.340000;, - 0.200000;-0.690000; 1.540000;, - 0.200000;-0.790000; 1.340000;, - 0.100000;-0.690000; 1.340000;, - 0.200000;-0.690000; 1.540000;, - 0.200000;-0.590000; 1.340000;, - 0.200000;-0.590000; 1.340000;, - 0.200000;-0.690000; 1.540000;, - 0.300000;-0.690000; 1.340000;, - 0.500000;-0.690000; 1.340000;, - 0.400000;-0.690000; 1.540000;, - 0.400000;-0.790000; 1.340000;, - 0.200000;-0.790000; 1.340000;, - 0.200000;-0.690000; 1.540000;, - 0.100000;-0.690000; 1.340000;, - -0.000000;-0.590000; 1.340000;, - 0.100000;-0.690000; 1.340000;, - -0.000000;-0.790000; 1.340000;, - -0.100000;-0.690000; 1.340000;, - 0.300000;-0.690000; 1.340000;, - 0.400000;-0.690000; 1.540000;, - 0.400000;-0.590000; 1.340000;, - 0.400000;-0.590000; 1.340000;, - 0.400000;-0.690000; 1.540000;, - 0.500000;-0.690000; 1.340000;, - 0.400000;-0.790000; 1.340000;, - 0.400000;-0.690000; 1.540000;, - 0.300000;-0.690000; 1.340000;, - -0.200000;-0.590000; 1.340000;, - -0.100000;-0.690000; 1.340000;, - -0.200000;-0.790000; 1.340000;, - -0.300000;-0.690000; 1.340000;, - -0.100000;-0.690000; 1.340000;, - -0.200000;-0.690000; 1.540000;, - -0.200000;-0.790000; 1.340000;, - -0.300000;-0.690000; 1.340000;, - -0.200000;-0.690000; 1.540000;, - -0.200000;-0.590000; 1.340000;, - -0.200000;-0.590000; 1.340000;, - -0.200000;-0.690000; 1.540000;, - -0.100000;-0.690000; 1.340000;, - -0.200000;-0.790000; 1.340000;, - -0.200000;-0.690000; 1.540000;, - -0.300000;-0.690000; 1.340000;, - -0.400000;-0.590000; 1.340000;, - -0.300000;-0.690000; 1.340000;, - -0.400000;-0.790000; 1.340000;, - -0.500000;-0.690000; 1.340000;, - -0.300000;-0.690000; 1.340000;, - -0.400000;-0.690000; 1.540000;, - -0.400000;-0.790000; 1.340000;, - -0.500000;-0.690000; 1.340000;, - -0.400000;-0.690000; 1.540000;, - -0.400000;-0.590000; 1.340000;, - -0.400000;-0.590000; 1.340000;, - -0.400000;-0.690000; 1.540000;, - -0.300000;-0.690000; 1.340000;, - -0.400000;-0.790000; 1.340000;, - -0.400000;-0.690000; 1.540000;, - -0.500000;-0.690000; 1.340000;, - 0.200000;-0.700000; 2.400000;, - 0.200000;-0.500000; 2.400000;, - 0.200000;-0.500000; 2.200000;, - 0.200000;-0.700000; 2.200000;, - 0.200000;-0.500000; 2.400000;, - 0.400000;-0.500000; 2.400000;, - 0.400000;-0.500000; 2.200000;, - 0.200000;-0.500000; 2.200000;, - 0.400000;-0.500000; 2.400000;, - 0.400000;-0.700000; 2.400000;, - 0.400000;-0.700000; 2.200000;, - 0.400000;-0.500000; 2.200000;, - 0.400000;-0.700000; 2.400000;, - 0.200000;-0.700000; 2.400000;, - 0.200000;-0.700000; 2.200000;, - 0.400000;-0.700000; 2.200000;, - 0.200000;-0.700000; 2.200000;, - 0.200000;-0.500000; 2.200000;, - 0.400000;-0.500000; 2.200000;, - 0.400000;-0.700000; 2.200000;, - 0.400000;-0.700000; 2.400000;, - 0.400000;-0.500000; 2.400000;, - 0.200000;-0.500000; 2.400000;, - 0.200000;-0.700000; 2.400000;, - -0.400000;-0.700000; 2.400000;, - -0.400000;-0.500000; 2.400000;, - -0.400000;-0.500000; 2.200000;, - -0.400000;-0.700000; 2.200000;, - -0.400000;-0.500000; 2.400000;, - -0.200000;-0.500000; 2.400000;, - -0.200000;-0.500000; 2.200000;, - -0.400000;-0.500000; 2.200000;, - -0.200000;-0.500000; 2.400000;, - -0.200000;-0.700000; 2.400000;, - -0.200000;-0.700000; 2.200000;, - -0.200000;-0.500000; 2.200000;, - -0.200000;-0.700000; 2.400000;, - -0.400000;-0.700000; 2.400000;, - -0.400000;-0.700000; 2.200000;, - -0.200000;-0.700000; 2.200000;, - -0.400000;-0.700000; 2.200000;, - -0.400000;-0.500000; 2.200000;, - -0.200000;-0.500000; 2.200000;, - -0.200000;-0.700000; 2.200000;, - -0.200000;-0.700000; 2.400000;, - -0.200000;-0.500000; 2.400000;, - -0.400000;-0.500000; 2.400000;, - -0.400000;-0.700000; 2.400000;; - 71; - 4;3;2;1;0;, - 4;7;6;5;4;, - 4;11;10;9;8;, - 4;15;14;13;12;, - 4;19;18;17;16;, - 4;23;22;21;20;, - 4;27;26;25;24;, - 4;31;30;29;28;, - 4;35;34;33;32;, - 4;39;38;37;36;, - 4;43;42;41;40;, - 4;47;46;45;44;, - 4;51;50;49;48;, - 4;55;54;53;52;, - 4;59;58;57;56;, - 4;63;62;61;60;, - 4;67;66;65;64;, - 4;71;70;69;68;, - 4;75;74;73;72;, - 4;79;78;77;76;, - 4;83;82;81;80;, - 4;87;86;85;84;, - 4;91;90;89;88;, - 4;95;94;93;92;, - 4;99;98;97;96;, - 4;103;102;101;100;, - 4;107;106;105;104;, - 4;111;110;109;108;, - 4;115;114;113;112;, - 4;119;118;117;116;, - 4;123;122;121;120;, - 4;127;126;125;124;, - 4;131;130;129;128;, - 4;135;134;133;132;, - 3;138;137;136;, - 3;141;140;139;, - 4;145;144;143;142;, - 3;148;147;146;, - 3;151;150;149;, - 4;155;154;153;152;, - 3;158;157;156;, - 3;161;160;159;, - 3;164;163;162;, - 3;167;166;165;, - 3;170;169;168;, - 4;174;173;172;171;, - 3;177;176;175;, - 3;180;179;178;, - 3;183;182;181;, - 4;187;186;185;184;, - 3;190;189;188;, - 3;193;192;191;, - 3;196;195;194;, - 3;199;198;197;, - 4;203;202;201;200;, - 3;206;205;204;, - 3;209;208;207;, - 3;212;211;210;, - 3;215;214;213;, - 4;219;218;217;216;, - 4;223;222;221;220;, - 4;227;226;225;224;, - 4;231;230;229;228;, - 4;235;234;233;232;, - 4;239;238;237;236;, - 4;243;242;241;240;, - 4;247;246;245;244;, - 4;251;250;249;248;, - 4;255;254;253;252;, - 4;259;258;257;256;, - 4;263;262;261;260;; - MeshNormals { // Cube normals - 71; - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000;-0.000000; 0.000000;, - -0.000000;-1.000000;-0.000000;, - -1.000000; 0.000000;-0.000000;, - 0.000000; 1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.000000; 0.000000; 1.000000;, - 0.000000;-0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000;-0.000001; 0.000000;, - 0.000000; 1.000000; 0.000000;, - -0.000000;-1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - -0.000000; 0.000000; 1.000000;, - 0.000000;-0.000000; 1.000000;, - 0.000000;-0.000000; 1.000000;, - -0.000000;-1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000;-0.000001; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000;-0.000001; 0.000000;, - 1.000000;-0.000001; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - -0.000000;-1.000000; 0.000000;, - -0.957826;-0.287348; 0.000000;, - -0.000000;-1.000000; 0.000000;, - -0.000000;-0.062378;-0.998053;, - 0.957826;-0.287348; 0.000000;, - 0.000000;-0.062378; 0.998053;, - -0.666667;-0.666667; 0.333333;, - 0.666667; 0.666666; 0.333333;, - 0.000000; 0.000000;-1.000000;, - -0.666667; 0.666667; 0.333333;, - 0.666667;-0.666667; 0.333333;, - 0.000000; 0.000000;-1.000000;, - 0.666667;-0.666667; 0.333333;, - -0.666667; 0.666667; 0.333333;, - 0.666667; 0.666667; 0.333333;, - 0.666667;-0.666667; 0.333333;, - -0.666667;-0.666667; 0.333333;, - 0.000000; 0.000000;-1.000000;, - -0.666667; 0.666667; 0.333333;, - 0.666667; 0.666667; 0.333333;, - -0.666667;-0.666667; 0.333333;, - 0.000000; 0.000000;-1.000000;, - 0.666667;-0.666667; 0.333333;, - -0.666667; 0.666667; 0.333333;, - 0.666667; 0.666667; 0.333333;, - -0.666667;-0.666667; 0.333333;, - 0.000000; 0.000000;-1.000000;, - 0.666667;-0.666667; 0.333333;, - -0.666667; 0.666667; 0.333333;, - 0.666667; 0.666667; 0.333333;, - -0.666667;-0.666667; 0.333333;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 1.000000;-0.000000;, - 1.000000; 0.000000;-0.000000;, - 0.000000;-1.000000; 0.000000;, - -0.000000; 0.000000;-1.000000;, - -0.000000; 0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 1.000000;-0.000000;, - 1.000000; 0.000000;-0.000000;, - 0.000000;-1.000000; 0.000000;, - -0.000000; 0.000000;-1.000000;, - -0.000000; 0.000000; 1.000000;; - 71; - 4;0;0;0;0;, - 4;1;1;1;1;, - 4;2;2;2;2;, - 4;3;3;3;3;, - 4;4;4;4;4;, - 4;5;5;5;5;, - 4;6;6;6;6;, - 4;7;7;7;7;, - 4;8;8;8;8;, - 4;9;9;9;9;, - 4;10;10;10;10;, - 4;11;11;11;11;, - 4;12;12;12;12;, - 4;13;13;13;13;, - 4;14;14;14;14;, - 4;15;15;15;15;, - 4;16;16;16;16;, - 4;17;17;17;17;, - 4;18;18;18;18;, - 4;19;19;19;19;, - 4;20;20;20;20;, - 4;21;21;21;21;, - 4;22;22;22;22;, - 4;23;23;23;23;, - 4;24;24;24;24;, - 4;25;25;25;25;, - 4;26;26;26;26;, - 4;27;27;27;27;, - 4;28;28;28;28;, - 4;29;29;29;29;, - 4;30;30;30;30;, - 4;31;31;31;31;, - 4;32;32;32;32;, - 4;33;33;33;33;, - 3;34;34;34;, - 3;35;35;35;, - 4;36;36;36;36;, - 3;37;37;37;, - 3;38;38;38;, - 4;39;39;39;39;, - 3;40;40;40;, - 3;41;41;41;, - 3;42;42;42;, - 3;43;43;43;, - 3;44;44;44;, - 4;45;45;45;45;, - 3;46;46;46;, - 3;47;47;47;, - 3;48;48;48;, - 4;49;49;49;49;, - 3;50;50;50;, - 3;51;51;51;, - 3;52;52;52;, - 3;53;53;53;, - 4;54;54;54;54;, - 3;55;55;55;, - 3;56;56;56;, - 3;57;57;57;, - 3;58;58;58;, - 4;59;59;59;59;, - 4;60;60;60;60;, - 4;61;61;61;61;, - 4;62;62;62;62;, - 4;63;63;63;63;, - 4;64;64;64;64;, - 4;65;65;65;65;, - 4;66;66;66;66;, - 4;67;67;67;67;, - 4;68;68;68;68;, - 4;69;69;69;69;, - 4;70;70;70;70;; - } // End of Cube normals - MeshTextureCoords { // Cube UV coordinates - 264; - 0.000000; 0.500000;, - 0.500000; 0.500000;, - 0.500000; 0.000000;, - 0.000000; 0.000000;, - -0.000104; 0.000450;, - -0.000014; 0.499950;, - 0.058184; 0.442464;, - 0.057363; 0.058619;, - 0.000000; 0.500000;, - 0.500000; 0.500000;, - 0.500000; 0.000000;, - 0.000000; 0.000000;, - 0.000000; 0.500000;, - 0.500000; 0.500000;, - 0.500000; 0.000000;, - 0.000000; 0.000000;, - 0.000000; 0.500000;, - 0.500000; 0.500000;, - 0.500000; 0.000000;, - 0.000000; 0.000000;, - 0.000000; 0.500000;, - 0.500000; 0.500000;, - 0.500000; 0.000000;, - 0.000000; 0.000000;, - 0.499960; 0.416620;, - 0.000040; 0.416620;, - 0.000040; 0.624921;, - 0.499960; 0.624921;, - 0.499489; 0.499550;, - 0.499399; 0.000050;, - 0.441201; 0.057536;, - 0.442021; 0.441381;, - 0.499399; 0.000050;, - -0.000104; 0.000450;, - 0.057363; 0.058619;, - 0.441201; 0.057536;, - -0.000014; 0.499950;, - 0.499489; 0.499550;, - 0.442021; 0.441381;, - 0.058184; 0.442464;, - -0.000014; 0.499950;, - 0.499489; 0.499550;, - 0.442022; 0.441382;, - 0.058184; 0.442464;, - 0.000040; 0.208320;, - 0.499960; 0.208320;, - 0.499960; 0.000020;, - 0.000040; 0.000020;, - 0.499960; 0.416621;, - 0.000040; 0.416620;, - 0.000040; 0.624921;, - 0.499960; 0.624921;, - 0.000046; 0.499908;, - 0.499954; 0.499909;, - 0.499954; 0.291613;, - 0.000046; 0.291613;, - 0.499969;-0.015638;, - 0.000031;-0.015639;, - 0.000031; 0.374937;, - 0.499969; 0.374938;, - -0.000104; 0.000450;, - -0.000014; 0.499950;, - 0.058184; 0.442464;, - 0.057364; 0.058619;, - 0.499489; 0.499550;, - 0.499399; 0.000050;, - 0.441201; 0.057536;, - 0.442022; 0.441382;, - 0.499399; 0.000050;, - -0.000104; 0.000450;, - 0.057364; 0.058619;, - 0.441201; 0.057536;, - 0.499950; 0.000050;, - 0.000050; 0.000050;, - 0.000050; 0.499950;, - 0.499950; 0.499950;, - 0.000031; 0.374937;, - 0.499969; 0.374938;, - 0.499969;-0.015638;, - 0.000031;-0.015639;, - 0.499969;-0.015639;, - 0.000031;-0.015639;, - 0.000031; 0.374937;, - 0.499969; 0.374938;, - 0.000031; 0.374937;, - 0.499969; 0.374938;, - 0.499969;-0.015639;, - 0.000031;-0.015639;, - 0.499960; 0.000019;, - 0.000040; 0.000019;, - 0.000040; 0.208320;, - 0.499960; 0.208320;, - 0.499960; 0.208320;, - 0.000040; 0.208320;, - 0.000040; 0.416620;, - 0.499960; 0.416620;, - 0.000040; 0.624921;, - 0.499960; 0.624921;, - 0.499960; 0.416620;, - 0.000040; 0.416621;, - 0.000040; 0.416621;, - 0.499960; 0.416620;, - 0.499960; 0.208320;, - 0.000040; 0.208320;, - 0.499961; 0.000021;, - 0.000040; 0.000020;, - 0.000040; 0.208320;, - 0.499960; 0.208321;, - 0.499960; 0.208321;, - 0.000040; 0.208320;, - 0.000040; 0.416620;, - 0.499960; 0.416621;, - 0.000046; 0.291430;, - 0.499954; 0.291430;, - 0.499954; 0.083135;, - 0.000046; 0.083134;, - 0.482632; 0.297524;, - 0.499972; 0.143183;, - 0.275451; 0.201614;, - 0.279529; 0.217376;, - 0.000023; 0.249954;, - 0.499977; 0.249954;, - 0.499977; 0.041640;, - 0.000023; 0.041640;, - 0.499972; 0.143183;, - 0.017368; 0.143350;, - 0.220471; 0.223498;, - 0.275451; 0.201614;, - 0.017368; 0.143350;, - 0.000028; 0.297691;, - 0.224549; 0.239260;, - 0.220471; 0.223498;, - 0.000035; 0.499630;, - 0.499965; 0.499457;, - 0.424889; 0.249031;, - 0.074938; 0.249151;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.843750; 0.500000;, - 0.750000; 0.375000;, - 0.656250; 0.500000;, - 0.562500; 0.562500;, - 0.500000; 0.500000;, - 0.500000; 1.000000;, - 0.562500; 0.937500;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 1.000000; 0.500000;, - 0.937500; 0.562500;, - 0.937500; 0.937500;, - 0.999902; 0.999901;, - 0.968750; 0.031250;, - 0.843750; 0.031250;, - 0.843750; 0.156250;, - 0.968750; 0.156250;, - 0.562500; 0.937500;, - 0.500000; 1.000000;, - 0.999902; 0.999901;, - 0.937500; 0.937500;, - 0.937500; 0.562500;, - 1.000000; 0.500000;, - 0.500000; 0.500000;, - 0.562500; 0.562500;, - 0.562500; 0.562500;, - 0.500000; 0.500000;, - 0.500000; 1.000000;, - 0.562500; 0.937500;, - 0.000000; 1.000000;, - 1.000000; 1.000000;, - 1.000000; 0.000000;, - 0.000000; 0.000000;, - 1.000000; 0.500000;, - 0.937500; 0.562500;, - 0.937559; 0.942680;, - 0.999902; 0.999901;, - 0.656250; 0.031250;, - 0.531250; 0.031250;, - 0.531250; 0.156250;, - 0.656250; 0.156250;, - 0.562500; 0.937500;, - 0.500000; 1.000000;, - 0.999902; 0.999901;, - 0.937559; 0.942680;, - 0.937500; 0.562500;, - 1.000000; 0.500000;, - 0.500000; 0.500000;, - 0.562500; 0.562500;; - } // End of Cube UV coordinates - MeshMaterialList { // Cube material list - 1; - 71; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0;; - Material Material { - 0.640000; 0.640000; 0.640000; 1.000000;; - 96.078431; - 0.500000; 0.500000; 0.500000;; - 0.000000; 0.000000; 0.000000;; - } - } // End of Cube material list - XSkinMeshHeader { - 5; - 15; - 5; - } - SkinWeights { - "Armature_Bone_003"; - 249; - 4, - 5, - 6, - 7, - 9, - 10, - 13, - 14, - 17, - 18, - 20, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 76, - 77, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 177, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 187, - 188, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 235, - 236, - 237, - 238, - 239, - 240, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250, - 251, - 252, - 253, - 254, - 255, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263; - 0.097855, - 0.076266, - 0.083495, - 0.107234, - 0.089782, - 0.015282, - 0.015282, - 0.076266, - 0.076266, - 0.097855, - 0.089782, - 0.097855, - 0.297901, - 0.287737, - 0.176628, - 0.182485, - 0.015282, - 0.089782, - 0.098610, - 0.018636, - 0.089782, - 0.097855, - 0.107234, - 0.098610, - 0.076266, - 0.015282, - 0.018636, - 0.083495, - 0.176628, - 0.003327, - 0.018794, - 0.127925, - 0.020404, - 0.286977, - 0.174766, - 0.003327, - 0.286977, - 0.297901, - 0.182485, - 0.174766, - 0.287737, - 0.020404, - 0.003327, - 0.176628, - 0.126954, - 0.136859, - 0.062329, - 0.060353, - 0.182485, - 0.176628, - 0.127925, - 0.136859, - 0.003327, - 0.174766, - 0.126954, - 0.018794, - 0.174766, - 0.182485, - 0.136859, - 0.126954, - 0.060353, - 0.062329, - 0.059240, - 0.127925, - 0.018794, - 0.059240, - 0.136859, - 0.127925, - 0.059240, - 0.062329, - 0.018794, - 0.126954, - 0.060353, - 0.107234, - 0.083495, - 0.133455, - 0.171692, - 0.171692, - 0.133455, - 0.287737, - 0.297901, - 0.018636, - 0.098610, - 0.162048, - 0.016914, - 0.016914, - 0.162048, - 0.286977, - 0.020404, - 0.098610, - 0.107234, - 0.171692, - 0.162048, - 0.162048, - 0.171692, - 0.297901, - 0.286977, - 0.083495, - 0.018636, - 0.016914, - 0.133455, - 0.016914, - 0.020404, - 0.031793, - 0.024185, - 0.091978, - 0.024185, - 0.031793, - 0.098530, - 0.020404, - 0.287737, - 0.098530, - 0.031793, - 0.287737, - 0.133455, - 0.091978, - 0.098530, - 0.133455, - 0.016914, - 0.024185, - 0.091978, - 0.500298, - 0.488502, - 0.484399, - 0.484912, - 0.488502, - 0.484399, - 0.574901, - 0.567861, - 0.584345, - 0.581311, - 0.484399, - 0.488502, - 0.484912, - 0.484399, - 0.488502, - 0.500298, - 0.650639, - 0.642159, - 0.660270, - 0.658477, - 0.642159, - 0.652886, - 0.660270, - 0.658477, - 0.652886, - 0.650639, - 0.650639, - 0.652886, - 0.642159, - 0.567861, - 0.577104, - 0.584345, - 0.660270, - 0.652886, - 0.658477, - 0.484912, - 0.484399, - 0.500298, - 0.484399, - 0.581311, - 0.577104, - 0.574901, - 0.574901, - 0.577104, - 0.567861, - 0.584345, - 0.577104, - 0.581311, - 0.650637, - 0.658473, - 0.660266, - 0.642160, - 0.658473, - 0.652884, - 0.660266, - 0.642160, - 0.652884, - 0.650637, - 0.650637, - 0.652884, - 0.658473, - 0.660266, - 0.652884, - 0.642160, - 0.574890, - 0.581306, - 0.584343, - 0.567845, - 0.581306, - 0.577096, - 0.584343, - 0.567845, - 0.577096, - 0.574890, - 0.574890, - 0.577096, - 0.581306, - 0.584343, - 0.577096, - 0.567845, - 0.228406, - 0.235541, - 0.226562, - 0.226110, - 0.235541, - 0.218934, - 0.220409, - 0.226562, - 0.218934, - 0.223567, - 0.223362, - 0.220409, - 0.223567, - 0.228406, - 0.226110, - 0.223362, - 0.226110, - 0.226562, - 0.220409, - 0.223362, - 0.223567, - 0.218934, - 0.235541, - 0.228406, - 0.467092, - 0.474056, - 0.449203, - 0.459631, - 0.474056, - 0.473079, - 0.460570, - 0.449203, - 0.473079, - 0.467589, - 0.462597, - 0.460570, - 0.467589, - 0.467092, - 0.459631, - 0.462597, - 0.459631, - 0.449203, - 0.460570, - 0.462597, - 0.467589, - 0.473079, - 0.474056, - 0.467092; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000,-1.600000, 0.000000, 1.000000;; - } // End of Armature_Bone_003 skin weights - SkinWeights { - "Armature_Bone_002"; - 210; - 0, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 13, - 14, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 177, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 187, - 188, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 210, - 211, - 212, - 213, - 214, - 215; - 0.026699, - 0.019645, - 0.225152, - 0.090050, - 0.096422, - 0.247592, - 0.026699, - 0.225915, - 0.091110, - 0.091110, - 0.090050, - 0.090050, - 0.225152, - 0.019645, - 0.225915, - 0.026699, - 0.019645, - 0.225152, - 0.378267, - 0.217186, - 0.396865, - 0.489530, - 0.091110, - 0.225915, - 0.248358, - 0.097508, - 0.225915, - 0.225152, - 0.247592, - 0.248358, - 0.090050, - 0.091110, - 0.097508, - 0.096422, - 0.396865, - 0.398905, - 0.438519, - 0.443076, - 0.218141, - 0.380147, - 0.489880, - 0.398905, - 0.380147, - 0.378267, - 0.489530, - 0.489880, - 0.217186, - 0.218141, - 0.398905, - 0.396865, - 0.504112, - 0.502873, - 0.231972, - 0.249788, - 0.489530, - 0.396865, - 0.443076, - 0.502873, - 0.398905, - 0.489880, - 0.504112, - 0.438519, - 0.489880, - 0.489530, - 0.502873, - 0.504112, - 0.249788, - 0.231972, - 0.219728, - 0.214257, - 0.443076, - 0.438519, - 0.214257, - 0.219728, - 0.502873, - 0.443076, - 0.219728, - 0.231972, - 0.438519, - 0.504112, - 0.249788, - 0.214257, - 0.247592, - 0.096422, - 0.123030, - 0.409380, - 0.409380, - 0.123030, - 0.217186, - 0.378267, - 0.097508, - 0.248358, - 0.410435, - 0.124284, - 0.124284, - 0.410435, - 0.380147, - 0.218141, - 0.248358, - 0.247592, - 0.409380, - 0.410435, - 0.410435, - 0.409380, - 0.378267, - 0.380147, - 0.096422, - 0.097508, - 0.124284, - 0.123030, - 0.124284, - 0.218141, - 0.103633, - 0.087149, - 0.092557, - 0.087149, - 0.103633, - 0.094423, - 0.218141, - 0.217186, - 0.094423, - 0.103633, - 0.217186, - 0.123030, - 0.092557, - 0.094423, - 0.123030, - 0.124284, - 0.087149, - 0.092557, - 0.499702, - 0.511498, - 0.515601, - 0.515088, - 0.511498, - 0.515601, - 0.425099, - 0.432139, - 0.415655, - 0.418689, - 0.515601, - 0.511498, - 0.515088, - 0.515601, - 0.511498, - 0.499702, - 0.349361, - 0.357841, - 0.339730, - 0.341523, - 0.357841, - 0.347114, - 0.339730, - 0.341523, - 0.347114, - 0.349361, - 0.349361, - 0.347114, - 0.357841, - 0.432139, - 0.422896, - 0.415655, - 0.339730, - 0.347114, - 0.341523, - 0.515088, - 0.515601, - 0.499702, - 0.515601, - 0.418689, - 0.422896, - 0.425099, - 0.425099, - 0.422896, - 0.432139, - 0.415655, - 0.422896, - 0.418689, - 0.349363, - 0.341527, - 0.339734, - 0.357840, - 0.341527, - 0.347116, - 0.339734, - 0.357840, - 0.347116, - 0.349363, - 0.349363, - 0.347116, - 0.341527, - 0.339734, - 0.347116, - 0.357840, - 0.425110, - 0.418694, - 0.415657, - 0.432155, - 0.418694, - 0.422904, - 0.415657, - 0.432155, - 0.422904, - 0.425110, - 0.425110, - 0.422904, - 0.418694, - 0.415657, - 0.422904, - 0.432155; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000,-1.300000, 0.000000, 1.000000;; - } // End of Armature_Bone_002 skin weights - SkinWeights { - "Armature_Bone_001"; - 127; - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 75, - 76, - 77, - 78, - 80, - 81, - 84, - 85, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135; - 0.028090, - 0.044667, - 0.027228, - 0.014924, - 0.187604, - 0.200597, - 0.217670, - 0.204339, - 0.028090, - 0.204480, - 0.310430, - 0.044667, - 0.044667, - 0.310430, - 0.200597, - 0.027228, - 0.027228, - 0.200597, - 0.187604, - 0.014924, - 0.204480, - 0.028090, - 0.014924, - 0.187604, - 0.067482, - 0.064812, - 0.031709, - 0.033965, - 0.310430, - 0.204480, - 0.222012, - 0.341423, - 0.204480, - 0.187604, - 0.204339, - 0.222012, - 0.200597, - 0.310430, - 0.341423, - 0.217670, - 0.031709, - 0.101587, - 0.070428, - 0.017181, - 0.167670, - 0.078366, - 0.047455, - 0.101587, - 0.078366, - 0.067482, - 0.033965, - 0.047455, - 0.064812, - 0.167670, - 0.101587, - 0.031709, - 0.027631, - 0.014453, - 0.033965, - 0.031709, - 0.017181, - 0.014453, - 0.101587, - 0.047455, - 0.027631, - 0.070428, - 0.047455, - 0.033965, - 0.014453, - 0.027631, - 0.008199, - 0.017181, - 0.070428, - 0.008199, - 0.014453, - 0.017181, - 0.070428, - 0.027631, - 0.008199, - 0.204339, - 0.217670, - 0.123770, - 0.116219, - 0.116219, - 0.123770, - 0.064812, - 0.067482, - 0.341423, - 0.222012, - 0.131980, - 0.371812, - 0.371812, - 0.131980, - 0.078366, - 0.167670, - 0.222012, - 0.204339, - 0.116219, - 0.131980, - 0.131980, - 0.116219, - 0.067482, - 0.078366, - 0.217670, - 0.341423, - 0.371812, - 0.123770, - 0.371812, - 0.167670, - 0.122698, - 0.132035, - 0.078042, - 0.132035, - 0.122698, - 0.065986, - 0.167670, - 0.064812, - 0.065986, - 0.122698, - 0.064812, - 0.123770, - 0.078042, - 0.065986, - 0.123770, - 0.371812, - 0.132035, - 0.078042; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000,-1.000000, 0.000000, 1.000000;; - } // End of Armature_Bone_001 skin weights - SkinWeights { - "Armature_Bone"; - 136; - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135; - 0.945211, - 0.955333, - 0.972772, - 0.965432, - 0.441407, - 0.557541, - 0.520087, - 0.387790, - 0.945211, - 0.424328, - 0.470645, - 0.955333, - 0.955333, - 0.470645, - 0.557541, - 0.972772, - 0.972772, - 0.557541, - 0.441407, - 0.965432, - 0.424328, - 0.945211, - 0.965432, - 0.441407, - 0.133775, - 0.243816, - 0.149205, - 0.083512, - 0.470645, - 0.424328, - 0.371115, - 0.418447, - 0.424328, - 0.441407, - 0.387790, - 0.371115, - 0.557541, - 0.470645, - 0.418447, - 0.520087, - 0.149205, - 0.102630, - 0.077530, - 0.107912, - 0.165882, - 0.124352, - 0.077496, - 0.102630, - 0.124352, - 0.133775, - 0.083512, - 0.077496, - 0.243816, - 0.165882, - 0.102630, - 0.149205, - 0.060886, - 0.066205, - 0.013250, - 0.011723, - 0.083512, - 0.149205, - 0.107912, - 0.066205, - 0.102630, - 0.077496, - 0.060886, - 0.077530, - 0.077496, - 0.083512, - 0.066205, - 0.060886, - 0.011723, - 0.013250, - 0.048094, - 0.022321, - 0.107912, - 0.077530, - 0.022321, - 0.048094, - 0.066205, - 0.107912, - 0.048094, - 0.013250, - 0.077530, - 0.060886, - 0.011723, - 0.022321, - 0.387790, - 0.520087, - 0.494225, - 0.226848, - 0.226848, - 0.494225, - 0.243816, - 0.133775, - 0.418447, - 0.371115, - 0.212428, - 0.276984, - 0.276984, - 0.212428, - 0.124352, - 0.165882, - 0.371115, - 0.387790, - 0.226848, - 0.212428, - 0.212428, - 0.226848, - 0.133775, - 0.124352, - 0.520087, - 0.418447, - 0.276984, - 0.494225, - 0.276984, - 0.165882, - 0.382664, - 0.483353, - 0.390460, - 0.483353, - 0.382664, - 0.298215, - 0.165882, - 0.243816, - 0.298215, - 0.382664, - 0.243816, - 0.494225, - 0.390460, - 0.298215, - 0.494225, - 0.276984, - 0.483353, - 0.390460; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 1.000000;; - } // End of Armature_Bone skin weights - SkinWeights { - "Armature_Bone_004"; - 172; - 4, - 5, - 6, - 7, - 9, - 10, - 13, - 14, - 17, - 18, - 20, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 235, - 236, - 237, - 238, - 239, - 240, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250, - 251, - 252, - 253, - 254, - 255, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263; - 0.047982, - 0.075546, - 0.082326, - 0.053045, - 0.055496, - 0.112532, - 0.112532, - 0.075546, - 0.075546, - 0.047982, - 0.055496, - 0.047982, - 0.122575, - 0.186448, - 0.245593, - 0.210507, - 0.112532, - 0.055496, - 0.059905, - 0.123986, - 0.055496, - 0.047982, - 0.053045, - 0.059905, - 0.075546, - 0.112532, - 0.123986, - 0.082326, - 0.245593, - 0.393551, - 0.394730, - 0.303906, - 0.427903, - 0.130157, - 0.210403, - 0.393551, - 0.130157, - 0.122575, - 0.210507, - 0.210403, - 0.186448, - 0.427903, - 0.393551, - 0.245593, - 0.280416, - 0.279610, - 0.692449, - 0.678135, - 0.210507, - 0.245593, - 0.303906, - 0.279610, - 0.393551, - 0.210403, - 0.280416, - 0.394730, - 0.210403, - 0.210507, - 0.279610, - 0.280416, - 0.678135, - 0.692449, - 0.672937, - 0.755223, - 0.303906, - 0.394730, - 0.755223, - 0.672937, - 0.279610, - 0.303906, - 0.672937, - 0.692449, - 0.394730, - 0.280416, - 0.678135, - 0.755223, - 0.053045, - 0.082326, - 0.125519, - 0.075862, - 0.075862, - 0.125519, - 0.186448, - 0.122575, - 0.123986, - 0.059905, - 0.083109, - 0.210006, - 0.210006, - 0.083109, - 0.130157, - 0.427903, - 0.059905, - 0.053045, - 0.075862, - 0.083109, - 0.083109, - 0.075862, - 0.122575, - 0.130157, - 0.082326, - 0.123986, - 0.210006, - 0.125519, - 0.210006, - 0.427903, - 0.359212, - 0.273279, - 0.346964, - 0.273279, - 0.359212, - 0.442846, - 0.427903, - 0.186448, - 0.442846, - 0.359212, - 0.186448, - 0.125519, - 0.346964, - 0.442846, - 0.125519, - 0.210006, - 0.273279, - 0.346964, - 0.771594, - 0.764459, - 0.773438, - 0.773890, - 0.764459, - 0.781066, - 0.779591, - 0.773438, - 0.781066, - 0.776433, - 0.776638, - 0.779591, - 0.776433, - 0.771594, - 0.773890, - 0.776638, - 0.773890, - 0.773438, - 0.779591, - 0.776638, - 0.776433, - 0.781066, - 0.764459, - 0.771594, - 0.532908, - 0.525944, - 0.550797, - 0.540369, - 0.525944, - 0.526921, - 0.539430, - 0.550797, - 0.526921, - 0.532411, - 0.537403, - 0.539430, - 0.532411, - 0.532908, - 0.540369, - 0.537403, - 0.540369, - 0.550797, - 0.539430, - 0.537403, - 0.532411, - 0.526921, - 0.525944, - 0.532908; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000,-2.000000, 0.000000, 1.000000;; - } // End of Armature_Bone_004 skin weights - } // End of Cube mesh - } // End of Cube - } // End of Armature -} // End of Root -AnimationSet Global { - Animation { - {Armature} - AnimationKey { // Rotation - 0; - 31; - 0;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 1;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 2;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 3;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 4;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 5;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 6;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 7;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 8;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 9;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 10;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 11;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 12;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 13;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 14;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 15;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 16;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 17;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 18;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 19;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 20;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 21;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 22;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 23;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 24;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 25;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 26;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 27;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 28;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 29;4;-0.000000, 0.000000, 0.000000, 1.000000;;, - 30;4;-0.000000, 0.000000, 0.000000, 1.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 5.000000, 5.000000, 5.000000;;, - 1;3; 5.000000, 5.000000, 5.000000;;, - 2;3; 5.000000, 5.000000, 5.000000;;, - 3;3; 5.000000, 5.000000, 5.000000;;, - 4;3; 5.000000, 5.000000, 5.000000;;, - 5;3; 5.000000, 5.000000, 5.000000;;, - 6;3; 5.000000, 5.000000, 5.000000;;, - 7;3; 5.000000, 5.000000, 5.000000;;, - 8;3; 5.000000, 5.000000, 5.000000;;, - 9;3; 5.000000, 5.000000, 5.000000;;, - 10;3; 5.000000, 5.000000, 5.000000;;, - 11;3; 5.000000, 5.000000, 5.000000;;, - 12;3; 5.000000, 5.000000, 5.000000;;, - 13;3; 5.000000, 5.000000, 5.000000;;, - 14;3; 5.000000, 5.000000, 5.000000;;, - 15;3; 5.000000, 5.000000, 5.000000;;, - 16;3; 5.000000, 5.000000, 5.000000;;, - 17;3; 5.000000, 5.000000, 5.000000;;, - 18;3; 5.000000, 5.000000, 5.000000;;, - 19;3; 5.000000, 5.000000, 5.000000;;, - 20;3; 5.000000, 5.000000, 5.000000;;, - 21;3; 5.000000, 5.000000, 5.000000;;, - 22;3; 5.000000, 5.000000, 5.000000;;, - 23;3; 5.000000, 5.000000, 5.000000;;, - 24;3; 5.000000, 5.000000, 5.000000;;, - 25;3; 5.000000, 5.000000, 5.000000;;, - 26;3; 5.000000, 5.000000, 5.000000;;, - 27;3; 5.000000, 5.000000, 5.000000;;, - 28;3; 5.000000, 5.000000, 5.000000;;, - 29;3; 5.000000, 5.000000, 5.000000;;, - 30;3; 5.000000, 5.000000, 5.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.000000,-5.000000;;, - 1;3; 0.000000, 0.000000,-5.000000;;, - 2;3; 0.000000, 0.000000,-5.000000;;, - 3;3; 0.000000, 0.000000,-5.000000;;, - 4;3; 0.000000, 0.000000,-5.000000;;, - 5;3; 0.000000, 0.000000,-5.000000;;, - 6;3; 0.000000, 0.000000,-5.000000;;, - 7;3; 0.000000, 0.000000,-5.000000;;, - 8;3; 0.000000, 0.000000,-5.000000;;, - 9;3; 0.000000, 0.000000,-5.000000;;, - 10;3; 0.000000, 0.000000,-5.000000;;, - 11;3; 0.000000, 0.000000,-5.000000;;, - 12;3; 0.000000, 0.000000,-5.000000;;, - 13;3; 0.000000, 0.000000,-5.000000;;, - 14;3; 0.000000, 0.000000,-5.000000;;, - 15;3; 0.000000, 0.000000,-5.000000;;, - 16;3; 0.000000, 0.000000,-5.000000;;, - 17;3; 0.000000, 0.000000,-5.000000;;, - 18;3; 0.000000, 0.000000,-5.000000;;, - 19;3; 0.000000, 0.000000,-5.000000;;, - 20;3; 0.000000, 0.000000,-5.000000;;, - 21;3; 0.000000, 0.000000,-5.000000;;, - 22;3; 0.000000, 0.000000,-5.000000;;, - 23;3; 0.000000, 0.000000,-5.000000;;, - 24;3; 0.000000, 0.000000,-5.000000;;, - 25;3; 0.000000, 0.000000,-5.000000;;, - 26;3; 0.000000, 0.000000,-5.000000;;, - 27;3; 0.000000, 0.000000,-5.000000;;, - 28;3; 0.000000, 0.000000,-5.000000;;, - 29;3; 0.000000, 0.000000,-5.000000;;, - 30;3; 0.000000, 0.000000,-5.000000;;; - } - } - Animation { - {Armature_Bone} - AnimationKey { // Rotation - 0; - 31; - 0;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 1;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 2;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 3;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 4;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 5;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 6;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 7;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 8;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 9;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 10;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 11;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 12;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 13;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 14;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 15;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 16;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 17;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 18;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 19;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 20;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 21;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 22;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 23;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 24;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 25;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 26;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 27;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 28;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 29;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 30;4;-0.707107, 0.707107, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.000000, 0.000000;;, - 1;3; 0.000000, 0.000000, 0.000000;;, - 2;3; 0.000000, 0.000000, 0.000000;;, - 3;3; 0.000000, 0.000000, 0.000000;;, - 4;3; 0.000000, 0.000000, 0.000000;;, - 5;3; 0.000000, 0.000000, 0.000000;;, - 6;3; 0.000000, 0.000000, 0.000000;;, - 7;3; 0.000000, 0.000000, 0.000000;;, - 8;3; 0.000000, 0.000000, 0.000000;;, - 9;3; 0.000000, 0.000000, 0.000000;;, - 10;3; 0.000000, 0.000000, 0.000000;;, - 11;3; 0.000000, 0.000000, 0.000000;;, - 12;3; 0.000000, 0.000000, 0.000000;;, - 13;3; 0.000000, 0.000000, 0.000000;;, - 14;3; 0.000000, 0.000000, 0.000000;;, - 15;3; 0.000000, 0.000000, 0.000000;;, - 16;3; 0.000000, 0.000000, 0.000000;;, - 17;3; 0.000000, 0.000000, 0.000000;;, - 18;3; 0.000000, 0.000000, 0.000000;;, - 19;3; 0.000000, 0.000000, 0.000000;;, - 20;3; 0.000000, 0.000000, 0.000000;;, - 21;3; 0.000000, 0.000000, 0.000000;;, - 22;3; 0.000000, 0.000000, 0.000000;;, - 23;3; 0.000000, 0.000000, 0.000000;;, - 24;3; 0.000000, 0.000000, 0.000000;;, - 25;3; 0.000000, 0.000000, 0.000000;;, - 26;3; 0.000000, 0.000000, 0.000000;;, - 27;3; 0.000000, 0.000000, 0.000000;;, - 28;3; 0.000000, 0.000000, 0.000000;;, - 29;3; 0.000000, 0.000000, 0.000000;;, - 30;3; 0.000000, 0.000000, 0.000000;;; - } - } - Animation { - {Armature_Bone_001} - AnimationKey { // Rotation - 0; - 31; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 2;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 3;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 6;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 7;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 12;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 13;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 14;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 15;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 16;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 17;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 18;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 20;4;-0.998539, 0.054035, 0.000000,-0.000000;;, - 21;4;-0.996147, 0.053932, 0.002355, 0.043499;;, - 22;4;-0.998539, 0.054035, 0.000000, 0.000000;;, - 23;4;-0.997589, 0.053983,-0.002357,-0.043556;;, - 24;4;-0.998539, 0.054035, 0.000000, 0.000000;;, - 25;4;-0.996639, 0.053932, 0.003045, 0.056265;;, - 26;4;-0.994740, 0.053829, 0.004709, 0.087028;;, - 27;4;-0.996147, 0.053932, 0.002355, 0.043519;;, - 28;4;-0.998539, 0.054035, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 2.000000, 0.000000;;, - 1;3; 0.000000, 2.000000, 0.000000;;, - 2;3; 0.000000, 2.000000, 0.000000;;, - 3;3; 0.000000, 2.000000, 0.000000;;, - 4;3; 0.000000, 2.000000, 0.000000;;, - 5;3; 0.000000, 2.000000, 0.000000;;, - 6;3; 0.000000, 2.000000, 0.000000;;, - 7;3; 0.000000, 2.000000, 0.000000;;, - 8;3; 0.000000, 2.000000, 0.000000;;, - 9;3; 0.000000, 2.000000, 0.000000;;, - 10;3; 0.000000, 2.000000, 0.000000;;, - 11;3; 0.000000, 2.000000, 0.000000;;, - 12;3; 0.000000, 2.000000, 0.000000;;, - 13;3; 0.000000, 2.000000, 0.000000;;, - 14;3; 0.000000, 2.000000, 0.000000;;, - 15;3; 0.000000, 2.000000, 0.000000;;, - 16;3; 0.000000, 2.000000, 0.000000;;, - 17;3; 0.000000, 2.000000, 0.000000;;, - 18;3; 0.000000, 2.000000, 0.000000;;, - 19;3; 0.000000, 2.000000, 0.000000;;, - 20;3; 0.000000, 2.000000, 0.000000;;, - 21;3; 0.000000, 2.000000, 0.000000;;, - 22;3; 0.000000, 2.000000, 0.000000;;, - 23;3; 0.000000, 2.000000, 0.000000;;, - 24;3; 0.000000, 2.000000, 0.000000;;, - 25;3; 0.000000, 2.000000, 0.000000;;, - 26;3; 0.000000, 2.000000, 0.000000;;, - 27;3; 0.000000, 2.000000, 0.000000;;, - 28;3; 0.000000, 2.000000, 0.000000;;, - 29;3; 0.000000, 2.000000, 0.000000;;, - 30;3; 0.000000, 2.000000, 0.000000;;; - } - } - Animation { - {Armature_Bone_002} - AnimationKey { // Rotation - 0; - 31; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 2;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 3;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 6;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 7;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 12;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 13;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 14;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 15;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 16;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 17;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 18;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 20;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 21;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 22;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 23;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 24;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 25;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 26;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 27;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 28;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.300000, 0.000000;;, - 1;3; 0.000000, 0.300000, 0.000000;;, - 2;3; 0.000000, 0.300000, 0.000000;;, - 3;3; 0.000000, 0.300000, 0.000000;;, - 4;3; 0.000000, 0.300000, 0.000000;;, - 5;3; 0.000000, 0.300000, 0.000000;;, - 6;3; 0.000000, 0.300000, 0.000000;;, - 7;3; 0.000000, 0.300000, 0.000000;;, - 8;3; 0.000000, 0.300000, 0.000000;;, - 9;3; 0.000000, 0.300000, 0.000000;;, - 10;3; 0.000000, 0.300000, 0.000000;;, - 11;3; 0.000000, 0.300000, 0.000000;;, - 12;3; 0.000000, 0.300000, 0.000000;;, - 13;3; 0.000000, 0.300000, 0.000000;;, - 14;3; 0.000000, 0.300000, 0.000000;;, - 15;3; 0.000000, 0.300000, 0.000000;;, - 16;3; 0.000000, 0.300000, 0.000000;;, - 17;3; 0.000000, 0.300000, 0.000000;;, - 18;3; 0.000000, 0.300000, 0.000000;;, - 19;3; 0.000000, 0.300000, 0.000000;;, - 20;3; 0.000000, 0.300000, 0.000000;;, - 21;3;-0.000000, 0.300000,-0.000000;;, - 22;3;-0.000000, 0.300000, 0.000000;;, - 23;3;-0.000000, 0.300000, 0.000000;;, - 24;3;-0.000000, 0.300000, 0.000000;;, - 25;3;-0.000000, 0.300000,-0.000000;;, - 26;3;-0.000000, 0.300000, 0.000000;;, - 27;3;-0.000000, 0.300000,-0.000000;;, - 28;3; 0.000000, 0.300000, 0.000000;;, - 29;3; 0.000000, 0.300000, 0.000000;;, - 30;3; 0.000000, 0.300000, 0.000000;;; - } - } - Animation { - {Armature_Bone_003} - AnimationKey { // Rotation - 0; - 31; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 2;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 3;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 6;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 7;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-0.998097,-0.000000, 0.000000,-0.043583;;, - 12;4;-0.996195,-0.000000, 0.000000,-0.087156;;, - 13;4;-0.998097,-0.000000, 0.000000,-0.056342;;, - 14;4;-1.000000,-0.000000,-0.000000, 0.000000;;, - 15;4;-0.998097,-0.000000,-0.000000, 0.056342;;, - 16;4;-0.996195,-0.000000,-0.000000, 0.087156;;, - 17;4;-0.998097,-0.000000,-0.000000, 0.043583;;, - 18;4;-1.000000,-0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000,-0.000000, 0.000000, 0.000000;;, - 20;4;-0.996195, 0.087156, 0.000000, 0.000000;;, - 21;4;-0.996434, 0.081668, 0.000000, 0.000000;;, - 22;4;-0.996936, 0.070172, 0.000000, 0.000000;;, - 23;4;-0.997535, 0.056459, 0.000000, 0.000000;;, - 24;4;-0.998149, 0.042383, 0.000000, 0.000000;;, - 25;4;-0.998729, 0.029106, 0.000000, 0.000000;;, - 26;4;-0.999236, 0.017493, 0.000000, 0.000000;;, - 27;4;-0.999638, 0.008289, 0.000000, 0.000000;;, - 28;4;-0.999904, 0.002208, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.300000, 0.000000;;, - 1;3; 0.000000, 0.300000, 0.000000;;, - 2;3; 0.000000, 0.300000, 0.000000;;, - 3;3; 0.000000, 0.300000, 0.000000;;, - 4;3; 0.000000, 0.300000, 0.000000;;, - 5;3; 0.000000, 0.300000, 0.000000;;, - 6;3; 0.000000, 0.300000, 0.000000;;, - 7;3; 0.000000, 0.300000, 0.000000;;, - 8;3; 0.000000, 0.300000, 0.000000;;, - 9;3; 0.000000, 0.300000, 0.000000;;, - 10;3; 0.000000, 0.300000, 0.000000;;, - 11;3; 0.000000, 0.300000, 0.000000;;, - 12;3; 0.000000, 0.300000, 0.000000;;, - 13;3; 0.000000, 0.300000, 0.000000;;, - 14;3; 0.000000, 0.300000, 0.000000;;, - 15;3; 0.000000, 0.300000, 0.000000;;, - 16;3; 0.000000, 0.300000, 0.000000;;, - 17;3; 0.000000, 0.300000, 0.000000;;, - 18;3; 0.000000, 0.300000, 0.000000;;, - 19;3; 0.000000, 0.300000, 0.000000;;, - 20;3; 0.000000, 0.300000, 0.000000;;, - 21;3;-0.000000, 0.300000,-0.000000;;, - 22;3;-0.000000, 0.300000,-0.000000;;, - 23;3; 0.000000, 0.300000, 0.000000;;, - 24;3;-0.000000, 0.300000,-0.000000;;, - 25;3; 0.000000, 0.300000,-0.000000;;, - 26;3;-0.000000, 0.300000,-0.000000;;, - 27;3;-0.000000, 0.300000,-0.000000;;, - 28;3;-0.000000, 0.300000, 0.000000;;, - 29;3; 0.000000, 0.300000, 0.000000;;, - 30;3; 0.000000, 0.300000, 0.000000;;; - } - } - Animation { - {Armature_Bone_004} - AnimationKey { // Rotation - 0; - 31; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-0.999524, 0.021812, 0.000000,-0.000000;;, - 2;4;-0.999048, 0.043619, 0.000000,-0.000000;;, - 3;4;-0.999524, 0.028196, 0.000000,-0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-0.999524,-0.028196,-0.000000, 0.000000;;, - 6;4;-0.999048,-0.043619,-0.000000, 0.000000;;, - 7;4;-0.999524,-0.021810,-0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 12;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 13;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 14;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 15;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 16;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 17;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 18;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 20;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 21;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 22;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 23;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 24;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 25;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 26;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 27;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 28;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.400000, 0.000000;;, - 1;3; 0.000000, 0.400000, 0.000000;;, - 2;3; 0.000000, 0.400000, 0.000000;;, - 3;3; 0.000000, 0.400000, 0.000000;;, - 4;3; 0.000000, 0.400000, 0.000000;;, - 5;3; 0.000000, 0.400000, 0.000000;;, - 6;3; 0.000000, 0.400000, 0.000000;;, - 7;3; 0.000000, 0.400000, 0.000000;;, - 8;3; 0.000000, 0.400000, 0.000000;;, - 9;3; 0.000000, 0.400000, 0.000000;;, - 10;3; 0.000000, 0.400000, 0.000000;;, - 11;3; 0.000000, 0.400000,-0.000000;;, - 12;3;-0.000000, 0.400000, 0.000000;;, - 13;3; 0.000000, 0.400000, 0.000000;;, - 14;3;-0.000000, 0.400000, 0.000000;;, - 15;3;-0.000000, 0.400000, 0.000000;;, - 16;3; 0.000000, 0.400000, 0.000000;;, - 17;3;-0.000000, 0.400000,-0.000000;;, - 18;3;-0.000000, 0.400000,-0.000000;;, - 19;3;-0.000000, 0.400000,-0.000000;;, - 20;3; 0.000000, 0.400000,-0.000000;;, - 21;3; 0.000000, 0.400000, 0.000000;;, - 22;3;-0.000000, 0.400000,-0.000000;;, - 23;3;-0.000000, 0.400000,-0.000000;;, - 24;3;-0.000000, 0.400000,-0.000000;;, - 25;3; 0.000000, 0.400000, 0.000000;;, - 26;3;-0.000000, 0.400000, 0.000000;;, - 27;3;-0.000000, 0.400000, 0.000000;;, - 28;3; 0.000000, 0.400000, 0.000000;;, - 29;3; 0.000000, 0.400000, 0.000000;;, - 30;3; 0.000000, 0.400000, 0.000000;;; - } - } - Animation { - {Cube} - AnimationKey { // Rotation - 0; - 31; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 2;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 3;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 6;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 7;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 12;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 13;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 14;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 15;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 16;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 17;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 18;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 20;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 21;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 22;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 23;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 24;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 25;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 26;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 27;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 28;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 31; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 31; - 0;3; 0.000000, 0.000000, 1.000000;;, - 1;3; 0.000000, 0.000000, 1.000000;;, - 2;3; 0.000000, 0.000000, 1.000000;;, - 3;3; 0.000000, 0.000000, 1.000000;;, - 4;3; 0.000000, 0.000000, 1.000000;;, - 5;3; 0.000000, 0.000000, 1.000000;;, - 6;3; 0.000000, 0.000000, 1.000000;;, - 7;3; 0.000000, 0.000000, 1.000000;;, - 8;3; 0.000000, 0.000000, 1.000000;;, - 9;3; 0.000000, 0.000000, 1.000000;;, - 10;3; 0.000000, 0.000000, 1.000000;;, - 11;3; 0.000000, 0.000000, 1.000000;;, - 12;3; 0.000000, 0.000000, 1.000000;;, - 13;3; 0.000000, 0.000000, 1.000000;;, - 14;3; 0.000000, 0.000000, 1.000000;;, - 15;3; 0.000000, 0.000000, 1.000000;;, - 16;3; 0.000000, 0.000000, 1.000000;;, - 17;3; 0.000000, 0.000000, 1.000000;;, - 18;3; 0.000000, 0.000000, 1.000000;;, - 19;3; 0.000000, 0.000000, 1.000000;;, - 20;3; 0.000000, 0.000000, 1.000000;;, - 21;3; 0.000000, 0.000000, 1.000000;;, - 22;3; 0.000000, 0.000000, 1.000000;;, - 23;3; 0.000000, 0.000000, 1.000000;;, - 24;3; 0.000000, 0.000000, 1.000000;;, - 25;3; 0.000000, 0.000000, 1.000000;;, - 26;3; 0.000000, 0.000000, 1.000000;;, - 27;3; 0.000000, 0.000000, 1.000000;;, - 28;3; 0.000000, 0.000000, 1.000000;;, - 29;3; 0.000000, 0.000000, 1.000000;;, - 30;3; 0.000000, 0.000000, 1.000000;;; - } - } -} // End of AnimationSet Global diff --git a/mods/mobs_monster/models/zmobs_mese_monster.x b/mods/mobs_monster/models/zmobs_mese_monster.x deleted file mode 100644 index 78734c20..00000000 --- a/mods/mobs_monster/models/zmobs_mese_monster.x +++ /dev/null @@ -1,2999 +0,0 @@ -xof 0303txt 0032 - -template XSkinMeshHeader { - <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> - WORD nMaxSkinWeightsPerVertex; - WORD nMaxSkinWeightsPerFace; - WORD nBones; -} - -template SkinWeights { - <6f0d123b-bad2-4167-a0d0-80224f25fabb> - STRING transformNodeName; - DWORD nWeights; - array DWORD vertexIndices[nWeights]; - array float weights[nWeights]; - Matrix4x4 matrixOffset; -} - -Frame Root { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame Armature { - FrameTransformMatrix { - -5.000000,-0.000001, 0.000000, 0.000000, - 0.000001,-5.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 5.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame Armature_head { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000,-1.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 1.000000;; - } - Frame Armature_wing_1 { - FrameTransformMatrix { - 0.346593, 0.643673,-0.682319, 0.000000, - 0.880471,-0.474100,-0.000000, 0.000000, - -0.323487,-0.600762,-0.731055, 0.000000, - 1.000000, 1.625000,-0.000000, 1.000000;; - } - } // End of Armature_wing_1 - Frame Armature_wing_2 { - FrameTransformMatrix { - 0.421701,-0.783159, 0.456980, 0.000000, - -0.880471,-0.474100,-0.000000, 0.000000, - 0.216654,-0.402357,-0.889477, 0.000000, - -1.000000, 1.625000, 0.000000, 1.000000;; - } - } // End of Armature_wing_2 - } // End of Armature_head - Frame Cube { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Mesh { // Cube mesh - 384; - 1.000000; 0.000000; 0.125000;, - 1.125000; 0.000000; 0.125000;, - 1.125000; 0.000000;-0.125000;, - 1.375000; 0.000000;-0.125000;, - 1.375000; 0.000000;-0.250000;, - 1.500000; 0.000000;-0.250000;, - 1.500000; 0.000000;-0.375000;, - 1.625000; 0.000000;-0.375000;, - 1.625000; 0.000000;-0.500000;, - 2.000000; 0.000000;-0.500000;, - 2.000000; 0.000000;-0.625000;, - 2.250000; 0.000000;-0.625000;, - 2.250000; 0.000000;-0.750000;, - 2.375000; 0.000000;-0.750000;, - 2.375000; 0.000000;-0.875000;, - 2.750000; 0.000000;-0.875000;, - 2.750000; 0.000000;-0.625000;, - 2.625000; 0.000000;-0.625000;, - 2.625000; 0.000000; 0.250000;, - 2.500000; 0.000000; 0.250000;, - 2.500000; 0.000000; 0.500000;, - 2.375000; 0.000000; 0.500000;, - 2.375000; 0.000000; 0.625000;, - 2.125000; 0.000000; 0.625000;, - 2.125000; 0.000000; 0.750000;, - 2.000000; 0.000000; 0.750000;, - 2.000000; 0.000000; 0.875000;, - 1.875000; 0.000000; 0.875000;, - 1.875000; 0.000000; 1.000000;, - 1.000000; 0.000000; 1.000000;, - 1.000000; 0.125000; 0.125000;, - 1.000000; 0.125000; 1.000000;, - 1.875000; 0.125000; 1.000000;, - 1.875000; 0.125000; 0.875000;, - 2.000000; 0.125000; 0.875000;, - 2.000000; 0.125000; 0.750000;, - 2.125000; 0.125000; 0.750000;, - 2.125000; 0.125000; 0.625000;, - 2.375000; 0.125000; 0.625000;, - 2.375000; 0.125000; 0.500000;, - 2.500000; 0.125000; 0.500000;, - 2.500000; 0.125000; 0.250000;, - 2.625000; 0.125000; 0.250000;, - 2.625000; 0.125000;-0.625000;, - 2.750000; 0.125000;-0.625000;, - 2.750000; 0.125000;-0.875000;, - 2.375000; 0.125000;-0.875000;, - 2.375000; 0.125000;-0.750000;, - 2.250000; 0.125000;-0.750000;, - 2.250000; 0.125000;-0.625000;, - 2.000000; 0.125000;-0.625000;, - 2.000000; 0.125000;-0.500000;, - 1.625000; 0.125000;-0.500000;, - 1.625000; 0.125000;-0.375000;, - 1.500000; 0.125000;-0.375000;, - 1.500000; 0.125000;-0.250000;, - 1.375000; 0.125000;-0.250000;, - 1.375000; 0.125000;-0.125000;, - 1.125000; 0.125000;-0.125000;, - 1.125000; 0.125000; 0.125000;, - 1.875000; 0.000000; 0.875000;, - 2.000000; 0.000000; 0.875000;, - 2.000000; 0.125000; 0.875000;, - 1.875000; 0.125000; 0.875000;, - 1.125000; 0.000000; 0.125000;, - 1.000000; 0.000000; 0.125000;, - 1.000000; 0.125000; 0.125000;, - 1.125000; 0.125000; 0.125000;, - 1.500000; 0.000000;-0.375000;, - 1.500000; 0.000000;-0.250000;, - 1.500000; 0.125000;-0.250000;, - 1.500000; 0.125000;-0.375000;, - 2.250000; 0.000000;-0.625000;, - 2.000000; 0.000000;-0.625000;, - 2.000000; 0.125000;-0.625000;, - 2.250000; 0.125000;-0.625000;, - 2.750000; 0.000000;-0.625000;, - 2.750000; 0.000000;-0.875000;, - 2.750000; 0.125000;-0.875000;, - 2.750000; 0.125000;-0.625000;, - 2.375000; 0.000000; 0.500000;, - 2.500000; 0.000000; 0.500000;, - 2.500000; 0.125000; 0.500000;, - 2.375000; 0.125000; 0.500000;, - 2.000000; 0.000000; 0.875000;, - 2.000000; 0.000000; 0.750000;, - 2.000000; 0.125000; 0.750000;, - 2.000000; 0.125000; 0.875000;, - 1.000000; 0.000000; 0.125000;, - 1.000000; 0.000000; 1.000000;, - 1.000000; 0.125000; 1.000000;, - 1.000000; 0.125000; 0.125000;, - 1.500000; 0.000000;-0.250000;, - 1.375000; 0.000000;-0.250000;, - 1.375000; 0.125000;-0.250000;, - 1.500000; 0.125000;-0.250000;, - 2.000000; 0.000000;-0.625000;, - 2.000000; 0.000000;-0.500000;, - 2.000000; 0.125000;-0.500000;, - 2.000000; 0.125000;-0.625000;, - 2.750000; 0.000000;-0.875000;, - 2.375000; 0.000000;-0.875000;, - 2.375000; 0.125000;-0.875000;, - 2.750000; 0.125000;-0.875000;, - 2.500000; 0.000000; 0.500000;, - 2.500000; 0.000000; 0.250000;, - 2.500000; 0.125000; 0.250000;, - 2.500000; 0.125000; 0.500000;, - 2.000000; 0.000000; 0.750000;, - 2.125000; 0.000000; 0.750000;, - 2.125000; 0.125000; 0.750000;, - 2.000000; 0.125000; 0.750000;, - 1.375000; 0.000000;-0.250000;, - 1.375000; 0.000000;-0.125000;, - 1.375000; 0.125000;-0.125000;, - 1.375000; 0.125000;-0.250000;, - 2.000000; 0.000000;-0.500000;, - 1.625000; 0.000000;-0.500000;, - 1.625000; 0.125000;-0.500000;, - 2.000000; 0.125000;-0.500000;, - 2.375000; 0.000000;-0.875000;, - 2.375000; 0.000000;-0.750000;, - 2.375000; 0.125000;-0.750000;, - 2.375000; 0.125000;-0.875000;, - 2.500000; 0.000000; 0.250000;, - 2.625000; 0.000000; 0.250000;, - 2.625000; 0.125000; 0.250000;, - 2.500000; 0.125000; 0.250000;, - 2.125000; 0.000000; 0.750000;, - 2.125000; 0.000000; 0.625000;, - 2.125000; 0.125000; 0.625000;, - 2.125000; 0.125000; 0.750000;, - 1.000000; 0.000000; 1.000000;, - 1.875000; 0.000000; 1.000000;, - 1.875000; 0.125000; 1.000000;, - 1.000000; 0.125000; 1.000000;, - 1.375000; 0.000000;-0.125000;, - 1.125000; 0.000000;-0.125000;, - 1.125000; 0.125000;-0.125000;, - 1.375000; 0.125000;-0.125000;, - 1.625000; 0.000000;-0.500000;, - 1.625000; 0.000000;-0.375000;, - 1.625000; 0.125000;-0.375000;, - 1.625000; 0.125000;-0.500000;, - 2.375000; 0.000000;-0.750000;, - 2.250000; 0.000000;-0.750000;, - 2.250000; 0.125000;-0.750000;, - 2.375000; 0.125000;-0.750000;, - 2.625000; 0.000000; 0.250000;, - 2.625000; 0.000000;-0.625000;, - 2.625000; 0.125000;-0.625000;, - 2.625000; 0.125000; 0.250000;, - 2.125000; 0.000000; 0.625000;, - 2.375000; 0.000000; 0.625000;, - 2.375000; 0.125000; 0.625000;, - 2.125000; 0.125000; 0.625000;, - 1.875000; 0.000000; 1.000000;, - 1.875000; 0.000000; 0.875000;, - 1.875000; 0.125000; 0.875000;, - 1.875000; 0.125000; 1.000000;, - 1.125000; 0.000000;-0.125000;, - 1.125000; 0.000000; 0.125000;, - 1.125000; 0.125000; 0.125000;, - 1.125000; 0.125000;-0.125000;, - 1.625000; 0.000000;-0.375000;, - 1.500000; 0.000000;-0.375000;, - 1.500000; 0.125000;-0.375000;, - 1.625000; 0.125000;-0.375000;, - 2.250000; 0.000000;-0.750000;, - 2.250000; 0.000000;-0.625000;, - 2.250000; 0.125000;-0.625000;, - 2.250000; 0.125000;-0.750000;, - 2.625000; 0.000000;-0.625000;, - 2.750000; 0.000000;-0.625000;, - 2.750000; 0.125000;-0.625000;, - 2.625000; 0.125000;-0.625000;, - 2.375000; 0.000000; 0.625000;, - 2.375000; 0.000000; 0.500000;, - 2.375000; 0.125000; 0.500000;, - 2.375000; 0.125000; 0.625000;, - -1.000000; 0.125000; 0.125000;, - -1.125000; 0.125000; 0.125000;, - -1.125000; 0.125000;-0.125000;, - -1.375000; 0.125000;-0.125000;, - -1.375000; 0.125000;-0.250000;, - -1.500000; 0.125000;-0.250000;, - -1.500000; 0.125000;-0.375000;, - -1.625000; 0.125000;-0.375000;, - -1.625000; 0.125000;-0.500000;, - -2.000000; 0.125000;-0.500000;, - -2.000000; 0.125000;-0.625000;, - -2.250000; 0.125000;-0.625000;, - -2.250000; 0.125000;-0.750000;, - -2.375000; 0.125000;-0.750000;, - -2.375000; 0.125000;-0.875000;, - -2.750000; 0.125000;-0.875000;, - -2.750000; 0.125000;-0.625000;, - -2.625000; 0.125000;-0.625000;, - -2.625000; 0.125000; 0.250000;, - -2.500000; 0.125000; 0.250000;, - -2.500000; 0.125000; 0.500000;, - -2.375000; 0.125000; 0.500000;, - -2.375000; 0.125000; 0.625000;, - -2.125000; 0.125000; 0.625000;, - -2.125000; 0.125000; 0.750000;, - -2.000000; 0.125000; 0.750000;, - -2.000000; 0.125000; 0.875000;, - -1.875000; 0.125000; 0.875000;, - -1.875000; 0.125000; 1.000000;, - -1.000000; 0.125000; 1.000000;, - -1.000000;-0.000000; 0.125000;, - -1.000000;-0.000000; 1.000000;, - -1.875000; 0.000000; 1.000000;, - -1.875000; 0.000000; 0.875000;, - -2.000000; 0.000000; 0.875000;, - -2.000000; 0.000000; 0.750000;, - -2.125000; 0.000000; 0.750000;, - -2.125000; 0.000000; 0.625000;, - -2.375000; 0.000000; 0.625000;, - -2.375000; 0.000000; 0.500000;, - -2.500000; 0.000000; 0.500000;, - -2.500000; 0.000000; 0.250000;, - -2.625000; 0.000000; 0.250000;, - -2.625000; 0.000000;-0.625000;, - -2.750000; 0.000000;-0.625000;, - -2.750000; 0.000000;-0.875000;, - -2.375000; 0.000000;-0.875000;, - -2.375000; 0.000000;-0.750000;, - -2.250000; 0.000000;-0.750000;, - -2.250000; 0.000000;-0.625000;, - -2.000000; 0.000000;-0.625000;, - -2.000000; 0.000000;-0.500000;, - -1.625000;-0.000000;-0.500000;, - -1.625000;-0.000000;-0.375000;, - -1.500000;-0.000000;-0.375000;, - -1.500000;-0.000000;-0.250000;, - -1.375000;-0.000000;-0.250000;, - -1.375000;-0.000000;-0.125000;, - -1.125000;-0.000000;-0.125000;, - -1.125000;-0.000000; 0.125000;, - -1.875000; 0.125000; 0.875000;, - -2.000000; 0.125000; 0.875000;, - -2.000000; 0.000000; 0.875000;, - -1.875000; 0.000000; 0.875000;, - -1.125000; 0.125000; 0.125000;, - -1.000000; 0.125000; 0.125000;, - -1.000000;-0.000000; 0.125000;, - -1.125000;-0.000000; 0.125000;, - -1.500000; 0.125000;-0.375000;, - -1.500000; 0.125000;-0.250000;, - -1.500000;-0.000000;-0.250000;, - -1.500000;-0.000000;-0.375000;, - -2.250000; 0.125000;-0.625000;, - -2.000000; 0.125000;-0.625000;, - -2.000000; 0.000000;-0.625000;, - -2.250000; 0.000000;-0.625000;, - -2.750000; 0.125000;-0.625000;, - -2.750000; 0.125000;-0.875000;, - -2.750000; 0.000000;-0.875000;, - -2.750000; 0.000000;-0.625000;, - -2.375000; 0.125000; 0.500000;, - -2.500000; 0.125000; 0.500000;, - -2.500000; 0.000000; 0.500000;, - -2.375000; 0.000000; 0.500000;, - -2.000000; 0.125000; 0.875000;, - -2.000000; 0.125000; 0.750000;, - -2.000000; 0.000000; 0.750000;, - -2.000000; 0.000000; 0.875000;, - -1.000000; 0.125000; 0.125000;, - -1.000000; 0.125000; 1.000000;, - -1.000000;-0.000000; 1.000000;, - -1.000000;-0.000000; 0.125000;, - -1.500000; 0.125000;-0.250000;, - -1.375000; 0.125000;-0.250000;, - -1.375000;-0.000000;-0.250000;, - -1.500000;-0.000000;-0.250000;, - -2.000000; 0.125000;-0.625000;, - -2.000000; 0.125000;-0.500000;, - -2.000000; 0.000000;-0.500000;, - -2.000000; 0.000000;-0.625000;, - -2.750000; 0.125000;-0.875000;, - -2.375000; 0.125000;-0.875000;, - -2.375000; 0.000000;-0.875000;, - -2.750000; 0.000000;-0.875000;, - -2.500000; 0.125000; 0.500000;, - -2.500000; 0.125000; 0.250000;, - -2.500000; 0.000000; 0.250000;, - -2.500000; 0.000000; 0.500000;, - -2.000000; 0.125000; 0.750000;, - -2.125000; 0.125000; 0.750000;, - -2.125000; 0.000000; 0.750000;, - -2.000000; 0.000000; 0.750000;, - -1.375000; 0.125000;-0.250000;, - -1.375000; 0.125000;-0.125000;, - -1.375000;-0.000000;-0.125000;, - -1.375000;-0.000000;-0.250000;, - -2.000000; 0.125000;-0.500000;, - -1.625000; 0.125000;-0.500000;, - -1.625000;-0.000000;-0.500000;, - -2.000000; 0.000000;-0.500000;, - -2.375000; 0.125000;-0.875000;, - -2.375000; 0.125000;-0.750000;, - -2.375000; 0.000000;-0.750000;, - -2.375000; 0.000000;-0.875000;, - -2.500000; 0.125000; 0.250000;, - -2.625000; 0.125000; 0.250000;, - -2.625000; 0.000000; 0.250000;, - -2.500000; 0.000000; 0.250000;, - -2.125000; 0.125000; 0.750000;, - -2.125000; 0.125000; 0.625000;, - -2.125000; 0.000000; 0.625000;, - -2.125000; 0.000000; 0.750000;, - -1.000000; 0.125000; 1.000000;, - -1.875000; 0.125000; 1.000000;, - -1.875000; 0.000000; 1.000000;, - -1.000000;-0.000000; 1.000000;, - -1.375000; 0.125000;-0.125000;, - -1.125000; 0.125000;-0.125000;, - -1.125000;-0.000000;-0.125000;, - -1.375000;-0.000000;-0.125000;, - -1.625000; 0.125000;-0.500000;, - -1.625000; 0.125000;-0.375000;, - -1.625000;-0.000000;-0.375000;, - -1.625000;-0.000000;-0.500000;, - -2.375000; 0.125000;-0.750000;, - -2.250000; 0.125000;-0.750000;, - -2.250000; 0.000000;-0.750000;, - -2.375000; 0.000000;-0.750000;, - -2.625000; 0.125000; 0.250000;, - -2.625000; 0.125000;-0.625000;, - -2.625000; 0.000000;-0.625000;, - -2.625000; 0.000000; 0.250000;, - -2.125000; 0.125000; 0.625000;, - -2.375000; 0.125000; 0.625000;, - -2.375000; 0.000000; 0.625000;, - -2.125000; 0.000000; 0.625000;, - -1.875000; 0.125000; 1.000000;, - -1.875000; 0.125000; 0.875000;, - -1.875000; 0.000000; 0.875000;, - -1.875000; 0.000000; 1.000000;, - -1.125000; 0.125000;-0.125000;, - -1.125000; 0.125000; 0.125000;, - -1.125000;-0.000000; 0.125000;, - -1.125000;-0.000000;-0.125000;, - -1.625000; 0.125000;-0.375000;, - -1.500000; 0.125000;-0.375000;, - -1.500000;-0.000000;-0.375000;, - -1.625000;-0.000000;-0.375000;, - -2.250000; 0.125000;-0.750000;, - -2.250000; 0.125000;-0.625000;, - -2.250000; 0.000000;-0.625000;, - -2.250000; 0.000000;-0.750000;, - -2.625000; 0.125000;-0.625000;, - -2.750000; 0.125000;-0.625000;, - -2.750000; 0.000000;-0.625000;, - -2.625000; 0.000000;-0.625000;, - -2.375000; 0.125000; 0.625000;, - -2.375000; 0.125000; 0.500000;, - -2.375000; 0.000000; 0.500000;, - -2.375000; 0.000000; 0.625000;, - -1.000000;-1.000000; 1.000000;, - -1.000000; 1.000000; 1.000000;, - -1.000000; 1.000000;-1.000000;, - -1.000000;-1.000000;-1.000000;, - -1.000000; 1.000000; 1.000000;, - 1.000000; 1.000000; 1.000000;, - 1.000000; 1.000000;-1.000000;, - -1.000000; 1.000000;-1.000000;, - 1.000000; 1.000000; 1.000000;, - 1.000000;-1.000000; 1.000000;, - 1.000000;-1.000000;-1.000000;, - 1.000000; 1.000000;-1.000000;, - 1.000000;-1.000000; 1.000000;, - -1.000000;-1.000000; 1.000000;, - -1.000000;-1.000000;-1.000000;, - 1.000000;-1.000000;-1.000000;, - -1.000000;-1.000000;-1.000000;, - -1.000000; 1.000000;-1.000000;, - 1.000000; 1.000000;-1.000000;, - 1.000000;-1.000000;-1.000000;, - 1.000000;-1.000000; 1.000000;, - 1.000000; 1.000000; 1.000000;, - -1.000000; 1.000000; 1.000000;, - -1.000000;-1.000000; 1.000000;; - 70; - 30;29;28;27;26;25;24;23;22;21;20;19;18;17;16;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1;0;, - 30;59;58;57;56;55;54;53;52;51;50;49;48;47;46;45;44;43;42;41;40;39;38;37;36;35;34;33;32;31;30;, - 4;63;62;61;60;, - 4;67;66;65;64;, - 4;71;70;69;68;, - 4;75;74;73;72;, - 4;79;78;77;76;, - 4;83;82;81;80;, - 4;87;86;85;84;, - 4;91;90;89;88;, - 4;95;94;93;92;, - 4;99;98;97;96;, - 4;103;102;101;100;, - 4;107;106;105;104;, - 4;111;110;109;108;, - 4;115;114;113;112;, - 4;119;118;117;116;, - 4;123;122;121;120;, - 4;127;126;125;124;, - 4;131;130;129;128;, - 4;135;134;133;132;, - 4;139;138;137;136;, - 4;143;142;141;140;, - 4;147;146;145;144;, - 4;151;150;149;148;, - 4;155;154;153;152;, - 4;159;158;157;156;, - 4;163;162;161;160;, - 4;167;166;165;164;, - 4;171;170;169;168;, - 4;175;174;173;172;, - 4;179;178;177;176;, - 30;209;208;207;206;205;204;203;202;201;200;199;198;197;196;195;194;193;192;191;190;189;188;187;186;185;184;183;182;181;180;, - 30;239;238;237;236;235;234;233;232;231;230;229;228;227;226;225;224;223;222;221;220;219;218;217;216;215;214;213;212;211;210;, - 4;243;242;241;240;, - 4;247;246;245;244;, - 4;251;250;249;248;, - 4;255;254;253;252;, - 4;259;258;257;256;, - 4;263;262;261;260;, - 4;267;266;265;264;, - 4;271;270;269;268;, - 4;275;274;273;272;, - 4;279;278;277;276;, - 4;283;282;281;280;, - 4;287;286;285;284;, - 4;291;290;289;288;, - 4;295;294;293;292;, - 4;299;298;297;296;, - 4;303;302;301;300;, - 4;307;306;305;304;, - 4;311;310;309;308;, - 4;315;314;313;312;, - 4;319;318;317;316;, - 4;323;322;321;320;, - 4;327;326;325;324;, - 4;331;330;329;328;, - 4;335;334;333;332;, - 4;339;338;337;336;, - 4;343;342;341;340;, - 4;347;346;345;344;, - 4;351;350;349;348;, - 4;355;354;353;352;, - 4;359;358;357;356;, - 4;363;362;361;360;, - 4;367;366;365;364;, - 4;371;370;369;368;, - 4;375;374;373;372;, - 4;379;378;377;376;, - 4;383;382;381;380;; - MeshNormals { // Cube normals - 70; - 0.000000;-1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000;-0.000000;-1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000;-0.000000;-1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000;-1.000000;, - -1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 1.000000;-0.000000;, - -0.000000;-1.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000;-0.000000; 0.000000;, - 0.000000;-0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 1.000000;-0.000000;, - 1.000000; 0.000000;-0.000000;, - 0.000000;-1.000000; 0.000000;, - -0.000000; 0.000000;-1.000000;, - -0.000000; 0.000000; 1.000000;; - 70; - 30;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;, - 30;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;, - 4;2;2;2;2;, - 4;3;3;3;3;, - 4;4;4;4;4;, - 4;5;5;5;5;, - 4;6;6;6;6;, - 4;7;7;7;7;, - 4;8;8;8;8;, - 4;9;9;9;9;, - 4;10;10;10;10;, - 4;11;11;11;11;, - 4;12;12;12;12;, - 4;13;13;13;13;, - 4;14;14;14;14;, - 4;15;15;15;15;, - 4;16;16;16;16;, - 4;17;17;17;17;, - 4;18;18;18;18;, - 4;19;19;19;19;, - 4;20;20;20;20;, - 4;21;21;21;21;, - 4;22;22;22;22;, - 4;23;23;23;23;, - 4;24;24;24;24;, - 4;25;25;25;25;, - 4;26;26;26;26;, - 4;27;27;27;27;, - 4;28;28;28;28;, - 4;29;29;29;29;, - 4;30;30;30;30;, - 4;31;31;31;31;, - 30;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;32;, - 30;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;33;, - 4;34;34;34;34;, - 4;35;35;35;35;, - 4;36;36;36;36;, - 4;37;37;37;37;, - 4;38;38;38;38;, - 4;39;39;39;39;, - 4;40;40;40;40;, - 4;41;41;41;41;, - 4;42;42;42;42;, - 4;43;43;43;43;, - 4;44;44;44;44;, - 4;45;45;45;45;, - 4;46;46;46;46;, - 4;47;47;47;47;, - 4;48;48;48;48;, - 4;49;49;49;49;, - 4;50;50;50;50;, - 4;51;51;51;51;, - 4;52;52;52;52;, - 4;53;53;53;53;, - 4;54;54;54;54;, - 4;55;55;55;55;, - 4;56;56;56;56;, - 4;57;57;57;57;, - 4;58;58;58;58;, - 4;59;59;59;59;, - 4;60;60;60;60;, - 4;61;61;61;61;, - 4;62;62;62;62;, - 4;63;63;63;63;, - 4;64;64;64;64;, - 4;65;65;65;65;, - 4;66;66;66;66;, - 4;67;67;67;67;, - 4;68;68;68;68;, - 4;69;69;69;69;; - } // End of Cube normals - MeshTextureCoords { // Cube UV coordinates - 384; - 0.500018; 0.718750;, - 0.468768; 0.718750;, - 0.468768; 0.781250;, - 0.406268; 0.781250;, - 0.406268; 0.812500;, - 0.375018; 0.812500;, - 0.375018; 0.843750;, - 0.343768; 0.843750;, - 0.343768; 0.875000;, - 0.250018; 0.875000;, - 0.250018; 0.906250;, - 0.187518; 0.906250;, - 0.187518; 0.937500;, - 0.156268; 0.937500;, - 0.156268; 0.968750;, - 0.062518; 0.968750;, - 0.063583; 0.905511;, - 0.093768; 0.906250;, - 0.093768; 0.687500;, - 0.125018; 0.687500;, - 0.125018; 0.625000;, - 0.156268; 0.625000;, - 0.158954; 0.593750;, - 0.218768; 0.593750;, - 0.218768; 0.562500;, - 0.250018; 0.562500;, - 0.250018; 0.531250;, - 0.281268; 0.531250;, - 0.281268; 0.500000;, - 0.500018; 0.500000;, - 0.500018; 0.718750;, - 0.500018; 0.500000;, - 0.281268; 0.500000;, - 0.281268; 0.531250;, - 0.250018; 0.531250;, - 0.250018; 0.562500;, - 0.218768; 0.562500;, - 0.218768; 0.593750;, - 0.158954; 0.593750;, - 0.156268; 0.625000;, - 0.125018; 0.625000;, - 0.125018; 0.687500;, - 0.093768; 0.687500;, - 0.093768; 0.906250;, - 0.063583; 0.905511;, - 0.062518; 0.968750;, - 0.156268; 0.968750;, - 0.156268; 0.937500;, - 0.187518; 0.937500;, - 0.187518; 0.906250;, - 0.250018; 0.906250;, - 0.250018; 0.875000;, - 0.343768; 0.875000;, - 0.343768; 0.843750;, - 0.375018; 0.843750;, - 0.375018; 0.812500;, - 0.406268; 0.812500;, - 0.406268; 0.781250;, - 0.468768; 0.781250;, - 0.468768; 0.718750;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.500018; 0.718750;, - 0.468768; 0.718750;, - 0.468768; 0.781250;, - 0.406268; 0.781250;, - 0.406268; 0.812500;, - 0.375018; 0.812500;, - 0.375018; 0.843750;, - 0.343768; 0.843750;, - 0.343768; 0.875000;, - 0.250018; 0.875000;, - 0.250018; 0.906250;, - 0.187518; 0.906250;, - 0.187518; 0.937500;, - 0.156268; 0.937500;, - 0.156268; 0.968750;, - 0.062518; 0.968750;, - 0.063583; 0.905511;, - 0.093768; 0.906250;, - 0.093768; 0.687500;, - 0.125018; 0.687500;, - 0.125018; 0.625000;, - 0.156268; 0.625000;, - 0.158954; 0.593750;, - 0.218768; 0.593750;, - 0.218768; 0.562500;, - 0.250018; 0.562500;, - 0.250018; 0.531250;, - 0.281268; 0.531250;, - 0.281268; 0.500000;, - 0.500018; 0.500000;, - 0.500018; 0.718750;, - 0.500018; 0.500000;, - 0.281268; 0.500000;, - 0.281268; 0.531250;, - 0.250018; 0.531250;, - 0.250018; 0.562500;, - 0.218768; 0.562500;, - 0.218768; 0.593750;, - 0.158954; 0.593750;, - 0.156268; 0.625000;, - 0.125018; 0.625000;, - 0.125018; 0.687500;, - 0.093768; 0.687500;, - 0.093768; 0.906250;, - 0.063583; 0.905511;, - 0.062518; 0.968750;, - 0.156268; 0.968750;, - 0.156268; 0.937500;, - 0.187518; 0.937500;, - 0.187518; 0.906250;, - 0.250018; 0.906250;, - 0.250018; 0.875000;, - 0.343768; 0.875000;, - 0.343768; 0.843750;, - 0.375018; 0.843750;, - 0.375018; 0.812500;, - 0.406268; 0.812500;, - 0.406268; 0.781250;, - 0.468768; 0.781250;, - 0.468768; 0.718750;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.015643; 0.750000;, - 0.499982; 0.000000;, - 0.000053; 0.000000;, - 0.000053; 0.499929;, - 0.499982; 0.499929;, - 0.499982; 0.000000;, - 0.000053; 0.000000;, - 0.000053; 0.499929;, - 0.499982; 0.499929;, - 0.499982; 0.000000;, - 0.000053; 0.000000;, - 0.000053; 0.499929;, - 0.499982; 0.499929;, - 0.999982; 0.000000;, - 0.500053; 0.000000;, - 0.500053; 0.499929;, - 0.999982; 0.499929;, - 0.000053; 0.000000;, - 0.000053; 0.499929;, - 0.499982; 0.499929;, - 0.499982; 0.000000;, - 0.499982; 0.499929;, - 0.499982; 0.000000;, - 0.000053; 0.000000;, - 0.000053; 0.499929;; - } // End of Cube UV coordinates - MeshMaterialList { // Cube material list - 1; - 70; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0;; - Material Material { - 0.640000; 0.640000; 0.640000; 1.000000;; - 96.078431; - 0.500000; 0.500000; 0.500000;; - 0.000000; 0.000000; 0.000000;; - } - } // End of Cube material list - XSkinMeshHeader { - 1; - 3; - 3; - } - SkinWeights { - "Armature_head"; - 24; - 360, - 361, - 362, - 363, - 364, - 365, - 366, - 367, - 368, - 369, - 370, - 371, - 372, - 373, - 374, - 375, - 376, - 377, - 378, - 379, - 380, - 381, - 382, - 383; - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000; - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000,-1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 1.000000;; - } // End of Armature_head skin weights - SkinWeights { - "Armature_wing_2"; - 180; - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 187, - 188, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 235, - 236, - 237, - 238, - 239, - 240, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250, - 251, - 252, - 253, - 254, - 255, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263, - 264, - 265, - 266, - 267, - 268, - 269, - 270, - 271, - 272, - 273, - 274, - 275, - 276, - 277, - 278, - 279, - 280, - 281, - 282, - 283, - 284, - 285, - 286, - 287, - 288, - 289, - 290, - 291, - 292, - 293, - 294, - 295, - 296, - 297, - 298, - 299, - 300, - 301, - 302, - 303, - 304, - 305, - 306, - 307, - 308, - 309, - 310, - 311, - 312, - 313, - 314, - 315, - 316, - 317, - 318, - 319, - 320, - 321, - 322, - 323, - 324, - 325, - 326, - 327, - 328, - 329, - 330, - 331, - 332, - 333, - 334, - 335, - 336, - 337, - 338, - 339, - 340, - 341, - 342, - 343, - 344, - 345, - 346, - 347, - 348, - 349, - 350, - 351, - 352, - 353, - 354, - 355, - 356, - 357, - 358, - 359; - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000; - 0.421701,-0.880471, 0.216654, 0.000000, - -0.456980, 0.000000, 0.889477, 0.000000, - -0.783159,-0.474100,-0.402357, 0.000000, - 0.911175,-0.584159, 0.468127, 1.000000;; - } // End of Armature_wing_2 skin weights - SkinWeights { - "Armature_wing_1"; - 180; - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 177, - 178, - 179; - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000, - 1.000000; - 0.346593, 0.880471,-0.323487, 0.000000, - 0.682319, 0.000000, 0.731055, 0.000000, - 0.643673,-0.474100,-0.600762, 0.000000, - -0.748888,-0.584159, 0.698963, 1.000000;; - } // End of Armature_wing_1 skin weights - } // End of Cube mesh - } // End of Cube - } // End of Armature -} // End of Root -AnimationSet Global { - Animation { - {Armature} - AnimationKey { // Rotation - 0; - 66; - 0;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 1;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 2;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 3;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 4;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 5;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 6;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 7;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 8;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 9;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 10;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 11;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 12;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 13;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 14;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 15;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 16;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 17;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 18;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 19;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 20;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 21;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 22;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 23;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 24;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 25;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 26;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 27;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 28;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 29;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 30;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 31;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 32;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 33;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 34;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 35;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 36;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 37;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 38;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 39;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 40;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 41;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 42;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 43;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 44;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 45;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 46;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 47;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 48;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 49;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 50;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 51;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 52;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 53;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 54;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 55;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 56;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 57;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 58;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 59;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 60;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 61;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 62;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 63;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 64;4;-0.000000, 0.000000,-0.000000,-1.000000;;, - 65;4;-0.000000, 0.000000,-0.000000,-1.000000;;; - } - AnimationKey { // Scale - 1; - 66; - 0;3; 5.000000, 5.000000, 5.000000;;, - 1;3; 5.000000, 5.000000, 5.000000;;, - 2;3; 5.000000, 5.000000, 5.000000;;, - 3;3; 5.000000, 5.000000, 5.000000;;, - 4;3; 5.000000, 5.000000, 5.000000;;, - 5;3; 5.000000, 5.000000, 5.000000;;, - 6;3; 5.000000, 5.000000, 5.000000;;, - 7;3; 5.000000, 5.000000, 5.000000;;, - 8;3; 5.000000, 5.000000, 5.000000;;, - 9;3; 5.000000, 5.000000, 5.000000;;, - 10;3; 5.000000, 5.000000, 5.000000;;, - 11;3; 5.000000, 5.000000, 5.000000;;, - 12;3; 5.000000, 5.000000, 5.000000;;, - 13;3; 5.000000, 5.000000, 5.000000;;, - 14;3; 5.000000, 5.000000, 5.000000;;, - 15;3; 5.000000, 5.000000, 5.000000;;, - 16;3; 5.000000, 5.000000, 5.000000;;, - 17;3; 5.000000, 5.000000, 5.000000;;, - 18;3; 5.000000, 5.000000, 5.000000;;, - 19;3; 5.000000, 5.000000, 5.000000;;, - 20;3; 5.000000, 5.000000, 5.000000;;, - 21;3; 5.000000, 5.000000, 5.000000;;, - 22;3; 5.000000, 5.000000, 5.000000;;, - 23;3; 5.000000, 5.000000, 5.000000;;, - 24;3; 5.000000, 5.000000, 5.000000;;, - 25;3; 5.000000, 5.000000, 5.000000;;, - 26;3; 5.000000, 5.000000, 5.000000;;, - 27;3; 5.000000, 5.000000, 5.000000;;, - 28;3; 5.000000, 5.000000, 5.000000;;, - 29;3; 5.000000, 5.000000, 5.000000;;, - 30;3; 5.000000, 5.000000, 5.000000;;, - 31;3; 5.000000, 5.000000, 5.000000;;, - 32;3; 5.000000, 5.000000, 5.000000;;, - 33;3; 5.000000, 5.000000, 5.000000;;, - 34;3; 5.000000, 5.000000, 5.000000;;, - 35;3; 5.000000, 5.000000, 5.000000;;, - 36;3; 5.000000, 5.000000, 5.000000;;, - 37;3; 5.000000, 5.000000, 5.000000;;, - 38;3; 5.000000, 5.000000, 5.000000;;, - 39;3; 5.000000, 5.000000, 5.000000;;, - 40;3; 5.000000, 5.000000, 5.000000;;, - 41;3; 5.000000, 5.000000, 5.000000;;, - 42;3; 5.000000, 5.000000, 5.000000;;, - 43;3; 5.000000, 5.000000, 5.000000;;, - 44;3; 5.000000, 5.000000, 5.000000;;, - 45;3; 5.000000, 5.000000, 5.000000;;, - 46;3; 5.000000, 5.000000, 5.000000;;, - 47;3; 5.000000, 5.000000, 5.000000;;, - 48;3; 5.000000, 5.000000, 5.000000;;, - 49;3; 5.000000, 5.000000, 5.000000;;, - 50;3; 5.000000, 5.000000, 5.000000;;, - 51;3; 5.000000, 5.000000, 5.000000;;, - 52;3; 5.000000, 5.000000, 5.000000;;, - 53;3; 5.000000, 5.000000, 5.000000;;, - 54;3; 5.000000, 5.000000, 5.000000;;, - 55;3; 5.000000, 5.000000, 5.000000;;, - 56;3; 5.000000, 5.000000, 5.000000;;, - 57;3; 5.000000, 5.000000, 5.000000;;, - 58;3; 5.000000, 5.000000, 5.000000;;, - 59;3; 5.000000, 5.000000, 5.000000;;, - 60;3; 5.000000, 5.000000, 5.000000;;, - 61;3; 5.000000, 5.000000, 5.000000;;, - 62;3; 5.000000, 5.000000, 5.000000;;, - 63;3; 5.000000, 5.000000, 5.000000;;, - 64;3; 5.000000, 5.000000, 5.000000;;, - 65;3; 5.000000, 5.000000, 5.000000;;; - } - AnimationKey { // Position - 2; - 66; - 0;3; 0.000000, 0.000000, 0.000000;;, - 1;3; 0.000000, 0.000000, 0.000000;;, - 2;3; 0.000000, 0.000000, 0.000000;;, - 3;3; 0.000000, 0.000000, 0.000000;;, - 4;3; 0.000000, 0.000000, 0.000000;;, - 5;3; 0.000000, 0.000000, 0.000000;;, - 6;3; 0.000000, 0.000000, 0.000000;;, - 7;3; 0.000000, 0.000000, 0.000000;;, - 8;3; 0.000000, 0.000000, 0.000000;;, - 9;3; 0.000000, 0.000000, 0.000000;;, - 10;3; 0.000000, 0.000000, 0.000000;;, - 11;3; 0.000000, 0.000000, 0.000000;;, - 12;3; 0.000000, 0.000000, 0.000000;;, - 13;3; 0.000000, 0.000000, 0.000000;;, - 14;3; 0.000000, 0.000000, 0.000000;;, - 15;3; 0.000000, 0.000000, 0.000000;;, - 16;3; 0.000000, 0.000000, 0.000000;;, - 17;3; 0.000000, 0.000000, 0.000000;;, - 18;3; 0.000000, 0.000000, 0.000000;;, - 19;3; 0.000000, 0.000000, 0.000000;;, - 20;3; 0.000000, 0.000000, 0.000000;;, - 21;3; 0.000000, 0.000000, 0.000000;;, - 22;3; 0.000000, 0.000000, 0.000000;;, - 23;3; 0.000000, 0.000000, 0.000000;;, - 24;3; 0.000000, 0.000000, 0.000000;;, - 25;3; 0.000000, 0.000000, 0.000000;;, - 26;3; 0.000000, 0.000000, 0.000000;;, - 27;3; 0.000000, 0.000000, 0.000000;;, - 28;3; 0.000000, 0.000000, 0.000000;;, - 29;3; 0.000000, 0.000000, 0.000000;;, - 30;3; 0.000000, 0.000000, 0.000000;;, - 31;3; 0.000000, 0.000000, 0.000000;;, - 32;3; 0.000000, 0.000000, 0.000000;;, - 33;3; 0.000000, 0.000000, 0.000000;;, - 34;3; 0.000000, 0.000000, 0.000000;;, - 35;3; 0.000000, 0.000000, 0.000000;;, - 36;3; 0.000000, 0.000000, 0.000000;;, - 37;3; 0.000000, 0.000000, 0.000000;;, - 38;3; 0.000000, 0.000000, 0.000000;;, - 39;3; 0.000000, 0.000000, 0.000000;;, - 40;3; 0.000000, 0.000000, 0.000000;;, - 41;3; 0.000000, 0.000000, 0.000000;;, - 42;3; 0.000000, 0.000000, 0.000000;;, - 43;3; 0.000000, 0.000000, 0.000000;;, - 44;3; 0.000000, 0.000000, 0.000000;;, - 45;3; 0.000000, 0.000000, 0.000000;;, - 46;3; 0.000000, 0.000000, 0.000000;;, - 47;3; 0.000000, 0.000000, 0.000000;;, - 48;3; 0.000000, 0.000000, 0.000000;;, - 49;3; 0.000000, 0.000000, 0.000000;;, - 50;3; 0.000000, 0.000000, 0.000000;;, - 51;3; 0.000000, 0.000000, 0.000000;;, - 52;3; 0.000000, 0.000000, 0.000000;;, - 53;3; 0.000000, 0.000000, 0.000000;;, - 54;3; 0.000000, 0.000000, 0.000000;;, - 55;3; 0.000000, 0.000000, 0.000000;;, - 56;3; 0.000000, 0.000000, 0.000000;;, - 57;3; 0.000000, 0.000000, 0.000000;;, - 58;3; 0.000000, 0.000000, 0.000000;;, - 59;3; 0.000000, 0.000000, 0.000000;;, - 60;3; 0.000000, 0.000000, 0.000000;;, - 61;3; 0.000000, 0.000000, 0.000000;;, - 62;3; 0.000000, 0.000000, 0.000000;;, - 63;3; 0.000000, 0.000000, 0.000000;;, - 64;3; 0.000000, 0.000000, 0.000000;;, - 65;3; 0.000000, 0.000000, 0.000000;;; - } - } - Animation { - {Armature_head} - AnimationKey { // Rotation - 0; - 66; - 0;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 1;4;-0.704100, 0.710062, 0.000000,-0.000000;;, - 2;4;-0.697665, 0.716385, 0.000000,-0.000000;;, - 3;4;-0.694658, 0.719340, 0.000000,-0.000000;;, - 4;4;-0.695674, 0.718354, 0.000000,-0.000000;;, - 5;4;-0.698775, 0.715331, 0.000000,-0.000000;;, - 6;4;-0.703071, 0.711112, 0.000000,-0.000000;;, - 7;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 8;4;-0.711933, 0.702229,-0.000000, 0.000000;;, - 9;4;-0.717265, 0.696785,-0.000000, 0.000000;;, - 10;4;-0.719340, 0.694658,-0.000000, 0.000000;;, - 11;4;-0.719197, 0.694831,-0.000000, 0.000000;;, - 12;4;-0.717853, 0.696253,-0.000000, 0.000000;;, - 13;4;-0.713883, 0.700301,-0.000000, 0.000000;;, - 14;4;-0.707107, 0.707107, 0.000000, 0.000000;;, - 15;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 16;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 17;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 18;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 19;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 20;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 21;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 22;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 23;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 24;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 25;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 26;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 27;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 28;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 29;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 30;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 31;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 32;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 33;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 34;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 35;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 36;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 37;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 38;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 39;4;-0.642788, 0.766045, 0.000000,-0.000000;;, - 40;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 41;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 42;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 43;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 44;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 45;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 46;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 47;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 48;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 49;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 50;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 51;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 52;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 53;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 54;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 55;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 56;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 57;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 58;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 59;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 60;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 61;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 62;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 63;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 64;4;-0.461749, 0.887011, 0.000000,-0.000000;;, - 65;4;-0.461749, 0.887011, 0.000000,-0.000000;;; - } - AnimationKey { // Scale - 1; - 66; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;, - 31;3; 1.000000, 1.000000, 1.000000;;, - 32;3; 1.000000, 1.000000, 1.000000;;, - 33;3; 1.000000, 1.000000, 1.000000;;, - 34;3; 1.000000, 1.000000, 1.000000;;, - 35;3; 1.000000, 1.000000, 1.000000;;, - 36;3; 1.000000, 1.000000, 1.000000;;, - 37;3; 1.000000, 1.000000, 1.000000;;, - 38;3; 1.000000, 1.000000, 1.000000;;, - 39;3; 1.000000, 1.000000, 1.000000;;, - 40;3; 1.000000, 1.000000, 1.000000;;, - 41;3; 1.000000, 1.000000, 1.000000;;, - 42;3; 1.000000, 1.000000, 1.000000;;, - 43;3; 1.000000, 1.000000, 1.000000;;, - 44;3; 1.000000, 1.000000, 1.000000;;, - 45;3; 1.000000, 1.000000, 1.000000;;, - 46;3; 1.000000, 1.000000, 1.000000;;, - 47;3; 1.000000, 1.000000, 1.000000;;, - 48;3; 1.000000, 1.000000, 1.000000;;, - 49;3; 1.000000, 1.000000, 1.000000;;, - 50;3; 1.000000, 1.000000, 1.000000;;, - 51;3; 1.000000, 1.000000, 1.000000;;, - 52;3; 1.000000, 1.000000, 1.000000;;, - 53;3; 1.000000, 1.000000, 1.000000;;, - 54;3; 1.000000, 1.000000, 1.000000;;, - 55;3; 1.000000, 1.000000, 1.000000;;, - 56;3; 1.000000, 1.000000, 1.000000;;, - 57;3; 1.000000, 1.000000, 1.000000;;, - 58;3; 1.000000, 1.000000, 1.000000;;, - 59;3; 1.000000, 1.000000, 1.000000;;, - 60;3; 1.000000, 1.000000, 1.000000;;, - 61;3; 1.000000, 1.000000, 1.000000;;, - 62;3; 1.000000, 1.000000, 1.000000;;, - 63;3; 1.000000, 1.000000, 1.000000;;, - 64;3; 1.000000, 1.000000, 1.000000;;, - 65;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 66; - 0;3; 0.000000, 0.000000,-1.000000;;, - 1;3; 0.000000, 0.000000,-1.000000;;, - 2;3; 0.000000, 0.000000,-1.000000;;, - 3;3; 0.000000, 0.000000,-1.000000;;, - 4;3; 0.000000, 0.000000,-1.000000;;, - 5;3; 0.000000, 0.000000,-1.000000;;, - 6;3; 0.000000, 0.000000,-1.000000;;, - 7;3; 0.000000, 0.000000,-1.000000;;, - 8;3; 0.000000, 0.000000,-1.000000;;, - 9;3; 0.000000, 0.000000,-1.000000;;, - 10;3; 0.000000, 0.000000,-1.000000;;, - 11;3; 0.000000, 0.000000,-1.000000;;, - 12;3; 0.000000, 0.000000,-1.000000;;, - 13;3; 0.000000, 0.000000,-1.000000;;, - 14;3; 0.000000, 0.000000,-1.000000;;, - 15;3; 0.000000, 0.000000,-1.000000;;, - 16;3; 0.000000, 0.000000,-1.000000;;, - 17;3; 0.000000, 0.000000,-1.000000;;, - 18;3; 0.000000, 0.000000,-1.000000;;, - 19;3; 0.000000, 0.000000,-1.000000;;, - 20;3; 0.000000, 0.000000,-1.000000;;, - 21;3; 0.000000, 0.000000,-1.000000;;, - 22;3; 0.000000, 0.000000,-1.000000;;, - 23;3; 0.000000, 0.000000,-1.000000;;, - 24;3; 0.000000, 0.000000,-1.000000;;, - 25;3; 0.000000, 0.000000,-1.000000;;, - 26;3; 0.000000, 0.000000,-1.000000;;, - 27;3; 0.000000, 0.000000,-1.000000;;, - 28;3; 0.000000, 0.000000,-1.000000;;, - 29;3; 0.000000, 0.000000,-1.000000;;, - 30;3; 0.000000, 0.000000,-1.000000;;, - 31;3; 0.000000, 0.000000,-1.000000;;, - 32;3; 0.000000, 0.000000,-1.000000;;, - 33;3; 0.000000, 0.000000,-1.000000;;, - 34;3; 0.000000, 0.000000,-1.000000;;, - 35;3; 0.000000, 0.000000,-1.000000;;, - 36;3; 0.000000, 0.000000,-1.000000;;, - 37;3; 0.000000, 0.000000,-1.000000;;, - 38;3; 0.000000, 0.000000,-1.000000;;, - 39;3; 0.000000, 0.000000,-1.000000;;, - 40;3; 0.000000, 0.000000,-1.000000;;, - 41;3; 0.000000, 0.000000,-1.000000;;, - 42;3; 0.000000, 0.000000,-1.000000;;, - 43;3; 0.000000, 0.000000,-1.000000;;, - 44;3; 0.000000, 0.000000,-1.000000;;, - 45;3; 0.000000, 0.000000,-1.000000;;, - 46;3; 0.000000, 0.000000,-1.000000;;, - 47;3; 0.000000, 0.000000,-1.000000;;, - 48;3; 0.000000, 0.000000,-1.000000;;, - 49;3; 0.000000, 0.000000,-1.000000;;, - 50;3; 0.000000, 0.000000,-1.000000;;, - 51;3; 0.000000, 0.000000,-1.000000;;, - 52;3; 0.000000, 0.000000,-1.000000;;, - 53;3; 0.000000, 0.000000,-1.000000;;, - 54;3; 0.000000, 0.000000,-1.000000;;, - 55;3; 0.000000, 0.000000,-1.000000;;, - 56;3; 0.000000, 0.000000,-1.000000;;, - 57;3; 0.000000, 0.000000,-1.000000;;, - 58;3; 0.000000, 0.000000,-1.000000;;, - 59;3; 0.000000, 0.000000,-1.000000;;, - 60;3; 0.000000, 0.000000,-1.000000;;, - 61;3; 0.000000, 0.000000,-1.000000;;, - 62;3; 0.000000, 0.000000,-1.000000;;, - 63;3; 0.000000, 0.000000,-1.000000;;, - 64;3; 0.000000, 0.000000,-1.000000;;, - 65;3; 0.000000, 0.000000,-1.000000;;; - } - } - Animation { - {Armature_wing_1} - AnimationKey { // Rotation - 0; - 66; - 0;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 1;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 2;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 3;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 4;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 5;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 6;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 7;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 8;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 9;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 10;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 11;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 12;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 13;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 14;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 15;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 16;4; 0.204581, 0.794330, 0.568519,-0.057054;;, - 17;4; 0.212346, 0.791426, 0.568486,-0.051278;;, - 18;4; 0.225151, 0.786639, 0.568431,-0.041755;;, - 19;4; 0.242433, 0.780177, 0.568358,-0.028902;;, - 20;4; 0.263128, 0.772439, 0.568269,-0.013512;;, - 21;4; 0.285683, 0.764005, 0.568173, 0.003261;;, - 22;4; 0.308237, 0.755571, 0.568077, 0.020034;;, - 23;4; 0.328931, 0.747833, 0.567989, 0.035424;;, - 24;4; 0.346212, 0.741371, 0.567915, 0.048275;;, - 25;4; 0.359016, 0.736583, 0.567860, 0.057796;;, - 26;4; 0.366780, 0.733680, 0.567827, 0.063571;;, - 27;4; 0.369353, 0.732718, 0.567816, 0.065483;;, - 28;4; 0.367798, 0.733399, 0.567888, 0.064304;;, - 29;4; 0.362979, 0.735489, 0.568097, 0.060650;;, - 30;4; 0.354745, 0.739016, 0.568425, 0.054419;;, - 31;4; 0.343125, 0.743915, 0.568837, 0.045645;;, - 32;4; 0.328408, 0.750004, 0.569283, 0.034559;;, - 33;4; 0.311174, 0.756969, 0.569697, 0.021618;;, - 34;4; 0.292257, 0.764399, 0.570011, 0.007464;;, - 35;4; 0.272609, 0.771849, 0.570162,-0.007173;;, - 36;4; 0.253137, 0.778915, 0.570104,-0.021602;;, - 37;4; 0.234575, 0.785292, 0.569815,-0.035271;;, - 38;4; 0.217433, 0.790783, 0.569287,-0.047798;;, - 39;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 40;4; 0.185603, 0.799386, 0.567266,-0.070677;;, - 41;4; 0.165937, 0.803530, 0.565251,-0.084532;;, - 42;4; 0.144707, 0.807433, 0.562704,-0.099350;;, - 43;4; 0.124755, 0.810722, 0.560061,-0.113186;;, - 44;4; 0.109085, 0.813092, 0.557846,-0.124000;;, - 45;4; 0.099546, 0.814441, 0.556437,-0.130562;;, - 46;4; 0.096474, 0.814856, 0.555970,-0.132670;;, - 47;4; 0.105855, 0.813117, 0.557086,-0.126119;;, - 48;4; 0.132278, 0.808218, 0.560231,-0.107666;;, - 49;4; 0.166204, 0.801929, 0.564269,-0.083972;;, - 50;4; 0.192627, 0.797031, 0.567414,-0.065518;;, - 51;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 52;4; 0.193983, 0.796420, 0.567340,-0.064485;;, - 53;4; 0.170239, 0.799758, 0.563819,-0.080812;;, - 54;4; 0.134064, 0.804843, 0.558453,-0.105687;;, - 55;4; 0.093032, 0.810612, 0.552368,-0.133902;;, - 56;4; 0.056856, 0.815697, 0.547003,-0.158777;;, - 57;4; 0.033113, 0.819035, 0.543481,-0.175103;;, - 58;4; 0.025087, 0.820163, 0.542291,-0.180622;;, - 59;4; 0.036015, 0.818626, 0.543912,-0.173108;;, - 60;4; 0.067818, 0.814153, 0.548628,-0.151242;;, - 61;4; 0.113537, 0.807723, 0.555407,-0.119809;;, - 62;4; 0.159262, 0.801295, 0.562189,-0.088368;;, - 63;4; 0.191075, 0.796827, 0.566908,-0.066488;;, - 64;4; 0.202008, 0.795292, 0.568530,-0.058967;;, - 65;4; 0.202008, 0.795292, 0.568530,-0.058967;;; - } - AnimationKey { // Scale - 1; - 66; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;, - 31;3; 1.000000, 1.000000, 1.000000;;, - 32;3; 1.000000, 1.000000, 1.000000;;, - 33;3; 1.000000, 1.000000, 1.000000;;, - 34;3; 1.000000, 1.000000, 1.000000;;, - 35;3; 1.000000, 1.000000, 1.000000;;, - 36;3; 1.000000, 1.000000, 1.000000;;, - 37;3; 1.000000, 1.000000, 1.000000;;, - 38;3; 1.000000, 1.000000, 1.000000;;, - 39;3; 1.000000, 1.000000, 1.000000;;, - 40;3; 1.000000, 1.000000, 1.000000;;, - 41;3; 1.000000, 1.000000, 1.000000;;, - 42;3; 1.000000, 1.000000, 1.000000;;, - 43;3; 1.000000, 1.000000, 1.000000;;, - 44;3; 1.000000, 1.000000, 1.000000;;, - 45;3; 1.000000, 1.000000, 1.000000;;, - 46;3; 1.000000, 1.000000, 1.000000;;, - 47;3; 1.000000, 1.000000, 1.000000;;, - 48;3; 1.000000, 1.000000, 1.000000;;, - 49;3; 1.000000, 1.000000, 1.000000;;, - 50;3; 1.000000, 1.000000, 1.000000;;, - 51;3; 1.000000, 1.000000, 1.000000;;, - 52;3; 1.000000, 1.000000, 1.000000;;, - 53;3; 1.000000, 1.000000, 1.000000;;, - 54;3; 1.000000, 1.000000, 1.000000;;, - 55;3; 1.000000, 1.000000, 1.000000;;, - 56;3; 1.000000, 1.000000, 1.000000;;, - 57;3; 1.000000, 1.000000, 1.000000;;, - 58;3; 1.000000, 1.000000, 1.000000;;, - 59;3; 1.000000, 1.000000, 1.000000;;, - 60;3; 1.000000, 1.000000, 1.000000;;, - 61;3; 1.000000, 1.000000, 1.000000;;, - 62;3; 1.000000, 1.000000, 1.000000;;, - 63;3; 1.000000, 1.000000, 1.000000;;, - 64;3; 1.000000, 1.000000, 1.000000;;, - 65;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 66; - 0;3; 1.000000, 1.625000,-0.000000;;, - 1;3; 1.000000, 1.625000,-0.000000;;, - 2;3; 1.000000, 1.625000,-0.000000;;, - 3;3; 1.000000, 1.625000,-0.000000;;, - 4;3; 1.000000, 1.625000,-0.000000;;, - 5;3; 1.000000, 1.625000,-0.000000;;, - 6;3; 1.000000, 1.625000,-0.000000;;, - 7;3; 1.000000, 1.625000,-0.000000;;, - 8;3; 1.000000, 1.625000,-0.000000;;, - 9;3; 1.000000, 1.625000,-0.000000;;, - 10;3; 1.000000, 1.625000,-0.000000;;, - 11;3; 1.000000, 1.625000,-0.000000;;, - 12;3; 1.000000, 1.625000,-0.000000;;, - 13;3; 1.000000, 1.625000,-0.000000;;, - 14;3; 1.000000, 1.625000,-0.000000;;, - 15;3; 1.000000, 1.625000,-0.000000;;, - 16;3; 1.000000, 1.625000,-0.000000;;, - 17;3; 1.000000, 1.625000,-0.000000;;, - 18;3; 1.000000, 1.625000,-0.000000;;, - 19;3; 1.000000, 1.625000,-0.000000;;, - 20;3; 1.000000, 1.625000,-0.000000;;, - 21;3; 1.000000, 1.625000, 0.000000;;, - 22;3; 1.000000, 1.625000, 0.000000;;, - 23;3; 1.000000, 1.625000, 0.000000;;, - 24;3; 1.000000, 1.625000, 0.000000;;, - 25;3; 1.000000, 1.625000, 0.000000;;, - 26;3; 1.000000, 1.625000, 0.000000;;, - 27;3; 1.000000, 1.625000, 0.000000;;, - 28;3; 1.000000, 1.625000, 0.000000;;, - 29;3; 1.000000, 1.625000, 0.000000;;, - 30;3; 1.000000, 1.625000, 0.000000;;, - 31;3; 1.000000, 1.625000, 0.000000;;, - 32;3; 1.000000, 1.625000, 0.000000;;, - 33;3; 1.000000, 1.625000, 0.000000;;, - 34;3; 1.000000, 1.625000,-0.000000;;, - 35;3; 1.000000, 1.625000,-0.000000;;, - 36;3; 1.000000, 1.625000,-0.000000;;, - 37;3; 1.000000, 1.625000,-0.000000;;, - 38;3; 1.000000, 1.625000,-0.000000;;, - 39;3; 1.000000, 1.625000,-0.000000;;, - 40;3; 1.000000, 1.625000, 0.000000;;, - 41;3; 1.000000, 1.625000, 0.000000;;, - 42;3; 1.000000, 1.625000, 0.000000;;, - 43;3; 1.000000, 1.625000, 0.000000;;, - 44;3; 1.000000, 1.625000, 0.000000;;, - 45;3; 1.000000, 1.625000, 0.000000;;, - 46;3; 1.000000, 1.625000, 0.000000;;, - 47;3; 1.000000, 1.625000, 0.000000;;, - 48;3; 1.000000, 1.625000, 0.000000;;, - 49;3; 1.000000, 1.625000, 0.000000;;, - 50;3; 1.000000, 1.625000, 0.000000;;, - 51;3; 1.000000, 1.625000, 0.000000;;, - 52;3; 1.000000, 1.625000, 0.000000;;, - 53;3; 1.000000, 1.625000, 0.000000;;, - 54;3; 1.000000, 1.625000, 0.000000;;, - 55;3; 1.000000, 1.625000, 0.000000;;, - 56;3; 1.000000, 1.625000, 0.000000;;, - 57;3; 1.000000, 1.625000, 0.000000;;, - 58;3; 1.000000, 1.625000, 0.000000;;, - 59;3; 1.000000, 1.625000, 0.000000;;, - 60;3; 1.000000, 1.625000, 0.000000;;, - 61;3; 1.000000, 1.625000, 0.000000;;, - 62;3; 1.000000, 1.625000, 0.000000;;, - 63;3; 1.000000, 1.625000, 0.000000;;, - 64;3; 1.000000, 1.625000, 0.000000;;, - 65;3; 1.000000, 1.625000, 0.000000;;; - } - } - Animation { - {Armature_wing_2} - AnimationKey { // Rotation - 0; - 66; - 0;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 1;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 2;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 3;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 4;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 5;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 6;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 7;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 8;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 9;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 10;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 11;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 12;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 13;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 14;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 15;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 16;4; 0.280932, 0.794618,-0.534925,-0.052891;;, - 17;4; 0.288619, 0.790947,-0.533823,-0.058212;;, - 18;4; 0.301294, 0.784893,-0.532005,-0.066985;;, - 19;4; 0.318401, 0.776722,-0.529552,-0.078825;;, - 20;4; 0.338886, 0.766938,-0.526614,-0.093003;;, - 21;4; 0.361213, 0.756275,-0.523413,-0.108455;;, - 22;4; 0.383539, 0.745611,-0.520211,-0.123906;;, - 23;4; 0.404024, 0.735827,-0.517273,-0.138083;;, - 24;4; 0.421130, 0.727657,-0.514820,-0.149922;;, - 25;4; 0.433804, 0.721603,-0.513003,-0.158693;;, - 26;4; 0.441490, 0.717932,-0.511901,-0.164013;;, - 27;4; 0.444036, 0.716716,-0.511536,-0.165775;;, - 28;4; 0.442507, 0.717553,-0.511821,-0.164700;;, - 29;4; 0.437762, 0.720127,-0.512692,-0.161369;;, - 30;4; 0.429652, 0.724478,-0.514150,-0.155683;;, - 31;4; 0.418200, 0.730539,-0.516159,-0.147667;;, - 32;4; 0.403684, 0.738096,-0.518627,-0.137526;;, - 33;4; 0.386672, 0.746778,-0.521411,-0.125667;;, - 34;4; 0.367978, 0.756087,-0.524327,-0.112672;;, - 35;4; 0.348538, 0.765481,-0.527183,-0.099201;;, - 36;4; 0.329243, 0.774467,-0.529808,-0.085882;;, - 37;4; 0.310818, 0.782666,-0.532078,-0.073222;;, - 38;4; 0.293767, 0.789830,-0.533916,-0.061570;;, - 39;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 40;4; 0.261962, 0.801502,-0.536298,-0.040094;;, - 41;4; 0.242206, 0.807514,-0.537011,-0.026942;;, - 42;4; 0.220828, 0.813422,-0.537411,-0.012802;;, - 43;4; 0.200701, 0.818585,-0.537542, 0.000449;;, - 44;4; 0.184876, 0.822421,-0.537506, 0.010834;;, - 45;4; 0.175234, 0.824662,-0.537424, 0.017146;;, - 46;4; 0.172126, 0.825362,-0.537384, 0.019178;;, - 47;4; 0.181572, 0.822738,-0.537198, 0.012928;;, - 48;4; 0.208176, 0.815345,-0.536674,-0.004674;;, - 49;4; 0.242336, 0.805852,-0.536001,-0.027276;;, - 50;4; 0.268940, 0.798459,-0.535476,-0.044879;;, - 51;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 52;4; 0.270272, 0.797712,-0.535217,-0.045818;;, - 53;4; 0.246270, 0.803266,-0.534999,-0.030107;;, - 54;4; 0.209700, 0.811729,-0.534667,-0.006169;;, - 55;4; 0.168221, 0.821328,-0.534291, 0.020982;;, - 56;4; 0.131651, 0.829791,-0.533959, 0.044920;;, - 57;4; 0.107649, 0.835346,-0.533742, 0.060631;;, - 58;4; 0.099536, 0.837223,-0.533668, 0.065941;;, - 59;4; 0.110583, 0.834667,-0.533768, 0.058711;;, - 60;4; 0.142733, 0.827225,-0.534059, 0.037670;;, - 61;4; 0.188949, 0.816526,-0.534478, 0.007421;;, - 62;4; 0.235172, 0.805829,-0.534897,-0.022835;;, - 63;4; 0.267333, 0.798390,-0.535190,-0.043891;;, - 64;4; 0.278385, 0.795834,-0.535290,-0.051129;;, - 65;4; 0.278385, 0.795834,-0.535290,-0.051129;;; - } - AnimationKey { // Scale - 1; - 66; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;, - 31;3; 1.000000, 1.000000, 1.000000;;, - 32;3; 1.000000, 1.000000, 1.000000;;, - 33;3; 1.000000, 1.000000, 1.000000;;, - 34;3; 1.000000, 1.000000, 1.000000;;, - 35;3; 1.000000, 1.000000, 1.000000;;, - 36;3; 1.000000, 1.000000, 1.000000;;, - 37;3; 1.000000, 1.000000, 1.000000;;, - 38;3; 1.000000, 1.000000, 1.000000;;, - 39;3; 1.000000, 1.000000, 1.000000;;, - 40;3; 1.000000, 1.000000, 1.000000;;, - 41;3; 1.000000, 1.000000, 1.000000;;, - 42;3; 1.000000, 1.000000, 1.000000;;, - 43;3; 1.000000, 1.000000, 1.000000;;, - 44;3; 1.000000, 1.000000, 1.000000;;, - 45;3; 1.000000, 1.000000, 1.000000;;, - 46;3; 1.000000, 1.000000, 1.000000;;, - 47;3; 1.000000, 1.000000, 1.000000;;, - 48;3; 1.000000, 1.000000, 1.000000;;, - 49;3; 1.000000, 1.000000, 1.000000;;, - 50;3; 1.000000, 1.000000, 1.000000;;, - 51;3; 1.000000, 1.000000, 1.000000;;, - 52;3; 1.000000, 1.000000, 1.000000;;, - 53;3; 1.000000, 1.000000, 1.000000;;, - 54;3; 1.000000, 1.000000, 1.000000;;, - 55;3; 1.000000, 1.000000, 1.000000;;, - 56;3; 1.000000, 1.000000, 1.000000;;, - 57;3; 1.000000, 1.000000, 1.000000;;, - 58;3; 1.000000, 1.000000, 1.000000;;, - 59;3; 1.000000, 1.000000, 1.000000;;, - 60;3; 1.000000, 1.000000, 1.000000;;, - 61;3; 1.000000, 1.000000, 1.000000;;, - 62;3; 1.000000, 1.000000, 1.000000;;, - 63;3; 1.000000, 1.000000, 1.000000;;, - 64;3; 1.000000, 1.000000, 1.000000;;, - 65;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 66; - 0;3;-1.000000, 1.625000, 0.000000;;, - 1;3;-1.000000, 1.625000, 0.000000;;, - 2;3;-1.000000, 1.625000, 0.000000;;, - 3;3;-1.000000, 1.625000, 0.000000;;, - 4;3;-1.000000, 1.625000, 0.000000;;, - 5;3;-1.000000, 1.625000, 0.000000;;, - 6;3;-1.000000, 1.625000, 0.000000;;, - 7;3;-1.000000, 1.625000, 0.000000;;, - 8;3;-1.000000, 1.625000, 0.000000;;, - 9;3;-1.000000, 1.625000, 0.000000;;, - 10;3;-1.000000, 1.625000, 0.000000;;, - 11;3;-1.000000, 1.625000, 0.000000;;, - 12;3;-1.000000, 1.625000, 0.000000;;, - 13;3;-1.000000, 1.625000, 0.000000;;, - 14;3;-1.000000, 1.625000, 0.000000;;, - 15;3;-1.000000, 1.625000, 0.000000;;, - 16;3;-1.000000, 1.625000, 0.000000;;, - 17;3;-1.000000, 1.625000, 0.000000;;, - 18;3;-1.000000, 1.625000, 0.000000;;, - 19;3;-1.000000, 1.625000, 0.000000;;, - 20;3;-1.000000, 1.625000, 0.000000;;, - 21;3;-1.000000, 1.625000, 0.000000;;, - 22;3;-1.000000, 1.625000, 0.000000;;, - 23;3;-1.000000, 1.625000, 0.000000;;, - 24;3;-1.000000, 1.625000, 0.000000;;, - 25;3;-1.000000, 1.625000, 0.000000;;, - 26;3;-1.000000, 1.625000, 0.000000;;, - 27;3;-1.000000, 1.625000, 0.000000;;, - 28;3;-1.000000, 1.625000, 0.000000;;, - 29;3;-1.000000, 1.625000, 0.000000;;, - 30;3;-1.000000, 1.625000, 0.000000;;, - 31;3;-1.000000, 1.625000, 0.000000;;, - 32;3;-1.000000, 1.625000, 0.000000;;, - 33;3;-1.000000, 1.625000, 0.000000;;, - 34;3;-1.000000, 1.625000, 0.000000;;, - 35;3;-1.000000, 1.625000, 0.000000;;, - 36;3;-1.000000, 1.625000, 0.000000;;, - 37;3;-1.000000, 1.625000, 0.000000;;, - 38;3;-1.000000, 1.625000, 0.000000;;, - 39;3;-1.000000, 1.625000, 0.000000;;, - 40;3;-1.000000, 1.625000,-0.000000;;, - 41;3;-1.000000, 1.625000,-0.000000;;, - 42;3;-1.000000, 1.625000,-0.000000;;, - 43;3;-1.000000, 1.625000,-0.000000;;, - 44;3;-1.000000, 1.625000,-0.000000;;, - 45;3;-1.000000, 1.625000,-0.000000;;, - 46;3;-1.000000, 1.625000,-0.000000;;, - 47;3;-1.000000, 1.625000,-0.000000;;, - 48;3;-1.000000, 1.625000,-0.000000;;, - 49;3;-1.000000, 1.625000,-0.000000;;, - 50;3;-1.000000, 1.625000,-0.000000;;, - 51;3;-1.000000, 1.625000,-0.000000;;, - 52;3;-1.000000, 1.625000,-0.000000;;, - 53;3;-1.000000, 1.625000,-0.000000;;, - 54;3;-1.000000, 1.625000,-0.000000;;, - 55;3;-1.000000, 1.625000,-0.000000;;, - 56;3;-1.000000, 1.625000,-0.000000;;, - 57;3;-1.000000, 1.625000,-0.000000;;, - 58;3;-1.000000, 1.625000,-0.000000;;, - 59;3;-1.000000, 1.625000,-0.000000;;, - 60;3;-1.000000, 1.625000,-0.000000;;, - 61;3;-1.000000, 1.625000,-0.000000;;, - 62;3;-1.000000, 1.625000,-0.000000;;, - 63;3;-1.000000, 1.625000,-0.000000;;, - 64;3;-1.000000, 1.625000,-0.000000;;, - 65;3;-1.000000, 1.625000,-0.000000;;; - } - } - Animation { - {Cube} - AnimationKey { // Rotation - 0; - 66; - 0;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 1;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 2;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 3;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 4;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 5;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 6;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 7;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 8;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 9;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 10;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 11;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 12;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 13;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 14;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 15;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 16;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 17;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 18;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 19;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 20;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 21;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 22;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 23;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 24;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 25;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 26;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 27;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 28;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 29;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 30;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 31;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 32;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 33;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 34;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 35;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 36;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 37;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 38;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 39;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 40;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 41;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 42;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 43;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 44;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 45;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 46;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 47;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 48;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 49;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 50;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 51;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 52;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 53;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 54;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 55;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 56;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 57;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 58;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 59;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 60;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 61;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 62;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 63;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 64;4;-1.000000, 0.000000, 0.000000, 0.000000;;, - 65;4;-1.000000, 0.000000, 0.000000, 0.000000;;; - } - AnimationKey { // Scale - 1; - 66; - 0;3; 1.000000, 1.000000, 1.000000;;, - 1;3; 1.000000, 1.000000, 1.000000;;, - 2;3; 1.000000, 1.000000, 1.000000;;, - 3;3; 1.000000, 1.000000, 1.000000;;, - 4;3; 1.000000, 1.000000, 1.000000;;, - 5;3; 1.000000, 1.000000, 1.000000;;, - 6;3; 1.000000, 1.000000, 1.000000;;, - 7;3; 1.000000, 1.000000, 1.000000;;, - 8;3; 1.000000, 1.000000, 1.000000;;, - 9;3; 1.000000, 1.000000, 1.000000;;, - 10;3; 1.000000, 1.000000, 1.000000;;, - 11;3; 1.000000, 1.000000, 1.000000;;, - 12;3; 1.000000, 1.000000, 1.000000;;, - 13;3; 1.000000, 1.000000, 1.000000;;, - 14;3; 1.000000, 1.000000, 1.000000;;, - 15;3; 1.000000, 1.000000, 1.000000;;, - 16;3; 1.000000, 1.000000, 1.000000;;, - 17;3; 1.000000, 1.000000, 1.000000;;, - 18;3; 1.000000, 1.000000, 1.000000;;, - 19;3; 1.000000, 1.000000, 1.000000;;, - 20;3; 1.000000, 1.000000, 1.000000;;, - 21;3; 1.000000, 1.000000, 1.000000;;, - 22;3; 1.000000, 1.000000, 1.000000;;, - 23;3; 1.000000, 1.000000, 1.000000;;, - 24;3; 1.000000, 1.000000, 1.000000;;, - 25;3; 1.000000, 1.000000, 1.000000;;, - 26;3; 1.000000, 1.000000, 1.000000;;, - 27;3; 1.000000, 1.000000, 1.000000;;, - 28;3; 1.000000, 1.000000, 1.000000;;, - 29;3; 1.000000, 1.000000, 1.000000;;, - 30;3; 1.000000, 1.000000, 1.000000;;, - 31;3; 1.000000, 1.000000, 1.000000;;, - 32;3; 1.000000, 1.000000, 1.000000;;, - 33;3; 1.000000, 1.000000, 1.000000;;, - 34;3; 1.000000, 1.000000, 1.000000;;, - 35;3; 1.000000, 1.000000, 1.000000;;, - 36;3; 1.000000, 1.000000, 1.000000;;, - 37;3; 1.000000, 1.000000, 1.000000;;, - 38;3; 1.000000, 1.000000, 1.000000;;, - 39;3; 1.000000, 1.000000, 1.000000;;, - 40;3; 1.000000, 1.000000, 1.000000;;, - 41;3; 1.000000, 1.000000, 1.000000;;, - 42;3; 1.000000, 1.000000, 1.000000;;, - 43;3; 1.000000, 1.000000, 1.000000;;, - 44;3; 1.000000, 1.000000, 1.000000;;, - 45;3; 1.000000, 1.000000, 1.000000;;, - 46;3; 1.000000, 1.000000, 1.000000;;, - 47;3; 1.000000, 1.000000, 1.000000;;, - 48;3; 1.000000, 1.000000, 1.000000;;, - 49;3; 1.000000, 1.000000, 1.000000;;, - 50;3; 1.000000, 1.000000, 1.000000;;, - 51;3; 1.000000, 1.000000, 1.000000;;, - 52;3; 1.000000, 1.000000, 1.000000;;, - 53;3; 1.000000, 1.000000, 1.000000;;, - 54;3; 1.000000, 1.000000, 1.000000;;, - 55;3; 1.000000, 1.000000, 1.000000;;, - 56;3; 1.000000, 1.000000, 1.000000;;, - 57;3; 1.000000, 1.000000, 1.000000;;, - 58;3; 1.000000, 1.000000, 1.000000;;, - 59;3; 1.000000, 1.000000, 1.000000;;, - 60;3; 1.000000, 1.000000, 1.000000;;, - 61;3; 1.000000, 1.000000, 1.000000;;, - 62;3; 1.000000, 1.000000, 1.000000;;, - 63;3; 1.000000, 1.000000, 1.000000;;, - 64;3; 1.000000, 1.000000, 1.000000;;, - 65;3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { // Position - 2; - 66; - 0;3; 0.000000, 0.000000, 0.000000;;, - 1;3; 0.000000, 0.000000, 0.000000;;, - 2;3; 0.000000, 0.000000, 0.000000;;, - 3;3; 0.000000, 0.000000, 0.000000;;, - 4;3; 0.000000, 0.000000, 0.000000;;, - 5;3; 0.000000, 0.000000, 0.000000;;, - 6;3; 0.000000, 0.000000, 0.000000;;, - 7;3; 0.000000, 0.000000, 0.000000;;, - 8;3; 0.000000, 0.000000, 0.000000;;, - 9;3; 0.000000, 0.000000, 0.000000;;, - 10;3; 0.000000, 0.000000, 0.000000;;, - 11;3; 0.000000, 0.000000, 0.000000;;, - 12;3; 0.000000, 0.000000, 0.000000;;, - 13;3; 0.000000, 0.000000, 0.000000;;, - 14;3; 0.000000, 0.000000, 0.000000;;, - 15;3; 0.000000, 0.000000, 0.000000;;, - 16;3; 0.000000, 0.000000, 0.000000;;, - 17;3; 0.000000, 0.000000, 0.000000;;, - 18;3; 0.000000, 0.000000, 0.000000;;, - 19;3; 0.000000, 0.000000, 0.000000;;, - 20;3; 0.000000, 0.000000, 0.000000;;, - 21;3; 0.000000, 0.000000, 0.000000;;, - 22;3; 0.000000, 0.000000, 0.000000;;, - 23;3; 0.000000, 0.000000, 0.000000;;, - 24;3; 0.000000, 0.000000, 0.000000;;, - 25;3; 0.000000, 0.000000, 0.000000;;, - 26;3; 0.000000, 0.000000, 0.000000;;, - 27;3; 0.000000, 0.000000, 0.000000;;, - 28;3; 0.000000, 0.000000, 0.000000;;, - 29;3; 0.000000, 0.000000, 0.000000;;, - 30;3; 0.000000, 0.000000, 0.000000;;, - 31;3; 0.000000, 0.000000, 0.000000;;, - 32;3; 0.000000, 0.000000, 0.000000;;, - 33;3; 0.000000, 0.000000, 0.000000;;, - 34;3; 0.000000, 0.000000, 0.000000;;, - 35;3; 0.000000, 0.000000, 0.000000;;, - 36;3; 0.000000, 0.000000, 0.000000;;, - 37;3; 0.000000, 0.000000, 0.000000;;, - 38;3; 0.000000, 0.000000, 0.000000;;, - 39;3; 0.000000, 0.000000, 0.000000;;, - 40;3; 0.000000, 0.000000, 0.000000;;, - 41;3; 0.000000, 0.000000, 0.000000;;, - 42;3; 0.000000, 0.000000, 0.000000;;, - 43;3; 0.000000, 0.000000, 0.000000;;, - 44;3; 0.000000, 0.000000, 0.000000;;, - 45;3; 0.000000, 0.000000, 0.000000;;, - 46;3; 0.000000, 0.000000, 0.000000;;, - 47;3; 0.000000, 0.000000, 0.000000;;, - 48;3; 0.000000, 0.000000, 0.000000;;, - 49;3; 0.000000, 0.000000, 0.000000;;, - 50;3; 0.000000, 0.000000, 0.000000;;, - 51;3; 0.000000, 0.000000, 0.000000;;, - 52;3; 0.000000, 0.000000, 0.000000;;, - 53;3; 0.000000, 0.000000, 0.000000;;, - 54;3; 0.000000, 0.000000, 0.000000;;, - 55;3; 0.000000, 0.000000, 0.000000;;, - 56;3; 0.000000, 0.000000, 0.000000;;, - 57;3; 0.000000, 0.000000, 0.000000;;, - 58;3; 0.000000, 0.000000, 0.000000;;, - 59;3; 0.000000, 0.000000, 0.000000;;, - 60;3; 0.000000, 0.000000, 0.000000;;, - 61;3; 0.000000, 0.000000, 0.000000;;, - 62;3; 0.000000, 0.000000, 0.000000;;, - 63;3; 0.000000, 0.000000, 0.000000;;, - 64;3; 0.000000, 0.000000, 0.000000;;, - 65;3; 0.000000, 0.000000, 0.000000;;; - } - } -} // End of AnimationSet Global diff --git a/mods/mobs_monster/oerkki.lua b/mods/mobs_monster/oerkki.lua index f706b43c..2bb41599 100644 --- a/mods/mobs_monster/oerkki.lua +++ b/mods/mobs_monster/oerkki.lua @@ -1,6 +1,5 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_monster") -- Oerkki by PilzAdam @@ -20,35 +19,28 @@ mobs:register_mob("mobs_monster:oerkki", { textures = { {"mobs_oerkki.png"}, {"mobs_oerkki2.png"}, - {"mobs_oerkki3.png"}, + {"mobs_oerkki3.png"} }, makes_footstep_sound = false, - sounds = { - random = "mobs_oerkki", - }, + sounds = {random = "mobs_oerkki"}, walk_velocity = 1, run_velocity = 3, view_range = 10, jump = true, drops = { {name = "default:obsidian", chance = 3, min = 0, max = 2}, - {name = "default:gold_lump", chance = 2, min = 0, max = 2}, + {name = "default:gold_lump", chance = 2, min = 0, max = 2} }, water_damage = 2, lava_damage = 4, light_damage = 1, fear_height = 4, animation = { - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 36, - run_start = 37, - run_end = 49, - punch_start = 37, - punch_end = 49, - speed_normal = 15, - speed_run = 15, + stand_start = 0, stand_end = 23, + walk_start = 24, walk_end = 36, + run_start = 37, run_end = 49, + punch_start = 37, punch_end = 49, + speed_normal = 15, speed_run = 15 }, replace_rate = 5, replace_what = {"default:torch"}, @@ -56,23 +48,27 @@ mobs:register_mob("mobs_monster:oerkki", { replace_offset = -1, immune_to = { {"default:sword_wood", 0}, -- no damage - {"default:gold_lump", -10}, -- heals by 10 points + {"default:gold_lump", -10} -- heals by 10 points }, }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:oerkki", - nodes = {"default:stone"}, - max_light = 7, - chance = 7000, - max_height = -10, -}) + + mobs:spawn({ + name = "mobs_monster:oerkki", + nodes = {"default:stone"}, + max_light = 7, + chance = 7000, + max_height = -10 + }) end +-- spawn egg mobs:register_egg("mobs_monster:oerkki", S("Oerkki"), "default_obsidian.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:oerkki", "mobs_monster:oerkki") -- compatiblity +mobs:alias_mob("mobs:oerkki", "mobs_monster:oerkki") diff --git a/mods/mobs_monster/readme.md b/mods/mobs_monster/readme.md index 424777fb..51b3942b 100644 --- a/mods/mobs_monster/readme.md +++ b/mods/mobs_monster/readme.md @@ -1,48 +1,49 @@ +# MONSTER MOBS -MONSTER MOBS +This mod creates many types of monsters. Some are weak, some are powerful, and they generally do the player a lot of harm. Many of these monsters spawn below ground and take light damage. -Dirt Monster +**Lucky Blocks**: 12 -- Spawning at night on green grass (or grey in ethereal) these mobs wander around looking for a player to eat. Drops 1-5 dirt when killed. +## Dirt Monster -Dungeon Master +Dirt monsters spawn at night on green grass (or grey in `ethereal`). They have a tendency to wander around looking for a player to eat and drop 1-2 dirt when killed. Dirt monsters have between 3-27 health, take damage in sunlight, and deal very little damage. -- Spawning below -70 underground DM's have a tendency to hurl fire balls at unsuspecting players and can cause major damage, but get too close and he will switch to dogfight attack. Can drop mese or diamond when killed. +# Dungeon Master -Lava Flan +Dungeon masters spawn below -70 underground DM's and hurl fireballs at unsuspecting players and can cause major damage, but get too close and he will switch to dogfight attack. They have between 42 and 75 health points. Their melee attack deals six damage points and their fireball inflicts eight. The fireball will also explode if it hits a node. They drop mese or diamond when killed. -- Cute as they may look lava flan wallow in their namesake (no, not flans) and get curious about players who wander by, forgetting that they can burn you and cause damage. They have a 1 in 5 chance of dropping lava orb when killed, but if they die in water then pray they dont solidify into an obsidian flan that shoots shards and destroys all around them. +# Lava Flan -Mese Monster +Cute as they may look, lava flan wallow in their namesake (no, not flans) and get curious about players who wander by, forgetting that they can burn you and cause damage. They have a 1 in 5 chance of dropping lava orb when killed, but if they die in water then pray they dont solidify into an obsidian flan that shoots shards and destroys all around them. -- These mobs are territorial and spawn below -20 and will fire mese shards at passers by, so best avoided. Will drop mese when killed. +# Mese Monster -Oerkki +These mobs are territorial and spawn below -20 and will fire mese shards at passers by, so best avoided. The deeper you go the tougher they seem to get. Will drop mese when killed. Another thing - they do not take damage from many weapons. -- Found in dark areas like most monsters Oerkki wander the caverns stealing away torches on the ground and attacking anyone found in that area. 1 in 3 chance of dropping obsidian. +# Oerkki -Sand Monster +Found in dark areas like most monsters, Oerkki wander the caverns stealing away torches on the ground and attacking anyone found in that area. 1 in 3 chance of dropping obsidian. -- The hot deserts are home to these guys who spawn at any time of the day to attack players. They drop 3-5 desert sand when killed. +# Sand Monster -Spiders +The hot deserts are home to these guys who spawn at any time of the day to attack players. They drop 3-5 desert sand when killed. A single sand monster isn't much of a threat - they deal one damage point. -- Snowy spiders are found on higher cold areas, spitting Tarantula's in higher jungle, small Cave spider below -20 and Mese spider near areas containing the ore and Crystal spiders only in Ethereal's crystal biomes. Some are docile during the daytime and will drop string when killed. +# Spiders -Stone Monster +Snowy spiders are found on higher cold areas, spitting Tarantula's in higher jungle, small Cave spider below -20 and Mese spider near areas containing the ore and Crystal spiders only in Ethereal's crystal biomes. Some are docile during the daytime and will drop string when killed. -- Found underground in dark caves these mobs seem to be zombie-like in fashion with a tendency to rush a player in the area. can drop torch, iron or coal when killed. +# Stone Monster -Tree Monster +Found underground in dark caves, these mobs seem to be zombie-like in fashion with a tendency to rush a player in the area. They can drop torch, iron or coal when killed. -- Found atop tree's at night time they drop down and look for food in the form of players and animals. Can drop saplings and sometimes an apple or three depending on type. Also note that green tree creepers exist and sometimes go boom. +# Tree Monster -Land Guard +Found atop trees at night time they drop down and look for food in the form of players and animals. Can drop saplings and sometimes an apple or three depending on type. Also note that green tree creepers exist and sometimes go boom. -- These huge monsters roam the land in cold, hot and temperate areas and don't like players wandering around their domain. +# Land Guard -Fire Spirit +These huge monsters roam the land in cold, hot and temperate areas and don't like players wandering around their domain. They have between 60 and 130 health points and deal 15 damage, enough to kill you in two blows. -- Fire Spirits will not tolerate players roaming around their domain and will fiercely attack until their dying puff of smoke. Will drop it's spirit and some fire dust when using ethereal. +# Fire Spirit -Lucky Blocks: 11 +Fire Spirits will not tolerate players roaming around their domain and will fiercely attack until their dying puff of smoke. They will drop their spirit and some fire dust when using ethereal. diff --git a/mods/mobs_monster/sand_monster.lua b/mods/mobs_monster/sand_monster.lua index 67595be3..ee74bf75 100644 --- a/mods/mobs_monster/sand_monster.lua +++ b/mods/mobs_monster/sand_monster.lua @@ -1,10 +1,9 @@ -local S = mobs.intllib - +local S = minetest.get_translator("mobs_monster") -- custom particle effects -local effect = function( - pos, amount, texture, min_size, max_size, radius, gravity, glow) + +local function effect(pos, amount, texture, min_size, max_size, radius, gravity, glow) radius = radius or 2 min_size = min_size or 0.5 @@ -26,11 +25,10 @@ local effect = function( minsize = min_size, maxsize = max_size, texture = texture, - glow = glow, + glow = glow }) end - -- Sand Monster by PilzAdam mobs:register_mob("mobs_monster:sand_monster", { @@ -50,36 +48,29 @@ mobs:register_mob("mobs_monster:sand_monster", { mesh = "mobs_sand_monster.b3d", textures = { {"mobs_sand_monster.png"}, - {"mobs_sand_monster2.png"}, + {"mobs_sand_monster2.png"} }, blood_texture = "default_desert_sand.png", makes_footstep_sound = true, - sounds = { - random = "mobs_sandmonster", - }, + sounds = {random = "mobs_sandmonster"}, walk_velocity = 1.5, run_velocity = 4, - view_range = 8, --15 + view_range = 8, jump = true, floats = 0, drops = { - {name = "default:desert_sand", chance = 1, min = 3, max = 5}, + {name = "default:desert_sand", chance = 1, min = 3, max = 5} }, water_damage = 3, lava_damage = 4, light_damage = 0, fear_height = 4, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 39, - walk_start = 41, - walk_end = 72, - run_start = 74, - run_end = 105, - punch_start = 74, - punch_end = 105, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 39, + walk_start = 41, walk_end = 72, + run_start = 74, run_end = 105, + punch_start = 74, punch_end = 105 }, immune_to = { {"default:shovel_wood", 3}, -- shovels deal more damage to sand monster @@ -87,7 +78,7 @@ mobs:register_mob("mobs_monster:sand_monster", { {"default:shovel_bronze", 4}, {"default:shovel_steel", 4}, {"default:shovel_mese", 5}, - {"default:shovel_diamond", 7}, + {"default:shovel_diamond", 7} }, --[[ custom_attack = function(self, p) @@ -118,18 +109,24 @@ mobs:register_mob("mobs_monster:sand_monster", { ]] }) +-- where to spawn + if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:sand_monster", - nodes = {"default:desert_sand"}, - chance = 7000, - active_object_count = 2, - min_height = 0, -}) + + mobs:spawn({ + name = "mobs_monster:sand_monster", + nodes = {"default:desert_sand"}, + chance = 7000, + active_object_count = 2, + min_height = 0 + }) end +-- spawn egg -mobs:register_egg("mobs_monster:sand_monster", S("Sand Monster"), "default_desert_sand.png", 1) +mobs:register_egg("mobs_monster:sand_monster", S("Sand Monster"), + "default_desert_sand.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:sand_monster", "mobs_monster:sand_monster") -- compatibility +mobs:alias_mob("mobs:sand_monster", "mobs_monster:sand_monster") diff --git a/mods/mobs_monster/screenshot.jpg b/mods/mobs_monster/screenshot.jpg new file mode 100644 index 00000000..9624e856 Binary files /dev/null and b/mods/mobs_monster/screenshot.jpg differ diff --git a/mods/mobs_monster/settingtypes.txt b/mods/mobs_monster/settingtypes.txt new file mode 100644 index 00000000..a28d8a6e --- /dev/null +++ b/mods/mobs_monster/settingtypes.txt @@ -0,0 +1,10 @@ +mobs_monster.dirt_monster (Enable Dirt Monster) bool true +mobs_monster.dungeon_master (Enable Dungeon Master) bool true +mobs_monster.fire_spirit (Enable Fire Spirit) bool true +mobs_monster.land_guard (Enable Land Guard) bool true +mobs_monster.lava_flan (Enable Lava Flan) bool true +mobs_monster.mese_monster (Enable Mese Monster) bool true +mobs_monster.oerkki (Enable Oerkki) bool true +mobs_monster.spider (Enable Spider) bool true +mobs_monster.stone_monster (Enable Stone Monster) bool true +mobs_monster.tree_monster (Enable Tree Monster) bool true diff --git a/mods/mobs_monster/spawn_example.lua b/mods/mobs_monster/spawn_example.lua index 7babd084..deb84fe0 100644 --- a/mods/mobs_monster/spawn_example.lua +++ b/mods/mobs_monster/spawn_example.lua @@ -171,3 +171,17 @@ mobs:spawn({ min_height = 0, day_toggle = false, }) + +-- Land Guard + +mobs:spawn({ + name = "mobs_monster:land_guard", + nodes = { + "default:snow", "default:ice", "default:stone", + "default:dry_dirt_with_dry_grass", "ethereal:dry_dirt" + }, + max_light = 7, + chance = 25000, + min_height = 0, + active_object_count = 1, +}) diff --git a/mods/mobs_monster/spider.lua b/mods/mobs_monster/spider.lua index 4a74b3b1..9b390491 100644 --- a/mods/mobs_monster/spider.lua +++ b/mods/mobs_monster/spider.lua @@ -1,7 +1,9 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs_monster") -local get_velocity = function(self) +-- helper function + +local function get_velocity(self) local v = self.object:get_velocity() @@ -11,6 +13,9 @@ local get_velocity = function(self) return (v.x * v.x + v.z * v.z) ^ 0.5 end +local math_cos, math_sin = math.cos, math.sin + +-- custom spider types local spider_types = { @@ -44,14 +49,13 @@ local spider_types = { { nodes = {"ethereal:crystal_dirt", "ethereal:crystal_spike"}, skins = {"mobs_spider_crystal.png"}, - docile = true, + docile = true, immune_to = {{"ethereal:crystal_spike", 0}}, drops = { {name = "farming:string", chance = 1, min = 0, max = 2}, {name = "ethereal:crystal_spike", chance = 15, min = 1, max = 2}} } } - -- Spider by AspireMint (CC-BY-SA 3.0 license) mobs:register_mob("mobs_monster:spider", { @@ -65,7 +69,7 @@ mobs:register_mob("mobs_monster:spider", { hp_min = 10, hp_max = 30, armor = 200, - collisionbox = {-0.8, -0.5, -0.8, 0.8, 0, 0.8}, + collisionbox = {-0.7, -0.5, -0.7, 0.7, 0, 0.7}, visual_size = {x = 1, y = 1}, visual = "mesh", mesh = "mobs_spider.b3d", @@ -74,12 +78,12 @@ mobs:register_mob("mobs_monster:spider", { {"mobs_spider_orange.png"}, {"mobs_spider_snowy.png"}, {"mobs_spider_grey.png"}, - {"mobs_spider_crystal.png"}, + {"mobs_spider_crystal.png"} }, makes_footstep_sound = false, sounds = { random = "mobs_spider", - attack = "mobs_spider", + attack = "mobs_spider" }, walk_velocity = 1, run_velocity = 3, @@ -87,22 +91,18 @@ mobs:register_mob("mobs_monster:spider", { view_range = 15, floats = 0, drops = { - {name = "farming:string", chance = 1, min = 0, max = 2}, + {name = "farming:string", chance = 1, min = 0, max = 2} }, water_damage = 5, lava_damage = 5, light_damage = 0, +-- node_damage = false, -- disable damage_per_second node damage animation = { - speed_normal = 15, - speed_run = 20, - stand_start = 0, - stand_end = 0, - walk_start = 1, - walk_end = 21, - run_start = 1, - run_end = 21, - punch_start = 25, - punch_end = 45, + speed_normal = 15, speed_run = 20, + stand_start = 0, stand_end = 0, + walk_start = 1, walk_end = 21, + run_start = 1, run_end = 21, + punch_start = 25, punch_end = 45 }, -- check surrounding nodes and spawn a specific spider @@ -121,9 +121,9 @@ mobs:register_mob("mobs_monster:spider", { self.object:set_properties({textures = tmp.skins}) self.docile_by_day = tmp.docile - if tmp.drops then - self.drops = tmp.drops - end + if tmp.drops then self.drops = tmp.drops end + + if tmp.immune_to then self.immune_to = tmp.immune_to end if tmp.shoot then self.attack_type = "dogshoot" @@ -136,6 +136,7 @@ mobs:register_mob("mobs_monster:spider", { end if tmp.small then + self.object:set_properties({ collisionbox = {-0.2, -0.2, -0.2, 0.2, 0, 0.2}, visual_size = {x = 0.25, y = 0.25} @@ -154,9 +155,7 @@ mobs:register_mob("mobs_monster:spider", { -- quarter second timer self.spider_timer = (self.spider_timer or 0) + dtime - if self.spider_timer < 0.25 then - return - end + if self.spider_timer < 0.25 then return end self.spider_timer = 0 -- need to be stopped to go onwards @@ -166,15 +165,13 @@ mobs:register_mob("mobs_monster:spider", { end local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + local yaw = self.object:get_yaw() ; if not yaw then return end + local prop = self.object:get_properties() - -- sanity check - if not yaw then return end + pos.y = pos.y + prop.collisionbox[2] - 0.2 - pos.y = pos.y + self.collisionbox[2] - 0.2 - - local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (prop.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (prop.collisionbox[4] + 0.5) local nod = minetest.get_node_or_nil({ x = pos.x + dir_x, y = pos.y + 0.5, @@ -201,7 +198,9 @@ mobs:register_mob("mobs_monster:spider", { -- move up facing v.x = 0 ; v.y = 0 v.y = self.jump_height - mobs:set_animation(self, "jump") + + self:set_animation("jump") + self.object:set_velocity(v) end, @@ -222,45 +221,49 @@ mobs:register_mob("mobs_monster:spider", { end }) +-- where to spawn if not mobs.custom_spawn_monster then --- above ground spawn -mobs:spawn({ - name = "mobs_monster:spider", - nodes = { - "default:dirt_with_rainforest_litter", "default:snowblock", - "default:snow", "ethereal:crystal_dirt", "ethereal:cold_dirt" - }, - min_light = 0, - max_light = 8, - chance = 7000, - active_object_count = 1, - min_height = 25, - max_height = 31000, -}) --- below ground spawn -mobs:spawn({ - name = "mobs_monster:spider", - nodes = {"default:stone_with_mese", "default:mese", "default:stone"}, - min_light = 0, - max_light = 7, - chance = 7000, - active_object_count = 1, - min_height = -31000, - max_height = -40, -}) + -- above ground spawn + mobs:spawn({ + name = "mobs_monster:spider", + nodes = { + "default:dirt_with_rainforest_litter", "default:snowblock", + "default:snow", "ethereal:crystal_dirt", "ethereal:cold_dirt" + }, + min_light = 0, + max_light = 8, + chance = 7000, + active_object_count = 1, + min_height = 2, + max_height = 31000 + }) + + -- below ground spawn + mobs:spawn({ + name = "mobs_monster:spider", + nodes = {"default:stone_with_mese", "default:mese", "default:stone"}, + min_light = 0, + max_light = 7, + chance = 7000, + active_object_count = 1, + min_height = -31000, + max_height = -40 + }) end +-- spawn egg mobs:register_egg("mobs_monster:spider", S("Spider"), "mobs_cobweb.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider") -- compatibility +mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider") mobs:alias_mob("mobs:spider", "mobs_monster:spider") +-- cobweb and recipe --- cobweb minetest.register_node(":mobs:cobweb", { description = S("Cobweb"), drawtype = "plantlike", @@ -277,8 +280,9 @@ minetest.register_node(":mobs:cobweb", { liquid_range = 0, walkable = false, groups = {snappy = 1, disable_jump = 1}, + is_ground_content = false, drop = "farming:string", - sounds = default.node_sound_leaves_defaults() + sounds = mobs.node_sound_leaves_defaults() }) minetest.register_craft({ @@ -286,13 +290,16 @@ minetest.register_craft({ recipe = { {"farming:string", "", "farming:string"}, {"", "farming:string", ""}, - {"farming:string", "", "farming:string"}, + {"farming:string", "", "farming:string"} } }) +-- cobweb place function local web_place = function(pos) + if minetest.find_node_near(pos, 1, {"ignore"}) then return end + local pos2 = minetest.find_node_near(pos, 1, {"air", "group:leaves"}, true) if pos2 then @@ -300,6 +307,8 @@ local web_place = function(pos) end end +-- cobweb arrow + mobs:register_arrow("mobs_monster:cobweb", { visual = "sprite", visual_size = {x = 1, y = 1}, @@ -316,7 +325,7 @@ mobs:register_arrow("mobs_monster:cobweb", { player:punch(self.object, 1.0, { full_punch_interval = 2.0, - damage_groups = {fleshy = 3}, + damage_groups = {fleshy = 3} }, nil) web_place(self.object:get_pos()) @@ -330,7 +339,7 @@ mobs:register_arrow("mobs_monster:cobweb", { player:punch(self.object, 1.0, { full_punch_interval = 2.0, - damage_groups = {fleshy = 3}, + damage_groups = {fleshy = 3} }, nil) end }) diff --git a/mods/mobs_monster/stone_monster.lua b/mods/mobs_monster/stone_monster.lua index eb8d650a..78d753c7 100644 --- a/mods/mobs_monster/stone_monster.lua +++ b/mods/mobs_monster/stone_monster.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +-- translation and custom stone monster types + +local S = minetest.get_translator("mobs_monster") local stone_types = { @@ -10,10 +12,18 @@ local stone_types = { {name = "default:iron_lump", chance = 5, min = 0, max = 2}, {name = "default:gold_lump", chance = 5, min = 0, max = 2} } + }, + + { nodes = {"default:sandstone"}, + skins = {"mobs_stone_monster4.png"}, + drops = { + {name = "default:sandstone", chance = 1, min = 0, max = 2}, + {name = "default:tin_lump", chance = 5, min = 0, max = 2}, + {name = "default:copper_lump", chance = 5, min = 0, max = 2} + } } } - -- Stone Monster by PilzAdam mobs:register_mob("mobs_monster:stone_monster", { @@ -31,12 +41,10 @@ mobs:register_mob("mobs_monster:stone_monster", { mesh = "mobs_stone_monster.b3d", textures = { {"mobs_stone_monster.png"}, - {"mobs_stone_monster2.png"}, -- by AMMOnym + {"mobs_stone_monster2.png"} -- by AMMOnym }, makes_footstep_sound = true, - sounds = { - random = "mobs_stonemonster", - }, + sounds = {random = "mobs_stonemonster"}, walk_velocity = 1, run_velocity = 2, jump_height = 0, @@ -52,16 +60,11 @@ mobs:register_mob("mobs_monster:stone_monster", { lava_damage = 1, light_damage = 0, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 14, - walk_start = 15, - walk_end = 38, - run_start = 40, - run_end = 63, - punch_start = 40, - punch_end = 63, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 14, + walk_start = 15, walk_end = 38, + run_start = 40, run_end = 63, + punch_start = 40, punch_end = 63 }, immune_to = { {"default:pick_wood", 0}, -- wooden pick doesnt hurt stone monster @@ -69,7 +72,7 @@ mobs:register_mob("mobs_monster:stone_monster", { {"default:pick_bronze", 5}, {"default:pick_steel", 5}, {"default:pick_mese", 6}, - {"default:pick_diamond", 7}, + {"default:pick_diamond", 7} }, -- check surrounding nodes and spawn a specific spider @@ -87,9 +90,7 @@ mobs:register_mob("mobs_monster:stone_monster", { self.base_texture = tmp.skins self.object:set_properties({textures = tmp.skins}) - if tmp.drops then - self.drops = tmp.drops - end + if tmp.drops then self.drops = tmp.drops end return true end @@ -99,19 +100,24 @@ mobs:register_mob("mobs_monster:stone_monster", { end }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:stone_monster", - nodes = {"default:stone", "default:desert_stone", "default:sandstone"}, - max_light = 7, - chance = 7000, - max_height = 0, -}) + + mobs:spawn({ + name = "mobs_monster:stone_monster", + nodes = {"default:stone", "default:desert_stone", "default:sandstone", + "default:permafrost_with_stones"}, + max_light = 7, + chance = 7000, + max_height = 0 + }) end +-- spawn egg mobs:register_egg("mobs_monster:stone_monster", S("Stone Monster"), "default_stone.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:stone_monster", "mobs_monster:stone_monster") -- compatibility +mobs:alias_mob("mobs:stone_monster", "mobs_monster:stone_monster") diff --git a/mods/mobs_monster/textures/mobs_cobweb.png b/mods/mobs_monster/textures/mobs_cobweb.png index 05b4fdcf..5c3a5803 100644 Binary files a/mods/mobs_monster/textures/mobs_cobweb.png and b/mods/mobs_monster/textures/mobs_cobweb.png differ diff --git a/mods/mobs_monster/textures/mobs_dirt_monster.png b/mods/mobs_monster/textures/mobs_dirt_monster.png index 14da90be..2362bf9d 100644 Binary files a/mods/mobs_monster/textures/mobs_dirt_monster.png and b/mods/mobs_monster/textures/mobs_dirt_monster.png differ diff --git a/mods/mobs_monster/textures/mobs_dirt_monster2.png b/mods/mobs_monster/textures/mobs_dirt_monster2.png index 964698c9..3215e98c 100644 Binary files a/mods/mobs_monster/textures/mobs_dirt_monster2.png and b/mods/mobs_monster/textures/mobs_dirt_monster2.png differ diff --git a/mods/mobs_monster/textures/mobs_dirt_monster3.png b/mods/mobs_monster/textures/mobs_dirt_monster3.png index f11faee4..00cf3fc0 100644 Binary files a/mods/mobs_monster/textures/mobs_dirt_monster3.png and b/mods/mobs_monster/textures/mobs_dirt_monster3.png differ diff --git a/mods/mobs_monster/textures/mobs_fireball.png b/mods/mobs_monster/textures/mobs_fireball.png index d8965637..50cd8e1d 100644 Binary files a/mods/mobs_monster/textures/mobs_fireball.png and b/mods/mobs_monster/textures/mobs_fireball.png differ diff --git a/mods/mobs_monster/textures/mobs_mese_arrow.png b/mods/mobs_monster/textures/mobs_mese_arrow.png new file mode 100644 index 00000000..26c9938c Binary files /dev/null and b/mods/mobs_monster/textures/mobs_mese_arrow.png differ diff --git a/mods/mobs_monster/textures/mobs_mese_monster_blue.png b/mods/mobs_monster/textures/mobs_mese_monster_blue.png new file mode 100644 index 00000000..c43e995f Binary files /dev/null and b/mods/mobs_monster/textures/mobs_mese_monster_blue.png differ diff --git a/mods/mobs_monster/textures/mobs_mese_monster_green.png b/mods/mobs_monster/textures/mobs_mese_monster_green.png new file mode 100644 index 00000000..25d28e4a Binary files /dev/null and b/mods/mobs_monster/textures/mobs_mese_monster_green.png differ diff --git a/mods/mobs_monster/textures/mobs_mese_monster_purple.png b/mods/mobs_monster/textures/mobs_mese_monster_purple.png new file mode 100644 index 00000000..bbd1e696 Binary files /dev/null and b/mods/mobs_monster/textures/mobs_mese_monster_purple.png differ diff --git a/mods/mobs_monster/textures/mobs_mese_monster_red.png b/mods/mobs_monster/textures/mobs_mese_monster_red.png new file mode 100644 index 00000000..e991ea57 Binary files /dev/null and b/mods/mobs_monster/textures/mobs_mese_monster_red.png differ diff --git a/mods/mobs_monster/textures/mobs_obsidian_flan.png b/mods/mobs_monster/textures/mobs_obsidian_flan.png index e2f3b437..d6808a3b 100644 Binary files a/mods/mobs_monster/textures/mobs_obsidian_flan.png and b/mods/mobs_monster/textures/mobs_obsidian_flan.png differ diff --git a/mods/mobs_monster/textures/mobs_sand_monster.png b/mods/mobs_monster/textures/mobs_sand_monster.png index 75fcc4ba..7dc1d021 100644 Binary files a/mods/mobs_monster/textures/mobs_sand_monster.png and b/mods/mobs_monster/textures/mobs_sand_monster.png differ diff --git a/mods/mobs_monster/textures/mobs_stone_monster.png b/mods/mobs_monster/textures/mobs_stone_monster.png index 95c3c162..e2fe6aba 100644 Binary files a/mods/mobs_monster/textures/mobs_stone_monster.png and b/mods/mobs_monster/textures/mobs_stone_monster.png differ diff --git a/mods/mobs_monster/textures/mobs_stone_monster2.png b/mods/mobs_monster/textures/mobs_stone_monster2.png index 9c76b833..c9e483df 100644 Binary files a/mods/mobs_monster/textures/mobs_stone_monster2.png and b/mods/mobs_monster/textures/mobs_stone_monster2.png differ diff --git a/mods/mobs_monster/textures/mobs_stone_monster3.png b/mods/mobs_monster/textures/mobs_stone_monster3.png index 70bfc6ec..08d6fdc7 100644 Binary files a/mods/mobs_monster/textures/mobs_stone_monster3.png and b/mods/mobs_monster/textures/mobs_stone_monster3.png differ diff --git a/mods/mobs_monster/textures/mobs_stone_monster4.png b/mods/mobs_monster/textures/mobs_stone_monster4.png new file mode 100644 index 00000000..fe34d21c Binary files /dev/null and b/mods/mobs_monster/textures/mobs_stone_monster4.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster.png b/mods/mobs_monster/textures/mobs_tree_monster.png index 909af196..291fa707 100644 Binary files a/mods/mobs_monster/textures/mobs_tree_monster.png and b/mods/mobs_monster/textures/mobs_tree_monster.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster2.png b/mods/mobs_monster/textures/mobs_tree_monster2.png index f78c2daa..1bace386 100644 Binary files a/mods/mobs_monster/textures/mobs_tree_monster2.png and b/mods/mobs_monster/textures/mobs_tree_monster2.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster3.png b/mods/mobs_monster/textures/mobs_tree_monster3.png index 9e18fb2e..f06717e6 100644 Binary files a/mods/mobs_monster/textures/mobs_tree_monster3.png and b/mods/mobs_monster/textures/mobs_tree_monster3.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster4.png b/mods/mobs_monster/textures/mobs_tree_monster4.png index 6299e32d..e193f021 100644 Binary files a/mods/mobs_monster/textures/mobs_tree_monster4.png and b/mods/mobs_monster/textures/mobs_tree_monster4.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster5.png b/mods/mobs_monster/textures/mobs_tree_monster5.png index 67cd508a..ffadad02 100644 Binary files a/mods/mobs_monster/textures/mobs_tree_monster5.png and b/mods/mobs_monster/textures/mobs_tree_monster5.png differ diff --git a/mods/mobs_monster/textures/mobs_tree_monster_template.png b/mods/mobs_monster/textures/mobs_tree_monster_template.png new file mode 100644 index 00000000..0ed3833f Binary files /dev/null and b/mods/mobs_monster/textures/mobs_tree_monster_template.png differ diff --git a/mods/mobs_monster/textures/zmobs_lava_flan.png b/mods/mobs_monster/textures/zmobs_lava_flan.png index 23ab2667..a555ce5d 100644 Binary files a/mods/mobs_monster/textures/zmobs_lava_flan.png and b/mods/mobs_monster/textures/zmobs_lava_flan.png differ diff --git a/mods/mobs_monster/textures/zmobs_lava_flan2.png b/mods/mobs_monster/textures/zmobs_lava_flan2.png index 093278cb..44fdec99 100644 Binary files a/mods/mobs_monster/textures/zmobs_lava_flan2.png and b/mods/mobs_monster/textures/zmobs_lava_flan2.png differ diff --git a/mods/mobs_monster/textures/zmobs_lava_flan3.png b/mods/mobs_monster/textures/zmobs_lava_flan3.png index 08c2caf2..4e42d745 100644 Binary files a/mods/mobs_monster/textures/zmobs_lava_flan3.png and b/mods/mobs_monster/textures/zmobs_lava_flan3.png differ diff --git a/mods/mobs_monster/textures/zmobs_mese_monster.png b/mods/mobs_monster/textures/zmobs_mese_monster.png deleted file mode 100644 index 3d3812dd..00000000 Binary files a/mods/mobs_monster/textures/zmobs_mese_monster.png and /dev/null differ diff --git a/mods/mobs_monster/textures/zmobs_mese_monster_old.png b/mods/mobs_monster/textures/zmobs_mese_monster_old.png deleted file mode 100644 index 55f662a7..00000000 Binary files a/mods/mobs_monster/textures/zmobs_mese_monster_old.png and /dev/null differ diff --git a/mods/mobs_monster/tree_monster.lua b/mods/mobs_monster/tree_monster.lua index 4276f025..84095f40 100644 --- a/mods/mobs_monster/tree_monster.lua +++ b/mods/mobs_monster/tree_monster.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +-- translation and custom tree monster types + +local S = minetest.get_translator("mobs_monster") local tree_types = { @@ -9,7 +11,7 @@ local tree_types = { {name = "default:stick", chance = 1, min = 1, max = 3}, {name = "ethereal:sakura_leaves", chance = 1, min = 1, max = 2}, {name = "ethereal:sakura_trunk", chance = 2, min = 1, max = 2}, - {name = "ethereal:sakura_tree_sapling", chance = 2, min = 0, max = 2}, + {name = "ethereal:sakura_tree_sapling", chance = 2, min = 0, max = 2} } }, @@ -19,8 +21,8 @@ local tree_types = { {name = "default:stick", chance = 1, min = 1, max = 3}, {name = "ethereal:frost_leaves", chance = 1, min = 1, max = 2}, {name = "ethereal:frost_tree", chance = 2, min = 1, max = 2}, - {name = "ethereal:crystal_spike", chance = 4, min = 0, max = 2}, - } + {name = "ethereal:crystal_spike", chance = 4, min = 0, max = 2} + }, glow = 1 }, { nodes = {"ethereal:yellowleaves"}, @@ -29,8 +31,8 @@ local tree_types = { {name = "default:stick", chance = 1, min = 1, max = 3}, {name = "ethereal:yellowleaves", chance = 1, min = 1, max = 2}, {name = "ethereal:yellow_tree_sapling", chance = 2, min = 0, max = 2}, - {name = "ethereal:golden_apple", chance = 3, min = 0, max = 2}, - } + {name = "ethereal:golden_apple", chance = 3, min = 0, max = 2} + }, glow = 1 }, { nodes = {"default:acacia_bush_leaves"}, @@ -41,10 +43,9 @@ local tree_types = { {name = "default:coal_lump", chance = 3, min = 0, max = 3} }, explode = true - }, + } } - -- Tree Monster (or Tree Gollum) by PilzAdam mobs:register_mob("mobs_monster:tree_monster", { @@ -63,13 +64,11 @@ mobs:register_mob("mobs_monster:tree_monster", { mesh = "mobs_tree_monster.b3d", textures = { {"mobs_tree_monster.png"}, - {"mobs_tree_monster2.png"}, + {"mobs_tree_monster2.png"} }, blood_texture = "default_wood.png", makes_footstep_sound = true, - sounds = { - random = "mobs_treemonster", - }, + sounds = {random = "mobs_treemonster"}, walk_velocity = 1, run_velocity = 3, jump = true, @@ -78,7 +77,7 @@ mobs:register_mob("mobs_monster:tree_monster", { {name = "default:stick", chance = 1, min = 0, max = 2}, {name = "default:sapling", chance = 2, min = 0, max = 2}, {name = "default:junglesapling", chance = 3, min = 0, max = 2}, - {name = "default:apple", chance = 4, min = 1, max = 2}, + {name = "default:apple", chance = 4, min = 1, max = 2} }, water_damage = 0, lava_damage = 0, @@ -96,16 +95,11 @@ mobs:register_mob("mobs_monster:tree_monster", { -- {"all", 0}, -- only weapons on list deal damage }, animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 24, - walk_start = 25, - walk_end = 47, - run_start = 48, - run_end = 62, - punch_start = 48, - punch_end = 62, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 24, + walk_start = 25, walk_end = 47, + run_start = 48, run_end = 62, + punch_start = 48, punch_end = 62 }, -- check surrounding nodes and spawn a specific tree monster @@ -125,11 +119,12 @@ mobs:register_mob("mobs_monster:tree_monster", { self.base_texture = tmp.skins self.object:set_properties({textures = tmp.skins}) - if tmp.drops then - self.drops = tmp.drops - end + if tmp.glow then self.object:set_properties({glow = tmp.glow}) end + + if tmp.drops then self.drops = tmp.drops end if tmp.explode then + self.attack_type = "explode" self.explosion_radius = 3 self.explosion_timer = 3 @@ -156,20 +151,24 @@ mobs:register_mob("mobs_monster:tree_monster", { end }) +-- where to spawn if not mobs.custom_spawn_monster then -mobs:spawn({ - name = "mobs_monster:tree_monster", - nodes = {"group:leaves"}, --{"default:leaves", "default:jungleleaves"}, - max_light = 7, - chance = 7000, - min_height = 0, - day_toggle = false, -}) + + mobs:spawn({ + name = "mobs_monster:tree_monster", + nodes = {"group:leaves"}, + max_light = 7, + chance = 7000, + min_height = 0, + day_toggle = false + }) end +-- spawn egg mobs:register_egg("mobs_monster:tree_monster", S("Tree Monster"), "default_tree_top.png", 1) +-- compatibility with older mobs mod -mobs:alias_mob("mobs:tree_monster", "mobs_monster:tree_monster") -- compatibility +mobs:alias_mob("mobs:tree_monster", "mobs_monster:tree_monster") diff --git a/mods/mobs_npc/depends.txt b/mods/mobs_npc/depends.txt deleted file mode 100644 index 6eca2d8a..00000000 --- a/mods/mobs_npc/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -mobs -default? -lucky_block? -intllib? diff --git a/mods/mobs_npc/functions.lua b/mods/mobs_npc/functions.lua new file mode 100644 index 00000000..8e20fe22 --- /dev/null +++ b/mods/mobs_npc/functions.lua @@ -0,0 +1,436 @@ + +-- translation and mod check + +local S = minetest.get_translator("mobs_npc") +local mcl = minetest.get_modpath("mcl_core") ~= nil +local def = minetest.get_modpath("default") ~= nil + +-- show random message from list + +mobs_npc.npc_talk = function(self, player, message_list) + + local name = player:get_player_name() or "" + local messages = message_list or self.messages or {"??"} + + if messages then + + local msg = messages[math.random(#messages)] + + minetest.chat_send_player(name, "<" .. (self.nametag or "") .. "> " .. msg) + end +end + +-- drop random item from list + +mobs_npc.drop_trade = function(self, player, item, item_list) + + local w_inv = player:get_wielded_item() + + if item ~= w_inv:get_name() then return end + + local name = player:get_player_name() + + if not mobs.is_creative(name) then + w_inv:take_item() + player:set_wielded_item(w_inv) + end + + local pos = self.object:get_pos() + local drops = item_list + local drop = drops[math.random(#drops)] + local chance = 1 + + if type(drop) == "table" then + chance = drop[2] or 1 + drop = drop[1] + end + + if not minetest.registered_items[drop] + or math.random(chance) > 1 then + drop = mcl and "mcl_core:clay_lump" or "default:clay_lump" + end + + local obj = minetest.add_item(pos, {name = drop}) + local dir = player:get_look_dir() + + obj:set_velocity({x = -dir.x, y = 1.5, z = -dir.z}) + + return true +end + +-- check for simple_dialogs mod and setup + +local context = {} + +mobs_npc.useDialogs = "N" + +minetest.register_on_leaveplayer(function(player) + context[player:get_player_name()] = nil +end) + +if minetest.get_modpath("simple_dialogs") then + + mobs_npc.useDialogs = "Y" + + simple_dialogs.register_varloader(function(npcself, playername) + simple_dialogs.save_dialog_var(npcself, "NPCNAME", npcself.nametag, playername) + simple_dialogs.save_dialog_var(npcself, "STATE", npcself.state, playername) + simple_dialogs.save_dialog_var(npcself, "FOOD", npcself.food, playername) + simple_dialogs.save_dialog_var(npcself, "HEALTH", npcself.health, playername) + simple_dialogs.save_dialog_var(npcself, "owner", npcself.owner, playername) + end) + + simple_dialogs.register_hook(function(npcself, playername,hook) + + if hook.func == "TELEPORT" then + + if npcself.owner then + + --check to see if the player has 'bring' teleport privliges + local player_privs = minetest.get_player_privs(npcself.owner) + + if player_privs["bring"] then + + --validate x,y,z coords + if hook.parm and hook.parmcount and hook.parmcount > 2 then + + local pos = { + x = tonumber(hook.parm[1]), + y = tonumber(hook.parm[2]), + z = tonumber(hook.parm[3]) + } + + if pos.x and pos.y and pos.z + and pos.x > -31500 and pos.x < 31500 + and pos.y > -31500 and pos.y < 31500 + and pos.z > -31500 and pos.z < 31500 then + + local player = minetest.get_player_by_name(playername) + + if player then + player:set_pos(pos) end + end + end + end + end + return "EXIT" + end + end) +end + +-- Kilarin's formspec functions + +function mobs_npc.get_controls_formspec(name, self) + + self.id = set_npc_id(self) -- make sure id is set + + local currentordermode = self.order + local npcId = self.id + local orderArray = {"wander", "stand", "follow"} + local currentorderidx = 1 + + for i = 1, 3 do --this seems like a clumsy way to do this + if orderArray[i] == currentordermode then + currentorderidx = i + break + end + end + + -- Make npc controls formspec + local text = "NPC Controls" + local size = mobs_npc.useDialogs == "Y" and "size[15,10]" or "size[3.85,2.8]" + local formspec = { + size, + "label[0.375,0.5;", minetest.formspec_escape(text), "]", + "dropdown[0.375,1.25; 3,0.6;ordermode;wander,stand,follow;", currentorderidx, "]", + "button[0.375,2;3,0.8;exit;Exit]" + } + + if mobs_npc.useDialogs == "Y" then + simple_dialogs.add_dialog_control_to_formspec(name, self, formspec, 0.375, 3.4) + end + + table.concat(formspec, "") + + --store npc id in local context so we can use it when the form is returned + context[name] = npcId + + return table.concat(formspec, "") +end + +-- receive and do orders given through form + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + local pname = player:get_player_name() + + if formname ~= "mobs_npc:controls" then + + if context[pname] then context[pname] = nil end + + return + end + + local npcId = context[pname] or nil --get the npc id from local context + local npcself = get_npcself_from_id(npcId) + + if npcself ~= nil then + + if fields["exit"] then + + minetest.close_formspec(pname, "mobs_npc:controls") + + elseif fields["ordermode"] then + + local pname = player:get_player_name() + + npcself.order = fields["ordermode"] + + if npcself.order == "wander" then + +-- minetest.chat_send_player(pname, S("NPC will wander.")) + + elseif npcself.order == "stand" then + + npcself.state = "stand" + npcself.attack = nil + npcself:set_animation("stand") + npcself:set_velocity(0) + +-- minetest.chat_send_player(pname, S("NPC stands still.")) + + elseif npcself.order == "follow" then +-- minetest.chat_send_player(pname, S("NPC will follow you.")) + end + end + + if mobs_npc.useDialogs == "Y" then + simple_dialogs.process_simple_dialog_control_fields(pname, npcself, fields) + end + end +end) + +-- check if npc has id set otherwise create one + +function set_npc_id(npcself) + + if not npcself.id then + npcself.id = (math.random(1, 1000) * math.random(1, 10000)) + .. npcself.name .. (math.random(1, 1000) ^ 2) + end + + return npcself.id +end + +--this function finds an npcself in the luaentities list given an npcId + +function get_npcself_from_id(npcId) + + if npcId == nil then return nil end + + for k, v in pairs(minetest.luaentities) do + + if v.object and v.id and v.id == npcId then + return v + end + end +end + +--This code comes almost exclusively from the trader and inventory of mobf, by Sapier. +--The copyright notice below is from mobf: +------------------------------------------------------------------------------- +-- Mob Framework Mod by Sapier +-- +-- You may copy, use, modify or do nearly anything except removing this +-- copyright notice. +-- And of course you are NOT allow to pretend you have written it. +-- +--! @file inventory.lua +--! @brief component containing mob inventory related functions +--! @copyright Sapier +--! @author Sapier +--! @date 2013-01-02 +-- +--! @defgroup Inventory Inventory subcomponent +--! @brief Component handling mob inventory +--! @ingroup framework_int +--! @{ +-- +-- Contact sapier a t gmx net +------------------------------------------------------------------------------- + +-- This code has been heavily modified by isaiah658. +-- Trades are saved in entity metadata so they always stay the same after +-- initially being chosen. Also the formspec uses item image buttons instead of +-- inventory slots. + +local function add_goods(self, race) + + local trade_index = 1 + local trades_already_added = {} + local trader_pool_size = 10 + local item_pool_size = #race.items -- get number of items on list + + self.trades = {} + + if item_pool_size < trader_pool_size then + trader_pool_size = item_pool_size + end + + for i = 1, trader_pool_size do + + -- If there are more trades than the amount being added, they are + -- randomly selected. If they are equal, there is no reason to randomly + -- select them + local random_trade = nil + + if item_pool_size == trader_pool_size then + random_trade = i + else + while random_trade == nil do + + local num = math.random(item_pool_size) + + if trades_already_added[num] == nil then + trades_already_added[num] = true + random_trade = num + end + end + end + + if math.random(0, 100) > race.items[random_trade][3] then + + self.trades[trade_index] = { + race.items[random_trade][1], + race.items[random_trade][2] + } + + trade_index = trade_index + 1 + end + end +end + + +function mobs_npc.shop_trade(self, clicker, race) + + self.id = set_npc_id(self) -- make sure id is set + + if not self.game_name then + + self.game_name = tostring(race.names[math.random(1, #race.names)]) + self.nametag = S("Trader @1", self.game_name) + + self.object:set_properties({ + nametag = self.nametag, + nametag_color = "#00FF00" + }) + end + + if self.trades == nil then + add_goods(self, race) + end + + local player = clicker:get_player_name() or "" + + minetest.chat_send_player(player, + S("[NPC] Hello, @2, have a look at my wares.", + self.game_name, player)) + + -- Make formspec trade list + local formspec_trade_list = "" + local x, y + + for i = 1, 10 do + + if self.trades[i] and self.trades[i] ~= "" then + + if i < 6 then + x = mcl and 1 or 0.5 + y = i - 0.5 + else + x = mcl and 5 or 4.5 + y = i - 5.5 + end + + formspec_trade_list = formspec_trade_list + .. "item_image_button[".. x ..",".. y ..";1,1;" + .. self.trades[i][2] .. ";prices#".. i .."#".. self.id ..";]" + .. "item_image_button[".. x + 2 ..",".. y ..";1,1;" + .. self.trades[i][1] .. ";goods#".. i .."#".. self.id ..";]" + .. "image[".. x + 1 ..",".. y ..";1,1;gui_arrow_blank.png]" + end + end + + local bg = mcl and mcl_vars.gui_bg_img or default.gui_bg_img or "" + local sl = mcl and mcl_vars.gui_slots or default.gui_slots or "" + local lc = mcl and "listcolors[#9d9d9d;#FFF7;#474747]" or "" + + minetest.show_formspec(player, "mobs_npc:trade", "size[" .. (mcl and 9 or 8) .. ",10]" + .. bg + .. sl + .. "label[0.5,-0.1;" .. S("Trader @1's stock:", self.game_name) .. "]" + .. formspec_trade_list + .. lc + .. "list[current_player;main;0,6;" .. (mcl and 9 or 8) .. ",4;]" + ) +end + + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname ~= "mobs_npc:trade" then return end + + if fields then + + local trade = "" + + for k, v in pairs(fields) do + trade = tostring(k) + end + + local id = trade:split("#")[3] + local self = nil + + if id ~= nil then + + for k, v in pairs(minetest.luaentities) do + + if v.object and v.id and v.id == id then + self = v + break + end + end + end + + if self ~= nil then + + local trade_number = tonumber(trade:split("#")[2]) + + if trade_number ~= nil and self.trades[trade_number] ~= nil then + + local price = self.trades[trade_number][2] + local goods = self.trades[trade_number][1] + local inv = player:get_inventory() + + if inv:contains_item("main", price) then + + inv:remove_item("main", price) + + local leftover = inv:add_item("main", goods) + + if leftover:get_count() > 0 then + + -- drop item(s) in front of player + local droppos = player:get_pos() + local dir = player:get_look_dir() + + droppos.x = droppos.x + dir.x + droppos.z = droppos.z + dir.z + + minetest.add_item(droppos, leftover) + end + end + end + end + end +end) diff --git a/mods/mobs_npc/igor.lua b/mods/mobs_npc/igor.lua index 053bb151..5d164d17 100644 --- a/mods/mobs_npc/igor.lua +++ b/mods/mobs_npc/igor.lua @@ -1,17 +1,34 @@ -local S = mobs.intllib +-- translation and mod check + +local S = minetest.get_translator("mobs_npc") +local mcl = minetest.get_modpath("mcl_core") ~= nil + +-- right-click drops + +mobs_npc.igor_drops = { + mcl and "mcl_potions:glass_bottle" or "vessels:glass_bottle", + mcl and "mcl_mobitems:beef" or "mobs:meat_raw", + {mcl and "mcl_tools:sword_iron" or "default:sword_steel", 2}, + mcl and "mcl_farming:bread" or "farming:bread", + {mcl and "mcl_buckets:bucket_water" or "bucket:bucket_water", 2}, + mcl and "mcl_mushrooms:mushroom_red" or "flowers:mushroom_red", + mcl and "mcl_core:jungletree" or "default:jungletree", + {mcl and "mcl_fire:flint_and_steel" or "fire:flint_and_steel", 3}, + mcl and "mcl_mobitems:leather" or "mobs:leather", + mcl and "mcl_core:acaciasapling" or "default:acacia_sapling", + {mcl and "mcl_beds:bed_red" or "fireflies:bug_net", 3}, + mcl and "mcl_core:clay_lump" or "default:clay_lump", + mcl and "mcl_core:ice" or "default:ice", + mcl and "mcl_ocean:bubble_coral" or "default:coral_brown", + mcl and "mcl_raw_ores:raw_iron" or "default:iron_lump", + mcl and "mcl_amethyst:amethyst_block" or "default:obsidian_shard", + mcl and "mcl_core:mossycobble" or "default:mossycobble", + mcl and "mcl_core:obsidian" or {"default:obsidian", 2} +} -- Igor by TenPlus1 -mobs.igor_drops = { - "vessels:glass_bottle", "mobs:meat_raw", {"default:sword_steel", 2}, - "farming:bread", {"bucket:bucket_water", 2}, "flowers:mushroom_red", - "default:jungletree", {"fire:flint_and_steel", 3}, "mobs:leather", - "default:acacia_sapling", {"fireflies:bug_net", 3}, "default:clay_lump", - "default:ice", "default:coral_brown", "default:iron_lump", - "default:obsidian_shard", "default:mossycobble", {"default:obsidian", 2} -} - mobs:register_mob("mobs_npc:igor", { type = "npc", passive = false, @@ -20,7 +37,8 @@ mobs:register_mob("mobs_npc:igor", { owner_loyal = true, pathfinding = true, reach = 2, - attacks_monsters = true, + attack_monsters = true, +-- attack_ignore = {"mobs_npc:npc"}, hp_min = 20, hp_max = 30, armor = 100, @@ -45,30 +63,29 @@ mobs:register_mob("mobs_npc:igor", { fear_height = 2, jump = true, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 2}, - {name = "default:gold_lump", chance = 3, min = 1, max = 1} + {name = mcl and "mcl_mobitems:beef" or "mobs:meat_raw", + chance = 1, min = 1, max = 2}, + {name = mcl and "mcl_raw_ores:raw_gold" or "default:gold_lump", + chance = 3, min = 1, max = 1} }, water_damage = 1, lava_damage = 3, light_damage = 0, - follow = {"mobs:meat_raw", "default:diamond"}, + follow = { + mcl and "mcl_mobitems:beef" or "group:food_meat_raw",--"mobs:meat_raw", + mcl and "mcl_core:diamond" or "default:diamond" + }, view_range = 15, owner = "", - order = "follow", + order = "wander", animation = { - speed_normal = 30, - speed_run = 30, - stand_start = 0, - stand_end = 79, - walk_start = 168, - walk_end = 187, - run_start = 168, - run_end = 187, - punch_start = 200, - punch_end = 219 + speed_normal = 30, speed_run = 30, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 187, + run_start = 168, run_end = 187, + punch_start = 189, punch_end = 198 -- was 200 and 219 }, - -- right clicking with raw meat will give Igor more health on_rightclick = function(self, clicker) -- feed to heal npc @@ -79,70 +96,58 @@ mobs:register_mob("mobs_npc:igor", { local item = clicker:get_wielded_item() local name = clicker:get_player_name() - -- right clicking with gold lump drops random item from mobs.npc_drops - if item:get_name() == "default:gold_lump" then - - if not mobs.is_creative(name) then - item:take_item() - clicker:set_wielded_item(item) - end - - local pos = self.object:get_pos() - local drops = self.igor_drops or mobs.igor_drops - local drop = drops[math.random(#drops)] - local chance = 1 - - if type(drop) == "table" then - chance = drop[2] - drop = drop[1] - end - - if not minetest.registered_items[drop] - or math.random(chance) > 1 then - drop = "default:coal_lump" - end - - local obj = minetest.add_item(pos, {name = drop}) - local dir = clicker:get_look_dir() - - obj:set_velocity({x = -dir.x, y = 1.5, z = -dir.z}) - - --minetest.chat_send_player(name, S("NPC dropped you an item for gold!")) + -- right clicking with gold lump drops random item from list + if mobs_npc.drop_trade(self, clicker, mcl and "mcl_raw_ores:raw_gold" + or "default:gold_lump", self.npc_drops or mobs_npc.igor_drops) then return end - -- by right-clicking owner can switch npc between follow, wander and stand - if self.owner and self.owner == name then + -- owner can right-click with stick to show control formspec + if item:get_name() == (mcl and "mcl_core:stick" or "default:stick") + and self.owner == name then - if self.order == "follow" then + minetest.show_formspec(name, "mobs_npc:controls", + mobs_npc.get_controls_formspec(name, self)) - self.order = "wander" + return + end - minetest.chat_send_player(name, S("NPC will wander.")) - - elseif self.order == "wander" then - - self.order = "stand" - self.state = "stand" - self.attack = nil - - self:set_animation("stand") - self:set_velocity(0) - - minetest.chat_send_player(name, S("NPC stands still.")) - - elseif self.order == "stand" then - - self.order = "follow" - - minetest.chat_send_player(name, S("NPC will follow you.")) + -- show simple dialog if enabled or idle chatter + if mobs_npc.useDialogs == "Y" then + simple_dialogs.show_dialog_formspec(name, self) + else + if self.state == "attack" then + mobs_npc.npc_talk(self, clicker, {"Grr!", "Must Kill!"}) + else + mobs_npc.npc_talk(self, clicker, { + "Hey!", "What do you want?", "Go away!", "Go bother someone else!"}) end end end }) -mobs:register_egg("mobs_npc:igor", S("Igor"), "mobs_meat_raw.png", 1) +-- spawn egg + +mobs:register_egg("mobs_npc:igor", S("Igor"), + mcl and "mcl_mobitems_beef_raw.png" or "mobs_meat_raw.png", 1) + +-- compatibility with older mobs mod --- compatibility mobs:alias_mob("mobs:igor", "mobs_npc:igor") + +-- spawn Igor in world + +if not mobs.custom_spawn_npc then + + mobs:spawn({ + name = "mobs_npc:igor", + nodes = {mcl and "mcl_farming:pumpkin" or "mobs:meatblock"}, + neighbors = {mcl and "mcl_core:stonebrick" or "default:brick"}, + min_light = 10, + chance = 10000, + active_object_count = 1, + min_height = 0, + day_toggle = true + }) +end diff --git a/mods/mobs_npc/init.lua b/mods/mobs_npc/init.lua index ee9003d1..91dbd366 100644 --- a/mods/mobs_npc/init.lua +++ b/mods/mobs_npc/init.lua @@ -1,14 +1,13 @@ --- Load support for intllib. +-- translation and get mod path +local S = minetest.get_translator("mobs_npc") local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" -local S = minetest.get_translator and minetest.get_translator("mobs_npc") or - dofile(path .. "intllib.lua") - -mobs.intllib = S - +-- Global +mobs_npc = {} -- Check for custom mob spawn file + local input = io.open(path .. "spawn.lua", "r") if input then @@ -17,21 +16,21 @@ if input then input = nil end - --- NPCs +dofile(path .. "functions.lua") -- useful functions dofile(path .. "npc.lua") -- TenPlus1 dofile(path .. "trader.lua") dofile(path .. "igor.lua") +-- Load custom spawning if found --- Load custom spawning if mobs.custom_spawn_npc then dofile(path .. "spawn.lua") end - -- Lucky Blocks -dofile(path .. "/lucky_block.lua") +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end -print ("[MOD] Mobs Redo NPCs loaded") +print ("[MOD] Mobs Redo NPC's loaded") diff --git a/mods/mobs_npc/intllib.lua b/mods/mobs_npc/intllib.lua deleted file mode 100644 index 7decdf7d..00000000 --- a/mods/mobs_npc/intllib.lua +++ /dev/null @@ -1,3 +0,0 @@ --- Support for the old multi-load method -return dofile(minetest.get_modpath("intllib").."/init.lua") - diff --git a/mods/mobs_npc/license.txt b/mods/mobs_npc/license.txt index fec6f6aa..9ba22178 100644 --- a/mods/mobs_npc/license.txt +++ b/mods/mobs_npc/license.txt @@ -19,3 +19,54 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +MirceaKitsune (CC BY-SA 3.0) + mobs_character.b3d + +Dokimi (CC BY-SA 4.0) + mobs_npc_baby.png [Exile Player] + +Sdzen (CC BY-SA 3.0) + mobs_npc.png [Farmer 2] + mobs_npc2.png [Farmer 7] + mobs_npc3.png [Farmer 5] + mobs_npc4.png [Bartender] + +Astrobe (CC0) + mobs_npc5.png + mobs_npc6.png + mobs_trader4.png + +fishyWET (CC BY-SA 3.0) + mobs_trader.png [dwarf] + +CatNinja (CC BY-SA 3.0) + mobs_trader2.png [dwarf1] + +Gabo (CC BY-SA 3.0) + mobs_trader3.png [dwarf2] + +TenPlus1 (CC0) + mobs_igor.png + +UnKnOwN (CC BY-SA 3.0) + mobs_igor2.png [Green Dino] + +LoveHart (CC BY-SA 3.0) + mobs_igor3.png [Dead Man] + +I-Dont-Know (CC BY-SA 4.0) + mobs_igor4.png [Skeleton] + +Pithy (CC BY-SA 3.0) + mobs_igor5.png [Doctor Pumpkin] + +Cme (CC BY-SA 3.0) + mobs_igor6.png [Zombie] + +Jose (CC BY-SA 3.0) + mobs_igor7.png [Max] + +Bajanhgk (CC BY-SA 3.0) + mobs_igor8.png [Dante] diff --git a/mods/mobs_npc/locale/de.txt b/mods/mobs_npc/locale/de.txt deleted file mode 100644 index cffa8408..00000000 --- a/mods/mobs_npc/locale/de.txt +++ /dev/null @@ -1,23 +0,0 @@ -# German Translation for mobs_npc mod -# Deutsche Übersetzung der mobs_npc Mod -# last update: 2016/June/10 -# Author: Xanthin - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded = [MOD] Mobs Redo 'NPCs' geladen - -#npc.lua -NPC dropped you an item for gold! = NSC ließ dir für Gold einen Gegenstand fallen! -NPC stands still. = NSC bleibt stehen. -NPC will follow you. = NSC wird dir folgen. -Npc = Nsc - -#trader.lua -Trader @1 = Händler @1 -[NPC] Hello, @2, have a look at my wares. = [NSC] Hallo, @2, wirf einen Blick auf meine Waren. -Trader @1's stock: = Händler @1s Warenlager -Selection = Auswahl -Price = Preis -Payment = Bezahlung -Bought items = Ware -Trader = Händler \ No newline at end of file diff --git a/mods/mobs_npc/locale/it_IT.txt b/mods/mobs_npc/locale/it_IT.txt deleted file mode 100644 index 0ee13119..00000000 --- a/mods/mobs_npc/locale/it_IT.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Template for translations of mobs_npc mod -# last update: 2016/June/10 - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded = [MOD] Mobs Redo 'NPCs' caricato - -#npc.lua -NPC dropped you an item for gold! = Il PNG ti ha lasciato un oggetto per dell'oro! -NPC stands still. = Il PNG sta fermo. -NPC will follow you. = Il PNG ti seguirà. -Npc = PNG - -#trader.lua -Trader @1 = Commerciante @1 -[NPC] Hello, @2, have a look at my wares. = [PNG] Salute, @2, dà un'occhiata alle mie merci. -Trader @1's stock: = Fornitura del commerciante @1 -Selection = Selezione -Price = Prezzo -Payment = Pagamento -Bought items = Oggetti comprati -Trader = Commerciante \ No newline at end of file diff --git a/mods/mobs_npc/locale/mobs_npc.es.tr b/mods/mobs_npc/locale/mobs_npc.es.tr new file mode 100644 index 00000000..8c349b28 --- /dev/null +++ b/mods/mobs_npc/locale/mobs_npc.es.tr @@ -0,0 +1,11 @@ +# textdomain:mobs_npc +Igor=Igor +NPC dropped you an item for gold!=NPC te dejo un item para oro! +NPC stands still.=NPC aun esta quieto +NPC will follow you.=NPC te seguira. +Npc=Npc +Trader=Mercader +Trader @1=Comerciante @1 +Trader @1's stock:=Articulos del comerciante @1: +[MOD] Mobs Redo NPCs loaded=[MOD] NPC Mobs Redo cargado +[NPC] Hello, @2, have a look at my wares.=[NPC] Bienvenido, @2. Mira mis articulos diff --git a/mods/mobs_npc/locale/mobs_npc.ru.tr b/mods/mobs_npc/locale/mobs_npc.ru.tr new file mode 100644 index 00000000..07f46877 --- /dev/null +++ b/mods/mobs_npc/locale/mobs_npc.ru.tr @@ -0,0 +1,11 @@ +# textdomain:mobs_npc +Igor=Игорь +NPC dropped you an item for gold!=NPC дал вам предмет, который можно обменять на золото! +NPC stands still.=NPC стоит на месте. +NPC will follow you.=NPC будет следовать за вами. +Npc=Npc +Trader=Торговец +Trader @1=Торговец @1 +Trader @1's stock:=Товары торговца @1: +[MOD] Mobs Redo NPCs loaded=[МОД] Mobs Redo NPCs загружены +[NPC] Hello, @2, have a look at my wares.=[NPC] <Торговец @1> Привет, @2, взгляни на мой товар. diff --git a/mods/mobs_npc/locale/ms.txt b/mods/mobs_npc/locale/ms.txt deleted file mode 100644 index 4d223703..00000000 --- a/mods/mobs_npc/locale/ms.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Malay translations of mobs_npc mod -# using template from 2016/June/10, translated on 2018/February/05 - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded = [MODS] Mobs Redo 'NPCs' telah dimuatkan - -#npc.lua -NPC dropped you an item for gold! = NPC jatuhkan item untuk anda apabila dibayar dengan emas! -NPC stands still. = NPC berdiri diam. -NPC will follow you. = NPC akan mengikut anda. -Npc = Npc - -#trader.lua -Trader @1 = Pedagang @1 -[NPC] Hello, @2, have a look at my wares. = [NPC] Helo @2, lihatlah barangan saya. -Trader @1's stock: = Stok pedagang @1: -Selection = Pilihan -Price = Harga -Payment = Bayaran -Bought items = Item dibeli -Trader = Pedagang \ No newline at end of file diff --git a/mods/mobs_npc/locale/template.txt b/mods/mobs_npc/locale/template.txt deleted file mode 100644 index f806b7f1..00000000 --- a/mods/mobs_npc/locale/template.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Template for translations of mobs_npc mod -# last update: 2016/June/10 - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded= - -#npc.lua -NPC dropped you an item for gold!= -NPC stands still.= -NPC will follow you.= -Npc= - -#trader.lua -Trader @1= -[NPC] Hello, @2, have a look at my wares.= -Trader @1's stock:= -Selection= -Price= -Payment= -Bought items= -Trader= - -#igor.lua -Igor= diff --git a/mods/mobs_npc/locale/zh_CN.txt b/mods/mobs_npc/locale/zh_CN.txt deleted file mode 100644 index 2bccae90..00000000 --- a/mods/mobs_npc/locale/zh_CN.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Template for translations of mobs_npc mod -# last update: 2016/June/10 - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded = [模组] Mobs Redo 'NPCs' 已加载 - -#npc.lua -NPC dropped you an item for gold! = NPC给你丢了一个金币! -NPC stands still. = NPC 站住不动。 -NPC will follow you. = NPC 会跟着你。 -Npc = - -#trader.lua -Trader @1 = 商人 @1 -[NPC] Hello, @2, have a look at my wares. = [NPC] < 商人 @1 > 你好,@2,来看看我的东西! -Trader @1's stock: = 商人@1的现货: -Selection = 选择 -Price = 单价 -Payment = 付款 -Bought items = 购买的物品 -Trader = 商人 - -#igor.lua -Igor = 伊戈尔 diff --git a/mods/mobs_npc/locale/zh_TW.txt b/mods/mobs_npc/locale/zh_TW.txt deleted file mode 100644 index 636ede58..00000000 --- a/mods/mobs_npc/locale/zh_TW.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Template for translations of mobs_npc mod -# last update: 2016/June/10 - -#init.lua -[MOD] Mobs Redo 'NPCs' loaded = [模組] Mobs Redo 'NPCs' 已加載 - -#npc.lua -NPC dropped you an item for gold! = NPC給你丟了一個金幣! -NPC stands still. = NPC 站住不動。 -NPC will follow you. = NPC 會跟著你。 -Npc = - -#trader.lua -Trader @1 = 商人 @1 -[NPC] Hello, @2, have a look at my wares. = [NPC] < 商人 @1 > 你好,@2,來看看我的東西! -Trader @1's stock: = 商人@1的現貨: -Selection = 選擇 -Price = 單價 -Payment = 付款 -Bought items = 購買的物品 -Trader = 商人 - -#igor.lua -Igor = 伊戈爾 diff --git a/mods/mobs_npc/lucky_block.lua b/mods/mobs_npc/lucky_block.lua index 93db875e..63684da5 100644 --- a/mods/mobs_npc/lucky_block.lua +++ b/mods/mobs_npc/lucky_block.lua @@ -1,10 +1,9 @@ -if minetest.get_modpath("lucky_block") then +-- add lucky blocks - lucky_block:add_blocks({ - {"spw", "mobs:npc", 1, true, true}, - {"spw", "mobs:igor", 1, true, true, 5, "Igor"}, - {"spw", "mobs:trader", 1, false, false}, - {"lig", "fire:permanent_flame"} - }) -end +lucky_block:add_blocks({ + {"spw", "mobs:npc", 1, true, true}, + {"spw", "mobs:igor", 1, true, true, 5, "Igor"}, + {"spw", "mobs:trader", 1, false, false}, + {"lig", "fire:permanent_flame"} +}) diff --git a/mods/mobs_npc/mod.conf b/mods/mobs_npc/mod.conf index 1cdfb4a1..6bf73db8 100644 --- a/mods/mobs_npc/mod.conf +++ b/mods/mobs_npc/mod.conf @@ -1,4 +1,7 @@ +title = Mobs NPC name = mobs_npc +description = Add a simple NPC, Igor and Trader into your world. depends = mobs -optional_depends = default, lucky_block, intllib -description = Adds simple NPC and Trader. +optional_depends = default, lucky_block, simple_dialogs, screwdriver, mcl_core +author = TenPlus1 +min_minetest_version = 5.0 diff --git a/mods/mobs_npc/npc.lua b/mods/mobs_npc/npc.lua index 891d5e75..32212089 100644 --- a/mods/mobs_npc/npc.lua +++ b/mods/mobs_npc/npc.lua @@ -1,23 +1,40 @@ -local S = mobs.intllib +-- translation and mod check + +local S = minetest.get_translator("mobs_npc") +local mcl = minetest.get_modpath("mcl_core") ~= nil + +-- right-click drops + +mobs_npc.npc_drops = { + {mcl and "mcl_tools:pick_iron" or "default:pick_steel", 2}, + mcl and "mcl_mobitems:cooked_beef" or "mobs:meat", + {mcl and "mcl_tools:sword_iron" or "default:sword_steel", 2}, + {mcl and "mcl_tools:shovel_iron" or "default:shovel_steel", 2}, + mcl and "mcl_farming:bread" or "farming:bread", + mcl and "mcl_buckets:bucket_water" or "bucket:bucket_water", + mcl and "mcl_core:sapling" or "default:sapling", + mcl and "mcl_core:tree" or "default:tree", + mcl and "mcl_mobitems:leather" or "mobs:leather", + mcl and "mcl_ocean:brain_coral" or "default:coral_orange", + {mcl and "mcl_core:diamond" or "default:mese_crystal_fragment", 3}, + mcl and "mcl_core:clay" or "default:clay", + {mcl and "mcl_signs:wall_sign" or "default:sign_wall", 2}, + mcl and "mcl_core:ladder" or "default:ladder", + mcl and "mcl_copper:raw_copper" or "default:copper_lump", + mcl and "mcl_farming:carrot" or "default:blueberries", + mcl and "mcl_core:birchsapling" or "default:aspen_sapling", + mcl and "mcl_core:frosted_ice" or "default:permafrost_with_moss" +} -- Npc by TenPlus1 -mobs.npc_drops = { - {"default:pick_steel", 2}, "mobs:meat", {"default:sword_steel", 2}, - {"default:shovel_steel", 2}, "farming:bread", "bucket:bucket_water", - "default:sapling", "default:tree", "mobs:leather", "default:coral_orange", - {"default:mese_crystal_fragment", 3}, "default:clay", {"default:sign_wall", 2}, - "default:ladder", "default:copper_lump", "default:blueberries", - "default:aspen_sapling", "default:permafrost_with_moss" -} - mobs:register_mob("mobs_npc:npc", { type = "npc", passive = false, damage = 3, attack_type = "dogfight", - attacks_monsters = true, + attack_monsters = true, attack_npcs = false, owner_loyal = true, pathfinding = true, @@ -32,7 +49,9 @@ mobs:register_mob("mobs_npc:npc", { {"mobs_npc.png"}, {"mobs_npc2.png"}, -- female by nuttmeg20 {"mobs_npc3.png"}, -- male by swagman181818 - {"mobs_npc4.png"} -- female by Sapphire16 + {"mobs_npc4.png"}, -- female by Sapphire16 + {"mobs_npc5.png"}, -- male by Astrobe + {"mobs_npc6.png"} -- female by Astrobe }, child_texture = { {"mobs_npc_baby.png"} -- derpy baby by AmirDerAssassine @@ -43,29 +62,28 @@ mobs:register_mob("mobs_npc:npc", { run_velocity = 3, jump = true, drops = { - {name = "default:wood", chance = 1, min = 1, max = 3}, - {name = "default:apple", chance = 2, min = 1, max = 2}, - {name = "default:axe_stone", chance = 5, min = 1, max = 1} + {name = mcl and "mcl_core:wood" or "default:wood", chance = 1, min = 1, max = 3}, + {name = mcl and "mcl_core:apple" or "default:apple", chance = 2, min = 1, max = 2}, + {name = mcl and "mcl_tools:axe_stone" or "default:axe_stone", chance = 5, min = 1, max = 1} }, water_damage = 0, lava_damage = 2, light_damage = 0, - follow = {"farming:bread", "mobs:meat", "default:diamond"}, + follow = { + mcl and "mcl_farming:bread" or "farming:bread", + mcl and "mcl_mobitems:cooked_beef"or "group:food_meat", --"mobs:meat", + mcl and "mcl_core:diamond" or "default:diamond" + }, view_range = 15, owner = "", - order = "follow", + order = "wander", fear_height = 3, animation = { - speed_normal = 30, - speed_run = 30, - stand_start = 0, - stand_end = 79, - walk_start = 168, - walk_end = 187, - run_start = 168, - run_end = 187, - punch_start = 200, - punch_end = 219 + speed_normal = 30, speed_run = 30, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 187, + run_start = 168, run_end = 187, + punch_start = 189, punch_end = 198 -- was 200 and 219 }, on_rightclick = function(self, clicker) @@ -82,83 +100,59 @@ mobs:register_mob("mobs_npc:npc", { local item = clicker:get_wielded_item() local name = clicker:get_player_name() - -- right clicking with gold lump drops random item from mobs.npc_drops - if item:get_name() == "default:gold_lump" then - - if not mobs.is_creative(name) then - item:take_item() - clicker:set_wielded_item(item) - end - - local pos = self.object:get_pos() - local drops = self.npc_drops or mobs.npc_drops - local drop = drops[math.random(#drops)] - local chance = 1 - - if type(drop) == "table" then - chance = drop[2] - drop = drop[1] - end - - if not minetest.registered_items[drop] - or math.random(chance) > 1 then - drop = "default:clay_lump" - end - - local obj = minetest.add_item(pos, {name = drop}) - local dir = clicker:get_look_dir() - - obj:set_velocity({x = -dir.x, y = 1.5, z = -dir.z}) - - --minetest.chat_send_player(name, S("NPC dropped you an item for gold!")) + -- right clicking with gold lump drops random item from list + if mobs_npc.drop_trade(self, clicker, mcl and "mcl_raw_ores:raw_gold" + or "default:gold_lump", self.npc_drops or mobs_npc.npc_drops) then return end - -- by right-clicking owner can switch npc between follow, wander and stand - if self.owner and self.owner == name then + -- owner can right-click with stick to show control formspec + if item:get_name() == (mcl and "mcl_core:stick" or "default:stick") + and (self.owner == name or + minetest.check_player_privs(clicker, {protection_bypass = true}) )then - if self.order == "follow" then + minetest.show_formspec(name, "mobs_npc:controls", + mobs_npc.get_controls_formspec(name, self)) - self.order = "wander" + return + end - minetest.chat_send_player(name, S("NPC will wander.")) - - elseif self.order == "wander" then - - self.order = "stand" - self.state = "stand" - self.attack = nil - - self:set_animation("stand") - self:set_velocity(0) - - minetest.chat_send_player(name, S("NPC stands still.")) - - elseif self.order == "stand" then - - self.order = "follow" - - minetest.chat_send_player(name, S("NPC will follow you.")) + -- show simple dialog if enabled or idle chatter + if mobs_npc.useDialogs == "Y" then + simple_dialogs.show_dialog_formspec(name, self) + else + if self.state == "attack" then + mobs_npc.npc_talk(self, clicker, {"Grr!", "I'm kinda busy!"}) + else + mobs_npc.npc_talk(self, clicker, { + "Hello", "Hi there", "What a lovely day"}) end end end }) -if not mobs.custom_spawn_npc then -mobs:spawn({ - name = "mobs_npc:npc", - nodes = {"default:brick"}, - neighbors = {"default:grass_3"}, - min_light = 10, - chance = 10000, - active_object_count = 1, - min_height = 0, - day_toggle = true -}) -end +-- spawn egg -mobs:register_egg("mobs_npc:npc", S("Npc"), "default_brick.png", 1) +mobs:register_egg("mobs_npc:npc", S("Npc"), + mcl and "default_stone_brick.png" or "default_brick.png", 1) + +-- compatibility with older mobs mod --- compatibility mobs:alias_mob("mobs:npc", "mobs_npc:npc") + +-- spawn NPC in world + +if not mobs.custom_spawn_npc then + + mobs:spawn({ + name = "mobs_npc:npc", + nodes = {mcl and "mcl_core:stonebrick" or "default:brick"}, + neighbors = {mcl and "mcl_flowers:tallgrass" or "group:grass"}, + min_light = 10, + chance = 10000, + active_object_count = 1, + min_height = 0, + day_toggle = true + }) +end diff --git a/mods/mobs_npc/readme.md b/mods/mobs_npc/readme.md index 43e0d285..a0fba0f3 100644 --- a/mods/mobs_npc/readme.md +++ b/mods/mobs_npc/readme.md @@ -1,15 +1,78 @@ +Minetest mod NPC MOBS +===================== -NPC MOBS +MOBS for simpler NPC and trader + +Information +----------- + +This added simple but working entities NPC or simpler non-player character, and also traders non-player characters. +Check the table names below for eggs or more. + +![](screenshot.png) + +Technical information +--------------------- + +### Downloads + +This version is compatible backguard with 0.4 and also 5.X, can be downloaded from ContentDB or from tenplus1 notabug repos. + +### Eggs for spawns + +| name | internal | Notes | +|------- | ------------- | ----- | +| NPC | mobs_npc:npc | Acts like normal player, just a bot | +| Trader | mobs_npc:trader | Will just trade but does nothing more | +| Igor | mobs_npc:igor | IT also will fight if you attack | + +### NPC + +- While NPC's don't actually spawn in the world just yet, they do have a spawn egg +available to drop him/her into the world and wander around defending himself if attacked. + +- It will also he will help you attack any monsters in the area and will follow you +if you hold a diamond. Right-clicking the NPC with a gold lump will make him drop steel +tools or food, right-clicking with an empty hand orders the NPC to stay or follow if owned. -NPC +### Trader -- While NPC's don't actually spawn in the world just yet, they do have a spawn egg available to drop him/her into the world and wander around defending himself if attacked. It will also he will help you attack any monsters in the area and will follow you if you hold a diamond. Right-clicking the NPC with a gold lump will make him drop steel tools or food, right-clicking with an empty hand orders the NPC to stay or follow if owned. +- Traders are new and still being tested but can be placed into the world using a spawn egg. +Right-clicking on a trader opens his shop and allows you to buy his wares inside. -Trader +- If provoked a trader will attack a player or monster. Note: self.npc_drops and self.igor_drops +are used for random item list when trading for gold and may be changed within the mob itself, +if not found the global mobs.npc_drops and mobs.igor_drops are used instead for a default list. -- Traders are new and still being tested but can be placed into the world using a spawn egg. Right-clicking on a trader opens his shop and allows you to buy his wares inside. If provoked a trader will attack a player or monster. -Note: self.npc_drops and self.igor_drops are used for random item list when trading for gold and may be changed within the mob itself, if not found the global mobs.npc_drops and mobs.igor_drops are used instead for a default list. +### API's -Lucky Blocks: 4 +mobs_npc.drop_trade(self, player, item_to_trade, item_drop_list) + +mobs_npc.npc_talk(self, player, message_list) + +- Note that message_list table overrides self.messages from mob definition. + +mobs_npc.shop_trade(self, player, trader_list[names, items]) + +mobs_npc.add_trader_list(def) + +'def' includes: +- block (block name in front of trader_block to use custom list e.g. "default:coalblock") +- nametag (name of trader e.g. "Larry") +- textures (trader texture list e.g. {"mobs_trader2.png"}) +- item_list (items for trade e.g. { {"default:dirt 5", "default:gold_ingot 2"} }) + + +## Trader Block + +Craft a trader block using 7x stone, 1x diamond block centre, 1x tin block bottom middle) + +Once placed, punch the trader block to spawn a Trader, only one can be spawned at a time, and by placing specific blocks below where the trader appears, custom traders can be created with their own textures, names and special item lists for sale. + + +License +------- + +Check [license.txt](license.txt) file diff --git a/mods/mobs_npc/textures/mobs_igor.png b/mods/mobs_npc/textures/mobs_igor.png index 0d9f9c01..72996f45 100644 Binary files a/mods/mobs_npc/textures/mobs_igor.png and b/mods/mobs_npc/textures/mobs_igor.png differ diff --git a/mods/mobs_npc/textures/mobs_igor2.png b/mods/mobs_npc/textures/mobs_igor2.png index d5762d59..f960a066 100644 Binary files a/mods/mobs_npc/textures/mobs_igor2.png and b/mods/mobs_npc/textures/mobs_igor2.png differ diff --git a/mods/mobs_npc/textures/mobs_igor3.png b/mods/mobs_npc/textures/mobs_igor3.png index e9f71787..38457af4 100644 Binary files a/mods/mobs_npc/textures/mobs_igor3.png and b/mods/mobs_npc/textures/mobs_igor3.png differ diff --git a/mods/mobs_npc/textures/mobs_igor4.png b/mods/mobs_npc/textures/mobs_igor4.png index 8897840f..7641f427 100644 Binary files a/mods/mobs_npc/textures/mobs_igor4.png and b/mods/mobs_npc/textures/mobs_igor4.png differ diff --git a/mods/mobs_npc/textures/mobs_igor5.png b/mods/mobs_npc/textures/mobs_igor5.png index e88d1c73..870bbc9a 100644 Binary files a/mods/mobs_npc/textures/mobs_igor5.png and b/mods/mobs_npc/textures/mobs_igor5.png differ diff --git a/mods/mobs_npc/textures/mobs_igor6.png b/mods/mobs_npc/textures/mobs_igor6.png index ee1da89b..ff0958d7 100644 Binary files a/mods/mobs_npc/textures/mobs_igor6.png and b/mods/mobs_npc/textures/mobs_igor6.png differ diff --git a/mods/mobs_npc/textures/mobs_igor7.png b/mods/mobs_npc/textures/mobs_igor7.png index 8ff77800..031a5288 100644 Binary files a/mods/mobs_npc/textures/mobs_igor7.png and b/mods/mobs_npc/textures/mobs_igor7.png differ diff --git a/mods/mobs_npc/textures/mobs_igor8.png b/mods/mobs_npc/textures/mobs_igor8.png index b30259f6..2b0c45e7 100644 Binary files a/mods/mobs_npc/textures/mobs_igor8.png and b/mods/mobs_npc/textures/mobs_igor8.png differ diff --git a/mods/mobs_npc/textures/mobs_npc.png b/mods/mobs_npc/textures/mobs_npc.png index 93563989..314e488a 100644 Binary files a/mods/mobs_npc/textures/mobs_npc.png and b/mods/mobs_npc/textures/mobs_npc.png differ diff --git a/mods/mobs_npc/textures/mobs_npc2.png b/mods/mobs_npc/textures/mobs_npc2.png index a9d1a2c2..f3f7d9dc 100644 Binary files a/mods/mobs_npc/textures/mobs_npc2.png and b/mods/mobs_npc/textures/mobs_npc2.png differ diff --git a/mods/mobs_npc/textures/mobs_npc3.png b/mods/mobs_npc/textures/mobs_npc3.png index cfe6c02e..a4edd328 100644 Binary files a/mods/mobs_npc/textures/mobs_npc3.png and b/mods/mobs_npc/textures/mobs_npc3.png differ diff --git a/mods/mobs_npc/textures/mobs_npc4.png b/mods/mobs_npc/textures/mobs_npc4.png index e0e89a5c..128232e5 100644 Binary files a/mods/mobs_npc/textures/mobs_npc4.png and b/mods/mobs_npc/textures/mobs_npc4.png differ diff --git a/mods/mobs_npc/textures/mobs_npc5.png b/mods/mobs_npc/textures/mobs_npc5.png new file mode 100644 index 00000000..7930c976 Binary files /dev/null and b/mods/mobs_npc/textures/mobs_npc5.png differ diff --git a/mods/mobs_npc/textures/mobs_npc6.png b/mods/mobs_npc/textures/mobs_npc6.png new file mode 100644 index 00000000..2c741aa1 Binary files /dev/null and b/mods/mobs_npc/textures/mobs_npc6.png differ diff --git a/mods/mobs_npc/textures/mobs_npc_baby.png b/mods/mobs_npc/textures/mobs_npc_baby.png index e26e4501..c60fbef5 100644 Binary files a/mods/mobs_npc/textures/mobs_npc_baby.png and b/mods/mobs_npc/textures/mobs_npc_baby.png differ diff --git a/mods/mobs_npc/textures/mobs_npc_shop_icon.png b/mods/mobs_npc/textures/mobs_npc_shop_icon.png new file mode 100644 index 00000000..42654e58 Binary files /dev/null and b/mods/mobs_npc/textures/mobs_npc_shop_icon.png differ diff --git a/mods/mobs_npc/textures/mobs_trader.png b/mods/mobs_npc/textures/mobs_trader.png index 4c469c98..2447917e 100644 Binary files a/mods/mobs_npc/textures/mobs_trader.png and b/mods/mobs_npc/textures/mobs_trader.png differ diff --git a/mods/mobs_npc/textures/mobs_trader2.png b/mods/mobs_npc/textures/mobs_trader2.png index cbd9b936..6a26b7d7 100644 Binary files a/mods/mobs_npc/textures/mobs_trader2.png and b/mods/mobs_npc/textures/mobs_trader2.png differ diff --git a/mods/mobs_npc/textures/mobs_trader3.png b/mods/mobs_npc/textures/mobs_trader3.png index e6b239ad..79736f59 100644 Binary files a/mods/mobs_npc/textures/mobs_trader3.png and b/mods/mobs_npc/textures/mobs_trader3.png differ diff --git a/mods/mobs_npc/textures/mobs_trader4.png b/mods/mobs_npc/textures/mobs_trader4.png new file mode 100644 index 00000000..d93de958 Binary files /dev/null and b/mods/mobs_npc/textures/mobs_trader4.png differ diff --git a/mods/mobs_npc/trader.lua b/mods/mobs_npc/trader.lua index c7c9679d..68e91bd3 100644 --- a/mods/mobs_npc/trader.lua +++ b/mods/mobs_npc/trader.lua @@ -1,5 +1,7 @@ -local S = mobs.intllib +-- translation and mod check +local S = minetest.get_translator("mobs_npc") +local mcl = minetest.get_modpath("mcl_core") ~= nil -- define table containing names for use and shop items for sale @@ -7,41 +9,60 @@ mobs.human = { names = { "Bob", "Duncan", "Bill", "Tom", "James", "Ian", "Lenny", - "Dylan", "Ethan" + "Dylan", "Ethan", "Sam", "Aubrey" }, items = { --{item for sale, price, chance of appearing in trader's inventory} - {"default:apple 10", "default:gold_ingot 2", 10}, - {"farming:bread 10", "default:gold_ingot 4", 5}, - {"default:clay 10", "default:gold_ingot 2", 12}, - {"default:brick 10", "default:gold_ingot 4", 17}, - {"default:glass 10", "default:gold_ingot 4", 17}, - {"default:obsidian 10", "default:gold_ingot 15", 50}, - {"default:diamond 1", "default:gold_ingot 5", 40}, - {"farming:wheat 10", "default:gold_ingot 2", 17}, - {"default:tree 5", "default:gold_ingot 4", 20}, - {"default:stone 10", "default:gold_ingot 8", 17}, - {"default:desert_stone 10", "default:gold_ingot 8", 27}, - {"default:sapling 1", "default:gold_ingot 1", 7}, - {"default:pick_steel 1", "default:gold_ingot 2", 7}, - {"default:sword_steel 1", "default:gold_ingot 2", 17}, - {"default:shovel_steel 1", "default:gold_ingot 1", 17}, - {"default:cactus 2", "default:gold_ingot 2", 40}, - {"default:papyrus 2", "default:gold_ingot 2", 40}, - {"default:mese_crystal_fragment 1", "default:dirt_with_grass 10", 90}, - {"default:mese_crystal_fragment 1", "default:gold_ingot 5", 90}, + {mcl and "mcl_core:apple 10" or "default:apple 10", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 10}, + {mcl and "mcl_farming:bread 10" or "farming:bread 10", + mcl and "mcl_core:gold_ingot 4" or "default:gold_ingot 4", 5}, + {mcl and "mcl_core:clay 10" or "default:clay 10", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 12}, + {mcl and "mcl_core:stonebrick 10" or "default:brick 10", + mcl and "mcl_core:gold_ingot 4" or "default:gold_ingot 4", 17}, + {mcl and "mcl_core:glass 10" or "default:glass 10", + mcl and "mcl_core:gold_ingot 4" or "default:gold_ingot 4", 17}, + {mcl and "mcl_core:obsidian 10" or "default:obsidian 10", + mcl and "mcl_core:gold_ingot 15" or "default:gold_ingot 15", 50}, + {mcl and "mcl_core:diamond 1" or "default:diamond 1", + mcl and "mcl_core:gold_ingot 5" or "default:gold_ingot 5", 40}, + {mcl and "mcl_farming:wheat_item 10" or "farming:wheat 10", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 17}, + {mcl and "mcl_core:tree 5" or "default:tree 5", + mcl and "mcl_core:gold_ingot 4" or "default:gold_ingot 4", 20}, + {mcl and "mcl_core:stone 10" or "default:stone 10", + mcl and "mcl_core:gold_ingot 8" or "default:gold_ingot 8", 17}, + {mcl and "mcl_core:stonebrick 10" or "default:desert_stone 10", + mcl and "mcl_core:gold_ingot 8" or "default:gold_ingot 8", 27}, + {mcl and "mcl_core:sapling 1" or "default:sapling 1", + mcl and "mcl_core:gold_ingot 1" or "default:gold_ingot 1", 7}, + {mcl and "mcl_tools:pick_iron 1" or "default:pick_steel 1", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 7}, + {mcl and "mcl_tools:sword_iron 1" or "default:sword_steel 1", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 17}, + {mcl and "mcl_tools:shovel_iron 1" or "default:shovel_steel 1", + mcl and "mcl_core:gold_ingot 1" or "default:gold_ingot 1", 17}, + {mcl and "mcl_core:cactus 2" or "default:cactus 2", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 40}, + {mcl and "mcl_core:paper 2" or "default:papyrus 2", + mcl and "mcl_core:gold_ingot 2" or "default:gold_ingot 2", 40}, + {mcl and "mcl_core:iron_nugget 1" or "default:mese_crystal_fragment 1", + mcl and "mcl_core:dirt_with_grass 10" or "default:dirt_with_grass 10", 90}, + {mcl and "mcl_copper:raw_copper 1" or "default:mese_crystal_fragment 1", + mcl and "mcl_core:gold_ingot 5" or "default:gold_ingot 5", 90} } } --- Trader ( same as NPC but with right-click shop ) +-- Trader (same as NPC but with right-click shop) mobs:register_mob("mobs_npc:trader", { type = "npc", passive = false, damage = 3, attack_type = "dogfight", - attacks_monsters = true, + attack_monsters = true, attack_animals = false, attack_npcs = false, pathfinding = false, @@ -55,6 +76,7 @@ mobs:register_mob("mobs_npc:trader", { {"mobs_trader.png"}, -- by Frerin {"mobs_trader2.png"}, {"mobs_trader3.png"}, + {"mobs_trader4.png"} -- female by Astrobe }, makes_footstep_sound = true, sounds = {}, @@ -65,29 +87,56 @@ mobs:register_mob("mobs_npc:trader", { water_damage = 0, lava_damage = 4, light_damage = 0, - follow = {"default:diamond"}, - view_range = 15, + follow = { + mcl and "mcl_farming:bread" or "farming:bread", + mcl and "mcl_mobitems:cooked_beef"or "group:food_meat", --"mobs:meat", + mcl and "mcl_core:diamond" or "default:diamond" + }, + view_range = 7, owner = "", order = "stand", fear_height = 3, animation = { - speed_normal = 30, - speed_run = 30, - stand_start = 0, - stand_end = 79, - walk_start = 168, - walk_end = 187, - run_start = 168, - run_end = 187, - punch_start = 200, - punch_end = 219, + speed_normal = 30, speed_run = 30, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 187, + run_start = 168, run_end = 187, + punch_start = 189, punch_end = 198 -- was 200 and 219 }, + -- stop attacking on right-click and open shop on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, false) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + -- stop trader from moving or attacking self.attack = nil - mobs_trader(self, clicker, mobs.human) + self:set_velocity(0) + self:set_animation("stand") + + -- owner can right-click with stick to show control formspec + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + if item:get_name() == (mcl and "mcl_core:stick" or "default:stick") + and (self.owner == name or + minetest.check_player_privs(clicker, {protection_bypass = true}) )then + + minetest.show_formspec(name, "mobs_npc:controls", + mobs_npc.get_controls_formspec(name, self)) + + return + end + + -- open shop + mobs_npc.shop_trade(self, clicker, mobs.human) end, + -- show that npc is a trader once spawned on_spawn = function(self) self.nametag = S("Trader") @@ -98,207 +147,135 @@ mobs:register_mob("mobs_npc:trader", { }) return true -- return true so on_spawn is run once only - end, + end }) ---This code comes almost exclusively from the trader and inventory of mobf, by Sapier. ---The copyright notice below is from mobf: -------------------------------------------------------------------------------- --- Mob Framework Mod by Sapier --- --- You may copy, use, modify or do nearly anything except removing this --- copyright notice. --- And of course you are NOT allow to pretend you have written it. --- ---! @file inventory.lua ---! @brief component containing mob inventory related functions ---! @copyright Sapier ---! @author Sapier ---! @date 2013-01-02 --- ---! @defgroup Inventory Inventory subcomponent ---! @brief Component handling mob inventory ---! @ingroup framework_int ---! @{ --- --- Contact sapier a t gmx net -------------------------------------------------------------------------------- +-- spawn egg --- This code has been heavily modified by isaiah658. --- Trades are saved in entity metadata so they always stay the same after --- initially being chosen. Also the formspec uses item image buttons instead of --- inventory slots. +mobs:register_egg("mobs_npc:trader", S("Trader"), + mcl and "mcl_core_sandstone_top.png" or "default_sandstone.png", 1) -function mobs.add_goods(self, race) - - local trade_index = 1 - local trades_already_added = {} - local trader_pool_size = 10 - local item_pool_size = #race.items -- get number of items on list - - self.trades = {} - - if item_pool_size < trader_pool_size then - trader_pool_size = item_pool_size - end - - for i = 1, trader_pool_size do - - -- If there are more trades than the amount being added, they are - -- randomly selected. If they are equal, there is no reason to randomly - -- select them - local random_trade = nil - - if item_pool_size == trader_pool_size then - random_trade = i - else - while random_trade == nil do - - local num = math.random(item_pool_size) - - if trades_already_added[num] == nil then - trades_already_added[num] = true - random_trade = num - end - end - end - - if math.random(0, 100) > race.items[random_trade][3] then - - self.trades[trade_index] = { - race.items[random_trade][1], - race.items[random_trade][2] - } - - trade_index = trade_index + 1 - end - end -end - - -function mobs_trader(self, clicker, race) - - if not self.id then - self.id = (math.random(1, 1000) * math.random(1, 10000)) - .. self.name .. (math.random(1, 1000) ^ 2) - end - - if not self.game_name then - - self.game_name = tostring(race.names[math.random(1, #race.names)]) - self.nametag = S("Trader @1", self.game_name) - - self.object:set_properties({ - nametag = self.nametag, - nametag_color = "#00FF00" - }) - end - - if self.trades == nil then - mobs.add_goods(self, race) - end - - local player = clicker:get_player_name() or "" - - minetest.chat_send_player(player, - S("[NPC] Hello, @2, have a look at my wares.", - self.game_name, player)) - - -- Make formspec trade list - local formspec_trade_list = "" - local x, y - - for i = 1, 10 do - - if self.trades[i] and self.trades[i] ~= "" then - - if i < 6 then - x = 0.5 - y = i - 0.5 - else - x = 4.5 - y = i - 5.5 - end - - formspec_trade_list = formspec_trade_list - .. "item_image_button[".. x ..",".. y ..";1,1;" - .. self.trades[i][2] .. ";prices#".. i .."#".. self.id ..";]" - .. "item_image_button[".. x + 2 ..",".. y ..";1,1;" - .. self.trades[i][1] .. ";goods#".. i .."#".. self.id ..";]" - .. "image[".. x + 1 ..",".. y ..";1,1;gui_arrow_blank.png]" - end - end - - minetest.show_formspec(player, "mobs_npc:trade", "size[8,10]" - .. default.gui_bg_img - .. default.gui_slots - .. "label[0.5,-0.1;" .. S("Trader @1's stock:", self.game_name) .. "]" - .. formspec_trade_list - .. "list[current_player;main;0,6;8,4;]" - ) -end - - -minetest.register_on_player_receive_fields(function(player, formname, fields) - - if formname ~= "mobs_npc:trade" then return end - - if fields then - - local trade = "" - - for k, v in pairs(fields) do - trade = tostring(k) - end - - local id = trade:split("#")[3] - local self = nil - - if id ~= nil then - - for k, v in pairs(minetest.luaentities) do - - if v.object and v.id and v.id == id then - self = v - break - end - end - end - - if self ~= nil then - - local trade_number = tonumber(trade:split("#")[2]) - - if trade_number ~= nil and self.trades[trade_number] ~= nil then - - local price = self.trades[trade_number][2] - local goods = self.trades[trade_number][1] - local inv = player:get_inventory() - - if inv:contains_item("main", price) then - - inv:remove_item("main", price) - - local leftover = inv:add_item("main", goods) - - if leftover:get_count() > 0 then - - -- drop item(s) in front of player - local droppos = player:get_pos() - local dir = player:get_look_dir() - - droppos.x = droppos.x + dir.x - droppos.z = droppos.z + dir.z - - minetest.add_item(droppos, leftover) - end - end - end - end - end -end) - -mobs:register_egg("mobs_npc:trader", S("Trader"), "default_sandstone.png", 1) - --- compatibility +-- compatibility with older mobs mod mobs:alias_mob("mobs:trader", "mobs_npc:trader") + +-- make global and add functions and list + +local trader_lists = {} + +mobs_npc.add_trader_list = function(def) + table.insert(trader_lists, def) +end + +mobs_npc.add_trader_list({ + block = mcl and "mcl_core:ironblock" or "default:tinblock", + nametag = "Castro", + textures = {"mobs_trader2.png"}, + item_list = { + {mcl and "mcl_raw_ores:raw_gold 2" or "default:gold_lump 2", + mcl and "mcl_core:gold_ingot 3" or "default:gold_ingot 3"}, + {mcl and "mcl_raw_ores:raw_iron 2" or "default:iron_lump 2", + mcl and "mcl_core:iron_ingot 2" or "default:steel_ingot 2"}, + {mcl and "mcl_copper:raw_copper 2" or "default:copper_lump 2", + mcl and "mcl_copper:copper_ingot 3" or "default:copper_ingot 3"}, + {mcl and "mcl_core:iron_nugget 2" or "default:tin_lump 2", + mcl and "mcl_core:iron_ingot 3" or "default:tin_ingot 3"} + } +}) + +-- helper function + +local function place_trader(pos, node) + + local face = node.param2 + local pos2, def + + -- find which way block is facing + if face == 0 then + pos2 = {x = pos.x, y = pos.y, z = pos.z - 1} + elseif face == 1 then + pos2 = {x = pos.x - 1, y = pos.y, z = pos.z} + elseif face == 2 then + pos2 = {x = pos.x, y = pos.y, z = pos.z + 1} + elseif face == 3 then + pos2 = {x = pos.x + 1, y = pos.y, z = pos.z} + else + return + end + + -- do we already have a trader spawned? + local objs = minetest.get_objects_inside_radius(pos2, 1) + + if objs and #objs > 0 then + return + end + + -- get block below + local bnode = minetest.get_node({x = pos2.x, y = pos2.y - 1, z = pos2.z}) + + pos2.y = pos2.y + 0.5 + + -- add new trader + local obj = minetest.add_entity(pos2, "mobs_npc:trader") + local ent = obj and obj:get_luaentity() + + if not ent then return end -- nil check + + for n = 1, #trader_lists do + + def = trader_lists[n] + + if bnode.name == def.block then + + ent.trades = def.item_list + ent.nametag = def.nametag + ent.game_name = def.nametag + ent.base_texture = def.textures + ent.textures = def.textures + + obj:set_properties({ + textures = ent.textures + }) + + break + end + end + + -- pop sound + minetest.sound_play("default_place_node_hard", { + pos = pos, gain = 1.0, max_hear_distance = 5, pitch = 2.0}, true) +end + +-- trader block (punch to spawn trader) + +minetest.register_node(":mobs:trader_block", { + description = S("Place this and punch to spawn Trader"), + groups = {cracky = 3}, + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "default_stone.png", "default_stone.png", "default_stone.png", + "default_stone.png", "default_stone.png", "default_stone.png^mobs_npc_shop_icon.png" + }, + + -- punch block to spawn trader + on_punch = function(pos, node, puncher, pointed_thing) + place_trader(pos, node) + end, + + on_rotate = screwdriver and screwdriver.rotate_simple, + on_blast = function() end +}) + +-- trader block recipe + +local db = mcl and "mcl_core:diamondblock" or "default:diamondblock" +local tb = mcl and "mcl_core:ironblock" or "default:tinblock" + +minetest.register_craft({ + output = "mobs:trader_block", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", db, "group:stone"}, + {"group:stone", tb, "group:stone"} + } +}) diff --git a/mods/mobs_redo/.luacheckrc b/mods/mobs_redo/.luacheckrc new file mode 100644 index 00000000..65f40a86 --- /dev/null +++ b/mods/mobs_redo/.luacheckrc @@ -0,0 +1,25 @@ +unused_args = false + +read_globals = { + "minetest", + "lucky_block", + "vector", + "table", + "invisibility", + "cmi", + "toolranks", + "pathfinder", + "tnt", + "ItemStack" +} + +globals = { + "mobs", + "player_api", + "default" +} + +ignore = { + "431", -- Shadowing an upvalue + "432", -- Shadowing an upvalue argument +} diff --git a/mods/mobs_redo/api.lua b/mods/mobs_redo/api.lua index 66c7f420..8e2d5e91 100644 --- a/mods/mobs_redo/api.lua +++ b/mods/mobs_redo/api.lua @@ -1,19 +1,36 @@ --- Load support for intllib. -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S = minetest.get_translator and minetest.get_translator("mobs") or - dofile(MP .. "/intllib.lua") --- CMI support check +-- translation and mod checks + +local S = minetest.get_translator("mobs") +local FS = function(...) return minetest.formspec_escape(S(...)) end local use_cmi = minetest.global_exists("cmi") +local use_mc2 = minetest.get_modpath("mcl_core") -- MineClonia support +local use_vh1 = minetest.get_modpath("visual_harm_1ndicators") +local use_tr = minetest.get_modpath("toolranks") +local use_invisibility = minetest.get_modpath("invisibility") + +-- Node check helper + +local function has(nodename) + if nodename and minetest.registered_nodes[nodename] then return nodename end +end + +-- Global table mobs = { mod = "redo", - version = "20220116", - intllib = S, - invis = minetest.global_exists("invisibility") and invisibility or {} + version = "20241219", + spawning_mobs = {}, + translate = S, + node_snow = has(minetest.registered_aliases["mapgen_snow"]) + or has("mcl_core:snow") or has("default:snow") or "air", + node_dirt = has(minetest.registered_aliases["mapgen_dirt"]) + or has("mcl_core:dirt") or has("default:dirt") or "mobs:fallback_node" } +mobs.fallback_node = mobs.node_dirt -- localize common functions + local pi = math.pi local square = math.sqrt local sin = math.sin @@ -25,34 +42,32 @@ local random = math.random local floor = math.floor local ceil = math.ceil local rad = math.rad +local deg = math.deg local atann = math.atan local atan = function(x) - if not x or x ~= x then - return 0 -- NaN - else - return atann(x) - end + if not x or x ~= x then return 0 else return atann(x) end end local table_copy = table.copy local table_remove = table.remove -local vadd = vector.add local vdirection = vector.direction local vmultiply = vector.multiply local vsubtract = vector.subtract local settings = minetest.settings -- creative check + local creative_cache = minetest.settings:get_bool("creative_mode") function mobs.is_creative(name) - return creative_cache or minetest.check_player_privs(name, - {creative = true}) + return creative_cache or minetest.check_player_privs(name, {creative = true}) end -- Load settings + local damage_enabled = settings:get_bool("enable_damage") local mobs_spawn = settings:get_bool("mobs_spawn") ~= false local peaceful_only = settings:get_bool("only_peaceful_mobs") local disable_blood = settings:get_bool("mobs_disable_blood") +local mob_hit_effect = settings:get_bool("mob_hit_effect") local mobs_drop_items = settings:get_bool("mobs_drop_items") ~= false local mobs_griefing = settings:get_bool("mobs_griefing") ~= false local spawn_protected = settings:get_bool("mobs_spawn_protected") ~= false @@ -60,80 +75,97 @@ local spawn_monster_protected = settings:get_bool("mobs_spawn_monster_protected" local remove_far = settings:get_bool("remove_far_mobs") ~= false local mob_area_spawn = settings:get_bool("mob_area_spawn") local difficulty = tonumber(settings:get("mob_difficulty")) or 1.0 -local show_health = settings:get_bool("mob_show_health") ~= false local max_per_block = tonumber(settings:get("max_objects_per_block") or 99) local mob_nospawn_range = tonumber(settings:get("mob_nospawn_range") or 12) -local active_limit = tonumber(settings:get("mob_active_limit") or 0) +local active_limit = tonumber(settings:get("mob_active_limit")) or 0 local mob_chance_multiplier = tonumber(settings:get("mob_chance_multiplier") or 1) local peaceful_player_enabled = settings:get_bool("enable_peaceful_player") local mob_smooth_rotate = settings:get_bool("mob_smooth_rotate") ~= false +local mob_height_fix = settings:get_bool("mob_height_fix") ~= false +local mob_log_spawn = settings:get_bool("mob_log_spawn") == true local active_mobs = 0 +-- loop interval for node and main functions timers +local node_timer_interval = tonumber(settings:get("mob_node_timer_interval") or 0.25) +local main_timer_interval = tonumber(settings:get("mob_main_timer_interval") or 1.0) + +-- pathfinding settings +local pathfinding_enable = settings:get_bool("mob_pathfinding_enable") or true +-- how long before stuck mobs start searching +local pathfinding_stuck_timeout = tonumber( + settings:get("mob_pathfinding_stuck_timeout")) or 3.0 +-- how long will mob follow path before giving up +local pathfinding_stuck_path_timeout = tonumber( + settings:get("mob_pathfinding_stuck_path_timeout")) or 5.0 +-- which algorithm to use, Dijkstra(default) or A*_noprefetch or A* +-- fix settings not allowing "*" +local pathfinding_algorithm = settings:get("mob_pathfinding_algorithm") or "Dijkstra" + +if pathfinding_algorithm == "AStar_noprefetch" then + pathfinding_algorithm = "A*_noprefetch" +elseif pathfinding_algorithm == "AStar" then + pathfinding_algorithm = "A*" +end + +-- max search distance from search positions (default 16) +local pathfinding_searchdistance = tonumber( + settings:get("mob_pathfinding_searchdistance") or 16) +-- max jump height (default 4) +local pathfinding_max_jump = tonumber(settings:get("mob_pathfinding_max_jump") or 4) +-- max drop height (default 6) +local pathfinding_max_drop = tonumber(settings:get("mob_pathfinding_max_drop") or 6) + -- Peaceful mode message so players will know there are no monsters if peaceful_only then minetest.register_on_joinplayer(function(player) minetest.chat_send_player(player:get_player_name(), - S("** Peaceful Mode Active - No Monsters Will Spawn")) + S("** Peaceful Mode Active - No Monsters Will Spawn")) end) end -- calculate aoc range for mob count local aoc_range = tonumber(settings:get("active_block_range")) * 16 --- pathfinding settings -local enable_pathfinding = true -local stuck_timeout = 3 -- how long before stuck mod starts searching -local stuck_path_timeout = 5 -- how long will mob follow path before giving up +-- can we attack Creatura mobs ? +local creatura = minetest.get_modpath("creatura") and + settings:get_bool("mobs_attack_creatura") == true --- default nodes -local node_fire = "fire:basic_flame" -local node_permanent_flame = "fire:permanent_flame" -local node_ice = "default:ice" -local node_snowblock = "default:snowblock" -local node_snow = "default:snow" -mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "default:dirt" +-- default mob settings -local mob_class = { - stepheight = 1.1, +mobs.mob_class = { + state = "stand", fly_in = "air", owner = "", order = "", - jump_height = 4, + jump = true, jump_height = 4, lifetimer = 180, -- 3 minutes - physical = true, - collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, - visual_size = {x = 1, y = 1}, texture_mods = "", - makes_footstep_sound = false, view_range = 5, - walk_velocity = 1, - run_velocity = 2, - light_damage = 0, - light_damage_min = 14, - light_damage_max = 15, + walk_velocity = 1, run_velocity = 2, + light_damage = 0, light_damage_min = 14, light_damage_max = 15, water_damage = 0, lava_damage = 4, fire_damage = 4, air_damage = 0, + node_damage = true, suffocation = 2, - fall_damage = 1, + fall_damage = true, fall_speed = -10, -- must be lower than -2 (default: -10) drops = {}, armor = 100, sounds = {}, - jump = true, knock_back = true, walk_chance = 50, stand_chance = 30, attack_chance = 5, + attack_patience = 11, passive = false, - blood_amount = 5, - blood_texture = "mobs_blood.png", + blood_amount = 5, blood_texture = "mobs_blood.png", shoot_offset = 0, floats = 1, -- floats in water by default replace_offset = 0, timer = 0, - env_damage_timer = 0, -- only used when state = "attack" + env_damage_timer = 0, tamed = false, pause_timer = 0, horny = false, @@ -142,7 +174,6 @@ local mob_class = { gotten = false, health = 0, reach = 3, - htimer = 0, docile_by_day = false, time_of_day = 0.5, fear_height = 0, @@ -151,125 +182,133 @@ local mob_class = { explosion_timer = 3, allow_fuse_reset = true, stop_to_explode = true, - dogshoot_count = 0, - dogshoot_count_max = 5, - dogshoot_count2_max = 5, + dogshoot_count = 0, dogshoot_count_max = 5, dogshoot_count2_max = 5, group_attack = false, attack_monsters = false, attack_animals = false, attack_players = true, attack_npcs = true, + attack_ignore = nil, + friendly_fire = true, facing_fence = false, _breed_countdown = nil, + _tame_countdown = nil, _cmi_is_mob = true } +local mob_class = mobs.mob_class -- Compatibility local mob_class_meta = {__index = mob_class} +-- return True if number of mobs is at limit --- play sound -function mob_class:mob_sound(sound) +local function at_limit() - local pitch = 1.0 - - -- higher pitch for a child - if self.child then pitch = pitch * 1.5 end - - -- a little random pitch to be different - pitch = pitch + random(-10, 10) * 0.005 - - if sound then - minetest.sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = self.sounds.distance, - pitch = pitch - }, true) + if active_limit and active_limit > 0 + and active_mobs and active_mobs >= active_limit then + return true end end +-- play sound + +function mob_class:mob_sound(sound) + + if not sound then return end + + local pitch = self.child and 1.5 or 1.0 -- higher pitch for a child + + pitch = pitch + random(-10, 10) * 0.005 -- little random pitch difference + + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = (self.sounds and self.sounds.distance) or 10, + pitch = pitch + }, true) +end -- attack player/mob -function mob_class:do_attack(player) - if self.state == "attack" then - return - end +function mob_class:do_attack(player, force) + + if self.state == "attack" and not force then return end self.attack = player self.state = "attack" - if random(0, 100) < 90 then - self:mob_sound(self.sounds.war_cry) - end + if random(100) < 90 then self:mob_sound(self.sounds.war_cry) end end - -- calculate distance -local get_distance = function(a, b) - if not a or not b then return 50 end -- nil check +local function get_distance(a, b) + + if not a or not b then return 50 end -- nil check and default distance local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z return square(x * x + y * y + z * z) end +-- are we a real player ? + +local function is_player(player) + + if player and type(player) == "userdata" and minetest.is_player(player) then + return true + end +end -- collision function based on jordan4ibanez' open_ai mod + function mob_class:collision() - local pos = self.object:get_pos() + local pos = self.object:get_pos() ; if not pos then return 0, 0 end local x, z = 0, 0 - local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 + local prop = self.object:get_properties() + local width = -prop.collisionbox[1] + prop.collisionbox[4] + 0.5 - for _,object in ipairs(minetest.get_objects_inside_radius(pos, width)) do + for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do if object:is_player() then local pos2 = object:get_pos() - local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} + local vx, vz = pos.x - pos2.x, pos.z - pos2.z + local force = width - (vx * vx + vz * vz) ^ 0.5 - x = x + vec.x - z = z + vec.z + if force > 0 then + force = force * 2 ; x = x + vx * force ; z = z + vz * force + end end end - return({x, z}) + return x, z end - -- check if string exists in another string or table -local check_for = function(look_for, look_inside) - if type(look_inside) == "string" and look_inside == look_for then +local function check_for(look_for, look_inside) - return true + if type(look_inside) == "string" and look_inside == look_for then return true elseif type(look_inside) == "table" then for _, str in pairs(look_inside) do - if str == look_for then - return true - end + if str == look_for then return true end - if str:find("group:") then + if str and str:find("group:") then - local group = str:split(":")[2] + local group = str:split(":")[2] or "" - if minetest.get_item_group(look_for, group) ~= 0 then - return true - end + if minetest.get_item_group(look_for, group) ~= 0 then return true end end end end - - return false end - -- move mob in facing direction + function mob_class:set_velocity(v) -- halt mob if it has been ordered to stay @@ -285,9 +324,7 @@ function mob_class:set_velocity(v) local c_x, c_y = 0, 0 -- can mob be pushed, if so calculate direction - if self.pushable then - c_x, c_y = unpack(self:collision()) - end + if self.pushable then c_x, c_y = self:collision() end local yaw = (self.object:get_yaw() or 0) + (self.rotate or 0) @@ -299,54 +336,42 @@ function mob_class:set_velocity(v) -- only slow mob trying to move while inside a viscous fluid that -- they aren't meant to be in (fish in water, spiders in cobweb etc) - if v > 0 and visc and visc > 0 - and not check_for(self.standing_in, self.fly_in) then + if v > 0 and visc and visc > 0 and not check_for(self.standing_in, self.fly_in) then v = v / (visc + 1) end -- set velocity - local vel = self.object:get_velocity() or 0 + local vel = self.object:get_velocity() or {y = 0} - local new_vel = { - x = (sin(yaw) * -v) + c_x, - y = vel.y, - z = (cos(yaw) * v) + c_y} - - self.object:set_velocity(new_vel) + self.object:set_velocity({ + x = (sin(yaw) * -v) + c_x, y = vel.y, z = (cos(yaw) * v) + c_y}) end --- global version of above function -function mobs:set_velocity(entity, v) - mob_class.set_velocity(entity, v) -end - - -- calculate mob velocity + function mob_class:get_velocity() - local v = self.object:get_velocity() - - if not v then return 0 end + local v = self.object:get_velocity() ; if not v then return 0 end return (v.x * v.x + v.z * v.z) ^ 0.5 end - -- set and return valid yaw + function mob_class:set_yaw(yaw, delay) - if not yaw or yaw ~= yaw then - yaw = 0 + if not yaw or yaw ~= yaw then yaw = 0 end + + delay = mob_smooth_rotate and delay or 0 + + -- simplified yaw clamp + if yaw > 6.283185 then + yaw = yaw - 6.283185 + elseif yaw < 0 then + yaw = 6.283185 + yaw end - delay = mob_smooth_rotate and (delay or 0) or 0 - - if delay == 0 then - - self.object:set_yaw(yaw) - - return yaw - end + if delay == 0 then self.object:set_yaw(yaw) ; return yaw ; end self.target_yaw = yaw self.delay = delay @@ -354,13 +379,12 @@ function mob_class:set_yaw(yaw, delay) return self.target_yaw end --- global function to set mob yaw -function mobs:yaw(entity, yaw, delay) +function mobs:yaw(entity, yaw, delay) -- [deprecated] mob_class.set_yaw(entity, yaw, delay) end - -- set defined animation + function mob_class:set_animation(anim, force) if not self.animation or not anim then return end @@ -390,7 +414,7 @@ function mob_class:set_animation(anim, force) anim = anim .. (num ~= 0 and num or "") end - if anim == self.animation.current + if (anim == self.animation.current and force ~= true) or not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"] then return @@ -401,147 +425,30 @@ function mob_class:set_animation(anim, force) self.object:set_animation({ x = self.animation[anim .. "_start"], y = self.animation[anim .. "_end"]}, - self.animation[anim .. "_speed"] or - self.animation.speed_normal or 15, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, 0, self.animation[anim .. "_loop"] ~= false) end -function mobs:set_animation(entity, anim) +function mobs:set_animation(entity, anim) -- [deprecated] entity.set_animation(entity, anim) end - --- check line of sight (BrunoMine) -local line_of_sight = function(self, pos1, pos2, stepsize) - - stepsize = stepsize or 1 - - local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then - return true - end - - -- New pos1 to be analyzed - local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - - local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - -- Checks the return - if r == true then return true end - - -- Nodename found - local nn = minetest.get_node(pos).name - - -- Target Distance (td) to travel - local td = get_distance(pos1, pos2) - - -- Actual Distance (ad) traveled - local ad = 0 - - -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'walkable' nodebox. - while minetest.registered_nodes[nn] - and (minetest.registered_nodes[nn].walkable == false) do - - -- Check if you can still move forward - if td < ad + stepsize then - return true -- Reached the target - end - - -- Moves the analyzed pos - local d = get_distance(pos1, pos2) - - npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x - npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y - npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z - - -- NaN checks - if d == 0 - or npos1.x ~= npos1.x - or npos1.y ~= npos1.y - or npos1.z ~= npos1.z then - return false - end - - ad = ad + stepsize - - -- scan again - r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - if r == true then return true end - - -- New Nodename found - nn = minetest.get_node(pos).name - end - - return false -end - - --- check line of sight (by BrunoMine, tweaked by Astrobe) -local new_line_of_sight = function(self, pos1, pos2, stepsize) - - if not pos1 or not pos2 then return end - - stepsize = stepsize or 1 - - local stepv = vmultiply(vdirection(pos1, pos2), stepsize) - - local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then return true end - - -- New pos1 to be analyzed - local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - - local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - -- Checks the return - if r == true then return true end - - -- Nodename found - local nn = minetest.get_node(pos).name - - -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'walkable' nodebox. - while minetest.registered_nodes[nn] - and (minetest.registered_nodes[nn].walkable == false) do - - npos1 = vadd(npos1, stepv) - - if get_distance(npos1, pos2) < stepsize then return true end - - -- scan again - r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - if r == true then return true end - - -- New Nodename found - nn = minetest.get_node(pos).name - end - - return false -end - -- check line of sight using raycasting (thanks Astrobe) -local ray_line_of_sight = function(self, pos1, pos2) - local ray = minetest.raycast(pos1, pos2, true, false) +function mob_class:line_of_sight(pos1, pos2) + + local ray = minetest.raycast(pos1, pos2, true, false) -- ignore entities local thing = ray:next() + local name, nodedef - while thing do -- thing.type, thing.ref + while thing do if thing.type == "node" then - local name = minetest.get_node(thing.under).name + name = minetest.get_node(thing.under).name + nodedef = minetest.registered_items[name] - if minetest.registered_items[name] - and minetest.registered_items[name].walkable then - return false - end + if nodedef and nodedef.walkable then return false end end thing = ray:next() @@ -550,55 +457,42 @@ local ray_line_of_sight = function(self, pos1, pos2) return true end - -function mob_class:line_of_sight(pos1, pos2, stepsize) - - if minetest.raycast then -- only use if minetest 5.0 is detected - return ray_line_of_sight(self, pos1, pos2) - end - - return line_of_sight(self, pos1, pos2, stepsize) -end - --- global function -function mobs:line_of_sight(entity, pos1, pos2, stepsize) - return entity:line_of_sight(pos1, pos2, stepsize) +function mobs:line_of_sight(entity, pos1, pos2) -- [deprecated] + return entity:line_of_sight(pos1, pos2) end +-- if mob not flying in medium it's suppose to, try and find some to return to function mob_class:attempt_flight_correction(override) if self:flight_check() and override ~= true then return true end - -- We are not flying in what we are supposed to. - -- See if we can find intended flight medium and return to it local pos = self.object:get_pos() ; if not pos then return true end - local searchnodes = self.fly_in - - if type(searchnodes) == "string" then - searchnodes = {self.fly_in} - end - local flyable_nodes = minetest.find_nodes_in_area( - {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, - {x = pos.x + 1, y = pos.y + 0, z = pos.z + 1}, searchnodes) - -- pos.y + 0 hopefully fixes floating swimmers + {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, self.fly_in) - if #flyable_nodes < 1 then - return false - end + if #flyable_nodes == 0 then return false end local escape_target = flyable_nodes[random(#flyable_nodes)] + + -- stop swimming mobs moving above water surface + if escape_target.y > pos.y and #minetest.find_nodes_in_area( + {x = escape_target.x, y = escape_target.y + 1, z = escape_target.z}, + {x = escape_target.x, y = escape_target.y + 1, z = escape_target.z}, + self.fly_in) == 0 then + escape_target.y = pos.y + end + local escape_direction = vdirection(pos, escape_target) - self.object:set_velocity( - vmultiply(escape_direction, 1)) + self.object:set_velocity(vmultiply(escape_direction, 1)) return true end - -- are we flying in what we are suppose to? (taikedz) + function mob_class:flight_check() local def = minetest.registered_nodes[self.standing_in] @@ -606,23 +500,18 @@ function mob_class:flight_check() if not def then return false end -- are we standing inside what we should be to fly/swim ? - if check_for(self.standing_in, self.fly_in) then - return true - end + if check_for(self.standing_in, self.fly_in) then return true end -- stops mobs getting stuck inside stairs and plantlike nodes - if def.drawtype ~= "airlike" - and def.drawtype ~= "liquid" + if def.drawtype ~= "airlike" and def.drawtype ~= "liquid" and def.drawtype ~= "flowingliquid" then return true end - - return false end - -- turn mob to face position -local yaw_to_pos = function(self, target, rot) + +function mob_class:yaw_to_pos(target, rot) rot = rot or 0 @@ -630,21 +519,17 @@ local yaw_to_pos = function(self, target, rot) local vec = {x = target.x - pos.x, z = target.z - pos.z} local yaw = (atan(vec.z / vec.x) + rot + pi / 2) - self.rotate - if target.x > pos.x then - yaw = yaw + pi - end + if target.x > pos.x then yaw = yaw + pi end - yaw = self:set_yaw(yaw, rot) - - return yaw + return self:set_yaw(yaw, rot) end -function mobs:yaw_to_pos(self, target, rot) - return yaw_to_pos(self, target, rot) +function mobs:yaw_to_pos(self, target, rot) -- [deprecated] + return self:yaw_to_pos(target, rot) end - -- if stay near set then periodically check for nodes and turn towards them + function mob_class:do_stay_near() if not self.stay_near then return false end @@ -653,131 +538,132 @@ function mob_class:do_stay_near() local searchnodes = self.stay_near[1] local chance = self.stay_near[2] or 10 - if not pos or random(chance) > 1 then - return false - end + if not pos or random(chance) > 1 then return false end - if type(searchnodes) == "string" then - searchnodes = {self.stay_near[1]} - end + if type(searchnodes) == "string" then searchnodes = {self.stay_near[1]} end local r = self.view_range local nearby_nodes = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, - {x = pos.x + r, y = pos.y + 1, z = pos.z + r}, searchnodes) + {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, + {x = pos.x + r, y = pos.y + 1, z = pos.z + r}, searchnodes) - if #nearby_nodes < 1 then - return false - end - - yaw_to_pos(self, nearby_nodes[random(#nearby_nodes)]) + if #nearby_nodes < 1 then return false end + self:yaw_to_pos(nearby_nodes[random(#nearby_nodes)]) self:set_animation("walk") - self:set_velocity(self.walk_velocity) return true end - -- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, - radius, gravity, glow, fall) + +local function effect(pos, amount, texture, min_size, max_size, radius, grav, glow, fall) radius = radius or 2 - min_size = min_size or 0.5 - max_size = max_size or 1 - gravity = gravity or -10 - glow = glow or 0 - - if fall == true then - fall = 0 - elseif fall == false then - fall = radius - else - fall = -radius - end + grav = grav or -10 + fall = fall == true and 0 or fall == false and radius or -radius minetest.add_particlespawner({ amount = amount, time = 0.25, - minpos = pos, - maxpos = pos, + minpos = pos, maxpos = pos, minvel = {x = -radius, y = fall, z = -radius}, maxvel = {x = radius, y = radius, z = radius}, - minacc = {x = 0, y = gravity, z = 0}, - maxacc = {x = 0, y = gravity, z = 0}, - minexptime = 0.1, - maxexptime = 1, - minsize = min_size, - maxsize = max_size, + minacc = {x = 0, y = grav, z = 0}, + maxacc = {x = 0, y = grav, z = 0}, + minexptime = 0.1, maxexptime = 1, + minsize = min_size or 0.5, maxsize = max_size or 1, texture = texture, - glow = glow + glow = glow or 0 }) end -function mobs:effect(pos, amount, texture, min_size, max_size, - radius, gravity, glow, fall) - - effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, fall) +function mobs:effect(pos, amount, texture, min_size, max_size, radius, grav, glow, fall) + effect(pos, amount, texture, min_size, max_size, radius, grav, glow, fall) end - --- Thanks Wuzzy for the following editable settings +-- Thanks Wuzzy for the editable settings local HORNY_TIME = 30 local HORNY_AGAIN_TIME = 60 * 5 -- 5 minutes local CHILD_GROW_TIME = 60 * 20 -- 20 minutes +-- update nametag and infotext --- update nametag colour -function mob_class:update_tag() +function mob_class:update_tag(newname) - local col = "#00FF00" - local qua = self.hp_max / 4 + local col + local prop = self.object:get_properties() + local qua = prop.hp_max / 6 + local old_nametag = prop.nametag + local old_nametag_color = self.nametag_col - if self.health <= floor(qua * 3) then - col = "#FFFF00" + -- backwards compatibility + if self.nametag and self.nametag ~= "" then + newname = self.nametag + self.nametag = nil end - if self.health <= floor(qua * 2) then - col = "#FF6600" - end + if newname or (self._nametag and self._nametag ~= "") then - if self.health <= floor(qua) then - col = "#FF0000" + self._nametag = newname or self._nametag -- adopt new name if one found + + -- choose tag colour depending on mob health + if self.health <= qua then + self.nametag_col = "#FF0000" + elseif self.health <= (qua * 2) then + self.nametag_col = "#FF7A00" + elseif self.health <= (qua * 3) then + self.nametag_col = "#FFB500" + elseif self.health <= (qua * 4) then + self.nametag_col = "#FFFF00" + elseif self.health <= (qua * 5) then + self.nametag_col = "#B4FF00" + elseif self.health > (qua * 5) then + self.nametag_col = "#00FF00" + end + + if self._nametag ~= old_nametag or self.nametag_col ~= old_nametag_color then + + self.object:set_properties({ + nametag = self._nametag, nametag_color = self.nametag_col}) + end end local text = "" - if self.horny == true then - + if self.horny then text = "\nLoving: " .. (self.hornytimer - (HORNY_TIME + HORNY_AGAIN_TIME)) - - elseif self.child == true then - + elseif self.child then text = "\nGrowing: " .. (self.hornytimer - CHILD_GROW_TIME) - + elseif self._tame_countdown then + text = "\nTaming: " .. self._tame_countdown elseif self._breed_countdown then - text = "\nBreeding: " .. self._breed_countdown - end - self.infotext = "Health: " .. self.health .. " / " .. self.hp_max - .. "\n" .. "Owner: " .. self.owner - .. text + if self.protected then - -- set changes - self.object:set_properties({ - nametag = self.nametag, - nametag_color = col, - infotext = self.infotext - }) + if self.protected == 2 then + text = text .. "\nProtection: Level 2" + else + text = text .. "\nProtection: Level 1" + end + end + + self.infotext = "Entity: " .. self.name .. " | Type: " .. self.type + .. ("\nHealth: " .. self.health .. " / " .. prop.hp_max) + .. (self.owner == "" and "" or "\nOwner: " .. self.owner) .. text + + -- set infotext changes + if self.infotext ~= prop.infotext then + self.object:set_properties({infotext = self.infotext}) + end end - -- drop items + function mob_class:item_drop() -- no drops if disabled by setting or mob is child @@ -786,18 +672,31 @@ function mob_class:item_drop() local pos = self.object:get_pos() -- check for drops function - self.drops = type(self.drops) == "function" - and self.drops(pos) or self.drops + self.drops = type(self.drops) == "function" and self.drops(pos) or self.drops -- check for nil or no drops - if not self.drops or #self.drops == 0 then - return - end + if not self.drops or #self.drops == 0 then return end -- was mob killed by player? - local death_by_player = self.cause_of_death - and self.cause_of_death.puncher - and self.cause_of_death.puncher:is_player() + local death_by_player = self.cause_of_death and self.cause_of_death.puncher + and is_player(self.cause_of_death.puncher) + + -- check for tool 'looting_level' under tool_capabilities as default, or use + -- meta string 'looting_level' if found (max looting level is 3). + local looting = 0 + + if death_by_player then + + local wield_stack = self.cause_of_death.puncher:get_wielded_item() + local wield_name = wield_stack:get_name() + local wield_stack_meta = wield_stack:get_meta() + local item_def = minetest.registered_items[wield_name] + local item_looting = item_def and item_def.tool_capabilities and + item_def.tool_capabilities.looting_level or 0 + + looting = tonumber(wield_stack_meta:get_string("looting_level")) or item_looting + looting = min(looting, 3) + end local obj, item, num @@ -811,8 +710,8 @@ function mob_class:item_drop() -- cook items on a hot death if self.cause_of_death.hot then - local output = minetest.get_craft_result({ - method = "cooking", width = 1, items = {item}}) + local output = minetest.get_craft_result( + {method = "cooking", width = 1, items = {item}}) if output and output.item and not output.item:is_empty() then item = output.item:get_name() @@ -821,16 +720,13 @@ function mob_class:item_drop() -- only drop rare items (drops.min = 0) if killed by player if death_by_player or self.drops[n].min ~= 0 then - obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + obj = minetest.add_item(pos, ItemStack(item .. " " .. (num + looting))) end if obj and obj:get_luaentity() then obj:set_velocity({ - x = random(-10, 10) / 9, - y = 6, - z = random(-10, 10) / 9 - }) + x = random(-10, 10) / 9, y = 6, z = random(-10, 10) / 9}) elseif obj then obj:remove() -- item does not exist @@ -841,119 +737,112 @@ function mob_class:item_drop() self.drops = {} end - -- remove mob and descrease counter -local remove_mob = function(self, decrease) + +local function remove_mob(self, decrease) self.object:remove() - if decrease and active_limit > 0 then - + if decrease and active_limit and active_limit > 1 then active_mobs = active_mobs - 1 - - if active_mobs < 0 then - active_mobs = 0 - end - end --print("-- active mobs: " .. active_mobs .. " / " .. active_limit) + end end --- global function for removing mobs function mobs:remove(self, decrease) remove_mob(self, decrease) end - -- check if mob is dead or only hurt + function mob_class:check_for_death(cmi_cause) -- We dead already - if self.state == "die" then - return true - end + if self.state == "die" then return true end -- has health actually changed? - if self.health == self.old_health and self.health > 0 then - return false - end + if self.health == self.old_health and self.health > 0 then return false end local damaged = self.health < self.old_health + local prop = self.object:get_properties() self.old_health = self.health - -- still got some health? play hurt sound + if use_vh1 then VH1.update_bar(self.object, self.health) end + if self.health > 0 then -- only play hurt sound if damaged - if damaged then - self:mob_sound(self.sounds.damage) - end + if damaged then self:mob_sound(self.sounds.damage) end -- make sure health isn't higher than max - if self.health > self.hp_max then - self.health = self.hp_max - end + if self.health > prop.hp_max then self.health = prop.hp_max end - -- backup nametag so we can show health stats --- if not self.nametag2 then --- self.nametag2 = self.nametag or "" --- end - --- if show_health --- and (cmi_cause and cmi_cause.type == "punch") then - --- self.htimer = 2 --- self.nametag = "♥ " .. self.health .. " / " .. self.hp_max - self:update_tag() --- end + self:update_tag() return false end self.cause_of_death = cmi_cause - -- drop items + -- drop items and play death sound self:item_drop() - self:mob_sound(self.sounds.death) local pos = self.object:get_pos() - -- execute custom death function - if pos and self.on_die then + -- execute official engine on_death function if found + if self.on_death then - self:on_die(pos) - - if use_cmi then - cmi.notify_die(self.object, cmi_cause) + -- only return killer if punched by player + if cmi_cause.type == "punch" and is_player(cmi_cause.puncher) then + cmi_cause = cmi_cause.puncher + else + cmi_cause = nil end + self:on_death(cmi_cause) + remove_mob(self, true) return true end + -- execute custom death function + if pos and self.on_die then + + self:on_die(pos) + + if use_cmi then cmi.notify_die(self.object, cmi_cause) end + + remove_mob(self, true) + + return true + end + + -- reset vars and set state + self.attack = nil + self.following = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.passive = true + self.state = "die" + self.fly = false + -- check for custom death function and die animation - if self.animation - and self.animation.die_start - and self.animation.die_end then + if self.animation and self.animation.die_start and self.animation.die_end then local frames = self.animation.die_end - self.animation.die_start local speed = self.animation.die_speed or 15 local length = max((frames / speed), 0) local rot = self.animation.die_rotate and 5 - self.attack = nil - self.following = nil - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.passive = true - self.state = "die" self.object:set_properties({ pointable = false, collide_with_objects = false, automatic_rotate = rot, static_save = false }) + self:set_velocity(0) self:set_animation("die") @@ -961,9 +850,7 @@ function mob_class:check_for_death(cmi_cause) if self.object:get_luaentity() then - if use_cmi then - cmi.notify_die(self.object, cmi_cause) - end + if use_cmi then cmi.notify_die(self.object, cmi_cause) end remove_mob(self, true) end @@ -971,11 +858,9 @@ function mob_class:check_for_death(cmi_cause) return true - elseif pos then -- otherwise remove mod and show particle effect + elseif pos then -- otherwise remove mob and show particle effect - if use_cmi then - cmi.notify_die(self.object, cmi_cause) - end + if use_cmi then cmi.notify_die(self.object, cmi_cause) end remove_mob(self, true) @@ -985,110 +870,105 @@ function mob_class:check_for_death(cmi_cause) return true end - -- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - fallback = fallback or mobs.fallback_node +local function node_ok(pos, fallback) local node = minetest.get_node_or_nil(pos) - if node and minetest.registered_nodes[node.name] then - return node - end + if node and minetest.registered_nodes[node.name] then return node end - return minetest.registered_nodes[fallback] + return minetest.registered_nodes[(fallback or mobs.fallback_node)] end +function mobs:node_ok(pos, fallback) + return node_ok(pos, fallback) +end + +-- Returns true if node can deal damage to self + +local function is_node_dangerous(self, nodename) + + local def = minetest.registered_nodes[nodename] + + if (self.water_damage and def.groups.water) + or (self.lava_damage and def.groups.lava) + or (self.fire_damage and def.groups.fire) then return true end + + if self.node_damage and def.damage_per_second > 0 then + + -- check for node immunity or special damage + local damage = def.damage_per_second + + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == nodename then + damage = self.immune_to[n][2] or 0 ; break + end + end + + if damage > 0 then return true end + end +end --- Returns true is node can deal damage to self function mobs:is_node_dangerous(mob_object, nodename) - - if mob_object.water_damage > 0 - and minetest.get_item_group(nodename, "water") ~= 0 then - return true - end - - if mob_object.lava_damage > 0 - and minetest.get_item_group(nodename, "lava") ~= 0 then - return true - end - - if mob_object.fire_damage > 0 - and minetest.get_item_group(nodename, "fire") ~= 0 then - return true - end - - if minetest.registered_nodes[nodename].damage_per_second > 0 then - return true - end - - return false + return is_node_dangerous(mob_object, nodename) end -local function is_node_dangerous(mob_object, nodename) - return mobs:is_node_dangerous(mob_object, nodename) -end - - -- is mob facing a cliff + function mob_class:is_at_cliff() - if self.fear_height == 0 then -- 0 for no falling protection! + if self.driver or self.fear_height == 0 then -- 0 for no falling protection! return false end -- get yaw but if nil returned object no longer exists - local yaw = self.object:get_yaw() - - if not yaw then return false end - - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local yaw = self.object:get_yaw() ; if not yaw then return false end + local prop = self.object:get_properties() + local dir_x = -sin(yaw) * (prop.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (prop.collisionbox[4] + 0.5) local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor + local ypos = pos.y + prop.collisionbox[2] -- just above floor local free_fall, blocker = minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) -- check for straight drop - if free_fall then - return true - end + if free_fall then return true end - local bnode = node_ok(blocker) + local bnode = node_ok(blocker, "air") -- will we drop onto dangerous node? - if is_node_dangerous(self, bnode.name) then - return true - end + if is_node_dangerous(self, bnode.name) then return true end local def = minetest.registered_nodes[bnode.name] return (not def and def.walkable) end +-- check for nodes or groups inside mob collision area + +function mob_class:is_inside(itemtable) + + local cb = self.object:get_properties().collisionbox + local pos = self.object:get_pos() + local nn = minetest.find_nodes_in_area( + vector.offset(pos, cb[1], cb[2], cb[3]), + vector.offset(pos, cb[4], cb[5], cb[6]), itemtable) + + if nn and #nn > 0 then return true end +end -- environmental damage (water, lava, fire, light etc.) + function mob_class:do_env_damage() - -- feed/tame text timer (so mob 'full' messages dont spam chat) - if self.htimer > 0 then - self.htimer = self.htimer - 1 - end - - -- reset nametag after showing health stats --- if self.htimer < 1 and self.nametag2 then - --- self.nametag = self.nametag2 --- self.nametag2 = nil - - self:update_tag() --- end - local pos = self.object:get_pos() ; if not pos then return end + self:update_tag() + self.time_of_day = minetest.get_timeofday() -- halt mob if standing inside ignore node @@ -1099,16 +979,11 @@ function mob_class:do_env_damage() return true end - -- particle appears at random mob height - local py = { - x = pos.x, - y = pos.y + random(self.collisionbox[2], self.collisionbox[5]), - z = pos.z - } - + local prop = self.object:get_properties() + local py = {x = pos.x, y = pos.y + prop.collisionbox[5], z = pos.z} local nodef = minetest.registered_nodes[self.standing_in] - -- water + -- water damage if self.water_damage ~= 0 and nodef.groups.water then self.health = self.health - self.water_damage @@ -1116,46 +991,51 @@ function mob_class:do_env_damage() effect(py, 5, "bubble.png", nil, nil, 1, nil) if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then - return true - end + pos = pos, node = self.standing_in}) then return true end + end -- lava damage - elseif self.lava_damage ~= 0 and nodef.groups.lava then + if self.lava_damage ~= 0 and nodef.groups.lava then self.health = self.health - self.lava_damage effect(py, 15, "fire_basic_flame.png", 1, 5, 1, 0.2, 15, true) if self:check_for_death({type = "environment", pos = pos, - node = self.standing_in, hot = true}) then - return true - end + node = self.standing_in, hot = true}) then return true end + end -- fire damage - elseif self.fire_damage ~= 0 and nodef.groups.fire then + if self.fire_damage ~= 0 and nodef.groups.fire then self.health = self.health - self.fire_damage effect(py, 15, "fire_basic_flame.png", 1, 5, 1, 0.2, 15, true) if self:check_for_death({type = "environment", pos = pos, - node = self.standing_in, hot = true}) then - return true - end + node = self.standing_in, hot = true}) then return true end + end -- damage_per_second node check (not fire and lava) - elseif nodef.damage_per_second ~= 0 + if self.node_damage and nodef.damage_per_second and nodef.damage_per_second ~= 0 and nodef.groups.lava == nil and nodef.groups.fire == nil then - self.health = self.health - nodef.damage_per_second + local damage = nodef.damage_per_second - effect(py, 5, "tnt_smoke.png") + -- check for node immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == self.standing_in then + damage = self.immune_to[n][2] or 0 ; break + end + end + + self.health = self.health - damage + + if damage > 0 then effect(py, 5, "tnt_smoke.png") end if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then - return true - end + pos = pos, node = self.standing_in}) then return true end end -- air damage @@ -1166,15 +1046,20 @@ function mob_class:do_env_damage() effect(py, 3, "bubble.png", 1, 1, 1, 0.2) if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then - return true - end + pos = pos, node = self.standing_in}) then return true end end - -- is mob light sensative, or scared of the dark :P + -- is mob light sensitive, or scared of the dark :P if self.light_damage ~= 0 then - local light = minetest.get_node_light(pos) or 0 + local light + + -- if max set to 16 then only kill mob with natural sunlight + if self.light_damage_max == 16 then + light = minetest.get_natural_light(pos) or 0 + else + light = minetest.get_node_light(pos) or 0 + end if light >= self.light_damage_min and light <= self.light_damage_max then @@ -1183,125 +1068,79 @@ function mob_class:do_env_damage() effect(py, 5, "tnt_smoke.png") - if self:check_for_death({type = "light"}) then - return true - end + if self:check_for_death({type = "light"}) then return true end end end --- suffocation inside solid node if (self.suffocation and self.suffocation ~= 0) - and (nodef.walkable == nil or nodef.walkable == true) + and (nodef.walkable == nil or nodef.walkable) and (nodef.collision_box == nil or nodef.collision_box.type == "regular") and (nodef.node_box == nil or nodef.node_box.type == "regular") and (nodef.groups.disable_suffocation ~= 1) then local damage - if self.suffocation == true then + if type(self.suffocation) == "boolean" and self.suffocation then damage = 2 else - damage = (self.suffocation or 2) + damage = self.suffocation end self.health = self.health - damage if self:check_for_death({type = "suffocation", - pos = pos, node = self.standing_in}) then - return true - end + pos = pos, node = self.standing_in}) then return true end + + -- try to jump out of block + self.object:set_velocity({x = 0, y = self.jump_height, z = 0}) end return self:check_for_death({type = "unknown"}) end +-- jump if facing a solid node that isn't a fences or gate --- jump if facing a solid node (not fences or gates) function mob_class:do_jump() - if not self.jump - or self.jump_height == 0 - or self.fly - or self.child - or self.order == "stand" then - return false - end + local vel = self.object:get_velocity() ; if not vel then return false end - self.facing_fence = false - - -- something stopping us while moving? - if self.state ~= "stand" - and self:get_velocity() > 0.5 - and self.object:get_velocity().y ~= 0 then - return false - end - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - - -- sanity check - if not yaw then return false end + -- don't jump if ordered to stand or already in mid-air + if self.state == "stand" or vel.y ~= 0 then return false end -- we can only jump if standing on solid node if minetest.registered_nodes[self.standing_on].walkable == false then return false end - -- where is front - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + -- is there anything stopping us from jumping up onto a block? + local blocked = minetest.registered_nodes[self.looking_above].walkable - -- set y_pos to base of mob - pos.y = pos.y + self.collisionbox[2] + -- if mob can leap then remove blockages and let them try + if self.can_leap then blocked = false ; self.facing_fence = false end - -- what is in front of mob? - local nod = node_ok({ - x = pos.x + dir_x, y = pos.y + 0.5, z = pos.z + dir_z - }) + -- jump if possible + if self.jump and self.jump_height > 0 and not self.fly and not self.child + and self.order ~= "stand" + and (self.walk_chance == 0 or minetest.registered_items[self.looking_at].walkable) + and not blocked + and not self.facing_fence + and self.looking_at ~= mobs.node_snow then - -- what is above and in front? - local nodt = node_ok({ - x = pos.x + dir_x, y = pos.y + 1.5, z = pos.z + dir_z - }) + vel.y = self.jump_height - local blocked = minetest.registered_nodes[nodt.name].walkable + self:set_animation("jump") -- only if defined - -- are we facing a fence or wall - if nod.name:find("fence") or nod.name:find("gate") or nod.name:find("wall") then - self.facing_fence = true - end ---[[ -print("on: " .. self.standing_on - .. ", front: " .. nod.name - .. ", front above: " .. nodt.name - .. ", blocked: " .. (blocked and "yes" or "no") - .. ", fence: " .. (self.facing_fence and "yes" or "no") -) -]] - -- jump if standing on solid node (not snow) and not blocked - if (self.walk_chance == 0 or minetest.registered_items[nod.name].walkable) - and not blocked and not self.facing_fence and nod.name ~= node_snow then - - local v = self.object:get_velocity() - - v.y = self.jump_height - - self:set_animation("jump") -- only when defined - - self.object:set_velocity(v) + self.object:set_velocity(vel) -- when in air move forward - minetest.after(0.3, function(self, v) + minetest.after(0.3, function(self, vel) if self.object:get_luaentity() then - self.object:set_acceleration({ - x = v.x * 2, - y = 0, - z = v.z * 2 - }) + self.object:set_acceleration({x = vel.x * 2, y = 0, z = vel.z * 2}) end - end, self, v) + end, self, vel) if self:get_velocity() > 0 then self:mob_sound(self.sounds.jump) @@ -1322,18 +1161,16 @@ print("on: " .. self.standing_on local yaw = self.object:get_yaw() or 0 local turn = random(0, 2) + 1.35 - yaw = self:set_yaw(yaw + turn, 12) + self:set_yaw(yaw + turn, 12) self.jump_count = 0 end end - - return false end - -- blast damage to entities nearby (modified from TNT mod) -local entity_physics = function(pos, radius) + +local function entity_physics(pos, radius) radius = radius * 2 @@ -1344,54 +1181,48 @@ local entity_physics = function(pos, radius) obj_pos = objs[n]:get_pos() - dist = get_distance(pos, obj_pos) - - if dist < 1 then dist = 1 end + dist = max(1, get_distance(pos, obj_pos)) local damage = floor((4 / dist) * radius) - local ent = objs[n]:get_luaentity() -- punches work on entities AND players - objs[n]:punch(objs[n], 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, pos) + objs[n]:punch(objs[n], 1.0, + {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, pos) end end - -- can mob see player -local is_invisible = function(self, player_name) - if mobs.invis[player_name] and not self.ignore_invisibility then +local function is_invisible(self, player_name) + + if use_invisibility and not self.ignore_invisibility + and invisibility.is_visible and not invisibility.is_visible(player_name) then return true end end +function mobs:is_invisible(self, player_name) + return is_invisible(self, player_name) +end -- should mob follow what I'm holding ? + function mob_class:follow_holding(clicker) - if is_invisible(self, clicker:get_player_name()) then - return false - end + if is_invisible(self, clicker:get_player_name()) then return false end local item = clicker:get_wielded_item() -- are we holding an item mob can follow ? - if check_for(item:get_name(), self.follow) then - return true - end - - return false + if check_for(item:get_name(), self.follow) then return true end end - -- find two animals of same type and breed if nearby and horny + function mob_class:breed() -- child takes a long time before growing into adult - if self.child == true then + if self.child then self.hornytimer = self.hornytimer + 1 @@ -1400,6 +1231,12 @@ function mob_class:breed() self.child = false self.hornytimer = 0 + -- replace child texture with adult one + if self.mommy_tex then + self.base_texture = self.mommy_tex + self.mommy_tex = nil + end + self.object:set_properties({ textures = self.base_texture, mesh = self.base_mesh, @@ -1409,18 +1246,17 @@ function mob_class:breed() }) -- custom function when child grows up - if self.on_grown then - self.on_grown(self) + if self.on_grown then self.on_grown(self) else local pos = self.object:get_pos() ; if not pos then return end - local ent = self.object:get_luaentity() + local prop = self.object:get_properties() - pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 + pos.y = pos.y + (prop.collisionbox[2] * -1) + 0.1 self.object:set_pos(pos) -- jump slightly when fully grown so as not to fall into ground - self.object:set_velocity({x = 0, y = 0.5, z = 0 }) + self.object:set_velocity({x = 0, y = 2, z = 0 }) end end @@ -1429,8 +1265,7 @@ function mob_class:breed() -- horny animal can mate for HORNY_TIME seconds, -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds - if self.horny == true - and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then + if self.horny and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then self.hornytimer = self.hornytimer + 1 @@ -1443,13 +1278,13 @@ function mob_class:breed() end -- find another same animal who is also horny and mate if nearby - if self.horny == true - and self.hornytimer <= HORNY_TIME then + if self.horny and self.hornytimer <= HORNY_TIME then local pos = self.object:get_pos() + local prop = self.object:get_properties().collisionbox - effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, - "heart.png", 3, 4, 1, 0.1) + effect({x = pos.x, y = pos.y + prop[5], z = pos.z}, 8, + "heart.png", 3, 4, 1, 0.1, 1, true) local objs = minetest.get_objects_inside_radius(pos, 3) local ent @@ -1463,34 +1298,30 @@ function mob_class:breed() if ent then - if ent.name == self.name then - canmate = true + if ent.name == self.name then canmate = true else local entname = ent.name:split(":") local selfname = self.name:split(":") if entname[1] == selfname[1] then + entname = entname[2]:split("_") selfname = selfname[2]:split("_") - if entname[1] == selfname[1] then - canmate = true - end + if entname[1] == selfname[1] then canmate = true end end end end -- found another similar horny animal that isn't self? - if ent and ent.object ~= self.object - and canmate == true - and ent.horny == true - and ent.hornytimer <= HORNY_TIME then + if ent and ent.object ~= self.object and canmate + and ent.horny and ent.hornytimer <= HORNY_TIME then local pos2 = ent.object:get_pos() -- Have mobs face one another - yaw_to_pos(self, pos2) - yaw_to_pos(ent, self.object:get_pos()) + self:yaw_to_pos(pos2) + ent:yaw_to_pos(self.object:get_pos()) self.hornytimer = HORNY_TIME + 1 ent.hornytimer = HORNY_TIME + 1 @@ -1498,71 +1329,47 @@ function mob_class:breed() self:update_tag() -- have we reached active mob limit - if active_limit > 0 and active_mobs >= active_limit then - minetest.chat_send_player(self.owner, - S("Active Mob Limit Reached!") - .. " (" .. active_mobs - .. " / " .. active_limit .. ")") + if at_limit() then + + minetest.chat_send_player(self.owner, S("Active Mob Limit Reached!") + .. " (" .. active_mobs .. " / " .. active_limit .. ")") return end -- spawn baby minetest.after(5, function(self, ent) - if not self.object:get_luaentity() then - return - end + if not self.object:get_luaentity() then return end -- custom breed function if self.on_breed then -- when false skip going any further - if self:on_breed(ent) == false then - return - end - else - effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) + if self:on_breed(ent) == false then return end end - pos.y = pos.y + 0.5 -- spawn child a little higher - - local mob = minetest.add_entity(pos, self.name) - local ent2 = mob:get_luaentity() - local textures = self.base_texture - - -- using specific child texture (if found) - if self.child_texture then - textures = self.child_texture[1] - end - - -- and resize to half height - mob:set_properties({ - textures = textures, - visual_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5 - }, - collisionbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5 - }, - selectionbox = { - self.base_selbox[1] * .5, - self.base_selbox[2] * .5, - self.base_selbox[3] * .5, - self.base_selbox[4] * .5, - self.base_selbox[5] * .5, - self.base_selbox[6] * .5 - }, + -- add baby + local ent2 = mobs:add_mob(pos, { + name = self.name, + child = true, + owner = self.owner, + ignore_count = true }) - -- tamed and owned by parents' owner - ent2.child = true - ent2.tamed = true - ent2.owner = self.owner + + -- set baby textures + if ent2 then + + local textures = self.base_texture + + -- using specific child texture (if found) + if self.child_texture then + textures = self.child_texture[1] + end + + ent2.mommy_tex = self.base_texture -- when grown + ent2.object:set_properties({textures = textures}) + ent2.base_texture = textures + end end, self, ent) break @@ -1571,23 +1378,18 @@ function mob_class:breed() end end - -- find and replace what mob is looking for (grass, wheat etc.) + function mob_class:replace(pos) - local vel = self.object:get_velocity() - if not vel then return end + local vel = self.object:get_velocity() ; if not vel then return end - if not mobs_griefing - or not self.replace_rate - or not self.replace_what - or self.child == true - or vel.y ~= 0 - or random(self.replace_rate) > 1 then + if not mobs_griefing or not self.replace_rate or not self.replace_what + or self.child or vel.y ~= 0 or random(self.replace_rate) > 1 then return end - local what, with, y_offset + local what, with, y_offset, reach if type(self.replace_what[1]) == "table" then @@ -1596,15 +1398,23 @@ function mob_class:replace(pos) what = self.replace_what[num][1] or "" with = self.replace_what[num][2] or "" y_offset = self.replace_what[num][3] or 0 + reach = self.replace_what[num][4] or 0 else what = self.replace_what with = self.replace_with or "" y_offset = self.replace_offset or 0 + reach = 0 end pos.y = pos.y + y_offset - if #minetest.find_nodes_in_area(pos, pos, what) > 0 then + local found = minetest.find_nodes_in_area( + {x = pos.x - reach, y = pos.y, z = pos.z - reach}, + {x = pos.x + reach, y = pos.y, z = pos.z + reach}, what) + + if #found > 0 then + + pos = found[random(#found)] -- print("replace node = ".. minetest.get_node(pos).name, pos.y) @@ -1614,53 +1424,38 @@ function mob_class:replace(pos) local newnode = with -- pass actual node name when using table or groups - if type(oldnode) == "table" - or oldnode:find("group:") then + if type(oldnode) == "table" or oldnode:find("group:") then oldnode = minetest.get_node(pos).name end - if self:on_replace(pos, oldnode, newnode) == false then - return - end + if self:on_replace(pos, oldnode, newnode) == false then return end end minetest.set_node(pos, {name = with}) + + self:mob_sound(self.sounds.replace) end end - -- check if daytime and also if mob is docile during daylight hours + function mob_class:day_docile() - if self.docile_by_day == false then - - return false - - elseif self.docile_by_day == true - and self.time_of_day > 0.2 - and self.time_of_day < 0.8 then - - return true - end + if self.docile_by_day + and self.time_of_day > 0.2 and self.time_of_day < 0.8 then return true end end +-- are we able to dig this node and add drops? -local los_switcher = false -local height_switcher = false -local can_dig_drop = function(pos) +local function can_dig_drop(pos) - if minetest.is_protected(pos, "") then - return false - end + if minetest.is_protected(pos, "") then return false end local node = node_ok(pos, "air").name local ndef = minetest.registered_nodes[node] - if node ~= "ignore" - and ndef - and ndef.drawtype ~= "airlike" - and not ndef.groups.level - and not ndef.groups.unbreakable + if node ~= "ignore" and ndef and ndef.drawtype ~= "airlike" + and not ndef.groups.level and not ndef.groups.unbreakable and not ndef.groups.liquid then local drops = minetest.get_node_drops(node) @@ -1678,20 +1473,21 @@ local can_dig_drop = function(pos) return true end - - return false end +-- pathfinder mod check and settings local pathfinder_mod = minetest.get_modpath("pathfinder") --- path finding and smart mob routine by rnd, --- line_of_sight and other edits by Elkien3 +local los_switcher = false +local height_switcher = false + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 + function mob_class:smart_mobs(s, p, dist, dtime) local s1 = self.path.lastpos local target_pos = p - -- is it becoming stuck? if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then self.path.stuck_timer = self.path.stuck_timer + dtime @@ -1709,141 +1505,123 @@ function mob_class:smart_mobs(s, p, dist, dtime) -- im stuck, search for path if not has_lineofsight then - if los_switcher == true then + if los_switcher then use_pathfind = true los_switcher = false end -- cannot see target! else - if los_switcher == false then + if not los_switcher then los_switcher = true use_pathfind = false minetest.after(1, function(self) - if self.object:get_luaentity() then + if not self.object:get_luaentity() then return end - if has_lineofsight then - self.path.following = false - end - end + if has_lineofsight then self.path.following = false end end, self) end -- can see target! end - if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + if self.path.stuck_timer > pathfinding_stuck_timeout and not self.path.following then use_pathfind = true self.path.stuck_timer = 0 minetest.after(1, function(self) - if self.object:get_luaentity() then + if not self.object:get_luaentity() then return end - if has_lineofsight then - self.path.following = false - end - end + if has_lineofsight then self.path.following = false end end, self) end - if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + if self.path.stuck_timer > pathfinding_stuck_path_timeout and self.path.following then use_pathfind = true self.path.stuck_timer = 0 minetest.after(1, function(self) - if self.object:get_luaentity() then + if not self.object:get_luaentity() then return end - if has_lineofsight then - self.path.following = false - end - end + if has_lineofsight then self.path.following = false end end, self) end - if abs(vsubtract(s,target_pos).y) > self.stepheight then + local prop = self.object:get_properties() - if height_switcher then - use_pathfind = true - height_switcher = false - end + if abs(s.y - target_pos.y) > prop.stepheight then + + if height_switcher then use_pathfind = true ; height_switcher = false end else - if not height_switcher then - use_pathfind = false - height_switcher = true - end + if not height_switcher then use_pathfind = false ; height_switcher = true end end -- lets try find a path, first take care of positions -- since pathfinder is very sensitive if use_pathfind then - -- round position to center of node to avoid stuck in walls - -- also adjust height for player models! + -- round position to center of node to avoid getting stuck in walls s.x = floor(s.x + 0.5) s.z = floor(s.z + 0.5) - local ssight, sground = minetest.line_of_sight(s, { - x = s.x, y = s.y - 4, z = s.z}, 1) + local ssight, sground = minetest.line_of_sight(s, + {x = s.x, y = s.y - 4, z = s.z}, 1) - -- determine node above ground - if not ssight then - s.y = sground.y + 1 - end + -- determine node above ground (adjust height for player models) + if not ssight then s.y = sground.y + 1 end - local p1 = self.attack:get_pos() + local p1 = self.attack and self.attack:get_pos() - p1.x = floor(p1.x + 0.5) - p1.y = floor(p1.y + 0.5) - p1.z = floor(p1.z + 0.5) + if not p1 then return end - local dropheight = 6 + p1.x = floor(p1.x + 0.5) ; p1.y = floor(p1.y + 0.5) ; p1.z = floor(p1.z + 0.5) + + local dropheight = pathfinding_max_drop if self.fear_height ~= 0 then dropheight = self.fear_height end local jumpheight = 0 - if self.jump and self.jump_height >= 4 then - jumpheight = min(ceil(self.jump_height / 4), 4) + if self.jump and self.jump_height >= pathfinding_max_jump then - elseif self.stepheight > 0.5 then - jumpheight = 1 - end + jumpheight = min(ceil( + self.jump_height / pathfinding_max_jump), pathfinding_max_jump) + + elseif prop.stepheight > 0.5 then jumpheight = 1 end if pathfinder_mod then self.path.way = pathfinder.find_path(s, p1, self, dtime) else - self.path.way = minetest.find_path(s, p1, 16, jumpheight, - dropheight, "Dijkstra") + self.path.way = minetest.find_path(s, p1, pathfinding_searchdistance, + jumpheight, dropheight, pathfinding_algorithm) end ---[[ - -- show path using particles + + --[[ show path using particles if self.path.way and #self.path.way > 0 then print("-- path length:" .. tonumber(#self.path.way)) for _,pos in pairs(self.path.way) do + minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 1, - size = 4, - collisiondetection = false, - vertical = false, - texture = "heart.png", + pos = pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = 1, + size = 4, + collisiondetection = false, + vertical = false, + texture = "heart.png", }) end - end -]] + end]] self.state = "" - if self.attack then - self:do_attack(self.attack) - end + if self.attack then self:do_attack(self.attack) end -- no path found, try something else if not self.path.way then @@ -1866,7 +1644,7 @@ function mob_class:smart_mobs(s, p, dist, dtime) end end - local sheight = ceil(self.collisionbox[5]) + 1 + local sheight = ceil(prop.collisionbox[5]) + 1 -- assume mob is 2 blocks high so it digs above its head s.y = s.y + sheight @@ -1875,24 +1653,21 @@ function mob_class:smart_mobs(s, p, dist, dtime) can_dig_drop(s) s.y = s.y - sheight + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) -- is player more than 1 block lower than mob elseif p1.y < (s.y - 1) then -- dig down - s.y = s.y - self.collisionbox[4] - 0.2 + s.y = s.y - prop.collisionbox[4] - 0.2 can_dig_drop(s) else -- dig 2 blocks to make door toward player direction local yaw1 = self.object:get_yaw() + pi / 2 - local p1 = { - x = s.x + cos(yaw1), - y = s.y, - z = s.z + sin(yaw1) - } + local p1 = {x = s.x + cos(yaw1), y = s.y, z = s.z + sin(yaw1)} -- dig bottom node first incase of door can_dig_drop(p1) @@ -1904,7 +1679,7 @@ function mob_class:smart_mobs(s, p, dist, dtime) end -- will try again in 2 second - self.path.stuck_timer = stuck_timeout - 2 + self.path.stuck_timer = pathfinding_stuck_timeout - 2 elseif s.y < p1.y and (not self.fly) then self:do_jump() --add jump to pathfinding @@ -1925,31 +1700,52 @@ function mob_class:smart_mobs(s, p, dist, dtime) end end +-- temporary entity for go_to() function --- peaceful player privilege support -local function is_peaceful_player(player) +minetest.register_entity("mobs:_pos", { + initial_properties = { + visual = "sprite", texture = "", hp_max = 1, physical = false, + static_save = false, pointable = false, is_visible = false + }, health = 1, _cmi_is_mob = true, - if peaceful_player_enabled then + on_step = function(self, dtime) - local player_name = player:get_player_name() + self.counter = (self.counter or 0) + dtime - if player_name - and minetest.check_player_privs(player_name, "peaceful_player") then - return true - end + if self.counter > 20 then self.object:remove() end end +}) - return false +-- add temp entity and make mob go to that entity position + +function mob_class:go_to(pos) + + local obj = minetest.add_entity(pos, "mobs:_pos") + + if obj and obj:get_luaentity() then self:do_attack(obj, true) end end +-- peaceful player privilege support + +local function is_peaceful_player(player) + + -- main setting enabled + if peaceful_player_enabled then return true end + + local player_name = player:get_player_name() + + -- player priv enabled + if player_name and minetest.check_player_privs(player_name, "peaceful_player") then + return true + end +end -- general attack function for all mobs + function mob_class:general_attack() -- return if already attacking, passive or docile during day - if self.passive - or self.state == "runaway" - or self.state == "attack" + if self.passive or self.state == "runaway" or self.state == "attack" or self:day_docile() then return end @@ -1963,29 +1759,42 @@ function mob_class:general_attack() local ent = objs[n]:get_luaentity() -- are we a player? - if objs[n]:is_player() then + if is_player(objs[n]) then -- if player invisible or mob cannot attack then remove from list - if not damage_enabled - or self.attack_players == false + if not damage_enabled or self.attack_players == false or (self.owner and self.type ~= "monster") or is_invisible(self, objs[n]:get_player_name()) - or (self.specific_attack - and not check_for("player", self.specific_attack)) then + or (self.specific_attack and not check_for("player", self.specific_attack)) then objs[n] = nil --print("- pla", n) end + -- are we a creatura mob? + elseif creatura and ent and ent._cmi_is_mob ~= true + and ent.hitbox and ent.stand_node then + + -- monsters attack all creatura mobs, npc and animals will only attack + -- if the animal owner is currently being attacked by creatura mob + if self.name == ent.name + or (self.type ~= "monster" + and self.owner ~= (ent._target and ent._target:get_player_name() or ".")) + or (self.specific_attack and not check_for(ent.name, self.specific_attack)) then + + objs[n] = nil +--print("-- creatura", ent.name) + end + -- or are we a mob? elseif ent and ent._cmi_is_mob then - -- remove mobs not to attack + -- remove mobs to not attack if self.name == ent.name + or check_for(ent.name, self.attack_ignore) or (not self.attack_animals and ent.type == "animal") or (not self.attack_monsters and ent.type == "monster") or (not self.attack_npcs and ent.type == "npc") - or (self.specific_attack - and not check_for(ent.name, self.specific_attack)) then + or (self.specific_attack and not check_for(ent.name, self.specific_attack)) then objs[n] = nil --print("- mob", n, self.name, ent.name) end @@ -2013,10 +1822,8 @@ function mob_class:general_attack() sp.y = sp.y + 1 -- choose closest player to attack that isnt self - if dist ~= 0 - and dist < min_dist - and self:line_of_sight(sp, p, 2) == true - and not is_peaceful_player(player) then + if dist ~= 0 and dist < min_dist + and self:line_of_sight(sp, p) and not is_peaceful_player(player) then min_dist = dist min_player = player end @@ -2028,13 +1835,11 @@ function mob_class:general_attack() end end - -- find someone to runaway from + function mob_class:do_runaway_from() - if not self.runaway_from then - return - end + if not self.runaway_from then return end local s = self.object:get_pos() ; if not s then return end local p, sp, dist, pname @@ -2042,15 +1847,14 @@ function mob_class:do_runaway_from() local min_dist = self.view_range + 1 local objs = minetest.get_objects_inside_radius(s, self.view_range) + -- loop through entities surrounding mob for n = 1, #objs do - if objs[n]:is_player() then + if is_player(objs[n]) then pname = objs[n]:get_player_name() - if is_invisible(self, pname) - or self.owner == pname then - + if is_invisible(self, pname) or self.owner == pname then name = "" else player = objs[n] @@ -2079,8 +1883,7 @@ function mob_class:do_runaway_from() dist = get_distance(p, s) -- choose closest player/mob to runaway from - if dist < min_dist - and self:line_of_sight(sp, p, 2) == true then + if dist < min_dist and self:line_of_sight(sp, p) then min_dist = dist min_player = player end @@ -2089,7 +1892,21 @@ function mob_class:do_runaway_from() if min_player then - yaw_to_pos(self, min_player:get_pos(), 3) + self:yaw_to_pos(min_player:get_pos(), 3) + + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + + return + end + + -- check for nodes to runaway from + objs = minetest.find_node_near(s, self.view_range, self.runaway_from, true) + + if objs then + + self:yaw_to_pos(objs, 3) self.state = "runaway" self.runaway_timer = 3 @@ -2097,51 +1914,41 @@ function mob_class:do_runaway_from() end end - -- follow player if owner or holding item, if fish outta water then flop + function mob_class:follow_flop() -- find player to follow - if (self.follow ~= "" or self.order == "follow") - and not self.following - and self.state ~= "attack" - and self.state ~= "runaway" then + if (self.follow ~= "" or self.order == "follow") and not self.following + and self.state ~= "attack" and self.state ~= "runaway" then local s = self.object:get_pos() ; if not s then return end local players = minetest.get_connected_players() for n = 1, #players do - if get_distance(players[n]:get_pos(), s) < self.view_range - and not is_invisible(self, players[n]:get_player_name()) then + if players[n] and not is_invisible(self, players[n]:get_player_name()) + and get_distance(players[n]:get_pos(), s) < self.view_range then - self.following = players[n] - - break + self.following = players[n] ; break end end end - if self.type == "npc" - and self.order == "follow" - and self.state ~= "attack" - and self.owner ~= "" then + if self.type == "npc" and self.order == "follow" + and self.state ~= "attack" and self.owner ~= "" then -- npc stop following player if not owner if self.following - and self.owner - and self.owner ~= self.following:get_player_name() then + and self.owner and self.owner ~= self.following:get_player_name() then self.following = nil end else -- stop following player if not holding specific item or mob is horny - if self.following - and self.following:is_player() - and (self:follow_holding(self.following) == false - or self.horny) then + if self.following and is_player(self.following) + and (self.horny or not self:follow_holding(self.following)) then self.following = nil end - end -- follow that thing @@ -2150,34 +1957,24 @@ function mob_class:follow_flop() local s = self.object:get_pos() local p - if self.following:is_player() then - - p = self.following:get_pos() - - elseif self.following.object then - - p = self.following.object:get_pos() - end + if is_player(self.following) then p = self.following:get_pos() + elseif self.following.object then p = self.following.object:get_pos() end if p then local dist = get_distance(p, s) -- dont follow if out of range - if dist > self.view_range then - self.following = nil + if dist > self.view_range then self.following = nil else - yaw_to_pos(self, p) + self:yaw_to_pos(p) -- anyone but standing npc's can move along - if dist > self.reach - and self.order ~= "stand" then + if dist >= self.reach and self.order ~= "stand" then self:set_velocity(self.walk_velocity) - if self.walk_chance ~= 0 then - self:set_animation("walk") - end + if self.walk_chance ~= 0 then self:set_animation("walk") end else self:set_velocity(0) self:set_animation("stand") @@ -2196,12 +1993,7 @@ function mob_class:follow_flop() self.state = "flop" -- do we have a custom on_flop function? - if self.on_flop then - - if self:on_flop(self) then - return - end - end + if self.on_flop and self:on_flop(self) then return end self.object:set_velocity({x = 0, y = -5, z = 0}) @@ -2209,28 +2001,21 @@ function mob_class:follow_flop() return - elseif self.state == "flop" then - self.state = "stand" - end + elseif self.state == "flop" then self.state = "stand" end end end - -- dogshoot attack switch and counter function + function mob_class:dogswitch(dtime) -- switch mode not activated - if not self.dogshoot_switch - or not dtime then - return 0 - end + if not self.dogshoot_switch or not dtime then return 0 end self.dogshoot_count = self.dogshoot_count + dtime - if (self.dogshoot_switch == 1 - and self.dogshoot_count > self.dogshoot_count_max) - or (self.dogshoot_switch == 2 - and self.dogshoot_count > self.dogshoot_count2_max) then + if (self.dogshoot_switch == 1 and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 and self.dogshoot_count > self.dogshoot_count2_max) then self.dogshoot_count = 0 @@ -2244,47 +2029,85 @@ function mob_class:dogswitch(dtime) return self.dogshoot_switch end +-- stop attack and reset vars + +function mob_class:stop_attack() + + self.attack = nil + self.following = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + self:set_velocity(0) + self.state = "stand" + self:set_animation("stand", true) +end -- execute current state (stand, walk, run, attacks) + function mob_class:do_states(dtime) local yaw = self.object:get_yaw() ; if not yaw then return end + -- are we standing in something that hurts ? Try to get out + if is_node_dangerous(self, self.standing_in) then -- and self.pause_timer <= 0 then + + local s = self.object:get_pos() + + local lp = minetest.find_nodes_in_area_under_air( + {x = s.x - 7, y = s.y - 1.0, z = s.z - 7}, + {x = s.x + 7, y = s.y + 1.0, z = s.z + 7}, + {"group:cracky", "group:crumbly", "group:choppy", "group:solid"}) + + -- did we find land ? if so face random block to climb onto + if #lp > 0 then + + yaw = self:yaw_to_pos( lp[random(#lp)] ) + + self.pause_timer = 3 + self.following = nil + self:set_velocity(self.run_velocity) + self:set_animation("walk") + + return + end + end + if self.state == "stand" then if self.randomly_turn and random(4) == 1 then local lp local s = self.object:get_pos() - local objs = minetest.get_objects_inside_radius(s, 3) - for n = 1, #objs do + for _,player in pairs(minetest.get_connected_players()) do - if objs[n]:is_player() then - lp = objs[n]:get_pos() - break + local player_pos = player:get_pos() + + if get_distance(player_pos, s) <= 3 then + lp = player_pos ; break end end -- look at any players nearby, otherwise turn randomly if lp then - yaw = yaw_to_pos(self, lp) + yaw = self:yaw_to_pos(lp) else - yaw = yaw + random(-0.5, 0.5) + yaw = yaw + random() - 0.5 end - yaw = self:set_yaw(yaw, 8) + self:set_yaw(yaw, 8) end self:set_velocity(0) self:set_animation("stand") -- mobs ordered to stand stay standing - if self.order ~= "stand" - and self.walk_chance ~= 0 + if self.order ~= "stand" and self.walk_chance ~= 0 and self.facing_fence ~= true - and random(100) <= self.walk_chance - and self.at_cliff == false then + and self.at_cliff == false + and random(100) <= self.walk_chance then self:set_velocity(self.walk_velocity) self.state = "walk" @@ -2293,74 +2116,23 @@ function mob_class:do_states(dtime) elseif self.state == "walk" then - local s = self.object:get_pos() - local lp + if self.randomly_turn and random(100) <= 30 then - -- is there something I need to avoid? - if self.water_damage > 0 - and self.lava_damage > 0 then + yaw = yaw + random() - 0.5 - lp = minetest.find_node_near(s, 1, {"group:water", "group:igniter"}) - - elseif self.water_damage > 0 then - - lp = minetest.find_node_near(s, 1, {"group:water"}) - - elseif self.lava_damage > 0 then - - lp = minetest.find_node_near(s, 1, {"group:igniter"}) - end - - if lp then - - -- if mob in dangerous node then look for land - if not is_node_dangerous(self, self.standing_in) then - - lp = minetest.find_nodes_in_area_under_air( - {s.x - 5, s.y - 1, s.z - 5}, - {s.x + 5, s.y + 2, s.z + 5}, - {"group:soil", "group:stone", "group:sand", - node_ice, node_snowblock}) - - -- select position of random block to climb onto - lp = #lp > 0 and lp[random(#lp)] - - -- did we find land? - if lp then - - yaw = yaw_to_pos(self, lp) - - self:do_jump() - self:set_velocity(self.walk_velocity) - else - yaw = yaw + random(-0.5, 0.5) - end - end - - yaw = self:set_yaw(yaw, 8) - - -- otherwise randomly turn - elseif self.randomly_turn and random(100) <= 30 then - - yaw = yaw + random(-0.5, 0.5) - - yaw = self:set_yaw(yaw, 8) + self:set_yaw(yaw, 8) -- for flying/swimming mobs randomly move up and down also - if self.fly_in - and not self.following then + if self.fly_in and not self.following then self:attempt_flight_correction(true) end end -- stand for great fall in front - if self.facing_fence == true - or self.at_cliff - or random(100) <= self.stand_chance then + if self.facing_fence or self.at_cliff or random(100) <= self.stand_chance then -- don't stand if mob flies and keep_flying set - if (self.fly and not self.keep_flying) - or not self.fly then + if (self.fly and not self.keep_flying) or not self.fly then self:set_velocity(0) self.state = "stand" @@ -2369,29 +2141,39 @@ function mob_class:do_states(dtime) else self:set_velocity(self.walk_velocity) - if self:flight_check() - and self.animation - and self.animation.fly_start - and self.animation.fly_end then - self:set_animation("fly") + -- figure out which animation to use while in motion + if self:flight_check() and self.animation + and self.animation.fly_start and self.animation.fly_end then + + local on_ground = minetest.registered_nodes[self.standing_on].walkable + local in_water = minetest.registered_nodes[self.standing_in].groups.water + + if on_ground and in_water then + self:set_animation("fly") + elseif on_ground then + self:set_animation("walk") + else + self:set_animation("fly") + end else self:set_animation("walk") end end - -- runaway when punched elseif self.state == "runaway" then - self.runaway_timer = self.runaway_timer + 1 + self.runaway_timer = self.runaway_timer - 1 + + -- stop when timer runs out or when at cliff + if self.runaway_timer <= 0 or self.at_cliff or self.order == "stand" then - -- stop after 5 seconds or when at cliff - if self.runaway_timer > 5 - or self.at_cliff - or self.order == "stand" then - self.runaway_timer = 0 self:set_velocity(0) self.state = "stand" self:set_animation("stand") + + -- try to turn so we are not stuck + yaw = yaw + random(-1, 1) * 1.5 + yaw = self:set_yaw(yaw, 4) else self:set_velocity(self.run_velocity) self:set_animation("walk") @@ -2407,29 +2189,33 @@ function mob_class:do_states(dtime) -- stop attacking if player out of range or invisible if dist > self.view_range - or not self.attack - or not self.attack:get_pos() - or self.attack:get_hp() <= 0 - or (self.attack:is_player() + or not self.attack or not self.attack:get_pos() or self.attack:get_hp() <= 0 + or (is_player(self.attack) and is_invisible(self, self.attack:get_player_name())) then ---print(" ** stop attacking **", dist, self.view_range) +--print(" ** stop attacking **", self.name, self.health, dist, self.view_range) - self.state = "stand" - self:set_velocity(0) - self:set_animation("stand") - self.attack = nil - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.path.way = nil + self:stop_attack() ; return + end - return + -- check enemy is in sight + local in_sight = self:line_of_sight( + {x = s.x, y = s.y + 0.5, z = s.z}, + {x = p.x, y = p.y + 0.5, z = p.z}) + + -- stop attacking when enemy not seen for 11 seconds + if not in_sight then + + self.target_time_lost = (self.target_time_lost or 0) + dtime + + if self.target_time_lost > self.attack_patience then self:stop_attack() end + else + self.target_time_lost = 0 end if self.attack_type == "explode" then - yaw = yaw_to_pos(self, p) + self:yaw_to_pos(p) local node_break_radius = self.explosion_radius or 1 local entity_damage_radius = self.explosion_damage_radius @@ -2439,9 +2225,7 @@ function mob_class:do_states(dtime) s.y = s.y + 0.5 ; p.y = p.y + 0.5 -- start timer when in reach and line of sight - if not self.v_start - and dist <= self.reach - and self:line_of_sight(s, p, 2) then + if not self.v_start and dist <= self.reach and in_sight then self.v_start = true self.timer = 0 @@ -2451,9 +2235,8 @@ function mob_class:do_states(dtime) --print("=== explosion timer started", self.explosion_timer) -- stop timer if out of reach or direct line of sight - elseif self.allow_fuse_reset - and self.v_start - and (dist > self.reach or not self:line_of_sight(s, p, 2)) then + elseif self.allow_fuse_reset and self.v_start + and (dist > self.reach or not in_sight) then --print("=== explosion timer stopped") @@ -2487,12 +2270,9 @@ function mob_class:do_states(dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:set_texture_mod(self.texture_mods) else - - self.object:set_texture_mod(self.texture_mods - .. "^[brighten") + self.object:set_texture_mod(self.texture_mods .. "^[brighten") end self.blinkstatus = not self.blinkstatus @@ -2507,33 +2287,12 @@ function mob_class:do_states(dtime) -- dont damage anything if area protected or next to water if minetest.find_node_near(pos, 1, {"group:water"}) or minetest.is_protected(pos, "") then - node_break_radius = 1 end remove_mob(self, true) - if minetest.get_modpath("tnt") and tnt and tnt.boom - and not minetest.is_protected(pos, "") then - - tnt.boom(pos, { - radius = node_break_radius, - damage_radius = entity_damage_radius, - sound = self.sounds.explode - }) - else - - minetest.sound_play(self.sounds.explode, { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds.distance or 32 - }) - - entity_physics(pos, entity_damage_radius) - - effect(pos, 32, "tnt_smoke.png", nil, nil, - node_break_radius, 1, 0) - end + mobs:boom(self, pos, node_break_radius, entity_damage_radius) return true end @@ -2544,61 +2303,49 @@ function mob_class:do_states(dtime) or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then - if self.fly - and dist > self.reach then + -- if flying mobs are moving around inside proper medium + if self.fly and dist > self.reach and self:flight_check() then - local p1 = s - local me_y = floor(p1.y) - local p2 = p - local p_y = floor(p2.y + 1) + local s_y = floor(s.y) -- self + local p_y = floor(p.y + 1) -- attacker local v = self.object:get_velocity() - if self:flight_check() then + -- fly/swim up towards attacker + if s_y < p_y then - if me_y < p_y then + -- if correct medium above then move up + if #minetest.find_nodes_in_area( + {x = s.x, y = s.y + 1, z = s.z}, + {x = s.x, y = s.y + 1, z = s.z}, self.fly_in) > 0 then self.object:set_velocity({ - x = v.x, - y = 1 * self.walk_velocity, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -1 * self.walk_velocity, - z = v.z - }) + x = v.x, y = self.walk_velocity, z = v.z}) + else + self.object:set_velocity({x = v.x, y = 0, z = v.z}) -- stop end - else - if me_y < p_y then + + -- fly/swim down towards attacker + elseif s_y > p_y then + + -- if correct medium below then move down + if #minetest.find_nodes_in_area( + {x = s.x, y = s.y - 1, z = s.z}, + {x = s.x, y = s.y - 1, z = s.z}, self.fly_in) > 0 then self.object:set_velocity({ - x = v.x, - y = 0.01, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -0.01, - z = v.z - }) + x = v.x, y = -self.walk_velocity, z = v.z}) + else + self.object:set_velocity({x = v.x, y = 0, z = v.z}) -- stop end end end -- rnd: new movement direction - if self.path.following - and self.path.way + if self.path.following and self.path.way and self.attack_type ~= "dogshoot" then -- no paths longer than 50 - if #self.path.way > 50 - or dist < self.reach then + if #self.path.way > 50 or dist < self.reach then self.path.following = false return end @@ -2619,23 +2366,26 @@ function mob_class:do_states(dtime) p = {x = p1.x, y = p1.y, z = p1.z} end - yaw = yaw_to_pos(self, p) + self:yaw_to_pos(p) -- move towards enemy if beyond mob reach - if dist > self.reach then - - -- path finding by rnd - if self.pathfinding -- only if mob has pathfinding enabled - and enable_pathfinding then + if dist > (self.reach + (self.reach_ext or 0)) then + -- path finding by rnd (only when enabled in setting and mob) + if self.pathfinding and pathfinding_enable then self:smart_mobs(s, p, dist, dtime) end -- distance padding to stop spinning mob local pad = abs(p.x - s.x) + abs(p.z - s.z) + self.reach_ext = 0 -- extended ready off by default + if self.at_cliff or pad < 0.2 then + -- when on top of player extend reach slightly so player can + -- still be attacked. + self.reach_ext = 0.8 self:set_velocity(0) self:set_animation("stand") else @@ -2662,20 +2412,19 @@ function mob_class:do_states(dtime) if self.timer > 1 then - -- no custom attack or custom attack returns true to continue - if not self.custom_attack - or self:custom_attack(self, p) == true then + self.timer = 0 + + -- no custom attack or custom attack returns true to continue + if not self.custom_attack or self:custom_attack(self, p) then - self.timer = 0 self:set_animation("punch") - local p2 = p - local s2 = s + local p2, s2 = p, s p2.y = p2.y + .5 s2.y = s2.y + .5 - if self:line_of_sight(p2, s2) == true then + if self:line_of_sight(p2, s2) then -- play attack sound self:mob_sound(self.sounds.attack) @@ -2701,19 +2450,17 @@ function mob_class:do_states(dtime) elseif self.attack_type == "shoot" or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1) or (self.attack_type == "dogshoot" and dist > self.reach and - self:dogswitch() == 0) then + self:dogswitch() == 0) then p.y = p.y - .5 s.y = s.y + .5 local vec = {x = p.x - s.x, y = p.y - s.y, z = p.z - s.z} - yaw = yaw_to_pos(self, p) - + self:yaw_to_pos(p) self:set_velocity(0) - if self.shoot_interval - and self.timer > self.shoot_interval + if self.shoot_interval and self.timer > self.shoot_interval and random(100) <= 60 then self.timer = 0 @@ -2723,8 +2470,9 @@ function mob_class:do_states(dtime) self:mob_sound(self.sounds.shoot_attack) local p = self.object:get_pos() + local prop = self.object:get_properties() - p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + p.y = p.y + (prop.collisionbox[2] + prop.collisionbox[5]) / 2 if minetest.registered_entities[self.arrow] then @@ -2733,15 +2481,17 @@ function mob_class:do_states(dtime) local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 -- check for custom override for arrow - if self.arrow_override then - self.arrow_override(ent) - end + if self.arrow_override then self.arrow_override(ent) end local v = ent.velocity or 1 -- or set to default - ent.switch = 1 ent.owner_id = tostring(self.object) -- add unique owner id to arrow + -- setup homing arrow and target + if self.homing then + ent._homing_target = self.attack + end + -- offset makes shoot aim accurate vec.y = vec.y + self.shoot_offset vec.x = vec.x * (v / amount) @@ -2755,20 +2505,14 @@ function mob_class:do_states(dtime) end end - -- falling and fall damage + function mob_class:falling(pos) - if self.fly or self.disable_falling then - return - end + if self.fly or self.disable_falling then return end -- floating in water (or falling) - local v = self.object:get_velocity() - - -- sanity check - if not v then return end - + local v = self.object:get_velocity() ; if not v then return end local fall_speed = self.fall_speed -- in water then use liquid viscosity for float/sink speed @@ -2779,24 +2523,30 @@ function mob_class:falling(pos) minetest.registered_nodes[self.standing_in].liquid_viscosity, 7) + 1 self.object:set_velocity({x = v.x, y = 0.6, z = v.z}) + fall_speed = -1.2 / visc else -- fall damage onto solid ground - if self.fall_damage == 1 - and self.object:get_velocity().y == 0 then + if self.fall_damage and self.object:get_velocity().y == 0 then - local d = (self.old_y or 0) - self.object:get_pos().y + local d = (self.old_y or self.object:get_pos().y) - self.object:get_pos().y if d > 5 then - self.health = self.health - floor(d - 5) + local damage = d - 5 + local add = minetest.get_item_group( + self.standing_on, "fall_damage_add_percent") + + if add ~= 0 then + damage = damage + damage * (add / 100) + end + + self.health = self.health - floor(damage) effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) - if self:check_for_death({type = "fall"}) then - return true - end + if self:check_for_death({type = "fall"}) then return true end end self.old_y = self.object:get_pos().y @@ -2807,29 +2557,23 @@ function mob_class:falling(pos) self.object:set_acceleration({x = 0, y = fall_speed, z = 0}) end - --- is Took Ranks mod active? -local tr = minetest.get_modpath("toolranks") - -- deal damage and effects when mob punched + +local dis_damage_kb = settings:get_bool("mobs_disable_damage_kb") + function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) -- mob health check - if self.health <= 0 then - return true - end + if self.health <= 0 then return true end - -- custom punch function - if self.do_punch - and self:do_punch(hitter, tflp, tool_capabilities, dir) == false then + -- custom punch function (if false returned, do not continue and return true) + if self.do_punch and self:do_punch(hitter, tflp, tool_capabilities, dir) == false then return true end -- error checking when mod profiling is enabled if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return true end @@ -2837,7 +2581,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) if self.protected then -- did player hit mob and if so is it in protected area - if hitter:is_player() then + if is_player(hitter) then local player_name = hitter:get_player_name() @@ -2856,11 +2600,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) local ent = hitter and hitter:get_luaentity() if ent and ent._is_arrow then - return true -- arrow entity - elseif not ent then - return true -- non entity end end @@ -2868,7 +2609,15 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) local weapon = hitter:get_wielded_item() local weapon_def = weapon:get_definition() or {} - local punch_interval = 1.4 + + --- check for ehchantments when using mineclonia/voxelibre + local enchants = {} + + if use_mc2 then + + enchants = minetest.deserialize( + weapon:get_meta():get_string("mcl_enchanting:enchantments")) or {} + end -- calculate mob damage local damage = 0 @@ -2876,9 +2625,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) local tmp -- quick error check incase it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end + if tflp == 0 then tflp = 0.2 end if use_cmi then damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) @@ -2888,25 +2635,26 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end + if tmp < 0 then tmp = 0.0 elseif tmp > 1 then tmp = 1.0 end damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp * ((armor[group] or 0) / 100.0) end end + -- check if hit by player item or entity + local hit_item = weapon_def.name + + if not is_player(hitter) then + hit_item = hitter:get_luaentity().name + end + -- check for tool immunity or special damage for n = 1, #self.immune_to do - if self.immune_to[n][1] == weapon_def.name then + if self.immune_to[n][1] == hit_item then - damage = self.immune_to[n][2] or 0 - - break + damage = self.immune_to[n][2] or 0 ; break -- if "all" then no tools deal damage unless it's specified in list elseif self.immune_to[n][1] == "all" then @@ -2921,6 +2669,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) self.health = self.health - floor(damage) + if use_vh1 then VH1.update_bar(self.object, self.health) end + return true end @@ -2930,21 +2680,21 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) end -- add weapon wear - punch_interval = tool_capabilities.full_punch_interval or 1.4 + local punch_interval = tool_capabilities.full_punch_interval or 1.4 -- toolrank support local wear = floor((punch_interval / 75) * 9000) - if mobs.is_creative(hitter:get_player_name()) then - - if tr then - wear = 1 - else - wear = 0 - end + -- check for punch_attack_uses being 0 to negate wear + if tool_capabilities.punch_attack_uses == 0 then + wear = 0 end - if tr and weapon_def.original_description then + if mobs.is_creative(hitter:get_player_name()) then + wear = use_tr and 1 or 0 + end + + if use_tr and weapon_def.original_description then toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}) else weapon:add_wear(wear) @@ -2952,15 +2702,21 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) hitter:set_wielded_item(weapon) + -- check for damage increasing enchantments + if use_mc2 and enchants.sharpness then + damage = damage + (0.5 * enchants.sharpness) + 0.5 + end + -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then -- select tool use sound if found, or fallback to default - local snd = weapon_def.sound and weapon_def.sound.use - or "default_punch" + local snd = weapon_def.sound and weapon_def.sound.use or "mobs_punch" minetest.sound_play(snd, {object = self.object, max_hear_distance = 8}, true) + local prop = self.object:get_properties() + -- blood_particles if not disable_blood and self.blood_amount > 0 then @@ -2968,12 +2724,10 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) local blood = self.blood_texture local amount = self.blood_amount - pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + pos.y = pos.y + (-prop.collisionbox[2] + prop.collisionbox[5]) * .5 -- lots of damage = more blood :) - if damage > 10 then - amount = self.blood_amount * 2 - end + if damage > 10 then amount = self.blood_amount * 2 end -- do we have a single blood texture or multiple? if type(self.blood_texture) == "table" then @@ -2983,34 +2737,59 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) effect(pos, amount, blood, 1, 2, 1.75, nil, nil, true) end - -- do damage - self.health = self.health - floor(damage) + -- add healthy afterglow when hit (can cause lag with larger textures) + if mob_hit_effect then + + self.old_texture_mods = self.texture_mods + + self.object:set_texture_mod(self.texture_mods .. prop.damage_texture_modifier) + + minetest.after(0.3, function() + + if self and self.object and self.object:get_pos() then + + self.texture_mods = self.old_texture_mods + self.old_texture_mods = nil + self.object:set_texture_mod(self.texture_mods) + end + end) + end + + -- check for friendly fire (arrows from same mob) + if self.friendly_fire then + self.health = self.health - floor(damage) -- do damage regardless + else + local entity = hitter and hitter:get_luaentity() + + -- check if arrow from same mob, if so then do no damage + if (entity and entity.name ~= self.arrow) or is_player(hitter) then + self.health = self.health - floor(damage) + end + end -- exit here if dead, check for tools with fire damage local hot = tool_capabilities and tool_capabilities.damage_groups and tool_capabilities.damage_groups.fire + -- check for any fire enchants also + if use_mc2 and (enchants.flame or enchants.fire_aspect) then + hot = true + end + if self:check_for_death({type = "punch", puncher = hitter, hot = hot}) then return true end - end -- END if damage + end -- knock back effect (only on full punch) if self.knock_back and tflp >= punch_interval then - local v = self.object:get_velocity() - - -- sanity check - if not v then return true end - - local kb = damage or 1 + local v = self.object:get_velocity() ; if not v then return true end + local kb = dis_damage_kb and 1 or (damage or 1) local up = 2 -- if already in air then dont go up anymore when hit - if v.y > 0 - or self.fly then - up = 0 - end + if v.y > 0 or self.fly then up = 0 end -- direction error check dir = dir or {x = 0, y = 0, z = 0} @@ -3018,32 +2797,44 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) -- use tool knockback value or default kb = tool_capabilities.damage_groups["knockback"] or kb + -- check for knockback enchantment + if use_mc2 and enchants.knockback then + kb = kb + (3 * enchants.knockback) + end + self.object:set_velocity({x = dir.x * kb, y = up, z = dir.z * kb}) + -- turn mob on knockback and play run/walk animation + self:set_yaw((random(0, 360) - 180) / 180 * pi, 12) + + if self.animation and self.animation.injured_end and damage >= 1 then + self:set_animation("injured") + else + self:set_animation("walk") + end + self.pause_timer = 0.25 end -- if skittish then run away - if self.runaway == true - and self.order ~= "stand" then + if self.runaway and self.order ~= "stand" then local lp = hitter:get_pos() - local yaw = yaw_to_pos(self, lp, 3) + + self:yaw_to_pos(lp, 3) self.state = "runaway" - self.runaway_timer = 0 + self.runaway_timer = 3 self.following = nil end - local name = hitter:get_player_name() or "" + local hitter_name = hitter:get_player_name() or "" -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and self.child == false - and self.attack_players == true - and hitter:get_player_name() ~= self.owner - and not is_invisible(self, name) + if self.passive == false and self.state ~= "flop" + and not self.child and self.attack_players + and not (is_player(hitter) and hitter_name == self.owner) + and not is_invisible(self, hitter_name) and self.object ~= hitter then -- attack whoever punched mob @@ -3051,37 +2842,54 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) self:do_attack(hitter) -- alert others to the attack - local objs = minetest.get_objects_inside_radius( - hitter:get_pos(), self.view_range) - local obj + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) + local ent for n = 1, #objs do - obj = objs[n]:get_luaentity() + ent = objs[n] and objs[n]:get_luaentity() - if obj and obj._cmi_is_mob then + if ent and ent._cmi_is_mob then -- only alert members of same mob and assigned helper - if obj.group_attack == true - and obj.state ~= "attack" - and obj.owner ~= name - and (obj.name == self.name - or obj.name == self.group_helper) then - - obj:do_attack(hitter) + if ent.group_attack and ent.state ~= "attack" + and not (is_player(hitter) and ent.owner == hitter_name) + and (ent.name == self.name or ent.name == self.group_helper) then + ent:do_attack(hitter) end -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - obj:do_attack(self.object) + if is_player(hitter) and ent.owner == hitter_name and ent.owner_loyal then + ent:do_attack(self.object) end end end end + + return true end +-- helper function to clean mob staticdata + +local function clean_staticdata(self) + + local tmp, t = {} + + for _,stat in pairs(self) do + + t = type(stat) + + if t ~= "function" and t ~= "nil" and t ~= "userdata" + and _ ~= "object" and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + return tmp +end -- get entity staticdata + function mob_class:mob_staticdata() -- this handles mob count for mobs activated, unloaded, reloaded @@ -3092,12 +2900,9 @@ function mob_class:mob_staticdata() end -- remove mob when out of range unless tamed - if remove_far - and self.remove_ok - and self.type ~= "npc" - and self.state ~= "attack" - and not self.tamed - and self.lifetimer < 20000 then + if remove_far and self.remove_ok + and self.type ~= "npc" and self.state ~= "attack" + and not self.tamed and self.lifetimer < 20000 then --print("REMOVED " .. self.name) @@ -3112,47 +2917,55 @@ function mob_class:mob_staticdata() self.state = "stand" -- used to rotate older mobs - if self.drawtype and self.drawtype == "side" then - self.rotate = rad(90) - end + if self.drawtype and self.drawtype == "side" then self.rotate = rad(90) end if use_cmi then - self.serialized_cmi_components = cmi.serialize_components( - self._cmi_components) + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) end +--[[ + -- move existing variables to new table for future compatibility + -- using self.initial_properties lost some variables when backing up?!? + if not self.backup_properties then - local tmp, t = {} - - for _,stat in pairs(self) do - - t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" - and _ ~= "object" - and _ ~= "_cmi_components" then - tmp[_] = self[_] - end + self.backup_properties = { + hp_max = self.hp_max, + physical = self.physical, + collisionbox = self.collisionbox, + selectionbox = self.selectionbox, + visual = self.visual, + visual_size = self.visual_size, + mesh = self.mesh, + textures = self.textures, + make_footstep_sound = self.make_footstep_sound, + stepheight = self.stepheight, + glow = self.glow, +-- nametag = self.nametag, + damage_texture_modifier = self.damage_texture_modifier, +-- infotext = self.infotext + } end - ---print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') - - return minetest.serialize(tmp) +]] + return minetest.serialize(clean_staticdata(self)) end +-- list of items used in initial_properties + +local is_property_name = { + hp_max = true, physical = true, collide_with_objects = true, collisionbox = true, + selectionbox = true, pointable = true, visual_size = true, textures = true, + is_visible = true, stepheight = true, glow = true, show_on_minimap = true +} -- activate mob and reload settings + function mob_class:mob_activate(staticdata, def, dtime) -- if dtime == 0 then entity has just been created -- anything higher means it is respawning (thanks SorceryKid) - if dtime == 0 and active_limit > 0 then - self.active_toggle = 1 - end + if dtime == 0 and active_limit > 0 then self.active_toggle = 1 end -- remove mob if not tamed and mob total reached - if active_limit > 0 and active_mobs >= active_limit and not self.tamed then + if at_limit() and not self.tamed then remove_mob(self) --print("-- mob limit reached, removing " .. self.name) @@ -3161,13 +2974,10 @@ function mob_class:mob_activate(staticdata, def, dtime) -- remove monsters in peaceful mode if self.type == "monster" and peaceful_only then - - remove_mob(self, true) - - return + remove_mob(self, true) ; return end - -- load entity variables + -- load entity variables from staticdata into self. local tmp = minetest.deserialize(staticdata) if tmp then @@ -3178,19 +2988,19 @@ function mob_class:mob_activate(staticdata, def, dtime) t = type(stat) - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" then - self[_] = stat + if t ~= "function" and t ~= "nil" and t ~= "userdata" then + + if is_property_name[_] then + + self.object:set_properties({[_] = stat}) + else + self[_] = stat + end end end end - -- force current model into mob - self.mesh = def.mesh - self.base_mesh = def.mesh - self.collisionbox = def.collisionbox - self.selectionbox = def.selectionbox + local prop = self.object:get_properties() -- select random texture, set model and size if not self.base_texture then @@ -3200,43 +3010,29 @@ function mob_class:mob_activate(staticdata, def, dtime) def.textures = {def.textures} end + -- backup a few base settings self.base_texture = def.textures and def.textures[random(#def.textures)] - self.base_mesh = def.mesh - self.base_size = self.visual_size - self.base_colbox = self.collisionbox - self.base_selbox = self.selectionbox end - -- for current mobs that dont have this set - if not self.base_selbox then - self.base_selbox = self.selectionbox or self.base_colbox - end - - -- set texture, model and size + -- get texture, model and size local textures = self.base_texture local mesh = self.base_mesh local vis_size = self.base_size local colbox = self.base_colbox local selbox = self.base_selbox - -- specific texture if gotten - if self.gotten == true and def.gotten_texture then - textures = def.gotten_texture - end + -- is there a specific texture if gotten + if self.gotten and def.gotten_texture then textures = def.gotten_texture end -- specific mesh if gotten - if self.gotten == true and def.gotten_mesh then - mesh = def.gotten_mesh - end + if self.gotten and def.gotten_mesh then mesh = def.gotten_mesh end -- set child objects to half size - if self.child == true then + if self.child then vis_size = {x = self.base_size.x * .5, y = self.base_size.y * .5} - if def.child_texture then - textures = def.child_texture[1] - end + if def.child_texture then textures = def.child_texture[1] end colbox = { self.base_colbox[1] * .5, self.base_colbox[2] * .5, @@ -3249,9 +3045,11 @@ function mob_class:mob_activate(staticdata, def, dtime) self.base_selbox[5] * .5, self.base_selbox[6] * .5} end - if self.health == 0 then - self.health = random(self.hp_min, self.hp_max) - end + -- set mob size and textures + self.object:set_properties({textures = textures, visual_size = vis_size, + collisionbox = colbox, selectionbox = selbox}) + + if self.health == 0 then self.health = random(self.hp_min, prop.hp_max) end -- pathfinding init self.path = {} @@ -3263,34 +3061,25 @@ function mob_class:mob_activate(staticdata, def, dtime) -- Armor groups (immortal = 1 for custom damage handling) local armor + if type(self.armor) == "table" then armor = table_copy(self.armor) else - armor = {fleshy = self.armor} -- immortal = 1 + armor = {fleshy = self.armor, immortal = 1} end + self.object:set_armor_groups(armor) -- mob defaults self.old_y = self.object:get_pos().y self.old_health = self.health - self.sounds.distance = self.sounds.distance or 10 self.textures = textures - self.mesh = mesh - self.collisionbox = colbox - self.selectionbox = selbox - self.visual_size = vis_size self.standing_in = "air" self.standing_on = "air" - - -- check existing nametag - if not self.nametag then - self.nametag = def.nametag - end + self.state = self.state or "stand" -- set anything changed above - self.object:set_properties(self) self:set_yaw((random(0, 360) - 180) / 180 * pi, 6) - self:update_tag() self:set_animation("stand") -- apply any texture mods @@ -3298,14 +3087,12 @@ function mob_class:mob_activate(staticdata, def, dtime) -- set 5.x flag to remove monsters when map area unloaded if remove_far and self.type == "monster" and not self.tamed then - self.static_save = false + self.object:set_properties({static_save = false}) end -- run on_spawn function if found - if self.on_spawn and not self.on_spawn_run then - if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only - end + if self.on_spawn and not self.on_spawn_run and self.on_spawn(self) then + self.on_spawn_run = true -- if true, set flag to run once only end -- run after_activate @@ -3314,61 +3101,93 @@ function mob_class:mob_activate(staticdata, def, dtime) end if use_cmi then - self._cmi_components = cmi.activate_components( - self.serialized_cmi_components) + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) cmi.notify_activate(self.object, dtime) end + + if use_vh1 then VH1.update_bar(self.object, self.health) end end - -- handle mob lifetimer and expiration + function mob_class:mob_expire(pos, dtime) -- when lifetimer expires remove mob (except npc and tamed) - if self.type ~= "npc" - and not self.tamed - and self.state ~= "attack" - and remove_far ~= true - and self.lifetimer < 20000 then + if self.type ~= "npc" and not self.tamed and self.state ~= "attack" + and remove_far ~= true and self.lifetimer < 20000 then self.lifetimer = self.lifetimer - dtime if self.lifetimer <= 0 then -- only despawn away from player - local objs = minetest.get_objects_inside_radius(pos, 15) - - for n = 1, #objs do - - if objs[n]:is_player() then + for _,player in pairs(minetest.get_connected_players()) do + if get_distance(player:get_pos(), pos) <= 15 then self.lifetimer = 20 - return end end --- minetest.log("action", --- S("lifetimer expired, removed @1", self.name)) +-- minetest.log("action", "lifetimer expired, removed " .. self.name) effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) - remove_mob(self, true) - - return + remove_mob(self, true) ; return end end end +-- get nodes mob is standing on, in, facing, facing above + +function mob_class:get_nodes() + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local prop = self.object:get_properties() + + -- child mobs have a lower y_level + local y_level = self.child and prop.collisionbox[2] * 0.5 or prop.collisionbox[2] + + self.standing_in = node_ok( + {x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name + + self.standing_on = node_ok( + {x = pos.x, y = pos.y + y_level - 0.25, z = pos.z}, "air").name + + -- find front position + local dir_x = -sin(yaw) * (prop.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (prop.collisionbox[4] + 0.5) + + -- nodes in front of mob and front/above + self.looking_at = node_ok( + {x = pos.x + dir_x, y = pos.y + y_level + 0.25, z = pos.z + dir_z}).name + + self.looking_above = node_ok( + {x = pos.x + dir_x, y = pos.y + y_level + 1.25, z = pos.z + dir_z}).name + + -- are we facing a fence or wall + if self.looking_at:find("fence") or self.looking_at:find("gate") + or self.looking_at:find("wall") then + self.facing_fence = true + else + self.facing_fence = nil + end +--[[ +print("on: " .. self.standing_on + .. ", front: " .. self.looking_at + .. ", front above: " .. self.looking_above + .. ", fence: " .. (self.facing_fence and "yes" or "no")) +]] +end -- main mob function + function mob_class:on_step(dtime, moveresult) if self.state == "die" then return end - if use_cmi then - cmi.notify_step(self.object, dtime) - end + if use_cmi then cmi.notify_step(self.object, dtime) end local pos = self.object:get_pos() local yaw = self.object:get_yaw() @@ -3376,69 +3195,43 @@ function mob_class:on_step(dtime, moveresult) -- early warning check, if no yaw then no entity, skip rest of function if not yaw then return end - -- get node at foot level every quarter second self.node_timer = (self.node_timer or 0) + dtime - if self.node_timer > 0.25 then + -- get nodes every 1/4 second + if self.node_timer > node_timer_interval then + + -- get nodes above, below, in front and front-above + self:get_nodes() self.node_timer = 0 - local y_level = self.collisionbox[2] - - if self.child then - y_level = self.collisionbox[2] * 0.5 - end - - -- what is mob standing in? - self.standing_in = node_ok({ - x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name - - self.standing_on = node_ok({ - x = pos.x, y = pos.y + y_level - 0.25, z = pos.z}, "air").name - ---print("standing in " .. self.standing_in) - - -- if standing inside solid block then jump to escape - if minetest.registered_nodes[self.standing_in].walkable - and minetest.registered_nodes[self.standing_in].drawtype - == "normal" then - - self.object:set_velocity({ - x = 0, - y = self.jump_height, - z = 0 - }) - end - -- check and stop if standing at cliff and fear of heights self.at_cliff = self:is_at_cliff() - if self.at_cliff then - self:set_velocity(0) - end + if self.pause_timer <= 0 and self.at_cliff then self:set_velocity(0) end -- has mob expired (0.25 instead of dtime since were in a timer) - self:mob_expire(pos, 0.25) + self:mob_expire(pos, node_timer_interval) + + -- check if mob can jump or is blocked facing fence/gate etc. + self:do_jump() end -- check if falling, flying, floating and return if player died - if self:falling(pos) then - return - end + if self:falling(pos) then return end -- smooth rotation by ThomasMonroe314 if self.delay and self.delay > 0 then - if self.delay == 1 then - yaw = self.target_yaw + if self.delay == 1 then yaw = self.target_yaw else local dif = abs(yaw - self.target_yaw) if yaw > self.target_yaw then if dif > pi then - dif = 2 * pi - dif -- need to add - yaw = yaw + dif / self.delay + dif = 2 * pi - dif + yaw = yaw + dif / self.delay -- need to add else yaw = yaw - dif / self.delay -- need to subtract end @@ -3461,50 +3254,10 @@ function mob_class:on_step(dtime, moveresult) self.object:set_yaw(yaw) end - -- knockback timer - if self.pause_timer > 0 then - - self.pause_timer = self.pause_timer - dtime - - return - end - - -- run custom function (defined in mob lua file) - if self.do_custom then - - -- when false skip going any further - if self:do_custom(dtime) == false then - return - end - end - - -- attack timer - self.timer = self.timer + dtime - - if self.state ~= "attack" then - - if self.timer < 1 then - return - end - - self.timer = 0 - end - - -- never go over 100 - if self.timer > 100 then - self.timer = 1 - end - - -- mob plays random sound at times - if random(100) == 1 then - self:mob_sound(self.sounds.random) - end - -- environmental damage timer (every 1 second) self.env_damage_timer = self.env_damage_timer + dtime - if (self.state == "attack" and self.env_damage_timer > 1) - or self.state ~= "attack" then + if self.env_damage_timer > 1 then self.env_damage_timer = 0 @@ -3515,40 +3268,73 @@ function mob_class:on_step(dtime, moveresult) self:replace(pos) end - self:general_attack() + -- knockback timer + if self.pause_timer > 0 then - self:breed() + self.pause_timer = self.pause_timer - dtime - self:follow_flop() + if self.pause_timer <= 0 and (self.order == "stand" or self.state == "stand") then - if self:do_states(dtime) then return end + self.pause_timer = 0 + self:set_velocity(0) + self:set_animation("stand", true) + end - self:do_jump() + return + end - self:do_runaway_from(self) + -- run custom function (defined in mob lua file) - when false skip going any further + if self.do_custom and self:do_custom(dtime, moveresult) == false then + return + end - self:do_stay_near() + self.timer = self.timer + dtime + + -- never go over 100 + if self.timer > 100 then self.timer = 1 end + + -- when attacking call do_states live (return if dead) + if self.state == "attack" and self:do_states(dtime) then return end + + -- one second timed calls + self.timer1 = (self.timer1 or 0) + dtime + + if self.timer1 >= main_timer_interval then + + -- mob plays random sound at times + if random(100) == 1 then self:mob_sound(self.sounds.random) end + + self:general_attack() + self:breed() + self:follow_flop() + + -- when not attacking call do_states every second (return if dead) + if self.state ~= "attack" then + if self:do_states(main_timer_interval) then return end + end + + self:do_runaway_from(self) + self:do_stay_near() + + self.timer1 = 0 + end end - -- default function when mobs are blown up with TNT + function mob_class:on_blast(damage) --print("-- blast damage", damage) - self.object:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) + self.object:punch(self.object, 1.0, + {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, nil) -- return no damage, no knockback, no item drops, mob api handles all return false, false, {} end - -mobs.spawning_mobs = {} - -- register mob entity + function mobs:register_mob(name, def) mobs.spawning_mobs[name] = {} @@ -3556,152 +3342,168 @@ function mobs:register_mob(name, def) local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} -- quick fix to stop mobs glitching through nodes if too small - if -collisionbox[2] + collisionbox[5] < 1.01 then + if mob_height_fix and -collisionbox[2] + collisionbox[5] < 1.01 then collisionbox[5] = collisionbox[2] + 0.99 end -minetest.register_entity(name, setmetatable({ + minetest.register_entity(":" .. name, setmetatable({ - stepheight = def.stepheight, - name = name, - type = def.type, - attack_type = def.attack_type, - fly = def.fly, - fly_in = def.fly_in, - keep_flying = def.keep_flying, - owner = def.owner, - order = def.order, - on_die = def.on_die, - on_flop = def.on_flop, - do_custom = def.do_custom, - jump_height = def.jump_height, - drawtype = def.drawtype, -- DEPRECATED, use rotate instead - rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2 - glow = def.glow, - lifetimer = def.lifetimer, - hp_min = max(1, (def.hp_min or 5) * difficulty), - hp_max = max(1, (def.hp_max or 10) * difficulty), - collisionbox = collisionbox, --def.collisionbox, - selectionbox = def.selectionbox or collisionbox, --def.collisionbox, - visual = def.visual, - visual_size = def.visual_size, - mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound, - view_range = def.view_range, - walk_velocity = def.walk_velocity, - run_velocity = def.run_velocity, - damage = max(0, (def.damage or 0) * difficulty), - damage_group = def.damage_group, - damage_texture_modifier = def.damage_texture_modifier, - light_damage = def.light_damage, - light_damage_min = def.light_damage_min, - light_damage_max = def.light_damage_max, - water_damage = def.water_damage, - lava_damage = def.lava_damage, - fire_damage = def.fire_damage, - air_damage = def.air_damage, - suffocation = def.suffocation, - fall_damage = def.fall_damage, - fall_speed = def.fall_speed, - drops = def.drops, - armor = def.armor, - on_rightclick = def.on_rightclick, - arrow = def.arrow, - arrow_override = def.arrow_override, - shoot_interval = def.shoot_interval, - sounds = def.sounds, - animation = def.animation, - follow = def.follow, - jump = def.jump, - walk_chance = def.walk_chance, - stand_chance = def.stand_chance, - attack_chance = def.attack_chance, - passive = def.passive, - knock_back = def.knock_back, - blood_amount = def.blood_amount, - blood_texture = def.blood_texture, - shoot_offset = def.shoot_offset, - floats = def.floats, - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset, - on_replace = def.on_replace, - reach = def.reach, - texture_list = def.textures, - texture_mods = def.texture_mods or "", - child_texture = def.child_texture, - docile_by_day = def.docile_by_day, - fear_height = def.fear_height, - runaway = def.runaway, - pathfinding = def.pathfinding, - immune_to = def.immune_to, - explosion_radius = def.explosion_radius, - explosion_damage_radius = def.explosion_damage_radius, - explosion_timer = def.explosion_timer, - allow_fuse_reset = def.allow_fuse_reset, - stop_to_explode = def.stop_to_explode, - custom_attack = def.custom_attack, - double_melee_attack = def.double_melee_attack, - dogshoot_switch = def.dogshoot_switch, - dogshoot_count_max = def.dogshoot_count_max, - dogshoot_count2_max = def.dogshoot_count2_max or def.dogshoot_count_max, - group_attack = def.group_attack, - group_helper = def.group_helper, - attack_monsters = def.attacks_monsters or def.attack_monsters, - attack_animals = def.attack_animals, - attack_players = def.attack_players, - attack_npcs = def.attack_npcs, - specific_attack = def.specific_attack, - runaway_from = def.runaway_from, - owner_loyal = def.owner_loyal, - pushable = def.pushable, - stay_near = def.stay_near, - randomly_turn = def.randomly_turn ~= false, - ignore_invisibility = def.ignore_invisibility, + initial_properties = { + hp_max = max(1, (def.hp_max or 10) * difficulty), + physical = true, + collisionbox = collisionbox, + selectionbox = def.selectionbox or collisionbox, + visual = def.visual, + visual_size = def.visual_size or {x = 1, y = 1}, + mesh = def.mesh, + textures = "", + makes_footstep_sound = def.makes_footstep_sound, + stepheight = def.stepheight or 1.1, + glow = def.glow, + damage_texture_modifier = def.damage_texture_modifier or "^[colorize:#c9900070", + }, - on_spawn = def.on_spawn, + name = name, + type = def.type, + _nametag = def.nametag, + attack_type = def.attack_type, + fly = def.fly, + fly_in = def.fly_in, + keep_flying = def.keep_flying, + owner = def.owner, + order = def.order, + jump_height = def.jump_height, + can_leap = def.can_leap, + drawtype = def.drawtype, -- DEPRECATED, use rotate instead + rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2 + lifetimer = def.lifetimer, + hp_min = max(1, (def.hp_min or 5) * difficulty), - on_blast = def.on_blast, -- class redifinition + -- backup entity model and size + base_mesh = def.mesh, + base_colbox = collisionbox, + base_selbox = def.selectionbox or collisionbox, + base_size = def.visual_size or {x = 1, y = 1}, - do_punch = def.do_punch, + view_range = def.view_range, + walk_velocity = def.walk_velocity, + run_velocity = def.run_velocity, + damage = max(0, (def.damage or 0) * difficulty), + damage_group = def.damage_group, + light_damage = def.light_damage, + light_damage_min = def.light_damage_min, + light_damage_max = def.light_damage_max, + water_damage = def.water_damage, + lava_damage = def.lava_damage, + fire_damage = def.fire_damage, + air_damage = def.air_damage, + node_damage = def.node_damage, + suffocation = def.suffocation, + fall_damage = def.fall_damage, + fall_speed = def.fall_speed, + drops = def.drops, + armor = def.armor, + arrow = def.arrow, + arrow_override = def.arrow_override, + shoot_interval = def.shoot_interval, + homing = def.homing, + sounds = def.sounds, + animation = def.animation, + follow = def.follow, + jump = def.jump, + walk_chance = def.walk_chance, + stand_chance = def.stand_chance, + attack_chance = def.attack_chance, + attack_patience = def.attack_patience, + passive = def.passive, + knock_back = def.knock_back, + blood_amount = def.blood_amount, + blood_texture = def.blood_texture, + shoot_offset = def.shoot_offset, + floats = def.floats, + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset, + reach = def.reach, + texture_list = def.textures, + texture_mods = def.texture_mods or "", + child_texture = def.child_texture, + docile_by_day = def.docile_by_day, + fear_height = def.fear_height, + runaway = def.runaway, + pathfinding = def.pathfinding, + immune_to = def.immune_to, + explosion_radius = def.explosion_radius, + explosion_damage_radius = def.explosion_damage_radius, + explosion_timer = def.explosion_timer, + allow_fuse_reset = def.allow_fuse_reset, + stop_to_explode = def.stop_to_explode, + double_melee_attack = def.double_melee_attack, + dogshoot_switch = def.dogshoot_switch, + dogshoot_count_max = def.dogshoot_count_max, + dogshoot_count2_max = def.dogshoot_count2_max or def.dogshoot_count_max, + group_attack = def.group_attack, + group_helper = def.group_helper, + attack_monsters = def.attacks_monsters or def.attack_monsters, + attack_animals = def.attack_animals, + attack_players = def.attack_players, + attack_npcs = def.attack_npcs, + attack_ignore = def.attack_ignore, + specific_attack = def.specific_attack, + friendly_fire = def.friendly_fire, + runaway_from = def.runaway_from, + owner_loyal = def.owner_loyal, + pushable = def.pushable, + stay_near = def.stay_near, + randomly_turn = def.randomly_turn ~= false, + ignore_invisibility = def.ignore_invisibility, + messages = def.messages, - on_breed = def.on_breed, + on_rightclick = def.on_rightclick, + on_die = def.on_die, + on_death = def.on_death, -- engine function for entity death + on_flop = def.on_flop, + do_custom = def.do_custom, + on_replace = def.on_replace, + custom_attack = def.custom_attack, + on_spawn = def.on_spawn, + on_blast = def.on_blast, -- class redifinition + do_punch = def.do_punch, + on_breed = def.on_breed, + on_grown = def.on_grown, + on_sound = def.on_sound, - on_grown = def.on_grown, + is_mob = true, _hittable_by_projectile = true, -- mineclone thing - on_activate = function(self, staticdata, dtime) - return self:mob_activate(staticdata, def, dtime) - end, + on_activate = function(self, staticdata, dtime) + return self:mob_activate(staticdata, def, dtime) + end, - get_staticdata = function(self) - return self:mob_staticdata(self) - end, - -}, mob_class_meta)) - -end -- END mobs:register_mob function + get_staticdata = function(self) + return self:mob_staticdata(self) + end + }, mob_class_meta)) +end -- count how many mobs of one type are inside an area -- will also return true for second value if player is inside area -local count_mobs = function(pos, type) + +local function count_mobs(pos, type) local total = 0 local objs = minetest.get_objects_inside_radius(pos, aoc_range * 2) - local ent - local players + local ent, players for n = 1, #objs do - if not objs[n]:is_player() then + if not is_player(objs[n]) then ent = objs[n]:get_luaentity() -- count mob type and add to total also - if ent and ent.name and ent.name == type then - total = total + 1 - end + if ent and ent.name and ent.name == type then total = total + 1 end else players = true end @@ -3710,34 +3512,30 @@ local count_mobs = function(pos, type) return total, players end - -- do we have enough space to spawn mob? (thanks wuzzy) -local can_spawn = function(pos, name) + +local function can_spawn(pos, name) local ent = minetest.registered_entities[name] - local width_x = max(1, ceil(ent.collisionbox[4] - ent.collisionbox[1])) + local width_x = max(1, ceil(ent.base_colbox[4] - ent.base_colbox[1])) local min_x, max_x if width_x % 2 == 0 then - max_x = floor(width_x / 2) - min_x = -(max_x - 1) + max_x = floor(width_x / 2) ; min_x = -(max_x - 1) else - max_x = floor(width_x / 2) - min_x = -max_x + max_x = floor(width_x / 2) ; min_x = -max_x end - local width_z = max(1, ceil(ent.collisionbox[6] - ent.collisionbox[3])) + local width_z = max(1, ceil(ent.base_colbox[6] - ent.base_colbox[3])) local min_z, max_z if width_z % 2 == 0 then - max_z = floor(width_z / 2) - min_z = -(max_z - 1) + max_z = floor(width_z / 2) ; min_z = -(max_z - 1) else - max_z = floor(width_z / 2) - min_z = -max_z + max_z = floor(width_z / 2) ; min_z = -max_z end - local max_y = max(0, ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + local max_y = max(0, ceil(ent.base_colbox[5] - ent.base_colbox[2]) - 1) local pos2 for y = 0, max_y do @@ -3746,7 +3544,7 @@ local can_spawn = function(pos, name) pos2 = {x = pos.x + x, y = pos.y + y, z = pos.z + z} - if minetest.registered_nodes[node_ok(pos2).name].walkable == true then + if minetest.registered_nodes[node_ok(pos2).name].walkable then return nil end end @@ -3754,13 +3552,9 @@ local can_spawn = function(pos, name) end -- tweak X/Z spawn pos - if width_x % 2 == 0 then - pos.x = pos.x + 0.5 - end + if width_x % 2 == 0 then pos.x = pos.x + 0.5 end - if width_z % 2 == 0 then - pos.z = pos.z + 0.5 - end + if width_z % 2 == 0 then pos.z = pos.z + 0.5 end return pos end @@ -3769,20 +3563,24 @@ function mobs:can_spawn(pos, name) return can_spawn(pos, name) end - -- global functions function mobs:add_mob(pos, def) + -- nil check + if not pos or not def then +--print("--- no position or definition given") + return + end + -- is mob actually registered? - if not mobs.spawning_mobs[def.name] - or not minetest.registered_entities[def.name] then + if not mobs.spawning_mobs[def.name] or not minetest.registered_entities[def.name] then --print("--- mob doesn't exist", def.name) return end -- are we over active mob limit - if active_limit > 0 and active_mobs >= active_limit then + if at_limit() then --print("--- active mob limit reached", active_mobs, active_limit) return end @@ -3795,8 +3593,7 @@ function mobs:add_mob(pos, def) return end - local aoc = mobs.spawning_mobs[def.name] - and mobs.spawning_mobs[def.name].aoc or 1 + local aoc = mobs.spawning_mobs[def.name] and mobs.spawning_mobs[def.name].aoc or 1 if def.ignore_count ~= true and num_mob >= aoc then --print("--- too many " .. def.name .. " in area", num_mob .. "/" .. aoc) @@ -3812,43 +3609,49 @@ function mobs:add_mob(pos, def) if not ent then --print("[mobs] entity not found " .. def.name) return false + else + effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) end + -- use new texture if found + local new_texture = def.texture or ent.base_texture + if def.child then - local textures = ent.base_texture + ent.mommy_tex = new_texture -- how baby looks when grown + ent.base_texture = new_texture -- using specific child texture (if found) if ent.child_texture then - textures = ent.child_texture[1] + new_texture = ent.child_texture[1] end - -- and resize to half height + -- and resize to half height (multiplication is faster than division) mob:set_properties({ - textures = textures, + textures = new_texture, visual_size = { - x = ent.base_size.x * .5, - y = ent.base_size.y * .5 + x = ent.base_size.x * .5, y = ent.base_size.y * .5 }, collisionbox = { - ent.base_colbox[1] * .5, - ent.base_colbox[2] * .5, - ent.base_colbox[3] * .5, - ent.base_colbox[4] * .5, - ent.base_colbox[5] * .5, - ent.base_colbox[6] * .5 + ent.base_colbox[1] * .5, ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, ent.base_colbox[6] * .5 }, selectionbox = { - ent.base_selbox[1] * .5, - ent.base_selbox[2] * .5, - ent.base_selbox[3] * .5, - ent.base_selbox[4] * .5, - ent.base_selbox[5] * .5, - ent.base_selbox[6] * .5 - }, + ent.base_selbox[1] * .5, ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, ent.base_selbox[6] * .5 + } }) ent.child = true + + -- if not child set new texture + elseif def.texture then + + ent.base_texture = new_texture + + mob:set_properties({textures = new_texture}) end if def.owner then @@ -3863,20 +3666,19 @@ function mobs:add_mob(pos, def) def.nametag = def.nametag:sub(1, 64) end - ent.nametag = def.nametag - - ent:update_tag() + ent:update_tag(def.nametag) end return ent end +-- global function to add additional spawn checks function mobs:spawn_abm_check(pos, node, name) - -- global function to add additional spawn checks -- return true to stop spawning mob end +-- older spawning function function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn, map_load) @@ -3910,42 +3712,37 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter mobs.spawning_mobs[name].aoc = aoc - local spawn_action = function(pos, node, active_object_count, - active_object_count_wider) + local function spawn_action(pos, node, active_object_count, active_object_count_wider) - -- use instead of abm's chance setting when using lbm - if map_load and random(max(1, (chance * mob_chance_multiplier))) > 1 then + -- do not spawn if too many entities in area + if active_object_count_wider and active_object_count_wider >= max_per_block then +--print("--- too many entities in area", active_object_count_wider) return end - -- use instead of abm's neighbor setting when using lbm - if map_load and not minetest.find_node_near(pos, 1, neighbors) then ---print("--- lbm neighbors not found") + -- when using lbm manually check for chance and neighbor + if map_load and (random(max(1, (chance * mob_chance_multiplier))) > 1 + or not minetest.find_node_near(pos, 1, neighbors)) then +--print("-- lbm no chance or neighbor not found") return end + local ent = minetest.registered_entities[name] + -- is mob actually registered? - if not mobs.spawning_mobs[name] - or not minetest.registered_entities[name] then + if not mobs.spawning_mobs[name] or not ent then --print("--- mob doesn't exist", name) return end - -- are we over active mob limit - if active_limit > 0 and active_mobs >= active_limit then + -- are we over set mob limit + if at_limit() then --print("--- active mob limit reached", active_mobs, active_limit) return end - -- additional custom checks for spawning mob - if mobs:spawn_abm_check(pos, node, name) == true then - return - end - - -- do not spawn if too many entities in area - if active_object_count_wider - and active_object_count_wider >= max_per_block then ---print("--- too many entities in area", active_object_count_wider) + -- additional custom checks for mob spawning + if mobs:spawn_abm_check(pos, node, name) then return end @@ -3968,35 +3765,31 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter local tod = (minetest.get_timeofday() or 0) * 24000 if tod > 4500 and tod < 19500 then - -- daylight, but mob wants night - if day_toggle == false then + + if day_toggle == false then -- daylight, but mob wants night --print("--- mob needs night", name) return end else - -- night time but mob wants day - if day_toggle == true then + if day_toggle then -- night time but mob wants day --print("--- mob needs day", name) return end end end - -- spawn above node + -- change position to node above pos.y = pos.y + 1 -- are we spawning within height limits? - if pos.y > max_height - or pos.y < min_height then + if pos.y > max_height or pos.y < min_height then --print("--- height limits not met", name, pos.y) return end -- are light levels ok? local light = minetest.get_node_light(pos) - if not light - or light > max_light - or light < min_light then + if not light or light > max_light or light < min_light then --print("--- light limits not met", name, light) return end @@ -4011,29 +3804,25 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter end -- only spawn a set distance away from player - local objs = minetest.get_objects_inside_radius(pos, mob_nospawn_range) + for _,player in pairs(minetest.get_connected_players()) do - for n = 1, #objs do - - if objs[n]:is_player() then + if get_distance(player:get_pos(), pos) <= mob_nospawn_range then --print("--- player too close", name) return end end - local ent = minetest.registered_entities[name] - -- should we check mob area for obstructions ? if mob_area_spawn ~= true then -- do we have enough height clearance to spawn mob? - local height = max(0, ent.collisionbox[5] - ent.collisionbox[2]) + local height = max(0, ent.base_colbox[5] - ent.base_colbox[2]) for n = 0, floor(height) do local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} - if minetest.registered_nodes[node_ok(pos2).name].walkable == true then + if minetest.registered_nodes[node_ok(pos2).name].walkable then --print ("--- inside block", name, node_ok(pos2).name) return end @@ -4045,40 +3834,42 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter if pos then - -- adjust for mob collision box - pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 + -- get mob collisionbox and determine y_offset when spawning + local _prop = ent and ent.initial_properties or {} + local _y = _prop.collisionbox and -_prop.collisionbox[2] or 1 + + pos.y = pos.y + _y local mob = minetest.add_entity(pos, name) --- print("[mobs] Spawned " .. name .. " at " --- .. minetest.pos_to_string(pos) .. " on " --- .. node.name .. " near " .. neighbors[1]) + if mob_log_spawn then - if on_spawn then - on_spawn(mob:get_luaentity(), pos) + local pos_string = pos and minetest.pos_to_string(pos) or "" + + minetest.log("[MOBS] Spawned " .. (name or "") .. " at " .. pos_string) end + + if on_spawn and mob then on_spawn(mob:get_luaentity(), pos) end else --print("--- not enough space to spawn", name) end end - -- are we registering an abm or lbm? - if map_load == true then + if map_load then minetest.register_lbm({ name = name .. "_spawning", label = name .. " spawning", nodenames = nodes, run_at_every_load = false, + min_y = min_height, max_y = max_height, action = function(pos, node) spawn_action(pos, node) end }) - else - minetest.register_abm({ label = name .. " spawning", nodenames = nodes, @@ -4086,6 +3877,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter interval = interval, chance = max(1, (chance * mob_chance_multiplier)), catch_up = false, + min_y = min_height, max_y = max_height, action = function(pos, node, active_object_count, active_object_count_wider) spawn_action(pos, node, active_object_count, active_object_count_wider) @@ -4094,8 +3886,8 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter end end +-- compatibility with older mob registration [DEPRECATED] --- compatibility with older mob registration function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) @@ -4103,8 +3895,8 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, chance, active_object_count, -31000, max_height, day_toggle) end +-- MarkBu's newer spawn function (USE this one please modders) --- MarkBu's spawn function (USE this one please) function mobs:spawn(def) mobs:spawn_specific( @@ -4123,40 +3915,41 @@ function mobs:spawn(def) def.on_map_load) end - -- register arrow for shoot attack + function mobs:register_arrow(name, def) - if not name or not def then return end -- errorcheck + if not name or not def then return end - minetest.register_entity(name, { + minetest.register_entity(":" .. name, { - physical = def.physical or false, - collide_with_objects = def.collide_with_objects or false, - static_save = false, + initial_properties = { + physical = def.physical, + collide_with_objects = def.collide_with_objects or false, + static_save = false, + visual = def.visual, + visual_size = def.visual_size, + textures = def.textures, + collisionbox = def.collisionbox or {-.1, -.1, -.1, .1, .1, .1}, + glow = def.glow, + automatic_face_movement_dir = def.rotate + and (def.rotate - (pi / 180)) or false, + }, - visual = def.visual, - visual_size = def.visual_size, - textures = def.textures, velocity = def.velocity, hit_player = def.hit_player, hit_node = def.hit_node, hit_mob = def.hit_mob, hit_object = def.hit_object, - drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = def.collisionbox or {-.1, -.1, -.1, .1, .1, .1}, + drop = def.drop, -- chance of dropping arrow as registered item timer = 0, lifetime = def.lifetime or 4.5, - switch = 0, owner_id = def.owner_id, rotate = def.rotate, - automatic_face_movement_dir = def.rotate - and (def.rotate - (pi / 180)) or false, on_activate = def.on_activate, - on_punch = def.on_punch or function( - self, hitter, tflp, tool_capabilities, dir) + on_punch = def.on_punch or function(self, hitter, tflp, tool_capabilities, dir) end, on_step = def.on_step or function(self, dtime) @@ -4165,7 +3958,7 @@ function mobs:register_arrow(name, def) local pos = self.object:get_pos() - if self.switch == 0 or self.timer > self.lifetime then + if self.timer > self.lifetime then self.object:remove() ; -- print("removed arrow") @@ -4187,195 +3980,241 @@ function mobs:register_arrow(name, def) }) end - if self.hit_node then + -- make homing arrows follow target if seen + if self._homing_target then - local node = node_ok(pos).name + local p = self._homing_target:get_pos() - if minetest.registered_nodes[node].walkable then + if p then - self:hit_node(pos, node) + if minetest.line_of_sight(self.object:get_pos(), p) then - if self.drop == true then - - pos.y = pos.y + 1 - - self.lastpos = (self.lastpos or pos) - - minetest.add_item(self.lastpos, - self.object:get_luaentity().name) + self.object:set_velocity( + vector.direction(self.object:get_pos(), p) * self.velocity) end - - self.object:remove() ; -- print("hit node") - - return + else + self._homing_target = nil end end - if self.hit_player or self.hit_mob or self.hit_object then + -- raycasting + self.lastpos = self.lastpos or pos - for _,player in pairs( - minetest.get_objects_inside_radius(pos, 1.0)) do + local cast = minetest.raycast(self.lastpos, pos, true, true) + local thing = cast:next() - if self.hit_player and player:is_player() then + -- loop through things + while thing do - self:hit_player(player) + -- if inside object that isn't arrow + if thing.type == "object" and thing.ref ~= self.object + and tostring(thing.ref) ~= self.owner_id then - self.object:remove() ; -- print("hit player") + if self.hit_player and is_player(thing.ref) then + + self:hit_player(thing.ref) + + self.object:remove() + +--print("hit player", thing.ref:get_player_name()) + + return + + end + + local entity = thing.ref:get_luaentity() + + if entity and self.hit_mob and entity._cmi_is_mob then + + self:hit_mob(thing.ref) + + self.object:remove() + +--print("hit mob", entity.name) return end - local entity = player:get_luaentity() + if entity and self.hit_object and (not entity._cmi_is_mob) then - if entity - and self.hit_mob - and entity._cmi_is_mob == true - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then + self:hit_object(thing.ref) - self:hit_mob(player) + self.object:remove() - self.object:remove() ; --print("hit mob") +--print("hit object", entity.name) return end - if entity - and self.hit_object - and (not entity._cmi_is_mob) - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then + end - self:hit_object(player) + -- if inside node + if thing.type == "node" and self.hit_node then - self.object:remove() ; -- print("hit object") + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + + if def and def.walkable then + + self:hit_node(pos, node) + + if (type(self.drop) == "boolean" and self.drop) + or (type(self.drop) == "number" and random(self.drop) == 1) then + + pos.y = pos.y + 1 + + minetest.add_item(self.lastpos, + self.object:get_luaentity().name) + end + + self.object:remove() + +--print("hit node", node.name) return end end - end + + thing = cast:next() + + end -- end thing loop self.lastpos = pos end }) end - --- compatibility function -function mobs:explosion(pos, radius) - mobs:boom({sounds = {explode = "tnt_explode"}}, pos, radius) -end - - -- no damage to nodes explosion -function mobs:safe_boom(self, pos, radius) + +function mobs:safe_boom(self, pos, radius, texture) minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { pos = pos, gain = 1.0, - max_hear_distance = self.sounds and self.sounds.distance or 32 + max_hear_distance = (self.sounds and self.sounds.distance) or 32 }, true) entity_physics(pos, radius) - effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) + effect(pos, 32, texture, radius * 3, radius * 5, radius, 1, 0) end - -- make explosion with protection and tnt mod check -function mobs:boom(self, pos, radius) - if mobs_griefing - and minetest.get_modpath("tnt") and tnt and tnt.boom +function mobs:boom(self, pos, node_damage_radius, entity_radius, texture) + + texture = texture or "tnt_smoke.png" + + if mobs_griefing and minetest.get_modpath("tnt") and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { - radius = radius, - damage_radius = radius, + radius = node_damage_radius, + damage_radius = entity_radius, sound = self.sounds and self.sounds.explode, - explode_center = true + explode_center = true, + tiles = texture }) else - mobs:safe_boom(self, pos, radius) + mobs:safe_boom(self, pos, node_damage_radius, texture) end end +function mobs:explosion(pos, radius) -- [deprecated] compatibility function + mobs:boom({sounds = {explode = "tnt_explode"}}, pos, radius, radius, "tnt_smoke.png") +end --- Register spawn eggs +-- Register spawn eggs - This also introduces the “spawn_egg” group: +-- * spawn_egg=1: generic mob, no metadata +-- * spawn_egg=2: captured/tamed mob, metadata --- Note: This also introduces the “spawn_egg” group: --- * spawn_egg=1: Spawn egg (generic mob, no metadata) --- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) function mobs:register_egg(mob, desc, background, addegg, no_creative) local grp = {spawn_egg = 1} -- do NOT add this egg to creative inventory (e.g. dungeon master) - if no_creative == true then - grp.not_in_creative_inventory = 1 - end + if no_creative then grp.not_in_creative_inventory = 1 end local invimg = background if addegg == 1 then - invimg = "mobs_chicken_egg.png^(" .. invimg .. - "^[mask:mobs_chicken_egg_overlay.png)" + invimg = "mobs_chicken_egg.png^(" .. invimg .. "^[mask:mobs_chicken_egg_overlay.png)" end - -- register new spawn egg containing mob information - minetest.register_craftitem(mob .. "_set", { + -- does mob/entity exist + local is_mob = minetest.registered_entities[mob] - description = S("@1 (Tamed)", desc), - inventory_image = invimg, - groups = {spawn_egg = 2, not_in_creative_inventory = 1}, - stack_max = 1, + if not is_mob then + print("[Mobs Redo] Spawn Egg cannot be created for " .. mob) + return + end - on_place = function(itemstack, placer, pointed_thing) + -- get mob collisionbox and determine y_offset when spawning + local _prop = is_mob and is_mob.initial_properties or {} + local _y = _prop.collisionbox and -_prop.collisionbox[2] or 1 - local pos = pointed_thing.above + -- register new spawn egg containing mob information (cannot be stacked) + -- these are only created for animals and npc's, not monsters + if is_mob.type ~= "monster" then - -- does existing on_rightclick function exist? - local under = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[under.name] + minetest.register_craftitem(":" .. mob .. "_set", { - if def and def.on_rightclick then + description = S("@1 (Tamed)", desc), + inventory_image = invimg, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, + stack_max = 1, - return def.on_rightclick( - pointed_thing.under, under, placer, itemstack, pointed_thing) - end + on_place = function(itemstack, placer, pointed_thing) - if pos - and not minetest.is_protected(pos, placer:get_player_name()) then + local pos = pointed_thing.above - if not minetest.registered_entities[mob] then - return + -- does existing on_rightclick function exist? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + + if def and def.on_rightclick then + + return def.on_rightclick( + pointed_thing.under, under, placer, itemstack, pointed_thing) end - pos.y = pos.y + 1 + if pos and not minetest.is_protected(pos, placer:get_player_name()) then - local data = itemstack:get_metadata() - local smob = minetest.add_entity(pos, mob, data) - local ent = smob and smob:get_luaentity() + -- have we reached active mob limit + if at_limit() then - if not ent then return end -- sanity check + minetest.chat_send_player(placer:get_player_name(), + S("Active Mob Limit Reached!") + .. " (" .. active_mobs + .. " / " .. active_limit .. ")") + return + end - -- set owner if not a monster - if ent.type ~= "monster" then - ent.owner = placer:get_player_name() - ent.tamed = true + pos.y = pos.y + _y + + local data = itemstack:get_metadata() + local smob = minetest.add_entity(pos, mob, data) + local ent = smob and smob:get_luaentity() + + if not ent then return end -- sanity check + + -- set owner if not a monster + if ent.type ~= "monster" then + ent.owner = placer:get_player_name() + ent.tamed = true + end + + -- since mob is unique we remove egg once spawned + itemstack:take_item() end - -- since mob is unique we remove egg once spawned - itemstack:take_item() + return itemstack end - - return itemstack - end, - }) - + }) + end -- register old stackable mob egg - minetest.register_craftitem(mob, { + minetest.register_craftitem(":" .. mob, { description = desc, inventory_image = invimg, @@ -4395,15 +4234,11 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) pointed_thing.under, under, placer, itemstack, pointed_thing) end - if pos - and not minetest.is_protected(pos, placer:get_player_name()) then - - if not minetest.registered_entities[mob] then - return - end + if pos and not minetest.is_protected(pos, placer:get_player_name()) then -- have we reached active mob limit - if active_limit > 0 and active_mobs >= active_limit then + if at_limit() then + minetest.chat_send_player(placer:get_player_name(), S("Active Mob Limit Reached!") .. " (" .. active_mobs @@ -4411,7 +4246,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) return end - pos.y = pos.y + 1 + pos.y = pos.y + _y local smob = minetest.add_entity(pos, mob) local ent = smob and smob:get_luaentity() @@ -4419,8 +4254,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) if not ent then return end -- sanity check -- don't set owner if monster or sneak pressed - if ent.type ~= "monster" - and not placer:get_player_control().sneak then + if ent.type ~= "monster" and not placer:get_player_control().sneak then ent.owner = placer:get_player_name() ent.tamed = true end @@ -4432,31 +4266,18 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end return itemstack - end, + end }) end - -- force capture a mob if space available in inventory, or drop as spawn egg + function mobs:force_capture(self, clicker) -- add special mob egg with all mob information local new_stack = ItemStack(self.name .. "_set") - local tmp, t = {} - - for _,stat in pairs(self) do - - t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" then - tmp[_] = self[_] - end - end - - local data_str = minetest.serialize(tmp) + local data_str = minetest.serialize(clean_staticdata(self)) new_stack:set_metadata(data_str) @@ -4473,14 +4294,12 @@ function mobs:force_capture(self, clicker) remove_mob(self, true) end - -- capture critter (thanks to blert2112 for idea) -function mobs:capture_mob(self, clicker, chance_hand, chance_net, - chance_lasso, force_take, replacewith) - if not self --self.child - or not clicker:is_player() - or not clicker:get_inventory() then +function mobs:capture_mob( + self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + + if not self or not is_player(clicker) or not clicker:get_inventory() then return false end @@ -4488,17 +4307,13 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, local mobname = self.name -- if not nil change what will be added to inventory - if replacewith then - mobname = replacewith - end + if replacewith then mobname = replacewith end local name = clicker:get_player_name() local tool = clicker:get_wielded_item() - -- are we using hand, net or lasso to pick up mob? - if tool:get_name() ~= "" - and tool:get_name() ~= "mobs:net" - and tool:get_name() ~= "mobs:lasso" then + if tool:get_name() ~= "" -- hand + and tool:get_name() ~= "mobs:net" and tool:get_name() ~= "mobs:lasso" then return false end @@ -4542,7 +4357,6 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, tool:add_wear(650) -- 100 uses clicker:set_wielded_item(tool) - end -- calculate chance.. add to inventory if successful? @@ -4557,20 +4371,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, new_stack = ItemStack(mobname .. "_set") - local tmp, t = {} - - for _,stat in pairs(self) do - - t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" then - tmp[_] = self[_] - end - end - - local data_str = minetest.serialize(tmp) + local data_str = minetest.serialize(clean_staticdata(self)) new_stack:set_metadata(data_str) end @@ -4607,28 +4408,25 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, return true end - -- protect tamed mob with rune item + function mobs:protect(self, clicker) local name = clicker:get_player_name() local tool = clicker:get_wielded_item() local tool_name = tool:get_name() - if tool_name ~= "mobs:protector" - and tool_name ~= "mobs:protector2" then + if tool_name ~= "mobs:protector" and tool_name ~= "mobs:protector2" then return false end if not self.tamed then - minetest.chat_send_player(name, S("Not tamed!")) - return true + minetest.chat_send_player(name, S("Not tamed!")) ; return true end if (self.protected and tool_name == "mobs:protector") or (self.protected == 2 and tool_name == "mobs:protector2") then - minetest.chat_send_player(name, S("Already protected!")) - return true + minetest.chat_send_player(name, S("Already protected!")) ; return true end if not mobs.is_creative(clicker:get_player_name()) then @@ -4644,27 +4442,25 @@ function mobs:protect(self, clicker) end local pos = self.object:get_pos() + local prop = self.object:get_properties() - pos.y = pos.y + self.collisionbox[2] + 0.5 + pos.y = pos.y + prop.collisionbox[5] - effect(self.object:get_pos(), 25, "mobs_protect_particle.png", - 0.5, 4, 2, 15) + effect(pos, 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) self:mob_sound("mobs_spell") return true end +-- feeding, taming, breeding and naming (thanks blert2112) -local mob_obj = {} -local mob_sta = {} +local mob_obj, mob_sta = {}, {} --- feeding, taming and breeding (thanks blert2112) function mobs:feed_tame(self, clicker, feed_count, breed, tame) -- can eat/tame with item in hand - if self.follow - and self:follow_holding(clicker) then + if self.follow and self:follow_holding(clicker) then -- if not in creative then take item if not mobs.is_creative(clicker:get_player_name()) then @@ -4676,31 +4472,18 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) clicker:set_wielded_item(item) end + local prop = self.object:get_properties() + -- increase health - self.health = self.health + 4 - - if self.health >= self.hp_max then - - self.health = self.hp_max - --- if self.htimer < 1 then - --- minetest.chat_send_player(clicker:get_player_name(), --- S("@1 at full health (@2)", --- self.name:split(":")[2], tostring(self.health))) - --- self.htimer = 5 --- end - end + self.health = min(self.health + 4, prop.hp_max) self.object:set_hp(self.health) -- make children grow quicker - if self.child == true then + if self.child then --- self.hornytimer = self.hornytimer + 20 -- deduct 10% of the time to adulthood - self.hornytimer = math.floor(self.hornytimer + ( + self.hornytimer = floor(self.hornytimer + ( (CHILD_GROW_TIME - self.hornytimer) * 0.1)) --print ("====", self.hornytimer) return true @@ -4708,20 +4491,20 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) -- feed and tame self.food = (self.food or 0) + 1 - self._breed_countdown = feed_count - self.food + self._breed_countdown = breed and (feed_count - self.food) + self._tame_countdown = not self.tamed and tame and (feed_count - self.food) if self.food >= feed_count then self.food = 0 self._breed_countdown = nil - if breed and self.hornytimer == 0 then - self.horny = true - end + if breed and self.hornytimer == 0 then self.horny = true end if tame then if self.tamed == false then + minetest.chat_send_player(clicker:get_player_name(), S("@1 has been tamed!", self.name:split(":")[2])) @@ -4739,9 +4522,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self:mob_sound(self.sounds.random) end - self:update_tag() - - return true + self:update_tag() ; return true end local item = clicker:get_wielded_item() @@ -4749,23 +4530,19 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) -- if mob has been tamed you can name it with a nametag if item:get_name() == "mobs:nametag" - and (name == self.owner - or minetest.check_player_privs(name, "protection_bypass")) then + and (name == self.owner or minetest.check_player_privs(name, "protection_bypass")) then -- store mob and nametag stack in external variables mob_obj[name] = self mob_sta[name] = item - local tag = self.nametag or "" + local prop = self.object:get_properties() + local tag = self._nametag or "" local esc = minetest.formspec_escape - minetest.show_formspec(name, "mobs_nametag", - "size[8,4]" .. - "field[0.5,1;7.5,0;name;" .. - esc(S("Enter name:")) .. - ";" .. tag .. "]" .. - "button_exit[2.5,3.5;3,1;mob_rename;" .. - esc(S("Rename")) .. "]") + minetest.show_formspec(name, "mobs_nametag", "size[8,4]" + .. "field[0.5,1;7.5,0;name;" .. esc(FS("Enter name:")) .. ";" .. esc(tag) .. "]" + .. "button_exit[2.5,3.5;3,1;mob_rename;" .. esc(FS("Rename")) .. "]") return true end @@ -4780,47 +4557,36 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end minetest.chat_send_player(clicker:get_player_name(), - S("@1 follows:\n- @2", - self.name:split(":")[2], - table.concat(self.follow, "\n- "))) + S("@1 follows:", + self.name:split(":")[2]) .. "\n- " .. + table.concat(self.follow, "\n- ")) end end return false end - -- inspired by blockmen's nametag mod + minetest.register_on_player_receive_fields(function(player, formname, fields) -- right-clicked with nametag and name entered? - if formname == "mobs_nametag" - and fields.name - and fields.name ~= "" then + if formname == "mobs_nametag" and fields.name and fields.name ~= "" then local name = player:get_player_name() - if not mob_obj[name] - or not mob_obj[name].object then - return - end + if not mob_obj[name] or not mob_obj[name].object then return end -- make sure nametag is being used to name mob local item = player:get_wielded_item() - if item:get_name() ~= "mobs:nametag" then - return - end + if item:get_name() ~= "mobs:nametag" then return end -- limit name entered to 64 characters long - if fields.name:len() > 64 then - fields.name = fields.name:sub(1, 64) - end + if fields.name:len() > 64 then fields.name = fields.name:sub(1, 64) end -- update nametag - mob_obj[name].nametag = fields.name - - mob_obj[name]:update_tag() + mob_obj[name]:update_tag(fields.name) -- if not in creative then take item if not mobs.is_creative(name) then @@ -4836,14 +4602,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +-- compatibility function for old mobs entities to new mobs_redo modpack --- compatibility function for old entities to new modpack entities function mobs:alias_mob(old_name, new_name) -- check old_name entity doesnt already exist - if minetest.registered_entities[old_name] then - return - end + if minetest.registered_entities[old_name] then return end -- spawn egg minetest.register_alias(old_name, new_name) @@ -4851,12 +4615,14 @@ function mobs:alias_mob(old_name, new_name) -- entity minetest.register_entity(":" .. old_name, { - physical = false, static_save = false, + initial_properties = { + physical = false, + static_save = false, + }, on_activate = function(self, staticdata) if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name, staticdata) end @@ -4864,7 +4630,141 @@ function mobs:alias_mob(old_name, new_name) end, get_staticdata = function(self) - return self + return minetest.serialize(clean_staticdata(self)) end }) end + +-- admin command to remove untamed mobs around players + +minetest.register_chatcommand("clear_mobs", { + params = "", + description = "Remove untamed mobs from around players.", + privs = {server = true}, + + func = function (name, param) + + local count = 0 + + for _, player in pairs(minetest.get_connected_players()) do + + if player then + + local pos = player:get_pos() + local objs = minetest.get_objects_inside_radius(pos, 28) + + for _, obj in pairs(objs) do + + if obj then + + local ent = obj:get_luaentity() + + -- only remove mobs redo mobs that are not tamed + if ent and ent._cmi_is_mob and ent.tamed ~= true then + + remove_mob(ent, true) + + count = count + 1 + end + end + end + end + end + + minetest.chat_send_player(name, S("@1 mobs removed.", count)) + end +}) + +-- Is mob hearing enabled, if so override minetest.sound_play with custom function + +if settings:get_bool("mobs_can_hear") ~= false then + + local node_hear = settings:get_bool("mobs_can_hear_node") + local old_sound_play = minetest.sound_play + + minetest.sound_play = function(spec, param, eph) + + local def = {} ; param = param or {} + + -- store sound position (ignore player and object positioning as background) + if param.pos then + def.pos = param.pos +-- elseif param.object then +-- def.pos = param.object:get_pos() +-- def.object = param.object +-- elseif param.to_player then +-- local player = minetest.get_player_by_name(param.to_player) +-- def.pos = player and player:get_pos() +-- def.player = param.to_player + end + + -- if no position found use default function + if not def.pos then + return old_sound_play(spec, param, eph) + end + + -- store sound name and gain + if type(spec) == "string" then + def.sound = spec + def.gain = param.gain or 1.0 + elseif type(spec) == "table" then + def.sound = spec.name + def.gain = spec.gain or param.gain or 1.0 + end + +--print("==", def.sound) + + def.gain = def.gain or 1.0 + def.max_hear_distance = param.max_hear_distance or 32 + + -- find mobs within sounds hearing range + local objs = minetest.get_objects_inside_radius(def.pos, def.max_hear_distance) + local bit = def.gain / def.max_hear_distance + + for n = 1, #objs do + + local obj = objs[n] + + if not obj:is_player() then + + local ent = obj:get_luaentity() + + if ent and ent._cmi_is_mob and ent.on_sound then + + -- calculate loudness of sound to mob + def.distance = get_distance(def.pos, obj:get_pos()) + def.loudness = def.gain - (bit * def.distance) + + -- run custom on_sound function if heard + if def.loudness > 0 then ent.on_sound(ent, def) end + end + end + end + + -- find nodes that can hear up to 8 blocks away + if node_hear then + + local dist = min(def.max_hear_distance, 8) + local ps = minetest.find_nodes_in_area( + vector.subtract(def.pos, dist), + vector.add(def.pos, dist), {"group:on_sound"}) + + if #ps > 0 then + + for n = 1, #ps do + + local ndef = minetest.registered_nodes[minetest.get_node(ps[n]).name] + + def.distance = get_distance(def.pos, ps[n]) + def.loudness = def.gain - (bit * def.distance) + + if def.loudness > 0 and ndef and ndef.on_sound then + ndef.on_sound(ps[n], def) + end + end + end + end + + return old_sound_play(spec, param, eph) + end +end diff --git a/mods/mobs_redo/api.txt b/mods/mobs_redo/api.txt index 7cba54b1..11699ea0 100644 --- a/mods/mobs_redo/api.txt +++ b/mods/mobs_redo/api.txt @@ -6,6 +6,17 @@ Welcome to the world of mobs in minetest and hopefully an easy guide to defining your own mobs and having them appear in your worlds. +Quick Note +---------- + +Since the mobs redo api checks for nodes around the mob to function, it relies on a +default node incase anything goes wrong, so in the default game this is default:dirt +but for any custom game please make sure the following line is registered with your +preferred dirt node of choice: + +minetest.register_alias("mapgen_dirt", "mymod:my_dirt_node") + + Registering Mobs ---------------- @@ -21,7 +32,6 @@ by it's own name e.g. ... and the 'definition' is a table which holds all of the settings and functions needed for the mob to work properly which contains the following: - 'nametag' contains the name which is shown above mob. 'type' holds the type of mob that inhabits your world e.g. "animal" usually docile and walking around. "monster" attacks player or npc on sight. @@ -42,6 +52,8 @@ functions needed for the mob to work properly which contains the following: randomly turn while walking or standing. 'jump' when true allows your mob to jump updwards. 'jump_height' holds the height your mob can jump, 0 to disable jumping. + 'can_leap' when true obstacles like fences or pits wont stop a mob + from trying to jump out. 'stepheight' height of a block that your mob can easily walk up onto, defaults to 1.1. 'fly' when true allows your mob to fly around instead of walking. @@ -58,6 +70,7 @@ functions needed for the mob to work properly which contains the following: mob when melee attacking. 'damage_group' group in which damage is dealt, dedaults to "fleshy". 'damage_texture_modifier' applies texture modifier on hit e.g "^[brighten" + or default when enabled is "^[colorize:#c9900070". 'knock_back' when true has mobs falling backwards when hit, the greater the damage the more they move back. 'fear_height' is how high a cliff or edge has to be before the mob stops @@ -70,12 +83,13 @@ functions needed for the mob to work properly which contains the following: 'lava_damage' holds the damage per second inflicted to mobs when standing in lava. 'fire_damage' holds the damage per second inflicted to mobs when standing - in fire. - + 'node_damage' True by default, will harm mobs when inside damage_per_second + nodes. 'light_damage' holds the damage per second inflicted to mobs when light level is between the min and max values below 'light_damage_min' minimum light value when mob is affected (default: 14) 'light_damage_max' maximum light value when mob is affected (default: 15) + When set to 16 then only natural light will kill mob. 'suffocation' when > 0 mobs will suffocate inside solid blocks and will be hurt by the value given every second (0 to disable). 'floats' when set to 1 mob will float in water, 0 has them sink. @@ -89,10 +103,13 @@ functions needed for the mob to work properly which contains the following: hours and only attacking player at night or when provoked. 'attack_chance' 0 to 100 chance the mob will attack (default is 5). + 'attack_patience' Time in seconds before mob gives up attacking if + player isn't seen (Defaults to 11). 'attack_monsters' when true mob will attack monsters. 'attack_animals' when true mob will attack animals. 'attack_npcs' when true mob will attack npcs within range. 'attack_players' when true mob will attack players nearby. + 'attack_ignore' string or table of mob names not to attack. 'owner_loyal' when true non-docile tamed mobs attack anything player punches when nearby. 'group_attack' when true has same mob type grouping together to attack @@ -132,12 +149,16 @@ functions needed for the mob to work properly which contains the following: 'dogshoot_count2_max' contains how many seconds before switching from shoot to dogfight. 'shoot_interval' has the number of seconds between shots. - 'shoot_offset' holds the y position added as to where the + 'shoot_offset' holds the y position added as to where the arrow/fireball appears on mob. + 'homing' When True arrows will follow player when visible. 'specific_attack' has a table of entity names that mob can also attack e.g. {"player", "mobs_animal:chicken"}. - 'runaway_from' contains a table with mob names to run away from, add - "player" to list to runaway from player also. + 'friendly_fire` when set to false, mobs will not be able to harm other + mobs of the same type with friendly fire arrows. + Defaults to true. + 'runaway_from' contains a table with mob names or nodesto run away + from, add "player" to list to runaway from player also. 'ignore_invisibility' When true mob will still be able to see and attack player even if invisible (invisibility mod only). 'blood_amount' contains the number of blood droplets to appear when @@ -155,6 +176,9 @@ functions needed for the mob to work properly which contains the following: {"default:gold_lump", -10} -- heals by 10 health points. {"default:coal_block", 20} -- 20 damage when hit on head with coal blocks. {"all"} -- stops all weapons causing damage apart from those on list. + nodes can also be added so that node_per_second damage + does not affect the mob either e.g. + {"ethereal:crystal_spike", 0} -- causes no damage. 'makes_footstep_sound' when true you can hear mobs walking. 'sounds' this is a table with sounds of the mob @@ -223,6 +247,9 @@ functions needed for the mob to work properly which contains the following: 'fly_start' when a mob is flying. 'fly_end' 'fly_speed' + 'jump_start' when a mob is jumping + 'jump_end' + 'jump_speed' 'punch_start' when a mob melee attacks. 'punch_end' 'punch_speed' @@ -232,6 +259,9 @@ functions needed for the mob to work properly which contains the following: 'shoot_start' shooting animation. 'shoot_end' 'shoot_speed' + 'injured_start' when hit or damaged > 1 hp (if not set then 'walk' is used) + 'injured_end' + 'injured_speed' 'die_start' death animation 'die_end' 'die_speed' @@ -260,11 +290,12 @@ eating. y offset by using this instead: { {"group:grass", "air", 0}, - {"default:dirt_with_grass", "default:dirt", -1} + {"default:dirt_with_grass", "default:dirt", -1, 0} } 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" 'replace_rate' how random should the replace rate be (typically 10) - 'replace_offset' +/- value to check specific node to replace + 'replace_offset' +/- y offset value to check specific node to replace + 'reach' horizontal reach around mob for replace, default is 0 'on_replace(self, pos, oldnode, newnode)' is called when mob is about to replace a node. @@ -285,11 +316,9 @@ Custom Definition Functions Along with the above mob registry settings we can also use custom functions to enhance mob functionality and have them do many interesting things: - 'on_die' a function that is called when the mob is killed the - parameters are (self, pos) 'on_rightclick' its same as in minetest.register_entity() 'on_blast' is called when an explosion happens near mob when using TNT - functions, parameters are (object, damage) and returns + functions, parameters are (damage) and returns (do_damage, do_knockback, drops) 'on_spawn' is a custom function that runs on mob spawn with 'self' as variable, return true at end of function to run only once. @@ -309,6 +338,8 @@ enhance mob functionality and have them do many interesting things: is returned normal attack function continued. 'on_die' a function that is called when mob is killed (self, pos), also has access to self.cause_of_death table. + 'on_death' Official engine version of above when mob killed (self, killer), + 'killer' is only returned if player killed the mob. 'on_flop' function called when flying or swimmimng mob is no longer in air/water, (self) paramater and return true to skip the built in api flop feature. @@ -316,6 +347,24 @@ enhance mob functionality and have them do many interesting things: active and which has access to all of the self.* variables e.g. (self.health for health or self.standing_in for node status), return with 'false' to skip remainder of mob API. + 'on_sound' (self, def) called when mob is inside the hearing distance of + a sound, passes a def table containing: + 'sound' the sound being played, + 'pos' position the sound originated (only sounds with pos detected), + 'gain' original gain of sound, + 'distance' distance of mob from sound source, + 'loudness' how loud sound is to mob (percentage of gain heard at distance) + 'player' player name sound originated, [NOT IN USE] + 'object' object reference sound originated, [NOT IN USE] + 'max_hear_distance' max distance sound can be heard from source. + + +Hearing Nodes +------------- + +If a node has the {on_sound = 1} group and an on_sound() function set as above then +nodes within 8 blocks of a sound will be activated and the function run. Check the +"mobs:hearing_vines" node as an example which has mesecons support when active. Internal Variables @@ -324,12 +373,15 @@ Internal Variables The mob api also has some preset variables and functions that it will remember for each mob. + 'self._cmi_is_mob' Used to determine wether entity is a mobs redo mob when True. 'self.health' contains current health of mob (cannot exceed self.hp_max) 'self.texture_list' contains list of all mob textures 'self.child_texture' contains mob child texture when growing up 'self.base_texture' contains current skin texture which was randomly selected from textures list + 'self.texture_mods' contains a list of textures to overlay above the mobs + base texture (used for horse saddle) 'self.gotten' this is used for obtaining milk from cow and wool from sheep 'self.horny' when animal fed enough it is set to true and animal can @@ -342,7 +394,11 @@ for each mob. dogs 'self.order' set to "follow" or "stand" so that npc will follow owner or stand it's ground - 'self.nametag' contains the name of the mob which it can show above + 'self._nametag' contains the name of the mob which it can show above + 'self.pause_timer' used to stop mob thinking when punched so that knockback + can take effect. + 'self.disable_falling' currently used on spider mob when climbing walls, stops + the mob from experiencing gravity when true. 'self.state' Current mob state. "stand": no movement (except turning around) "walk": walk or move around aimlessly @@ -351,6 +407,42 @@ for each mob. "flop": bounce around aimlessly (for swimming mobs that have stranded) "die": during death + 'self.standing_on' Node name mob is standing on. + 'self.standing_in' Node name mob is standing inside. + 'self.looking_at' Node name in front of mob. + 'self.looking_above'Node name in front/above mob. + 'self.facing_fence' True if mob facing node containing "wall", "fence", "gate" + in it's name. + + +Internal Functions +------------------ + +Each mob contains a set of functions that can be called for use internally or from +another mod entirely, replace mob_class with the mob entity variable: + +mob_class:mob_sound(sound) -- play sound at mob position +mob_class:do_attack(player [, force]) -- if not already attacking, attack object given, +forced being true stops attacking current target and focuses on one given +mob_class:stop_attack() -- stops mob attacking +mob_class:collision() -- checks for player collision with mob and returns {x, z} vector +mob_class:set_velocity(velocity) -- move at velocity in the facing direction +mob_class:get_velocity() -- returns mob speed value +mob_class:set_yaw(yaw, delay) -- change mob yaw, delay is for smooth rotation (default:0) +mob_class:yaw_to_pos(pos, delay) -- rotates mod to look at position and returns new yaw +mob_class:set_animation(animation, force) -- set mob animation +mob_class:line_of_sight(pos1, pos2) -- internal line of sight function +mob_class:attempt_flight_correction(override) -- check for stuck flying mobs and fix +mob_class:update_tag(newname) -- update nametag or give new name +mob_class:do_jump() -- check if mob can jump then jump +mob_class:follow_holding(clicker) -- return True if mob likes what player is holding +mob_class:day_docile() -- return True if mob docile during current daytime +mob_class:mob_expire(pos, dtime) -- check if mob is to despawn +mob_class:get_nodes() -- get specific nodes around mob +mob_class:on_blast(damage) -- function called when mob in blast area +mob_class:is_inside(itemtable) -- returns True is mob collisionbox inside any node/group +in table +mob_class:go_to(pos) -- makes mob go to that position or nearby Adding Mobs in World @@ -415,7 +507,7 @@ the mobs:spawn, so it is recommended to use the above instead. mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) -mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, +mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height, day_toggle, on_spawn) A simpler way to handle mob spawns has been added with the mobs:spawn(def) @@ -439,6 +531,12 @@ true the mob will not spawn. 'name' is the name of the animal/monster +mobs:node_ok(pos, fallback) + +This global function gets the node at pos and if not registered will return the +fallback node instead. + + Particle Effects ---------------- @@ -469,10 +567,11 @@ This function registers a arrow for mobs with the attack type shoot. 'visual' same is in minetest.register_entity() 'visual_size' same is in minetest.register_entity() 'textures' same is in minetest.register_entity() - 'physical' same is in minetest.register_entity() [default: false] 'collide_with_objects' same as above 'velocity' the velocity of the arrow - 'drop' if set to true any arrows hitting a node will drop as item + 'drop' if set to true any arrows hitting a node will drop as item, + if number given then chance (1/num) of item dropping will + be used. arrow "mymob:myarrow" will use item of same name. 'hit_player' a function that is called when the arrow hits a player; this function should hurt the player, the parameters are (self, player) @@ -492,7 +591,7 @@ This function registers a arrow for mobs with the attack type shoot. 0 for no glow) 'rotate' integer value in degrees to rotate arrow 'on_step' is a custom function when arrow is active, nil for - default. + default. (self, dtime, moveresult) 'on_punch' is a custom function when arrow is punched, nil by default 'collisionbox' is hitbox table for arrow, {-.1,-.1,-.1,.1,.1,.1} by default. 'lifetime' contains float value for how many seconds arrow exists in @@ -521,10 +620,12 @@ Explosion Function mobs:explosion(pos, radius) -- DEPRECATED!!! use mobs:boom() instead -mobs:boom(self, pos, radius) +mobs:boom(self, pos, damage_radius, entity_radius, texture) 'self' mob entity 'pos' centre position of explosion - 'radius' radius of explosion (typically set to 3) + 'damage_radius' radius of node damage (typically 3) + 'entity_radius' radius of explosion to players and mobs + 'texture' particle texture during explosion, defaults to "tnt_smoke.png" This function generates an explosion which removes nodes in a specific radius and damages any entity caught inside the blast radius. Protection will limit @@ -681,7 +782,7 @@ returns true if a mob can see the player or victim. Use this instead: - mob_class:line_of_sight(pos1, pos2, stepsize) + entity:line_of_sight(pos1, pos2, stepsize) mobs:can_spawn(pos, name) @@ -691,20 +792,36 @@ space to spawn mob [name], if so then a new position is returned for use, otherwise nil is returned. -mobs:is_node_dangerous(self, nodename) +mobs:is_node_dangerous(mob_object, nodename) -This function returns true if the node name given is harmful to the mob (self), it is -mainly used when a mob is near a node it has to avoid. +This function returns true if the node name given is harmful to the mob (mob_object), +it is mainly used when a mob is near a node it has to avoid. + + +Looting Level +------------- + +If a tool is used with 'looting_level' defined under tool_capabilities then mobs can drop +extra items per level up to a maximum of 3 levels. 'looting_level' can also be read from +the tools own meta to override the default. External Settings for "minetest.conf" ------------------------------------ + 'mob_log_spawn' When True will log spawning position of mobs. + 'mob_node_timer_interval' How often mobs get nodes around them (0.25 is default) + for every 1/4 second. + 'mob_main_timer_interval' How often mobs run main functions (1.0 is default) for + every one second. 'enable_damage' if true monsters will attack players (default is true) 'only_peaceful_mobs' if true only animals will spawn in game (default is false) + 'mobs_attack_creatura' When True mobs redo mobs will attack Creatura mod mobs. 'mobs_disable_blood' if false blood effects appear when mob is hit (default is false) + 'mob_hit_effect' False by default, when True and mobs are hit then + damage_texture_modifier is used to highlight mob. 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) 'mobs_spawn_monster_protected' if set to false then monsters will not spawn in @@ -715,8 +832,6 @@ External Settings for "minetest.conf" spawn number e.g. mobs_animal:cow = 1000,5 'mob_difficulty' sets difficulty level (health and hit damage multiplied by this number), defaults to 1.0. - 'mob_show_health' if false then punching mob will not show health status - (true by default) 'mob_chance_multiplier' multiplies chance of all mobs spawning and can be set to 0.5 to have mobs spawn more or 2.0 to spawn less. e.g. 1 in 7000 * 0.5 = 1 in 3500 so better odds of @@ -726,6 +841,7 @@ External Settings for "minetest.conf" 'mobs_drop_items' when false mobs no longer drop items when they die. 'mobs_griefing' when false mobs cannot break blocks when using either pathfinding level 2, replace functions or mobs:boom + 'mobs_can_hear' True by default, allows mobs to hear sound around them. function. 'mob_nospawn_range' Minimum range a mob can spawn near player (def: 12) 'mob_active_limit' Number of active mobs in game, 0 for unlimited @@ -733,6 +849,22 @@ External Settings for "minetest.conf" mob for obstructions before spawning, otherwise it defaults to checking the height of the mob only. 'mob_smooth_rotate' Enables smooth rotation when mobs turn by default. + 'mob_height_fix' Enabled by default, increases smaller mob heights so they wont + glitch through certain nodes. + 'mob_pathfinding_enable' Enable pathfinding. + 'mob_pathfinding_stuck_timeout' How long before stuck mobs start searching. (default 3.0) + 'mob_pathfinding_stuck_path_timeout' How long will mob follow path before giving up. (default 5.0) + 'mob_pathfinding_algorithm' Which pathfinding algorithm to use Dijkstra (default), A*_noprefetch (AStar_noprefetch) or A* (AStar) + (A* names differ cause Minetest doesn´t allow "*" in settings) + 'mob_pathfinding_searchdistance' max search distance from search positions (default 16) + 'mob_pathfinding_max_jump' max jump height for pathfinding (default 4) + 'mob_pathfinding_max_drop' max drop height for pathfinding (default 6) + 'mobs_can_hear' Enabled by default, overrides minetest.sound_play and enables + nearby mobs to run a custom on_sound function. + 'mobs_can_hear_node' Disabled by default, allows nearby nodes to hear and run a + custom on_sound function. + 'mobs_disable_damage_kb' Knockback is calculated by hit damage or uses knockback value + from the weapon used, this setting lets you disable the former. Players can override the spawn chance for each mob registered by adding a line to their minetest.conf file with a new value, the lower the value the more each @@ -748,130 +880,42 @@ mobs_animal:cow = 8000,4 <-- 4 cows per mapblock at 8000 spawn chance mobs_monster:dirt_monster = ,20 <-- 20 dirt monsters per mapblock +Node Sounds +----------- + +Mobs Redo will detect wether the Default mod or MineClone/VoxeLibre mod is active and +store whichever sound set is available inside the following to save any mob mobs +having to detect it themselves: + +mobs.node_sound_defaults() +mobs.node_sound_stone_defaults() +mobs.node_sound_dirt_defaults() +mobs.node_sound_sand_defaults() +mobs.node_sound_gravel_defaults() +mobs.node_sound_wood_defaults() +mobs.node_sound_leaves_defaults() +mobs.node_sound_ice_defaults() +mobs.node_sound_metal_defaults() +mobs.node_sound_water_defaults() +mobs.node_sound_snow_defaults() +mobs.node_sound_glass_defaults() + + Rideable Horse Example Mob -------------------------- -mobs:register_mob("mob_horse:horse", { - type = "animal", - visual = "mesh", - visual_size = {x = 1.20, y = 1.20}, - mesh = "mobs_horse.x", - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, - animation = { - speed_normal = 15, - speed_run = 30, - stand_start = 25, - stand_end = 75, - walk_start = 75, - walk_end = 100, - run_start = 75, - run_end = 100, - }, - textures = { - {"mobs_horse.png"}, - {"mobs_horsepeg.png"}, - {"mobs_horseara.png"} - }, - fear_height = 3, - runaway = true, - fly = false, - walk_chance = 60, - view_range = 5, - follow = {"farming:wheat"}, - passive = true, - hp_min = 12, - hp_max = 16, - armor = 200, - lava_damage = 5, - fall_damage = 5, - water_damage = 1, - makes_footstep_sound = true, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} - }, - sounds = { - random = "horse_neigh.ogg", - damage = "horse_whinney.ogg", - }, +See mob_horse mod https://codeberg.org/tenplus1/mob_horse - do_custom = function(self, dtime) - -- set needed values if not already present - if not self.v2 then - self.v2 = 0 - self.max_speed_forward = 6 - self.max_speed_reverse = 2 - self.accel = 6 - self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 20, z = -2} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1, y = 1} - end +External Functions +------------------ - -- if driver present allow control of horse - if self.driver then +These are a list of utility functions that can be called from 3rd party mods. - mobs.drive(self, "walk", "stand", false, dtime) - - return false -- skip rest of mob functions - end - - return true - end, - - on_die = function(self, pos) - - -- drop saddle when horse is killed while riding - -- also detach from horse properly - if self.driver then - minetest.add_item(pos, "mobs:saddle") - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - end - - end, - - on_rightclick = function(self, clicker) - - -- make sure player is clicking - if not clicker or not clicker:is_player() then - return - end - - -- feed, tame or heal horse - if mobs:feed_tame(self, clicker, 10, true, true) then - return - end - - -- make sure tamed horse is being clicked by owner only - if self.tamed and self.owner == clicker:get_player_name() then - - local inv = clicker:get_inventory() - - -- detatch player already riding horse - if self.driver and clicker == self.driver then - - mobs.detach(clicker, {x = 1, y = 0, z = 1}) - - -- add saddle back to inventory - if inv:room_for_item("main", "mobs:saddle") then - inv:add_item("main", "mobs:saddle") - else - minetest.add_item(clicker.get_pos(), "mobs:saddle") - end - - -- attach player to horse - elseif not self.driver - and clicker:get_wielded_item():get_name() == "mobs:saddle" then - - self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) - - -- take saddle from inventory - inv:remove_item("main", "mobs:saddle") - end - end - - -- used to capture horse with magic lasso - mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) - end -}) +mobs:alias_mob(old_name, new_name) +mobs:is_invisible(self, player_name) +mobs:is_dangerous(self, nodename) +mobs:yaw_to_pos(self, target, rotation_steps) +mobs:line_of_sight(self, pos1, pos2) +mobs:set_animation(self, animation) +mobs:yaw(self, yaw, rotation_steps) diff --git a/mods/mobs_redo/crafts.lua b/mods/mobs_redo/crafts.lua index a28af9bf..5c10d914 100644 --- a/mods/mobs_redo/crafts.lua +++ b/mods/mobs_redo/crafts.lua @@ -1,21 +1,82 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs") +local FS = function(...) return minetest.formspec_escape(S(...)) end +local mc2 = minetest.get_modpath("mcl_core") +local mod_def = minetest.get_modpath("default") + +-- determine which sounds to use, default or mcl_sounds + +local function sound_helper(snd) + + mobs[snd] = (mod_def and default[snd]) or (mc2 and mcl_sounds[snd]) + or function() return {} end +end + +sound_helper("node_sound_defaults") +sound_helper("node_sound_stone_defaults") +sound_helper("node_sound_dirt_defaults") +sound_helper("node_sound_sand_defaults") +sound_helper("node_sound_gravel_defaults") +sound_helper("node_sound_wood_defaults") +sound_helper("node_sound_leaves_defaults") +sound_helper("node_sound_ice_defaults") +sound_helper("node_sound_metal_defaults") +sound_helper("node_sound_water_defaults") +sound_helper("node_sound_snow_defaults") +sound_helper("node_sound_glass_defaults") + +-- helper function to add {eatable} group to food items + +function mobs.add_eatable(item, hp) + + local def = minetest.registered_items[item] + + if def then + + local groups = table.copy(def.groups) or {} + + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end +end + +-- recipe items + +local items = { + paper = mc2 and "mcl_core:paper" or "default:paper", + dye_black = mc2 and "mcl_dye:black" or "dye:black", + string = mc2 and "mcl_mobitems:string" or "farming:string", + stick = mc2 and "mcl_core:stick" or "default:stick", + diamond = mc2 and "mcl_core:diamond" or "default:diamond", + steel_ingot = mc2 and "mcl_core:iron_ingot" or "default:steel_ingot", + gold_block = mc2 and "mcl_core:goldblock" or "default:goldblock", + diamond_block = mc2 and "mcl_core:diamondblock" or "default:diamondblock", + stone = mc2 and "mcl_core:stone" or "default:stone", + mese_crystal = mc2 and "mcl_core:gold_ingot" or "default:mese_crystal", + wood = mc2 and "mcl_core:wood" or "default:wood", + fence_wood = mc2 and "group:fence_wood" or "default:fence_wood", + meat_raw = mc2 and "mcl_mobitems:beef" or "group:food_meat_raw", + meat_cooked = mc2 and "mcl_mobitems:cooked_beef" or "group:food_meat", +} -- name tag + minetest.register_craftitem("mobs:nametag", { - description = S("Name Tag"), + description = S("Name Tag") .. " " .. S("\nRight-click Mobs Redo mob to apply"), inventory_image = "mobs_nametag.png", groups = {flammable = 2, nametag = 1} }) -if minetest.get_modpath("dye") and minetest.get_modpath("farming") then - minetest.register_craft({ - output = "mobs:nametag", - recipe = {{"default:paper", "dye:black", "farming:string"}} - }) -end +minetest.register_craft({ + output = "mobs:nametag", + recipe = { + { items.paper, items.dye_black, items.string } + } +}) -- leather + minetest.register_craftitem("mobs:leather", { description = S("Leather"), inventory_image = "mobs_leather.png", @@ -23,21 +84,27 @@ minetest.register_craftitem("mobs:leather", { }) -- raw meat + minetest.register_craftitem("mobs:meat_raw", { description = S("Raw Meat"), inventory_image = "mobs_meat_raw.png", on_use = minetest.item_eat(3), - groups = {food_meat_raw = 1, flammable = 2} + groups = {food_meat_raw = 1} }) +mobs.add_eatable("mobs:meat_raw", 3) + -- cooked meat + minetest.register_craftitem("mobs:meat", { description = S("Meat"), inventory_image = "mobs_meat.png", on_use = minetest.item_eat(8), - groups = {food_meat = 1, flammable = 2} + groups = {food_meat = 1} }) +mobs.add_eatable("mobs:meat", 8) + minetest.register_craft({ type = "cooking", output = "mobs:meat", @@ -46,44 +113,43 @@ minetest.register_craft({ }) -- lasso + minetest.register_tool("mobs:lasso", { description = S("Lasso (right-click animal to put in inventory)"), inventory_image = "mobs_magic_lasso.png", groups = {flammable = 2} }) -if minetest.get_modpath("farming") then - minetest.register_craft({ - output = "mobs:lasso", - recipe = { - {"farming:string", "", "farming:string"}, - {"", "default:diamond", ""}, - {"farming:string", "", "farming:string"} - } - }) -end +minetest.register_craft({ + output = "mobs:lasso", + recipe = { + { items.string, "", items.string}, + { "", items.diamond, "" }, + { items.string, "", items.string } + } +}) minetest.register_alias("mobs:magic_lasso", "mobs:lasso") -- net + minetest.register_tool("mobs:net", { description = S("Net (right-click animal to put in inventory)"), inventory_image = "mobs_net.png", groups = {flammable = 2} }) -if minetest.get_modpath("farming") then - minetest.register_craft({ - output = "mobs:net", - recipe = { - {"group:stick", "", "group:stick"}, - {"group:stick", "", "group:stick"}, - {"farming:string", "group:stick", "farming:string"} - } - }) -end +minetest.register_craft({ + output = "mobs:net", + recipe = { + { items.stick, "", items.stick }, + { items.stick, "", items.stick }, + { items.string, items.stick, items.string } + } +}) -- shears (right click to shear animal) + minetest.register_tool("mobs:shears", { description = S("Steel Shears (right-click to shear)"), inventory_image = "mobs_shears.png", @@ -93,12 +159,13 @@ minetest.register_tool("mobs:shears", { minetest.register_craft({ output = "mobs:shears", recipe = { - {"", "default:steel_ingot", ""}, - {"", "group:stick", "default:steel_ingot"} + { "", items.steel_ingot, "" }, + { "", items.stick, items.steel_ingot } } }) -- protection rune + minetest.register_craftitem("mobs:protector", { description = S("Mob Protection Rune"), inventory_image = "mobs_protector.png", @@ -108,13 +175,14 @@ minetest.register_craftitem("mobs:protector", { minetest.register_craft({ output = "mobs:protector", recipe = { - {"default:stone", "default:stone", "default:stone"}, - {"default:stone", "default:goldblock", "default:stone"}, - {"default:stone", "default:stone", "default:stone"} + { items.stone, items.stone, items.stone }, + { items.stone, items.gold_block, items.stone }, + { items.stone, items.stone, items.stone } } }) --- level 2 protection rune +-- protection rune (level 2) + minetest.register_craftitem("mobs:protector2", { description = S("Mob Protection Rune (Level 2)"), inventory_image = "mobs_protector2.png", @@ -124,13 +192,14 @@ minetest.register_craftitem("mobs:protector2", { minetest.register_craft({ output = "mobs:protector2", recipe = { - {"mobs:protector", "default:mese_crystal", "mobs:protector"}, - {"default:mese_crystal", "default:diamondblock", "default:mese_crystal"}, - {"mobs:protector", "default:mese_crystal", "mobs:protector"} + { "mobs:protector", items.mese_crystal, "mobs:protector" }, + { items.mese_crystal, items.diamond_block, items.mese_crystal }, + { "mobs:protector", items.mese_crystal, "mobs:protector" } } }) -- saddle + minetest.register_craftitem("mobs:saddle", { description = S("Saddle"), inventory_image = "mobs_saddle.png", @@ -140,110 +209,66 @@ minetest.register_craftitem("mobs:saddle", { minetest.register_craft({ output = "mobs:saddle", recipe = { - {"mobs:leather", "mobs:leather", "mobs:leather"}, - {"mobs:leather", "default:steel_ingot", "mobs:leather"}, - {"mobs:leather", "default:steel_ingot", "mobs:leather"} + {"group:leather", "group:leather", "group:leather"}, + {"group:leather", items.steel_ingot, "group:leather"}, + {"group:leather", items.steel_ingot, "group:leather"} } }) +-- register mob fence if default found --- make sure we can register fences -if minetest.get_modpath("default") and default.register_fence then +if mod_def and default.register_fence then --- mob fence (looks like normal fence but collision is 2 high) -default.register_fence("mobs:fence_wood", { - description = S("Mob Fence"), - texture = "default_wood.png", - material = "default:fence_wood", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 1.9, 0.5}, + -- mob fence (looks like normal fence but collision is 2 high) + default.register_fence("mobs:fence_wood", { + description = S("Mob Fence"), + texture = "default_wood.png", + material = "default:fence_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = mobs.node_sound_wood_defaults(), + collision_box = { + type = "fixed", fixed = {{-0.5, -0.5, -0.5, 0.5, 1.9, 0.5}} } - } -}) + }) end -- mob fence top (has enlarged collisionbox to stop mobs getting over) + minetest.register_node("mobs:fence_top", { description = S("Mob Fence Top"), drawtype = "nodebox", tiles = {"default_wood.png"}, paramtype = "light", is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - node_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4} - }, - selection_box = { - type = "fixed", - fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4} - } + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, axey = 1}, + sounds = mobs.node_sound_wood_defaults(), + node_box = {type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}}, + collision_box = {type = "fixed", fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}}, + selection_box = {type = "fixed", fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}} }) minetest.register_craft({ output = "mobs:fence_top 12", recipe = { {"group:wood", "group:wood", "group:wood"}, - {"", "default:fence_wood", ""} + {"", items.fence_wood, ""} } }) - -- items that can be used as fuel -minetest.register_craft({ - type = "fuel", - recipe = "mobs:nametag", - burntime = 3 -}) -minetest.register_craft({ - type = "fuel", - recipe = "mobs:lasso", - burntime = 7 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mobs:net", - burntime = 8 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mobs:leather", - burntime = 4 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mobs:saddle", - burntime = 7 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mobs:fence_wood", - burntime = 7 -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mobs:fence_top", - burntime = 2 -}) +minetest.register_craft({type = "fuel", recipe = "mobs:nametag", burntime = 3}) +minetest.register_craft({type = "fuel", recipe = "mobs:lasso", burntime = 7}) +minetest.register_craft({type = "fuel", recipe = "mobs:net", burntime = 8}) +minetest.register_craft({type = "fuel", recipe = "mobs:leather", burntime = 4}) +minetest.register_craft({type = "fuel", recipe = "mobs:saddle", burntime = 7}) +minetest.register_craft({type = "fuel", recipe = "mobs:fence_wood", burntime = 7}) +minetest.register_craft({type = "fuel", recipe = "mobs:fence_top", burntime = 2}) -- this tool spawns same mob and adds owner, protected, nametag info -- then removes original entity, this is used for fixing any issues. +-- also holding sneak while punching mob lets you change texture name. local tex_obj @@ -255,12 +280,9 @@ minetest.register_tool(":mobs:mob_reset_stick", { on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "object" then - return - end + if pointed_thing.type ~= "object" then return end local obj = pointed_thing.ref - local control = user:get_player_control() local sneak = control and control.sneak @@ -300,17 +322,15 @@ minetest.register_tool(":mobs:mob_reset_stick", { -- get base texture local bt = tex_obj:get_luaentity().base_texture[1] - if type(bt) ~= "string" then - bt = "" - end + if type(bt) ~= "string" then bt = "" end local name = user:get_player_name() minetest.show_formspec(name, "mobs_texture", "size[8,4]" .. "field[0.5,1;7.5,0;name;" - .. minetest.formspec_escape(S("Enter texture:")) .. ";" .. bt .. "]" + .. FS("Enter texture:") .. ";" .. bt .. "]" .. "button_exit[2.5,3.5;3,1;mob_texture_change;" - .. minetest.formspec_escape(S("Change")) .. "]") + .. FS("Change") .. "]") end end }) @@ -318,27 +338,18 @@ minetest.register_tool(":mobs:mob_reset_stick", { minetest.register_on_player_receive_fields(function(player, formname, fields) -- right-clicked with nametag and name entered? - if formname == "mobs_texture" - and fields.name - and fields.name ~= "" then + if formname == "mobs_texture" and fields.name and fields.name ~= "" then -- does mob still exist? - if not tex_obj - or not tex_obj:get_luaentity() then - return - end + if not tex_obj or not tex_obj:get_luaentity() then return end -- make sure nametag is being used to name mob local item = player:get_wielded_item() - if item:get_name() ~= "mobs:mob_reset_stick" then - return - end + if item:get_name() ~= "mobs:mob_reset_stick" then return end -- limit name entered to 64 characters long - if fields.name:len() > 64 then - fields.name = fields.name:sub(1, 64) - end + if fields.name:len() > 64 then fields.name = fields.name:sub(1, 64) end -- update texture local self = tex_obj:get_luaentity() @@ -352,24 +363,117 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +-- Meat Block --- Meat Block (thanks to painterlypack.net for allowing me to use these textures) minetest.register_node("mobs:meatblock", { description = S("Meat Block"), tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"}, paramtype2 = "facedir", - groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default and default.node_sound_leaves_defaults(), + groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1}, + is_ground_content = false, + sounds = mobs.node_sound_dirt_defaults(), on_place = minetest.rotate_node, - on_use = minetest.item_eat(20) + on_use = minetest.item_eat(20), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 }) +mobs.add_eatable("mobs:meatblock", 20) + minetest.register_craft({ output = "mobs:meatblock", --- type = "shapeless", recipe = { - {"group:food_meat", "group:food_meat", "group:food_meat"}, - {"group:food_meat", "group:food_meat", "group:food_meat"}, - {"group:food_meat", "group:food_meat", "group:food_meat"} + { items.meat_cooked, items.meat_cooked, items.meat_cooked }, + { items.meat_cooked, items.meat_cooked, items.meat_cooked }, + { items.meat_cooked, items.meat_cooked, items.meat_cooked } } }) + +-- Meat Block (raw) + +minetest.register_node("mobs:meatblock_raw", { + description = S("Raw Meat Block"), + tiles = {"mobs_meat_raw_top.png", "mobs_meat_raw_bottom.png", "mobs_meat_raw_side.png"}, + paramtype2 = "facedir", + groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1}, + is_ground_content = false, + sounds = mobs.node_sound_dirt_defaults(), + on_place = minetest.rotate_node, + on_use = minetest.item_eat(20), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +mobs.add_eatable("mobs:meatblock_raw", 20) + +minetest.register_craft({ + output = "mobs:meatblock_raw", + recipe = { + { items.meat_raw, items.meat_raw, items.meat_raw }, + { items.meat_raw, items.meat_raw, items.meat_raw }, + { items.meat_raw, items.meat_raw, items.meat_raw } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "mobs:meatblock", + recipe = "mobs:meatblock_raw", + cooktime = 30 +}) + +-- hearing vines (if mesecons active it acts like blinkyplant) + +local mod_mese = minetest.get_modpath("mesecons") + +minetest.register_node("mobs:hearing_vines", { + description = S("Hearing Vines"), + drawtype = "firelike", + waving = 1, + tiles = {"mobs_hearing_vines.png"}, + inventory_image = "mobs_hearing_vines.png", + wield_image = "mobs_hearing_vines.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1, on_sound = 1}, + sounds = mobs.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + on_sound = function(pos, def) + if def.loudness > 0.5 then + minetest.set_node(pos, {name = "mobs:hearing_vines_active"}) + end + end +}) + +minetest.register_node("mobs:hearing_vines_active", { + description = S("Active Hearing Vines"), + drawtype = "firelike", + waving = 1, + tiles = {"mobs_hearing_vines_active.png"}, + inventory_image = "mobs_hearing_vines_active.png", + wield_image = "mobs_hearing_vines_active.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + light_source = 1, + damage_per_second = 4, + drop = "mobs:hearing_vines", + groups = {snappy = 3, flammable = 3, attached_node = 1, not_in_creative_inventory = 1}, + sounds = mobs.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + if mod_mese then mesecon.receptor_on(pos) end + end, + on_timer = function(pos) + minetest.set_node(pos, {name = "mobs:hearing_vines"}) + if mod_mese then mesecon.receptor_off(pos) end + end +}) diff --git a/mods/mobs_redo/depends.txt b/mods/mobs_redo/depends.txt deleted file mode 100644 index 0c580bd4..00000000 --- a/mods/mobs_redo/depends.txt +++ /dev/null @@ -1,10 +0,0 @@ -default? -tnt? -dye? -farming? -invisibility? -intllib? -lucky_block? -cmi? -toolranks? -pathfinder? diff --git a/mods/mobs_redo/description.txt b/mods/mobs_redo/description.txt deleted file mode 100644 index 919852a1..00000000 --- a/mods/mobs_redo/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a mob api for mods to add animals or monsters etc. \ No newline at end of file diff --git a/mods/mobs_redo/init.lua b/mods/mobs_redo/init.lua index 4632238f..61d2ba8b 100644 --- a/mods/mobs_redo/init.lua +++ b/mods/mobs_redo/init.lua @@ -1,25 +1,35 @@ -local path = minetest.get_modpath("mobs") +-- peaceful player privilege --- Peaceful player privilege minetest.register_privilege("peaceful_player", { description = "Prevents Mobs Redo mobs from attacking player", give_to_singleplayer = false }) --- Mob API -dofile(path .. "/api.lua") +-- fallback node --- Rideable Mobs -dofile(path .. "/mount.lua") +minetest.register_node("mobs:fallback_node", { + description = "Fallback Node", + tiles = {"mobs_fallback.png"}, + is_ground_content = false, + groups = {handy = 1, crumbly = 3, not_in_creative_inventory = 1}, + drop = "" +}) --- Mob Items -dofile(path .. "/crafts.lua") +local path = minetest.get_modpath("mobs") --- Mob Spawner -dofile(path .. "/spawner.lua") +dofile(path .. "/api.lua") -- mob API + +dofile(path .. "/mount.lua") -- rideable mobs + +dofile(path .. "/crafts.lua") -- items and crafts + +dofile(path .. "/spawner.lua") -- mob spawner -- Lucky Blocks -dofile(path .. "/lucky_block.lua") + +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end print("[MOD] Mobs Redo loaded") diff --git a/mods/mobs_redo/intllib.lua b/mods/mobs_redo/intllib.lua deleted file mode 100644 index 7decdf7d..00000000 --- a/mods/mobs_redo/intllib.lua +++ /dev/null @@ -1,3 +0,0 @@ --- Support for the old multi-load method -return dofile(minetest.get_modpath("intllib").."/init.lua") - diff --git a/mods/mobs_redo/license.txt b/mods/mobs_redo/license.txt index fec6f6aa..6c3c232b 100644 --- a/mods/mobs_redo/license.txt +++ b/mods/mobs_redo/license.txt @@ -19,3 +19,21 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Textures under CC0 license by TenPlus1 + +mobs_fallback.png is dirt texture from original Minetest (CC-BY SA 3.0) + + +ShadowNinja (CC BY-SA 3.0): + tnt_smoke.png + +mobs_swing.ogg by qubodup (CC0) + - http://freesound.org/people/qubodup/sounds/60012/ + +mobs_spell.ogg by littlerobotsoundfactory (CC0) + - http://freesound.org/people/LittleRobotSoundFactory/sounds/270396/ + +mobs_punch.ogg by Merrick079 (CC0) + - https://freesound.org/people/Merrick079/sounds/566436/ diff --git a/mods/mobs_redo/locale/de_DE.po b/mods/mobs_redo/locale/de_DE.po deleted file mode 100644 index ac406bf8..00000000 --- a/mods/mobs_redo/locale/de_DE.po +++ /dev/null @@ -1,131 +0,0 @@ -# Mobs Redo translation. -# Copyright (C) 2017 TenPlus1 -# This file is distributed under the same license as the mobs package. -# Wuzzy , 2017 -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:27+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Kreatur wurde geschützt!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Gezähmt)" - -#: api.lua -msgid "Not tamed!" -msgstr "Nicht gezähmt!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 ist der Besitzer!" - -#: api.lua -msgid "Missed!" -msgstr "Daneben!" - -#: api.lua -msgid "Already protected!" -msgstr "Bereits geschützt!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 bei voller Gesundheit (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 wurde gezähmt!" - -#: api.lua -msgid "Enter name:" -msgstr "Namen eingeben:" - -#: api.lua -msgid "Rename" -msgstr "Umbenennen" - -#: crafts.lua -msgid "Name Tag" -msgstr "Namensschild" - -#: crafts.lua -msgid "Leather" -msgstr "Leder" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Rohes Fleisch" - -#: crafts.lua -msgid "Meat" -msgstr "Fleisch" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lasso (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Netz (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Stahlschere (Rechtsklick zum Scheren)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Kreaturschutzrune" - -#: crafts.lua -msgid "Saddle" -msgstr "Sattel" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Kreaturen Zaun" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Kreaturenspawner" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Kreatur MinLicht MaxLicht Menge SpielerEntfng" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Nicht aktiv (Einstellungen eingeben)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawner aktiv (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Kreaturenspawner-Einstellungen gescheitert!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Syntax: „name min_licht[0-14] max_licht[0-14] max_mobs_im_gebiet[0 zum " -"Deaktivieren] distanz[1-20] y_versatz[-10 bis 10]“" diff --git a/mods/mobs_redo/locale/es.po b/mods/mobs_redo/locale/es.po deleted file mode 100644 index 849db667..00000000 --- a/mods/mobs_redo/locale/es.po +++ /dev/null @@ -1,128 +0,0 @@ -# Mobs Redo translation. -# Copyright (C) 2017 TenPlus1 -# This file is distributed under the same license as the mobs package. -# Wuzzy , 2017 -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-16 16:48+0200\n" -"PO-Revision-Date: 2017-07-16 16:48+0200\n" -"Last-Translator: Aleks \n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "El mob ha sido protegido!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Domesticado)" - -#: api.lua -msgid "Not tamed!" -msgstr "No domesticado!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 es el dueño!" - -#: api.lua -msgid "Missed!" -msgstr "Perdido!" - -#: api.lua -msgid "Already protected!" -msgstr "Ya está protegido!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 con salud llena (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 ha sido domesticado!" - -#: api.lua -msgid "Enter name:" -msgstr "Ingrese nombre:" - -#: api.lua -msgid "Rename" -msgstr "Renombrar" - -#: crafts.lua -msgid "Name Tag" -msgstr "Nombrar etiqueta" - -#: crafts.lua -msgid "Leather" -msgstr "Cuero" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne cruda" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lazo (click derecho en animal para colocar en inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Red (click derecho en animal para colocar en inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Tijera de acero (click derecho para esquilar)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Runa de protección de Mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Montura" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Generador de Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuzMin LuzMax Cantidad DistJugador" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Generador no activo (ingrese config)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Generador activo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Configuracion de generador de Mob falló!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "Sintaxis: “nombre luz_min[0-14] luz_max[0-14] max_mobs_en_area[0 para deshabilitar] " -"distancia[1-20] compensacion[-10 a 10]”" diff --git a/mods/mobs_redo/locale/fr.po b/mods/mobs_redo/locale/fr.po deleted file mode 100644 index 53b5f9f1..00000000 --- a/mods/mobs_redo/locale/fr.po +++ /dev/null @@ -1,136 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-29 09:13+0200\n" -"PO-Revision-Date: 2020-08-13 21:20+0500\n" -"Last-Translator: Olivier Dragon \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Mode pacifique activé - Aucun monstre ne sera généré" - -#: api.lua -msgid "Mob has been protected!" -msgstr "L'animal a été protégé !" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (apprivoisé)" - -#: api.lua -msgid "Not tamed!" -msgstr "Non-apprivoisé !" - -#: api.lua -msgid "@1 is owner!" -msgstr "Appartient à @1 !" - -#: api.lua -msgid "Missed!" -msgstr "Raté !" - -#: api.lua -msgid "Already protected!" -msgstr "Déjà protégé !" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 est en pleine forme (@2) " - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 a été apprivoisé ! " - -#: api.lua -msgid "Enter name:" -msgstr "Saisissez un nom :" - -#: api.lua -msgid "Rename" -msgstr "Renommer" - -#: crafts.lua -msgid "Name Tag" -msgstr "Étiquette de collier" - -#: crafts.lua -msgid "Leather" -msgstr "Cuir" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Viande crue" - -#: crafts.lua -msgid "Meat" -msgstr "Viande" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lasso (clic droit sur l'animal pour le mettre dans l'inventaire)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Filet (clic droit sur l'animal pour le mettre dans l'inventaire)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ciseaux à laine (clic droit pour tondre)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Rune de protection des animaux" - -#: crafts.lua -msgid "Saddle" -msgstr "Selle" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Clôture à animaux" - -#: crafts.lua -msgid "Mob Fence Top" -msgstr "Haut de clôture à animaux" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Générateur de mob" - -#: spawner.lua -msgid "(mob name) (min light) (max light) (amount) (player distance) (Y offset)" -msgstr "(Nom) (MinLumière) (MaxLumière) (Quantité) (Distance du Joueur) (Décalage en Y)" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Générateur non actif (entrez les paramètres)" - -#: spawner.lua -msgid "Command:" -msgstr "Commande:" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Générateur actif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Echec des paramètres du générateur" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "Syntaxe : “nom min_lumière[0-14] max_lumière[0-14] max_mobs_dans_zone[0 pour désactiver] distance[1-20] décalage_y[-10 à 10]“" diff --git a/mods/mobs_redo/locale/it.po b/mods/mobs_redo/locale/it.po deleted file mode 100644 index a40c33f9..00000000 --- a/mods/mobs_redo/locale/it.po +++ /dev/null @@ -1,131 +0,0 @@ -# ITALIAN LOCALE FILE FOR THE MOBS REDO MODULE -# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 -# This file is distributed under the same license as the MOBS REDO package. -# Hamlet , 2017. -# -msgid "" -msgstr "" -"Project-Id-Version: Italian locale file for the Mobs Redo module\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2020-05-11 13:33+0200\n" -"Last-Translator: Hamlet \n" -"Language-Team: \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Modalità pacifica attiva - non comparirà nessun mostro" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Il mob è stato protetto!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Addomesticato)" - -#: api.lua -msgid "Not tamed!" -msgstr "Non addomesticato!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Il padrone è @1!" - -#: api.lua -msgid "Missed!" -msgstr "Mancato!" - -#: api.lua -msgid "Already protected!" -msgstr "Già protetto!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 in piena salute (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 è stato addomesticato!" - -#: api.lua -msgid "Enter name:" -msgstr "Inserire il nome:" - -#: api.lua -msgid "Rename" -msgstr "Rinomina" - -#: crafts.lua -msgid "Name Tag" -msgstr "Targhetta" - -#: crafts.lua -msgid "Leather" -msgstr "Pelle" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne cruda" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lazo (click di destro per mettere l'animale nell'inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Rete (click destro per mettere l'animale nell'inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Cesoie d'acciaio (click destro per tosare)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Runa di protezione per mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Sella" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Recinzione per mob" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Generatore di mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuceMin LuceMax Ammontare DistGiocat." - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Generatore inattivo (inserire le impostazioni)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Generatore attivo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Impostazioni del generatore di mob fallite!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Sintassi: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 per " -"disabilitare] distance[1-20] y_offset[-10 fino a 10]”" diff --git a/mods/mobs_redo/locale/mobs.de.tr b/mods/mobs_redo/locale/mobs.de.tr index f11b665e..d3e9c881 100644 --- a/mods/mobs_redo/locale/mobs.de.tr +++ b/mods/mobs_redo/locale/mobs.de.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -#** Peaceful Mode Active - No Monsters Will Spawn= -@1 (Tamed)=@1 (Gezähmt) -@1 at full health (@2)=@1 bei voller Gesundheit (@2) -@1 has been tamed!=@1 wurde gezähmt! -@1 is owner!=@1 ist der Besitzer! -#Active Mob Limit Reached!= -Already protected!=Bereits geschützt! -#Change= -#Command:= -Enter name:=Namen eingeben: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen) -Leather=Leder -Meat=Fleisch -Missed!=Daneben! -Mob Fence=Kreaturen Zaun -#Mob Fence Top= -Mob Protection Rune=Kreaturschutzrune -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert! +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn=** Friedlicher Modus aktiv - Es werden keine Monster spawnen +Active Mob Limit Reached!=Aktives Mob-Limit erreicht! Mob has been protected!=Kreatur wurde geschützt! -Name Tag=Namensschild -Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen) +@1 (Tamed)=@1 (Gezähmt) Not tamed!=Nicht gezähmt! -Raw Meat=Rohes Fleisch +@1 is owner!=@1 ist der Besitzer! +Missed!=Daneben! +Already protected!=Bereits geschützt! +@1 has been tamed!=@1 wurde gezähmt! +@1 follows:=@1 folgt: +@1 mobs removed.=@1 Mobs entfernt. +Enter name:=Namen eingeben: Rename=Umbenennen -Saddle=Sattel -Spawner Active (@1)=Spawner aktiv (@1) -Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben) +Name Tag=Namensschild +Leather=Leder +Raw Meat=Rohes Fleisch +Meat=Fleisch +Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen) +Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen) Steel Shears (right-click to shear)=Stahlschere (Rechtsklick zum Scheren) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Kreaturschutzrune +Mob Protection Rune (Level 2)=Kreaturschutzrune (Level 2) +Saddle=Sattel +Mob Fence=Kreaturen Zaun +Mob Fence Top=Kreaturen Zaun Oberteil +Mob Reset Stick=Kreatur reset Stock +Meat Block=Fleischblock +Raw Meat Block=Roher Fleischblock +Enter texture:=Textur eingeben: +Change=Ändern +Mob Spawner=Kreaturenspawner +(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(Kreaturenname) (Min. Licht) (Max. Licht) (Anzahl) (Spielerabstand) (Y-Offset) +Command:=Befehl: +Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben) +Spawner Active (@1)=Spawner aktiv (@1) +Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.en.tr b/mods/mobs_redo/locale/mobs.en.tr index fab62b7a..d7895b3e 100644 --- a/mods/mobs_redo/locale/mobs.en.tr +++ b/mods/mobs_redo/locale/mobs.en.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -#** Peaceful Mode Active - No Monsters Will Spawn= -#@1 (Tamed)= -#@1 at full health (@2)= -#@1 has been tamed!= -#@1 is owner!= -#Active Mob Limit Reached!= -#Already protected!= -#Change= -#Command:= -#Enter name:= -#Enter texture:= -#Lasso (right-click animal to put in inventory)= -#Leather= -#Meat= -#Missed!= -#Mob Fence= -#Mob Fence Top= -#Mob Protection Rune= -#Mob Reset Stick= -#Mob Spawner= -#Mob Spawner settings failed!= -#Mob has been protected!= -#Name Tag= -#Net (right-click animal to put in inventory)= -#Not tamed!= -#Raw Meat= -#Rename= -#Saddle= -#Spawner Active (@1)= -#Spawner Not Active (enter settings)= -#Steel Shears (right-click to shear)= -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!= +Mob has been protected!= +@1 (Tamed)= +Not tamed!= +@1 is owner!= +Missed!= +Already protected!= +@1 has been tamed!= +@1 follows:= +@1 mobs removed.= +Enter name:= +Rename= +Name Tag= +Leather= +Raw Meat= +Meat= +Lasso (right-click animal to put in inventory)= +Net (right-click animal to put in inventory)= +Steel Shears (right-click to shear)= +Mob Protection Rune= +Mob Protection Rune (Level 2)= +Saddle= +Mob Fence= +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)= +Spawner Active (@1)= +Mob Spawner settings failed!= +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.es.tr b/mods/mobs_redo/locale/mobs.es.tr index 29ee934f..6194447c 100644 --- a/mods/mobs_redo/locale/mobs.es.tr +++ b/mods/mobs_redo/locale/mobs.es.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -#** Peaceful Mode Active - No Monsters Will Spawn= -@1 (Tamed)=@1 (Domesticado) -@1 at full health (@2)=@1 con salud llena (@2) -@1 has been tamed!=@1 ha sido domesticado! -@1 is owner!=@1 es el dueño! -#Active Mob Limit Reached!= -Already protected!=Ya está protegido! -#Change= -#Command:= -Enter name:=Ingrese nombre: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Lazo (click derecho en animal para colocar en inventario) -Leather=Cuero -Meat=Carne -Missed!=Perdido! -#Mob Fence= -#Mob Fence Top= -Mob Protection Rune=Runa de protección de Mob -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Configuracion de generador de Mob falló! +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!= Mob has been protected!=El mob ha sido protegido! -Name Tag=Nombrar etiqueta -Net (right-click animal to put in inventory)=Red (click derecho en animal para colocar en inventario) +@1 (Tamed)=@1 (Domesticado) Not tamed!=No domesticado! -Raw Meat=Carne cruda +@1 is owner!=@1 es el dueño! +Missed!=Perdido! +Already protected!=Ya está protegido! +@1 has been tamed!=@1 ha sido domesticado! +@1 follows:= +@1 mobs removed.= +Enter name:=Ingrese nombre: Rename=Renombrar -Saddle=Montura -Spawner Active (@1)=Generador activo (@1) -Spawner Not Active (enter settings)=Generador no activo (ingrese config) +Name Tag=Nombrar etiqueta +Leather=Cuero +Raw Meat=Carne cruda +Meat=Carne +Lasso (right-click animal to put in inventory)=Lazo (click derecho en animal para colocar en inventario) +Net (right-click animal to put in inventory)=Red (click derecho en animal para colocar en inventario) Steel Shears (right-click to shear)=Tijera de acero (click derecho para esquilar) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Runa de protección de Mob +Mob Protection Rune (Level 2)= +Saddle=Montura +Mob Fence= +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=Generador no activo (ingrese config) +Spawner Active (@1)=Generador activo (@1) +Mob Spawner settings failed!=Configuracion de generador de Mob falló! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.fr.tr b/mods/mobs_redo/locale/mobs.fr.tr index 3e137fb7..84d5af0f 100644 --- a/mods/mobs_redo/locale/mobs.fr.tr +++ b/mods/mobs_redo/locale/mobs.fr.tr @@ -1,34 +1,38 @@ -# textdomain:mobs +# textdomain: mobs ** Peaceful Mode Active - No Monsters Will Spawn=** Mode pacifique activé - aucun monstre ne sera généré -@1 (Tamed)=@1 (apprivoisé) -@1 at full health (@2)=@1 est en pleine forme (@2) -@1 has been tamed!=@1 a été apprivoisé ! -@1 is owner!=Appartient à @1 ! Active Mob Limit Reached!=Limite atteinte du nombre des êtres vivants actifs ! -Already protected!=Déjà protégé ! -Change=Changer -Command:=Commande : -Enter name:=Saisissez un nom : -Enter texture:=Saisissez une texture : -Lasso (right-click animal to put in inventory)=Lasso (clic droit sur l'animal pour le mettre dans l'inventaire) -Leather=Cuir -Meat=Viande +Mob has been protected!=L'animal a été protégé ! +@1 (Tamed)=@1 (apprivoisé) +Not tamed!=Non-apprivoisé ! +@1 is owner!=Appartient à @1 ! Missed!=Raté ! +Already protected!=Déjà protégé ! +@1 has been tamed!=@1 a été apprivoisé ! +@1 follows:= +@1 mobs removed.= +Enter name:=Saisissez un nom : +Rename=Renommer +Name Tag=Étiquette de collier +Leather=Cuir +Raw Meat=Viande crue +Meat=Viande +Lasso (right-click animal to put in inventory)=Lasso (clic droit sur l'animal pour le mettre dans l'inventaire) +Net (right-click animal to put in inventory)=Filet (clic droit sur l'animal pour le mettre dans l'inventaire) +Steel Shears (right-click to shear)=Ciseaux à laine (clic droit pour tondre) +Mob Protection Rune=Rune de protection des animaux +Mob Protection Rune (Level 2)= +Saddle=Selle Mob Fence= Clôture à animaux Mob Fence Top=Haut de clôture à animaux -Mob Protection Rune=Rune de protection des animaux Mob Reset Stick=Baguette de réinitialisation des êtres vivants +Meat Block= +Raw Meat Block= +Enter texture:=Saisissez une texture : +Change=Changer Mob Spawner=Créateur d'êtres vivants -Mob Spawner settings failed!=Échec des paramètres du créateur d'être vivants ! -Mob has been protected!=L'animal a été protégé ! -Name Tag=Étiquette de collier -Net (right-click animal to put in inventory)=Filet (clic droit sur l'animal pour le mettre dans l'inventaire) -Not tamed!=Non-apprivoisé ! -Raw Meat=Viande crue -Rename=Renommer -Saddle=Selle -Spawner Active (@1)=Créateur actif (@1) +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:=Commande : Spawner Not Active (enter settings)=Créateur non actif (entrez les paramètres) -Steel Shears (right-click to shear)=Ciseaux à laine (clic droit pour tondre) +Spawner Active (@1)=Créateur actif (@1) +Mob Spawner settings failed!=Échec des paramètres du créateur d'être vivants ! Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”=Syntaxe : «name min_lumière[0-14] max_lumière[0-14] max_être_vivant_dans_région[0 pour désactiver] distance_joueur[1-20] décalage_y[-10 to 10]» -lifetimer expired, removed @1=Être immortel expiré ; @1 retiré diff --git a/mods/mobs_redo/locale/mobs.it.tr b/mods/mobs_redo/locale/mobs.it.tr index 6b5edd9a..bfe78e1c 100644 --- a/mods/mobs_redo/locale/mobs.it.tr +++ b/mods/mobs_redo/locale/mobs.it.tr @@ -1,34 +1,38 @@ -# textdomain:mobs +# textdomain: mobs ** Peaceful Mode Active - No Monsters Will Spawn=** Modalità pacifica attiva - non comparirà nessun mostro -@1 (Tamed)=@1 (Addomesticato) -@1 at full health (@2)=@1 in piena salute (@2) -@1 has been tamed!=@1 è stato addomesticato! -@1 is owner!=Il padrone è @1! -#Active Mob Limit Reached!= -Already protected!=Già protetto! -#Change= -#Command:= -Enter name:=Inserire il nome: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Lazo (click di destro per mettere l'animale nell'inventario) -Leather=Pelle -Meat=Carne -Missed!=Mancato! -Mob Fence=Recinzione per mob -#Mob Fence Top= -Mob Protection Rune=Runa di protezione per mob -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Impostazioni del generatore di mob fallite! +Active Mob Limit Reached!= Mob has been protected!=Il mob è stato protetto! -Name Tag=Targhetta -Net (right-click animal to put in inventory)=Rete (click destro per mettere l'animale nell'inventario) +@1 (Tamed)=@1 (Addomesticato) Not tamed!=Non addomesticato! -Raw Meat=Carne cruda +@1 is owner!=Il padrone è @1! +Missed!=Mancato! +Already protected!=Già protetto! +@1 has been tamed!=@1 è stato addomesticato! +@1 follows:= +@1 mobs removed.= +Enter name:=Inserire il nome: Rename=Rinomina -Saddle=Sella -Spawner Active (@1)=Generatore attivo (@1) -Spawner Not Active (enter settings)=Generatore inattivo (inserire le impostazioni) +Name Tag=Targhetta +Leather=Pelle +Raw Meat=Carne cruda +Meat=Carne +Lasso (right-click animal to put in inventory)=Lazo (click di destro per mettere l'animale nell'inventario) +Net (right-click animal to put in inventory)=Rete (click destro per mettere l'animale nell'inventario) Steel Shears (right-click to shear)=Cesoie d'acciaio (click destro per tosare) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Runa di protezione per mob +Mob Protection Rune (Level 2)= +Saddle=Sella +Mob Fence=Recinzione per mob +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=Generatore inattivo (inserire le impostazioni) +Spawner Active (@1)=Generatore attivo (@1) +Mob Spawner settings failed!=Impostazioni del generatore di mob fallite! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.ms.tr b/mods/mobs_redo/locale/mobs.ms.tr index f79e2fb2..e1bd3707 100644 --- a/mods/mobs_redo/locale/mobs.ms.tr +++ b/mods/mobs_redo/locale/mobs.ms.tr @@ -1,34 +1,38 @@ -# textdomain:mobs +# textdomain: mobs ** Peaceful Mode Active - No Monsters Will Spawn=** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul -@1 (Tamed)=@1 (Jinak) -@1 at full health (@2)=Mata kesihatan @1 telah penuh (@2) -@1 has been tamed!=@1 telah dijinakkan! -@1 is owner!=Ini hak milik @1! -#Active Mob Limit Reached!= -Already protected!=Telah dilindungi! -#Change= -#Command:= -Enter name:=Masukkan nama: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Tanjul (klik-kanan haiwan untuk masukkan ke inventori) -Leather=Kulit -Meat=Daging Bakar -Missed!=Terlepas! -Mob Fence=Pagar Mob -#Mob Fence Top= -Mob Protection Rune=Rune Perlindungan Mob -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Penetapan Pewujud Mob gagal! +Active Mob Limit Reached!= Mob has been protected!=Mob telah pun dilindungi! -Name Tag=Tanda Nama -Net (right-click animal to put in inventory)=Jaring (klik-kanan haiwan untuk masukkan ke inventori) +@1 (Tamed)=@1 (Jinak) Not tamed!=Belum dijinakkan! -Raw Meat=Daging Mentah +@1 is owner!=Ini hak milik @1! +Missed!=Terlepas! +Already protected!=Telah dilindungi! +@1 has been tamed!=@1 telah dijinakkan! +@1 follows:= +@1 mobs removed.= +Enter name:=Masukkan nama: Rename=Namakan semula -Saddle=Pelana -Spawner Active (@1)=Pewujud Mob Aktif (@1) -Spawner Not Active (enter settings)=Pewujud Mob Tidak Aktif (masukkan tetapan) +Name Tag=Tanda Nama +Leather=Kulit +Raw Meat=Daging Mentah +Meat=Daging Bakar +Lasso (right-click animal to put in inventory)=Tanjul (klik-kanan haiwan untuk masukkan ke inventori) +Net (right-click animal to put in inventory)=Jaring (klik-kanan haiwan untuk masukkan ke inventori) Steel Shears (right-click to shear)=Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Rune Perlindungan Mob +Mob Protection Rune (Level 2)= +Saddle=Pelana +Mob Fence=Pagar Mob +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=Pewujud Mob Tidak Aktif (masukkan tetapan) +Spawner Active (@1)=Pewujud Mob Aktif (@1) +Mob Spawner settings failed!=Penetapan Pewujud Mob gagal! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.pt.tr b/mods/mobs_redo/locale/mobs.pt.tr index b62e9891..85df35ab 100644 --- a/mods/mobs_redo/locale/mobs.pt.tr +++ b/mods/mobs_redo/locale/mobs.pt.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -#** Peaceful Mode Active - No Monsters Will Spawn= -#@1 (Tamed)= -@1 at full health (@2)=@1 em plena saude (@2) -@1 has been tamed!=@1 foi domesticado! -@1 is owner!=Dono @1! -#Active Mob Limit Reached!= -#Already protected!= -#Change= -#Command:= -Enter name:=Insira um nome: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario) -Leather=Couro -Meat=Carne -Missed!=Faltou! -#Mob Fence= -#Mob Fence Top= -#Mob Protection Rune= -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Configuraçao de Spawnador do Mob falhou! -#Mob has been protected!= -Name Tag=Etiqueta -Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario) +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!= +Mob has been protected!= +@1 (Tamed)= Not tamed!=Indomesticado! -Raw Meat=Carne crua +@1 is owner!=Dono @1! +Missed!=Faltou! +Already protected!= +@1 has been tamed!=@1 foi domesticado! +@1 follows:= +@1 mobs removed.= +Enter name:=Insira um nome: Rename=Renomear -#Saddle= -Spawner Active (@1)=Spawnador Ativo (@1) -Spawner Not Active (enter settings)=Spawnador Inativo (configurar) +Name Tag=Etiqueta +Leather=Couro +Raw Meat=Carne crua +Meat=Carne +Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario) +Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario) Steel Shears (right-click to shear)=Tesoura de Aço (clique-direito para tosquiar) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune= +Mob Protection Rune (Level 2)= +Saddle= +Mob Fence= +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=Spawnador Inativo (configurar) +Spawner Active (@1)=Spawnador Ativo (@1) +Mob Spawner settings failed!=Configuraçao de Spawnador do Mob falhou! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.pt_BR.tr b/mods/mobs_redo/locale/mobs.pt_BR.tr new file mode 100644 index 00000000..c019b63b --- /dev/null +++ b/mods/mobs_redo/locale/mobs.pt_BR.tr @@ -0,0 +1,38 @@ +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!=Limite de Mob Ativo Atingido! +Mob has been protected!=Mob foi protegido +@1 (Tamed)=@1 (Domesticado) +Not tamed!=Não domesticado! +@1 is owner!=Dono @1! +Missed!=Faltou! +Already protected!= +@1 has been tamed!=@1 foi domesticado! +@1 follows:=@1 Segue: +@1 mobs removed.=@1 mobs removido. +Enter name:=Insira um nome: +Rename=Renomear +Name Tag=Etiqueta +Leather=Couro +Raw Meat=Carne crua +Meat=Carne +Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario) +Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario) +Steel Shears (right-click to shear)=Tesoura de Aço (clique-direito para tosquiar) +Mob Protection Rune=Runa de Proteção para Mob +Mob Protection Rune (Level 2)=Runa de Proteção para Mob (Nivel 2) +Saddle=Sela +Mob Fence= Cerca para mob +Mob Fence Top= Topo da cerca para mob +Mob Reset Stick= +Meat Block=Bloco de carne +Raw Meat Block=Bloco de Carne crua +Enter texture:=Insira a textura: +Change=Mudar +Mob Spawner=Spawner de mob +(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(Nome do mob) (min light) (max light) (amount) (player distance) (Y offset) +Command:=Comando: +Spawner Not Active (enter settings)=Spawner Inativo (configurar) +Spawner Active (@1)=Spawner Ativo (@1) +Mob Spawner settings failed!=Configuraçao de Spawner do Mob falhou! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.ru.tr b/mods/mobs_redo/locale/mobs.ru.tr index f7c201ab..0867c8ce 100644 --- a/mods/mobs_redo/locale/mobs.ru.tr +++ b/mods/mobs_redo/locale/mobs.ru.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -** Peaceful Mode Active - No Monsters Will Spawn=** Мирный модус активирован - монстры не спаунятся +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn=** Мирный Режим Активен - Никаких Монстров Не Появиться +Active Mob Limit Reached!=Лимит Активных Мобов Достигнут! +Mob has been protected!=Моб был защищён! @1 (Tamed)=@1 (Прирученный) -@1 at full health (@2)=@1 при полном здоровье (@2) -@1 has been tamed!=@1 приручен -@1 is owner!=@1 владелец -#Active Mob Limit Reached!= -Already protected!=Уже защищен! -#Change= -#Command:= -Enter name:=Введите имя: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Лассо (Правый клик - положить животное в инвентарь) -Leather=Кожа -Meat=Мясо +Not tamed!=Не прирученный! +@1 is owner!=@1 владелец! Missed!=Промазал! -Mob Fence=Забор от мобов -#Mob Fence Top= -Mob Protection Rune=Защитная руна мобов -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Настройки спаунера моба провалились -Mob has been protected!=Моб защищен! -Name Tag=Новый тэг -Net (right-click animal to put in inventory)=Сеть (Правый клик - положить животное в инвентарь) -Not tamed!=Не прирученный -Raw Meat=Сырое мясо +Already protected!=Уже защищён! +@1 has been tamed!=@1 был приручен! +@1 follows:=@1 следует: +@1 mobs removed.=@1 мобов удалено. +Enter name:=Введите имя: Rename=Переименовать +Name Tag=Новый Тег +Leather=Кожа +Raw Meat=Сырое Мясо +Meat=Мясо +Lasso (right-click animal to put in inventory)=Лассо (Правый клик - положить животное в инвентарь) +Net (right-click animal to put in inventory)=Сеть (Правый клик - положить животное в инвентарь) +Steel Shears (right-click to shear)=Железные Ножницы (Правый клик - подстричь) +Mob Protection Rune=Руна Защиты Моба +Mob Protection Rune (Level 2)=Руна Защиты Моба (2 Уровень) Saddle=Седло -Spawner Active (@1)=Активные спаунер (@1) -Spawner Not Active (enter settings)=Спаунер не активен (введите настройки) -Steel Shears (right-click to shear)=Ножницы (Правый клик - подстричь) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Fence=Забор для Мобов +Mob Fence Top=Верхний Забор для Мобов +Mob Reset Stick=Палка Сброса Моба +Meat Block=Мясной Блок +Raw Meat Block=Сырой Мясной Блок +Enter texture:=Введите текстуру: +Change=Изменить +Mob Spawner=Спавнер Мобов +(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(имя моба) (минимальный свет) (максимальный свет) (количество) (дистанция игрока) (смещение Y) +Command:=Команда: +Spawner Not Active (enter settings)=Спавнер Не Активен (введите настройки) +Spawner Active (@1)=Спавнер Активен (@1) +Mob Spawner settings failed!=Настроить Спавнер Мобов не удалось! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”=Синтаксис: “имя мин_свет[0-14] макс_свет[0-14] макс_мобов_в_зоне[0 чтобы выключить] дистанция_игроков[1-20] смещение_y[-10 to 10]” diff --git a/mods/mobs_redo/locale/mobs.tr.tr b/mods/mobs_redo/locale/mobs.tr.tr index 6e28706c..9070605c 100644 --- a/mods/mobs_redo/locale/mobs.tr.tr +++ b/mods/mobs_redo/locale/mobs.tr.tr @@ -1,34 +1,38 @@ -# textdomain:mobs -#** Peaceful Mode Active - No Monsters Will Spawn= -#@1 (Tamed)= -@1 at full health (@2)=@1 tam canında (@2) -@1 has been tamed!=@1 tamamen evcilleştirilmiştir! -@1 is owner!=Sahibi @1! -#Active Mob Limit Reached!= -#Already protected!= -#Change= -#Command:= -Enter name:=İsim gir: -#Enter texture:= -Lasso (right-click animal to put in inventory)=Kement (hayvana sağ tıklayarak envantere koy) -Leather=Deri -Meat=Et -Missed!=Kaçırdın! -Mob Fence=Canavar Yaratıcı -#Mob Fence Top= -#Mob Protection Rune= -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Yaratıcı ayarları uygulanamadı. -#Mob has been protected!= -Name Tag=İsim etiketi -Net (right-click animal to put in inventory)=Ağ (hayvana sağ tıklayarak envantere koy) +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!= +Mob has been protected!= +@1 (Tamed)= Not tamed!=Evcil değil! -Raw Meat=Çiğ et +@1 is owner!=Sahibi @1! +Missed!=Kaçırdın! +Already protected!= +@1 has been tamed!=@1 tamamen evcilleştirilmiştir! +@1 follows:= +@1 mobs removed.= +Enter name:=İsim gir: Rename=Yeniden adlandır -#Saddle= -Spawner Active (@1)=Yaratıcı aktif (@1) -Spawner Not Active (enter settings)=Yaratıcı aktif değil (ayarlara gir) +Name Tag=İsim etiketi +Leather=Deri +Raw Meat=Çiğ et +Meat=Et +Lasso (right-click animal to put in inventory)=Kement (hayvana sağ tıklayarak envantere koy) +Net (right-click animal to put in inventory)=Ağ (hayvana sağ tıklayarak envantere koy) Steel Shears (right-click to shear)=Çelik makas (sağ tıklayarak kes) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune= +Mob Protection Rune (Level 2)= +Saddle= +Mob Fence=Canavar Yaratıcı +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=Yaratıcı aktif değil (ayarlara gir) +Spawner Active (@1)=Yaratıcı aktif (@1) +Mob Spawner settings failed!=Yaratıcı ayarları uygulanamadı. +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.zh_CN.tr b/mods/mobs_redo/locale/mobs.zh_CN.tr index fe7556c2..62b72d24 100644 --- a/mods/mobs_redo/locale/mobs.zh_CN.tr +++ b/mods/mobs_redo/locale/mobs.zh_CN.tr @@ -1,34 +1,38 @@ -# textdomain:mobs +# textdomain: mobs ** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——没有怪物会产生 -@1 (Tamed)=@1(已驯服) -@1 at full health (@2)=@1已经满血(@2) -@1 has been tamed!=@1已经被驯服! -@1 is owner!=@1 是主人 -#Active Mob Limit Reached!= -Already protected!=已经被保护! -#Change= -#Command:= -Enter name:=输入名称: -#Enter texture:= -Lasso (right-click animal to put in inventory)=套索(右键单击动物以放入物品栏) -Leather=皮革 -Meat=肉 -Missed!=没抓住! -Mob Fence=Mob 栅栏 -#Mob Fence Top= -Mob Protection Rune=Mob 保护符文 -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Mob 孵化器设置失败! +Active Mob Limit Reached!= Mob has been protected!=Mob 已经被保护了! -Name Tag=名称标签 -Net (right-click animal to put in inventory)=网(右键单击动物以放入物品栏) +@1 (Tamed)=@1(已驯服) Not tamed!=没有驯服! -Raw Meat=生肉 +@1 is owner!=@1 是主人 +Missed!=没抓住! +Already protected!=已经被保护! +@1 has been tamed!=@1已经被驯服! +@1 follows:= +@1 mobs removed.= +Enter name:=输入名称: Rename=重新命名 -Saddle=鞍 -Spawner Active (@1)=孵化器正在运转(@1) -Spawner Not Active (enter settings)=孵化器未使用(输入设置) +Name Tag=名称标签 +Leather=皮革 +Raw Meat=生肉 +Meat=肉 +Lasso (right-click animal to put in inventory)=套索(右键单击动物以放入物品栏) +Net (right-click animal to put in inventory)=网(右键单击动物以放入物品栏) Steel Shears (right-click to shear)=钢剪(右键单击以剪切) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Mob 保护符文 +Mob Protection Rune (Level 2)= +Saddle=鞍 +Mob Fence=Mob 栅栏 +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=孵化器未使用(输入设置) +Spawner Active (@1)=孵化器正在运转(@1) +Mob Spawner settings failed!=Mob 孵化器设置失败! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/mobs.zh_TW.tr b/mods/mobs_redo/locale/mobs.zh_TW.tr index 89bed26d..a38c938b 100644 --- a/mods/mobs_redo/locale/mobs.zh_TW.tr +++ b/mods/mobs_redo/locale/mobs.zh_TW.tr @@ -1,34 +1,38 @@ -# textdomain:mobs +# textdomain: mobs ** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——沒有怪物會產生 -@1 (Tamed)=@1(已馴服) -@1 at full health (@2)=@1已經滿血(@2) -@1 has been tamed!=@1已經被馴服! -@1 is owner!=@1 是主人 -#Active Mob Limit Reached!= -Already protected!=已經被保護! -#Change= -#Command:= -Enter name:=輸入名稱: -#Enter texture:= -Lasso (right-click animal to put in inventory)=套索(右鍵單擊動物以放入物品欄) -Leather=皮革 -Meat=肉 -Missed!=沒抓住! -Mob Fence=Mob 柵欄 -#Mob Fence Top= -Mob Protection Rune=Mob 保護符文 -#Mob Reset Stick= -#Mob Spawner= -Mob Spawner settings failed!=Mob 孵化器設置失敗! +Active Mob Limit Reached!= Mob has been protected!=Mob 已經被保護了! -Name Tag=名稱標籤 -Net (right-click animal to put in inventory)=網(右鍵單擊動物以放入物品欄) +@1 (Tamed)=@1(已馴服) Not tamed!=沒有馴服! -Raw Meat=生肉 +@1 is owner!=@1 是主人 +Missed!=沒抓住! +Already protected!=已經被保護! +@1 has been tamed!=@1已經被馴服! +@1 follows:= +@1 mobs removed.= +Enter name:=輸入名稱: Rename=重新命名 -Saddle=鞍 -Spawner Active (@1)=孵化器正在運轉(@1) -Spawner Not Active (enter settings)=孵化器未使用(輸入設置) +Name Tag=名稱標籤 +Leather=皮革 +Raw Meat=生肉 +Meat=肉 +Lasso (right-click animal to put in inventory)=套索(右鍵單擊動物以放入物品欄) +Net (right-click animal to put in inventory)=網(右鍵單擊動物以放入物品欄) Steel Shears (right-click to shear)=鋼剪(右鍵單擊以剪切) -#Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= -#lifetimer expired, removed @1= +Mob Protection Rune=Mob 保護符文 +Mob Protection Rune (Level 2)= +Saddle=鞍 +Mob Fence=Mob 柵欄 +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)=孵化器未使用(輸入設置) +Spawner Active (@1)=孵化器正在運轉(@1) +Mob Spawner settings failed!=Mob 孵化器設置失敗! +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/ms.po b/mods/mobs_redo/locale/ms.po deleted file mode 100644 index a2a31f3f..00000000 --- a/mods/mobs_redo/locale/ms.po +++ /dev/null @@ -1,131 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-05 23:40+0800\n" -"PO-Revision-Date: 2018-02-05 23:51+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Mob telah pun dilindungi!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Jinak)" - -#: api.lua -msgid "Not tamed!" -msgstr "Belum dijinakkan!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Ini hak milik @1!" - -#: api.lua -msgid "Missed!" -msgstr "Terlepas!" - -#: api.lua -msgid "Already protected!" -msgstr "Telah dilindungi!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "Mata kesihatan @1 telah penuh (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 telah dijinakkan!" - -#: api.lua -msgid "Enter name:" -msgstr "Masukkan nama:" - -#: api.lua -msgid "Rename" -msgstr "Namakan semula" - -#: crafts.lua -msgid "Name Tag" -msgstr "Tanda Nama" - -#: crafts.lua -msgid "Leather" -msgstr "Kulit" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Daging Mentah" - -#: crafts.lua -msgid "Meat" -msgstr "Daging Bakar" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Tanjul (klik-kanan haiwan untuk masukkan ke inventori)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Jaring (klik-kanan haiwan untuk masukkan ke inventori)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Rune Perlindungan Mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Pelana" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Pagar Mob" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Pewujud Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob CahayaMin CahayaMax Amaun JarakPemain" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Pewujud Mob Tidak Aktif (masukkan tetapan)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Pewujud Mob Aktif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Penetapan Pewujud Mob gagal!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Sintaks: \"nama cahaya_minimum[0-14] cahaya_maksimum[0-14] " -"amaun_mob_maksimum[0 untuk lumpuhkan] jarak[1-20] ketinggian[-10 hingga 10]\"" diff --git a/mods/mobs_redo/locale/pt.po b/mods/mobs_redo/locale/pt.po deleted file mode 100644 index b52afd62..00000000 --- a/mods/mobs_redo/locale/pt.po +++ /dev/null @@ -1,133 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:55+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Indomesticado!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Dono @1!" - -#: api.lua -msgid "Missed!" -msgstr "Faltou!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 em plena saude (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 foi domesticado!" - -#: api.lua -msgid "Enter name:" -msgstr "Insira um nome:" - -#: api.lua -msgid "Rename" -msgstr "Renomear" - -#: crafts.lua -msgid "Name Tag" -msgstr "Etiqueta" - -#: crafts.lua -msgid "Leather" -msgstr "Couro" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne crua" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Laço (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Net (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Tesoura de Aço (clique-direito para tosquiar)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Spawnador de Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuzMinima LuzMaxima Valor DistJogador" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Spawnador Inativo (configurar)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawnador Ativo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Configuraçao de Spawnador do Mob falhou!" - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> nome luz_min[0-14] luz_max[0-14] max_mobs_na_area[0 para desabilitar] " -"distancia[1-20] y_offset[-10 a 10]" diff --git a/mods/mobs_redo/locale/ru.po b/mods/mobs_redo/locale/ru.po deleted file mode 100644 index 6cde7ef9..00000000 --- a/mods/mobs_redo/locale/ru.po +++ /dev/null @@ -1,129 +0,0 @@ -# Russian translation for the mobs_redo mod. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the mobs_redo package. -# Oleg720 , 2017. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-13 15:47+0200\n" -"PO-Revision-Date: 2018-03-23 22:22+0100\n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Мирный модус активирован - монстры не спаунятся" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Моб защищен!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Прирученный)" - -#: api.lua -msgid "Not tamed!" -msgstr "Не прирученный" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 владелец" - -#: api.lua -msgid "Missed!" -msgstr "Промазал!" - -#: api.lua -msgid "Already protected!" -msgstr "Уже защищен!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 при полном здоровье (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 приручен" - -#: api.lua -msgid "Enter name:" -msgstr "Введите имя:" - -#: api.lua -msgid "Rename" -msgstr "Переименовать" - -#: crafts.lua -msgid "Name Tag" -msgstr "Новый тэг" - -#: crafts.lua -msgid "Leather" -msgstr "Кожа" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Сырое мясо" - -#: crafts.lua -msgid "Meat" -msgstr "Мясо" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Лассо (Правый клик - положить животное в инвентарь)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Сеть (Правый клик - положить животное в инвентарь)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ножницы (Правый клик - подстричь)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Защитная руна мобов" - -#: crafts.lua -msgid "Saddle" -msgstr "Седло" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Забор от мобов" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Спаунер моба" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Спаунер не активен (введите настройки)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Активные спаунер (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Настройки спаунера моба провалились" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" diff --git a/mods/mobs_redo/locale/template.pot b/mods/mobs_redo/locale/template.pot deleted file mode 100644 index a625ee37..00000000 --- a/mods/mobs_redo/locale/template.pot +++ /dev/null @@ -1,136 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "" - -#: api.lua -msgid "@1 is owner!" -msgstr "" - -#: api.lua -msgid "Missed!" -msgstr "" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "" - -#: api.lua -msgid "Enter name:" -msgstr "" - -#: api.lua -msgid "Rename" -msgstr "" - -#: crafts.lua -msgid "Name Tag" -msgstr "" - -#: crafts.lua -msgid "Leather" -msgstr "" - -#: crafts.lua -msgid "Raw Meat" -msgstr "" - -#: crafts.lua -msgid "Meat" -msgstr "" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: crafts.lua -msgid "Mob Fence Top" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "" - -#: spawner.lua -msgid "(mob name) (min light) (max light) (amount) (player distance) (Y offset)" -msgstr "" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "" - -#@ spawner.lua -msgid "Command:" -msgstr "" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" diff --git a/mods/mobs_redo/locale/template.txt b/mods/mobs_redo/locale/template.txt new file mode 100644 index 00000000..d7895b3e --- /dev/null +++ b/mods/mobs_redo/locale/template.txt @@ -0,0 +1,38 @@ +# textdomain: mobs +** Peaceful Mode Active - No Monsters Will Spawn= +Active Mob Limit Reached!= +Mob has been protected!= +@1 (Tamed)= +Not tamed!= +@1 is owner!= +Missed!= +Already protected!= +@1 has been tamed!= +@1 follows:= +@1 mobs removed.= +Enter name:= +Rename= +Name Tag= +Leather= +Raw Meat= +Meat= +Lasso (right-click animal to put in inventory)= +Net (right-click animal to put in inventory)= +Steel Shears (right-click to shear)= +Mob Protection Rune= +Mob Protection Rune (Level 2)= +Saddle= +Mob Fence= +Mob Fence Top= +Mob Reset Stick= +Meat Block= +Raw Meat Block= +Enter texture:= +Change= +Mob Spawner= +(mob name) (min light) (max light) (amount) (player distance) (Y offset)= +Command:= +Spawner Not Active (enter settings)= +Spawner Active (@1)= +Mob Spawner settings failed!= +Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= diff --git a/mods/mobs_redo/locale/tr.po b/mods/mobs_redo/locale/tr.po deleted file mode 100644 index 10688e20..00000000 --- a/mods/mobs_redo/locale/tr.po +++ /dev/null @@ -1,133 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:56+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Evcil değil!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Sahibi @1!" - -#: api.lua -msgid "Missed!" -msgstr "Kaçırdın!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 tam canında (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 tamamen evcilleştirilmiştir!" - -#: api.lua -msgid "Enter name:" -msgstr "İsim gir:" - -#: api.lua -msgid "Rename" -msgstr "Yeniden adlandır" - -#: crafts.lua -msgid "Name Tag" -msgstr "İsim etiketi" - -#: crafts.lua -msgid "Leather" -msgstr "Deri" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Çiğ et" - -#: crafts.lua -msgid "Meat" -msgstr "Et" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Kement (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Ağ (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Çelik makas (sağ tıklayarak kes)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Canavar Yaratıcı" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Canavar Yaratıcı" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob MinIşık MaxIşık Miktar OyuncuMesafesi" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Yaratıcı aktif değil (ayarlara gir)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Yaratıcı aktif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Yaratıcı ayarları uygulanamadı." - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> isim min_isik[0-14] max_isik[0-14] alandaki_max_canavar_sayisi[kapatmak " -"icin 0] mesafe[1-20] y_cikinti[-10 ve 10 arası]" diff --git a/mods/mobs_redo/locale/zh_CN.po b/mods/mobs_redo/locale/zh_CN.po deleted file mode 100644 index bd8ffa05..00000000 --- a/mods/mobs_redo/locale/zh_CN.po +++ /dev/null @@ -1,130 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# IFRFSX<1079092922@qq.com>, 2020. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** 和平模式已激活——没有怪物会产生" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Mob 已经被保护了!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1(已驯服)" - -#: api.lua -msgid "Not tamed!" -msgstr "没有驯服!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 是主人" - -#: api.lua -msgid "Missed!" -msgstr "没抓住!" - -#: api.lua -msgid "Already protected!" -msgstr "已经被保护!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1已经满血(@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1已经被驯服!" - -#: api.lua -msgid "Enter name:" -msgstr "输入名称:" - -#: api.lua -msgid "Rename" -msgstr "重新命名" - -#: crafts.lua -msgid "Name Tag" -msgstr "名称标签" - -#: crafts.lua -msgid "Leather" -msgstr "皮革" - -#: crafts.lua -msgid "Raw Meat" -msgstr "生肉" - -#: crafts.lua -msgid "Meat" -msgstr "肉" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "套索(右键单击动物以放入物品栏)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "网(右键单击动物以放入物品栏)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "钢剪(右键单击以剪切)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Mob 保护符文" - -#: crafts.lua -msgid "Saddle" -msgstr "鞍" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Mob 栅栏" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Mob 孵化器" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob/最小光量/最大光量/玩家距离" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "孵化器未使用(输入设置)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "孵化器正在运转(@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Mob 孵化器设置失败!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"语法: “物品名称 最小光亮[0-14] 最大光亮[0-14] 范围内的最大Mob数量[0 to disable] " -"距离[1-20] y_offset[-10 to 10]”" diff --git a/mods/mobs_redo/locale/zh_TW.po b/mods/mobs_redo/locale/zh_TW.po deleted file mode 100644 index 6350a632..00000000 --- a/mods/mobs_redo/locale/zh_TW.po +++ /dev/null @@ -1,130 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# IFRFSX<1079092922@qq.com>, 2020. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** 和平模式已激活——沒有怪物會產生" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Mob 已經被保護了!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1(已馴服)" - -#: api.lua -msgid "Not tamed!" -msgstr "沒有馴服!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 是主人" - -#: api.lua -msgid "Missed!" -msgstr "沒抓住!" - -#: api.lua -msgid "Already protected!" -msgstr "已經被保護!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1已經滿血(@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1已經被馴服!" - -#: api.lua -msgid "Enter name:" -msgstr "輸入名稱:" - -#: api.lua -msgid "Rename" -msgstr "重新命名" - -#: crafts.lua -msgid "Name Tag" -msgstr "名稱標籤" - -#: crafts.lua -msgid "Leather" -msgstr "皮革" - -#: crafts.lua -msgid "Raw Meat" -msgstr "生肉" - -#: crafts.lua -msgid "Meat" -msgstr "肉" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "套索(右鍵單擊動物以放入物品欄)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "網(右鍵單擊動物以放入物品欄)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "鋼剪(右鍵單擊以剪切)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Mob 保護符文" - -#: crafts.lua -msgid "Saddle" -msgstr "鞍" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Mob 柵欄" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Mob 孵化器" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob/最小光量/最大光量/玩家距離" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "孵化器未使用(輸入設置)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "孵化器正在運轉(@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Mob 孵化器設置失敗!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"語法: “物品名稱 最小光亮[0-14] 最大光亮[0-14] 範圍內的最大Mob數量[0 to disable] " -"距離[1-20] y_offset[-10 to 10]”" diff --git a/mods/mobs_redo/lucky_block.lua b/mods/mobs_redo/lucky_block.lua index b823e832..8c95b5bb 100644 --- a/mods/mobs_redo/lucky_block.lua +++ b/mods/mobs_redo/lucky_block.lua @@ -1,18 +1,97 @@ -if minetest.get_modpath("lucky_block") then +local S = minetest.get_translator("mobs") - lucky_block:add_blocks({ - {"dro", {"mobs:meat_raw"}, 5}, - {"dro", {"mobs:meat"}, 5}, - {"dro", {"mobs:nametag"}, 1}, - {"dro", {"mobs:leather"}, 5}, - {"dro", {"default:stick"}, 10}, - {"dro", {"mobs:net"}, 1}, - {"dro", {"mobs:lasso"}, 1}, - {"dro", {"mobs:shears"}, 1}, - {"dro", {"mobs:protector"}, 1}, - {"dro", {"mobs:fence_wood"}, 10}, - {"dro", {"mobs:fence_top"}, 12}, - {"lig"} - }) -end +-- add lucky blocks + +lucky_block:add_blocks({ + {"dro", {"mobs:meat_raw"}, 5}, + {"dro", {"mobs:meat"}, 5}, + {"dro", {"mobs:nametag"}, 1}, + {"dro", {"mobs:leather"}, 5}, + {"dro", {"default:stick"}, 10}, + {"dro", {"mobs:net"}, 1}, + {"dro", {"mobs:lasso"}, 1}, + {"dro", {"mobs:shears"}, 1}, + {"dro", {"mobs:protector"}, 1}, + {"dro", {"mobs:fence_wood"}, 10}, + {"dro", {"mobs:fence_top"}, 12}, + {"lig"} +}) + +-- pint sized rune, use on tamed mob to shrink to half-size + +minetest.register_craftitem(":mobs:pint_sized_rune", { + description = S("Pint Sized Rune"), + inventory_image = "mobs_pint_sized_rune.png", + groups = {flammable = 2}, + + on_use = function(itemstack, user, pointed_thing) + + if pointed_thing.type ~= "object" then return end + + local name = user and user:get_player_name() or "" + local tool = user and user:get_wielded_item() + local tool_name = tool:get_name() + + if tool_name ~= "mobs:pint_sized_rune" then return end + + local self = pointed_thing.ref:get_luaentity() + + if not self._cmi_is_mob then + minetest.chat_send_player(name, S("Not a Mobs Redo mob!")) + return + end + + if not self.tamed then + minetest.chat_send_player(name, S("Not tamed!")) + return + end + + if self.pint_size_potion then + minetest.chat_send_player(name, S("Potion already applied!")) + return + end + + if not mobs.is_creative(user:get_player_name()) then + tool:take_item() -- take 1 rune + user:set_wielded_item(tool) + end + + local pos = self.object:get_pos() + local prop = self.object:get_properties() + + vis_size = {x = self.base_size.x * .5, y = self.base_size.y * .5} + + self.base_size = vis_size + + colbox = { + self.base_colbox[1] * .5, self.base_colbox[2] * .5, + self.base_colbox[3] * .5, self.base_colbox[4] * .5, + self.base_colbox[5] * .5, self.base_colbox[6] * .5} + + self.base_colbox = colbox + + selbox = { + self.base_selbox[1] * .5, self.base_selbox[2] * .5, + self.base_selbox[3] * .5, self.base_selbox[4] * .5, + self.base_selbox[5] * .5, self.base_selbox[6] * .5} + + self.base_selbox = selbox + + self.object:set_properties( + {visual_size = vis_size, collisionbox = colbox, selectionbox = selbox}) + + self.pint_size_potion = true + + pos.y = pos.y + prop.collisionbox[5] + + mobs:effect(pos, 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) + + self:mob_sound("mobs_spell") + end +}) + +minetest.register_craft({ + output = "lucky_block:pint_sized_rune", + recipe = {{"lucky_block:pint_sized_potion", "mobs:protector"}} +}) diff --git a/mods/mobs_redo/mod.conf b/mods/mobs_redo/mod.conf index 1760bd4f..f6353e89 100644 --- a/mods/mobs_redo/mod.conf +++ b/mods/mobs_redo/mod.conf @@ -1,4 +1,4 @@ name = mobs -depends = -optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder description = Adds a mob api for mods to add animals or monsters etc. +optional_depends = default, tnt, invisibility, lucky_block, cmi, toolranks, pathfinder, player_api, mtobjid, visual_harm_1ndicators, mcl_sounds, mesecons +min_minetest_version = 5.0 diff --git a/mods/mobs_redo/mount.lua b/mods/mobs_redo/mount.lua index 9d660ff6..ded3accd 100644 --- a/mods/mobs_redo/mount.lua +++ b/mods/mobs_redo/mount.lua @@ -1,62 +1,53 @@ + -- lib_mount by Blert2112 (edited by TenPlus1) +local is_mc2 = minetest.get_modpath("mcl_mobs") -- MineClone2 check + +-- one of these is needed to ride mobs, otherwise no riding for you + +if not minetest.get_modpath("player_api") and not is_mc2 then + + function mobs.attach() end + function mobs.detach() end + function mobs.fly() end + function mobs.drive() end + + return +end + +-- Localise some functions + local abs, cos, floor, sin, sqrt, pi = math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi ------------------------------------------------------------------------------- --- --- Helper functions --- +-- helper functions -local node_ok = function(pos, fallback) - fallback = fallback or mobs.fallback_node +local function node_is(entity) - local node = minetest.get_node_or_nil(pos) + if not entity.standing_on then return "other" end - if node and minetest.registered_nodes[node.name] then - return node - end + if entity.standing_on == "air" then return "air" end - return {name = fallback} -end + local def = minetest.registered_nodes[entity.standing_on] - -local function node_is(pos) - - local node = node_ok(pos) - - if node.name == "air" then - return "air" - end - - if minetest.get_item_group(node.name, "lava") ~= 0 then - return "lava" - end - - if minetest.get_item_group(node.name, "liquid") ~= 0 then - return "liquid" - end - - if minetest.registered_nodes[node.name].walkable == true then - return "walkable" - end + if def.groups.lava then return "lava" end + if def.groups.liquid then return "liquid" end + if def.groups.walkable then return "walkable" end return "other" end local function get_sign(i) - i = i or 0 - if i == 0 then - return 0 - else - return i / abs(i) - end + if not i or i == 0 then return 0 end + + return i / abs(i) end local function get_velocity(v, yaw, y) + local x = -sin(yaw) * v local z = cos(yaw) * v @@ -71,33 +62,40 @@ end local function force_detach(player) - local attached_to = player:get_attach() + local attached_to = player and player:get_attach() - if not attached_to then - return - end + if not attached_to then return end local entity = attached_to:get_luaentity() - if entity and entity.driver - and entity.driver == player then + if entity and entity.driver and entity.driver == player then entity.driver = nil end player:set_detach() - player_api.player_attached[player:get_player_name()] = false - player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - player_api.set_animation(player, "stand", 30) - player:set_properties({visual_size = {x = 1, y = 1}}) + local name = player:get_player_name() + + if is_mc2 then + mcl_player.player_attached[player:get_player_name()] = false + mcl_player.player_set_animation(player, "stand", 30) + else + player_api.player_attached[name] = false + player_api.set_animation(player, "stand", 30) + end + + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_properties({visual_size = {x = 1, y = 1}}) end -------------------------------------------------------------------------------- +-- detach player on leaving minetest.register_on_leaveplayer(function(player) force_detach(player) end) +-- detatch all players on shutdown + minetest.register_on_shutdown(function() local players = minetest.get_connected_players() @@ -107,25 +105,21 @@ minetest.register_on_shutdown(function() end end) +-- detatch player when dead + minetest.register_on_dieplayer(function(player) force_detach(player) return true end) -------------------------------------------------------------------------------- +-- find free position to detach player --- Just for correct detaching local function find_free_pos(pos) local check = { - {x = 1, y = 0, z = 0}, - {x = 1, y = 1, z = 0}, - {x = -1, y = 0, z = 0}, - {x = -1, y = 1, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 1, z = 1}, - {x = 0, y = 0, z = -1}, - {x = 0, y = 1, z = -1} + {x = 1, y = 0, z = 0}, {x = 1, y = 1, z = 0}, {x = -1, y = 0, z = 0}, + {x = -1, y = 1, z = 0}, {x = 0, y = 0, z = 1}, {x = 0, y = 1, z = 1}, + {x = 0, y = 0, z = -1}, {x = 0, y = 1, z = -1} } for _, c in pairs(check) do @@ -137,8 +131,7 @@ local function find_free_pos(pos) local def = minetest.registered_nodes[node.name] - if def and not def.walkable and - def.liquidtype == "none" then + if def and not def.walkable and def.liquidtype == "none" then return npos end end @@ -147,10 +140,21 @@ local function find_free_pos(pos) return pos end -------------------------------------------------------------------------------- +-- are we a real player ? + +local function is_player(player) + + if player and type(player) == "userdata" and minetest.is_player(player) then + return true + end +end + +-- attach player to mob entity function mobs.attach(entity, player) + if not player then return end + entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} @@ -158,9 +162,7 @@ function mobs.attach(entity, player) local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = pi / 2 - end + if entity.player_rotation.y == 90 then rot_view = pi / 2 end local attach_at = entity.driver_attach_at local eye_offset = entity.driver_eye_offset @@ -169,29 +171,38 @@ function mobs.attach(entity, player) force_detach(player) + if is_mc2 then + mcl_player.player_attached[player:get_player_name()] = true + else + player_api.player_attached[player:get_player_name()] = true + end + player:set_attach(entity.object, "", attach_at, entity.player_rotation) - player_api.player_attached[player:get_player_name()] = true player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) player:set_properties({ - visual_size = { - x = entity.driver_scale.x, - y = entity.driver_scale.y - } + visual_size = {x = entity.driver_scale.x, y = entity.driver_scale.y} }) minetest.after(0.2, function() - if player and player:is_player() then - player_api.set_animation(player, "sit", 30) + if is_player(player) then + + if is_mc2 then + mcl_player.player_set_animation(player, "sit_mount" , 30) + else + player_api.set_animation(player, "sit", 30) + end end end) player:set_look_horizontal(entity.object:get_yaw() - rot_view) end +-- detatch player from mob function mobs.detach(player) + force_detach(player) minetest.after(0.1, function() @@ -207,15 +218,18 @@ function mobs.detach(player) end) end +-- vars + +local damage_counter = 0 + +-- ride mob like car or horse function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) local yaw = entity.object:get_yaw() or 0 local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = pi / 2 - end + if entity.player_rotation.y == 90 then rot_view = pi / 2 end local acce_y = 0 local velo = entity.object:get_velocity() ; if not velo then return end @@ -227,19 +241,15 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) local ctrl = entity.driver:get_player_control() - -- move forwards - if ctrl.up then + if ctrl.up then -- move forwards - entity.v = entity.v + entity.accel / 10 + entity.v = entity.v + entity.accel * dtime - -- move backwards - elseif ctrl.down then + elseif ctrl.down then -- move backwards - if entity.max_speed_reverse == 0 and entity.v == 0 then - return - end + if entity.max_speed_reverse == 0 and entity.v == 0 then return end - entity.v = entity.v - entity.accel / 10 + entity.v = entity.v - entity.accel * dtime end -- mob rotation @@ -249,12 +259,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) horz = yaw - if ctrl.left then - horz = horz + 0.05 - - elseif ctrl.right then - horz = horz - 0.05 - end + if ctrl.left then horz = horz + 0.05 + elseif ctrl.right then horz = horz - 0.05 end else horz = entity.driver:get_look_horizontal() or 0 end @@ -262,8 +268,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) entity.object:set_yaw(horz - entity.rotate) if can_fly then - -- fly up - if ctrl.jump then + + if ctrl.jump then -- fly up velo.y = velo.y + 1 @@ -271,13 +277,12 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) elseif velo.y > 0 then - velo.y = velo.y - 0.1 + velo.y = velo.y - dtime if velo.y < 0 then velo.y = 0 end end - -- fly down - if ctrl.sneak then + if ctrl.sneak then -- fly down velo.y = velo.y - 1 @@ -285,15 +290,16 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) elseif velo.y < 0 then - velo.y = velo.y + 0.1 + velo.y = velo.y + dtime if velo.y > 0 then velo.y = 0 end end else - -- jump - if ctrl.jump then + if ctrl.jump then -- jump (only when standing on solid surface) - if velo.y == 0 then + if velo.y == 0 + and entity.standing_on ~= "air" and entity.standing_on ~= "ignore" + and minetest.get_item_group(entity.standing_on, "liquid") == 0 then velo.y = velo.y + entity.jump_height acce_y = acce_y + (acce_y * 3) + 1 end @@ -301,20 +307,45 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end end + local ni = node_is(entity) + + -- env damage + if ni == "liquid" or ni == "lava" then + + damage_counter = damage_counter + dtime + + if damage_counter > 1 then + + local damage = 0 + + if entity.lava_damage > 0 and ni == "lava" then + damage = entity.lava_damage + elseif entity.water_damage > 0 and ni == "liquid" then + damage = entity.water_damage + end + + if damage >= 1 then + + entity.object:punch(entity.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage} + }, nil) + end + + damage_counter = 0 + end + end + -- if not moving then set animation and return if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - if stand_anim then - mobs:set_animation(entity, stand_anim) - end + if stand_anim then entity:set_animation(stand_anim) end return end -- set moving animation - if moving_anim then - mobs:set_animation(entity, moving_anim) - end + if moving_anim then entity:set_animation(moving_anim) end -- Stop! local s = get_sign(entity.v) @@ -330,14 +361,10 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end -- enforce speed limit forward and reverse - local max_spd = entity.max_speed_reverse - - if get_sign(entity.v) >= 0 then - max_spd = entity.max_speed_forward - end - - if abs(entity.v) > max_spd then - entity.v = entity.v - get_sign(entity.v) + if entity.v > entity.max_speed_forward then + entity.v = entity.max_speed_forward + elseif entity.v < -entity.max_speed_reverse then + entity.v = -entity.max_speed_reverse end -- Set position, velocity and acceleration @@ -345,41 +372,18 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if not p then return end - local new_acce = {x = 0, y = -9.81, z = 0} + local new_acce = {x = 0, y = entity.fall_speed, z = 0} p.y = p.y - 0.5 - local ni = node_is(p) local v = entity.v if ni == "air" then - if can_fly == true then - new_acce.y = 0 - end + if can_fly then new_acce.y = 0 ; acce_y = 0 end elseif ni == "liquid" or ni == "lava" then - if ni == "lava" and entity.lava_damage ~= 0 then - - entity.lava_counter = (entity.lava_counter or 0) + dtime - - if entity.lava_counter > 1 then - - minetest.sound_play("default_punch", { - object = entity.object, - max_hear_distance = 5 - }, true) - - entity.object:punch(entity.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = entity.lava_damage} - }, nil) - - entity.lava_counter = 0 - end - end - local terrain_type = entity.terrain_type if terrain_type == 2 or terrain_type == 3 then @@ -387,7 +391,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) new_acce.y = 0 p.y = p.y + 1 - if node_is(p) == "liquid" then + if minetest.get_item_group(entity.standing_in, "liquid") ~= 0 then if velo.y >= 5 then velo.y = 5 @@ -423,31 +427,26 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) entity.v2 = v end +-- fly mob in facing direction (by D00Med, edited by TenPlus1) --- directional flying routine by D00Med (edited by TenPlus1) function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) local ctrl = entity.driver:get_player_control() ; if not ctrl then return end - local velo = entity.object:get_velocity() + local velo = entity.object:get_velocity() ; if not velo then return end local dir = entity.driver:get_look_dir() - local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands + local yaw = entity.driver:get_look_horizontal() ; if not yaw then return end -if not ctrl or not velo then return end + yaw = yaw + 1.57 -- fix from get_yaw to get_look_horizontal if ctrl.up then - entity.object:set_velocity({ - x = dir.x * speed, - y = dir.y * speed + 2, - z = dir.z * speed - }) + + entity.object:set_velocity( + {x = dir.x * speed, y = dir.y * speed + 2, z = dir.z * speed}) elseif ctrl.down then - entity.object:set_velocity({ - x = -dir.x * speed, - y = dir.y * speed + 2, - z = -dir.z * speed - }) + entity.object:set_velocity( + {x = -dir.x * speed, y = dir.y * speed + 2, z = -dir.z * speed}) elseif not ctrl.down or ctrl.up or ctrl.jump then entity.object:set_velocity({x = 0, y = -2, z = 0}) @@ -469,7 +468,8 @@ if not ctrl or not velo then return end if ent then ent.switch = 1 -- for mob specific arrows - ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding + ent.owner_id = tostring(entity.object) -- so arrows dont hurt mob + local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} yaw = entity.driver:get_look_horizontal() @@ -481,11 +481,9 @@ if not ctrl or not velo then return end end end - -- change animation if stopped if velo.x == 0 and velo.y == 0 and velo.z == 0 then - mobs:set_animation(entity, stand_anim) + entity:set_animation(stand_anim) -- stopped animation else - -- moving animation - mobs:set_animation(entity, moving_anim) + entity:set_animation(moving_anim) -- moving animation end end diff --git a/mods/mobs_redo/readme.MD b/mods/mobs_redo/readme.MD index d0f062f5..2cbf867a 100644 --- a/mods/mobs_redo/readme.MD +++ b/mods/mobs_redo/readme.MD @@ -1,93 +1,442 @@ +# MOBS REDO for MINETEST -MOBS REDO for MINETEST - -Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. - - -This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters etc. +Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, +Zeg9, ExeterDad and AspireMint. +This mod contains the API only for adding your own mobs into the world, so +please use the additional modpacks to add animals, monsters, and npcs. https://forum.minetest.net/viewtopic.php?f=11&t=9917 +## Crafts -Crafts: +- **Nametag**. Can be crafted by paper, black dye, and string. Can be used + to right-click on a tamed mob to give them a name. +- **Net**. Used to right-click tamed mobs to pick them up and place inside + inventory as a spawn egg. +- **Magic lasso**. Similar to nets but with a better chance of picking up + larger mobs. +- **Shears**. Used to right-click sheep and return 1-3 wool. +- **Protection Rune**. Protects tamed mobs from being harmed by other players. +- **Mob Fence and Fence Top**. Stops mobs escaping or glitching throughfences. - - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. - - Nets can be used to right-click tamed mobs to pick them up and place inside inventory as a spawn egg. - - Magic Lasso is similar to nets but with a better chance of picking up larger mobs. - - Shears are used to right-click sheep and return 1-3 wool. - - Protection Rune lets you protect tamed mobs from harm by other players - - Mob Fence and Fence Top (to stop mobs escaping/glitching through fences) +**Lucky Blocks**: 12 -Lucky Blocks: 9 +## Changelog + +### Version 1.62 + +* Added ability for mobs to hear using self.on_sound() function +* Added 'mobs_can_hear' setting to turn above feature on/off +* Added {eatable} group to food items and HP in description +* Fixed timer bug when attacking +* Fixed fall damage check when riding mob + +### Version 1.61 + +* Fixed mob damage when riding mobs +* Added entity:is_inside(itemtable) function (thx cora) +* Added self.attack_patience value so mobs stop attacking unseen players +* Added self.homing so that arrows follow player when visible +* Added support for Visual Harm 1ndicators mod to show health bars +* Added self.node_damage flag which is true by default to enable damage_per_second node damage +* Added check for on_death() function before using mob api's own on_die() one +* Added mobs:fallback_node for when current [game] hasn't defined mapgen_dirt node + +### Version 1.60 + +* Move mob and arrow entities to use initial_properties +* Spawn eggs check if mob is available when creating +* Used get/set_properties() within API for mob properties +* Moved nametag variable to self._nametag +* Tidied breeding function +* Better MineClone2 / MineClonia support added +* Tweaked and tidied code in places + +### Version 1.57 + +* Added 'injured' animation when mob hurt +* Fixed yaw clamping to stop spinning mobs +* Added 'mob_node_timer_interval' and 'mob_main_timer_interval' settings +* Added ability for mobs to die only in natural daylight +* Refactored do_jump and added get_nodes function +* Many bug fixes and tweaks to improve performance +* Added 'mobs_attack_creatura' setting so that monsters can attack Creatura mobs +* Nodes can be added to 'runaway_from' table +* Better Mineclone2 compatibility with api, items and recipes +* Added 'mob_log_spawn' setting to log spawning of mobs and position + +### Version 1.56 + +* Added `arrow_override` function to mob definition to tweak arrow entity settings +* Added injured animation and mob hit effect +* Tamed monsters no longer despawn when outside loaded map area +* `looting_level` can be read from tool definition or tool meta to add extra + drops when mob killed + +### Version 1.55 + +* Added `peaceful_player` privilege and setting so mobs don't attack specific + players (thanks sfence) +* Added support for MarkBu's `pathfinder` mod, remove need for default mod + +### Version 1.54 + +* **New support for swimming mobs** + - `on_flop` (for mobs not in water) + - `air_damage` added +* Added editable settings (thanks Wuzzy) +* Simplified animal breeding function +* Child mobs now take twenty minutes to grow up +* Reverted to simple mob spawning with setting to use area checks + +### Version 1.53 + +* Added `on_map_load` settings to `mobs:spawn` so that mobs will only spawn + when new areas of map are loaded. + +### Version 1.52 + +* Added `mob_active_limit` in settings to set number of mobs in game. The + default is 0, for unlimited mobs. +* Removed `{immortal}` from mob armor +* Fluid viscocity slows mobs (for example, water) + +### Version 1.51 + +* Added node checks for dangerous nodes +* Add `mob_nospawn_range` setting +* Jumping and falling tweaks +* Spawn area check (thanks for idea wuzzy) +* Re-enabled mob suffocation + +### Version 1.50 + +* Added new `line_of_sight` function that uses raycasting if Minetest 5.0 is + found, (thanks Astrobe) +* Added Chinese local +* Removed ability to spawn mobs if world anchor nearby (`technic` or + `simple_anchor` mods) + +### Version 1.49 + +* Added `mobs:force_capture(self, player)` function +* API functions now use metatables thanks to bell07 + +### Version 1.48 + +* Added `mobs:set_velocity(self, velocity)` global function [deprecated] + +### Version 1.47 + +* Added minimum and maximum light level for damage +* Mob damage changes +* Ignition sources checked for lava damage + +### Version 1.46 + +* Mobs only drop rare items when killed by player. You can make change the + drops to rare items by using `drops.min = 0` +* Pathfinding no longer sees through walkable nodes + +### Version 1.45 + +* Added fence top to add on top of any fence to stop mobs escaping +* New `line_of_sight` tweaked by `Astrobe` + +### Version 1.44 + +* Added `ToolRanks` support for swords when attacking mobs + +### Version 1.43 + +* Added general attack function and settings +* Better Minetest 0.4.16 compatibility + +### Version 1.42 + +* Added `"all"` option to `immune_to` definition table +* Tidied floating mobs to be less intensive + +### Version 1.41 + +* Mob pathfinding has been updated thanks to `Elkien3` + +### Version 1.40 + +* Updated to use newer functions, requires Minetest 0.4.16+ to work + +### Version 1.39 + +* **New custom functions**: + - `on_breed` (called when mobs have just been bred) + - `on_grown` (called when baby mobs have grown up) + - `do_punch` (called when the mob has been punched or damaged by another mob) + +### Version 1.38 + +* Better entity checking +* Nametag setting +* `on_spawn` function added to mob registry +* Tweaked light damage + +### Version 1.37 + +* Added support for `Raymoo`'s CMI (common mob interface) mod. See + https://forum.minetest.net/viewtopic.php?f=9&t=15448 for details + +### Version 1.36 + +* Added death check. If the mob dies in fire/lava/with lava pick, then drops + are cooked + +### Version 1.35 + +* Added `owner_loyal` flag for owned mobs to attack player enemies +* Fixed `group_attack` + +### Version 1.34 + +* Added function to fly mob using directional movement (thanks D00Med for + flying code) + +### Version 1.33 + +* Added functions to mount ride mobs: + - `mobs.attach` + - `mobs.detach` + - `mobs.drive`. Many thanks to `Blert2112` + +### Version 1.32 + +* Added new spawn check to count specific mobs AND new `minetest.conf` setting + to chance spawn chance and numbers +* Added ability to protect tamed mobs + +### Version 1.31 + +* Added `attack_animals` and `specific_attack` flags for custom monster + attacks +* Added 'mob_difficulty' .conf setting to make mobs harder + +### Version 1.30 + +* Added support for `invisibility` mod +* Tweaked and tidied code + +### Version 1.29 + +* Split original Mobs Redo into a modpack to make it easier to disable mob sets + (animal, monster, npc) or simply use the API itself for your own mod + +### Version 1.28 + +* Added new damage system with ability for mob to be immune to weapons or + healed by them :) + +### Version 1.27 + +* Added new sheep, lava flan and spawn egg textures +* New Lava Pick tool smelts what you dig +* New `atan` checking function + +### Version 1.26 + +* Pathfinding feature added thanks to rnd +* When monsters attack they become scary smart in finding you :) +* Beehive produces honey now :) + +### Version 1.25 + +* Mobs no longer spawn within 12 blocks of player or despawn within same + range +* Spawners now have player detection +* Tidy and tweak code + +### Version 1.24 + +* Added feature where certain animals run away when punched + (`runaway = true` in mob definition) + +### Version 1.23 + +* Added mob spawner block for admin to setup spawners in-game (place and + right-click to enter settings) + +### Version 1.22 + +* Added ability to name tamed animals and NPCs using nametags +* NPCs will attack anyone who punches them apart from owner + +### Version 1.21 + +* Added some more error checking to reduce `serialize.h` error and added height + checks for falling off cliffs (thanks `cmdskp`) + +### Version 1.20 + +* Error checking added to remove bad mobs +* Out of map limit mobs and stop `serialize.h` error + +### Version 1.19 + +* Chickens now drop egg items instead of placing the egg +* Throwing eggs result in ⅛ chance of spawning chick + +### Version 1.18 + +* Added `docile_by_day` flag so that monsters will not attack automatically + during daylight hours unless hit first + +### Version 1.17 + +* Added `dogshoot` attack type. Mobs now shoot when out of reach +* Melee attack when in reach, also API tweaks and `self.reach` added + +### Version 1.16 + +* Mobs follow multiple items now +* NPCs can now breed + +### Version 1.15 + +* Added feeding, taming, and breeding function +* Right-click to pick up any sheep with X mark on them and replace with new one + to fix compatibility. + +### Version 1.14 + +* All variables saved in staticdata +* Fixed health bug + +### Version 1.13 + +* Added capture function (thanks `blert2112`) chance of picking up mob with a + hand, a net, or a magic lasso +* Replaced some `.x` models with newer `.b3d` ones + +### Version 1.12 + +* Added animal ownership so that players cannot steal your tamed animals + +### Version 1.11 + +* Added flying and swimming mobs +* `fly=true` and `fly_in="air"` or `"default:water_source"` for fishy + +### Version 1.10 + +* Added explosion routine for exploding mob +* Footstep removed (use replace) + +### Version 1.09 -Changelog: -- 1.56 - Added arrow_override function to mob definition to tweak arrow entity settings, tamed monsters no longer despawn when outside loaded map area. -- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence), add support for MarkBu's pathfinder mod, remove need for default mod -- 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added. -- 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded. -- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game, -(default is 0 for unlimited), removed {immortal} from mob armor, fluid viscocity slows mobs -- 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting -- 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found, (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added -- 1.49- Added mobs:force_capture(self, player) function, api functions now use metatables thanks to bell07 -- 1.48- Add mobs:set_velocity(self, velocity) global function -- 1.47- Mob damage changes, min and max light level for damage added, ignition sources checked for lava damage -- 1.46- Mobs only drop rare items when killed by player (drops.min = 0 makes them rare), code tweak, pathfinding no longer sees through walkable nodes -- 1.45- Added Fence Top to add on top of any fence to stop mobs escaping, new line_of_sight tweaked by Astrobe -- 1.44- Added ToolRanks support for swords when attacking mobs -- 1.43- Better 0.4.16 compatibility, added general attack function and settings -- 1.42- Added "all" option to immune_to table, tidied floating mobs to be less intensive -- 1.41- Mob pathfinding has been updated thanks to Elkien3 -- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. -- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob -- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage -- 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 -- 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked -- 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack -- 1.34- Added function to fly mob using directional movement (thanks D00Med for flying code) -- 1.33- Added functions to mount ride mobs (mobs.attach, mobs.detach, mobs.drive) many thanks to Blert2112 -- 1.32- Added new spawn check to count specific mobs AND new minetest.conf setting to chance spawn chance and numbers, added ability to protect tamed mobs -- 1.31- Added 'attack_animals' and 'specific_attack' flags for custom monster attacks, also 'mob_difficulty' .conf setting to make mobs harder. -- 1.30- Added support for invisibility mod (mobs cant attack what they cant see), tweaked and tidied code -- 1.29- Split original Mobs Redo into a modpack to make it easier to disable mob sets (animal, monster, npc) or simply use the Api itself for your own mod -- 1.28- New damage system added with ability for mob to be immune to weapons or healed by them :) -- 1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. -- 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) -- 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. -- 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) -- 1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings) -- 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner -- 1.21- Added some more error checking to reduce serialize.h error and added height checks for falling off cliffs (thanks cmdskp) -- 1.20- Error checking added to remove bad mobs, out of map limit mobs and stop serialize.h error -- 1.19- Chickens now drop egg items instead of placing the egg, also throwing eggs result in 1/8 chance of spawning chick -- 1.18- Added docile_by_day flag so that monsters will not attack automatically during daylight hours unless hit first -- 1.17- Added 'dogshoot' attack type, shoots when out of reach, melee attack when in reach, also api tweaks and self.reach added -- 1.16- Mobs follow multiple items now, Npc's can breed -- 1.15- Added Feeding/Taming/Breeding function, right-click to pick up any sheep with X mark on them and replace with new one to fix compatibility. -- 1.14- All .self variables saved in staticdata, Fixed self.health bug -- 1.13- Added capture function (thanks blert2112) chance of picking up mob with hand; net; magic lasso, replaced some .x models with newer .b3d one's -- 1.12- Added animal ownership so that players cannot steal your tamed animals -- 1.11- Added flying mobs (and swimming), fly=true and fly_in="air" or "deafult:water_source" for fishy -- 1,10- Footstep removed (use replace), explosion routine added for exploding mobs. -- 1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals -- 1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added -- 1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables -- beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop -- 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) -- 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten -- 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) -- 1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. -- 1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions -- 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items -- 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) -- 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked -- 0.8 - Added sounds to monster mobs (thanks Cyberpangolin for the sfx) and also chicken sound -- 0.7 - mobs.protected switch added to api.lua, when set to 1 mobs no longer spawn in protected areas, also bug fixes -- 0.6 - Api now supports multi-textured mobs, e.g oerkki, dungeon master, rats and chickens have random skins when spawning (sheep fix TODO), also new Honey block -- 0.5 - Mobs now float in water, die from falling, and some code improvements -- 0.4 - Dungeon Masters and Mese Monsters have much better aim due to shoot_offset, also they can both shoot through nodes that aren't walkable (flowers, grass etc) plus new sheep sound :) -- 0.3 - Added LOTT's Spider mob, made Cobwebs, added KPavel's Bee with Honey and Beehives (made texture), Warthogs now have sound and can be tamed, taming of shaved sheep or milked cow with 8 wheat so it will not despawn, many bug fixes :) -- 0.2 - Cooking bucket of milk into cheese now returns empty bucket -- 0.1 - Initial Release +* Added mob rotation value +* Added footstep feature +* Added jumping mobs with sounds feature +* Aadded magic lasso for picking up animals +* Reworked breeding routine + +### Version 1.08 + +* Added drops that appear when mob is killed +* New custom function: `on_die` function +* Mob throwing attack has been rehauled so that they can damage one another, + +### Version 1.07 + +* NPCs can now be set to follow player or stand by using `order` and `owner` + variables + +* BETA: Npc mob added. They kill monsters (maybe as guards) and attack players + when punched by them. Right-clicking them with food will heal them, and + giving them gold lump will make them drop a random item. + +### Version 1.06 + +* Changed recovery times after breeding. Time taken to grow up can be sped up + by feeding the baby animal. + +### Version 1.05 + +* Added `ExeterDad`'s bunniess which can be picked up and tamed with four carrots from `farming_redo` or `farming_plus` +* Added shears to get wool from sheep +* Added Jordach/BSD's kitten + +### Version 1.04 + +* Added mating for sheep, cows and hogs +* Added feature to feed animals to make horny and hope for a baby which is half + size, they will grow up quick though :) + +### Version 1.03 + +* Added mob drop/replace feature so that chickens can drop eggs and cow/sheep + can eat grass/wheat etc. + +### Version 1.02 + +* Sheared sheep are remembered and spawn shaven +* Warthogs will attack when threatened +* API additions + +### Version 1.01 + +* Mobs that suffer fall damage or die in water/lava/sunlight will now drop + items + +### Version 1.0 + +* More work on API so that certain mobs can float in water while some sink like + a brick :) + +### Version 0.9 + +* Spawn eggs added for all mobs (admin only, cannot be placed in protected + areas) +* Tweaked API + +### Version 0.8 + +* Added sounds to monster mobs (thanks `Cyberpangolin` for the `sfx`) +* Added chicken sound +### Version 0.7 + +* `mobs.protected` switch added to `api.lua`. When set to 1 mobs no longer + spawn in protected areas +* Minor bugfixes + +### Version 0.6 + +* API now supports multi-textured mobs, e.g oerkki, dungeon master, rats and + chickens have random skins when spawning (sheep fix TODO) +* Added new Honey block + +### Version 0.5 + +* Mobs now float in water, die from falling +* Minor code improvements + +### Version 0.4 + +* Added new sheep sound :) +* Dungeon Masters and Mese Monsters have much better aim due to `shoot_offset` +* They can both shoot through nodes that aren't walkable (flowers, grass, etc.) + +### Version 0.3 + +* Added `LOTT`'s Spider mob +* Added Cobwebs +* Added KPavel's Bee with Honey and Beehives (made texture) +* Warthogs now have sound and can be tamed +* Taming of shaved sheep or milked cow with 8 wheat so it will not despawn +* Multiple bug fixes :) + +### Version 0.2 + +* Cooking bucket of milk into cheese now returns empty bucket + +### Version 0.1 + +* Initial Release diff --git a/mods/mobs_redo/settingtypes.txt b/mods/mobs_redo/settingtypes.txt index dae580da..c4e33a2d 100644 --- a/mods/mobs_redo/settingtypes.txt +++ b/mods/mobs_redo/settingtypes.txt @@ -1,3 +1,12 @@ +# Enable setting so that Mobs Redo mobs can attack Creatura mobs +mobs_attack_creatura (Attack Creatura Mobs) bool false + +# How often mobs get nodes around them (default is 0.25, 1/4 second) +mob_node_timer_interval (Mob Node Timer Interval) float 0.25 + +# How often mobs run main functions (default is 1.00, 1 second) +mob_main_timer_interval (Mob Node Timer Interval) float 1.00 + # If false then mobs no longer spawn in world without spawner or spawn egg mobs_spawn (Spawn Mobs) bool true @@ -7,6 +16,9 @@ only_peaceful_mobs (Only spawn peaceful Mobs) bool false # If enabled then punching mobs no longer shows blood effects mobs_disable_blood (Disable Mob blood) bool false +# If enabled the mobs will be highlighted when hit +mob_hit_effect (Highlight Mob when Hit) bool false + # If disabled then Mobs no longer destroy world blocks mobs_griefing (Griefing Mobs) bool true @@ -22,9 +34,6 @@ remove_far_mobs (Remove far Mobs) bool true # Sets Mob difficulty level by multiplying punch damage mob_difficulty (Mob difficulty) float 1.0 -# If disabled health status no longer appears above Mob when punched -mob_show_health (Show Mob health) bool true - # Contains a value used to multiply Mob spawn values mob_chance_multiplier (Mob chance multiplier) float 1.0 @@ -45,3 +54,37 @@ enable_peaceful_player (Mobs do not attack peaceful player without reason) bool # Enable mobs smooth rotation mob_smooth_rotate (Smooth rotation for mobs) bool true + +# Fix Mob Height if too low so they cannot escape through specific nodes +mob_height_fix (Fix Mob Height) bool true + +mob_log_spawn (Log Mob Spawning) bool false + +# Mob hearing, when enabled will override minetest.sound_play for mobs to hear +mobs_can_hear (Enable Mob hearing) bool true + +# Node hearing, when enabled will allow nodes to hear nearby sounds +mobs_can_hear_node (Enable Node hearing) bool false + +# By default mobs are dealt knockback from damage, this lets you disable it +mobs_disable_damage_kb (Disable knockback from damage only) bool false + +[Pathfinding] +# Enable pathfinding (default Enabled) +mob_pathfinding_enable (Enable pathfinding) bool true +# How long before stuck mobs starts searching (default 3.0) +mob_pathfinding_stuck_timeout (How long before stuck mobs start searching) float 3.0 +# How long will mob follow path before giving up (default 5.0) +mob_pathfinding_stuck_path_timeout (How long will mob follow path before giving up) float 5.0 +# Which pathfinding algorithm to use +# - Dijkstra (default) +# - A*_noprefetch (AStar_noprefetch) +# - A* (AStar) +# (A* names differ cause Minetest doesn´t allow "*" in settings) +mob_pathfinding_algorithm (pathfinding algorithm) enum Dijkstra Dijkstra,AStar_noprefetch,AStar +# max search distance from search positions (default 16) +mob_pathfinding_searchdistance (path search distance) int 16 +# max jump height for pathfinding (default 4) +mob_pathfinding_max_jump (path max jump height) int 4 +# max drop height for pathfinding (default 6) +mob_pathfinding_max_drop (path max drop height) int 6 diff --git a/mods/mobs_redo/sounds/default_punch.ogg b/mods/mobs_redo/sounds/default_punch.ogg deleted file mode 100644 index 28a500bf..00000000 Binary files a/mods/mobs_redo/sounds/default_punch.ogg and /dev/null differ diff --git a/mods/mobs_redo/sounds/license.txt b/mods/mobs_redo/sounds/license.txt deleted file mode 100644 index 3b160fe2..00000000 --- a/mods/mobs_redo/sounds/license.txt +++ /dev/null @@ -1,7 +0,0 @@ -Creative Commons sounds from Freesound.org - -mobs_swing.ogg by qubodup - - http://freesound.org/people/qubodup/sounds/60012/ - -mobs_spell.ogg by littlerobotsoundfactory - - http://freesound.org/people/LittleRobotSoundFactory/sounds/270396/ diff --git a/mods/mobs_redo/sounds/mobs_punch.ogg b/mods/mobs_redo/sounds/mobs_punch.ogg new file mode 100644 index 00000000..86cabff1 Binary files /dev/null and b/mods/mobs_redo/sounds/mobs_punch.ogg differ diff --git a/mods/mobs_redo/sounds/mobs_swing.ogg b/mods/mobs_redo/sounds/mobs_swing.ogg index ffe6a9ce..30609f01 100644 Binary files a/mods/mobs_redo/sounds/mobs_swing.ogg and b/mods/mobs_redo/sounds/mobs_swing.ogg differ diff --git a/mods/mobs_redo/spawner.lua b/mods/mobs_redo/spawner.lua index bfcdcbaa..271cbd66 100644 --- a/mods/mobs_redo/spawner.lua +++ b/mods/mobs_redo/spawner.lua @@ -1,5 +1,26 @@ -local S = mobs.intllib +local S = minetest.get_translator("mobs") +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) + +-- helper functions + +local function is_player(player) + + if player and type(player) == "userdata" and minetest.is_player(player) then + return true + end +end + +local square = math.sqrt + +local get_distance = function(a, b) + + if not a or not b then return 50 end -- nil check and default distance + + local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z + + return square(x * x + y * y + z * z) +end -- mob spawner @@ -11,7 +32,11 @@ minetest.register_node("mobs:spawner", { paramtype = "light", walkable = true, description = S("Mob Spawner"), - groups = {cracky = 1}, + groups = {cracky = 1, pickaxey = 3}, + is_ground_content = false, + _mcl_hardness = 1, + _mcl_blast_resistance = 5, + sounds = mobs.node_sound_stone_defaults(), on_construct = function(pos) @@ -22,8 +47,7 @@ minetest.register_node("mobs:spawner", { .. " (player distance) (Y offset)") -- text entry formspec - meta:set_string("formspec", - "size[10,3.5]" + meta:set_string("formspec", "size[10,3.5]" .. "label[0.15,0.5;" .. minetest.formspec_escape(head) .. "]" .. "field[1,2.5;8.5,0.8;text;" .. S("Command:") .. ";${command}]") @@ -34,16 +58,12 @@ minetest.register_node("mobs:spawner", { on_right_click = function(pos, placer) - if minetest.is_protected(pos, placer:get_player_name()) then - return - end + if minetest.is_protected(pos, placer:get_player_name()) then return end end, on_receive_fields = function(pos, formname, fields, sender) - if not fields.text or fields.text == "" then - return - end + if not fields.text or fields.text == "" then return end local meta = minetest.get_meta(pos) local comm = fields.text:split(" ") @@ -54,35 +74,31 @@ minetest.register_node("mobs:spawner", { return end - local mob = comm[1] -- mob to spawn + local mob = comm[1] or "" -- mob to spawn local mlig = tonumber(comm[2]) -- min light local xlig = tonumber(comm[3]) -- max light local num = tonumber(comm[4]) -- total mobs in area local pla = tonumber(comm[5]) -- player distance (0 to disable) local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob - if mob and mob ~= "" and mobs.spawning_mobs[mob] - and num and num >= 0 and num <= 10 - and mlig and mlig >= 0 and mlig <= 15 - and xlig and xlig >= 0 and xlig <= 15 - and pla and pla >= 0 and pla <= 20 - and yof and yof > -10 and yof < 10 then + if mob ~= "" and mobs.spawning_mobs[mob] and num and num >= 0 and num <= 10 + and mlig and mlig >= 0 and mlig <= 15 and xlig and xlig >= 0 and xlig <= 15 + and pla and pla >= 0 and pla <= 20 and yof and yof > -10 and yof < 10 then meta:set_string("command", fields.text) meta:set_string("infotext", S("Spawner Active (@1)", mob)) - else minetest.chat_send_player(name, S("Mob Spawner settings failed!")) minetest.chat_send_player(name, - S("Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”")) + S("Syntax: “name min_light[0-14] max_light[0-14] " + .. "max_mobs_in_area[0 to disable] player_distance[1-20] " + .. "y_offset[-10 to 10]”")) end end }) - -local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) - -- spawner abm + minetest.register_abm({ label = "Mob spawner node", nodenames = {"mobs:spawner"}, @@ -93,9 +109,7 @@ minetest.register_abm({ action = function(pos, node, active_object_count, active_object_count_wider) -- return if too many entities already - if active_object_count_wider >= max_per_block then - return - end + if active_object_count_wider >= max_per_block then return end -- get meta and command local meta = minetest.get_meta(pos) @@ -110,9 +124,7 @@ minetest.register_abm({ local yof = tonumber(comm[6]) or 0 -- if amount is 0 then do nothing - if num == 0 then - return - end + if num == 0 then return end -- are we spawning a registered mob? if not mobs.spawning_mobs[mob] then @@ -130,49 +142,43 @@ minetest.register_abm({ ent = obj:get_luaentity() - if ent and ent.name and ent.name == mob then - count = count + 1 - end + if ent and ent.name and ent.name == mob then count = count + 1 end end -- is there too many of same type? - if count >= num then - return - end + if count >= num then return end - -- spawn mob if player detected and in range + -- when player distance above 0, spawn mob if player detected and in range if pla > 0 then - local in_range = 0 - local objsp = minetest.get_objects_inside_radius(pos, pla) + local in_range, player + local players = minetest.get_connected_players() - for _, oir in pairs(objsp) do + for i = 1, #players do - if oir:is_player() then + player = players[i] - in_range = 1 + if get_distance(player:get_pos(), pos) <= pla then + + in_range = true break end end -- player not found - if in_range == 0 then - return - end + if not in_range then return end end -- set medium mob usually spawns in (defaults to air) local reg = minetest.registered_entities[mob].fly_in - if not reg or type(reg) == "string" then - reg = {(reg or "air")} - end + if not reg or type(reg) == "string" then reg = {(reg or "air")} end -- find air blocks within 5 nodes of spawner local air = minetest.find_nodes_in_area( - {x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, - {x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, reg) + {x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, + {x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, reg) -- spawn in random air block if air and #air > 0 then @@ -183,8 +189,7 @@ minetest.register_abm({ pos2.y = pos2.y + 0.5 -- only if light levels are within range - if lig >= mlig and lig <= xlig - and minetest.registered_entities[mob] then + if lig >= mlig and lig <= xlig and minetest.registered_entities[mob] then minetest.add_entity(pos2, mob) end end diff --git a/mods/mobs_redo/textures/mobs_fallback.png b/mods/mobs_redo/textures/mobs_fallback.png new file mode 100644 index 00000000..bc5e4536 Binary files /dev/null and b/mods/mobs_redo/textures/mobs_fallback.png differ diff --git a/mods/mobs_redo/textures/mobs_hearing_vines.png b/mods/mobs_redo/textures/mobs_hearing_vines.png new file mode 100644 index 00000000..97febe35 Binary files /dev/null and b/mods/mobs_redo/textures/mobs_hearing_vines.png differ diff --git a/mods/mobs_redo/textures/mobs_hearing_vines_active.png b/mods/mobs_redo/textures/mobs_hearing_vines_active.png new file mode 100644 index 00000000..179aa73c Binary files /dev/null and b/mods/mobs_redo/textures/mobs_hearing_vines_active.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_bottom.png b/mods/mobs_redo/textures/mobs_meat_bottom.png index 351c16fa..559e6e34 100644 Binary files a/mods/mobs_redo/textures/mobs_meat_bottom.png and b/mods/mobs_redo/textures/mobs_meat_bottom.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_raw_bottom.png b/mods/mobs_redo/textures/mobs_meat_raw_bottom.png new file mode 100644 index 00000000..e6ef6c5a Binary files /dev/null and b/mods/mobs_redo/textures/mobs_meat_raw_bottom.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_raw_side.png b/mods/mobs_redo/textures/mobs_meat_raw_side.png new file mode 100644 index 00000000..4ba1ed07 Binary files /dev/null and b/mods/mobs_redo/textures/mobs_meat_raw_side.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_raw_top.png b/mods/mobs_redo/textures/mobs_meat_raw_top.png new file mode 100644 index 00000000..1dcc6d9d Binary files /dev/null and b/mods/mobs_redo/textures/mobs_meat_raw_top.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_side.png b/mods/mobs_redo/textures/mobs_meat_side.png index 10dac081..4a3da50d 100644 Binary files a/mods/mobs_redo/textures/mobs_meat_side.png and b/mods/mobs_redo/textures/mobs_meat_side.png differ diff --git a/mods/mobs_redo/textures/mobs_meat_top.png b/mods/mobs_redo/textures/mobs_meat_top.png index 0058e6a4..14116b48 100644 Binary files a/mods/mobs_redo/textures/mobs_meat_top.png and b/mods/mobs_redo/textures/mobs_meat_top.png differ diff --git a/mods/mobs_redo/textures/mobs_nametag.png b/mods/mobs_redo/textures/mobs_nametag.png index 74005b3a..d6160652 100644 Binary files a/mods/mobs_redo/textures/mobs_nametag.png and b/mods/mobs_redo/textures/mobs_nametag.png differ diff --git a/mods/mobs_redo/textures/mobs_pint_sized_rune.png b/mods/mobs_redo/textures/mobs_pint_sized_rune.png new file mode 100644 index 00000000..75ace1ca Binary files /dev/null and b/mods/mobs_redo/textures/mobs_pint_sized_rune.png differ diff --git a/mods/mobs_sky/mobs_bat/depends.txt b/mods/mobs_sky/mobs_bat/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_sky/mobs_bat/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_sky/mobs_bat/init.lua b/mods/mobs_sky/mobs_bat/init.lua index 3e1c5276..8fabf006 100644 --- a/mods/mobs_sky/mobs_bat/init.lua +++ b/mods/mobs_sky/mobs_bat/init.lua @@ -1,21 +1,20 @@ -if minetest.get_modpath("mobs") and not mobs.mod and mobs.mod ~= "redo" then - minetest.log("error", "[mobs_bat] mobs redo API not found!") - return -end - -- local variables + +local l_spawnnear = {"default:stone"} +local l_spawnchance = 30000 local l_skins = { {"animal_bat.png"}, {"animal_bat.png^[colorize:black:150"} } -local l_spawnnear = {"default:stone"} -local l_spawnchance = 30000 + +-- spawn definition mobs:register_mob("mobs_bat:bat", { type = "animal", + passive = false, damage = 1, - reach = 1, + reach = 2, attack_type = "dogfight", hp_min = 7, hp_max = 12, @@ -25,15 +24,15 @@ mobs:register_mob("mobs_bat:bat", { mesh = "animal_bat.b3d", textures = l_skins, rotate = 270, - walk_velocity = 10, - run_velocity = 23, + walk_velocity = 3,--10, + run_velocity = 5,--23, fall_speed = 0, stepheight = 3, sounds = { random = "animal_bat", war_cry = "animal_bat", damage = "animal_bat", - attack = "animal_bat", + attack = "animal_bat" }, fly = true, water_damage = 2, @@ -41,27 +40,43 @@ mobs:register_mob("mobs_bat:bat", { light_damage = 0, view_range = 10, animation = { - speed_normal = 24, speed_run = 24, - stand_start = 30, stand_end = 59, - walk_start = 30, walk_end = 59, - run_start = 30, run_end = 59, - punch_start = 60, punch_end = 89 + speed_normal = 24, speed_run = 24, + stand_start = 30, stand_end = 59, + fly_start = 30, fly_end = 59, + walk_start = 30, walk_end = 59, + run_start = 30, run_end = 59, + punch_start = 60, punch_end = 89 }, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 5, 60, 0, true, nil) end }) -mobs:spawn({ - name = "mobs_bat:bat", - nodes = {"air"}, - neighbors = l_spawnnear, - max_light = 6, - interval = 30, - chance = l_spawnchance, - active_object_count = 2, - min_height = -100, - max_height = 150, -}) +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + mobs:spawn({ + name = "mobs_bat:bat", + nodes = {"air"}, + neighbors = l_spawnnear, + max_light = 6, + interval = 30, + chance = l_spawnchance, + active_object_count = 2, + min_height = -100, + max_height = 150 + }) +end + +-- mob egg mobs:register_egg("mobs_bat:bat", "Bat", "animal_bat_inv.png", 0) + + +print("[MOD] Mobs Redo Bat loaded") diff --git a/mods/mobs_sky/mobs_bat/license.txt b/mods/mobs_sky/mobs_bat/license.txt index 8b68e7d8..bc962615 100644 --- a/mods/mobs_sky/mobs_bat/license.txt +++ b/mods/mobs_sky/mobs_bat/license.txt @@ -3,10 +3,9 @@ -- ANÝMAL BAT -- -------------------------- -------------------------- --- +-- -- Model and textures from Defense Subgame --- License of defense mod GPL --- License of media (models, textures ) (CC BY-SA 3.0) --- License of Api WTFPL Simple Mobs by PilzAdam > Mob Redo by Ten1plus > Redo+ Mahmutelmas06 +-- License of code is MIT +-- License of media (models, textures ) (CC BY-SA 3.0) -- Sounds from bigsoundbank and WTFPL ( confirmed by email ) --- \ No newline at end of file +-- diff --git a/mods/mobs_sky/mobs_bat/mod.conf b/mods/mobs_sky/mobs_bat/mod.conf index 30bf1262..565dd14d 100644 --- a/mods/mobs_sky/mobs_bat/mod.conf +++ b/mods/mobs_sky/mobs_bat/mod.conf @@ -1,4 +1,4 @@ name = mobs_bat -depends = default, mobs -optional_depends = description = Adds bats into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_sky/mobs_bat/spawn_example.lua b/mods/mobs_sky/mobs_bat/spawn_example.lua new file mode 100644 index 00000000..0cc243a8 --- /dev/null +++ b/mods/mobs_sky/mobs_bat/spawn_example.lua @@ -0,0 +1,14 @@ + +-- Bat spawn example + +mobs:spawn({ + name = "mobs_bat:bat", + nodes = {"air"}, + neighbors = {"default:stone"}, + max_light = 6, + interval = 30, + chance = 30000, + active_object_count = 2, + min_height = -100, + max_height = 150 +}) diff --git a/mods/mobs_sky/mobs_bat/textures/Thumbs.db b/mods/mobs_sky/mobs_bat/textures/Thumbs.db deleted file mode 100644 index 417d0236..00000000 Binary files a/mods/mobs_sky/mobs_bat/textures/Thumbs.db and /dev/null differ diff --git a/mods/mobs_sky/mobs_birds/SETTINGS.txt b/mods/mobs_sky/mobs_birds/SETTINGS.txt deleted file mode 100644 index bb35f4fb..00000000 --- a/mods/mobs_sky/mobs_birds/SETTINGS.txt +++ /dev/null @@ -1,6 +0,0 @@ - --- SETTINGS - -ENABLE_GULLS = true -ENABLE_LARGE_BIRDS = true -ENABLE_SMALL_BIRDS = true diff --git a/mods/mobs_sky/mobs_birds/depends.txt b/mods/mobs_sky/mobs_birds/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_sky/mobs_birds/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_sky/mobs_birds/init.lua b/mods/mobs_sky/mobs_birds/init.lua index c36fa075..f1645454 100644 --- a/mods/mobs_sky/mobs_birds/init.lua +++ b/mods/mobs_sky/mobs_birds/init.lua @@ -1,21 +1,29 @@ -- local variables -local l_spawn_chance_gull = 24000 -local l_spawn_chance_bird = 36000 + +local l_spawn_chance_gull = 24000 +local l_spawn_chance_bird = 36000 -- load settings -dofile(minetest.get_modpath("mobs_birds").."/SETTINGS.txt") -if not ENABLE_LARGE_BIRDS then +local ENABLE_GULLS = minetest.settings:get_bool("mobs_birds.enable_gulls") ~= false +local ENABLE_LARGE = minetest.settings:get_bool("mobs_birds.enable_large_birds") ~= false +local ENABLE_SMALL = minetest.settings:get_bool("mobs_birds.enable_small_birds") ~= false + +if not ENABLE_LARGE then l_spawn_chance_bird = l_spawn_chance_bird - 18000 end -if not ENABLE_SMALL_BIRDS then +if not ENABLE_SMALL then l_spawn_chance_bird = l_spawn_chance_bird - 18000 end +-- Mineclone check + +local mod_mcl = minetest.get_modpath("mcl_core") -- gulls + if ENABLE_GULLS then mobs:register_mob("mobs_birds:gull", { @@ -45,32 +53,24 @@ if ENABLE_GULLS then light_damage = 0, view_range = 14, animation = { - speed_normal = 24, speed_run = 24, - stand_start = 1, stand_end = 95, - walk_start = 1, walk_end = 95, - run_start = 1, run_end = 95 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 95, + walk_start = 1, walk_end = 95, + fly_start = 1, fly_end = 95, + run_start = 1, run_end = 95 }, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 5, 60, 0, true, nil) end }) - mobs:spawn({ - name = "mobs_birds:gull", - nodes = {"air"}, - neighbors = {"default:water_source", "default:water_flowing"}, - max_light = 5, - interval = 30, - chance = l_spawn_chance_gull, - min_height = 0, - max_height = 200 - }) - mobs:register_egg("mobs_birds:gull", "Gull", "default_cloud.png", 1) end -- large birds -if ENABLE_LARGE_BIRDS then + +if ENABLE_LARGE then mobs:register_mob("mobs_birds:bird_lg", { type = "animal", @@ -102,35 +102,23 @@ if ENABLE_LARGE_BIRDS then light_damage = 0, view_range = 12, animation = { - speed_normal = 24, speed_run = 24, - stand_start = 1, stand_end = 95, - walk_start = 1, walk_end = 95, - run_start = 1, run_end = 95 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 95, + walk_start = 1, walk_end = 95, + run_start = 1, run_end = 95 }, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 5, 60, 0, true, nil) end }) - mobs:spawn({ - name = "mobs_birds:bird_lg", - nodes = {"air"}, - neighbors = { - "default:leaves", "default:pine_needles", - "default:jungleleaves", "default:cactus" - }, - max_light = 5, - interval = 30, - chance = l_spawn_chance_bird, - min_height = 0, - max_height = 200 - }) - mobs:register_egg("mobs_birds:bird_lg", "Large bird", "default_cloud.png", 1) end -- small birds -if ENABLE_SMALL_BIRDS then + +if ENABLE_SMALL then mobs:register_mob("mobs_birds:bird_sm", { type = "animal", @@ -162,29 +150,73 @@ if ENABLE_SMALL_BIRDS then light_damage = 0, view_range = 10, animation = { - speed_normal = 24, speed_run = 24, - stand_start = 1, stand_end = 95, - walk_start = 1, walk_end = 95, - run_start = 1, run_end = 95 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 95, + walk_start = 1, walk_end = 95, + run_start = 1, run_end = 95 }, + on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 5, 60, 0, true, nil) end }) - mobs:spawn({ - name = "mobs_birds:bird_sm", - nodes = {"air"}, - neighbors = { - "default:leaves", "default:pine_needles", - "default:jungleleaves", "default:cactus" - }, - max_light = 5, - interval = 30, - chance = l_spawn_chance_bird, - min_height = 0, - max_height = 200 - }) - mobs:register_egg("mobs_birds:bird_sm", "Small bird", "default_cloud.png", 1) end + +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + if ENABLE_GULL then + + mobs:spawn({ + name = "mobs_birds:gull", + nodes = {"air"}, + neighbors = {"group:water"}, + max_light = 5, + interval = 30, + chance = l_spawn_chance_gull, + min_height = 0, + max_height = 200 + }) + end + + if ENABLE_SMALL then + + mobs:spawn({ + name = "mobs_birds:bird_sm", + nodes = {"air"}, + neighbors = { + "group:leaves" , (mod_mcl and "mcl_core:cactus" or "default:cactus") + }, + max_light = 5, + interval = 30, + chance = l_spawn_chance_bird, + min_height = 0, + max_height = 200 + }) + end + + if ENABLE_LARGE then + + mobs:spawn({ + name = "mobs_birds:bird_lg", + nodes = {"air"}, + neighbors = { + "group:leaves" , (mod_mcl and "mcl_core:cactus" or "default:cactus") + }, + max_light = 5, + interval = 30, + chance = l_spawn_chance_bird, + min_height = 0, + max_height = 200 + }) + end +end + +print("[MOD] Mobs Redo Birds loaded") diff --git a/mods/mobs_sky/mobs_birds/mod.conf b/mods/mobs_sky/mobs_birds/mod.conf index 06ae38ee..1ab0dca5 100644 --- a/mods/mobs_sky/mobs_birds/mod.conf +++ b/mods/mobs_sky/mobs_birds/mod.conf @@ -1,4 +1,4 @@ name = mobs_birds -depends = default, mobs -optional_depends = description = Adds birds into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_sky/mobs_birds/settingtypes.txt b/mods/mobs_sky/mobs_birds/settingtypes.txt new file mode 100755 index 00000000..20099db7 --- /dev/null +++ b/mods/mobs_sky/mobs_birds/settingtypes.txt @@ -0,0 +1,3 @@ +mobs_birds.enable_gulls (Enable Gulls) bool true +mobs_birds.enable_large_birds (Enable Large Birds) bool true +mobs_birds.enable_small_birds (Enable Small Birds) bool true diff --git a/mods/mobs_sky/mobs_birds/spawn_example.lua b/mods/mobs_sky/mobs_birds/spawn_example.lua new file mode 100644 index 00000000..45761fd7 --- /dev/null +++ b/mods/mobs_sky/mobs_birds/spawn_example.lua @@ -0,0 +1,54 @@ + +-- load settings + +local ENABLE_GULLS = minetest.settings:get_bool("mobs_birds.enable_gulls") ~= false +local ENABLE_LARGE = minetest.settings:get_bool("mobs_birds.enable_large_birds") ~= false +local ENABLE_SMALL = minetest.settings:get_bool("mobs_birds.enable_small_birds") ~= false + +-- Custom spawn examples + +if ENABLE_GULL then + + mobs:spawn({ + name = "mobs_birds:gull", + nodes = {"air"}, + neighbors = {"group:water"}, + max_light = 5, + interval = 30, + chance = 24000, + min_height = 0, + max_height = 200 + }) +end + +if ENABLE_SMALL then + + mobs:spawn({ + name = "mobs_birds:bird_sm", + nodes = {"air"}, + neighbors = { + "group:leaves" , (mod_mcl and "mcl_core:cactus" or "default:cactus") + }, + max_light = 5, + interval = 30, + chance = 18000, + min_height = 0, + max_height = 200 + }) +end + +if ENABLE_LARGE then + + mobs:spawn({ + name = "mobs_birds:bird_lg", + nodes = {"air"}, + neighbors = { + "group:leaves" , (mod_mcl and "mcl_core:cactus" or "default:cactus") + }, + max_light = 5, + interval = 30, + chance = 18000, + min_height = 0, + max_height = 200 + }) +end diff --git a/mods/mobs_sky/mobs_butterfly/depends.txt b/mods/mobs_sky/mobs_butterfly/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_sky/mobs_butterfly/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_sky/mobs_butterfly/init.lua b/mods/mobs_sky/mobs_butterfly/init.lua index 8b7458da..4fbfd496 100644 --- a/mods/mobs_sky/mobs_butterfly/init.lua +++ b/mods/mobs_sky/mobs_butterfly/init.lua @@ -1,18 +1,45 @@ --- local variables +-- mod check and settings + +local butterfly_mod = minetest.get_modpath("butterflies") + local l_skins = { {"bf1.png^bf2.png^bf3.png^bf4.png^bf5.png"}, - {"(bf1.png^[colorize:orange)^(bf2.png^[colorize:violet)^(bf3.png^[colorize:yellow)^(bf4.png^[colorize:cyan)^(bf5.png^[colorize:black)"}, - {"(bf1.png^[colorize:magenta)^(bf2.png^[colorize:green)^(bf3.png^[colorize:red)^(bf4.png^[colorize:blue)^(bf5.png^[colorize:white)"}, - {"(bf1.png^[colorize:yellow)^(bf2.png^[colorize:cyan)^(bf3.png^[colorize:green)^(bf4.png^[colorize:violet)^(bf5.png^[colorize:darkgray)"}, - {"(bf1.png^[colorize:pink)^(bf2.png^[colorize:white)^(bf3.png^[colorize:blue)^(bf4.png^[colorize:orange)^(bf5.png^[colorize:gray)"}, - {"(bf1.png^[colorize:darkgreen)^(bf2.png^[colorize:brown)^(bf3.png^[colorize:black)^(bf4.png^[colorize:darkgray)^(bf5.png^[colorize:red)"} + { "(bf1.png^[colorize:orange)" + .."^(bf2.png^[colorize:violet)^(bf3.png^[colorize:yellow)" + .."^(bf4.png^[colorize:cyan)^(bf5.png^[colorize:black)" + }, + { "(bf1.png^[colorize:magenta)" + .."^(bf2.png^[colorize:green)" + .."^(bf3.png^[colorize:red)" + .."^(bf4.png^[colorize:blue)" + .."^(bf5.png^[colorize:white)" + }, + { "(bf1.png^[colorize:yellow)" + .."^(bf2.png^[colorize:cyan)" + .."^(bf3.png^[colorize:green)" + .."^(bf4.png^[colorize:violet)" + .."^(bf5.png^[colorize:darkgray)" + }, + { "(bf1.png^[colorize:pink)" + .."^(bf2.png^[colorize:white)" + .."^(bf3.png^[colorize:blue)" + .."^(bf4.png^[colorize:orange)" + .."^(bf5.png^[colorize:gray)" + }, + { "(bf1.png^[colorize:darkgreen)" + .."^(bf2.png^[colorize:brown)" + .."^(bf3.png^[colorize:black)" + .."^(bf4.png^[colorize:darkgray)" + .."^(bf5.png^[colorize:red)" + } } local l_spawnnear = {"group:flower"} local l_spawnchance = 20000 --- Butterfly +-- Butterfly definition + mobs:register_mob("mobs_butterfly:butterfly", { type = "animal", passive = true, @@ -33,30 +60,44 @@ mobs:register_mob("mobs_butterfly:butterfly", { fall_damage = 0, view_range = 10, animation = { - speed_normal = 15, speed_run = 30, - stand_start = 0, stand_end = 90, - walk_start = 0, walk_end = 90 + speed_normal = 15, speed_run = 30, + stand_start = 0, stand_end = 90, + walk_start = 0, walk_end = 90, + fly_start = 0, fly_end = 90 }, + after_activate = function(self, staticdata, def, dtime) - if minetest.get_modpath("butterflies") then + if butterfly_mod then local pos = self.object:get_pos() local butter = {"white", "red", "violet"} - local replace = "butterflies:butterfly_" .. butter[math.random(1, #butter)] + local replace = "butterflies:butterfly_" .. butter[math.random(#butter)] minetest.set_node(pos, {name = replace}) self.object:remove() end + end, + + on_rightclick = function(self, clicker) + + if not butterfly_mod then + mobs:capture_mob(self, clicker, 10, 80, 0, true, nil) + end end --- on_rightclick = function(self, clicker) --- mobs:capture_mob(self, clicker, 10, 80, 0, true, nil) --- end - }) - --name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height --- mobs:spawn_specific("mobs_butterfly:butterfly", {"air"}, l_spawnnear, 5, 20, 30, l_spawnchance, 1, 0, 31000) +if not butterfly_mod then --- mobs:register_egg("mobs_butterfly:butterfly", "Butterfly", "default_cloud.png", 1) + -- spawn in world + + mobs:spawn_specific("mobs_butterfly:butterfly", {"air"}, + l_spawnnear, 5, 20, 30, l_spawnchance, 1, 0, 31000) + + -- spawn egg + + mobs:register_egg("mobs_butterfly:butterfly", "Butterfly", "default_cloud.png", 1) +end + +print("[MOD] Mobs Redo Butterfly loaded") diff --git a/mods/mobs_sky/mobs_butterfly/mod.conf b/mods/mobs_sky/mobs_butterfly/mod.conf index 03cfacc4..260a5d6f 100644 --- a/mods/mobs_sky/mobs_butterfly/mod.conf +++ b/mods/mobs_sky/mobs_butterfly/mod.conf @@ -1,4 +1,4 @@ name = mobs_butterfly -depends = default, mobs -optional_depends = description = Adds butterflies into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_sky/screenshot.png b/mods/mobs_sky/screenshot.png new file mode 100644 index 00000000..0869cc8a Binary files /dev/null and b/mods/mobs_sky/screenshot.png differ diff --git a/mods/mobs_water/mobs_crocs/License.txt b/mods/mobs_water/mobs_crocs/License.txt index 6025dea5..62257179 100644 --- a/mods/mobs_water/mobs_crocs/License.txt +++ b/mods/mobs_water/mobs_crocs/License.txt @@ -1,5 +1,5 @@ Licenses -Code: MIT +Code: MIT (code re-based) Model/Textures: GPL v3 Author: Team NPX diff --git a/mods/mobs_water/mobs_crocs/depends.txt b/mods/mobs_water/mobs_crocs/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_water/mobs_crocs/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_water/mobs_crocs/init.lua b/mods/mobs_water/mobs_crocs/init.lua index 14a993a9..7f5dd20a 100644 --- a/mods/mobs_water/mobs_crocs/init.lua +++ b/mods/mobs_water/mobs_crocs/init.lua @@ -1,194 +1,158 @@ --- local variables -local l_spawn_chance = 60000 - -- load settings -local ENABLE_WALKERS = minetest.settings:get_bool("mobs_crocs.enable_walkers", true) -local ENABLE_FLOATERS = minetest.settings:get_bool("mobs_crocs.enable_floaters", true) -local ENABLE_SWIMMERS = minetest.settings:get_bool("mobs_crocs.enable_swimmers", true) -if not ENABLE_WALKERS then - l_spawn_chance = l_spawn_chance - 20000 +local croc_walkers = minetest.settings:get_bool("mobs_crocs.enable_walkers", true) +local croc_floaters = minetest.settings:get_bool("mobs_crocs.enable_floaters", true) +local croc_swimmers = minetest.settings:get_bool("mobs_crocs.enable_swimmers", true) +local croc_spawn_chance = 60000 + +-- tweak croc spawn chance depending on which one's are enabled + +croc_spawn_chance = croc_spawn_chance - (croc_walkers and 0 or 20000) +croc_spawn_chance = croc_spawn_chance - (croc_floaters and 0 or 20000) +croc_spawn_chance = croc_spawn_chance - (croc_swimmers and 0 or 20000) + +-- Mineclone check + +local mod_mcl = minetest.get_modpath("mcl_core") + +-- crocodile definition + +local croc_def = { + type = "monster", + attack_type = "dogfight", + damage = 8, + reach = 3, + hp_min = 20, + hp_max = 25, + armor = 200, + collisionbox = {-0.85, -0.30, -0.85, 0.85, 1.5, 0.85}, + drawtype = "front", + visual = "mesh", + mesh = "crocodile.x", + textures = { + {"croco.png"}, + {"croco2.png"} + }, + visual_size = {x = 4, y = 4}, + sounds = { + random = "croco" + }, + fly = false, + floats = 0, + stepheight = 1, + view_range = 10, + water_damage = 0, + lava_damage = 10, + light_damage = 0, + animation = { + speed_normal = 24, speed_run = 24, + stand_start = 0, stand_end = 80, + walk_start = 81, walk_end = 170, + fly_start = 81, fly_end = 170, + run_start = 81, run_end = 170, + punch_start = 205, punch_end = 220 + }, + drops = { + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3}, + {name = (mod_mcl and "mcl_mobitems:leather" or "mobs:leather"), + chance = 1, min = 0, max = 2} + } +} + + +if croc_walkers then + + mobs:register_mob("mobs_crocs:crocodile", table.copy(croc_def)) + + mobs:register_egg("mobs_crocs:crocodile", "Crocodile (walk)", "default_grass.png", 1) end -if not ENABLE_FLOATERS then - l_spawn_chance = l_spawn_chance - 20000 + +if croc_floaters then + + croc_def.reach = 2 + croc_def.collisionbox = {-0.638, -0.23, -0.638, 0.638, 1.13, 0.638} + croc_def.visual_size = {x = 3, y = 3} + croc_def.floats = 1 + + mobs:register_mob("mobs_crocs:crocodile_float", table.copy(croc_def)) + + mobs:register_egg("mobs_crocs:crocodile_float", "Crocodile (float)", "default_grass.png", 1) end -if not ENABLE_SWIMMERS then - l_spawn_chance = l_spawn_chance - 20000 + +if croc_swimmers then + + croc_def.reach = 1 + croc_def.collisionbox = {-0.425, -0.15, -0.425, 0.425, 0.75, 0.425} + croc_def.visual_size = {x = 2, y = 2} + croc_def.fly = true + croc_def.fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source") + croc_def.fall_speed = -1 + croc_def.floats = 0 + + mobs:register_mob("mobs_crocs:crocodile_swim", table.copy(croc_def)) + + mobs:register_egg("mobs_crocs:crocodile_swim", "Crocodile (swim)", "default_grass.png", 1) end --- no float -if ENABLE_WALKERS then +-- Check for custom spawn.lua - mobs:register_mob("mobs_crocs:crocodile", { - type = "monster", - attack_type = "dogfight", - damage = 8, - reach = 3, - hp_min = 20, - hp_max = 25, - armor = 200, - collisionbox = {-0.85, -0.30, -0.85, 0.85, 1.5, 0.85}, - drawtype = "front", - visual = "mesh", - mesh = "crocodile.x", - textures = { - {"croco.png"}, - {"croco2.png"} - }, - visual_size = {x = 4, y = 4}, - sounds = {random = "croco"}, - fly = false, - floats = 0, - stepheight = 1, - view_range = 10, - water_damage = 0, - lava_damage = 10, - light_damage = 0, - animation = { - speed_normal = 24, speed_run = 24, - stand_start = 0, stand_end = 80, - walk_start = 81, walk_end = 170, - run_start = 81, run_end = 170, - punch_start = 205, punch_end = 220 - }, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - {name = "mobs:leather", chance = 1, min = 0, max = 2}, - }, - }) +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") - mobs:spawn({ - name = "mobs_crocs:crocodile", - nodes = { - "default:dirt_with_grass", "default:dirt", - "default:jungle_grass", "default:sand" - }, - neighbors = { - "default:water_flowing", "default:water_source", - "default:papyrus", "dryplants:juncus", "dryplants:reedmace" - }, - interval = 30, - chance = l_spawn_chance, - min_height = 0, - max_height = 10, - }) +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + if croc_walkers then - mobs:register_egg("mobs_crocs:crocodile", "Crocodile", "default_grass.png", 1) + mobs:spawn({ + name = "mobs_crocs:crocodile", + nodes = { + (mod_mcl and "group:shovely" or "group:crumbly") + }, + neighbors = { + "group:water", "dryplants:juncus", "dryplants:reedmace", + (mod_mcl and "mcl_core:reeds" or "default:papyrus") + }, + interval = 30, + chance = croc_spawn_chance, + min_height = 0, + max_height = 10 + }) + end + + if croc_floaters then + + mobs:spawn({ + name = "mobs_crocs:crocodile_float", + nodes = {"group:water"}, + neighbors = { + (mcl_core and "group:shovely" or "group:crumbly"), + "group:seaplants", "dryplants:juncus", "dryplants:reedmace", + (mod_mcl and "mcl_core:reeds" or "default:papyrus") + }, + interval = 30, + chance = croc_spawn_chance, + min_height = -3, + max_height = 10 + }) + end + + if croc_swimmers then + + mobs:spawn({ + name = "mobs_crocs:crocodile_swim", + nodes = {"group:water"}, + neighbors = {(mcl_core and "group:shovely" or "group:crumbly")}, + interval = 30, + chance = croc_spawn_chance, + min_height = -8, + max_height = 10 + }) + end end --- float -if ENABLE_FLOATERS then - - mobs:register_mob("mobs_crocs:crocodile_float", { - type = "monster", - attack_type = "dogfight", - damage = 8, - reach = 2, - hp_min = 20, - hp_max = 25, - armor = 200, - collisionbox = {-0.638, -0.23, -0.638, 0.638, 1.13, 0.638}, - drawtype = "front", - visual = "mesh", - mesh = "crocodile.x", - textures = { - {"croco.png"}, - {"croco2.png"} - }, - visual_size = {x = 3, y = 3}, - sounds = {random = "croco"}, - fly = false, - stepheight = 1, - view_range = 10, - water_damage = 0, - lava_damage = 10, - light_damage = 0, - animation = { - speed_normal = 24, speed_run = 24, - stand_start = 0, stand_end = 80, - walk_start = 81, walk_end = 170, - run_start = 81, run_end = 170, - punch_start = 205, punch_end = 220 - }, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - {name = "mobs:leather", chance = 1, min = 0, max = 2}, - }, - }) - - mobs:spawn({ - name = "mobs_crocs:crocodile_float", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = { - "default:dirt_with_grass", "default:jungle_grass", "default:sand", - "default:dirt", "default:papyrus", "group:seaplants", - "dryplants:juncus", "dryplants:reedmace" - }, - interval = 30, - chance = l_spawn_chance, - min_height = -3, - max_height = 10, - }) - - mobs:register_egg("mobs_crocs:crocodile_float", "Crocodile (floater)", - "default_grass.png", 1) -end - --- swim -if ENABLE_SWIMMERS then - - mobs:register_mob("mobs_crocs:crocodile_swim", { - type = "monster", - attack_type = "dogfight", - damage = 8, - reach = 1, - hp_min = 20, - hp_max = 25, - armor = 200, - collisionbox = {-0.425, -0.15, -0.425, 0.425, 0.75, 0.425}, - drawtype = "front", - visual = "mesh", - mesh = "crocodile.x", - textures = { - {"croco.png"}, - {"croco2.png"} - }, - visual_size = {x = 2, y = 2}, - sounds = {random = "croco"}, - fly = true, - fly_in = "default:water_source", - fall_speed = -1, - floats = 0, - view_range = 10, - water_damage = 0, - lava_damage = 10, - light_damage = 0, - animation = { - speed_normal = 24, speed_run = 24, - stand_start = 0, stand_end = 80, - walk_start = 81, walk_end = 170, - run_start = 81, run_end = 170, - punch_start = 205, punch_end = 220 - }, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - {name = "mobs:leather", chance = 1, min = 0, max = 2}, - }, - }) - - mobs:spawn({ - name = "mobs_crocs:crocodile_swim", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = {"default:sand","default:dirt","group:seaplants"}, - interval = 30, - chance = l_spawn_chance, - min_height = -8, - max_height = 10, - }) - - mobs:register_egg("mobs_crocs:crocodile_swim", "Crocodile (swimmer)", - "default_grass.png", 1) -end +print("[MOD] Mobs Redo Crocs loaded") diff --git a/mods/mobs_water/mobs_crocs/mod.conf b/mods/mobs_water/mobs_crocs/mod.conf index 7249ea62..0fa55874 100644 --- a/mods/mobs_water/mobs_crocs/mod.conf +++ b/mods/mobs_water/mobs_crocs/mod.conf @@ -1,4 +1,4 @@ name = mobs_crocs -depends = default, mobs -optional_depends = description = Adds crocodiles into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_water/mobs_crocs/spawn_example.lua b/mods/mobs_water/mobs_crocs/spawn_example.lua new file mode 100644 index 00000000..09fe4291 --- /dev/null +++ b/mods/mobs_water/mobs_crocs/spawn_example.lua @@ -0,0 +1,52 @@ + +-- load settings + +local croc_walkers = minetest.settings:get_bool("mobs_crocs.enable_walkers", true) +local croc_floaters = minetest.settings:get_bool("mobs_crocs.enable_floaters", true) +local croc_swimmers = minetest.settings:get_bool("mobs_crocs.enable_swimmers", true) + +-- spawn examples + +if croc_walkers then + + mobs:spawn({ + name = "mobs_crocs:crocodile", + nodes = {"group:crumbly"}, + neighbors = { + "group:water", "dryplants:juncus", "dryplants:reedmace", "default:papyrus" + }, + interval = 30, + chance = 20000, + min_height = 0, + max_height = 10 + }) +end + +if croc_floaters then + + mobs:spawn({ + name = "mobs_crocs:crocodile_float", + nodes = {"group:water"}, + neighbors = { + "group:crumbly", "group:seaplants", "dryplants:juncus", + "dryplants:reedmace", "default:papyrus" + }, + interval = 30, + chance = 20000, + min_height = -3, + max_height = 10 + }) +end + +if croc_swimmers then + + mobs:spawn({ + name = "mobs_crocs:crocodile_swim", + nodes = {"group:water"}, + neighbors = {"group:crumbly"}, + interval = 30, + chance = 20000, + min_height = -8, + max_height = 10 + }) +end diff --git a/mods/mobs_water/mobs_fish/depends.txt b/mods/mobs_water/mobs_fish/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_water/mobs_fish/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_water/mobs_fish/init.lua b/mods/mobs_water/mobs_fish/init.lua index 11643e97..ad1f2766 100644 --- a/mods/mobs_water/mobs_fish/init.lua +++ b/mods/mobs_water/mobs_fish/init.lua @@ -2,6 +2,7 @@ local SPRITE_VERSION = false -- set to true to use upright sprites instead of meshes -- local variables + local l_spawn_chance = 10000 local l_water_level = minetest.settings:get("water_level") - 1 local l_visual = "mesh" @@ -27,7 +28,11 @@ if SPRITE_VERSION then l_trop_textures = {{"animal_fish_blue_white_fish_blue_white_item.png"}} end +-- Mineclone check +local mod_mcl = minetest.get_modpath("mcl_core") + -- Clownfish + mobs:register_mob("mobs_fish:clownfish", { type = "animal", passive = true, @@ -43,7 +48,7 @@ mobs:register_mob("mobs_fish:clownfish", { makes_footstep_sound = false, stepheight = 0, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = 0, view_range = 8, water_damage = 0, @@ -51,19 +56,16 @@ mobs:register_mob("mobs_fish:clownfish", { lava_damage = 5, light_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 80, - walk_start = 81, - walk_end = 155, - run_start = 81, - run_end = 155 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 80, + walk_start = 81, walk_end = 155, + fly_start = 81, fly_end = 155, + run_start = 81, run_end = 155 }, on_rightclick = function(self, clicker) - mobs:capture_mob(self, clicker, 25, 80, 0, true, - "mobs_fish:clownfish") + + mobs:capture_mob(self, clicker, 25, 80, 0, true, "mobs_fish:clownfish") end, on_flop = function(self) @@ -79,29 +81,15 @@ mobs:register_mob("mobs_fish:clownfish", { self.object:set_velocity({x = 0, y = -10, z = 0}) return true - end, + end }) -mobs:spawn({ - name = "mobs_fish:clownfish", - nodes = { - "default:water_source", "default:water_flowing", - "default:river_water_source", "default:river_water_flowing" - }, - neighbors = { - "default:sand","default:dirt","group:seaplants","group:seacoral" - }, - min_light = 5, - interval = 30, - chance = l_spawn_chance, - max_height = l_water_level, - active_object_count = 5, -}) +-- spawn egg -mobs:register_egg("mobs_fish:clownfish", "Clownfish", - "animal_clownfish_clownfish_item.png", 0) +mobs:register_egg("mobs_fish:clownfish", "Clownfish", "animal_clownfish_clownfish_item.png", 0) -- Tropical fish + mobs:register_mob("mobs_fish:tropical", { type = "animal", passive = true, @@ -117,7 +105,7 @@ mobs:register_mob("mobs_fish:tropical", { makes_footstep_sound = false, stepheight = 0, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = 0, view_range = 8, water_damage = 0, @@ -125,19 +113,15 @@ mobs:register_mob("mobs_fish:tropical", { light_damage = 0, air_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 80, - walk_start = 81, - walk_end = 155, - run_start = 81, - run_end = 155 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 80, + walk_start = 81, walk_end = 155, + run_start = 81, run_end = 155 }, on_rightclick = function(self, clicker) - mobs:capture_mob(self, clicker, 25, 80, 0, true, - "mobs_fish:tropical") + + mobs:capture_mob(self, clicker, 25, 80, 0, true, "mobs_fish:tropical") end, on_flop = function(self) @@ -153,24 +137,67 @@ mobs:register_mob("mobs_fish:tropical", { self.object:set_velocity({x = 0, y = -10, z = 0}) return true - end, + end }) -mobs:spawn({ - name = "mobs_fish:tropical", - nodes = { - "default:water_source", "default:water_flowing", - "default:river_water_source", "default:river_water_flowing" - }, - neighbors = { - "default:sand","default:dirt","group:seaplants","group:seacoral" - }, - min_light = 5, - interval = 30, - chance = l_spawn_chance, - max_height = l_water_level, - active_object_count = 5, -}) +-- spawn egg mobs:register_egg("mobs_fish:tropical", "Tropical fish", - "animal_fish_blue_white_fish_blue_white_item.png", 0) + "animal_fish_blue_white_fish_blue_white_item.png", 0) + +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + -- clownfish + mobs:spawn({ + name = "mobs_fish:clownfish", + nodes = {"group:water"}, + neighbors = { + (mod_mcl and "group:shovely" or "group:crumbly"), + "group:seaplants", "group:seacoral" + }, + min_light = 5, + interval = 30, + chance = l_spawn_chance, + max_height = l_water_level, + active_object_count = 5 + }) + + -- tropical fish + mobs:spawn({ + name = "mobs_fish:tropical", + nodes = {"group:water"}, + neighbors = { + (mod_mcl and "group:shovely" or "group:crumbly"), + "group:seaplants", "group:seacoral" + }, + min_light = 5, + interval = 30, + chance = l_spawn_chance, + max_height = l_water_level, + active_object_count = 5 + }) +end + +-- helper function + +local function add_food_group(item) + + local def = minetest.registered_items[item] + local grp = table.copy(def.groups) + + grp.food_fish_raw = 1 + + minetest.override_item(item, {groups = grp}) +end + +add_food_group("mobs_fish:tropical") +add_food_group("mobs_fish:clownfish") + + +print("[MOD] Mobs Redo Fish loaded") diff --git a/mods/mobs_water/mobs_fish/mod.conf b/mods/mobs_water/mobs_fish/mod.conf index 1b3f6bfe..60b36c61 100644 --- a/mods/mobs_water/mobs_fish/mod.conf +++ b/mods/mobs_water/mobs_fish/mod.conf @@ -1,4 +1,4 @@ name = mobs_fish -depends = default, mobs -optional_depends = description = Adds fish into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_water/mobs_fish/spawn_example.lua b/mods/mobs_water/mobs_fish/spawn_example.lua new file mode 100644 index 00000000..7f0ee8f3 --- /dev/null +++ b/mods/mobs_water/mobs_fish/spawn_example.lua @@ -0,0 +1,24 @@ + +-- Fish spawn examples + +mobs:spawn({ + name = "mobs_fish:clownfish", + nodes = {"group:water"}, + neighbors = {"group:crumbly", "group:seaplants", "group:seacoral"}, + min_light = 5, + interval = 30, + chance = 10000, + max_height = -1, + active_object_count = 5 +}) + +mobs:spawn({ + name = "mobs_fish:tropical", + nodes = {"group:water"}, + neighbors = {"group:crumbly", "group:seaplants", "group:seacoral"}, + min_light = 5, + interval = 30, + chance = 10000, + max_height = -1, + active_object_count = 5 +}) diff --git a/mods/mobs_water/mobs_jellyfish/depends.txt b/mods/mobs_water/mobs_jellyfish/depends.txt deleted file mode 100644 index 09808860..00000000 --- a/mods/mobs_water/mobs_jellyfish/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default - -mobs diff --git a/mods/mobs_water/mobs_jellyfish/init.lua b/mods/mobs_water/mobs_jellyfish/init.lua index f1e56170..6aa85f70 100644 --- a/mods/mobs_water/mobs_jellyfish/init.lua +++ b/mods/mobs_water/mobs_jellyfish/init.lua @@ -1,10 +1,16 @@ +-- mineclone check + +local mod_mcl = minetest.get_modpath("mcl_core") + +-- jellyfish definition + mobs:register_mob("mobs_jellyfish:jellyfish", { - type = "animal", + type = "monster", attack_type = "dogfight", passive = false, damage = 5, - reach = 1, + reach = 1.1, hp_min = 5, hp_max = 10, armor = 100, @@ -18,7 +24,8 @@ mobs:register_mob("mobs_jellyfish:jellyfish", { walk_velocity = 0.1, run_velocity = 0.1, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), + stepheight = 0, fall_speed = 0, view_range = 10, water_damage = 0, @@ -26,19 +33,36 @@ mobs:register_mob("mobs_jellyfish:jellyfish", { light_damage = 0, on_rightclick = function(self, clicker) - mobs:capture_mob(self, clicker, 80, 100, 0, - true, "mobs_jellyfish:jellyfish") + mobs:capture_mob(self, clicker, 80, 100, 0, true, "mobs_jellyfish:jellyfish") end }) -mobs:spawn({ - name = "mobs_jellyfish:jellyfish", - nodes = {"default:water_source"}, - neighbors = {"default:water_flowing", "default:water_source"}, - min_light = 5, - interval = 30, - chance = 10000, - max_height = 0, -}) +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + mobs:spawn({ + name = "mobs_jellyfish:jellyfish", + nodes = {(mod_mcl and "mcl_core:water_source" or "default:water_source")}, + neighbors = {"group:water"}, + min_light = 5, + interval = 30, + chance = 10000, + max_height = 0 + }) +end + +-- spawn egg mobs:register_egg("mobs_jellyfish:jellyfish", "Jellyfish", "jellyfish_inv.png", 0) + +-- compatibility + +minetest.register_alias("mobs_jellyfish:jellyfish_set", "mobs_jellyfish:jellyfish") + + +print("[MOD] Mobs Redo Jellyfish loaded") diff --git a/mods/mobs_water/mobs_jellyfish/mod.conf b/mods/mobs_water/mobs_jellyfish/mod.conf index db48dc8c..98cfa759 100644 --- a/mods/mobs_water/mobs_jellyfish/mod.conf +++ b/mods/mobs_water/mobs_jellyfish/mod.conf @@ -1,4 +1,4 @@ name = mobs_jellyfish -depends = default, mobs -optional_depends = description = Adds jellyfish into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_water/mobs_jellyfish/spawn_example.lua b/mods/mobs_water/mobs_jellyfish/spawn_example.lua new file mode 100644 index 00000000..d58890a7 --- /dev/null +++ b/mods/mobs_water/mobs_jellyfish/spawn_example.lua @@ -0,0 +1,12 @@ + +-- Jellyfish spawn example + +mobs:spawn({ + name = "mobs_jellyfish:jellyfish", + nodes = {"default:water_source"}, + neighbors = {"group:water"}, + min_light = 5, + interval = 30, + chance = 10000, + max_height = 0 +}) diff --git a/mods/mobs_water/mobs_sharks/SETTINGS.txt b/mods/mobs_water/mobs_sharks/SETTINGS.txt deleted file mode 100644 index bf27b350..00000000 --- a/mods/mobs_water/mobs_sharks/SETTINGS.txt +++ /dev/null @@ -1,8 +0,0 @@ - --- SETTINGS - -ENABLE_SHARK_LARGE = true -ENABLE_SHARK_MEDIUM = true -ENABLE_SHARK_SMALL = true - -HELP_WITH_EXPERIMENT = false diff --git a/mods/mobs_water/mobs_sharks/depends.txt b/mods/mobs_water/mobs_sharks/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_water/mobs_sharks/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_water/mobs_sharks/init.lua b/mods/mobs_water/mobs_sharks/init.lua index 1f73efcd..b356f1e6 100644 --- a/mods/mobs_water/mobs_sharks/init.lua +++ b/mods/mobs_water/mobs_sharks/init.lua @@ -1,4 +1,6 @@ + -- local variables + local l_skins = { { "(shark_first.png^[colorize:#404040:150" -- dark grey @@ -17,27 +19,33 @@ local l_skins = { } } - local l_spawn_chance = 60000 -- load settings -dofile(minetest.get_modpath("mobs_sharks") .. "/SETTINGS.txt") -if not ENABLE_SHARK_LARGE then +local ENABLE_LARGE = minetest.settings:get_bool("mobs_sharks.enable_large") ~= false +local ENABLE_MEDIUM = minetest.settings:get_bool("mobs_sharks.enable_medium") ~= false +local ENABLE_SMALL = minetest.settings:get_bool("mobs_sharks.enable_small") ~= false + +if not ENABLE_LARGE then l_spawn_chance = l_spawn_chance - 20000 end -if not ENABLE_SHARK_MEDIUM then +if not ENABLE_MEDIUM then l_spawn_chance = l_spawn_chance - 20000 end -if not ENABLE_SHARK_SMALL then +if not ENABLE_SMALL then l_spawn_chance = l_spawn_chance - 20000 end +-- Mineclone check + +local mod_mcl = minetest.get_modpath("mcl_core") -- large -if ENABLE_SHARK_LARGE then + +if ENABLE_LARGE then mobs:register_mob("mobs_sharks:shark_lg", { type = "monster", @@ -55,7 +63,7 @@ if ENABLE_SHARK_LARGE then walk_velocity = 4, run_velocity = 6, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = 0, rotate = 270, view_range = 10, @@ -63,32 +71,18 @@ if ENABLE_SHARK_LARGE then lava_damage = 10, light_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 80, - walk_start = 80, - walk_end = 160, - run_start = 80, - run_end = 160 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 80, + walk_start = 80, walk_end = 160, + fly_start = 80, fly_end = 160, + run_start = 80, run_end = 160 }, jump = false, stepheight = 0, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - }, - }) - - mobs:spawn({ - name = "mobs_sharks:shark_lg", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = { - "default:water_flowing", "default:water_source", - "seawrecks:woodship", "seawrecks:uboot" - }, - interval = 30, - chance = l_spawn_chance, - max_height = 0, + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3} + } }) mobs:register_egg("mobs_sharks:shark_lg", "Shark (large)", @@ -96,7 +90,8 @@ if ENABLE_SHARK_LARGE then end -- medium -if ENABLE_SHARK_MEDIUM then + +if ENABLE_MEDIUM then mobs:register_mob("mobs_sharks:shark_md", { type = "monster", @@ -115,7 +110,7 @@ if ENABLE_SHARK_MEDIUM then walk_velocity = 2, run_velocity = 4, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = -1, rotate = 270, view_range = 10, @@ -123,32 +118,17 @@ if ENABLE_SHARK_MEDIUM then lava_damage = 10, light_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 80, - walk_start = 80, - walk_end = 160, - run_start = 80, - run_end = 160 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 80, + walk_start = 80, walk_end = 160, + run_start = 80, run_end = 160 }, jump = false, stepheight = 0, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - }, - }) - - mobs:spawn({ - name = "mobs_sharks:shark_md", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = { - "default:water_flowing", "default:water_source", - "seawrecks:woodship", "seawrecks:uboot" - }, - interval = 30, - chance = l_spawn_chance, - max_height = 0, + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3} + } }) mobs:register_egg("mobs_sharks:shark_md", "Shark (medium)", @@ -156,7 +136,8 @@ if ENABLE_SHARK_MEDIUM then end -- small -if ENABLE_SHARK_SMALL then + +if ENABLE_SMALL then mobs:register_mob("mobs_sharks:shark_sm", { type = "monster", @@ -175,7 +156,7 @@ if ENABLE_SHARK_SMALL then walk_velocity = 2, run_velocity = 4, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = -1, rotate = 270, view_range = 10, @@ -183,34 +164,66 @@ if ENABLE_SHARK_SMALL then lava_damage = 10, light_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 80, - walk_start = 80, - walk_end = 160, - run_start = 80, - run_end = 160 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 80, + walk_start = 80, walk_end = 160, + run_start = 80, run_end = 160 }, jump = false, stepheight = 0, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, - }, - }) - - mobs:spawn({ - name = "mobs_sharks:shark_sm", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = { - "default:water_flowing", "default:water_source", - "seawrecks:woodship", "seawrecks:uboot" - }, - interval = 30, - chance = l_spawn_chance, - max_height = 0, + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3} + } }) mobs:register_egg("mobs_sharks:shark_sm", "Shark (small)", "mob_shark_shark_item.png", 0) end + +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + if ENABLE_SMALL then + + mobs:spawn({ + name = "mobs_sharks:shark_sm", + nodes = {"mcl_core:water_source", "default:water_source"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = l_spawn_chance, + max_height = -1 + }) + end + + if ENABLE_MEDIUM then + + mobs:spawn({ + name = "mobs_sharks:shark_md", + nodes = {"mcl_core:water_source", "default:water_source"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = l_spawn_chance, + max_height = -1 + }) + end + + if ENABLE_LARGE then + + mobs:spawn({ + name = "mobs_sharks:shark_lg", + nodes = {"mcl_core:water_source", "default:water_source"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = l_spawn_chance, + max_height = -1 + }) + end +end + +print("[MOD] Mobs Redo Sharks loaded") diff --git a/mods/mobs_water/mobs_sharks/mod.conf b/mods/mobs_water/mobs_sharks/mod.conf index 138e6078..e32a8c10 100644 --- a/mods/mobs_water/mobs_sharks/mod.conf +++ b/mods/mobs_water/mobs_sharks/mod.conf @@ -1,4 +1,4 @@ name = mobs_sharks -depends = default, mobs -optional_depends = description = Adds sharks into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_water/mobs_sharks/settingtypes.txt b/mods/mobs_water/mobs_sharks/settingtypes.txt new file mode 100755 index 00000000..68380541 --- /dev/null +++ b/mods/mobs_water/mobs_sharks/settingtypes.txt @@ -0,0 +1,3 @@ +mobs_sharks.enable_large (Enable Large Sharks) bool true +mobs_sharks.enable_medium (Enable Medium Sharks) bool true +mobs_sharks.enable_small (Enable Small Sharks) bool true diff --git a/mods/mobs_water/mobs_sharks/spawn_example.lua b/mods/mobs_water/mobs_sharks/spawn_example.lua new file mode 100644 index 00000000..b76d35f5 --- /dev/null +++ b/mods/mobs_water/mobs_sharks/spawn_example.lua @@ -0,0 +1,44 @@ + +-- load settings + +local ENABLE_LARGE = minetest.settings:get_bool("mobs_sharks.enable_large") ~= false +local ENABLE_MEDIUM = minetest.settings:get_bool("mobs_sharks.enable_medium") ~= false +local ENABLE_SMALL = minetest.settings:get_bool("mobs_sharks.enable_small") ~= false + +-- Shark spawn examples + +if ENABLE_SMALL then + + mobs:spawn({ + name = "mobs_sharks:shark_sm", + nodes = {"group:water"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = 20000, + max_height = 0 + }) +end + +if ENABLE_MEDIUM then + + mobs:spawn({ + name = "mobs_sharks:shark_md", + nodes = {"group:water"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = 20000, + max_height = 0 + }) +end + +if ENABLE_LARGE then + + mobs:spawn({ + name = "mobs_sharks:shark_lg", + nodes = {"group:water"}, + neighbors = {"group:water", "seawrecks:woodship", "seawrecks:uboot"}, + interval = 30, + chance = 20000, + max_height = 0 + }) +end diff --git a/mods/mobs_water/mobs_turtles/License.txt b/mods/mobs_water/mobs_turtles/License.txt index 066c04dc..37a535f2 100644 --- a/mods/mobs_water/mobs_turtles/License.txt +++ b/mods/mobs_water/mobs_turtles/License.txt @@ -1,5 +1,6 @@ Licenses Code: MIT -Model/textures: unknown +Model/Textures: CC-BY-SA 3.0 + http://creativecommons.org/licenses/by-sa/3.0/de/legalcode Author: AspireMint diff --git a/mods/mobs_water/mobs_turtles/depends.txt b/mods/mobs_water/mobs_turtles/depends.txt deleted file mode 100644 index cc033980..00000000 --- a/mods/mobs_water/mobs_turtles/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mobs diff --git a/mods/mobs_water/mobs_turtles/init.lua b/mods/mobs_water/mobs_turtles/init.lua index 57409396..d9f3dbcd 100644 --- a/mods/mobs_water/mobs_turtles/init.lua +++ b/mods/mobs_water/mobs_turtles/init.lua @@ -1,4 +1,6 @@ +-- settings + local l_skins = { {"turtle1.png^turtle2.png^turtle3.png^turtle4.png" .. "^turtle5.png^turtle6.png^turtle7.png"}, @@ -11,7 +13,12 @@ local l_skins = { local l_spawn_chance = 30000 +-- Mineclone check + +local mod_mcl = minetest.get_modpath("mcl_core") + -- land turtle + mobs:register_mob("mobs_turtles:turtle", { type = "animal", passive = true, @@ -35,70 +42,50 @@ mobs:register_mob("mobs_turtles:turtle", { light_damage = 0, fall_damage = 1, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 50, - walk_start = 60, - walk_end = 90, - run_start = 60, - run_end = 90, - hide_start = 95, - hide_end = 100 + speed_normal = 24, speed_run = 24, + stand_start = 1,stand_end = 50, + walk_start = 60, walk_end = 90, + run_start = 60, run_end = 90, + hide_start = 95, hide_end = 100 }, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3} }, - follow = "farming:carrot", + follow = (mod_mcl and "mcl_farming:carrot_item" or "farming:carrot"), on_rightclick = function(self, clicker) - self.state = "hide" -- was "" + if mobs:feed_tame(self, clicker, 5, false, true) then return end + if mobs:capture_mob(self, clicker, nil, 80, 100, true, nil) then return end - mobs:set_velocity(self, 0) + self.state = "hide" - self.object:set_animation( - {x = self.animation.hide_start, y = self.animation.hide_end}, - self.animation.speed_normal, 0) + self:set_velocity(0) + self:set_animation("hide") minetest.after(5, function() + if self and self.object then self.state = "stand" end end) - - mobs:capture_mob(self, clicker, 0, 80, 100, true, nil) end, do_custom = function(self, dtime) - if self.state == "hide" then - mobs:set_velocity(self, 0) + if self and self.state == "hide" then + self:set_velocity(0) end end }) -mobs:spawn({ - name = "mobs_turtles:turtle", - nodes = { - "default:dirt_with_grass", "default:jungle_grass", - "default:sand", "default:desert_sand" - }, - neighbors = { - "default:dirt_with_grass", "default:jungle_grass", "default:sand", - "default:desert_sand", "default:papyrus", "default:cactus", - "dryplants:juncus", "dryplants:reedmace" - }, - min_light = 5, - interval = 30, - chance = l_spawn_chance, - min_height = 1, - max_height = 10, -}) +-- spawn egg mobs:register_egg("mobs_turtles:turtle", "Turtle", "default_grass.png", 1) -- sea turtle + mobs:register_mob("mobs_turtles:seaturtle", { type = "animal", passive = true, @@ -118,7 +105,7 @@ mobs:register_mob("mobs_turtles:seaturtle", { stepheight = 1, jump = false, fly = true, - fly_in = "default:water_source", + fly_in = (mod_mcl and "mcl_core:water_source" or "default:water_source"), fall_speed = 0, floats = 1, water_damage = 0, @@ -126,36 +113,62 @@ mobs:register_mob("mobs_turtles:seaturtle", { light_damage = 0, fall_damage = 0, animation = { - speed_normal = 24, - speed_run = 24, - stand_start = 1, - stand_end = 50, - walk_start = 60, - walk_end = 90, - run_start = 60, - run_end = 90, - hide_start = 95, - hide_end = 100 + speed_normal = 24, speed_run = 24, + stand_start = 1, stand_end = 50, + walk_start = 60, walk_end = 90, + run_start = 60, run_end = 90, + hide_start = 95, hide_end = 100 }, drops = { - {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, + {name = (mod_mcl and "mcl_mobitems:beef" or "mobs:meat_raw"), + chance = 1, min = 1, max = 3} }, on_rightclick = function(self, clicker) mobs:capture_mob(self, clicker, 0, 0, 80, true, nil) end }) -mobs:spawn({ - name = "mobs_turtles:seaturtle", - nodes = {"default:water_flowing","default:water_source"}, - neighbors = { - "default:water_flowing", "default:water_source", "group:seaplants", - "seawrecks:woodship", "seawrecks:uboot" - }, - min_light = 5, - interval = 30, - chance = l_spawn_chance, - max_height = 0, -}) +-- spawn egg mobs:register_egg("mobs_turtles:seaturtle", "Sea Turtle", "default_water.png", 1) + +-- Check for custom spawn.lua + +local MP = minetest.get_modpath(minetest.get_current_modname()) .. "/" +local input = io.open(MP .. "spawn.lua", "r") + +if input then + input:close() ; input = nil ; dofile(MP .. "spawn.lua") +else + -- land turtle + mobs:spawn({ + name = "mobs_turtles:turtle", + nodes = {(mod_mcl and "group:shovely" or "group:crumbly")}, + neighbors = { + (mod_mcl and "groups:shovely" or "group:crumbly"), + (mod_mcl and "mcl_core:reeds" or "default:papyrus"), + (mod_mcl and "mcl_core:cactus" or "default:cactus"), + "dryplants:juncus", "dryplants:reedmace" + }, + min_light = 5, + interval = 30, + chance = l_spawn_chance, + min_height = 1, + max_height = 10 + }) + + -- sea turtle + mobs:spawn({ + name = "mobs_turtles:seaturtle", + nodes = {"group:water"}, + neighbors = { + "group:water", "group:seaplants", "seawrecks:woodship", "seawrecks:uboot" + }, + min_light = 5, + interval = 30, + chance = l_spawn_chance, + max_height = 0 + }) +end + +print("[MOD] Mobs Redo Turtles loaded") diff --git a/mods/mobs_water/mobs_turtles/mod.conf b/mods/mobs_water/mobs_turtles/mod.conf index e6d3883e..8c2cdf66 100644 --- a/mods/mobs_water/mobs_turtles/mod.conf +++ b/mods/mobs_water/mobs_turtles/mod.conf @@ -1,4 +1,4 @@ name = mobs_turtles -depends = default, mobs -optional_depends = description = Adds turtles into your world. +depends = mobs +min_minetest_version = 5.0 diff --git a/mods/mobs_water/mobs_turtles/spawn_example.lua b/mods/mobs_water/mobs_turtles/spawn_example.lua new file mode 100644 index 00000000..eefe4fda --- /dev/null +++ b/mods/mobs_water/mobs_turtles/spawn_example.lua @@ -0,0 +1,30 @@ + +-- Turtle spawn examples + +-- land turtle +mobs:spawn({ + name = "mobs_turtles:turtle", + nodes = {"group:crumbly"}, + neighbors = { + "group:crumbly", "default:papyrus", "default:cactus", + "dryplants:juncus", "dryplants:reedmace" + }, + min_light = 5, + interval = 30, + chance = 30000, + min_height = 1, + max_height = 10 +}) + +-- sea turtle +mobs:spawn({ + name = "mobs_turtles:seaturtle", + nodes = {"group:water"}, + neighbors = { + "group:water", "group:seaplants", "seawrecks:woodship", "seawrecks:uboot" + }, + min_light = 5, + interval = 30, + chance = 30000, + max_height = 0 +}) diff --git a/mods/mobs_water/screenshot.png b/mods/mobs_water/screenshot.png new file mode 100644 index 00000000..986f0665 Binary files /dev/null and b/mods/mobs_water/screenshot.png differ diff --git a/mods/more_chests/models/shared.lua b/mods/more_chests/models/shared.lua index 03825bfc..b0ff727d 100644 --- a/mods/more_chests/models/shared.lua +++ b/mods/more_chests/models/shared.lua @@ -25,7 +25,7 @@ local function check_privs(meta, player) local shared = " " .. meta:get_string("shared") .. " " if name == meta:get_string("owner") then return true - elseif shared:find(" " .. name .. " ") then + elseif shared:find(" " .. name .. " ", 1, true) then return true else return false diff --git a/mods/more_chests/models/wifi.lua b/mods/more_chests/models/wifi.lua index 506bac94..9851ba62 100644 --- a/mods/more_chests/models/wifi.lua +++ b/mods/more_chests/models/wifi.lua @@ -87,3 +87,20 @@ minetest.register_on_joinplayer(function(player) local inv = player:get_inventory() inv:set_size("more_chests:wifi", 8*4) end) + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if (inventory_info.to_list == "more_chests:wifi" or inventory_info.from_list == "more_chests:wifi") + and not minetest.is_creative_enabled(player:get_player_name()) then + local pos = player:get_pos() + pos.y = pos.y + player:get_properties().eye_height + + local def = player:get_wielded_item():get_definition() + local range = def and def.range or 4 + -- Additional tolerance to reach the node corner diagonally + -- Also allows minor eye offsets to be used + local chest = minetest.find_node_near(pos, range + 1, "more_chests:wifi") + if not chest then + return 0 + end + end +end) diff --git a/mods/more_chests/utils/base.lua b/mods/more_chests/utils/base.lua index d6858aa1..92bd4bb7 100644 --- a/mods/more_chests/utils/base.lua +++ b/mods/more_chests/utils/base.lua @@ -33,6 +33,7 @@ function generate_chest_def(def) choppy=2, oddly_breakable_by_hand=2 }, + is_ground_content = false, sounds = def.sounds or default.node_sound_wood_defaults(), after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) diff --git a/mods/moreblocks/circular_saw.lua b/mods/moreblocks/circular_saw.lua index 4c5da34c..02f58bd0 100644 --- a/mods/moreblocks/circular_saw.lua +++ b/mods/moreblocks/circular_saw.lua @@ -447,6 +447,7 @@ minetest.register_node("moreblocks:circular_saw", { sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy = 2,oddly_breakable_by_hand = 2}, + is_ground_content = false, sounds = moreblocks.node_sound_wood_defaults(), on_construct = circular_saw.on_construct, can_dig = circular_saw.can_dig, diff --git a/mods/moreblocks/locale/moreblocks.pt_BR.tr b/mods/moreblocks/locale/moreblocks.pt_BR.tr new file mode 100644 index 00000000..770c818c --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.pt_BR.tr @@ -0,0 +1,94 @@ +# textdomain: moreblocks + +# Portuguese_Brazil translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# Jose Anastacio 2020. + +#: circular_saw.lua + +Circular Saw=Serra Circular +Input material=Material de entrada +Left-over=Sobra +Max=Máximo +Recycle output=Saida reciclagem +Set=Defina +owned by @1=propriedade de @1 +Circular Saw is empty=Serra Circular está vazia +Circular Saw is working on @1=Serra Circular está trabalhando em @1 + +#: nodes.lua + +Deprecated=Descontinuado +All-faces Acacia Tree=Árvore de Acácia multifacetada +All-faces Aspen Tree=Árvore Aspen multifacetada +All-faces Jungle Tree=Árvore da Selva multifacetada +All-faces Pine Tree=Pinheiro multifacetado +All-faces Tree=Tronco de árvore +Cactus Brick=Tijolos de Cacto +Cactus Checker=Xadrez de Cacto +Centered Wooden Tile=Tijolos Centrado de Madeira +Checker Stone Tile=Xadrez Centrado de Pedra +Circle Stone Bricks=Tijolos de Pedra Cricular +Clean Glass=Vidro Limpo +Coal Checker=Xadrez de Carvão +Coal Glass=Vidro com Carvao +Clean Super Glow Glass=Cristal Limpo Super brilhante +Trap Clean Super Glow Glass=Vidro Limpo Super brilhante +Trap Clean Glass=Cristal Falso Limpo +Clean Glow Glass=Cristal Brillante Limpo +Trap Clean Glow Glass=Cristal Brillante Limpo Falso +Coal Stone=Pedra de carvão +Coal Stone Bricks=Tijolos de Carvão +Compressed Cobblestone=Pedregulho Comprimido +Compressed Desert Cobblestone=Pedregulho do Deserto Comprimido +Compressed Dirt=Terra Comprimida +Copper Patina Block=Bloco pátina de cobre +Empty Shelf=Prateleira Vazia +Full Wooden Tile=Xadrez de Madeira completo +Glow Glass=Vidro brilhante +Iron Checker=Xadrez de Ferro +Iron Glass=Cristal com ferro +Iron Stone=Ferro e Pedra +Iron Stone Bricks=Tijolos de Ferro +Plankstone=Prancha de Pedra +Rope=Corda +Split Stone Tile=Xadrez de Pedra Dividido +Stone Bricks=Tijolos de Pedra +Stone Tile=Xadrez de Pedra +Super Glow Glass=Cristal Súper Brillante +Sweeper=Limpiador +Tar=Alquitrán +Trap Desert Stone=Pedra del Desierto Falsa +Trap Glass=Cristal Falso +Trap Glow Glass=Cristal Brillante Falso +Trap Obsidian=Obsidiana Falsa +Trap Obsidian Glass=Vidrio de Obsidiana Falso +Trap Sandstone=Arenisca Falsa +Trap Stone=Piedra Falsa +Trap Super Glow Glass=Cristal Súper Brillante Falso +Wooden Tile=Xadrez de Madeira +Offset Wooden Tile=Xadrez de Madeira compensada +Downwards Wooden Tile=Xadrez de Madeira para baixo +Leftwards Wooden Tile=Xadrez de Madeira para a esquerda +Rightwards Wooden Tile=Xadrez de Madeira para a direita + + +#: ownership.lua + +Sorry, @1 owns that spot.=Desculpe, @1 é o dono desse lugar. +someone=alguem + +#: stairsplus/common.lua + +@1 Microblock=Microbloco de @1 +@1 Slab=Laje de @1 +@1 Slope=Declive de @1 +@1 Painel=Panel de @1 +@1 Stairs=Escadas de @1 + +#: stairsplus/registrations.lua + +Concrete=Concreto +Cement=Cimento +Brass Block=Bloco de latão diff --git a/mods/moreblocks/nodes.lua b/mods/moreblocks/nodes.lua index a13d36a5..e41318bc 100644 --- a/mods/moreblocks/nodes.lua +++ b/mods/moreblocks/nodes.lua @@ -41,7 +41,6 @@ local nodes = { ["wood_tile"] = { description = S("Wooden Tile"), groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - is_ground_content = false, paramtype2 = "facedir", place_param2 = 0, tiles = {"default_wood.png^moreblocks_wood_tile.png", @@ -66,14 +65,12 @@ local nodes = { ["wood_tile_center"] = { description = S("Centered Wooden Tile"), groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - is_ground_content = false, tiles = {"default_wood.png^moreblocks_wood_tile_center.png"}, sounds = sound_wood, }, ["wood_tile_full"] = { description = S("Full Wooden Tile"), groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - is_ground_content = false, tiles = tile_tiles("wood_tile_full"), sounds = sound_wood, }, @@ -82,7 +79,6 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - is_ground_content = false, tiles = {"default_wood.png^moreblocks_wood_tile_offset.png"}, sounds = sound_wood, no_stairs = true, @@ -108,7 +104,6 @@ local nodes = { ["circle_stone_bricks"] = { description = S("Circle Stone Bricks"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["grey_bricks"] = { @@ -116,7 +111,6 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["coal_stone_bricks"] = { @@ -124,7 +118,6 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["iron_stone_bricks"] = { @@ -132,13 +125,11 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["stone_tile"] = { description = S("Stone Tile"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["split_stone_tile"] = { @@ -148,37 +139,31 @@ local nodes = { tiles = {"moreblocks_split_stone_tile_top.png", "moreblocks_split_stone_tile.png"}, groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["checker_stone_tile"] = { description = S("Checker Stone Tile"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["tar"] = { description = S("Tar"), groups = {cracky=2, tar_block=1}, - is_ground_content = false, sounds = sound_stone, }, ["dirt_compressed"] = { description = S("Compressed Dirt"), - groups = {crumbly=2}, - is_ground_content = false, + groups = {crumbly=2, compressed = 1}, sounds = sound_dirt, }, ["cobble_compressed"] = { description = S("Compressed Cobblestone"), - groups = {cracky = 1}, - is_ground_content = false, + groups = {cracky = 1, compressed = 1}, sounds = sound_stone, }, ["desert_cobble_compressed"] = { description = S("Compressed Desert Cobblestone"), - groups = {cracky = 1}, - is_ground_content = false, + groups = {cracky = 1, compressed = 1}, sounds = sound_stone, }, ["plankstone"] = { @@ -186,7 +171,6 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {cracky = 3}, - is_ground_content = false, tiles = tile_tiles("plankstone"), sounds = sound_stone, }, @@ -197,7 +181,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, }, @@ -208,7 +191,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, }, @@ -219,7 +201,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, }, @@ -228,13 +209,11 @@ local nodes = { paramtype2 = "facedir", place_param2 = 0, groups = {cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["cactus_checker"] = { description = S("Cactus Checker"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, tiles = {"default_stone.png^moreblocks_cactus_checker.png", "default_stone.png^moreblocks_cactus_checker.png", "default_stone.png^moreblocks_cactus_checker.png", @@ -249,7 +228,6 @@ local nodes = { tiles = {"default_wood.png", "default_wood.png", "default_wood.png", "default_wood.png", "moreblocks_empty_shelf.png", "moreblocks_empty_shelf.png"}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, - is_ground_content = false, sounds = sound_wood, furnace_burntime = 15, no_stairs = true, @@ -257,13 +235,11 @@ local nodes = { ["coal_stone"] = { description = S("Coal Stone"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["iron_stone"] = { description = S("Iron Stone"), groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["coal_checker"] = { @@ -275,7 +251,6 @@ local nodes = { "default_stone.png^moreblocks_coal_checker.png^[transformR90", "default_stone.png^moreblocks_coal_checker.png^[transformR90"}, groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["iron_checker"] = { @@ -287,7 +262,6 @@ local nodes = { "default_stone.png^moreblocks_iron_checker.png^[transformR90", "default_stone.png^moreblocks_iron_checker.png^[transformR90"}, groups = {stone = 1, cracky = 3}, - is_ground_content = false, sounds = sound_stone, }, ["trap_stone"] = { @@ -297,7 +271,6 @@ local nodes = { walkable = false, groups = {cracky = 3}, paramtype = "light", - is_ground_content = false, sounds = sound_stone, no_stairs = true, }, @@ -308,7 +281,6 @@ local nodes = { walkable = false, groups = {cracky = 3}, paramtype = "light", - is_ground_content = false, sounds = sound_stone, no_stairs = true, }, @@ -319,7 +291,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -332,7 +303,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -345,7 +315,6 @@ local nodes = { walkable = false, groups = {cracky = 1, level = 2}, paramtype = "light", - is_ground_content = false, sounds = sound_stone, no_stairs = true, }, @@ -356,7 +325,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -369,7 +337,6 @@ local nodes = { walkable = false, groups = {crumbly = 1, cracky = 3}, paramtype = "light", - is_ground_content = false, sounds = sound_stone, no_stairs = true, }, @@ -415,7 +382,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = 11, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -427,7 +393,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = 11, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -439,7 +404,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = 11, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -453,7 +417,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = 11, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -467,7 +430,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = default.LIGHT_MAX, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -479,7 +441,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = default.LIGHT_MAX, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = sound_glass, @@ -491,7 +452,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = default.LIGHT_MAX, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -505,7 +465,6 @@ local nodes = { use_texture_alpha = "clip", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, light_source = default.LIGHT_MAX, walkable = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -519,7 +478,6 @@ local nodes = { wield_image = "moreblocks_rope.png", paramtype = "light", sunlight_propagates = true, - is_ground_content = false, paramtype2 = "wallmounted", walkable = false, climbable = true, @@ -531,12 +489,12 @@ local nodes = { ["copperpatina"] = { description = S("Copper Patina Block"), groups = {cracky = 1, level = 2}, - is_ground_content = false, sounds = sound_metal, }, } for name, def in pairs(nodes) do + def.is_ground_content = def.is_ground_content == true def.tiles = def.tiles or {"moreblocks_" ..name.. ".png"} minetest.register_node("moreblocks:" ..name, def) minetest.register_alias(name, "moreblocks:" ..name) diff --git a/mods/moreblocks/stairsplus/common.lua b/mods/moreblocks/stairsplus/common.lua index 6d09ab50..26d40318 100644 --- a/mods/moreblocks/stairsplus/common.lua +++ b/mods/moreblocks/stairsplus/common.lua @@ -133,6 +133,7 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam def[k] = v end + def.is_ground_content = def.is_ground_content == true def.drawtype = "nodebox" def.paramtype = "light" def.paramtype2 = def.paramtype2 or "facedir" @@ -172,7 +173,7 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam end end - if fields.drop and not (type(fields.drop) == "table") then + if fields.drop and (type(fields.drop) ~= "table") then def.drop = modname.. ":" .. category .. "_" .. fields.drop .. alternate end diff --git a/mods/morelights/morelights_extras/init.lua b/mods/morelights/morelights_extras/init.lua index 6703ca83..741d1a2c 100644 --- a/mods/morelights/morelights_extras/init.lua +++ b/mods/morelights/morelights_extras/init.lua @@ -177,9 +177,12 @@ minetest.register_node("morelights_extras:stairlight", { end end - if node.param2 < 4 - and (node.name:match("^stairs:stair_") - or node.name:match("^mcl_stairs:stair_")) then + if node.param2 < 4 and ( + node.name:match("^stairs:stair_") + or node.name:match("^mcl_stairs:stair_") + or node.name:match("^hades_stairs:stair_") + or minetest.get_item_group(node.name, "morelights_supports_stairlight") ~= 0 + ) then -- Set `above` to the node actually above the stair, since that's -- where the node is placed. pointed_thing.above = diff --git a/mods/moreores/.luacheckrc b/mods/moreores/.luacheckrc index 16e73503..fe0b58eb 100644 --- a/mods/moreores/.luacheckrc +++ b/mods/moreores/.luacheckrc @@ -30,4 +30,5 @@ read_globals = { "frame", "mg", "toolranks", + "mcl_sounds" } diff --git a/mods/moreores/.travis.yml b/mods/moreores/.travis.yml deleted file mode 100644 index 32a776a0..00000000 --- a/mods/moreores/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -dist: bionic -language: python - -python: - - 3.7.1 - -install: - - sudo apt-get update -qq - - sudo apt-get install -qqq luarocks - - pip3 install pre-commit - - luarocks install --local luacheck - -script: - # All linters are run with pre-commit hooks - - export PATH="$HOME/.luarocks/bin:$PATH" - - pre-commit run --all-files diff --git a/mods/moreores/CHANGELOG.md b/mods/moreores/CHANGELOG.md index 40316ab4..24ef3ad8 100644 --- a/mods/moreores/CHANGELOG.md +++ b/mods/moreores/CHANGELOG.md @@ -21,6 +21,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. single node in one chunk. - The same overall ore density is retained in the deep layer. +- Switch to GitHub Actions. + - Benefits include faster responses, easier management, and more. + ## [2.1.0] - 2021-06-28 ### Added diff --git a/mods/moreores/_config.txt b/mods/moreores/_config.txt index 0db26c84..46ca0796 100644 --- a/mods/moreores/_config.txt +++ b/mods/moreores/_config.txt @@ -54,27 +54,47 @@ moreores.mithril_clust_size_high = 3 moreores.mithril_clust_size = 3 moreores.mithril_clust_size_deep = 3 --- Maximal and minimal depths of ore generation (Y coordinate, 0 being sea level by default) --- Tin -moreores.tin_max_depth_high = 31000 -moreores.tin_min_depth_high = 1025 -moreores.tin_max_depth = -64 -- For v6 mapgen, -32 fits better -moreores.tin_min_depth = -127 -moreores.tin_max_depth_deep = -128 -moreores.tin_min_depth_deep = -31000 --- Silver -moreores.silver_max_depth_high = 31000 -moreores.silver_min_depth_high = 1025 -moreores.silver_max_depth = -64 -- For v6 mapgen, -32 fits better -moreores.silver_min_depth = -127 -- For v6 mapgen, -63 fits better -moreores.silver_max_depth_deep = -128 -- For v6 mapgen, -64 fits better -moreores.silver_min_depth_deep = -31000 +if minetest.get_modpath("mcl_core") then + -- Example adjustments for MineClone2 + moreores.tin_max_depth_high = 0 + moreores.tin_min_depth_high = -10 + moreores.tin_max_depth = -11 + moreores.tin_min_depth = -57 --- Mithril -moreores.mithril_max_depth_high = 31000 -moreores.mithril_min_depth_high = 2049 -moreores.mithril_max_depth = -2048 -- For v6 mapgen, -256 fits better -moreores.mithril_min_depth = -4095 -- For v6 mapgen, -511 fits better -moreores.mithril_max_depth_deep = -4096 -- For v6 mapgen, -512 fits better -moreores.mithril_min_depth_deep = -31000 + -- Similar adjustments for silver and mithril + moreores.silver_max_depth_high = 0 + moreores.silver_min_depth_high = -10 + moreores.silver_max_depth = -11 + moreores.silver_min_depth = -57 + + moreores.mithril_max_depth_high = 0 + moreores.mithril_min_depth_high = -20 + moreores.mithril_max_depth = -21 + moreores.mithril_min_depth = -57 +else + -- Maximal and minimal depths of ore generation (Y coordinate, 0 being sea level by default) + -- Tin + moreores.tin_max_depth_high = 31000 + moreores.tin_min_depth_high = 1025 + moreores.tin_max_depth = -64 -- For v6 mapgen, -32 fits better + moreores.tin_min_depth = -127 + moreores.tin_max_depth_deep = -128 + moreores.tin_min_depth_deep = -31000 + + -- Silver + moreores.silver_max_depth_high = 31000 + moreores.silver_min_depth_high = 1025 + moreores.silver_max_depth = -64 -- For v6 mapgen, -32 fits better + moreores.silver_min_depth = -127 -- For v6 mapgen, -63 fits better + moreores.silver_max_depth_deep = -128 -- For v6 mapgen, -64 fits better + moreores.silver_min_depth_deep = -31000 + + -- Mithril + moreores.mithril_max_depth_high = 31000 + moreores.mithril_min_depth_high = 2049 + moreores.mithril_max_depth = -2048 -- For v6 mapgen, -256 fits better + moreores.mithril_min_depth = -4095 -- For v6 mapgen, -511 fits better + moreores.mithril_max_depth_deep = -4096 -- For v6 mapgen, -512 fits better + moreores.mithril_min_depth_deep = -31000 +end diff --git a/mods/moreores/init.lua b/mods/moreores/init.lua index 482a5e99..6911d51a 100644 --- a/mods/moreores/init.lua +++ b/mods/moreores/init.lua @@ -25,11 +25,32 @@ end -- `frame` support local use_frame = minetest.get_modpath("frame") -local default_stone_sounds = default.node_sound_stone_defaults() -local default_metal_sounds = default.node_sound_metal_defaults() +local is_mcl_core_present = minetest.get_modpath("mcl_core") ~= nil +local is_mcl_sounds_present = minetest.get_modpath("mcl_sounds") ~= nil +local is_mcl_copper_present = minetest.registered_items["mcl_copper:copper_ingot"] ~= nil +local stone_ingredient = is_mcl_core_present and "mcl_core:stone" or "default:stone" + +local copper_ingredient = +is_mcl_core_present and "mcl_copper:copper_ingot" or 'default:copper_ingot' + +local default_stone_sounds +local default_metal_sounds + +if is_mcl_sounds_present then + default_stone_sounds = mcl_sounds.node_sound_stone_defaults() + default_metal_sounds = mcl_sounds.node_sound_metal_defaults() +else + default_stone_sounds = default.node_sound_stone_defaults() + default_metal_sounds = default.node_sound_metal_defaults() +end + -- Returns the crafting recipe table for a given material and item. local function get_recipe(material, item) + if is_mcl_core_present then + material = material:gsub("default:", "mcl_core:") + end + if item == "sword" then return { {material}, @@ -74,7 +95,12 @@ local function get_recipe(material, item) end end -local function add_ore(modname, description, mineral_name, oredef) +local function add_ore(modname, description, mineral_name, oredef, extra_node_def) + + if mineral_name == "copper" and is_mcl_copper_present then + return + end + local img_base = modname .. "_" .. mineral_name local toolimg_base = modname .. "_tool_"..mineral_name local tool_base = modname .. ":" @@ -83,14 +109,34 @@ local function add_ore(modname, description, mineral_name, oredef) local ingot = item_base .. "_ingot" local lump_item = item_base .. "_lump" + local function merge_tables(t1, t2) + for k, v in pairs(t2) do + if type(v) == "table" and type(t1[k]) == "table" then + -- If both t1[k] and v are tables, merge them recursively + merge_tables(t1[k], v) + else + -- Otherwise, simply set the value + t1[k] = v + end + end + return t1 + end + + if oredef.makes.ore then - minetest.register_node(modname .. ":mineral_" .. mineral_name, { - description = S("@1 Ore", S(description)), - tiles = {"default_stone.png^" .. modname .. "_mineral_" .. mineral_name .. ".png"}, - groups = {cracky = 2}, - sounds = default_stone_sounds, - drop = lump_item, - }) + local node_def_tbl = { + description = S("@1 Ore", S(description)), + tiles = {"default_stone.png^" .. modname .. "_mineral_" .. mineral_name .. + ".png"}, + groups = {cracky = 2}, + sounds = default_stone_sounds, + drop = lump_item, + } + if extra_node_def then + node_def_tbl = merge_tables(node_def_tbl, extra_node_def) + end + minetest.register_node(modname .. ":mineral_" .. mineral_name, node_def_tbl) + if use_frame then frame.register(modname .. ":mineral_" .. mineral_name) @@ -103,6 +149,7 @@ local function add_ore(modname, description, mineral_name, oredef) description = S("@1 Block", S(description)), tiles = {img_base .. "_block.png"}, groups = {snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2}, + is_ground_content = false, sounds = default_metal_sounds, }) minetest.register_alias(mineral_name.."_block", block_item) @@ -153,6 +200,7 @@ local function add_ore(modname, description, mineral_name, oredef) end if oredef.makes.chest then + if not is_mcl_core_present then minetest.register_craft( { output = "default:chest_locked", recipe = { @@ -160,23 +208,25 @@ local function add_ore(modname, description, mineral_name, oredef) {"default:chest"}, } }) + minetest.register_craft( { output = "default:chest_locked", recipe = get_recipe(ingot, "lockedchest") }) end + end oredef.oredef_high.ore_type = "scatter" oredef.oredef_high.ore = modname .. ":mineral_" .. mineral_name - oredef.oredef_high.wherein = "default:stone" + oredef.oredef_high.wherein = stone_ingredient oredef.oredef.ore_type = "scatter" oredef.oredef.ore = modname .. ":mineral_" .. mineral_name - oredef.oredef.wherein = "default:stone" + oredef.oredef.wherein = stone_ingredient oredef.oredef_deep.ore_type = "scatter" oredef.oredef_deep.ore = modname .. ":mineral_" .. mineral_name - oredef.oredef_deep.wherein = "default:stone" + oredef.oredef_deep.wherein = stone_ingredient minetest.register_ore(oredef.oredef_high) minetest.register_ore(oredef.oredef) @@ -193,22 +243,46 @@ local function add_ore(modname, description, mineral_name, oredef) full_punch_interval = oredef.full_punch_interval, }, sound = {breaks = "default_tool_breaks"}, + _repair_material = ingot, + _mcl_toollike_wield = true, + mcl_diggroups = tooldef._mcl_diggroups, + groups = tooldef.groups, } if tool_name == "sword" then tdef.description = S("@1 Sword", S(description)) + if tdef.groups then + tdef.groups = merge_tables(tdef.groups, {sword = 1}) + else + tdef.groups = {sword = 1} + end end if tool_name == "pick" then tdef.description = S("@1 Pickaxe", S(description)) + if tdef.groups then + tdef.groups = merge_tables(tdef.groups, {pickaxe = 1, tool=1}) + else + tdef.groups = {pickaxe = 1, tool=1} + end end if tool_name == "axe" then tdef.description = S("@1 Axe", S(description)) + if tdef.groups then + tdef.groups = merge_tables(tdef.groups, {axe = 1, tool=1}) + else + tdef.groups = {axe = 1, tool=1} + end end if tool_name == "shovel" then tdef.description = S("@1 Shovel", S(description)) + if tdef.groups then + tdef.groups = merge_tables(tdef.groups, {shovel = 1, tool=1}) + else + tdef.groups = {shovel = 1, tool=1} + end tdef.wield_image = toolimg_base .. tool_name .. ".png^[transformR90" end @@ -216,6 +290,7 @@ local function add_ore(modname, description, mineral_name, oredef) if tool_name == "hoe" and minetest.get_modpath("farming") then tdef.max_uses = tooldef.max_uses + tdef.material = ingot tdef.description = S("@1 Hoe", S(description)) farming.register_hoe(fulltool_name, tdef) end @@ -281,15 +356,23 @@ local oredefs = { cracky = {times = {[1] = 2.60, [2] = 1.00, [3] = 0.60}, uses = 100, maxlevel = 1}, }, damage_groups = {fleshy = 4}, + groups = {dig_speed_class=4, enchantability=14}, + _mcl_diggroups = { + pickaxey = { speed = 6, level = 4, uses = 126 } + }, }, hoe = { - max_uses = 300, + max_uses = 150, }, shovel = { groupcaps = { crumbly = {times = {[1] = 1.10, [2] = 0.40, [3] = 0.25}, uses = 100, maxlevel = 1}, }, damage_groups = {fleshy = 3}, + groups = {dig_speed_class=4, enchantability=14}, + _mcl_diggroups = { + shovely = { speed = 6, level = 4, uses = 126 } + }, }, axe = { groupcaps = { @@ -297,6 +380,10 @@ local oredefs = { fleshy = {times = {[2] = 1.10, [3] = 0.60}, uses = 100, maxlevel = 1}, }, damage_groups = {fleshy = 5}, + groups = {dig_speed_class=4, enchantability=14}, + _mcl_diggroups = { + axey = { speed = 6, level = 4, uses = 126 } + }, }, sword = { groupcaps = { @@ -305,9 +392,19 @@ local oredefs = { choppy = {times = {[3] = 0.80}, uses = 100, maxlevel = 0}, }, damage_groups = {fleshy = 6}, + _mcl_diggroups = { + swordy = { speed = 6, level = 4, uses = 126 }, + swordy_cobweb = { speed = 6, level = 4, uses = 126 } + }, }, }, full_punch_interval = 1.0, + extra_node_def = { + _mcl_blast_resistance = 3, + _mcl_hardness = 4, + _mcl_silk_touch_drop = true, + groups = {pickaxey = 4} + } }, mithril = { description = "Mithril", @@ -336,36 +433,58 @@ local oredefs = { tools = { pick = { groupcaps = { - cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = 200, maxlevel = 3}, + cracky = {times = {[1] = 2.60, [2] = 1.00, [3] = 0.60}, uses = 3126, maxlevel = 3}, }, damage_groups = {fleshy = 6}, + groups = {dig_speed_class=5, enchantability=10}, + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 3126 } + }, }, hoe = { - max_uses = 1000, + max_uses = 2000, }, shovel = { groupcaps = { - crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = 200, maxlevel = 3}, + crumbly = {times = {[1] = 1.10, [2] = 0.40, [3] = 0.25}, uses = 3126, maxlevel = 3}, + }, + damage_groups = {fleshy = 6}, + groups = {dig_speed_class=5, enchantability=10}, + _mcl_diggroups = { + shovely = { speed = 8, level = 5, uses = 3126 } }, - damage_groups = {fleshy = 5}, }, axe = { groupcaps = { - choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = 200, maxlevel = 3}, - fleshy = {times = {[2] = 0.95, [3] = 0.30}, uses = 200, maxlevel = 2}, + choppy = {times = {[1] = 2.50, [2] = 0.80, [3] = 0.50}, uses = 3126, maxlevel = 3}, + fleshy = {times = {[2] = 1.10, [3] = 0.60}, uses = 3126, maxlevel = 3}, + }, + damage_groups = {fleshy = 10}, + groups = {dig_speed_class=5, enchantability=10}, + _mcl_diggroups = { + axey = { speed = 8, level = 5, uses = 3126 } }, - damage_groups = {fleshy = 8}, }, sword = { groupcaps = { - fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = 200, maxlevel = 2}, - snappy = {times = {[1] = 1.70, [2] = 0.70, [3] = 0.25}, uses = 200, maxlevel = 3}, - choppy = {times = {[3] = 0.65}, uses = 200, maxlevel = 0}, + fleshy = {times = {[2] = 0.70, [3] = 0.30}, uses = 3126, maxlevel = 3}, + snappy = {times = {[1] = 1.70, [2] = 0.70, [3] = 0.30}, uses = 3126, maxlevel = 3}, + choppy = {times = {[3] = 0.80}, uses = 3126, maxlevel = 0}, + }, + damage_groups = {fleshy = 7}, + _mcl_diggroups = { + swordy = { speed = 8, level = 5, uses = 3126 }, + swordy_cobweb = { speed = 8, level = 5, uses = 3126 } }, - damage_groups = {fleshy = 10}, }, }, full_punch_interval = 0.45, + extra_node_def = { + _mcl_blast_resistance = 3, + _mcl_hardness = 5, + _mcl_silk_touch_drop = true, + groups = {pickaxey = 5} + }, } } @@ -408,6 +527,12 @@ else y_max = moreores.tin_max_depth_deep, }, tools = {}, + extra_node_def = { + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + groups = {pickaxey = 3} + }, } -- Bronze has some special cases, because it is made from copper and tin @@ -416,8 +541,8 @@ else output = "default:bronze_ingot 3", recipe = { "moreores:tin_ingot", - "default:copper_ingot", - "default:copper_ingot", + copper_ingredient, + copper_ingredient, }, }) end @@ -441,13 +566,13 @@ end minetest.register_craft({ output = "moreores:copper_rail 24", recipe = { - {"default:copper_ingot", "", "default:copper_ingot"}, - {"default:copper_ingot", "group:stick", "default:copper_ingot"}, - {"default:copper_ingot", "", "default:copper_ingot"}, + {copper_ingredient, "", copper_ingredient}, + {copper_ingredient, "group:stick", copper_ingredient}, + {copper_ingredient, "", copper_ingredient}, }, }) for orename, def in pairs(oredefs) do -- Register everything - add_ore("moreores", def.description, orename, def) + add_ore("moreores", def.description, orename, def, def.extra_node_def) end diff --git a/mods/moreores/locale/moreores.de.tr b/mods/moreores/locale/moreores.de.tr index aac97be7..75a2cf0d 100644 --- a/mods/moreores/locale/moreores.de.tr +++ b/mods/moreores/locale/moreores.de.tr @@ -2,8 +2,6 @@ # Translation by Xanthin -[moreores] loaded.=[moreores] geladen. - @1 Ore=@1erz @1 Lump=@1klumpen @1 Ingot=@1barren diff --git a/mods/moreores/locale/moreores.en.tr b/mods/moreores/locale/moreores.en.tr deleted file mode 100644 index b13188d6..00000000 --- a/mods/moreores/locale/moreores.en.tr +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: moreores - -[moreores] loaded.=[moreores] loaded. - -@1 Ore=@1 Ore -@1 Lump=@1 Lump -@1 Ingot=@1 Ingot -@1 Block=@1 Block -@1 Pickaxe=@1 Pickaxe -@1 Shovel=@1 Shovel -@1 Axe=@1 Axe -@1 Sword=@1 Sword -@1 Hoe=@1 Hoe - -Copper=Copper -Tin=Tin -Bronze=Bronze -Silver=Silver -Gold=Gold -Mithril=Mithril -Copper Rail=Copper Rail diff --git a/mods/moreores/locale/moreores.es.tr b/mods/moreores/locale/moreores.es.tr index 3b709a30..4e113c7a 100644 --- a/mods/moreores/locale/moreores.es.tr +++ b/mods/moreores/locale/moreores.es.tr @@ -2,8 +2,6 @@ # Translation by kaeza -[moreores] loaded.=[moreores] cargado. - @1 Ore=Mineral de @1 @1 Lump=Pepita de @1 @1 Ingot=Lingote de @1 @@ -13,10 +11,10 @@ @1 Axe=Hacha de @1 @1 Sword=Espada de @1 -Copper=cobre -Tin=estaño -Bronze=bronce -Silver=plata -Gold=oro -Mithril=mitrilo +Copper=Cobre +Tin=Estaño +Bronze=Bronce +Silver=Plata +Gold=Oro +Mithril=Mitrilo Copper Rail=Riel de Cobre diff --git a/mods/moreores/locale/moreores.fr.tr b/mods/moreores/locale/moreores.fr.tr index 2ac45a8d..8dbc515f 100644 --- a/mods/moreores/locale/moreores.fr.tr +++ b/mods/moreores/locale/moreores.fr.tr @@ -2,8 +2,6 @@ # Translation by Calinou -[moreores] loaded.=[moreores] a été chargé. - @1 Ore=Minerai en @1 @1 Lump=Roche en @1 @1 Ingot=Lingot en @1 diff --git a/mods/moreores/locale/moreores.hu.tr b/mods/moreores/locale/moreores.hu.tr index 820ece78..fc9f1a6e 100644 --- a/mods/moreores/locale/moreores.hu.tr +++ b/mods/moreores/locale/moreores.hu.tr @@ -2,8 +2,6 @@ # Translation by An0n3m0us -[moreores] loaded.=[moreores] betöltve. - @1 Ore=@1 érc @1 Lump=@1 rög @1 Ingot=@1 öntvény diff --git a/mods/moreores/locale/moreores.it.tr b/mods/moreores/locale/moreores.it.tr index 96541f76..155105b9 100644 --- a/mods/moreores/locale/moreores.it.tr +++ b/mods/moreores/locale/moreores.it.tr @@ -2,8 +2,6 @@ # Translation by Pagliaccio -[moreores] loaded.=[moreores] caricato. - @1 Ore=Minerale di @1 @1 Lump=@1 grezzo @1 Ingot=Lingotto di @1 diff --git a/mods/moreores/locale/moreores.nl.tr b/mods/moreores/locale/moreores.nl.tr index e572ff38..dd143208 100644 --- a/mods/moreores/locale/moreores.nl.tr +++ b/mods/moreores/locale/moreores.nl.tr @@ -1,7 +1,5 @@ # textdomain: moreores -[moreores] loaded.=[moreores] geladen. - @1 Ore=@1 Erts @1 Lump=@1 Klomp @1 Ingot=@1 Staaf diff --git a/mods/moreores/locale/moreores.pl.tr b/mods/moreores/locale/moreores.pl.tr index 2eb29933..77da16fa 100644 --- a/mods/moreores/locale/moreores.pl.tr +++ b/mods/moreores/locale/moreores.pl.tr @@ -2,14 +2,12 @@ # Translation by mat9117 -[moreores] loaded.=[moreores] załadowano. - @1 Ore=@1 Ruda @1 Lump=@1 Bryłka @1 Ingot=@1 Sztabka @1 Block=@1 Blok @1 Pickaxe=@1 Kilof -@1 Shovel=@1 Łopatka +@1 Shovel=@1 Łopata @1 Axe=@1 Siekiera @1 Sword=@1 Miecz @@ -19,4 +17,4 @@ Bronze=Brąz Silver=Srebro Gold=Złoto Mithril=Mithril -Copper Rail=Miedziany tor +Copper Rail=Miedziany Tor diff --git a/mods/moreores/locale/moreores.pt_br.tr b/mods/moreores/locale/moreores.pt_br.tr index 613209df..6c13d397 100644 --- a/mods/moreores/locale/moreores.pt_br.tr +++ b/mods/moreores/locale/moreores.pt_br.tr @@ -2,8 +2,6 @@ # Translation by github.com/caiorrs -[moreores] loaded.=[moreores] carregado. - @1 Ore=Minério de @1 @1 Lump=Pepita de @1 @1 Ingot=Lingote de @1 diff --git a/mods/moreores/locale/moreores.ru.tr b/mods/moreores/locale/moreores.ru.tr new file mode 100755 index 00000000..e8ffa359 --- /dev/null +++ b/mods/moreores/locale/moreores.ru.tr @@ -0,0 +1,19 @@ +# textdomain: moreores + +@1 Ore=Руда @1 +@1 Lump=Кусок @1 +@1 Ingot=Слиток @1 +@1 Block=Блок @1 +@1 Pickaxe=Кирка из @1 +@1 Shovel=Лопата из @1 +@1 Axe=Топор из @1 +@1 Sword=Меч из @1 +@1 Hoe=Мотыга из @1 + +Copper=меди +Tin=олова +Bronze=бронзы +Silver=серебра +Gold=золота +Mithril=мифрила +Copper Rail=медные рельсы diff --git a/mods/moreores/locale/moreores.tr.tr b/mods/moreores/locale/moreores.tr.tr index e41f8e34..c99f7d44 100644 --- a/mods/moreores/locale/moreores.tr.tr +++ b/mods/moreores/locale/moreores.tr.tr @@ -7,8 +7,6 @@ # Turkish translation # Language 2 letter iso code is "tr" -[moreores] loaded.=[moreores] yüklendi. - @1 Ore=@1 madeni @1 Lump=@1 yığını @1 Ingot=@1 külçesi diff --git a/mods/moreores/locale/template.txt b/mods/moreores/locale/template.txt new file mode 100644 index 00000000..37ba08e1 --- /dev/null +++ b/mods/moreores/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: moreores + +@1 Ore= +@1 Lump= +@1 Ingot= +@1 Block= +@1 Pickaxe= +@1 Shovel= +@1 Axe= +@1 Sword= + +Copper= +Tin= +Bronze= +Silver= +Gold= +Mithril= +Copper Rail= diff --git a/mods/moreores/mod.conf b/mods/moreores/mod.conf index 341e8347..fab3de54 100644 --- a/mods/moreores/mod.conf +++ b/mods/moreores/mod.conf @@ -1,5 +1,5 @@ name = moreores description = Adds new ore types. -depends = default -optional_depends = carts,farming,frame,mg,toolranks +optional_depends = carts,farming,frame,mg,toolranks,mcl_core,mcl_sounds min_minetest_version = 5.0.0 +supported_games = mineclone2,mineclonia,minetest_game diff --git a/mods/moretrees/.luacheckrc b/mods/moretrees/.luacheckrc index 459b2e2e..199e53fb 100644 --- a/mods/moretrees/.luacheckrc +++ b/mods/moretrees/.luacheckrc @@ -1,30 +1,28 @@ -std = "lua51+minetest" unused_args = false allow_defined_top = true -max_line_length = 999 -max_comment_line_length = 999 -stds.minetest = { - read_globals = { - "minetest", - "vector", - "VoxelManip", - "VoxelArea", - "PseudoRandom", - "ItemStack", - "default", - table = { - fields = { - "copy", - }, - }, - "dump", - } +exclude_files = {".luacheckrc"} + + +globals = { + "minetest", + "vector", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + "dump", + "moretrees", + "ethereal", } read_globals = { - "biome_lib", + string = {fields = {"split"}}, + table = {fields = {"copy", "getn"}}, + "stairsplus", "stairs", "doors", + "xcompat", } diff --git a/mods/moretrees/README.md b/mods/moretrees/README.md index 905cefa4..0bab3c3f 100644 --- a/mods/moretrees/README.md +++ b/mods/moretrees/README.md @@ -8,4 +8,5 @@ jungle trees mod, and big contributions by RealBadAngel. Brought together into one mod and made L-systems compatible by Vanessa Ezekowitz. -Dependencies: biome_lib and default +Dependencies: `xcompat` +see mod.conf for more diff --git a/mods/moretrees/biome_defs.lua b/mods/moretrees/biome_defs.lua index e54f7bab..43c5765c 100644 --- a/mods/moretrees/biome_defs.lua +++ b/mods/moretrees/biome_defs.lua @@ -1,302 +1,155 @@ moretrees.beech_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 8, - seed_diff = 2, - rarity = 50, - max_count = 20, + place_on = xcompat.materials.dirt_with_grass, } moretrees.palm_biome = { - surface = "default:sand", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 5, - seed_diff = 330, + place_on = xcompat.materials.sand, min_elevation = -1, max_elevation = 1, - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_count = 10, - temp_min = 0.25, - temp_max = -0.15, - rarity = 50, - max_count = 10, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 10, } moretrees.date_palm_biome = { - surface = "default:desert_sand", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 339, + place_on = xcompat.materials.desert_sand, min_elevation = -1, max_elevation = 10, - near_nodes = {"default:water_source"}, - near_nodes_size = 20, - near_nodes_count = 100, - near_nodes_vertical = 20, - temp_min = -0.20, - humidity_max = 0.20, - rarity = 10, - max_count = 30, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 100, } moretrees.date_palm_biome_2 = { - surface = "default:desert_sand", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 340, + place_on = xcompat.materials.desert_sand, min_elevation = 11, max_elevation = 30, - near_nodes = {"default:water_source"}, - near_nodes_size = 1, - near_nodes_count = 1, - near_nodes_vertical = 30, - temp_min = -0.20, - humidity_max = 0.20, - rarity = 10, - max_count = 30, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, } moretrees.apple_tree_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 331, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 1, max_elevation = 10, - temp_min = 0.1, - temp_max = -0.15, - rarity = 75, - max_count = 5, + biomes = {"deciduous_forest"}, + fill_ratio = 0.0001, } moretrees.oak_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 15, - seed_diff = 332, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 10, - temp_min = 0.4, - temp_max = 0.2, - rarity = 50, - max_count = 5, + fill_ratio = 0.0003 } moretrees.sequoia_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 333, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 10, - temp_min = 1, - temp_max = -0.4, - rarity = 90, - max_count = 5, + fill_ratio = 0.0001, } moretrees.birch_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 5, - seed_diff = 334, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 10, max_elevation = 15, - temp_min = 0.9, - temp_max = 0.3, - rarity = 50, - max_count = 10, + fill_ratio = 0.001, } moretrees.willow_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 337, + place_on = xcompat.materials.dirt_with_grass, min_elevation = -5, max_elevation = 5, - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_count = 5, - rarity = 75, - max_count = 5, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 5, } moretrees.rubber_tree_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 338, + place_on = xcompat.materials.dirt_with_grass, min_elevation = -5, max_elevation = 5, - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_count = 10, - temp_min = -0.15, - rarity = 75, - max_count = 10, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 10, } moretrees.jungletree_biome = { - surface = { - "default:dirt", - "default:dirt_with_grass", + place_on = { + xcompat.materials.dirt, + xcompat.materials.dirt_with_grass, "woodsoils:dirt_with_leaves_1", "woodsoils:grass_with_leaves_1", - "woodsoils:grass_with_leaves_2" + "woodsoils:grass_with_leaves_2", + "default:dirt_with_rainforest_litter", }, - avoid_nodes = {"moretrees:jungletree_trunk"}, - max_count = 12, - avoid_radius = 3, - rarity = 85, - seed_diff = 329, min_elevation = 1, - near_nodes = {"default:jungletree"}, - near_nodes_size = 6, - near_nodes_vertical = 2, - near_nodes_count = 1, - plantlife_limit = -0.9, + spawn_by = minetest.get_modpath("default") and {"default:jungletree"} or nil, + num_spawn_by = minetest.get_modpath("default") and 1 or nil, + biomes = {"rainforest", "rainforest_swamp"}, } moretrees.spruce_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 335, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 20, - temp_min = 0.9, - temp_max = 0.7, - rarity = 50, - max_count = 5, } moretrees.cedar_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 336, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, --Added to solve an issue where cedar trees would sometimes spawn deep underground - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_count = 5, - rarity = 50, - max_count = 10, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 5, } -- Poplar requires a lot of water. moretrees.poplar_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 6, - seed_diff = 341, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 50, - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_vertical = 5, - near_nodes_count = 1, - humidity_min = -0.7, - humidity_max = -1, - rarity = 50, - max_count = 15, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, } --- The humidity requirement it quite restrictive (apparently). -- Spawn an occasional poplar elsewhere. moretrees.poplar_biome_2 = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 6, - seed_diff = 341, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 50, - near_nodes = {"default:water_source"}, - near_nodes_size = 15, - near_nodes_vertical = 4, - near_nodes_count = 10, - humidity_min = 0.1, - humidity_max = -0.6, - rarity = 50, - max_count = 1, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 10, } -- Subterranean lakes provide enough water for poplars to grow moretrees.poplar_biome_3 = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 6, - seed_diff = 342, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 50, - near_nodes = {"default:water_source"}, - near_nodes_size = 1, - near_nodes_vertical = 25, - near_nodes_count = 1, - humidity_min = -0.5, - humidity_max = -1, - rarity = 0, - max_count = 30, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, } moretrees.poplar_small_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 4, - seed_diff = 343, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 50, - near_nodes = {"default:water_source"}, - near_nodes_size = 10, - near_nodes_vertical = 5, - near_nodes_count = 1, - humidity_min = -0.7, - humidity_max = -1, - rarity = 50, - max_count = 10, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, } moretrees.poplar_small_biome_2 = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 4, - seed_diff = 343, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 0, max_elevation = 50, - near_nodes = {"default:water_source"}, - near_nodes_size = 10, - near_nodes_vertical = 4, - near_nodes_count = 5, - humidity_min = 0.1, - humidity_max = -0.6, - rarity = 50, - max_count = 3, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 5, } moretrees.fir_biome = { - surface = "default:dirt_with_grass", - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 359, + place_on = xcompat.materials.dirt_with_grass, min_elevation = 25, - temp_min = 0.9, - temp_max = 0.3, - rarity = 50, - max_count = 10, } moretrees.fir_biome_snow = { - surface = {"snow:dirt_with_snow", "snow:snow"}, - below_nodes = {"default:dirt", "default:dirt_with_grass", "snow:dirt_with_snow"}, - avoid_nodes = moretrees.avoidnodes, - avoid_radius = 10, - seed_diff = 359, - rarity = 50, - max_count = 10, - check_air = false, - delete_above = true, - spawn_replace_node = true + place_on = {"snow:dirt_with_snow", "snow:snow"}, + below_nodes = {xcompat.materials.dirt, xcompat.materials.dirt_with_grass, "snow:dirt_with_snow"}, } diff --git a/mods/moretrees/cocos_palm.lua b/mods/moretrees/cocos_palm.lua index 127f3285..bf9b7538 100644 --- a/mods/moretrees/cocos_palm.lua +++ b/mods/moretrees/cocos_palm.lua @@ -32,7 +32,7 @@ ftrunk.after_destruct = function(pos, oldnode) -- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ... --minetest.dig_node(coconutpos) local items = minetest.get_node_drops(minetest.get_node(coconutpos).name) - minetest.swap_node(coconutpos, biome_lib.air) + minetest.swap_node(coconutpos, {name = "air"}) for _, itemname in pairs(items) do minetest.add_item(coconutpos, itemname) end @@ -80,8 +80,11 @@ end -- ABM converts the trunk to a regular fruit trunk, and spawns some coconuts) minetest.register_abm({ nodenames = { "moretrees:palm_fruit_trunk_gen" }, - interval = 1, + interval = 6, chance = 1, + min_y = -16, + max_y = 48, + label = "converts palm trunk to a regular fruit trunk, and spawns some coconuts", action = function(pos, node, active_object_count, active_object_count_wider) minetest.swap_node(pos, {name="moretrees:palm_fruit_trunk"}) local poslist = minetest.find_nodes_in_area( @@ -127,7 +130,7 @@ local coconut_growfn = function(pos, elapsed) minetest.add_item(pos, itemname) end end - minetest.swap_node(pos, biome_lib.air) + minetest.swap_node(pos, {name = "air"}) end else -- Grow coconuts to the next stage @@ -174,10 +177,11 @@ for _,suffix in ipairs({"_0", "_1", "_2", "_3", ""}) do paramtype = "light", sunlight_propagates = true, walkable = false, + is_ground_content = false, groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_coconut=coco_group }, inventory_image = tile.."^[transformR180", wield_image = tile.."^[transformR180", - sounds = default.node_sound_defaults(), + sounds = xcompat.sounds.node_sound_default(), drop = drop, selection_box = { type = "fixed", diff --git a/mods/moretrees/crafts.lua b/mods/moretrees/crafts.lua index 360f9848..918f37b8 100644 --- a/mods/moretrees/crafts.lua +++ b/mods/moretrees/crafts.lua @@ -3,13 +3,15 @@ local S = minetest.get_translator("moretrees") for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] - minetest.register_craft({ - type = "shapeless", - output = "moretrees:"..treename.."_planks 4", - recipe = { - "moretrees:"..treename.."_trunk" - } - }) + if moretrees.enable_planks then + minetest.register_craft({ + type = "shapeless", + output = "moretrees:"..treename.."_planks 4", + recipe = { + "moretrees:"..treename.."_trunk" + } + }) + end minetest.register_craft({ type = "fuel", diff --git a/mods/moretrees/date_palm.lua b/mods/moretrees/date_palm.lua index 33cd646a..3b4261a9 100644 --- a/mods/moretrees/date_palm.lua +++ b/mods/moretrees/date_palm.lua @@ -52,7 +52,7 @@ ftrunk.after_destruct = function(pos, oldnode) for _,datespos in pairs(dates) do -- minetest.dig_node(datespos) does not cause nearby dates to be dropped :-( ... local items = minetest.get_node_drops(minetest.get_node(datespos).name) - minetest.swap_node(datespos, biome_lib.air) + minetest.swap_node(datespos, {name = "air"}) for _, itemname in pairs(items) do minetest.add_item(datespos, itemname) end @@ -83,7 +83,10 @@ local date_regrow_abm_spec = { interval = moretrees.dates_flower_interval, chance = moretrees.dates_flower_chance, action = function(pos, node, active_object_count, active_object_count_wider) - local dates = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, "group:moretrees_dates") + local dates = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, + "group:moretrees_dates" + ) -- New blossom interval increases exponentially with number of dates already hanging -- In addition: if more dates are hanging, the chance of picking an empty spot decreases as well... @@ -228,7 +231,8 @@ local function find_fruit_trunks_near(ftpos, sect) -- Skip the search if it is consuming too much CPU time if sect_search_stats.count > 0 and moretrees.dates_blossom_search_iload > 0 and sect_search_stats.sum / sect_search_stats.count > moretrees.dates_blossom_search_time_treshold - and t0us - sect_search_stats.last_us < moretrees.dates_blossom_search_iload * (sect_search_stats.sum / sect_search_stats.count) then + and t0us - sect_search_stats.last_us < moretrees.dates_blossom_search_iload + * (sect_search_stats.sum / sect_search_stats.count) then sect_search_stats.skip = sect_search_stats.skip + 1 return nil end @@ -481,7 +485,10 @@ local function find_male_blossom_with_ftrunk(fbpos,ftpos) end -- Else do a new search if not mpalms.sect[sect_old] then - mpalms.sect[sect_old], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = (sect_old + 4) % 3 - 1, z = (sect_old + 4) / 3 - 1}) + mpalms.sect[sect_old], fpalms_list, all_mpalms_list = find_fruit_trunks_near( + ftpos, + {x = (sect_old + 4) % 3 - 1, z = (sect_old + 4) / 3 - 1} + ) cache_changed = true if sect_old == 0 then -- Save the results if it is sector 0 @@ -547,7 +554,7 @@ local dates_growfn = function(pos, elapsed) elseif string.find(node.name, "moretrees:dates_m") then minetest.swap_node(pos, {name="moretrees:dates_n"}) else - minetest.swap_node(pos, biome_lib.air) + minetest.swap_node(pos, {name = "air"}) end return elseif node.name == "moretrees:dates_f0" and math.random(100) <= 100 * dates_regrow_prob then @@ -587,7 +594,7 @@ local dates_growfn = function(pos, elapsed) elseif string.match(node.name, "n$") then -- Remove stems. if math.random(stems_drop_ichance) == 1 then - minetest.swap_node(pos, biome_lib.air) + minetest.swap_node(pos, {name = "air"}) return "stemdrop" end action = "nostemdrop" @@ -716,10 +723,11 @@ for _,suffix in ipairs({"f0", "f1", "f2", "f3", "f4", "m0", "fn", "n"}) do paramtype = "light", sunlight_propagates = true, walkable = false, + is_ground_content = false, groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_dates=1 }, inventory_image = "moretrees_dates_"..suffix..".png^[transformR0", wield_image = "moretrees_dates_"..suffix..".png^[transformR90", - sounds = default.node_sound_defaults(), + sounds = xcompat.sounds.node_sound_default(), drop = dropfn, selection_box = { type = "fixed", diff --git a/mods/moretrees/default_settings.txt b/mods/moretrees/default_settings.txt deleted file mode 100644 index a0fae226..00000000 --- a/mods/moretrees/default_settings.txt +++ /dev/null @@ -1,135 +0,0 @@ --- Global configuration variables - --- Enable the various kinds of trees. - -moretrees.enable_apple_tree = true -moretrees.enable_oak = true -moretrees.enable_sequoia = true -moretrees.enable_palm = true -moretrees.enable_date_palm = true -moretrees.enable_cedar = true -moretrees.enable_rubber_tree = true -moretrees.enable_willow = true -moretrees.enable_birch = true -moretrees.enable_spruce = true -moretrees.enable_jungle_tree = true -moretrees.enable_fir = true -moretrees.enable_poplar = true -moretrees.enable_beech = false - --- set this to true to make moretrees spawn saplings at mapgen time instead --- of fully-grown trees, which will grow into full trees after a very short --- delay. This reduces mapgen lag in some situations, and fixes situations --- where the mapgen conflicts with the tree generator. - -moretrees.spawn_saplings = true - --- Set this to true to allow defining stairs/slabs/etc. If Moreblocks is --- installed, this will use that mod's Stairs Plus component. Otherwise, it --- will use the default stairs mod in minetest_game, if present - -moretrees.enable_stairs = true - --- If this variable is set to true, register fences for moretrees wood - -moretrees.enable_fences = false - --- Set this to true if you want the plantlike drawtype for leaves, which --- improves some peoples' framerates without resorting to making leaf nodes opaque. --- Affects default leaves and default jungle leaves also. - -moretrees.plantlike_leaves = false - --- Enable this if you want moretrees to redefine default apples so that they --- fall when leaves decay/are dug. - -moretrees.enable_redefine_apple = true - --- Set this to true to enable leaf decay of all trees except the default ones. - -moretrees.enable_leafdecay = true - --- various related settings to configure leaf decay. - -moretrees.leafdecay_delay = 2 -moretrees.leafdecay_chance = 5 -moretrees.leafdecay_radius = 5 -moretrees.palm_leafdecay_radius = 10 - --- Change these settings if you want default trees to be gradually cut down --- above the elevation where firs normally generate. - -moretrees.firs_remove_default_trees = false -moretrees.firs_remove_interval = 2 -moretrees.firs_remove_chance = 150 - --- Cocos palm settings - -moretrees.coconuts_regrow = true -moretrees.coconuts_convert_existing_palms = true -- Converting existing palm trees will make coconuts regrow on them as well - -- Else, they will only regrow on newly-spawned palms - -- However, conversion is not an exact science, and although an attempt is - -- made to detect whether a trunk belongs to an actual palm, some coconut trunks - -- and some coconuts may be incorrectly converted. -moretrees.coconut_flower_interval = 59 -moretrees.coconut_flower_chance = 67 -moretrees.coconut_grow_interval = 2 * moretrees.coconut_flower_interval * moretrees.coconut_flower_chance - -- Actual interval will randomly vary between 67% and 133% of this value - -- 2 * 59 * 67 ~ 2 hours. So flowers become coconuts in about 6 hours -moretrees.coconut_item_drop_ichance = 10 -- inverse probability of ripe coconuts dropping as items (instead of disappearing) - --- Date palm settings - --- Suggested configuration alternatives: --- - Dates grow only when pollinated: --- - Set dates_regrow_pollinated to true --- - Set dates_regrow_unpollinated_percent to 0 --- - Dates grow without pollination. Pollination disabled: --- - Set dates_regrow_pollinated to false --- - Set dates_regrow_unpollinated_percent to some larger positive value, e.g. 95 --- - Dates grow, but more and faster if male flowers are nearby --- - Set dates_regrow_pollinated to true --- - Set dates_regrow_unpollinated_percent to some small positive value, e.g. 33 --- - Optional but recommended: Reduce the pollination distance, e.g. to 30 - --- Note that it should not be necessary to disable pollination for performance --- reasons. A lot of effort has gone into ensuring that date growing will not cause lag. --- --- If lag is suspected, use the chat command '/dates_stats' to obtain the male dates --- search time, as well as the counts of total number of searches requested and the --- number of searches actually performed. - -moretrees.dates_regrow_pollinated = true -- Enable pollination. If enabled, male trees are required for dates to grow. - -- If disabled, dates_regrow_unpollinated_percent must be non-zero for dates to regrow. -moretrees.dates_regrow_unpollinated_percent = 0 -- Percentage of female dates becoming dates without being pollinated. - -- If 0, dates_regrow_pollinated must be enabled for dates to grow. -moretrees.dates_female_percent = 57 -- Ratio of female to male trees - tune this to improve # of generated trees that actually bear fruit - -- ~57% gives near optimal results for groups of 3 random trees, while it is only slightly suboptimal - -- for groups of 2 and 4 random trees (~2% less fruit than optimal). - -- Optimal values per group size: 2: 50%, 3: 57.78%, 4: 63%, 5: 66.9%, 6: 69.9%, [...], 12: 79.8% - -- So 57% is optimal for small groups of trees. As larger groups have more female palms anyway, a - -- less than optimal proportion of female to male trees is not a problem. -moretrees.dates_pollination_distance = 120 -moretrees.dates_blossom_search_time_treshold = 1000 -- If average male blossom search time (in microseconds) exceeds this, start limiting the search load. -moretrees.dates_blossom_search_iload = 10 -- Inverse fraction of CPU time that male blossom searching search may consume. - -- As searching a large area (radius: dates_pollination_distance/3 per attempt) can cause lag, - -- this limits the search frequency server-wide so that the impact on server lag is minimised - -- For personal servers, this can be set lower, or even to 1 or 0 (0 disables load limiting). - -- Obtain the current average search time using /dates_stats -moretrees.dates_flower_interval = 59 -moretrees.dates_flower_chance = 181 -moretrees.dates_grow_interval = 2 * moretrees.dates_flower_interval * moretrees.dates_flower_chance - -- As date palms have a high yield, don't grow dates too fast - -- The actual interval will vary randomly between 67% and 133% of this value. - -- 2 * 59 * 181 ~ 6 hours. So by default flowers become dates in about one (human) day. -moretrees.dates_item_drop_ichance = 10 -- inverse probability of ripe dates dropping as items (instead of disappearing) - --- Sapling settings - -moretrees.sapling_interval = 100 -moretrees.sapling_chance = 5 - --- If this variable is set to true, drop leaves out as entities during leaf --- decay, rather than just disappearing them. - -moretrees.decay_leaves_as_items = false diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua index 9196852f..6982a0d2 100644 --- a/mods/moretrees/init.lua +++ b/mods/moretrees/init.lua @@ -15,37 +15,41 @@ moretrees = {} -minetest.override_item("default:sapling", { - description = "Sapling" -}) +local S = minetest.get_translator("moretrees") -minetest.override_item("default:tree", { - description = "Tree" -}) +if minetest.get_modpath("default") then + minetest.override_item("default:sapling", { + description = S("Sapling") + }) -minetest.override_item("default:wood", { - description = "Wooden Planks" -}) + minetest.override_item("default:tree", { + description = S("Tree") + }) -minetest.override_item("default:leaves", { - description = "Leaves" -}) + minetest.override_item("default:wood", { + description = S("Wooden Planks") + }) -minetest.override_item("default:fence_wood", { - description = "Wooden Fence" -}) + minetest.override_item("default:leaves", { + description = S("Leaves") + }) -minetest.override_item("default:fence_rail_wood", { - description = "Wooden Fence Rail" -}) + minetest.override_item("default:fence_wood", { + description = S("Wooden Fence") + }) + + minetest.override_item("default:fence_rail_wood", { + description = S("Wooden Fence Rail") + }) +end if minetest.get_modpath("doors") then minetest.override_item("doors:gate_wood_closed", { - description = "Wooden Fence Gate" + description = S("Wooden Fence Gate") }) minetest.override_item("doors:gate_wood_open", { - description = "Wooden Fence Gate" + description = S("Wooden Fence Gate") }) end @@ -55,13 +59,27 @@ end local worldpath=minetest.get_worldpath() local modpath=minetest.get_modpath("moretrees") -dofile(modpath.."/default_settings.txt") +dofile(modpath.."/settings.lua") if io.open(worldpath.."/moretrees_settings.txt","r") then io.close() dofile(worldpath.."/moretrees_settings.txt") end +-- Validate that if ethereal exists, that it's version is greater than 20220424. +-- Lower versions of ethereal clear registered biomes and decorations during +-- initialization which results in lost content from this mod (and others) +-- depending on where they are in the mod load order. +minetest.register_on_mods_loaded(function() + if minetest.global_exists("ethereal") then + local ethereal_ver = tonumber(ethereal.version) + if (ethereal_ver and ethereal_ver < 20220424) then + error("[moretrees] The version of ethereal detected can result " .. + "in parts of this mod and others disappearing due to mod " .. + "load order. Please update ethereal."); + end + end +end) -- infinite stacks checking @@ -75,10 +93,10 @@ end -- tables, load other files moretrees.cutting_tools = { - "default:axe_bronze", - "default:axe_diamond", "default:axe_mese", - "default:axe_steel", + xcompat.materials.axe_steel, + xcompat.materials.axe_diamond, + xcompat.materials.axe_bronze, "glooptest:axe_alatro", "glooptest:axe_arol", "moreores:axe_mithril", @@ -95,111 +113,103 @@ dofile(modpath.."/saplings.lua") dofile(modpath.."/crafts.lua") -- tree spawning setup +moretrees.spawn_beech_object = moretrees.beech_model +moretrees.spawn_apple_tree_object = moretrees.apple_tree_model +moretrees.spawn_oak_object = moretrees.oak_model +moretrees.spawn_sequoia_object = moretrees.sequoia_model +moretrees.spawn_palm_object = moretrees.palm_model +moretrees.spawn_date_palm_object = moretrees.date_palm_model +moretrees.spawn_cedar_object = moretrees.cedar_model +moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model +moretrees.spawn_willow_object = moretrees.willow_model +moretrees.spawn_birch_object = "moretrees.grow_birch" +moretrees.spawn_spruce_object = "moretrees.grow_spruce" +moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" +moretrees.spawn_fir_object = "moretrees.grow_fir" +moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" +moretrees.spawn_poplar_object = moretrees.poplar_model +moretrees.spawn_poplar_small_object = moretrees.poplar_small_model -if moretrees.spawn_saplings then - moretrees.spawn_beech_object = "moretrees:beech_sapling_ongen" - moretrees.spawn_apple_tree_object = "moretrees:apple_tree_sapling_ongen" - moretrees.spawn_oak_object = "moretrees:oak_sapling_ongen" - moretrees.spawn_sequoia_object = "moretrees:sequoia_sapling_ongen" - moretrees.spawn_palm_object = "moretrees:palm_sapling_ongen" - moretrees.spawn_date_palm_object = "moretrees:date_palm_sapling_ongen" - moretrees.spawn_cedar_object = "moretrees:cedar_sapling_ongen" - moretrees.spawn_rubber_tree_object = "moretrees:rubber_tree_sapling_ongen" - moretrees.spawn_willow_object = "moretrees:willow_sapling_ongen" - moretrees.spawn_birch_object = "moretrees:birch_sapling_ongen" - moretrees.spawn_spruce_object = "moretrees:spruce_sapling_ongen" - moretrees.spawn_jungletree_object = "moretrees:jungletree_sapling_ongen" - moretrees.spawn_fir_object = "moretrees:fir_sapling_ongen" - moretrees.spawn_fir_snow_object = "snow:sapling_pine" - moretrees.spawn_poplar_object = "moretrees:poplar_sapling_ongen" - moretrees.spawn_poplar_small_object = "moretrees:poplar_small_sapling_ongen" -else - moretrees.spawn_beech_object = moretrees.beech_model - moretrees.spawn_apple_tree_object = moretrees.apple_tree_model - moretrees.spawn_oak_object = moretrees.oak_model - moretrees.spawn_sequoia_object = moretrees.sequoia_model - moretrees.spawn_palm_object = moretrees.palm_model - moretrees.spawn_date_palm_object = moretrees.date_palm_model - moretrees.spawn_cedar_object = moretrees.cedar_model - moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model - moretrees.spawn_willow_object = moretrees.willow_model - moretrees.spawn_birch_object = "moretrees.grow_birch" - moretrees.spawn_spruce_object = "moretrees.grow_spruce" - moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" - moretrees.spawn_fir_object = "moretrees.grow_fir" - moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" - moretrees.spawn_poplar_object = moretrees.poplar_model - moretrees.spawn_poplar_small_object = moretrees.poplar_small_model +local deco_ids = {} + +function translate_biome_defs(def, treename, index) + if not index then index = 1 end + local deco_def = { + name = treename .. "_" .. index, + deco_type = "simple", + place_on = def.place_on, + sidelen = 16, + fill_ratio = def.fill_ratio or 0.001, + --biomes eventually? + y_min = def.min_elevation, + y_max = def.max_elevation, + spawn_by = def.spawn_by, + num_spawn_by = def.num_spawn_by, + decoration = "moretrees:"..treename.."_sapling_ongen" + } + + deco_ids[#deco_ids+1] = treename .. ("_" .. index or "_1") + + return deco_def end -if moretrees.enable_beech then - biome_lib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) +minetest.register_decoration(translate_biome_defs(moretrees.beech_biome, "beech")) +minetest.register_decoration(translate_biome_defs(moretrees.apple_tree_biome, "apple_tree")) +minetest.register_decoration(translate_biome_defs(moretrees.oak_biome, "oak")) +minetest.register_decoration(translate_biome_defs(moretrees.sequoia_biome, "sequoia")) +minetest.register_decoration(translate_biome_defs(moretrees.palm_biome, "palm")) +minetest.register_decoration(translate_biome_defs(moretrees.date_palm_biome, "date_palm", 1)) +minetest.register_decoration(translate_biome_defs(moretrees.date_palm_biome_2, "date_palm", 2)) +minetest.register_decoration(translate_biome_defs(moretrees.cedar_biome, "cedar")) +minetest.register_decoration(translate_biome_defs(moretrees.rubber_tree_biome, "rubber_tree")) +minetest.register_decoration(translate_biome_defs(moretrees.willow_biome, "willow")) +minetest.register_decoration(translate_biome_defs(moretrees.birch_biome, "birch")) +minetest.register_decoration(translate_biome_defs(moretrees.spruce_biome, "spruce")) +if minetest.get_modpath("default") then + minetest.register_decoration(translate_biome_defs(moretrees.jungletree_biome, "jungletree")) end - -if moretrees.enable_apple_tree then - biome_lib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) +minetest.register_decoration(translate_biome_defs(moretrees.fir_biome, "fir", 1)) +if minetest.get_modpath("snow") then + minetest.register_decoration(translate_biome_defs(moretrees.fir_biome_snow, "fir", 2)) end +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome, "poplar", 1)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome_2, "poplar", 2)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome_3, "poplar", 3)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_small_biome, "poplar_small", 4)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_small_biome_2, "poplar_small", 5)) -if moretrees.enable_oak then - biome_lib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) -end - -if moretrees.enable_sequoia then - biome_lib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) -end - -if moretrees.enable_palm then - biome_lib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) -end - -if moretrees.enable_date_palm then - biome_lib:register_generate_plant(moretrees.date_palm_biome, moretrees.spawn_date_palm_object) - biome_lib:register_generate_plant(moretrees.date_palm_biome_2, moretrees.spawn_date_palm_object) -end - -if moretrees.enable_cedar then - biome_lib:register_generate_plant(moretrees.cedar_biome, moretrees.spawn_cedar_object) -end - -if moretrees.enable_rubber_tree then - biome_lib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) -end - -if moretrees.enable_willow then - biome_lib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) -end - -if moretrees.enable_birch then - biome_lib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) -end - -if moretrees.enable_spruce then - biome_lib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) -end - -if moretrees.enable_jungle_tree then - biome_lib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) -end - -if moretrees.enable_fir then - biome_lib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) - if minetest.get_modpath("snow") then - biome_lib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +minetest.register_on_mods_loaded(function() + for k, v in pairs(deco_ids) do + deco_ids[k] = minetest.get_decoration_id(v) end -end + minetest.set_gen_notify("decoration", deco_ids) +end) -if moretrees.enable_poplar then - biome_lib:register_generate_plant(moretrees.poplar_biome, moretrees.spawn_poplar_object) - biome_lib:register_generate_plant(moretrees.poplar_biome_2, moretrees.spawn_poplar_object) - biome_lib:register_generate_plant(moretrees.poplar_biome_3, moretrees.spawn_poplar_object) - biome_lib:register_generate_plant(moretrees.poplar_small_biome, moretrees.spawn_poplar_small_object) - biome_lib:register_generate_plant(moretrees.poplar_small_biome_2, moretrees.spawn_poplar_small_object) -end +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + for _, id in pairs(deco_ids) do + local deco_locations = g["decoration#" .. id] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + local timer = minetest.get_node_timer({x=pos.x, y=pos.y+1, z=pos.z}) + timer:start(math.random(2,10)) + end +end) -- Code to spawn a birch tree function moretrees.grow_birch(pos) - minetest.swap_node(pos, biome_lib.air) + minetest.swap_node(pos, {name = "air"}) if math.random(1,2) == 1 then minetest.spawn_tree(pos, moretrees.birch_model1) else @@ -210,7 +220,7 @@ end -- Code to spawn a spruce tree function moretrees.grow_spruce(pos) - minetest.swap_node(pos, biome_lib.air) + minetest.swap_node(pos, {name = "air"}) if math.random(1,2) == 1 then minetest.spawn_tree(pos, moretrees.spruce_model1) else @@ -225,6 +235,7 @@ moretrees.jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf moretrees.jt_rules_b1 = "[-Ff&f][+Ff&f]B" moretrees.jt_axiom2 = "FFFFFA" +-- luacheck: no max line length moretrees.jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A" moretrees.jt_rules_b2 = "[-FFf&ff][+FFf&ff]B" @@ -264,10 +275,13 @@ function moretrees.grow_jungletree(pos) moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 end - minetest.swap_node(pos, biome_lib.air) - local leaves = minetest.find_nodes_in_area({x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, "default:leaves") + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, + xcompat.materials.apple_leaves + ) for leaf in ipairs(leaves) do - minetest.swap_node(leaves[leaf], biome_lib.air) + minetest.swap_node(leaves[leaf], {name = "air"}) end minetest.spawn_tree(pos, moretrees.jungletree_model) end @@ -291,10 +305,14 @@ function moretrees.grow_fir(pos) moretrees.fir_model.iterations = 7 moretrees.fir_model.random_level = 5 - minetest.swap_node(pos, biome_lib.air) - local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x, y = pos.y, z = pos.z}, + {x = pos.x, y = pos.y+5, z = pos.z}, + xcompat.materials.apple_leaves + ) for leaf in ipairs(leaves) do - minetest.swap_node(leaves[leaf], biome_lib.air) + minetest.swap_node(leaves[leaf], {name = "air"}) end minetest.spawn_tree(pos,moretrees.fir_model) end @@ -318,12 +336,29 @@ function moretrees.grow_fir_snow(pos) moretrees.fir_model.iterations = 2 moretrees.fir_model.random_level = 2 - minetest.swap_node(pos, biome_lib.air) - local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x, y = pos.y, z = pos.z}, + {x = pos.x, y = pos.y+5, z = pos.z}, + xcompat.materials.apple_leaves + ) for leaf in ipairs(leaves) do - minetest.swap_node(leaves[leaf], biome_lib.air) + minetest.swap_node(leaves[leaf], {name = "air"}) end minetest.spawn_tree(pos,moretrees.fir_model) end -print("[Moretrees] Loaded (2013-02-11)") +if moretrees.grow_legacy_saplings then + minetest.register_lbm({ + name = "moretrees:grow_ongen_saplings", + label = "Grow legacy ongen saplings", + nodenames = {"group:moretrees_ongen"}, + run_at_every_load = true, + action = function(pos) + minetest.log("info", "[moretrees] Starting growth timer for legacy ongen sapling at "..minetest.pos_to_string(pos, 0)) + minetest.get_node_timer(pos):start(math.random(2, 10)) + end + }) +end + +minetest.log("info", "[moretrees] Loading done") diff --git a/mods/moretrees/locale/moretrees.de.tr b/mods/moretrees/locale/moretrees.de.tr index 7cbd17c2..64c5ca33 100644 --- a/mods/moretrees/locale/moretrees.de.tr +++ b/mods/moretrees/locale/moretrees.de.tr @@ -61,7 +61,7 @@ Birch Tree Fence=Birkenholz-Zaun Birch Tree Fence Gate=Birkenholz-Tor Birch Tree Fence Rail=Birkenholz-Schiene Birch Tree Leaves=Birkenlaub -Birch Tree Planks=Birkebretter +Birch Tree Planks=Birkenbretter Birch Tree Planks Slab=Birkenholzplatte Birch Tree Planks Stair=Birkeholzstufe Birch Tree Sapling=Birkensetzling @@ -209,3 +209,12 @@ Willow Tree Trunk=Weidenstamm Willow Tree Trunk Slab=Weidenstammplatte Willow Tree Trunk Stair=Weidenstammstufe Yellow=gelb + +# init.lua +Sapling=Setzling +Tree=Baum +Wooden Planks=Holzbretter +Leaves=Blätter +Wooden Fence=Holzzaun +Wooden Fence Rail=Holzschiene +Wooden Fence Gate=Holztor diff --git a/mods/moretrees/locale/moretrees.es.tr b/mods/moretrees/locale/moretrees.es.tr index ccdb42a2..e758392b 100644 --- a/mods/moretrees/locale/moretrees.es.tr +++ b/mods/moretrees/locale/moretrees.es.tr @@ -1,11 +1,11 @@ # textdomain: moretrees -# Translation by Carlos Barraza +# Translation by Carlos Barraza, improvements by David Leal. ### cocos_palm.lua ### Coconut=Coco -Coconut Flower= +Coconut Flower=Flor de Coco ### crafts.lua ### @@ -17,8 +17,8 @@ Date & nut snack=Datilera y Nueces Date-nut cake=Pastel de Datilera Date-nut cake batter=Pasta de torta de Datilera Date-nut energy bar=Barra energetica de Datilera -Raw Coconut=Coco crudo -Roasted Cedar Cone Nuts=Coco de Alamo Tostado +Raw Coconut=Coco Crudo +Roasted Cedar Cone Nuts=Coco de Álamo Tostado Roasted Fir Cone Nuts=Cono de Abeto Tostado Roasted Spruce Cone Nuts=Cono de Picea Tostado @@ -30,182 +30,191 @@ Dates=Datilera ### node_defs.lua ### -@1 (fast growth)= +@1 (fast growth)=@1 (crecimiento rápido) Acorn=Bellota -Apple Tree= -Apple Tree Fence= -Apple Tree Fence Gate= -Apple Tree Fence Rail= -Apple Tree Leaves=Hojas de Arbol de Manzana -Apple Tree Planks=Madera de Arbol de Manzana -Apple Tree Planks Slab= -Apple Tree Planks Stair= -Apple Tree Sapling=Retoño de Arbol de Manzana -Apple Tree Trunk=Tronco de Arbol de Manzana -Apple Tree Trunk Slab= -Apple Tree Trunk Stair= -Beech Tree= -Beech Tree Fence= -Beech Tree Fence Gate= -Beech Tree Fence Rail= +Apple Tree=Árbol de manzana +Apple Tree Fence=Valla de manzano +Apple Tree Fence Gate=Puerta de Valla de Manzano +Apple Tree Fence Rail=Riel de Valla de Manzano +Apple Tree Leaves=Hojas de Árbol de Manzana +Apple Tree Planks=Madera de Árbol de Manzana +Apple Tree Planks Slab=Losa de Tablones de Manzano +Apple Tree Planks Stair=Escalera de Tablones de Manzano +Apple Tree Sapling=Retoño de Árbol de Manzana +Apple Tree Trunk=Tronco de Árbol de Manzana +Apple Tree Trunk Slab=Losa de Tronco de Manzano +Apple Tree Trunk Stair=Escalera de Tronco de Manzano +Beech Tree=Haya +Beech Tree Fence=Valla de Haya +Beech Tree Fence Gate=Puerta de Valla de Haya +Beech Tree Fence Rail=Riel de Valla de Haya Beech Tree Leaves=Hojas de Arbol de Haya Beech Tree Planks=Madera de Arbol de Haya -Beech Tree Planks Slab= -Beech Tree Planks Stair= -Beech Tree Sapling=Retoño de Arbol de Haya -Beech Tree Trunk=Tronco de Arbol de Haya -Beech Tree Trunk Slab= -Beech Tree Trunk Stair= -Birch Tree= -Birch Tree Fence= -Birch Tree Fence Gate= -Birch Tree Fence Rail= +Beech Tree Planks Slab=Losa de Tablones de Haya +Beech Tree Planks Stair=Escalera de Tablones de Haya +Beech Tree Sapling=Retoño de Árbol de Haya +Beech Tree Trunk=Tronco de Árbol de Haya +Beech Tree Trunk Slab=Losa de Tronco de Haya +Beech Tree Trunk Stair=Escalera de Tronco de Haya +Birch Tree=Abedul +Birch Tree Fence=Valla de Abedul +Birch Tree Fence Gate=Puerta de Valla de Abedul +Birch Tree Fence Rail=Riel de Valla de Abedul Birch Tree Leaves=Hojas de Arbol de Abedul Birch Tree Planks=Madera de Arbol de Abedul -Birch Tree Planks Slab= -Birch Tree Planks Stair= -Birch Tree Sapling=Retoño de Arbol de Abedul -Birch Tree Trunk=Tronco de Arbol de Abedul -Birch Tree Trunk Slab= -Birch Tree Trunk Stair= -Cedar Cone=Coco de Alamo -Cedar Tree= -Cedar Tree Fence= -Cedar Tree Fence Gate= -Cedar Tree Fence Rail= -Cedar Tree Leaves=Hojas de Arbol de Cedro -Cedar Tree Planks=Madera de Arbol de Cedro -Cedar Tree Planks Slab= -Cedar Tree Planks Stair= -Cedar Tree Sapling=Retoño de Arbol de Cedro -Cedar Tree Trunk=Tronco de Arbol de Cedro -Cedar Tree Trunk Slab= -Cedar Tree Trunk Stair= -Date Palm Tree= -Date Palm Tree Fence= -Date Palm Tree Fence Gate= -Date Palm Tree Fence Rail= -Date Palm Tree Leaves= +Birch Tree Planks Slab=Losa de Tablones de Abedul +Birch Tree Planks Stair=Escalera de Tablones de Abedul +Birch Tree Sapling=Retoño de Árbol de Abedul +Birch Tree Trunk=Tronco de Árbol de Abedul +Birch Tree Trunk Slab=Losa de Tronco de Abedul +Birch Tree Trunk Stair=Escalera de Tronco de Abedul +Cedar Cone=Coco de Álamo +Cedar Tree=Árbol de Cedro +Cedar Tree Fence=Valla de Árbol de Cedro +Cedar Tree Fence Gate=Puerta de Valla de Árbol de Cedro +Cedar Tree Fence Rail=Riel de Valla de Árbol de Cedro +Cedar Tree Leaves=Hojas de Árbol de Cedro +Cedar Tree Planks=Madera de Árbol de Cedro +Cedar Tree Planks Slab=Losa de Tablones de Árbol de Cedro +Cedar Tree Planks Stair=Escalera de Tablones de Árbol de Cedro +Cedar Tree Sapling=Retoño de Árbol de Cedro +Cedar Tree Trunk=Tronco de Árbol de Cedro +Cedar Tree Trunk Slab=Losa de Tronco de Árbol de Cedro +Cedar Tree Trunk Stair=Escalera de Tronco de Árbol de Cedro +Date Palm Tree=Palmera Datilera +Date Palm Tree Fence=Valla de Palmera Datilera +Date Palm Tree Fence Gate=Puerta de Valla de Palmera Datilera +Date Palm Tree Fence Rail=Riel de Valla de Palmera Datilera +Date Palm Tree Leaves=Hojas de Palmera Datilera Date Palm Tree Planks=Madera de Palmera Datilera -Date Palm Tree Planks Slab= -Date Palm Tree Planks Stair= -Date Palm Tree Sapling= +Date Palm Tree Planks Slab=Losa de Tablones de Palmera Datilera +Date Palm Tree Planks Stair=Escalera de Tablones de Palmera Datilera +Date Palm Tree Sapling=Retoño de Palmera Datilera Date Palm Tree Trunk=Tronco de Palmera Datilera -Date Palm Tree Trunk Slab= -Date Palm Tree Trunk Stair= -Douglas Fir= -Douglas Fir Fence= -Douglas Fir Fence Gate= -Douglas Fir Fence Rail= -Douglas Fir Leaves=Hojas de Arbol de Abeto de Douglas -Douglas Fir Leaves (Bright)=Hojas de Arbol de Abeto de Douglas (Brillante) -Douglas Fir Planks=Madera de Arbol de Abeto de Douglas -Douglas Fir Planks Slab= -Douglas Fir Planks Stair= -Douglas Fir Sapling=Retoño de Arbol de Abeto de Douglas -Douglas Fir Trunk=Tronco de Arbol de Abeto de Douglas -Douglas Fir Trunk Slab= -Douglas Fir Trunk Stair= +Date Palm Tree Trunk Slab=Losa de Tronco de Palmera Datilera +Date Palm Tree Trunk Stair=Escalera de Tronco de Palmera Datilera +Douglas Fir=Árbol de Abeto de Douglas +Douglas Fir Fence=Valla de Árbol de Abeto de Douglas +Douglas Fir Fence Gate=Puerta de Valla de Árbol de Abeto de Douglas +Douglas Fir Fence Rail=Riel de Valla de Árbol de Abeto de Douglas +Douglas Fir Leaves=Hojas de Árbol de Abeto de Douglas +Douglas Fir Leaves (Bright)=Hojas de Árbol de Abeto de Douglas (Brillante) +Douglas Fir Planks=Madera de Árbol de Abeto de Douglas +Douglas Fir Planks Slab=Losa de Tablones de Árbol de Abeto de Douglas +Douglas Fir Planks Stair=Escalera de Tablones de Árbol de Abeto de Douglas +Douglas Fir Sapling=Retoño de Árbol de Abeto de Douglas +Douglas Fir Trunk=Tronco de Árbol de Abeto de Douglas +Douglas Fir Trunk Slab=Losa de Tronco de Árbol de Abeto de Douglas +Douglas Fir Trunk Stair=Escalera de Tronco de Árbol de Abeto de Douglas Fir Cone=Coco de Abeto -Giant Sequoia= -Giant Sequoia Fence= -Giant Sequoia Fence Gate= -Giant Sequoia Fence Rail= -Giant Sequoia Leaves=Hojas de Sequoia Gigante -Giant Sequoia Planks=Madera de Sequoia Gigante -Giant Sequoia Planks Slab= -Giant Sequoia Planks Stair= -Giant Sequoia Sapling=Retoño de Arbol de Sequoia Gigante -Giant Sequoia Trunk=Tronco de Sequoia Gigante -Giant Sequoia Trunk Slab= -Giant Sequoia Trunk Stair= -Jungle Tree=Tronco de Arbol de Arbol de la Selva -Jungle Tree Fence= -Jungle Tree Fence Gate= -Jungle Tree Fence Rail= -Jungle Tree Leaves=Hojas de Arbol de la Selva -Jungle Tree Leaves (@1)=Hojas de Arbol de la Selva (@1) -Jungle Tree Planks= -Jungle Tree Planks Slab= -Jungle Tree Planks Stair= -Jungle Tree Sapling= -Jungle Tree Trunk= -Jungle Tree Trunk Slab= -Jungle Tree Trunk Stair= -Oak Tree= -Oak Tree Fence= -Oak Tree Fence Gate= -Oak Tree Fence Rail= -Oak Tree Leaves=Hojas de Arbol de Roble -Oak Tree Planks=Madera de Arbol de Roble -Oak Tree Planks Slab= -Oak Tree Planks Stair= -Oak Tree Sapling=Retoño de Arbol de Roble -Oak Tree Trunk=Tronco de Arbol de Roble -Oak Tree Trunk Slab= -Oak Tree Trunk Stair= -Palm Tree= -Palm Tree Fence= -Palm Tree Fence Gate= -Palm Tree Fence Rail= +Giant Sequoia=Secuoya Gigante +Giant Sequoia Fence=Valla de Secuoya Gigante +Giant Sequoia Fence Gate=Puerta de Valla de Secuoya Gigante +Giant Sequoia Fence Rail=Riel de Valla de Secuoya Gigante +Giant Sequoia Leaves=Hojas de Secuoya Gigante +Giant Sequoia Planks=Madera de Secuoya Gigante +Giant Sequoia Planks Slab=Losa de Tablones de Secuoya Gigante +Giant Sequoia Planks Stair=Escalera de Tablones de Secuoya Gigante +Giant Sequoia Sapling=Retoño de Árbol de Secuoya Gigante +Giant Sequoia Trunk=Tronco de Secuoya Gigante +Giant Sequoia Trunk Slab=Losa de Tronco de Secuoya Gigante +Giant Sequoia Trunk Stair=Escalera de Tronco de Secuoya Gigante +Jungle Tree=Árbol de la Selva +Jungle Tree Fence=Valla de Árbol de la Selva +Jungle Tree Fence Gate=Puerta de Valla de Árbol de la Selva +Jungle Tree Fence Rail=Riel de Valla de Árbol de la Selva +Jungle Tree Leaves=Hojas de Árbol de la Selva +Jungle Tree Leaves (@1)=Hojas de Árbol de la Selva (@1) +Jungle Tree Planks=Madera de Árbol de la Selva +Jungle Tree Planks Slab=Losa de Tablones de Árbol de la Selva +Jungle Tree Planks Stair=Escalera de Tablones de Árbol de la Selva +Jungle Tree Sapling=Retoño de Árbol de la Selva +Jungle Tree Trunk=Tronco de Árbol de Árbol de la Selva +Jungle Tree Trunk Slab=Losa de Tronco de Árbol de la Selva +Jungle Tree Trunk Stair=Escalera de Tronco de Árbol de la Selva +Oak Tree=Árbol de Roble +Oak Tree Fence=Valla de Árbol de Roble +Oak Tree Fence Gate=Puerta de Valla de Árbol de Roble +Oak Tree Fence Rail=Riel de Valla de Árbol de Roble +Oak Tree Leaves=Hojas de Árbol de Roble +Oak Tree Planks=Madera de Árbol de Roble +Oak Tree Planks Slab=Losa de Tablones de Árbol de Roble +Oak Tree Planks Stair=Escalera de Tablones de Árbol de Roble +Oak Tree Sapling=Retoño de Árbol de Roble +Oak Tree Trunk=Tronco de Árbol de Roble +Oak Tree Trunk Slab=Losa de Tronco de Árbol de Roble +Oak Tree Trunk Stair=Escalera de Tronco de Árbol de Roble +Palm Tree=Palmera +Palm Tree Fence=Valla de Palmera +Palm Tree Fence Gate=Puerta de Valla de Palmera +Palm Tree Fence Rail=Riel de Valla de Palmera Palm Tree Leaves=Hojas de Palmera Palm Tree Planks=Madera de Palmera -Palm Tree Planks Slab= -Palm Tree Planks Stair= +Palm Tree Planks Slab=Losa de Tablones de Palmera +Palm Tree Planks Stair=Escalera de Tablones de Palmera Palm Tree Sapling=Retoño de Palmera Palm Tree Trunk=Tronco de Palmera -Palm Tree Trunk Slab= -Palm Tree Trunk Stair= -Poplar Tree= -Poplar Tree Fence= -Poplar Tree Fence Gate= -Poplar Tree Fence Rail= +Palm Tree Trunk Slab=Losa de Troncos de Palmera +Palm Tree Trunk Stair=Escalera de Troncos de Palmera +Poplar Tree=Árbol de Alamo +Poplar Tree Fence=Valla de Árbol de Alamo +Poplar Tree Fence Gate=Puerta de Valla de Árbol de Alamo +Poplar Tree Fence Rail=Riel de Valla de Árbol de Alamo Poplar Tree Leaves=Hojas de Arbol de Alamo -Poplar Tree Planks=Madera de Arbol de Alamo -Poplar Tree Planks Slab= -Poplar Tree Planks Stair= -Poplar Tree Sapling=Retoño de Arbol de Alamo -Poplar Tree Trunk=Tronco de Arbol de Alamo -Poplar Tree Trunk Slab= -Poplar Tree Trunk Stair= -Red=Roja -Rubber Tree= -Rubber Tree Fence= -Rubber Tree Fence Gate= -Rubber Tree Fence Rail= -Rubber Tree Leaves=Hojas de Arbol de Arbol de Goma -Rubber Tree Planks=Madera de Arbol de Arbol de Goma -Rubber Tree Planks Slab= -Rubber Tree Planks Stair= -Rubber Tree Sapling=Retoño de Arbol de Arbol de Goma -Rubber Tree Trunk=Tronco de Arbol de Arbol de Goma -Rubber Tree Trunk (Empty)=Tronco de Arbol de Goma (Vacio) -Rubber Tree Trunk Slab= -Rubber Tree Trunk Stair= -Small poplar Tree Sapling= +Poplar Tree Planks=Madera de Árbol de Alamo +Poplar Tree Planks Slab=Losa de Tablones de Árbol de Alamo +Poplar Tree Planks Stair=Escalera de Tablones de Árbol de Alamo +Poplar Tree Sapling=Retoño de Árbol de Alamo +Poplar Tree Trunk=Tronco de Árbol de Alamo +Poplar Tree Trunk Slab=Losa de Tronco de Árbol de Alamo +Poplar Tree Trunk Stair=Escalera de Tronco de Árbol de Alamo +Red=Rojo +Rubber Tree=Árbol del Caucho +Rubber Tree Fence=Valla de Árbol del Caucho +Rubber Tree Fence Gate=Puerta de Valla de Árbol del Caucho +Rubber Tree Fence Rail=Riel de Valla de Árbol del Caucho +Rubber Tree Leaves=Hojas de Árbol de Árbol del Caucho +Rubber Tree Planks=Madera de Árbol de Árbol del Caucho +Rubber Tree Planks Slab=Losa de Tablones de Árbol del Caucho +Rubber Tree Planks Stair=Escalera de Tablones de Árbol del Caucho +Rubber Tree Sapling=Retoño de Árbol de Árbol del Caucho +Rubber Tree Trunk=Tronco de Árbol de Árbol del Caucho +Rubber Tree Trunk (Empty)=Tronco de Árbol del Caucho (Vacío) +Rubber Tree Trunk Slab=Losa de Tronco de Árbol del Caucho +Rubber Tree Trunk Stair=Escalera de Tronco de Árbol del Caucho +Small poplar Tree Sapling=Pequeño Retoño de Álamo Spruce Cone=Coco de Picea -Spruce Tree= -Spruce Tree Fence= -Spruce Tree Fence Gate= -Spruce Tree Fence Rail= -Spruce Tree Leaves=Hojas de Arbol de Abeto -Spruce Tree Planks=Madera de Arbol de Abeto -Spruce Tree Planks Slab= -Spruce Tree Planks Stair= -Spruce Tree Sapling=Retoño de Arbol de Abeto -Spruce Tree Trunk=Tronco de Arbol de Abeto -Spruce Tree Trunk Slab= -Spruce Tree Trunk Stair= -Willow Tree= -Willow Tree Fence= -Willow Tree Fence Gate= -Willow Tree Fence Rail= -Willow Tree Leaves=Hojas de Arbol de Sauce -Willow Tree Planks=Madera de Arbol de Sauce -Willow Tree Planks Slab= -Willow Tree Planks Stair= -Willow Tree Sapling=Retoño de Arbol de Sauce -Willow Tree Trunk=Tronco de Arbol de Sauce -Willow Tree Trunk Slab= -Willow Tree Trunk Stair= -Yellow=Amarilla +Spruce Tree=Árbol de Abeto +Spruce Tree Fence=Valla de Árbol de Abeto +Spruce Tree Fence Gate=Puerta de Valla de Árbol de Abeto +Spruce Tree Fence Rail=Riel de Valla de Árbol de Abeto +Spruce Tree Leaves=Hojas de Árbol de Abeto +Spruce Tree Planks=Madera de Árbol de Abeto +Spruce Tree Planks Slab=Losa de Tablones de Árbol de Abeto +Spruce Tree Planks Stair=Escalera de Tablones de Árbol de Abeto +Spruce Tree Sapling=Retoño de Árbol de Abeto +Spruce Tree Trunk=Tronco de Árbol de Abeto +Spruce Tree Trunk Slab=Losa de Tronco de Árbol de Abeto +Spruce Tree Trunk Stair=Escalera de Tronco de Árbol de Abeto +Willow Tree=Árbol de Sauce +Willow Tree Fence=Valla de Árbol de Sauce +Willow Tree Fence Gate=Puerta de Valla de Árbol de Sauce +Willow Tree Fence Rail=Riel de Valla de Árbol de Sauce +Willow Tree Leaves=Hojas de Árbol de Sauce +Willow Tree Planks=Madera de Árbol de Sauce +Willow Tree Planks Slab=Losa de Tablones de Árbol de Sauce +Willow Tree Planks Stair=Escalera de Tablones de Árbol de Sauce +Willow Tree Sapling=Retoño de Árbol de Sauce +Willow Tree Trunk=Tronco de Árbol de Sauce +Willow Tree Trunk Slab=Losa de Tronco de Árbol de Sauce +Willow Tree Trunk Stair=Escalera de Tronco de Árbol de Sauce +Yellow=Amarillo + +# init.lua +Sapling=Retoño +Tree=Árbol +Wooden Planks=Tablones +Leaves=Hojas +Wooden Fence=Valla +Wooden Fence Rail=Riel de Valla +Wooden Fence Gate=Puerta de Valla diff --git a/mods/moretrees/locale/moretrees.fr.tr b/mods/moretrees/locale/moretrees.fr.tr index 09058f34..d03d7abe 100644 --- a/mods/moretrees/locale/moretrees.fr.tr +++ b/mods/moretrees/locale/moretrees.fr.tr @@ -209,3 +209,12 @@ Willow Tree Trunk=Tronc d'arbre de saule Willow Tree Trunk Slab=Dalle en tronc de saule Willow Tree Trunk Stair=Escalier en tronc de saule Yellow=jaune + +# init.lua +Sapling=Jeune Arbre +Tree=Arbre +Wooden Planks=Planches +Leaves=Feuilles +Wooden Fence=Barrière en bois +Wooden Fence Rail=Rail de clôture en bois +Wooden Fence Gate=Porte de clôture en bois diff --git a/mods/moretrees/locale/moretrees.ru.tr b/mods/moretrees/locale/moretrees.ru.tr new file mode 100644 index 00000000..fcebaa95 --- /dev/null +++ b/mods/moretrees/locale/moretrees.ru.tr @@ -0,0 +1,219 @@ +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut=Кокос +Coconut Flower=Цветок кокоса + +### crafts.lua ### + +Acorn Muffin=Маффин с желудями +Acorn Muffin batter=Тесто для маффина с желудями +Coconut Milk=Кокосовое молоко +Date=Финик +Date & nut snack=Закуска из фиников и орехов +Date-nut cake=Финиково-ореховый пирог +Date-nut cake batter=Тесто для финиково-орехового пирога +Date-nut energy bar=Финиково-ореховый батончик +Raw Coconut=Сырой кокос +Roasted Cedar Cone Nuts=Жареные кедровые орешки +Roasted Fir Cone Nuts=Жареные орешки пихты +Roasted Spruce Cone Nuts=Жареные еловые орешки + +### date_palm.lua ### + +Date Flowers=Цветки фиников +Date Stem=Стебель финика +Dates=Финики + +### node_defs.lua ### + +@1 (fast growth)=@1 (бестрый рост) +Acorn=Желудь +Apple Tree=Яблоня +Apple Tree Fence=Яблоневый забор +Apple Tree Fence Gate=Яблоневые ворота +Apple Tree Fence Rail=Яблоневые перила +Apple Tree Leaves=Листья яблони +Apple Tree Planks=Яблоневые доски +Apple Tree Planks Slab=Яблоневые доски (плита) +Apple Tree Planks Stair=Яблоневые доски (ступени) +Apple Tree Sapling=Саженец яблони +Apple Tree Trunk=Ствол яблони +Apple Tree Trunk Slab=Ствол яблони (плита) +Apple Tree Trunk Stair=Ствол яблони (ступени) +Beech Tree=Бук +Beech Tree Fence=Забор из бука +Beech Tree Fence Gate=Ворота из бука +Beech Tree Fence Rail=Перила из бука +Beech Tree Leaves=Листья бука +Beech Tree Planks=Доски из бука +Beech Tree Planks Slab=Доски из бука (плита) +Beech Tree Planks Stair=Доски из бука (ступени) +Beech Tree Sapling=Саженец бука +Beech Tree Trunk=Ствол бука +Beech Tree Trunk Slab=Ствол бука (плита) +Beech Tree Trunk Stair=Ствол бука (ступени) +Birch Tree=Береза +Birch Tree Fence=Березовый забор +Birch Tree Fence Gate=Березовые ворота +Birch Tree Fence Rail=Березовые перила +Birch Tree Leaves=Березовые листья +Birch Tree Planks=Березовые доски +Birch Tree Planks Slab=Березовые доски (плита) +Birch Tree Planks Stair=Березовые доски (ступени) +Birch Tree Sapling=Саженец березы +Birch Tree Trunk=Ствол березы +Birch Tree Trunk Slab=Ствол березы (плита) +Birch Tree Trunk Stair=Ствол березы (ступени) +Cedar Cone=Кедровая шишка +Cedar Tree=Кедр +Cedar Tree Fence=Забор из кедра +Cedar Tree Fence Gate=Ворота из кедра +Cedar Tree Fence Rail=Перила из кедра +Cedar Tree Leaves=Кедровая хвоя +Cedar Tree Planks=Доски из кедра +Cedar Tree Planks Slab=Доски из кедра (плита) +Cedar Tree Planks Stair=Доски из кедра (ступени) +Cedar Tree Sapling=Саженец кедра +Cedar Tree Trunk=Ствол кедра +Cedar Tree Trunk Slab=Ствол кедра (плита) +Cedar Tree Trunk Stair=Ствол кедра (ступени) +Date Palm Tree=Финиковая пальма +Date Palm Tree Fence=Забор из финиковой пальмы +Date Palm Tree Fence Gate=Ворота из финиковой пальмы +Date Palm Tree Fence Rail=Перила из финиковой пальмы +Date Palm Tree Leaves=Листья финиковой пальмы +Date Palm Tree Planks=Доски из финиковой пальмы +Date Palm Tree Planks Slab=Доски из финиковой пальмы (плита) +Date Palm Tree Planks Stair=Доски из финиковой пальмы (ступени) +Date Palm Tree Sapling=Саженец финиковой пальмы +Date Palm Tree Trunk=Ствол финиковой пальмы +Date Palm Tree Trunk Slab=Ствол финиковой пальмы (плита) +Date Palm Tree Trunk Stair=Ствол финиковой пальмы (ступени) +Douglas Fir=Дугласова пихта +Douglas Fir Fence=Забор из дугласовой пихты +Douglas Fir Fence Gate=Ворота из дугласовой пихты +Douglas Fir Fence Rail=Перила из дугласовой пихты +Douglas Fir Leaves=Хвоя дугласовой пихты +Douglas Fir Leaves (Bright)=Листья дугласовой пихты (яркие) +Douglas Fir Planks=Доски из дугласовой пихты +Douglas Fir Planks Slab=Доски из дугласовой пихты (плита) +Douglas Fir Planks Stair=Доски из дугласовой пихты (ступени) +Douglas Fir Sapling=Саженец дугласовой пихты +Douglas Fir Trunk=Ствол дугласовой пихты +Douglas Fir Trunk Slab=Ствол дугласовой пихты (плита) +Douglas Fir Trunk Stair=Ствол дугласовой пихты (ступени) +Fir Cone=Пихтовая шишка +Giant Sequoia=Гигантская секвойя +Giant Sequoia Fence=Забор из гигантской секвойи +Giant Sequoia Fence Gate=Ворота из гигантской секвойи +Giant Sequoia Fence Rail=Перила из гигантской секвойи +Giant Sequoia Leaves=Хвоя гигантской секвойи +Giant Sequoia Planks=Доски из гигантской секвойи +Giant Sequoia Planks Slab=Доски из гигантской секвойи (плита) +Giant Sequoia Planks Stair=Доски из гигантской секвойи (ступени) +Giant Sequoia Sapling=Саженец гигантской секвойи +Giant Sequoia Trunk=Ствол гигантской секвойи +Giant Sequoia Trunk Slab=Ствол гигантской секвойи (плита) +Giant Sequoia Trunk Stair=Ствол гигантской секвойи (ступени) +Jungle Tree=Тропическое дерево +Jungle Tree Fence=Забор из тропического дерева +Jungle Tree Fence Gate=Ворота из тропического дерева +Jungle Tree Fence Rail=Перила из тропического дерева +Jungle Tree Leaves=Листья тропического дерева +Jungle Tree Leaves (@1)=Листья тропического дерева (@1) +Jungle Tree Planks=Доски из тропического дерева +Jungle Tree Planks Slab=Доски из тропического дерева (плита) +Jungle Tree Planks Stair=Доски из тропического дерева (ступени) +Jungle Tree Sapling=Саженец тропического дерева +Jungle Tree Trunk=Ствол тропического дерева +Jungle Tree Trunk Slab=Ствол тропического дерева (плита) +Jungle Tree Trunk Stair=Ствол тропического дерева (ступени) +Oak Tree=Дуб +Oak Tree Fence=Дубовый забор +Oak Tree Fence Gate=Дубовые ворота +Oak Tree Fence Rail=Дубовые перила +Oak Tree Leaves=Листья дуба +Oak Tree Planks=Дубовые доски +Oak Tree Planks Slab=Дубовые доски (плита) +Oak Tree Planks Stair=Дубовые доски (ступени) +Oak Tree Sapling=Саженец дуба +Oak Tree Trunk=Ствол дуба +Oak Tree Trunk Slab=Ствол дуба (плита) +Oak Tree Trunk Stair=Ствол дуба (ступени) +Palm Tree=Пальма +Palm Tree Fence=Пальмовый забор +Palm Tree Fence Gate=Пальмовые ворота +Palm Tree Fence Rail=Пальмовые перила +Palm Tree Leaves=Листья пальмы +Palm Tree Planks=Пальмовые доски +Palm Tree Planks Slab=Пальмовые доски (плита) +Palm Tree Planks Stair=Пальмовые доски (ступени) +Palm Tree Sapling=Саженец пальмы +Palm Tree Trunk=Ствол пальмы +Palm Tree Trunk Slab=Ствол пальмы (плита) +Palm Tree Trunk Stair=Ствол пальмы (ступени) +Poplar Tree=Тополь +Poplar Tree Fence=Забор из тополя +Poplar Tree Fence Gate=Ворота из тополя +Poplar Tree Fence Rail=Перила из тополя +Poplar Tree Leaves=Листья тополя +Poplar Tree Planks=Доски из тополя +Poplar Tree Planks Slab=Доски из тополя (плита) +Poplar Tree Planks Stair=Доски из тополя (ступени) +Poplar Tree Sapling=Саженец тополя +Poplar Tree Trunk=Ствол тополя +Poplar Tree Trunk Slab=Ствол тополя (плита) +Poplar Tree Trunk Stair=Ствол тополя (ступени) +Red=красные +Rubber Tree=Каучуковое дерево +Rubber Tree Fence=Забор из каучукового дерева +Rubber Tree Fence Gate=Ворота из каучукового дерева +Rubber Tree Fence Rail=Перила из каучукового дерева +Rubber Tree Leaves=Листья каучукового дерева +Rubber Tree Planks=Доски из каучукового дерева +Rubber Tree Planks Slab=Доски из каучукового дерева (плита) +Rubber Tree Planks Stair=Доски из каучукового дерева (ступени) +Rubber Tree Sapling=Саженец каучукового дерева +Rubber Tree Trunk=Ствол каучукового дерева +Rubber Tree Trunk (Empty)=Ствол каучукового дерева (пусто) +Rubber Tree Trunk Slab=Ствол каучукового дерева (плита) +Rubber Tree Trunk Stair=Ствол каучукового дерева (ступени) +Small poplar Tree Sapling=Малы саженец тополя +Spruce Cone=Еловая шишка +Spruce Tree=Ель +Spruce Tree Fence=Еловый забор +Spruce Tree Fence Gate=Еловые ворота +Spruce Tree Fence Rail=Еловые перила +Spruce Tree Leaves=Еловая хвоя +Spruce Tree Planks=Еловые доски +Spruce Tree Planks Slab=Еловые доски (плита) +Spruce Tree Planks Stair=Еловые доски (ступени) +Spruce Tree Sapling=Саженец ели +Spruce Tree Trunk=Ствол ели +Spruce Tree Trunk Slab=Ствол ели (плита) +Spruce Tree Trunk Stair=Ствол ели (ступени) +Willow Tree=Ива +Willow Tree Fence=Ивовый забор +Willow Tree Fence Gate=Ивовые ворота +Willow Tree Fence Rail=Ивовые перила +Willow Tree Leaves=Листья ивы +Willow Tree Planks=Ивовые доски +Willow Tree Planks Slab=Ивовые доски (плита) +Willow Tree Planks Stair=Ивовые доски (ступени) +Willow Tree Sapling=Саженец ивы +Willow Tree Trunk=Ствол ивы +Willow Tree Trunk Slab=Ствол ивы (плита) +Willow Tree Trunk Stair=Ствол ивы (ступени) +Yellow=желтые + +# init.lua +Sapling=Саженец +Tree=Дерево +Wooden Planks=Деревянные доски +Leaves=Листья +Wooden Fence=Деревянный забор +Wooden Fence Rail=Деревянные перила +Wooden Fence Gate=Деревянные ворота diff --git a/mods/moretrees/locale/template.txt b/mods/moretrees/locale/template.txt index bac4da7d..d10e8ea3 100644 --- a/mods/moretrees/locale/template.txt +++ b/mods/moretrees/locale/template.txt @@ -208,3 +208,12 @@ Willow Tree Trunk= Willow Tree Trunk Slab= Willow Tree Trunk Stair= Yellow= + +# init.lua +Sapling= +Tree= +Wooden Planks= +Leaves= +Wooden Fence= +Wooden Fence Rail= +Wooden Fence Gate= diff --git a/mods/moretrees/mod.conf b/mods/moretrees/mod.conf index da7e4932..bbbcc4ce 100644 --- a/mods/moretrees/mod.conf +++ b/mods/moretrees/mod.conf @@ -1,4 +1,4 @@ name = moretrees -depends = default, biome_lib, vessels -optional_depends = doors, stairs, moreblocks, farming +depends = xcompat +optional_depends = doors, stairs, moreblocks, farming, default, vessels min_minetest_version = 5.2.0 diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua index bdc4a2b4..be6e934a 100644 --- a/mods/moretrees/node_defs.lua +++ b/mods/moretrees/node_defs.lua @@ -2,22 +2,25 @@ local S = minetest.get_translator("moretrees") moretrees.avoidnodes = {} +local jungle_sapling_texture = minetest.get_modpath("default") and "default_junglesapling.png" + or "moretrees_cedar_sapling.png" + moretrees.treelist = { {"beech", S("Beech Tree")}, {"apple_tree", S("Apple Tree")}, - {"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, {"sequoia", S("Giant Sequoia")}, {"birch", S("Birch Tree")}, - {"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, - {"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk", S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, - {"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, + {"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk",S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, + {"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, {"poplar", S("Poplar Tree")}, {"poplar_small", S("Poplar Tree")}, {"willow", S("Willow Tree")}, {"rubber_tree", S("Rubber Tree")}, - {"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"jungletree", S("Jungle Tree"), nil, nil, nil, nil, "default_junglesapling.png" }, + {"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"jungletree", S("Jungle Tree"), nil, nil, nil, nil, jungle_sapling_texture }, } moretrees.treedesc = { @@ -223,8 +226,8 @@ end -- redefine default leaves to handle plantlike and/or leaf decay options -if moretrees.plantlike_leaves then - minetest.override_item("default:leaves", { +if minetest.get_modpath("default") and moretrees.plantlike_leaves then + minetest.override_item(xcompat.materials.apple_leaves, { inventory_image = minetest.inventorycube("default_leaves.png"), drawtype = "plantlike", visual_scale = math.sqrt(2) @@ -233,8 +236,8 @@ end -- redefine default jungle leaves for same -if moretrees.plantlike_leaves then - minetest.override_item("default:jungleleaves", { +if minetest.get_modpath("default") and moretrees.plantlike_leaves then + minetest.override_item(xcompat.materials.jungle_leaves, { inventory_image = minetest.inventorycube("default_jungleleaves.png"), drawtype = "plantlike", visual_scale = math.sqrt(2) @@ -261,12 +264,12 @@ for i in ipairs(moretrees.treelist) do droprarity = 20 decay = moretrees.palm_leafdecay_radius elseif treename == "date_palm" then - decay = moretrees.palm_leafdecay_radius + decay = moretrees.date_palm_leafdecay_radius end - if treename ~= "jungletree" -- the default game provides jungle tree and pine trunk/planks nodes. - and treename ~= "poplar_small" - and treename ~= "pine" then + -- dont register planks/nodes for trees from default and small varients for trees + local split_tn = treename:split("_") + if treename ~= "jungletree" and treename ~= "pine" and split_tn[2]~="small" then saptex = "moretrees_"..treename.."_sapling.png" @@ -280,46 +283,19 @@ for i in ipairs(moretrees.treelist) do paramtype2 = "facedir", is_ground_content = false, groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, - sounds = default.node_sound_wood_defaults(), + sounds = xcompat.sounds.node_sound_wood_defaults(), on_place = minetest.rotate_node, }) - minetest.register_node("moretrees:"..treename.."_planks", { - description = moretrees.treedesc[treename].planks, - tiles = {"moretrees_"..treename.."_wood.png"}, - is_ground_content = false, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, - sounds = default.node_sound_wood_defaults(), - }) - - minetest.register_node("moretrees:"..treename.."_sapling", { - description = moretrees.treedesc[treename].sapling, - drawtype = "plantlike", - tiles = {saptex}, - inventory_image = saptex, - paramtype = "light", - paramtype2 = "waving", - walkable = false, - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} - }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, - sounds = default.node_sound_defaults(), - on_place = function(itemstack, placer, pointed_thing) - itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, - "moretrees:" ..treename.. "_sapling", - -- minp, maxp to be checked, relative to sapling pos - -- minp_relative.y = 1 because sapling pos has been checked - {x = -3, y = 1, z = -3}, - {x = 3, y = 6, z = 3}, - -- maximum interval of interior volume check - 4) - - return itemstack - end, - }) + if moretrees.enable_planks then + minetest.register_node("moretrees:"..treename.."_planks", { + description = moretrees.treedesc[treename].planks, + tiles = {"moretrees_"..treename.."_wood.png"}, + is_ground_content = false, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = xcompat.sounds.node_sound_wood_defaults(), + }) + end local moretrees_leaves_inventory_image = nil local moretrees_new_leaves_waving = nil @@ -340,7 +316,7 @@ for i in ipairs(moretrees.treelist) do paramtype = "light", is_ground_content = false, groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 1}, - sounds = default.node_sound_leaves_defaults(), + sounds = xcompat.sounds.node_sound_leaves_defaults(), drop = { max_items = 1, @@ -351,27 +327,25 @@ for i in ipairs(moretrees.treelist) do }, }) - if moretrees.enable_stairs then - if minetest.get_modpath("moreblocks") then + if minetest.get_modpath("moreblocks") then - -- stairsplus:register_all(modname, subname, recipeitem, {fields}) - - stairsplus:register_all( - "moretrees", - treename.."_trunk", - "moretrees:"..treename.."_trunk", - { - groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, - tiles = { - "moretrees_"..treename.."_trunk_top.png", - "moretrees_"..treename.."_trunk_top.png", - "moretrees_"..treename.."_trunk.png" - }, - description = moretrees.treedesc[treename].trunk, - drop = treename.."_trunk", - } - ) + stairsplus:register_all( + "moretrees", + treename.."_trunk", + "moretrees:"..treename.."_trunk", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + description = moretrees.treedesc[treename].trunk, + drop = treename.."_trunk", + } + ) + if moretrees.enable_planks then stairsplus:register_all( "moretrees", treename.."_planks", @@ -383,20 +357,22 @@ for i in ipairs(moretrees.treelist) do drop = treename.."_planks", } ) - elseif minetest.get_modpath("stairs") then - stairs.register_stair_and_slab( - "moretrees_"..treename.."_trunk", - "moretrees:"..treename.."_trunk", - { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 }, - { "moretrees_"..treename.."_trunk_top.png", - "moretrees_"..treename.."_trunk_top.png", - "moretrees_"..treename.."_trunk.png" - }, - moretrees.treedesc[treename].trunk_stair, - moretrees.treedesc[treename].trunk_slab, - default.node_sound_wood_defaults() - ) + end + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab( + "moretrees_"..treename.."_trunk", + "moretrees:"..treename.."_trunk", + { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 }, + { "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + moretrees.treedesc[treename].trunk_stair, + moretrees.treedesc[treename].trunk_slab, + xcompat.sounds.node_sound_wood_defaults() + ) + if moretrees.enable_planks then stairs.register_stair_and_slab( "moretrees_"..treename.."_planks", "moretrees:"..treename.."_planks", @@ -404,13 +380,13 @@ for i in ipairs(moretrees.treelist) do { "moretrees_"..treename.."_wood.png" }, moretrees.treedesc[treename].planks_stair, moretrees.treedesc[treename].planks_slab, - default.node_sound_wood_defaults() + xcompat.sounds.node_sound_wood_defaults() ) - end + end - if moretrees.enable_fences then + if minetest.get_modpath("default") and moretrees.enable_planks then local planks_name = "moretrees:" .. treename .. "_planks" local planks_tile = "moretrees_" .. treename .. "_wood.png" default.register_fence("moretrees:" .. treename .. "_fence", { @@ -422,7 +398,7 @@ for i in ipairs(moretrees.treelist) do "^default_fence_overlay.png^[makealpha:255,126,126", material = planks_name, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults() + sounds = xcompat.sounds.node_sound_wood_defaults() }) default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", { description = moretrees.treedesc[treename].fence_rail, @@ -433,7 +409,7 @@ for i in ipairs(moretrees.treelist) do "^default_fence_rail_overlay.png^[makealpha:255,126,126", material = planks_name, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults() + sounds = xcompat.sounds.node_sound_wood_defaults() }) if minetest.global_exists("doors") then doors.register_fencegate("moretrees:" .. treename .. "_gate", { @@ -446,25 +422,31 @@ for i in ipairs(moretrees.treelist) do end end - minetest.register_node("moretrees:"..treename.."_sapling_ongen", { - description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), - drawtype = "plantlike", - tiles = {saptex}, - inventory_image = saptex, - paramtype = "light", - paramtype2 = "waving", - walkable = false, - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} - }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, - sounds = default.node_sound_defaults(), - drop = "moretrees:"..treename.."_sapling", - on_place = function(itemstack, placer, pointed_thing) - itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, - "moretrees:" ..treename.. "_sapling_ongen", + -- the default game provides jungle tree and pine saplings. + if treename~="jungletree" and treename ~= "pine" then + local regular_groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1} + if minetest.settings:get_bool("creative_mode", false) then + regular_groups["not_in_creative_inventory"]=1 + end + + minetest.register_node("moretrees:"..treename.."_sapling", { + description = moretrees.treedesc[treename].sapling, + drawtype = "plantlike", + tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex}, + inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex, + paramtype = "light", + paramtype2 = "waving", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = regular_groups, + sounds = xcompat.sounds.node_sound_default(), + on_place = function(itemstack, placer, pointed_thing) + itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -3, y = 1, z = -3}, @@ -474,6 +456,83 @@ for i in ipairs(moretrees.treelist) do return itemstack end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(300) + end, + on_timer = function(pos, elapsed) + if moretrees.can_grow(pos, treename) then + --moretrees["grow_" .. treename](pos) + minetest.set_node(pos, {name="air"}) + if type(moretrees["spawn_" .. treename .. "_object"])=="string" then + local split = moretrees["spawn_" .. treename .. "_object"]:split(".") + moretrees[split[2]](pos) + else + minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"]) + end + else + minetest.get_node_timer(pos):start(300) + end + end, + }) + end + + local ongen_groups = { + snappy = 2, + dig_immediate = 3, + flammable = 2, + attached_node = 1, + sapling = 1, + moretrees_ongen = 1, + not_in_creative_inventory = 1 + } + if minetest.settings:get_bool("creative_mode", false) then + ongen_groups["not_in_creative_inventory"]=nil + end + minetest.register_node("moretrees:"..treename.."_sapling_ongen", { + description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), + drawtype = "plantlike", + tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex,}, + inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex, + paramtype = "light", + paramtype2 = "waving", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = ongen_groups, + sounds = xcompat.sounds.node_sound_default(), + drop = "moretrees:"..treename.."_sapling", + on_place = function(itemstack, placer, pointed_thing) + itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling_ongen", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + if moretrees.can_grow(pos, treename) then + --moretrees["grow_" .. treename](pos) + minetest.set_node(pos, {name="air"}) + if type(moretrees["spawn_" .. treename .. "_object"])=="string" then + local split = moretrees["spawn_" .. treename .. "_object"]:split(".") + moretrees[split[2]](pos) + else + minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"]) + end + else + minetest.get_node_timer(pos):start(300) + end + end, }) local fruitname = nil @@ -495,13 +554,19 @@ for i in ipairs(moretrees.treelist) do fixed = selbox }, groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 1}, - sounds = default.node_sound_defaults(), + sounds = xcompat.sounds.node_sound_default(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "moretrees:"..fruit, param2 = 1}) + end + end }) end if treename ~= "jungletree" and treename ~= "poplar_small" - and treename ~= "pine" then + and treename ~= "pine" + and minetest.get_modpath("default") then default.register_leafdecay({ trunks = { "moretrees:"..treename.."_trunk" }, leaves = { "moretrees:"..treename.."_leaves", fruitname }, @@ -528,37 +593,11 @@ for i in ipairs(moretrees.treelist) do end end --- Add small poplar saplings - -local poplar_sapling = minetest.registered_nodes["moretrees:poplar_sapling"] -local poplar_sapling_ongen = minetest.registered_nodes["moretrees:poplar_sapling_ongen"] -local poplar_small_sapling = {} -local poplar_small_sapling_ongen = {} -for k,v in pairs(poplar_sapling) do - poplar_small_sapling[k] = v -end -for k,v in pairs(poplar_sapling_ongen) do - poplar_small_sapling_ongen[k] = v -end -poplar_small_sapling.tiles = {"moretrees_poplar_small_sapling.png"} -poplar_small_sapling.inventory_image = "moretrees_poplar_small_sapling.png" -poplar_small_sapling.is_ground_content = true -poplar_small_sapling_ongen.tiles_ongen = {"moretrees_poplar_small_sapling.png"} -poplar_small_sapling_ongen.inventory_image_ongen = "moretrees_poplar_small_sapling.png" -poplar_small_sapling_ongen.drop = "moretrees:poplar_small_sapling" -poplar_small_sapling_ongen.is_ground_content = true - -minetest.register_node("moretrees:poplar_small_sapling", poplar_small_sapling) -minetest.register_node("moretrees:poplar_small_sapling_ongen", poplar_small_sapling_ongen) -if moretrees.spawn_saplings then - table.insert(moretrees.avoidnodes, "moretrees:poplar_sapling") - table.insert(moretrees.avoidnodes, "moretrees:poplar_small_sapling_ongen") -end - +-- poplar saplings leaves local poplar_leaves_drop = minetest.registered_nodes["moretrees:poplar_leaves"].drop minetest.override_item("moretrees:poplar_leaves", { drop = { - max_items = poplar_leaves_drop.maxitems, + max_items = poplar_leaves_drop.max_items, items = { {items = {"moretrees:poplar_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, {items = {"moretrees:poplar_small_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, @@ -592,29 +631,31 @@ for color = 1, #jungleleaves do paramtype = "light", is_ground_content = false, groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, - drop = { + drop = minetest.get_modpath("default") and { max_items = 1, items = { {items = {"default:junglesapling"}, rarity = 100 }, {items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } } - }, - sounds = default.node_sound_leaves_defaults(), + } or nil, + sounds = xcompat.sounds.node_sound_leaves_defaults(), }) end -- To get Moretrees to generate its own jungle trees among the default mapgen -- we need our own copy of that node, which moretrees will match against. -local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"]) -jungle_tree.drop = "default:jungletree" -minetest.register_node("moretrees:jungletree_trunk", jungle_tree) +if minetest.get_modpath("default") then + local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"]) + jungle_tree.drop = "default:jungletree" + minetest.register_node("moretrees:jungletree_trunk", jungle_tree) -default.register_leafdecay({ - trunks = { "default:jungletree", "moretrees:jungletree_trunk" }, - leaves = { "default:jungleleaves", "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" }, - radius = moretrees.leafdecay_radius, -}) + default.register_leafdecay({ + trunks = { "default:jungletree", "moretrees:jungletree_trunk" }, + leaves = { xcompat.materials.jungle_leaves, "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" }, + radius = moretrees.leafdecay_radius, + }) +end -- Extra needles for firs @@ -641,17 +682,19 @@ minetest.register_node("moretrees:fir_leaves_bright", { {items = {'moretrees:fir_leaves_bright'} } } }, - sounds = default.node_sound_leaves_defaults() + sounds = xcompat.sounds.node_sound_leaves_defaults() }) -default.register_leafdecay({ - trunks = { "moretrees:fir_trunk" }, - leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" }, - radius = moretrees.leafdecay_radius, -}) +if minetest.get_modpath("default") then + default.register_leafdecay({ + trunks = { "moretrees:fir_trunk" }, + leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" }, + radius = moretrees.leafdecay_radius, + }) +end -if moretrees.enable_redefine_apple then +if minetest.get_modpath("default") and moretrees.enable_redefine_apple then local appledef = table.copy(minetest.registered_nodes["default:apple"]) appledef.groups.attached_node = 1 minetest.register_node(":default:apple", appledef) @@ -679,7 +722,7 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", { "moretrees_rubber_tree_trunk_empty.png" }, groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, - sounds = default.node_sound_wood_defaults(), + sounds = xcompat.sounds.node_sound_wood_defaults(), paramtype2 = "facedir", is_ground_content = false, on_place = minetest.rotate_node, @@ -725,7 +768,7 @@ minetest.register_alias("conifers:sapling", "moretrees:fir_sapling") minetest.register_alias("moretrees:jungletree_sapling", "default:junglesapling") minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") -minetest.register_alias("moretrees:jungletree_leaves_green", "default:jungleleaves") +minetest.register_alias("moretrees:jungletree_leaves_green", xcompat.materials.jungle_leaves) minetest.register_alias("moretrees:acacia_trunk", "default:acacia_tree") minetest.register_alias("moretrees:acacia_planks", "default:acacia_wood") diff --git a/mods/moretrees/saplings.lua b/mods/moretrees/saplings.lua index 9a94aa2f..32ef7a84 100644 --- a/mods/moretrees/saplings.lua +++ b/mods/moretrees/saplings.lua @@ -5,8 +5,8 @@ local dirt_surfaces = { set = true, - ["default:dirt"] = true, - ["default:dirt_with_grass"] = true, + [xcompat.materials.dirt] = true, + [xcompat.materials.dirt_with_grass] = true, ["default:dirt_with_dry_grass"] = true, ["default:dirt_with_coniferous_litter"] = true, ["default:dirt_with_rainforest_litter"] = true, @@ -18,8 +18,8 @@ local dirt_surfaces = { local conifer_surfaces = { set = true, - ["default:dirt"] = true, - ["default:dirt_with_grass"] = true, + [xcompat.materials.dirt] = true, + [xcompat.materials.dirt_with_grass] = true, ["default:dirt_with_dry_grass"] = true, ["default:dirt_with_coniferous_litter"] = true, ["default:dirt_with_rainforest_litter"] = true, @@ -32,14 +32,35 @@ local conifer_surfaces = { local sand_surfaces = { set = true, - ["default:sand"] = true, - ["default:desert_sand"] = true, + [xcompat.materials.sand] = true, + [xcompat.materials.desert_sand] = true, ["cottages:loam"] = true, -- note, no silver sand here. -- too cold for a palm, too... well... sandy for anything else. } -for i in ipairs(moretrees.treelist) do +function moretrees.can_grow(pos, treename) + local surfaces + + if treename == "spruce" + or treename == "fir" + or treename == "cedar" + or treename == "pine" then + surfaces = conifer_surfaces + elseif string.find(treename, "palm") then + surfaces = sand_surfaces + else + surfaces = dirt_surfaces + end + + if surfaces[minetest.get_node(vector.new(pos.x, pos.y-1, pos.z)).name] then + return true + else + return false + end +end + +--[[ for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] local tree_model = treename.."_model" local tree_biome = treename.."_biome" @@ -81,4 +102,4 @@ for i in ipairs(moretrees.treelist) do grow_nodes = surfaces, grow_function = grow_function, }) -end +end ]] diff --git a/mods/moretrees/screenshot.lua b/mods/moretrees/screenshot.lua index 28a8c255..fff36c80 100644 --- a/mods/moretrees/screenshot.lua +++ b/mods/moretrees/screenshot.lua @@ -145,7 +145,8 @@ minetest.register_chatcommand("make-scene", { The following is a search/replace command suitable for vi (/vim) or sed, to convert minetest log messages to equivalent lua commands: -s/.*\(\(moretrees\|default\)[^ ]*\) at (\([-0-9]\+\),\([-0-9]\+\),\([-0-9]\+\)).*/\t\tminetest.place_node({x=\3, y=\4, z=\5}, {name="\1"})/ +s/.*\(\(moretrees\|default\)[^ ]*\) at + (\([-0-9]\+\),\([-0-9]\+\),\([-0-9]\+\)).*/\t\tminetest.place_node({x=\3, y=\4, z=\5}, {name="\1"})/ E.g. a minetest log line of the following kind: 2016-07-03 11:30:50: ACTION[Server]: singleplayer places node moretrees:rubber_tree_sapling at (760,5,-223) diff --git a/mods/moretrees/settings.lua b/mods/moretrees/settings.lua new file mode 100644 index 00000000..f84fd29e --- /dev/null +++ b/mods/moretrees/settings.lua @@ -0,0 +1,57 @@ +local stg = minetest.settings + +--spawns tree on mapgen as saplings, legacy setting +moretrees.spawn_saplings = stg:get_bool("moretrees.spawn_saplings", true) + +--enable plantlike drawtype for leaves +moretrees.plantlike_leaves = stg:get_bool("moretrees.plantlike_leaves", false) + +-- Enable this if you want moretrees to redefine default apples so that they +-- fall when leaves decay/are dug. +moretrees.enable_redefine_apple = stg:get_bool("moretrees.enable_redefine_apple", true) + +-- various related settings to configure leaf decay. +moretrees.leafdecay_radius = tonumber(stg:get("moretrees.leafdecay_radius")) or 5 +moretrees.palm_leafdecay_radius = tonumber(stg:get("moretrees.palm_leafdecay_radius")) or 10 +moretrees.date_palm_leafdecay_radius = tonumber(stg:get("moretrees.date_palm_leafdecay_radius")) or 14 + +-- Cocos palm settings +moretrees.coconuts_regrow = stg:get_bool("moretrees.coconuts_regrow", true) +moretrees.coconuts_convert_existing_palms = stg:get_bool("moretrees.coconuts_convert_existing_palms", true) +moretrees.coconut_flower_interval = tonumber(stg:get("moretrees.coconut_flower_interval")) or 59 +moretrees.coconut_flower_chance = tonumber(stg:get("moretrees.coconut_flower_chance")) or 67 +moretrees.coconut_grow_interval = tonumber(stg:get("moretrees.coconut_grow_interval")) or + 2 * moretrees.coconut_flower_interval * moretrees.coconut_flower_chance +moretrees.coconut_item_drop_ichance = tonumber(stg:get("moretrees.coconut_item_drop_ichance")) or 10 + +-- Date palm settings +moretrees.dates_regrow_pollinated = stg:get_bool("moretrees.dates_regrow_pollinated", true) +moretrees.dates_regrow_unpollinated_percent = tonumber(stg:get("moretrees.dates_regrow_unpollinated_percent")) or 0 +moretrees.dates_female_percent = tonumber(stg:get("moretrees.dates_female_percent")) or 57 +moretrees.dates_pollination_distance = tonumber(stg:get("moretrees.dates_pollination_distance")) or 120 +moretrees.dates_blossom_search_time_treshold = tonumber(stg:get("moretrees.dates_blossom_search_time_treshold")) or 1000 +moretrees.dates_blossom_search_iload = tonumber(stg:get("moretrees.dates_blossom_search_iload")) or 10 +moretrees.dates_flower_interval = tonumber(stg:get("moretrees.dates_flower_interval")) or 59 +moretrees.dates_flower_chance = tonumber(stg:get("moretrees.dates_flower_chance")) or 181 +moretrees.dates_grow_interval = tonumber(stg:get("moretrees.dates_grow_interval")) or + 2 * moretrees.dates_flower_interval * moretrees.dates_flower_chance +moretrees.dates_item_drop_ichance = tonumber(stg:get("moretrees.dates_item_drop_ichance")) or 10 + +-- Sapling settings +moretrees.sapling_interval = 100 +moretrees.sapling_chance = 5 + +-- Enable this only if you have used an old moretrees version which was using biome_lib +-- and when you notice large areas with ongen saplings that don't grow +moretrees.grow_legacy_saplings = stg:get_bool("moretrees.grow_legacy_saplings", false) + +-- If this variable is set to true, drop leaves out as entities during leaf +-- decay, rather than just disappearing them. +moretrees.decay_leaves_as_items = stg:get_bool("moretrees.decay_leaves_as_items", false) + +-- this is an internal setting for games that only have one type of planks +if type(minetest.get_game_info) == "function" then + moretrees.enable_planks = minetest.get_game_info().id~="voxelgarden" +else + moretrees.enable_planks = true +end \ No newline at end of file diff --git a/mods/moretrees/tree_models.lua b/mods/moretrees/tree_models.lua index eb6541e6..7824ea61 100644 --- a/mods/moretrees/tree_models.lua +++ b/mods/moretrees/tree_models.lua @@ -1,5 +1,6 @@ moretrees.beech_model={ axiom="FFFFFBFB", + -- luacheck: no max line length rules_a="[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fdd]]", rules_b="[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&Fd]//d[+^d][--&d]]", rules_c="/", @@ -24,8 +25,8 @@ moretrees.apple_tree_model={ random_level=0, trunk_type="single", thin_branches=true, - fruit="default:apple", - fruit_chance=15, + fruit=minetest.get_modpath("default") and "default:apple" or nil, + fruit_chance=minetest.get_modpath("default") and 15 or nil, } moretrees.oak_model={ @@ -75,6 +76,7 @@ moretrees.poplar_small_model={ moretrees.sequoia_model={ axiom="FFFFFFFFFFddccA///cccFddcFA///ddFcFA/cFFddFcdBddd/A/ccdcddd/ccAddddcFBcccAccFdFcFBcccc/BFdFFcFFdcccc/B", + -- luacheck: no max line length rules_a="[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]", rules_b="[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", rules_c="/", @@ -146,7 +148,7 @@ moretrees.palm_model={ -- So, a generic fruit trunk is spawned. An ABM will convert it to a male -- or female fruit trunk, and generate the actual dates. moretrees.date_palm_model={ - axiom="TTTTddddddddddccccccccccRT[TGGGGT]".. + axiom="TTTTddddddddddccccccccccRT[TTT]".. "ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]".. "GGccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]".. "GGccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]", @@ -166,6 +168,7 @@ moretrees.date_palm_model={ } moretrees.spruce_model1={ + -- luacheck: no max line length axiom="FFFFFAFFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", rules_a="[&&&FFFFFF^^FFF][&&&++FFFFFF^^FFF][&&&++++FFFFFF^^FFF][&&&++++++FFFFFF^^FFF][&&&--FFFFFF^^FFF][&&&----FFFFFF^^FFF]", rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", @@ -183,6 +186,7 @@ moretrees.spruce_model1={ } moretrees.spruce_model2={ + -- luacheck: no max line length axiom="FFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", @@ -217,6 +221,7 @@ moretrees.cedar_model={ moretrees.willow_model={ axiom="FFFFFFFFccA", + -- luacheck: no max line length rules_a="[&FF&FFFF&&F&FFFFFFFdddd][**&FF&FFFF&&F&FFFFFFFdddd][//&FF&FFFF&&F&FFFFFFFdddd][////&FF&FFFF&&F&FFFFFFFdddd][//////&FF&FFFF&&F&FFFFFFFdddd][////////&FF&FFFF&&F&FFFFFFFdddd]", rules_c="/", rules_d="F", @@ -247,7 +252,7 @@ moretrees.jungletree_model={ rules_a=nil, rules_b=nil, trunk="moretrees:jungletree_trunk", - leaves="default:jungleleaves", + leaves=xcompat.materials.jungle_leaves, leaves2=nil, leaves2_chance=nil, angle=45, diff --git a/mods/mydeck/depends.txt b/mods/mydeck/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/mydeck/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/mydeck/description.txt b/mods/mydeck/description.txt deleted file mode 100644 index ee417432..00000000 --- a/mods/mydeck/description.txt +++ /dev/null @@ -1 +0,0 @@ -Make realistic looking decks on your house. diff --git a/mods/mydeck/mod.conf b/mods/mydeck/mod.conf index ce4dbdea..5b4cae2f 100644 --- a/mods/mydeck/mod.conf +++ b/mods/mydeck/mod.conf @@ -1,2 +1,4 @@ name = mydeck tags = deck, patio, stairs, stain, rail +description = Make realistic looking decks on your house. +depends = default diff --git a/mods/mydoors/.luacheckrc b/mods/mydoors/.luacheckrc index 8f86fca2..a70961ce 100644 --- a/mods/mydoors/.luacheckrc +++ b/mods/mydoors/.luacheckrc @@ -1,20 +1,15 @@ unused_args = false -allow_defined_top = true +max_line_length = 140 read_globals = { - "doors", - "DIR_DELIM", - "minetest", "core", - "dump", - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "intllib", + table = {fields = {"copy"}}, + + "minetest", + "core", + "vector", "default", - "armor", + "doors", + "screwdriver", + "stairs", + "stairsplus", } - -globals = { - core = { fields = { "do_item_eat" }}, -} - diff --git a/mods/mydoors/description.txt b/mods/mydoors/description.txt deleted file mode 100644 index 3b8c6e51..00000000 --- a/mods/mydoors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Several different style doors. diff --git a/mods/mydoors/modpack.conf b/mods/mydoors/modpack.conf new file mode 100644 index 00000000..99d00b99 --- /dev/null +++ b/mods/mydoors/modpack.conf @@ -0,0 +1,2 @@ +name = mydoors +description = Several different style doors. \ No newline at end of file diff --git a/mods/mydoors/modpack.txt b/mods/mydoors/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/mydoors/my_castle_doors/depends.txt b/mods/mydoors/my_castle_doors/depends.txt deleted file mode 100644 index 4f77cd1a..00000000 --- a/mods/mydoors/my_castle_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -my_door_wood -doors diff --git a/mods/mydoors/my_castle_doors/description.txt b/mods/mydoors/my_castle_doors/description.txt deleted file mode 100644 index 2e445996..00000000 --- a/mods/mydoors/my_castle_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Castle style doors. diff --git a/mods/mydoors/my_castle_doors/locked.lua b/mods/mydoors/my_castle_doors/locked.lua index 1131793d..fb466b7f 100644 --- a/mods/mydoors/my_castle_doors/locked.lua +++ b/mods/mydoors/my_castle_doors/locked.lua @@ -1,21 +1,21 @@ local cdoor_list = { --Number , Description , Inven Image , Image {"Castle Door 1" , "door1"}, {"Castle Door 2" , "door2"}, --- {"Castle Door 3" , "door3"}, --- {"Castle Door 4" , "door4"}, --- {"Castle Door 5" , "door5"}, + {"Castle Door 3" , "door3"}, + {"Castle Door 4" , "door4"}, + {"Castle Door 5" , "door5"}, {"Castle Door 6" , "door6"}, {"Castle Door 7" , "door7"}, {"Castle Door 8" , "door8"}, --- {"Castle Door 9" , "door9"}, --- {"Castle Door 10" , "door10"}, --- {"Castle Door 11" , "door11"}, --- {"Castle Door 12" , "door12"}, --- {"Castle Door 13" , "door13"}, + {"Castle Door 9" , "door9"}, + {"Castle Door 10" , "door10"}, + {"Castle Door 11" , "door11"}, + {"Castle Door 12" , "door12"}, + {"Castle Door 13" , "door13"}, } local function add_door(desc, img) - doors.register("my_castle_doors:"..img.."_locked", { + doors.register_door("my_castle_doors:"..img.."_locked", { description = desc.." Locked", inventory_image = "mydoors_"..img.."_inv.png", groups = {choppy=2,cracky=2,door=1}, @@ -59,8 +59,8 @@ minetest.register_craft({ minetest.register_craft({ output = "my_castle_doors:door4_locked 1", recipe = { - {"my_door_wood:wood_brown", "default:steel_ingot", ""}, - {"my_door_wood:wood_brown", "my_door_wood:wood_brown", "default:steel_ingot"}, + {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""}, + {"my_door_wood:wood_brown", "default:steel_ingot", "default:steel_ingot"}, {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""} } }) diff --git a/mods/mydoors/my_castle_doors/mod.conf b/mods/mydoors/my_castle_doors/mod.conf index 0bbfec74..1f75b790 100644 --- a/mods/mydoors/my_castle_doors/mod.conf +++ b/mods/mydoors/my_castle_doors/mod.conf @@ -1 +1,3 @@ name = my_castle_doors +description = Castle style doors. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door1.png b/mods/mydoors/my_castle_doors/textures/mydoors_door1.png index 8357a8ac..cd97be76 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door1.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door1.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door10.png b/mods/mydoors/my_castle_doors/textures/mydoors_door10.png index a3ee6d57..8e3efbb1 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door10.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door10.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door11.png b/mods/mydoors/my_castle_doors/textures/mydoors_door11.png index 9efb9f41..94963488 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door11.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door11.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door12.png b/mods/mydoors/my_castle_doors/textures/mydoors_door12.png index 7a95e7a3..c813d457 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door12.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door12.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door13.png b/mods/mydoors/my_castle_doors/textures/mydoors_door13.png index c6556eb0..c9e9b049 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door13.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door13.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door13_inv.png b/mods/mydoors/my_castle_doors/textures/mydoors_door13_inv.png index 75e13130..13def7cd 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door13_inv.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door13_inv.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door2.png b/mods/mydoors/my_castle_doors/textures/mydoors_door2.png index 0f2ad2f2..a09b97f9 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door2.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door2.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door3.png b/mods/mydoors/my_castle_doors/textures/mydoors_door3.png index 59b2ea8a..5f501981 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door3.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door3.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door4.png b/mods/mydoors/my_castle_doors/textures/mydoors_door4.png index 6b0ef5c5..33600022 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door4.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door4.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door5.png b/mods/mydoors/my_castle_doors/textures/mydoors_door5.png index 351274fb..d302184f 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door5.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door5.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door6.png b/mods/mydoors/my_castle_doors/textures/mydoors_door6.png index 0afc1003..4f7b5a7d 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door6.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door6.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door7.png b/mods/mydoors/my_castle_doors/textures/mydoors_door7.png index af9bfe35..555ffa8b 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door7.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door7.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door8.png b/mods/mydoors/my_castle_doors/textures/mydoors_door8.png index fda16a90..46ec22f9 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door8.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door8.png differ diff --git a/mods/mydoors/my_castle_doors/textures/mydoors_door9.png b/mods/mydoors/my_castle_doors/textures/mydoors_door9.png index 0bcaba8f..eec06979 100644 Binary files a/mods/mydoors/my_castle_doors/textures/mydoors_door9.png and b/mods/mydoors/my_castle_doors/textures/mydoors_door9.png differ diff --git a/mods/mydoors/my_castle_doors/unlocked.lua b/mods/mydoors/my_castle_doors/unlocked.lua index 9ded97fe..e3eade73 100644 --- a/mods/mydoors/my_castle_doors/unlocked.lua +++ b/mods/mydoors/my_castle_doors/unlocked.lua @@ -1,12 +1,12 @@ local cdoor_list = { --Number , Description , Inven Image , Image --- {"Castle Door 1" , "door1"}, --- {"Castle Door 2" , "door2"}, + {"Castle Door 1" , "door1"}, + {"Castle Door 2" , "door2"}, {"Castle Door 3" , "door3"}, {"Castle Door 4" , "door4"}, {"Castle Door 5" , "door5"}, --- {"Castle Door 6" , "door6"}, --- {"Castle Door 7" , "door7"}, --- {"Castle Door 8" , "door8"}, + {"Castle Door 6" , "door6"}, + {"Castle Door 7" , "door7"}, + {"Castle Door 8" , "door8"}, {"Castle Door 9" , "door9"}, {"Castle Door 10" , "door10"}, {"Castle Door 11" , "door11"}, @@ -59,8 +59,8 @@ minetest.register_craft({ minetest.register_craft({ output = "my_castle_doors:door4 1", recipe = { - {"my_door_wood:wood_brown", "default:steel_ingot", ""}, {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""}, + {"my_door_wood:wood_brown", "default:steel_ingot", ""}, {"my_door_wood:wood_brown", "my_door_wood:wood_brown", ""} } }) diff --git a/mods/mydoors/my_cottage_doors/depends.txt b/mods/mydoors/my_cottage_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_cottage_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_cottage_doors/description.txt b/mods/mydoors/my_cottage_doors/description.txt deleted file mode 100644 index b497f0cb..00000000 --- a/mods/mydoors/my_cottage_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Cottage style doors. diff --git a/mods/mydoors/my_cottage_doors/locked.lua b/mods/mydoors/my_cottage_doors/locked.lua index 9895b4a6..b2d5f9e8 100644 --- a/mods/mydoors/my_cottage_doors/locked.lua +++ b/mods/mydoors/my_cottage_doors/locked.lua @@ -1,6 +1,6 @@ local cdoor_list = { --Number , Description , Inven Image , Image {"Cottage Door 1" , "door1"}, --- {"Cottage Door 2" , "door2"}, + {"Cottage Door 2" , "door2"}, } local function add_door(desc, img) diff --git a/mods/mydoors/my_cottage_doors/mod.conf b/mods/mydoors/my_cottage_doors/mod.conf index 82b1da40..a3db8a3c 100644 --- a/mods/mydoors/my_cottage_doors/mod.conf +++ b/mods/mydoors/my_cottage_doors/mod.conf @@ -1 +1,3 @@ name = my_cottage_doors +description = Cottage style doors. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_cottage_doors/textures/mycdoors_door1.png b/mods/mydoors/my_cottage_doors/textures/mycdoors_door1.png index 64b9298b..f1b44128 100644 Binary files a/mods/mydoors/my_cottage_doors/textures/mycdoors_door1.png and b/mods/mydoors/my_cottage_doors/textures/mycdoors_door1.png differ diff --git a/mods/mydoors/my_cottage_doors/textures/mycdoors_door1_inv.png b/mods/mydoors/my_cottage_doors/textures/mycdoors_door1_inv.png index 1cef8dc5..4fb983da 100644 Binary files a/mods/mydoors/my_cottage_doors/textures/mycdoors_door1_inv.png and b/mods/mydoors/my_cottage_doors/textures/mycdoors_door1_inv.png differ diff --git a/mods/mydoors/my_cottage_doors/textures/mycdoors_door2.png b/mods/mydoors/my_cottage_doors/textures/mycdoors_door2.png index ff801917..94b40042 100644 Binary files a/mods/mydoors/my_cottage_doors/textures/mycdoors_door2.png and b/mods/mydoors/my_cottage_doors/textures/mycdoors_door2.png differ diff --git a/mods/mydoors/my_cottage_doors/textures/mycdoors_door2_inv.png b/mods/mydoors/my_cottage_doors/textures/mycdoors_door2_inv.png index 188da2f8..cebc6e5e 100644 Binary files a/mods/mydoors/my_cottage_doors/textures/mycdoors_door2_inv.png and b/mods/mydoors/my_cottage_doors/textures/mycdoors_door2_inv.png differ diff --git a/mods/mydoors/my_cottage_doors/unlocked.lua b/mods/mydoors/my_cottage_doors/unlocked.lua index 218b6918..41c01031 100644 --- a/mods/mydoors/my_cottage_doors/unlocked.lua +++ b/mods/mydoors/my_cottage_doors/unlocked.lua @@ -1,5 +1,5 @@ local cdoor_list = { --Number , Description , Inven Image , Image --- {"Cottage Door 1" , "door1"}, + {"Cottage Door 1" , "door1"}, {"Cottage Door 2" , "door2"}, } diff --git a/mods/mydoors/my_default_doors/depends.txt b/mods/mydoors/my_default_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_default_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_default_doors/description.txt b/mods/mydoors/my_default_doors/description.txt deleted file mode 100644 index d7bea0e9..00000000 --- a/mods/mydoors/my_default_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Doors made from default ores. Copper, bronze, gold, diamond and mese. diff --git a/mods/mydoors/my_default_doors/init.lua b/mods/mydoors/my_default_doors/init.lua index 42636e30..47b4c697 100644 --- a/mods/mydoors/my_default_doors/init.lua +++ b/mods/mydoors/my_default_doors/init.lua @@ -1,2 +1,2 @@ dofile(minetest.get_modpath("my_default_doors").."/locked.lua") ---dofile(minetest.get_modpath("my_default_doors").."/unlocked.lua") +dofile(minetest.get_modpath("my_default_doors").."/unlocked.lua") diff --git a/mods/mydoors/my_default_doors/mod.conf b/mods/mydoors/my_default_doors/mod.conf index 732f2fae..b0eea351 100644 --- a/mods/mydoors/my_default_doors/mod.conf +++ b/mods/mydoors/my_default_doors/mod.conf @@ -1 +1,3 @@ name = my_default_doors +description = Doors made from default ores. Copper, bronze, gold, diamond and mese. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_default_doors/textures/mydoors_bronze.png b/mods/mydoors/my_default_doors/textures/mydoors_bronze.png index 592e2bae..a103268d 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_bronze.png and b/mods/mydoors/my_default_doors/textures/mydoors_bronze.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_bronze_inv.png b/mods/mydoors/my_default_doors/textures/mydoors_bronze_inv.png index b8aa025e..1e76200c 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_bronze_inv.png and b/mods/mydoors/my_default_doors/textures/mydoors_bronze_inv.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_copper.png b/mods/mydoors/my_default_doors/textures/mydoors_copper.png index 9a229bc3..f1bc2fa0 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_copper.png and b/mods/mydoors/my_default_doors/textures/mydoors_copper.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_copper_inv.png b/mods/mydoors/my_default_doors/textures/mydoors_copper_inv.png index 09263a50..23f099a8 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_copper_inv.png and b/mods/mydoors/my_default_doors/textures/mydoors_copper_inv.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_diamond.png b/mods/mydoors/my_default_doors/textures/mydoors_diamond.png index 9b65bbf1..a6f66c89 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_diamond.png and b/mods/mydoors/my_default_doors/textures/mydoors_diamond.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_diamond_inv.png b/mods/mydoors/my_default_doors/textures/mydoors_diamond_inv.png index 07573526..dcced214 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_diamond_inv.png and b/mods/mydoors/my_default_doors/textures/mydoors_diamond_inv.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_gold.png b/mods/mydoors/my_default_doors/textures/mydoors_gold.png index 253f4527..2756b0a1 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_gold.png and b/mods/mydoors/my_default_doors/textures/mydoors_gold.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_gold_inv.png b/mods/mydoors/my_default_doors/textures/mydoors_gold_inv.png index d90b2645..24198e9d 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_gold_inv.png and b/mods/mydoors/my_default_doors/textures/mydoors_gold_inv.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_mese.png b/mods/mydoors/my_default_doors/textures/mydoors_mese.png index 828c2677..3d62afc4 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_mese.png and b/mods/mydoors/my_default_doors/textures/mydoors_mese.png differ diff --git a/mods/mydoors/my_default_doors/textures/mydoors_mese_inv.png b/mods/mydoors/my_default_doors/textures/mydoors_mese_inv.png index 68a2e0d7..bf061253 100644 Binary files a/mods/mydoors/my_default_doors/textures/mydoors_mese_inv.png and b/mods/mydoors/my_default_doors/textures/mydoors_mese_inv.png differ diff --git a/mods/mydoors/my_door_wood/depends.txt b/mods/mydoors/my_door_wood/depends.txt deleted file mode 100644 index 567219e7..00000000 --- a/mods/mydoors/my_door_wood/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -stairs? -moreblocks? \ No newline at end of file diff --git a/mods/mydoors/my_door_wood/description.txt b/mods/mydoors/my_door_wood/description.txt deleted file mode 100644 index 609e7c04..00000000 --- a/mods/mydoors/my_door_wood/description.txt +++ /dev/null @@ -1 +0,0 @@ -Wood that is used to make doors. diff --git a/mods/mydoors/my_door_wood/init.lua b/mods/mydoors/my_door_wood/init.lua index 84881d30..22a51452 100644 --- a/mods/mydoors/my_door_wood/init.lua +++ b/mods/mydoors/my_door_wood/init.lua @@ -7,7 +7,7 @@ local door_wood = { -- color, desc, image {"yellow", "Clear Stained", "yellow"}, {"black", "Black", "black"}, } -local function my_door_wood_block_stairs(nodename, def) +local function my_door_wood_block_stairs(nodename, def) local mod = string.match(nodename, "(.+):") local name = string.match(nodename, ":(.+)") minetest.register_node(nodename, def) @@ -23,25 +23,24 @@ local function my_door_wood_block_stairs(nodename, def) sounds = def.sounds, } ) - elseif minetest.get_modpath("stairs") then + elseif minetest.get_modpath("stairs") then stairs.register_stair_and_slab(name,nodename, def.groups, def.tiles, ("%s Stair"):format(def.description), ("%s Slab"):format(def.description), def.sounds - ) - end + ) + end end local function add_door(color, desc, img) my_door_wood_block_stairs("my_door_wood:wood_"..color, { description = desc.." Wood", drawtype = "normal", - paramtype = "light", tiles = {"mydoors_"..img.."_wood.png"}, paramtype = "light", - groups = {cracky = 2, choppy = 2}, + groups = {cracky = 2, choppy = 2, wood = 1}, sounds = default.node_sound_wood_defaults(), }) diff --git a/mods/mydoors/my_door_wood/mod.conf b/mods/mydoors/my_door_wood/mod.conf index c4ec9110..c225b5fb 100644 --- a/mods/mydoors/my_door_wood/mod.conf +++ b/mods/mydoors/my_door_wood/mod.conf @@ -1 +1,4 @@ name = my_door_wood +description = Wood that is used to make doors. +depends = default +optional_depends = stairs, moreblocks \ No newline at end of file diff --git a/mods/mydoors/my_door_wood/textures/mydoors_black_wood.png b/mods/mydoors/my_door_wood/textures/mydoors_black_wood.png index a7effb24..3482e97f 100644 Binary files a/mods/mydoors/my_door_wood/textures/mydoors_black_wood.png and b/mods/mydoors/my_door_wood/textures/mydoors_black_wood.png differ diff --git a/mods/mydoors/my_door_wood/textures/mydoors_swood.png b/mods/mydoors/my_door_wood/textures/mydoors_swood.png index 83eb38fe..707002de 100644 Binary files a/mods/mydoors/my_door_wood/textures/mydoors_swood.png and b/mods/mydoors/my_door_wood/textures/mydoors_swood.png differ diff --git a/mods/mydoors/my_fancy_doors/depends.txt b/mods/mydoors/my_fancy_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_fancy_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_fancy_doors/description.txt b/mods/mydoors/my_fancy_doors/description.txt deleted file mode 100644 index 3655a499..00000000 --- a/mods/mydoors/my_fancy_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Fancy style doors. diff --git a/mods/mydoors/my_fancy_doors/locked.lua b/mods/mydoors/my_fancy_doors/locked.lua index 4442029d..01c37e77 100644 --- a/mods/mydoors/my_fancy_doors/locked.lua +++ b/mods/mydoors/my_fancy_doors/locked.lua @@ -1,7 +1,7 @@ local fdoor_list = { --Number , Description , Inven Image , Image {"Fancy Door 1" , "door1"}, --- {"Fancy Door 2" , "door2"}, --- {"Fancy Door 3" , "door3"}, + {"Fancy Door 2" , "door2"}, + {"Fancy Door 3" , "door3"}, {"Fancy Door 4" , "door4"}, {"Fancy Door 5" , "door5"}, {"Fancy Door 6" , "door6"}, @@ -84,9 +84,9 @@ minetest.register_craft({ } }) minetest.register_craft({ - output = "my_fancy_doors:door7_locked 1", + output = "my_fancy_doors:door8_locked 1", recipe = { - {"default:glass", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""}, {"default:glass", "my_door_wood:wood_red", "default:steel_ingot"}, {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} } diff --git a/mods/mydoors/my_fancy_doors/mod.conf b/mods/mydoors/my_fancy_doors/mod.conf index 4fddff81..5208c4f9 100644 --- a/mods/mydoors/my_fancy_doors/mod.conf +++ b/mods/mydoors/my_fancy_doors/mod.conf @@ -1 +1,3 @@ name = my_fancy_doors +description = Fancy style doors. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door1.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door1.png index 350780be..89071955 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door1.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door1.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door2.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door2.png index 2769ad03..514eaf81 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door2.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door2.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door3.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door3.png index 451bc012..a4920b71 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door3.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door3.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door4.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door4.png index d5b4a42d..42fb361d 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door4.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door4.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door4_inv.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door4_inv.png index 97470e30..7c63dd61 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door4_inv.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door4_inv.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door5.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door5.png index fd071661..21e73c8f 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door5.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door5.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door5_inv.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door5_inv.png index a6de67e5..7dd1f089 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door5_inv.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door5_inv.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door6.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door6.png index f0c4aabb..ce6a8b42 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door6.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door6.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door6_inv.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door6_inv.png index 2f9641d7..83e06dc0 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door6_inv.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door6_inv.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door7.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door7.png index 05589de1..c4cce852 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door7.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door7.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door7_inv.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door7_inv.png index c25468ca..ab6072ce 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door7_inv.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door7_inv.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door8.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door8.png index dedfafa7..0e36f2f8 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door8.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door8.png differ diff --git a/mods/mydoors/my_fancy_doors/textures/myfdoors_door8_inv.png b/mods/mydoors/my_fancy_doors/textures/myfdoors_door8_inv.png index 6c5fc7ff..c5df6cee 100644 Binary files a/mods/mydoors/my_fancy_doors/textures/myfdoors_door8_inv.png and b/mods/mydoors/my_fancy_doors/textures/myfdoors_door8_inv.png differ diff --git a/mods/mydoors/my_fancy_doors/unlocked.lua b/mods/mydoors/my_fancy_doors/unlocked.lua index edfe9211..6ffc7dfb 100644 --- a/mods/mydoors/my_fancy_doors/unlocked.lua +++ b/mods/mydoors/my_fancy_doors/unlocked.lua @@ -1,12 +1,12 @@ local fdoor_list = { --Number , Description , Inven Image , Image --- {"Fancy Door 1" , "door1"}, + {"Fancy Door 1" , "door1"}, {"Fancy Door 2" , "door2"}, {"Fancy Door 3" , "door3"}, --- {"Fancy Door 4" , "door4"}, --- {"Fancy Door 5" , "door5"}, --- {"Fancy Door 6" , "door6"}, --- {"Fancy Door 7" , "door7"}, --- {"Fancy Door 8" , "door8"}, + {"Fancy Door 4" , "door4"}, + {"Fancy Door 5" , "door5"}, + {"Fancy Door 6" , "door6"}, + {"Fancy Door 7" , "door7"}, + {"Fancy Door 8" , "door8"}, } local function add_door(desc, img) @@ -59,3 +59,35 @@ minetest.register_craft({ {"my_door_wood:wood_red", "my_door_wood:wood_dark_grey", ""} } }) +minetest.register_craft({ + output = "my_fancy_doors:door5 1", + recipe = { + {"default:glass", "my_door_wood:wood_yellow", ""}, + {"my_door_wood:wood_yellow", "default:glass", ""}, + {"my_door_wood:wood_yellow", "my_door_wood:wood_yellow", ""} + } +}) +minetest.register_craft({ + output = "my_fancy_doors:door6 1", + recipe = { + {"default:glass", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "default:glass", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) +minetest.register_craft({ + output = "my_fancy_doors:door7 1", + recipe = { + {"my_door_wood:wood_red", "default:glass", ""}, + {"my_door_wood:wood_red", "default:glass", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) +minetest.register_craft({ + output = "my_fancy_doors:door8 1", + recipe = { + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""}, + {"default:glass", "my_door_wood:wood_red", ""}, + {"my_door_wood:wood_red", "my_door_wood:wood_red", ""} + } +}) \ No newline at end of file diff --git a/mods/mydoors/my_future_doors/depends.txt b/mods/mydoors/my_future_doors/depends.txt deleted file mode 100644 index a0295b72..00000000 --- a/mods/mydoors/my_future_doors/depends.txt +++ /dev/null @@ -1 +0,0 @@ -my_door_wood diff --git a/mods/mydoors/my_future_doors/description.txt b/mods/mydoors/my_future_doors/description.txt deleted file mode 100644 index 90019b92..00000000 --- a/mods/mydoors/my_future_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Futuristic style doors. diff --git a/mods/mydoors/my_future_doors/framed.lua b/mods/mydoors/my_future_doors/framed.lua index 26b0287a..009135c1 100644 --- a/mods/mydoors/my_future_doors/framed.lua +++ b/mods/mydoors/my_future_doors/framed.lua @@ -1,3 +1,4 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow or nil local doorcolors = {"white","red","black"} local function add_door(col) @@ -36,11 +37,11 @@ local function add_door(col) {-0.625, 1.4375,-0.5625, 0.625, 1.625, 0.5625}, --top } }, - + on_rotate = rotate_disallow, on_place = function(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above local pos2 = vector.add(pos1, {x=0,y=1,z=0}) - + if not placer or not placer:is_player() then return end @@ -112,6 +113,7 @@ local function add_door(col) {-0.5, -0.5, -0.5, -0.5, -0.5, -0.5}, } }, + on_rotate = rotate_disallow, }) minetest.register_node("my_future_doors:door1c_"..col, { tiles = { @@ -146,6 +148,7 @@ local function add_door(col) } }, drop = "my_future_doors:door1a_"..col, + on_rotate = rotate_disallow, after_place_node = function(pos, placer, itemstack, pointed_thing) local node = minetest.get_node(pos) local timer = minetest.get_node_timer(pos) @@ -194,6 +197,7 @@ local function add_door(col) {-0.5, -0.5, -0.5, -0.5, -0.5, -0.5}, } }, + on_rotate = rotate_disallow, }) minetest.register_craft({ output = "my_future_doors:door1a_"..col.." 1", diff --git a/mods/mydoors/my_future_doors/mod.conf b/mods/mydoors/my_future_doors/mod.conf index f78db030..ee2f34a9 100644 --- a/mods/mydoors/my_future_doors/mod.conf +++ b/mods/mydoors/my_future_doors/mod.conf @@ -1 +1,4 @@ name = my_future_doors +description = Futuristic style doors. +depends = my_door_wood +optional_depends = screwdriver diff --git a/mods/mydoors/my_future_doors/sliding.lua b/mods/mydoors/my_future_doors/sliding.lua index 50a401a1..cf9949d6 100644 --- a/mods/mydoors/my_future_doors/sliding.lua +++ b/mods/mydoors/my_future_doors/sliding.lua @@ -1,3 +1,5 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow or nil + local doors = { {"my_future_doors:door2a","my_future_doors:door2b","my_future_doors:door2c","my_future_doors:door2d","2","Steel", {{"default:steel_ingot", "default:steelblock", ""}, @@ -33,7 +35,7 @@ local function add_door(doora, doorb, doorc, doord, num, des, recipe) local function onplace(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above local pos2 = vector.add(pos1, {x=0,y=1,z=0}) - + if not placer or not placer:is_player() then return end @@ -147,6 +149,7 @@ local function add_door(doora, doorb, doorc, doord, num, des, recipe) {-0.5, -0.5, -0.0625, 0.5, 1.5, 0.0625} } }, + on_rotate = rotate_disallow, on_place = onplace, @@ -179,6 +182,7 @@ local function add_door(doora, doorb, doorc, doord, num, des, recipe) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_node(doorc, { tiles = { @@ -209,6 +213,7 @@ local function add_door(doora, doorb, doorc, doord, num, des, recipe) after_place_node = afterplace, after_destruct = afterdestruct, on_timer = ontimer, + on_rotate = rotate_disallow, }) minetest.register_node(doord, { tiles = { @@ -235,6 +240,7 @@ local function add_door(doora, doorb, doorc, doord, num, des, recipe) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_craft({ output = "my_future_doors:door"..num.."a 2", diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_black.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_black.png index 72c47893..fcd11be7 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_black.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_black.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_blackb.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_blackb.png index 34064840..83a7d714 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_blackb.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_blackb.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_bottomf.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_bottomf.png index e9fff315..273889b6 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_bottomf.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_bottomf.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_red.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_red.png index bad99d23..8337052a 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_red.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_red.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_redb.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_redb.png index f6339dd3..e57fe9cc 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_redb.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_redb.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_white.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_white.png index 1a95505b..a7752b3e 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_white.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_white.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door1_whiteb.png b/mods/mydoors/my_future_doors/textures/myndoors_door1_whiteb.png index 3b849502..b8ab1cf4 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door1_whiteb.png and b/mods/mydoors/my_future_doors/textures/myndoors_door1_whiteb.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottom.png index bf4121b2..195df433 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottomo.png index ca8b979f..fd868c97 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door2a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door2a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door2a_edge.png index 26d356f7..15d01dea 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door2a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door2a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door2a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door2a_inv.png index 1b175468..7c651dbf 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door2a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door2a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottom.png index f73fab7b..945d2540 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottomo.png index bbd1fd89..084f1be4 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door3a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door3a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door3a_edge.png index 26d356f7..15d01dea 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door3a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door3a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door3a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door3a_inv.png index 533ffab3..6de1e451 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door3a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door3a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottom.png index 3eb8d7aa..23169846 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottomo.png index f7650e1b..6146c38b 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door4a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door4a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door4a_edge.png index db005ac9..dca6b3ed 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door4a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door4a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door4a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door4a_inv.png index 9b910850..52c8912c 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door4a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door4a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottom.png index 771ac071..ea4cdf06 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottomo.png index 7529230c..802387af 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door6a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door6a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door6a_edge.png index 3c6064f0..65b53f8c 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door6a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door6a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door6a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door6a_inv.png index ba1a9efd..86fea0a3 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door6a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door6a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottom.png index e29018fc..bfafc6c4 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottomo.png index c08fc2ef..c5d0247a 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door7a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door7a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door7a_edge.png index bfd86dc4..65b53f8c 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door7a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door7a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door7a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door7a_inv.png index 3c906fe7..4a04cf17 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door7a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door7a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottom.png index 2141e845..3b73f9c6 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottomo.png index f920fb09..6efed0c5 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door8a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door8a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door8a_edge.png index 6b37c753..86ade160 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door8a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door8a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door8a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door8a_inv.png index 7258da70..20b8b947 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door8a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door8a_inv.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottom.png b/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottom.png index 3a6ce406..c9e65323 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottom.png and b/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottom.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottomo.png b/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottomo.png index de373c3e..b342b3a8 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottomo.png and b/mods/mydoors/my_future_doors/textures/myndoors_door9a_bottomo.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door9a_edge.png b/mods/mydoors/my_future_doors/textures/myndoors_door9a_edge.png index f1eb22ce..f0e0a94b 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door9a_edge.png and b/mods/mydoors/my_future_doors/textures/myndoors_door9a_edge.png differ diff --git a/mods/mydoors/my_future_doors/textures/myndoors_door9a_inv.png b/mods/mydoors/my_future_doors/textures/myndoors_door9a_inv.png index 14480ab4..5ca58cc5 100644 Binary files a/mods/mydoors/my_future_doors/textures/myndoors_door9a_inv.png and b/mods/mydoors/my_future_doors/textures/myndoors_door9a_inv.png differ diff --git a/mods/mydoors/my_garage_door/description.txt b/mods/mydoors/my_garage_door/description.txt deleted file mode 100644 index 54e67269..00000000 --- a/mods/mydoors/my_garage_door/description.txt +++ /dev/null @@ -1 +0,0 @@ -A garage door. diff --git a/mods/mydoors/my_garage_door/init.lua b/mods/mydoors/my_garage_door/init.lua index 80bc3512..47d30d0e 100644 --- a/mods/mydoors/my_garage_door/init.lua +++ b/mods/mydoors/my_garage_door/init.lua @@ -1,3 +1,23 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow or nil + +local function buildable_to(pos) + local node = minetest.get_node(pos).name + if minetest.registered_nodes[node] then -- The checked node is maybe an unknown node + return minetest.registered_nodes[node].buildable_to + end + return false +end + +local nodebox_closed = { + type = "fixed", + fixed = { + {-1.5, -0.5, -0.125, 1.5, 0.5, -0.0625}, + {-1.5, -0.5, -0.1875, 1.5, -0.3125, -0.0625}, + {-1.5, -0.25, -0.1875, 1.5, -0.0624999, -0.0625}, + {-1.5, 0, -0.1875, 1.5, 0.1875, -0.0625}, + {-1.5, 0.25, -0.1875, 1.5, 0.4375, -0.0625}, + } +} minetest.register_node("my_garage_door:garage_door", { description = "Garage Door", @@ -8,32 +28,24 @@ minetest.register_node("my_garage_door:garage_door", { paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, - node_box = { - type = "fixed", - fixed = { - {-1.5, -0.5, -0.125, 1.5, 0.5, -0.0625}, - {-1.5, -0.5, -0.1875, 1.5, -0.3125, -0.0625}, - {-1.5, -0.25, -0.1875, 1.5, -0.0624999, -0.0625}, - {-1.5, 0, -0.1875, 1.5, 0.1875, -0.0625}, - {-1.5, 0.25, -0.1875, 1.5, 0.4375, -0.0625}, - } - }, + node_box = table.copy(nodebox_closed), selection_box = { type = "fixed", fixed = { {-1.5, -0.5, -0.1875, 1.5, 1.5, -0.0625}, } }, + on_rotate = rotate_disallow, on_place = function(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above local pos2 = vector.add(pos1, {x=0,y=1,z=0}) - + if not placer or not placer:is_player() then return end - if not minetest.registered_nodes[minetest.get_node(pos1).name].buildable_to or - not minetest.registered_nodes[minetest.get_node(pos2).name].buildable_to then + if not buildable_to(pos1) or + not buildable_to(pos2) then minetest.chat_send_player(placer:get_player_name(), "Not enough room") return end @@ -68,13 +80,13 @@ minetest.register_node("my_garage_door:garage_door", { local t1 = vector.add(above, dir) local t2 = vector.add(t1, dir) - + if not player or not player:is_player() then return end - if not minetest.registered_nodes[minetest.get_node(t1).name].buildable_to or - not minetest.registered_nodes[minetest.get_node(t2).name].buildable_to then + if not buildable_to(t1) or + not buildable_to(t2) then minetest.chat_send_player(player:get_player_name(), "Not enough room to open") return end @@ -106,18 +118,22 @@ minetest.register_node("my_garage_door:garage_door_top", { diggable = false, pointable = false, groups = {cracky=3}, - node_box = { - type = "fixed", - fixed = { - {-1.5, -0.5, -0.125, 1.5, 0.5, -0.0625}, - {-1.5, -0.5, -0.1875, 1.5, -0.3125, -0.0625}, - {-1.5, -0.25, -0.1875, 1.5, -0.0624999, -0.0625}, - {-1.5, 0, -0.1875, 1.5, 0.1875, -0.0625}, - {-1.5, 0.25, -0.1875, 1.5, 0.4375, -0.0625}, - } - }, + node_box = table.copy(nodebox_closed), selection_box = {type = "fixed",fixed = {{0, 0, 0, 0, 0, 0},}}, + on_rotate = rotate_disallow, }) + +local nodebox_open = { + type = "fixed", + fixed = { + {-1.5, 0.4375, -0.5, 1.5, 0.375, 0.5}, + {-1.5, 0.375, 0.3125, 1.5, 0.5, 0.5}, + {-1.5, 0.375, 0.0625, 1.5, 0.5, 0.25}, + {-1.5, 0.375, -0.1875, 1.5, 0.5, 0}, + {-1.5, 0.375, -0.4375, 1.5, 0.5, -0.25}, + } +} + minetest.register_node("my_garage_door:garage_door_open", { tiles = { "default_snow.png" @@ -128,31 +144,22 @@ minetest.register_node("my_garage_door:garage_door_open", { drop = "my_garage_door:garage_door", diggable = false, groups = {cracky=3}, - node_box = { - type = "fixed", - fixed = { - {-1.5, 0.4375, -0.5, 1.5, 0.375, 0.5}, - {-1.5, 0.375, 0.3125, 1.5, 0.5, 0.5}, - {-1.5, 0.375, 0.0625, 1.5, 0.5, 0.25}, - {-1.5, 0.375, -0.1875, 1.5, 0.5, 0}, - {-1.5, 0.375, -0.4375, 1.5, 0.5, -0.25}, - } - }, + node_box = table.copy(nodebox_open), selection_box = {type = "fixed",fixed = {{-1.5, 0.375, -0.5, 1.5, 0.5, 1.5},}}, - + on_rotate = rotate_disallow, on_rightclick = function(pos, node, player, itemstack, pointed_thing) local p2 = node.param2 local dir = minetest.facedir_to_dir((p2+2)%4) local t1 = vector.add(pos, dir) local t2 = vector.subtract(t1, {x=0,y=1,z=0}) - + if not player or not player:is_player() then return end - if not minetest.registered_nodes[minetest.get_node(t1).name].buildable_to or - not minetest.registered_nodes[minetest.get_node(t2).name].buildable_to then + if not buildable_to(t1) or + not buildable_to(t2) then minetest.chat_send_player(player:get_player_name(), "Not enough room to close") return end @@ -186,16 +193,19 @@ minetest.register_node("my_garage_door:garage_door_open2", { diggable = false, pointable = false, groups = {cracky=3}, - node_box = { - type = "fixed", - fixed = { - {-1.5, 0.4375, -0.5, 1.5, 0.375, 0.5}, - {-1.5, 0.375, 0.3125, 1.5, 0.5, 0.5}, - {-1.5, 0.375, 0.0625, 1.5, 0.5, 0.25}, - {-1.5, 0.375, -0.1875, 1.5, 0.5, 0}, - {-1.5, 0.375, -0.4375, 1.5, 0.5, -0.25}, - } - }, + node_box = table.copy(nodebox_open), selection_box = {type = "fixed",fixed = {{0, 0, 0, 0, 0, 0},}}, - + on_rotate = rotate_disallow, }) + +-- craft +if minetest.get_modpath("basic_materials") then + minetest.register_craft({ + output = "my_garage_door:garage_door", + recipe = { + {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}, + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"} + } + }) +end \ No newline at end of file diff --git a/mods/mydoors/my_garage_door/mod.conf b/mods/mydoors/my_garage_door/mod.conf index 39155d74..ff825933 100644 --- a/mods/mydoors/my_garage_door/mod.conf +++ b/mods/mydoors/my_garage_door/mod.conf @@ -1 +1,3 @@ name = my_garage_door +description = A garage door. +optional_depends = basic_materials, screwdriver diff --git a/mods/mydoors/my_hidden_doors/depends.txt b/mods/mydoors/my_hidden_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_hidden_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_hidden_doors/description.txt b/mods/mydoors/my_hidden_doors/description.txt deleted file mode 100644 index c69935b6..00000000 --- a/mods/mydoors/my_hidden_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -These are doors that blend into the enviroment. diff --git a/mods/mydoors/my_hidden_doors/init.lua b/mods/mydoors/my_hidden_doors/init.lua index 74d45b37..26aea2f1 100644 --- a/mods/mydoors/my_hidden_doors/init.lua +++ b/mods/mydoors/my_hidden_doors/init.lua @@ -11,11 +11,11 @@ local hdoor_list = { --Number , Description , default image } local function add_door(img, desc) + -- Cannot add locked doors because the tooltip defies the purpose of being a hidden door doors.register_door("my_hidden_doors:hidden_door"..img, { - description = desc.." Locked", + description = desc, inventory_image = "mydoors_"..img.."_inv.png", groups = {choppy=2,cracky=2,door=1}, - only_placer_can_open = false, tiles = {{ name = "mydoors_"..img..".png", backface_culling = true }}, protected = false, }) @@ -27,7 +27,7 @@ for _,hdoor in ipairs(hdoor_list) do end doors.register_door("my_hidden_doors:hidden_door_grey", { - description = "Grey Door Locked", + description = "Grey Door", inventory_image = "mydoors_grey_inv.png", groups = {choppy=2,cracky=2,door=1}, tiles = {{ name = "mydoors_grey.png", backface_culling = true }}, diff --git a/mods/mydoors/my_hidden_doors/mod.conf b/mods/mydoors/my_hidden_doors/mod.conf index 1803e410..d203566b 100644 --- a/mods/mydoors/my_hidden_doors/mod.conf +++ b/mods/mydoors/my_hidden_doors/mod.conf @@ -1 +1,3 @@ name = my_hidden_doors +description = These are doors that blend into the enviroment. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf.png b/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf.png index 12acc105..68f6b226 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf_inv.png b/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf_inv.png index a1f411e1..3d65dfbb 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf_inv.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_bookshelf_inv.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_brick.png b/mods/mydoors/my_hidden_doors/textures/mydoors_brick.png index ca36f55b..0420a139 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_brick.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_brick.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_chest.png b/mods/mydoors/my_hidden_doors/textures/mydoors_chest.png index 2890057a..28b3d2d9 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_chest.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_chest.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_chest_inv.png b/mods/mydoors/my_hidden_doors/textures/mydoors_chest_inv.png index 221c1b8a..8e346bdc 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_chest_inv.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_chest_inv.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_cobble.png b/mods/mydoors/my_hidden_doors/textures/mydoors_cobble.png index e0a38083..b0d583e4 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_cobble.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_cobble.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_desert_cobble.png b/mods/mydoors/my_hidden_doors/textures/mydoors_desert_cobble.png index a2a976e5..071131f2 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_desert_cobble.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_desert_cobble.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_furnace.png b/mods/mydoors/my_hidden_doors/textures/mydoors_furnace.png index a653a2f5..ae8ce873 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_furnace.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_furnace.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_furnace_inv.png b/mods/mydoors/my_hidden_doors/textures/mydoors_furnace_inv.png index 7f467176..f00d6869 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_furnace_inv.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_furnace_inv.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_grey.png b/mods/mydoors/my_hidden_doors/textures/mydoors_grey.png index d29024b6..0c5adfd9 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_grey.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_grey.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_grey_inv.png b/mods/mydoors/my_hidden_doors/textures/mydoors_grey_inv.png index 41129278..19c6b94d 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_grey_inv.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_grey_inv.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_stone.png b/mods/mydoors/my_hidden_doors/textures/mydoors_stone.png index cac44787..b884b718 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_stone.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_stone.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_stone_brick.png b/mods/mydoors/my_hidden_doors/textures/mydoors_stone_brick.png index a0c70a71..5a9b64ff 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_stone_brick.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_stone_brick.png differ diff --git a/mods/mydoors/my_hidden_doors/textures/mydoors_wood.png b/mods/mydoors/my_hidden_doors/textures/mydoors_wood.png index 7677d6b6..0ef5b063 100644 Binary files a/mods/mydoors/my_hidden_doors/textures/mydoors_wood.png and b/mods/mydoors/my_hidden_doors/textures/mydoors_wood.png differ diff --git a/mods/mydoors/my_misc_doors/bars.lua b/mods/mydoors/my_misc_doors/bars.lua index 92f01461..cdc25fcb 100644 --- a/mods/mydoors/my_misc_doors/bars.lua +++ b/mods/mydoors/my_misc_doors/bars.lua @@ -1,3 +1,16 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow or nil + +local nodebox = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.0625, -0.3125, 0.5, 0.0625}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + { 0.3125, -0.5, -0.0625, 0.4375, 0.5, 0.0625}, + { 0.125, -0.5, -0.0625, 0.25, 0.5, 0.0625}, + {-0.25, -0.5, -0.0625, -0.125, 0.5, 0.0625}, + } +} + minetest.register_node("my_misc_doors:door2a", { description = "Sliding Door", inventory_image = "mydoors_bars.png", @@ -13,22 +26,14 @@ minetest.register_node("my_misc_doors:door2a", { paramtype = "light", paramtype2 = "facedir", groups = {cracky = 3}, - node_box = { - type = "fixed", - fixed = { - {-0.4375, -0.5, -0.0625, -0.3125, 0.5, 0.0625}, - {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, - { 0.3125, -0.5, -0.0625, 0.4375, 0.5, 0.0625}, - { 0.125, -0.5, -0.0625, 0.25, 0.5, 0.0625}, - {-0.25, -0.5, -0.0625, -0.125, 0.5, 0.0625}, - } - }, + node_box = table.copy(nodebox), selection_box = { type = "fixed", fixed = { {-0.4375, -0.5, -0.0625, 0.4375, 1.5, 0.0625}, } }, + on_rotate = rotate_disallow, on_place = function(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above @@ -101,22 +106,14 @@ minetest.register_node("my_misc_doors:door2b", { paramtype = "light", paramtype2 = "facedir", groups = {cracky = 1}, - node_box = { - type = "fixed", - fixed = { - {-0.4375, -0.5, -0.0625, -0.3125, 0.5, 0.0625}, - {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, - { 0.3125, -0.5, -0.0625, 0.4375, 0.5, 0.0625}, - { 0.125, -0.5, -0.0625, 0.25, 0.5, 0.0625}, - {-0.25, -0.5, -0.0625, -0.125, 0.5, 0.0625}, - } - }, + node_box = table.copy(nodebox), selection_box = { type = "fixed", fixed = { {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_node("my_misc_doors:door2c", { tiles = { @@ -148,6 +145,7 @@ minetest.register_node("my_misc_doors:door2c", { } }, drop = "my_misc_doors:door2a", + on_rotate = rotate_disallow, after_place_node = function(pos, placer, itemstack, pointed_thing) local node = minetest.get_node(pos) local timer = minetest.get_node_timer(pos) @@ -203,11 +201,12 @@ minetest.register_node("my_misc_doors:door2d", { {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_craft({ output = "my_misc_doors:door2a 1", recipe = { - {"default:steel_ingot", "default:steelblock", ""}, + {"default:steelblock", "default:steel_ingot", ""}, {"default:steel_ingot", "default:steel_ingot", ""}, {"default:steelblock", "default:steel_ingot", ""} } diff --git a/mods/mydoors/my_misc_doors/depends.txt b/mods/mydoors/my_misc_doors/depends.txt deleted file mode 100644 index b678fab8..00000000 --- a/mods/mydoors/my_misc_doors/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -doors -my_door_wood -wool diff --git a/mods/mydoors/my_misc_doors/description.txt b/mods/mydoors/my_misc_doors/description.txt deleted file mode 100644 index d1b81cd6..00000000 --- a/mods/mydoors/my_misc_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Some misc. doors. diff --git a/mods/mydoors/my_misc_doors/locked.lua b/mods/mydoors/my_misc_doors/locked.lua index 49886950..336a9eb7 100644 --- a/mods/mydoors/my_misc_doors/locked.lua +++ b/mods/mydoors/my_misc_doors/locked.lua @@ -1,9 +1,9 @@ local mdoor_list = { --Number , Description , Inven Image , Image --- {"Misc Door 1" , "door1"}, --- {"Misc Door 2" , "door2"}, + {"Misc Door 1" , "door1"}, + {"Misc Door 2" , "door2"}, {"Misc Door 3" , "door3"}, {"Misc Door 4" , "door4"}, --- {"Misc Door 5" , "door5"}, + {"Misc Door 5" , "door5"}, } local function add_door(desc, img) diff --git a/mods/mydoors/my_misc_doors/mod.conf b/mods/mydoors/my_misc_doors/mod.conf index c90c8cdb..360a0829 100644 --- a/mods/mydoors/my_misc_doors/mod.conf +++ b/mods/mydoors/my_misc_doors/mod.conf @@ -1 +1,4 @@ name = my_misc_doors +description = Some misc. doors. +depends = default, my_door_wood, doors, wool +optional_depends = screwdriver diff --git a/mods/mydoors/my_misc_doors/textures/mydoors_bars.png b/mods/mydoors/my_misc_doors/textures/mydoors_bars.png index 74c4d429..702cca1f 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mydoors_bars.png and b/mods/mydoors/my_misc_doors/textures/mydoors_bars.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door1.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door1.png index eff44437..1eaa46a7 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door1.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door1.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door2.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door2.png index abdef916..a2416b06 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door2.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door2.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door2_inv.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door2_inv.png index a22d5870..89d89ac5 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door2_inv.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door2_inv.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door3.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door3.png index 753c5ad5..871fcec7 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door3.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door3.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door4.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door4.png index d8511c96..ef1c14fc 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door4.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door4.png differ diff --git a/mods/mydoors/my_misc_doors/textures/mymdoors_door5.png b/mods/mydoors/my_misc_doors/textures/mymdoors_door5.png index f40c63e7..06fc8f6d 100644 Binary files a/mods/mydoors/my_misc_doors/textures/mymdoors_door5.png and b/mods/mydoors/my_misc_doors/textures/mymdoors_door5.png differ diff --git a/mods/mydoors/my_misc_doors/unlocked.lua b/mods/mydoors/my_misc_doors/unlocked.lua index c7a94d33..3aec6bf2 100644 --- a/mods/mydoors/my_misc_doors/unlocked.lua +++ b/mods/mydoors/my_misc_doors/unlocked.lua @@ -1,8 +1,8 @@ local mdoor_list = { --Number , Description , Inven Image , Image {"Misc Door 1" , "door1"}, {"Misc Door 2" , "door2"}, --- {"Misc Door 3" , "door3"}, --- {"Misc Door 4" , "door4"}, + {"Misc Door 3" , "door3"}, + {"Misc Door 4" , "door4"}, {"Misc Door 5" , "door5"}, } diff --git a/mods/mydoors/my_old_doors/depends.txt b/mods/mydoors/my_old_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_old_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_old_doors/description.txt b/mods/mydoors/my_old_doors/description.txt deleted file mode 100644 index 2222ed0e..00000000 --- a/mods/mydoors/my_old_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Old style doors. diff --git a/mods/mydoors/my_old_doors/mod.conf b/mods/mydoors/my_old_doors/mod.conf index 7e738bef..6a4e733f 100644 --- a/mods/mydoors/my_old_doors/mod.conf +++ b/mods/mydoors/my_old_doors/mod.conf @@ -1 +1,3 @@ name = my_old_doors +description = Old style doors. +depends = default, my_door_wood, doors \ No newline at end of file diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old1.png b/mods/mydoors/my_old_doors/textures/mydoors_old1.png index d11afc92..790b4d45 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old1.png and b/mods/mydoors/my_old_doors/textures/mydoors_old1.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old1_inv.png b/mods/mydoors/my_old_doors/textures/mydoors_old1_inv.png index a742ffb4..7cf09727 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old1_inv.png and b/mods/mydoors/my_old_doors/textures/mydoors_old1_inv.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old2.png b/mods/mydoors/my_old_doors/textures/mydoors_old2.png index f744db94..5dc82ce0 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old2.png and b/mods/mydoors/my_old_doors/textures/mydoors_old2.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old2_inv.png b/mods/mydoors/my_old_doors/textures/mydoors_old2_inv.png index 9784fa46..a53b4e35 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old2_inv.png and b/mods/mydoors/my_old_doors/textures/mydoors_old2_inv.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old3.png b/mods/mydoors/my_old_doors/textures/mydoors_old3.png index cbe73129..ef8482d6 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old3.png and b/mods/mydoors/my_old_doors/textures/mydoors_old3.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old3_inv.png b/mods/mydoors/my_old_doors/textures/mydoors_old3_inv.png index 25ac985d..a66f14f0 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old3_inv.png and b/mods/mydoors/my_old_doors/textures/mydoors_old3_inv.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old4.png b/mods/mydoors/my_old_doors/textures/mydoors_old4.png index 3c9082c4..9164587d 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old4.png and b/mods/mydoors/my_old_doors/textures/mydoors_old4.png differ diff --git a/mods/mydoors/my_old_doors/textures/mydoors_old4_inv.png b/mods/mydoors/my_old_doors/textures/mydoors_old4_inv.png index 6963021e..ecbdb83c 100644 Binary files a/mods/mydoors/my_old_doors/textures/mydoors_old4_inv.png and b/mods/mydoors/my_old_doors/textures/mydoors_old4_inv.png differ diff --git a/mods/mydoors/my_old_doors/unlocked.lua b/mods/mydoors/my_old_doors/unlocked.lua index 1823bdb5..e323f3c6 100644 --- a/mods/mydoors/my_old_doors/unlocked.lua +++ b/mods/mydoors/my_old_doors/unlocked.lua @@ -1,8 +1,8 @@ local cdoor_list = { --Number , Description , Inven Image , Image --- { "1", "Old Door 1" , "old1"}, --- { "2", "Old Door 2" , "old2"}, --- { "3", "Old Door 3" , "old3"}, --- { "4", "Old Door 4" , "old4"}, + { "1", "Old Door 1" , "old1"}, + { "2", "Old Door 2" , "old2"}, + { "3", "Old Door 3" , "old3"}, + { "4", "Old Door 4" , "old4"}, } local function add_door(num, desc, img) @@ -11,7 +11,7 @@ local function add_door(num, desc, img) inventory_image = "mydoors_"..img.."_inv.png", groups = {choppy=2,cracky=2,door=1}, tiles = {{ name = "mydoors_"..img..".png", backface_culling = true }}, - protected = true, + protected = false, }) end diff --git a/mods/mydoors/my_saloon_doors/depends.txt b/mods/mydoors/my_saloon_doors/depends.txt deleted file mode 100644 index b58752b3..00000000 --- a/mods/mydoors/my_saloon_doors/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -my_door_wood diff --git a/mods/mydoors/my_saloon_doors/description.txt b/mods/mydoors/my_saloon_doors/description.txt deleted file mode 100644 index ba4ffe68..00000000 --- a/mods/mydoors/my_saloon_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Saloon style doors. diff --git a/mods/mydoors/my_saloon_doors/init.lua b/mods/mydoors/my_saloon_doors/init.lua index 5f3ee88d..ac14b48a 100644 --- a/mods/mydoors/my_saloon_doors/init.lua +++ b/mods/mydoors/my_saloon_doors/init.lua @@ -1,21 +1,23 @@ +local rotate_simple = rawget(_G, "screwdriver") and screwdriver.rotate_simple or nil + local doorcol = { - {"white", "White", "^[colorize:white:120"}, - {"red", "Red", "^[colorize:red:120"}, - {"black", "Black", "^[colorize:black:220"}, - {"brown", "Brown", "^[colorize:black:180"}, - {"grey", "Grey", "^[colorize:white:120^[colorize:black:120"}, - {"dark_grey", "Dark grey", "^[colorize:white:120^[colorize:black:200"}, - {"yellow", "Yellow", "^[colorize:yellow:100"}, + {"white", "White", "^[colorize:white:120", "my_door_wood:wood_white"}, + {"red", "Red", "^[colorize:red:120", "my_door_wood:wood_red"}, + {"black", "Black", "^[colorize:black:220", "my_door_wood:wood_black"}, + {"brown", "Brown", "^[colorize:black:180", "my_door_wood:wood_brown"}, + {"grey", "Grey", "^[colorize:white:120^[colorize:black:120", "my_door_wood:wood_grey"}, + {"dark_grey", "Dark grey", "^[colorize:white:120^[colorize:black:200", "my_door_wood:wood_dark_grey"}, + {"yellow", "Yellow", "^[colorize:yellow:100", "my_door_wood:wood_yellow"}, } -local function add_door(col, des, tint) +local function add_door(col, des, tint, craft) minetest.register_node("my_saloon_doors:door1a_"..col, { description = des.." Saloon Door ", tiles = {"mydoors_saloon_bottom.png"..tint}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - groups = {cracky = 3}, + groups = {choppy = 3}, node_box = { type = "fixed", fixed = { @@ -37,11 +39,12 @@ local function add_door(col, des, tint) {-0.5, -0.1875, -0.0625, 0.5, 1, 0.0625}, } }, + on_rotate = rotate_simple, on_place = function(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above local pos2 = vector.add(pos1, {x=0,y=1,z=0}) - + if not placer or not placer:is_player() then return end @@ -84,7 +87,7 @@ local function add_door(col, des, tint) drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - groups = {cracky = 1}, + groups = {choppy = 1}, node_box = { type = "fixed", fixed = { @@ -106,12 +109,21 @@ local function add_door(col, des, tint) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_simple, on_timer = function(pos, elapsed) local node = minetest.get_node(pos) minetest.set_node(pos, {name="my_saloon_doors:door1a_"..col, param2=node.param2}) -- minetest.set_node(vector.add(pos, {x=0,y=1,z=0}),{name="my_saloon_doors:door1b_"..col,param2=node.param2}) end, }) + minetest.register_craft({ + output = "my_saloon_doors:door1a_"..col, + recipe = { + {"", "", ""}, + {craft, "", craft}, + {craft, craft, craft} + } + }) end for _,door in ipairs(doorcol) do diff --git a/mods/mydoors/my_saloon_doors/mod.conf b/mods/mydoors/my_saloon_doors/mod.conf index f58b21ea..8a7504a9 100644 --- a/mods/mydoors/my_saloon_doors/mod.conf +++ b/mods/mydoors/my_saloon_doors/mod.conf @@ -1 +1,4 @@ name = my_saloon_doors +description = Saloon style doors. +depends = default, my_door_wood, doors +optional_depends = screwdriver diff --git a/mods/mydoors/my_saloon_doors/textures/mydoors_saloon_bottom.png b/mods/mydoors/my_saloon_doors/textures/mydoors_saloon_bottom.png index 82ea2420..58523f71 100644 Binary files a/mods/mydoors/my_saloon_doors/textures/mydoors_saloon_bottom.png and b/mods/mydoors/my_saloon_doors/textures/mydoors_saloon_bottom.png differ diff --git a/mods/mydoors/my_sliding_doors/description.txt b/mods/mydoors/my_sliding_doors/description.txt deleted file mode 100644 index 4e043ee9..00000000 --- a/mods/mydoors/my_sliding_doors/description.txt +++ /dev/null @@ -1 +0,0 @@ -Shoji sliding doors and panels. diff --git a/mods/mydoors/my_sliding_doors/jdoors1.lua b/mods/mydoors/my_sliding_doors/jdoors1.lua index 1b50c945..3cba1ad9 100644 --- a/mods/mydoors/my_sliding_doors/jdoors1.lua +++ b/mods/mydoors/my_sliding_doors/jdoors1.lua @@ -1,3 +1,5 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow or nil + local doors = { {"my_sliding_doors:door1a","my_sliding_doors:door1b","my_sliding_doors:door1c","my_sliding_doors:door1d","1","White"}, {"my_sliding_doors:door2a","my_sliding_doors:door2b","my_sliding_doors:door2c","my_sliding_doors:door2d","2","Flower"}, @@ -12,7 +14,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) local par = minetest.dir_to_facedir(placer:get_look_dir()) local par2 = par + 2 local above = vector.add(pos, {x=0,y=1,z=0}) - + if not placer or not placer:is_player() then return end @@ -106,7 +108,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -130,11 +132,9 @@ local function add_door(doora, doorb, doorc, doord, num, des) {-0.5, -0.5, 0.0625, 0.5, 1.5, 0.1875} } }, - + on_rotate = rotate_disallow, on_place = onplace, - after_destruct = afterdestruct, - on_rightclick = rightclick, }) minetest.register_node(doorb, { @@ -150,7 +150,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -173,6 +173,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_node(doorc, { tiles = { @@ -188,7 +189,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype2 = "facedir", sunlight_propagates = true, drop = doora, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -211,6 +212,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) {-1.5, -0.5, -0.0625, -0.5, 1.5, 0.1875} } }, + on_rotate = rotate_disallow, after_place_node = afterplace, after_destruct = afterdestruct, on_rightclick = rightclick, @@ -228,7 +230,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -251,6 +253,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_node("my_sliding_doors:jpanel"..num, { description = des.." Panel", @@ -268,7 +271,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -280,13 +283,14 @@ local function add_door(doora, doorb, doorc, doord, num, des) }, selection_box = {type = "fixed", fixed = {{-0.5, -0.5, -0.0625, 0.5, 1.5, 0.0625}}}, collision_box = {type = "fixed", fixed = {{-0.5, -0.5, -0.0625, 0.5, 1.5, 0.0625}}}, + on_rotate = rotate_disallow, on_place = function(itemstack, placer, pointed_thing) local p2 = minetest.dir_to_facedir(placer:get_look_dir()) local pos = pointed_thing.above local pos2 = vector.add(pos, {x=0,y=1,z=0}) local na = minetest.get_node(pos2) - + if not placer or not placer:is_player() then return end @@ -337,7 +341,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype2 = "facedir", sunlight_propagates = true, drop = "", - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -353,6 +357,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) {0, 0, 0, 0, 0, 0} } }, + on_rotate = rotate_disallow, }) minetest.register_node("my_sliding_doors:jpanel_corner_"..num, { description = des.." Panel Corner", @@ -370,7 +375,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -389,12 +394,13 @@ local function add_door(doora, doorb, doorc, doord, num, des) {-0.5, -0.5, -0.0625, 0, 1.5, 0.0625}, } }, + on_rotate = rotate_disallow, on_place = function(itemstack, placer, pointed_thing) local p2 = minetest.dir_to_facedir(placer:get_look_dir()) local pos = pointed_thing.above local pos2 = vector.add(pos, {x=0,y=1,z=0}) local na = minetest.get_node(pos2) - + if not placer or not placer:is_player() then return end @@ -445,7 +451,7 @@ local function add_door(doora, doorb, doorc, doord, num, des) paramtype2 = "facedir", sunlight_propagates = true, drop = "", - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -463,9 +469,82 @@ local function add_door(doora, doorb, doorc, doord, num, des) {0, 0, 0, 0, 0, 0} } }, + on_rotate = rotate_disallow, }) end for _,door in ipairs(doors) do add_door(unpack(door)) end + +-- jpanel +minetest.register_craft({ + output = "my_sliding_doors:jpanel1", + recipe = { + {"group:stick", "default:paper", ""}, + {"group:stick", "default:paper", ""}, + {"group:stick", "default:paper", ""} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:jpanel2", + recipe = { + {"group:stick", "default:paper", ""}, + {"group:stick", "default:paper", "flowers:rose"}, + {"group:stick", "default:paper", ""} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:jpanel3", + recipe = { + {"group:stick", "default:paper", ""}, + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "default:paper", ""} + } +}) + +-- jpanel_corner +minetest.register_craft({ + output = "my_sliding_doors:jpanel_corner_1", + recipe = { + {"my_sliding_doors:jpanel1"} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:jpanel_corner_2", + recipe = { + {"my_sliding_doors:jpanel2"} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:jpanel_corner_3", + recipe = { + {"my_sliding_doors:jpanel3"} + } +}) + +-- double door +minetest.register_craft({ + output = "my_sliding_doors:door1a", + recipe = { + {"my_sliding_doors:jpanel1", "my_sliding_doors:jpanel1"} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:door2a", + recipe = { + {"my_sliding_doors:jpanel2", "my_sliding_doors:jpanel2"} + } +}) + +minetest.register_craft({ + output = "my_sliding_doors:door3a", + recipe = { + {"my_sliding_doors:jpanel3", "my_sliding_doors:jpanel3"} + } +}) \ No newline at end of file diff --git a/mods/mydoors/my_sliding_doors/jdoors2.lua b/mods/mydoors/my_sliding_doors/jdoors2.lua index 3680b66f..d6de88a1 100644 --- a/mods/mydoors/my_sliding_doors/jdoors2.lua +++ b/mods/mydoors/my_sliding_doors/jdoors2.lua @@ -1,3 +1,5 @@ +local rotate_disallow = rawget(_G, "screwdriver") and screwdriver.disallow + local doors = { {"my_sliding_doors:door1a","my_sliding_doors:door1b","my_sliding_doors:door1c","my_sliding_doors:door1d","1","White Right"}, {"my_sliding_doors:door2a","my_sliding_doors:door2b","my_sliding_doors:door2c","my_sliding_doors:door2d","2","Flower Right"}, @@ -7,8 +9,8 @@ local doors = { local function add_door(doora, doorb, doorc, doord, num) local function onplace(itemstack, placer, pointed_thing) local pos1 = pointed_thing.above - local pos2 = vector.add(pos, {x=0,y=1,z=0}) - + local pos2 = vector.add(pos1, {x=0,y=1,z=0}) + if not placer or not placer:is_player() then return end @@ -20,7 +22,6 @@ local function add_door(doora, doorb, doorc, doord, num) end local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - local p4 = (p2+2)%4 local pos3 = vector.add(pos1, minetest.facedir_to_dir((p2-1)%4)) local player_name = placer:get_player_name() @@ -110,7 +111,7 @@ local function add_door(doora, doorb, doorc, doord, num) paramtype2 = "facedir", drop = doora, sunlight_propagates = true, - groups = {cracky = 3}, + groups = {choppy = 3, cracky = 3}, node_box = { type = "fixed", fixed = { @@ -134,11 +135,9 @@ local function add_door(doora, doorb, doorc, doord, num) {-0.5, -0.5, -0.0625, 0.5, 1.5, -0.1875} } }, - + on_rotate = rotate_disallow, on_place = onplace, - after_destruct = afterdestruct, - on_rightclick = rightclick, }) minetest.register_node(doorb.."2", { @@ -154,7 +153,7 @@ local function add_door(doora, doorb, doorc, doord, num) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -177,6 +176,7 @@ local function add_door(doora, doorb, doorc, doord, num) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) minetest.register_node(doorc.."2", { tiles = { @@ -192,7 +192,7 @@ local function add_door(doora, doorb, doorc, doord, num) paramtype2 = "facedir", sunlight_propagates = true, drop = doora, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -215,6 +215,7 @@ local function add_door(doora, doorb, doorc, doord, num) {-1.5, -0.5, 0.0625, -0.5, 1.5, -0.1875} } }, + on_rotate = rotate_disallow, after_place_node = afterplace, after_destruct = afterdestruct, on_rightclick = rightclick, @@ -232,7 +233,7 @@ local function add_door(doora, doorb, doorc, doord, num) paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = {cracky = 1}, + groups = {choppy = 1, cracky = 1}, node_box = { type = "fixed", fixed = { @@ -255,6 +256,7 @@ local function add_door(doora, doorb, doorc, doord, num) {0, 0, 0, 0, 0, 0}, } }, + on_rotate = rotate_disallow, }) end diff --git a/mods/mydoors/my_sliding_doors/mod.conf b/mods/mydoors/my_sliding_doors/mod.conf index ffe352c4..980cdf92 100644 --- a/mods/mydoors/my_sliding_doors/mod.conf +++ b/mods/mydoors/my_sliding_doors/mod.conf @@ -1 +1,4 @@ name = my_sliding_doors +description = Shoji sliding doors and panels. +depends = default, flowers +optional_depends = screwdriver diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_bottom.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_bottom.png index 37c393db..b5eb5697 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_bottom.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_bottom.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_edge.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_edge.png index d4725341..cf7a1953 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_edge.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_edge.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_inv.png index fb2e4d80..2f9738a5 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_top.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_top.png index 04559279..a220bd32 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_top.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door1a_top.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_bottom.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_bottom.png index eb8959bf..bc45a985 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_bottom.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_bottom.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_edge.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_edge.png index d4725341..cf7a1953 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_edge.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_edge.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_inv.png index 50de9969..55ca7954 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_top.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_top.png index 5862718c..b34a6109 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_top.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door2a_top.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_bottom.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_bottom.png index 937a7ac4..f5aa6c90 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_bottom.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_bottom.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_edge.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_edge.png index d4725341..cf7a1953 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_edge.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_edge.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_inv.png index d9eb9a8b..8c43faee 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_top.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_top.png index 89d9fe84..23726e75 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_top.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_door3a_top.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_corner_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_corner_inv.png index 37f5f510..e6f4e0a1 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_corner_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_corner_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_inv.png index 080cb698..11d3ba5b 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel1_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_corner_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_corner_inv.png index a9846cf4..cca5bc5d 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_corner_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_corner_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_inv.png index a59c83b0..e543363b 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel2_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_corner_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_corner_inv.png index a8fe7f09..a055a520 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_corner_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_corner_inv.png differ diff --git a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_inv.png b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_inv.png index 7d15f046..837349b0 100644 Binary files a/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_inv.png and b/mods/mydoors/my_sliding_doors/textures/myjdoors_panel3_inv.png differ diff --git a/mods/mymillwork/nodes.lua b/mods/mymillwork/nodes.lua index 98049df2..1fc24314 100644 --- a/mods/mymillwork/nodes.lua +++ b/mods/mymillwork/nodes.lua @@ -375,7 +375,7 @@ end function mymillwork.register_all(suffix, model, mdesc, sbox, cbox, node_suffix, material, desc, image, group) - minetest.register_node("mymillwork:" .. suffix .. "_" .. node_suffix, { + minetest.register_node(":mymillwork:" .. suffix .. "_" .. node_suffix, { description = desc .. " " .. mdesc, drawtype = "mesh", mesh = model, diff --git a/mods/mypaths/crafts.lua b/mods/mypaths/crafts.lua index e83e38f3..cd4aac3e 100644 --- a/mods/mypaths/crafts.lua +++ b/mods/mypaths/crafts.lua @@ -5,8 +5,9 @@ minetest.register_node("mypaths:dirt_road", { tiles = {"mypaths_dirt_road.png"}, drawtype = "normal", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Craft minetest.register_craft({ type = "cooking", diff --git a/mods/mypaths/dirt_road.lua b/mods/mypaths/dirt_road.lua index 8745479f..5bd33043 100644 --- a/mods/mypaths/dirt_road.lua +++ b/mods/mypaths/dirt_road.lua @@ -14,8 +14,9 @@ minetest.register_node("mypaths:dirt_road_side", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Side Angle minetest.register_node("mypaths:dirt_road_side_angle", { description = "Dirt Road Side Angle", @@ -30,8 +31,9 @@ minetest.register_node("mypaths:dirt_road_side_angle", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Side Angle End minetest.register_node("mypaths:dirt_road_side_angle_end1", { description = "Dirt Road Angle End 1", @@ -46,8 +48,9 @@ minetest.register_node("mypaths:dirt_road_side_angle_end1", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Side Angle End minetest.register_node("mypaths:dirt_road_side_angle_end2", { description = "Dirt Road Angle End 2", @@ -62,8 +65,9 @@ minetest.register_node("mypaths:dirt_road_side_angle_end2", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Side Angle End minetest.register_node("mypaths:dirt_road_side_angle_end3", { description = "Dirt Road Angle End 3", @@ -78,8 +82,9 @@ minetest.register_node("mypaths:dirt_road_side_angle_end3", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Side Angle End minetest.register_node("mypaths:dirt_road_side_angle_end4", { description = "Dirt Road Angle End 4", @@ -94,8 +99,9 @@ minetest.register_node("mypaths:dirt_road_side_angle_end4", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Inside Corner minetest.register_node("mypaths:dirt_road_icorner", { description = "Dirt Road Inside Corner", @@ -110,8 +116,9 @@ minetest.register_node("mypaths:dirt_road_icorner", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) --Dirt Road Outside Corner minetest.register_node("mypaths:dirt_road_ocorner", { @@ -127,6 +134,7 @@ minetest.register_node("mypaths:dirt_road_ocorner", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), - }) +}) diff --git a/mods/mypaths/dirt_road_slopes.lua b/mods/mypaths/dirt_road_slopes.lua index 6855dee7..7f26389d 100644 --- a/mods/mypaths/dirt_road_slopes.lua +++ b/mods/mypaths/dirt_road_slopes.lua @@ -31,6 +31,7 @@ minetest.register_node("mypaths:dirt_road_slope", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox, @@ -57,6 +58,7 @@ minetest.register_node("mypaths:dirt_road_slope2", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox, @@ -81,6 +83,7 @@ minetest.register_node("mypaths:dirt_dirt_slope", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox, @@ -96,6 +99,7 @@ minetest.register_node("mypaths:dirt_slope_long", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox_long, @@ -120,6 +124,7 @@ minetest.register_node("mypaths:dirt_side_slope_long", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox_long, @@ -144,6 +149,7 @@ minetest.register_node("mypaths:dirt_side_slope_long2", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults(), on_place = minetest.rotate_node, collision_box = slope_cbox_long, diff --git a/mods/mypaths/grass.lua b/mods/mypaths/grass.lua index f12ed395..d05e6b6b 100644 --- a/mods/mypaths/grass.lua +++ b/mods/mypaths/grass.lua @@ -59,7 +59,7 @@ local icorner_cbox_long = { {-0.5, -0.5, -1.5, 1.25, -0.25, 0.5}, {-0.5, -0.5, -1.5, 1.5, -0.375, 0.5}, {-0.5, -0.5, -0.25, 1.5, 0.25, 0.5}, - {-0.5, -0.5, -0.5, 1.5, 0.125, 0.5}, + {-0.5, -0.5, -0.5, 1.5, 0.125, 0.5}, {-0.5, -0.5, -0.75, 1.5, 0, 0.5}, {-0.5, -0.5, -1, 1.5, -0.125, 0.5}, {-0.5, -0.5, -1.25, 1.5, -0.25, 0.5}, @@ -72,10 +72,10 @@ local ocorner_cbox_long = { {-0.5, -0.5, 0.25, -0.25, 0.5, 0.5}, {-0.5, -0.5, 0, 0, 0.375, 0.5}, {-0.5, -0.5, -0.25, 0.25, 0.25, 0.5}, - {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, - {-0.5, -0.5, -0.75, 0.75, 0, 0.5}, - {-0.5, -0.5, -1, 1, -0.125, 0.5}, - {-0.5, -0.5, -1.25, 1.25, -0.25, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, -0.5, -0.75, 0.75, 0, 0.5}, + {-0.5, -0.5, -1, 1, -0.125, 0.5}, + {-0.5, -0.5, -1.25, 1.25, -0.25, 0.5}, {-0.5, -0.5, -1.5, 1.5, -0.375, 0.5}, } } @@ -88,6 +88,7 @@ minetest.register_node("mypaths:grass", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -110,6 +111,7 @@ minetest.register_node("mypaths:grass_slope", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -134,6 +136,7 @@ minetest.register_node("mypaths:grass_slope_long", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -159,6 +162,7 @@ minetest.register_node("mypaths:grass_ocorner", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -185,6 +189,7 @@ minetest.register_node("mypaths:grass_icorner", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -209,6 +214,7 @@ minetest.register_node("mypaths:grass_slope_long_oc", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), @@ -233,6 +239,7 @@ minetest.register_node("mypaths:grass_slope_long_ic", { paramtype = "light", paramtype2 = "facedir", groups = {crumbly = 2, soil=1}, + is_ground_content = false, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.25}, }), diff --git a/mods/mypaths/stone_paths.lua b/mods/mypaths/stone_paths.lua index fc4d8312..6a134e49 100644 --- a/mods/mypaths/stone_paths.lua +++ b/mods/mypaths/stone_paths.lua @@ -1,6 +1,6 @@ local material = { { "Cobble", "default_cobble","cobble"}, - { "Sandstone", "default_sandstone","sandstone"}, + { "Sandstone", "default_sandstone","sandstone"}, { "Desert Stone", "default_desert_stone","desert_stone"}, { "Stone", "default_stone","stone"}, { "Tree", "default_tree","tree"}, @@ -29,29 +29,30 @@ minetest.register_node("mypaths:path_"..mat, { -- walkable = true, climbable = false, groups = {cracky=3}, + is_ground_content = false, stack_max = 250, sounds = default.node_sound_stone_defaults(), node_box = { type = "fixed", fixed = { - {-0.375, -0.5, -0.4375, -0.125, -0.4375, 0}, - {-0.4375, -0.5, -0.3125, -0.125, -0.4375, -0.0625}, - {-0.375, -0.5, 0.1875, 0, -0.4375, 0.375}, - {-0.3125, -0.5, 0.0625, -0.0625, -0.4375, 0.4375}, - {0.125, -0.5, 0.125, 0.3125, -0.4375, 0.3125}, - {0.1875, -0.5, 0.1875, 0.4375, -0.4375, 0.4375}, - {0, -0.5, -0.375, 0.4375, -0.4375, -0.1875}, - {0.0625, -0.5, -0.4375, 0.375, -0.4375, -0.125}, - {0.0625, -0.5, -0.0625, 0.25, -0.4375, 0.0625}, - {0, -0.5, -0.0625, 0.0625, -0.4375, 0}, + {-0.375, -0.5, -0.4375, -0.125, -0.4375, 0}, + {-0.4375, -0.5, -0.3125, -0.125, -0.4375, -0.0625}, + {-0.375, -0.5, 0.1875, 0, -0.4375, 0.375}, + {-0.3125, -0.5, 0.0625, -0.0625, -0.4375, 0.4375}, + {0.125, -0.5, 0.125, 0.3125, -0.4375, 0.3125}, + {0.1875, -0.5, 0.1875, 0.4375, -0.4375, 0.4375}, + {0, -0.5, -0.375, 0.4375, -0.4375, -0.1875}, + {0.0625, -0.5, -0.4375, 0.375, -0.4375, -0.125}, + {0.0625, -0.5, -0.0625, 0.25, -0.4375, 0.0625}, + {0, -0.5, -0.0625, 0.0625, -0.4375, 0}, } }, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, - }, - }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, on_place = minetest.rotate_node }) --Craft diff --git a/mods/mywalls/.cdb.json b/mods/mywalls/.cdb.json new file mode 100644 index 00000000..8b4b92cd --- /dev/null +++ b/mods/mywalls/.cdb.json @@ -0,0 +1,5 @@ +{ + "type": "MOD", + "tags": ["walls", "connect", "stone", "building"], + "license": "DWYWPL" +} diff --git a/mods/mywalls/.luacheckrc b/mods/mywalls/.luacheckrc new file mode 100644 index 00000000..72016a2d --- /dev/null +++ b/mods/mywalls/.luacheckrc @@ -0,0 +1,12 @@ +unused_args = false +allow_defined_top = true +max_line_length = false + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, +} + +globals = { + "minetest", "walls", "default" +} diff --git a/mods/mywalls/depends.txt b/mods/mywalls/depends.txt deleted file mode 100644 index 1cec9880..00000000 --- a/mods/mywalls/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -walls diff --git a/mods/mywalls/description.txt b/mods/mywalls/description.txt deleted file mode 100644 index d4c15044..00000000 --- a/mods/mywalls/description.txt +++ /dev/null @@ -1,14 +0,0 @@ -Adds more wall types for walls mod. - -Walls mod comes with Minetest Game. It includes 3 types of walls. This mod extends it toinclue 7 more types. - -Included in this mod are - -stone -stone brick -desert stone -desert stone brick -sandstone -sandstone brick -brick - diff --git a/mods/mywalls/init.lua b/mods/mywalls/init.lua index 4c195c67..5ab6662a 100644 --- a/mods/mywalls/init.lua +++ b/mods/mywalls/init.lua @@ -1,20 +1,64 @@ -walls.register(":walls:brick", "Brick Wall", "default_brick.png", +local S = minetest.get_translator("mywalls") + +walls.register(":walls:brick", S("Brick Wall"), "default_brick.png", "default:brick", default.node_sound_stone_defaults()) -walls.register(":walls:sandstone", "Sandstone Wall", "default_sandstone.png", + +walls.register(":walls:sandstone", S("Sandstone Wall"), "default_sandstone.png", "default:sandstone", default.node_sound_stone_defaults()) -walls.register(":walls:sandstone_brick", "Sandstone Brick Wall", "default_sandstone_brick.png", +walls.register(":walls:sandstone_brick", S("Sandstone Brick Wall"), "default_sandstone_brick.png", "default:sandstonebrick", default.node_sound_stone_defaults()) -walls.register(":walls:stone", "Stone Wall", "default_stone.png", +walls.register(":walls:sandstone_block", S("Sandstone Block Wall"), "default_sandstone_block.png", + "default:sandstone_block", default.node_sound_stone_defaults()) + + +walls.register(":walls:stone", S("Stone Wall"), "default_stone.png", "default:stone", default.node_sound_stone_defaults()) -walls.register(":walls:stone_brick", "Stone Brick Wall", "default_stone_brick.png", +walls.register(":walls:stone_brick", S("Stone Brick Wall"), "default_stone_brick.png", "default:stonebrick", default.node_sound_stone_defaults()) -walls.register(":walls:desert_stone", "Desert Stone Wall", "default_desert_stone.png", +walls.register(":walls:stone_block", S("Stone Block Wall"), "default_stone_block.png", + "default:stone_block", default.node_sound_stone_defaults()) + + +walls.register(":walls:desert_stone", S("Desert Stone Wall"), "default_desert_stone.png", "default:desert_stone", default.node_sound_stone_defaults()) -walls.register(":walls:desert_stonebrick", "Desert Stone Brick Wall", "default_desert_stone_brick.png", +walls.register(":walls:desert_stonebrick", S("Desert Stone Brick Wall"), "default_desert_stone_brick.png", "default:desert_stonebrick", default.node_sound_stone_defaults()) + +walls.register(":walls:desert_stone_block", S("Desert Stone Block Wall"), "default_desert_stone_block.png", + "default:desert_stone_block", default.node_sound_stone_defaults()) + + +walls.register(":walls:desert_sandstone", S("Desert Sandstone Wall"), "default_desert_sandstone.png", + "default:desert_sandstone", default.node_sound_stone_defaults()) + +walls.register(":walls:desert_sandstone_brick", S("Desert Sandstone Brick Wall"), "default_desert_sandstone_brick.png", + "default:desert_sandstone_brick", default.node_sound_stone_defaults()) + +walls.register(":walls:desert_sandstone_block", S("Desert Sandstone Block Wall"), "default_desert_sandstone_block.png", + "default:desert_sandstone_block", default.node_sound_stone_defaults()) + + +walls.register(":walls:silver_sandstone", S("Silver Sandstone Wall"), "default_silver_sandstone.png", + "default:silver_sandstone", default.node_sound_stone_defaults()) + +walls.register(":walls:silver_sandstone_brick", S("Silver Sandstone Brick Wall"), "default_silver_sandstone_brick.png", + "default:silver_sandstone_brick", default.node_sound_stone_defaults()) + +walls.register(":walls:silver_sandstone_block", S("Silver Sandstone Block Wall"), "default_silver_sandstone_block.png", + "default:silver_sandstone_block", default.node_sound_stone_defaults()) + + +walls.register(":walls:obsidian", S("Obsidian Wall"), "default_obsidian.png", + "default:obsidian", default.node_sound_stone_defaults()) + +walls.register(":walls:obsidian_brick", S("Obsidian Brick Wall"), "default_obsidian_brick.png", + "default:obsidian_brick", default.node_sound_stone_defaults()) + +walls.register(":walls:obsidian_block", S("Obsidian Block Wall"), "default_obsidian_block.png", + "default:obsidian_block", default.node_sound_stone_defaults()) diff --git a/mods/mywalls/locale/mywalls.ru.tr b/mods/mywalls/locale/mywalls.ru.tr new file mode 100644 index 00000000..fe849f58 --- /dev/null +++ b/mods/mywalls/locale/mywalls.ru.tr @@ -0,0 +1,20 @@ +# textdomain: mywalls +Brick Wall=Ограда из кирпича +Sandstone Wall=Ограда из песчаника +Sandstone Brick Wall=Ограда из кирпича песчаника +Sandstone Block Wall=Ограда из блока песчаника +Stone Wall=Ограда из камня +Stone Brick Wall=Ограда из каменного кирпича +Stone Block Wall=Ограда из каменного блока +Desert Stone Wall=Ограда из пустынного камня +Desert Stone Brick Wall=Ограда из кирпича пустынного камня +Desert Stone Block Wall=Ограда из блока пустынного камня +Desert Sandstone Wall=Ограда из пустынного песчаника +Desert Sandstone Brick Wall=Ограда из кирпича пустынного песчаника +Desert Sandstone Block Wall=Ограда из блока пустынного песчаника +Silver Sandstone Wall=Ограда из серебряного песчаника +Silver Sandstone Brick Wall=Ограда из кирпича серебряного песчаника +Silver Sandstone Block Wall=Ограда из блока серебряного песчаника +Obsidian Wall=Ограда из обсидиана +Obsidian Brick Wall=Ограда из обсидианового кирпича +Obsidian Block Wall=Ограда из обсидианового блока diff --git a/mods/mywalls/locale/mywalls.sv.tr b/mods/mywalls/locale/mywalls.sv.tr new file mode 100644 index 00000000..de00dea0 --- /dev/null +++ b/mods/mywalls/locale/mywalls.sv.tr @@ -0,0 +1,20 @@ +# textdomain: mywalls +Brick Wall=Tegelvägg +Sandstone Wall=Sandstensvägg +Sandstone Brick Wall=Sandstenstegelvägg +Sandstone Block Wall=Sandstensblockvägg +Stone Wall=Stenmur +Stone Brick Wall=Stentegelvägg +Stone Block Wall=Stenblockvägg +Desert Stone Wall=Ökenstensvägg +Desert Stone Brick Wall=Ökenstenstegelvägg +Desert Stone Block Wall=Ökenstensblockvägg +Desert Sandstone Wall=Ökensandstensvägg +Desert Sandstone Brick Wall=Ökensandstenstegelvägg +Desert Sandstone Block Wall=Ökensandstensblockvägg +Silver Sandstone Wall=Silversandstensvägg +Silver Sandstone Brick Wall=Silversandstenstegelvägg +Silver Sandstone Block Wall=Silversandstensblockvägg +Obsidian Wall=Obsidianvägg +Obsidian Brick Wall=Obsidiantegelvägg +Obsidian Block Wall=Obsidianblockvägg diff --git a/mods/mywalls/locale/mywalls.uk.tr b/mods/mywalls/locale/mywalls.uk.tr new file mode 100644 index 00000000..f5247ec6 --- /dev/null +++ b/mods/mywalls/locale/mywalls.uk.tr @@ -0,0 +1,20 @@ +# textdomain: mywalls +Brick Wall=Огорожа з цегли +Sandstone Wall=Огорожа з піщаника +Sandstone Brick Wall=Огорожа з цегли піщаника +Sandstone Block Wall=Огорожа з блоку піщаника +Stone Wall=Огорожа з каменю +Stone Brick Wall=Огорожа з кам'яної цегли +Stone Block Wall=Огорожа з кам'яного блоку +Desert Stone Wall=Огорожа з пустельного каменю +Desert Stone Brick Wall=Огорожа з цегли пустельного каменю +Desert Stone Block Wall=Огорожа з блоку пустельного каменю +Desert Sandstone Wall=Огорожа з пустельного пісковика +Desert Sandstone Brick Wall=Огорожа з цегли пустельного піщаника +Desert Sandstone Block Wall=Огорожа з блоку пустельного піщаника +Silver Sandstone Wall=Огорожа з срібного піщаника +Silver Sandstone Brick Wall=Огорожа з цегли срібного піщаника +Silver Sandstone Block Wall=Огорожа з блоку срібного піщаника +Obsidian Wall=Огорожа з обсидіану +Obsidian Brick Wall=Огорожа з обсидіанової цегли +Obsidian Block Wall=Огорожа з обсидіанового блоку diff --git a/mods/mywalls/locale/template.txt b/mods/mywalls/locale/template.txt new file mode 100644 index 00000000..132abc46 --- /dev/null +++ b/mods/mywalls/locale/template.txt @@ -0,0 +1,20 @@ +# textdomain: mywalls +Brick Wall= +Sandstone Wall= +Sandstone Brick Wall= +Sandstone Block Wall= +Stone Wall= +Stone Brick Wall= +Stone Block Wall= +Desert Stone Wall= +Desert Stone Brick Wall= +Desert Stone Block Wall= +Desert Sandstone Wall= +Desert Sandstone Brick Wall= +Desert Sandstone Block Wall= +Silver Sandstone Wall= +Silver Sandstone Brick Wall= +Silver Sandstone Block Wall= +Obsidian Wall= +Obsidian Brick Wall= +Obsidian Block Wall= diff --git a/mods/mywalls/mod.conf b/mods/mywalls/mod.conf index 4ae737f9..254a16e3 100644 --- a/mods/mywalls/mod.conf +++ b/mods/mywalls/mod.conf @@ -1,2 +1,4 @@ name = mywalls -tags = walls, connect, more +title = My Walls +description = Adds more wall types for MTG/walls mod. +depends = default, walls diff --git a/mods/mywalls/readme.md b/mods/mywalls/readme.md index 6e6fb004..b9d6af4e 100644 --- a/mods/mywalls/readme.md +++ b/mods/mywalls/readme.md @@ -1,17 +1,39 @@ -mywalls +# `mywalls` minetest mod -Adds more wall types for walls mod. +[![ContentDB](https://content.minetest.net/packages/Don/mywalls/shields/downloads/)](https://content.minetest.net/packages/Don/mywalls/) -Walls mod comes with Minetest Game. It includes 3 types of walls. This mod extends it toinclue 7 more types. +Adds more wall types for [`walls` mod from `minetest_game`](https://github.com/minetest/minetest_game/tree/master/mods/walls). -Included in this mod are +Walls mod comes with Minetest Game. It includes **only** 3 types of walls. -stone -stone brick -desert stone -desert stone brick -sandstone -sandstone brick -brick +This mod extends it to include 19 more types. +All walls are added into the `walls` mod namespace and use its API. -Licence - DWYWPL +![walls](screenshot.png) + +Included in this mod walls are: + - wall for `"default:brick"` + - walls for: + - `"default:sandstone"` + - `"default:sandstonebrick"` + - `"default:sandstone_block"` + - walls for: + - `"default:stone"` + - `"default:stonebrick"` + - `"default:stone_block"` + - walls for: + - `"default:desert_stone"` + - `"default:desert_stonebrick"` + - `"default:desert_stone_block"` + - walls for: + - `"default:desert_sandstone"` + - `"default:desert_sandstone_brick"` + - `"default:desert_sandstone_block"` + - walls for: + - `"default:silver_sandstone"` + - `"default:silver_sandstone_brick"` + - `"default:silver_sandstone_block"` + - walls for: + - `"default:obsidian"` + - `"default:obsidian_brick"` + - `"default:obsidian_block"` diff --git a/mods/mywalls/screenshot.png b/mods/mywalls/screenshot.png index 6de89a8c..e1f49a16 100644 Binary files a/mods/mywalls/screenshot.png and b/mods/mywalls/screenshot.png differ diff --git a/mods/new_campfire/init.lua b/mods/new_campfire/init.lua index 5d59ce0d..07538295 100644 --- a/mods/new_campfire/init.lua +++ b/mods/new_campfire/init.lua @@ -32,7 +32,6 @@ local function fire_particles_on(pos) -- 3 layers of fire vertical = true, texture = "new_campfire_anim_fire.png", animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 0.8,}, --- playername = "singleplayer" }) meta:set_int("layer_1", id) @@ -53,7 +52,6 @@ local function fire_particles_on(pos) -- 3 layers of fire vertical = true, texture = "new_campfire_anim_fire.png", animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 0.7,}, - -- playername = "singleplayer" }) meta:set_int("layer_2", id) @@ -74,7 +72,6 @@ local function fire_particles_on(pos) -- 3 layers of fire vertical = true, texture = "new_campfire_anim_smoke.png", animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 0.9,}, - -- playername = "singleplayer" }) meta:set_int("layer_3", id) end @@ -252,11 +249,13 @@ minetest.register_node('new_campfire:fireplace', { "new_campfire_empty_tile.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", walkable = false, buildable_to = false, sunlight_propagates = false, paramtype = 'light', groups = {dig_immediate=3, flammable=0, not_in_creative_inventory=1}, + is_ground_content = false, selection_box = sbox, sounds = default.node_sound_stone_defaults(), drop = {max_items = 3, items = {{items = {"stairs:slab_cobble 3"}}}}, @@ -290,11 +289,13 @@ minetest.register_node('new_campfire:campfire', { "new_campfire_empty_tile.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", inventory_image = "new_campfire_campfire.png", walkable = false, buildable_to = false, sunlight_propagates = true, groups = {dig_immediate=3, flammable=0}, + is_ground_content = false, paramtype = 'light', selection_box = sbox, sounds = default.node_sound_stone_defaults(), @@ -321,7 +322,6 @@ minetest.register_node('new_campfire:campfire', { vertical = true, texture = "new_campfire_anim_smoke.png", animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 2.5,}, --- playername = "singleplayer" }) elseif itemname == "new_campfire:grille" then itemstack:take_item() @@ -340,11 +340,13 @@ minetest.register_node('new_campfire:campfire_active', { "new_campfire_empty_tile.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", inventory_image = "new_campfire_campfire.png", walkable = false, buildable_to = false, sunlight_propagates = true, groups = {oddly_breakable_by_hand=3, flammable=0, not_in_creative_inventory=1, igniter=1}, + is_ground_content = false, paramtype = 'none', light_source = 13, damage_per_second = 3, @@ -396,12 +398,14 @@ minetest.register_node('new_campfire:fireplace_with_embers', { } } }, + use_texture_alpha = "blend", walkable = false, buildable_to = false, sunlight_propagates = false, paramtype = 'light', light_source = 5, groups = {dig_immediate=3, flammable=0, not_in_creative_inventory=1}, + is_ground_content = false, selection_box = sbox, sounds = default.node_sound_stone_defaults(), drop = {max_items = 3, items = {{items = {"stairs:slab_cobble 3"}}}}, @@ -448,12 +452,14 @@ minetest.register_node('new_campfire:fireplace_with_embers_with_grille', { } } }, + use_texture_alpha = "blend", walkable = false, buildable_to = false, sunlight_propagates = false, paramtype = 'light', light_source = 5, groups = {dig_immediate=3, flammable=0, not_in_creative_inventory=1}, + is_ground_content = false, selection_box = grille_sbox, node_box = grille_cbox, sounds = default.node_sound_stone_defaults(), @@ -497,10 +503,12 @@ minetest.register_node('new_campfire:fireplace_with_grille', { "default_steel_block.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", buildable_to = false, sunlight_propagates = false, paramtype = 'light', groups = {dig_immediate=3, flammable=0, not_in_creative_inventory=1}, + is_ground_content = false, selection_box = grille_sbox, node_box = grille_cbox, sounds = default.node_sound_stone_defaults(), @@ -538,10 +546,12 @@ minetest.register_node('new_campfire:campfire_with_grille', { "default_steel_block.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", inventory_image = "new_campfire_campfire.png", buildable_to = false, sunlight_propagates = true, groups = {dig_immediate=3, flammable=0, not_in_creative_inventory=1}, + is_ground_content = false, paramtype = 'light', selection_box = grille_sbox, node_box = grille_cbox, @@ -568,7 +578,6 @@ minetest.register_node('new_campfire:campfire_with_grille', { vertical = true, texture = "new_campfire_anim_smoke.png", animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 2.5,}, --- playername = "singleplayer" }) end end, @@ -593,10 +602,12 @@ minetest.register_node('new_campfire:campfire_active_with_grille', { "default_steel_block.png", "new_campfire_empty_tile.png" }, + use_texture_alpha = "blend", inventory_image = "new_campfire_campfire.png", buildable_to = false, sunlight_propagates = true, groups = {oddly_breakable_by_hand=3, flammable=0, not_in_creative_inventory=1, igniter=1}, + is_ground_content = false, paramtype = 'none', light_source = 13, damage_per_second = 3, @@ -617,7 +628,7 @@ minetest.register_node('new_campfire:campfire_active_with_grille', { local name = itemstack:get_name() local a=add_stick(pos, itemstack) if not a then - cooking(pos, itemstack) + return cooking(pos, itemstack) end end, @@ -716,14 +727,25 @@ minetest.register_abm({ -- CRAFTS -minetest.register_craft({ - output = "new_campfire:grille", - recipe = { - { "basic_materials:steel_bar", "", "basic_materials:steel_bar" }, - { "", "basic_materials:steel_wire", "" }, - { "basic_materials:steel_bar", "", "basic_materials:steel_bar" }, - } -}) +if minetest.get_modpath("basic_materials") then + minetest.register_craft({ + output = "new_campfire:grille", + recipe = { + {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, + {"", "basic_materials:steel_wire", ""}, + {"basic_materials:steel_bar", "", "basic_materials:steel_bar"} + } + }) +else + minetest.register_craft({ + output = "new_campfire:grille", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "xpanes:bar_flat", ""}, + {"default:steel_ingot", "", "default:steel_ingot"} + } + }) +end minetest.register_craft({ output = "new_campfire:campfire", diff --git a/mods/new_campfire/locale/new_campfire.id.tr b/mods/new_campfire/locale/new_campfire.id.tr new file mode 100644 index 00000000..9a127a8b --- /dev/null +++ b/mods/new_campfire/locale/new_campfire.id.tr @@ -0,0 +1,16 @@ +# textdomain: new_campfire + + +### init.lua ### + +Active campfire=Api Unggun Aktif +Active campfire with grille=Api Unggun Aktif dengan Alat Panggang +Ash=Abu +Campfire=Api Unggun +Campfire with grille=Api Unggun dengan Alat Panggang +Cooking=Memasak +Fireplace=Perapian +Fireplace with embers=Perapian dengan Bara Api +Fireplace with embers and grille=Perapian dengan Bara Api dan Alat Panggang +Fireplace with grille=Perapian dengan Alat Panggang +Metal Grille=Alat Panggang Logam diff --git a/mods/new_campfire/mod.conf b/mods/new_campfire/mod.conf index d997f8f2..a886b78a 100644 --- a/mods/new_campfire/mod.conf +++ b/mods/new_campfire/mod.conf @@ -1,5 +1,5 @@ name = new_campfire description = You can craft and use better campfire. -depends = default, fire, basic_materials -optional_depends = campfire +depends = default, fire +optional_depends = campfire, basic_materials min_minetest_version = 5.2.0 diff --git a/mods/pie/README.md b/mods/pie/README.md index bc328d1c..1b84a1e8 100644 --- a/mods/pie/README.md +++ b/mods/pie/README.md @@ -12,6 +12,16 @@ Support for hud/hunger, hbhunger and stamina has been added. https://forum.minetest.net/viewtopic.php?f=9&t=13285 +API +--- + +pie.register_pie(name, description) + +e.g. + +pie.register_pie("choc", "Chocolate Cake") -- creates full "pie:choc_0" to last slice "pie:choc_3" + + Change log: - 0.1 - Initial release @@ -21,5 +31,8 @@ Change log: - 0.5 - Added Orange and Bread cake (thanks to CalebDavis) - 0.6 - Now uses food_ groups to craft cakes easier - 0.7 - Added aliases for older pie mod by Mitroman +- 0.8 - Redo textures, make default optional, initial mineclone2 support +- 0.9 - Added API for mods to create their own cakes, added more milk replacements +- 1.0 - Added 'pie.quarters' setting to show pie quarters while eating instead of slices (thanks Slightly) Lucky Blocks: 12 diff --git a/mods/pie/depends.txt b/mods/pie/depends.txt deleted file mode 100644 index db708947..00000000 --- a/mods/pie/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -default -hunger? -hbhunger? -stamina? -lucky_block? -screwdriver? diff --git a/mods/pie/description.txt b/mods/pie/description.txt deleted file mode 100644 index 9bc03b29..00000000 --- a/mods/pie/description.txt +++ /dev/null @@ -1 +0,0 @@ -Add a selection of tasty Pie/Cakes to eat. diff --git a/mods/pie/init.lua b/mods/pie/init.lua index 2fd99ee9..efb4ff52 100644 --- a/mods/pie/init.lua +++ b/mods/pie/init.lua @@ -1,25 +1,40 @@ --- check for available hunger mods -local hmod = minetest.global_exists("hunger") +-- global + +pie = {} + +-- mod check and settings + +local hmod = minetest.get_modpath("hunger") local hbmod = minetest.global_exists("hbhunger") local stmod = minetest.global_exists("stamina") +local defmod = minetest.get_modpath("default") +local mclhunger = minetest.get_modpath("mcl_hunger") +local screwdriver_exists = minetest.get_modpath("screwdriver") +local quarters = minetest.settings:get_bool("pie.quarters") -local screwdriver_exists = minetest.global_exists("screwdriver") +-- sound support + +local cake_sound = defmod and default.node_sound_dirt_defaults() + +if minetest.get_modpath("mcl_sounds") then + cake_sound = mcl_sounds.node_sound_dirt_defaults() +end -- eat pie slice function + local function replace_pie(node, puncher, pos) -- is this my pie? - if minetest.is_protected(pos, puncher:get_player_name()) then - return - end + if minetest.is_protected(pos, puncher:get_player_name()) then return end -- which size of pie did we hit? - local pie = node.name:split("_")[1] - local num = tonumber(node.name:split("_")[2]) + local pie = node.name:sub(1,-3) + local num = tonumber(node.name:sub(-1)) -- are we using crystal shovel to pick up full pie using soft touch? local tool = puncher:get_wielded_item():get_name() + if num == 0 and tool == "ethereal:shovel_crystal" then local inv = puncher:get_inventory() @@ -45,78 +60,90 @@ local function replace_pie(node, puncher, pos) minetest.swap_node(pos, node) - if num == 3 then - minetest.check_for_falling(pos) - end + if num == 3 then minetest.check_for_falling(pos) end + + -- default eat sound + local sound = "default_dig_crumbly" -- Blockmen's hud_hunger mod if hmod then local h = hunger.read(puncher) --- print ("hunger is "..h) h = math.min(h + 4, 30) local ok = hunger.update_hunger(puncher, h) - minetest.sound_play("hunger_eat", { - pos = pos, gain = 0.7, max_hear_distance = 5}) + sound = "hunger_eat" -- Wuzzy's hbhunger mod elseif hbmod then local h = tonumber(hbhunger.hunger[puncher:get_player_name()]) --- print ("hbhunger is "..h) h = math.min(h + 4, 30) hbhunger.hunger[puncher:get_player_name()] = h - minetest.sound_play("hbhunger_eat_generic", { - pos = pos, gain = 0.7, max_hear_distance = 5}) + sound = "hbhunger_eat_generic" -- Sofar's stamina mod elseif stmod then stamina.change(puncher, 4) - minetest.sound_play("stamina_eat", { - pos = pos, gain = 0.7, max_hear_distance = 5}) + sound = "stamina_eat" + + -- mineclone2 mcl_hunger mod + elseif mclhunger then + + local h = mcl_hunger.get_hunger(puncher) + + h = math.min(h + 4, 20) + + mcl_hunger.set_hunger(puncher, h) + + sound = "mcl_hunger_bite" -- none of the above found? add to health instead else local h = puncher:get_hp() --- print ("health is "..h) h = math.min(h + 4, 20) puncher:set_hp(h) end + + minetest.sound_play(sound, {pos = pos, gain = 0.7, max_hear_distance = 5}, true) end +-- pie registration function --- register pie bits -local function register_pie(pie, desc) +pie.register_pie = function(pie, desc) -- full pie - minetest.register_node("pie:" .. pie .. "_0", { + + local nodebox = { + type = "fixed", + fixed = {-0.45, -0.5, -0.45, 0.45, 0, 0.45}} + + local tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_side.png"} + + minetest.register_node(":pie:" .. pie .. "_0", { description = desc, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = false, - tiles = { - pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", - pie .. "_side.png", pie .. "_side.png", pie .. "_side.png" - }, + tiles = tiles, inventory_image = pie .. "_inv.png", wield_image = pie .. "_inv.png", drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {-0.45, -0.5, -0.45, 0.45, 0, 0.45} - }, + node_box = nodebox, + sounds = cake_sound, on_rotate = screwdriver_exists and screwdriver.rotate_simple, @@ -126,23 +153,38 @@ local function register_pie(pie, desc) }) -- 3/4 pie - minetest.register_node("pie:" .. pie .. "_1", { + + nodebox = { + type = "fixed", + fixed = {-0.45, -0.5, -0.25, 0.45, 0, 0.45}} + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"} + + if quarters then + + nodebox.fixed = { + {-0.45, -0.5, -0.45, 0, 0, 0.45}, + {-0.45, -0.5, 0, 0.45, 0, 0.45}} + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_side_inside.png^[transformFX", + pie .. "_side.png", pie .. "_side.png", pie .. "_side_inside.png"} + end + + minetest.register_node(":pie:" .. pie .. "_1", { description = "3/4 " .. desc, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, - tiles = { - pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", - pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png" - }, + tiles = tiles, groups = {not_in_creative_inventory = 1}, drop = {}, drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {-0.45, -0.5, -0.25, 0.45, 0, 0.45} - }, + node_box = nodebox, + sounds = cake_sound, on_rotate = screwdriver_exists and screwdriver.rotate_simple, @@ -152,23 +194,36 @@ local function register_pie(pie, desc) }) -- 1/2 pie - minetest.register_node("pie:" .. pie .. "_2", { + + nodebox = { + type = "fixed", + fixed = {-0.45, -0.5, 0.0, 0.45, 0, 0.45}} + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"} + + if quarters then + + nodebox.fixed = {-0.45, -0.5, -.45, 0, 0, 0.45} + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_inside.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_side.png"} + end + + minetest.register_node(":pie:" .. pie .. "_2", { description = "Half " .. desc, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, - tiles = { - pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", - pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png" - }, + tiles = tiles, groups = {not_in_creative_inventory = 1}, drop = {}, drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {-0.45, -0.5, 0.0, 0.45, 0, 0.45} - }, + node_box = nodebox, + sounds = cake_sound, on_rotate = screwdriver_exists and screwdriver.rotate_simple, @@ -178,23 +233,36 @@ local function register_pie(pie, desc) }) -- 1/4 pie - minetest.register_node("pie:" .. pie .. "_3", { + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"} + + nodebox = { + type = "fixed", + fixed = {-0.45, -0.5, 0.25, 0.45, 0, 0.45}} + + if quarters then + + nodebox.fixed = {-0.45, -0.5, 0.0, 0.0, 0, 0.45} + + tiles = { + pie .. "_top.png", pie .. "_bottom.png", pie .. "_inside.png", + pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png"} + end + + minetest.register_node(":pie:" .. pie .. "_3", { description = "Piece of " .. desc, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, - tiles = { - pie .. "_top.png", pie .. "_bottom.png", pie .. "_side.png", - pie .. "_side.png", pie .. "_side.png", pie .. "_inside.png" - }, + tiles = tiles, groups = {not_in_creative_inventory = 1}, drop = {}, drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {-0.45, -0.5, 0.25, 0.45, 0, 0.45} - }, + node_box = nodebox, + sounds = cake_sound, on_rotate = screwdriver_exists and screwdriver.rotate_simple, @@ -204,151 +272,176 @@ local function register_pie(pie, desc) }) end +-- register cakes --- normal cake -register_pie("pie", "Cake") +pie.register_pie("pie", "Cake") +pie.register_pie("choc", "Chocolate Cake") +pie.register_pie("scsk", "Strawberry Cheesecake") +pie.register_pie("coff", "Coffee Cake") +pie.register_pie("rvel", "Red Velvet Cake") +pie.register_pie("meat", "Meat Cake") +pie.register_pie("bana", "Banana Cake") +pie.register_pie("brpd", "Bread Pudding") +pie.register_pie("orange", "Orange Pie") + +-- ingredients + +local mcl = minetest.get_modpath("mcl_dye") +local i_sugar = mcl and "mcl_core:sugar" or "group:food_sugar" +local i_wheat = mcl and "mcl_farming:wheat_item" or "group:food_wheat" +local i_flour = mcl and "mcl_farming:bread" or "group:food_flour" +local i_egg = mcl and "mcl_throwing:egg" or "group:food_egg" +local i_milk = mcl and "mcl_mobitems:milk_bucket" or "group:food_milk" +local i_cocoa = mcl and "mcl_dye:brown" or "group:food_cocoa" +local i_strawberry = mcl and "mcl_dye:red" or "group:food_strawberry" +local i_coffee = mcl and "mcl_dye:black" or "group:food_coffee" +local i_cheese = mcl and "mcl_dye:yellow" or "group:food_cheese" +local i_red = mcl and "mcl_dye:red" or "dye:red" +local i_meat = mcl and "mcl_mobitems:beef" or "group:food_meat_raw" +local i_banana = mcl and "mcl_dye:yellow" or "group:food_banana" +local i_bread = mcl and "mcl_farming:bread" or "group:food_bread" +local i_orange = mcl and "mcl_dye:orange" or "group:food_orange" +local i_bucket = mcl and "mcl_buckets:bucket_empty" or "bucket:bucket_empty" +local i_bottle = mcl and "mcl_potions:glass_bottle" or "vessels:glass_bottle" + +-- replacement items + +local replace_these = { + {"mobs:bucket_milk", i_bucket}, + {"mobs:wooden_bucket_milk", "wooden_bucket:bucket_wood_empty"}, + {"mcl_mobitems:milk_bucket", i_bucket}, + {"petz:bucket_milk", i_bucket}, + {"cucina_vegana:soy_milk", i_bottle} +} + +-- normal cake recipe minetest.register_craft({ output = "pie:pie_0", recipe = { - {"group:food_sugar", "group:food_milk", "group:food_sugar"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_sugar, i_milk, i_sugar}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- chocolate cake -register_pie("choc", "Chocolate Cake") +-- chocolate cake recipe minetest.register_craft({ output = "pie:choc_0", recipe = { - {"group:food_cocoa", "group:food_milk", "group:food_cocoa"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_cocoa, i_milk, i_cocoa}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- strawberry cheesecake -register_pie("scsk", "Strawberry Cheesecake") +-- strawberry cheesecake recipe minetest.register_craft({ output = "pie:scsk_0", recipe = { - {"group:food_strawberry", "group:food_milk", "group:food_strawberry"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_strawberry, i_milk, i_strawberry}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- coffee cake -register_pie("coff", "Coffee Cake") +-- coffee cake recipe minetest.register_craft({ output = "pie:coff_0", recipe = { - {"group:food_coffee", "group:food_milk", "group:food_coffee"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_coffee, i_milk, i_coffee}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- red velvet cake -register_pie("rvel", "Red Velvet Cake") +-- red velvet cake recipe minetest.register_craft({ output = "pie:rvel_0", recipe = { - {"group:food_cocoa", "group:food_milk", "dye:red"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_flour", "group:food_cheese", "group:food_flour"} + {i_cocoa, i_milk, i_red}, + {i_sugar, i_egg, i_sugar}, + {i_flour, i_cheese, i_flour} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- meat cake -register_pie("meat", "Meat Cake") +-- meat cake recipe minetest.register_craft({ output = "pie:meat_0", recipe = { - {"group:food_meat_raw", "group:food_egg", "group:food_meat_raw"}, - {"group:food_wheat", "group:food_wheat", "group:food_wheat"} + {i_meat, i_egg, i_meat}, + {i_wheat, i_wheat, i_wheat} } }) - --- banana cake -register_pie("bana", "Banana Cake") +-- banana cake recipe minetest.register_craft({ output = "pie:bana_0", recipe = { - {"group:food_banana", "group:food_milk", "group:food_banana"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_banana, i_milk, i_banana}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - --- bread pudding -register_pie("brpd", "Bread Pudding") +-- bread pudding recipe minetest.register_craft({ output = "pie:brpd_0", recipe = { - {"group:food_bread", "group:food_milk", "group:food_bread"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_bread, i_milk, i_bread}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - -- orange pie -register_pie("orange", "Orange Pie") minetest.register_craft({ output = "pie:orange_0", recipe = { - {"group:food_orange", "group:food_milk", "group:food_orange"}, - {"group:food_sugar", "group:food_egg", "group:food_sugar"}, - {"group:food_wheat", "group:food_flour", "group:food_wheat"} + {i_orange, i_milk, i_orange}, + {i_sugar, i_egg, i_sugar}, + {i_wheat, i_flour, i_wheat} }, - replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = replace_these }) - -- add lucky blocks + if minetest.get_modpath("lucky_block") then -lucky_block:add_blocks({ - {"nod", "pie:pie_0", 0}, - {"nod", "pie:choc_0", 0}, - {"nod", "pie:coff_0", 0}, - {"tro", "pie:pie_0"}, - {"nod", "pie:rvel_0", 0}, - {"nod", "pie:scsk_0", 0}, - {"nod", "pie:bana_0", 0}, - {"nod", "pie:orange_0", 0}, - {"tro", "pie:orange_0", "default_place_node_hard", true}, - {"nod", "pie:brpd_0", 0}, - {"nod", "pie:meat_0", 0}, - {"lig"} -}) + + lucky_block:add_blocks({ + {"nod", "pie:pie_0", 0}, + {"nod", "pie:choc_0", 0}, + {"nod", "pie:coff_0", 0}, + {"tro", "pie:pie_0"}, + {"nod", "pie:rvel_0", 0}, + {"nod", "pie:scsk_0", 0}, + {"nod", "pie:bana_0", 0}, + {"nod", "pie:orange_0", 0}, + {"tro", "pie:orange_0", "default_place_node_hard", true}, + {"nod", "pie:brpd_0", 0}, + {"nod", "pie:meat_0", 0}, + {"lig"} + }) end - -- some aliases for older pie mod by Mitroman + minetest.register_alias("pie:apie_0", "pie:pie_0") minetest.register_alias("pie:apie_1", "pie:pie_1") minetest.register_alias("pie:apie_2", "pie:pie_2") @@ -360,5 +453,4 @@ minetest.register_alias("pie:applemuffin", "pie:pie_0") minetest.register_alias("pie:sugar", "farming:sugar") minetest.register_alias("pie:knife", "default:sword_steel") - print("[MOD] Pie loaded") diff --git a/mods/pie/license.txt b/mods/pie/license.txt index 63a2dde9..eea0d62d 100644 --- a/mods/pie/license.txt +++ b/mods/pie/license.txt @@ -21,21 +21,18 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Textures licensed under CC-BY-SA 3.0 -http://creativecommons.org/licenses/by-sa/3.0/ - -lux_pp, Poikilos - pie_inv.png - -TenPlus1 +TenPlus1 (CC0): pie_*.png (if not mentioned above) choc_*.png bana_*.png coff_*.png meat_*.png rvel_*.png - scsk_*.png +..scsk_*.png -CalebDavis +CalebDavis (CC0): brpd_*.png orange_*.png + +Edited by Slightly (CC0): + *_side_inside.png diff --git a/mods/pie/mod.conf b/mods/pie/mod.conf index d1efb598..3bc0054e 100644 --- a/mods/pie/mod.conf +++ b/mods/pie/mod.conf @@ -1,4 +1,4 @@ name = pie -depends = default -optional_depends = hunger, hbhunger, stamina, lucky_block, screwdriver description = Add a selection of tasty Pie/Cakes to eat. +optional_depends = default, hunger, hbhunger, stamina, lucky_block, screwdriver, mcl_hunger +min_minetest_version = 5.0 diff --git a/mods/pie/screenshot.jpg b/mods/pie/screenshot.jpg new file mode 100644 index 00000000..1f7629d2 Binary files /dev/null and b/mods/pie/screenshot.jpg differ diff --git a/mods/pie/screenshot.png b/mods/pie/screenshot.png deleted file mode 100644 index facf96e8..00000000 Binary files a/mods/pie/screenshot.png and /dev/null differ diff --git a/mods/pie/settingtypes.txt b/mods/pie/settingtypes.txt new file mode 100644 index 00000000..a5a66bcd --- /dev/null +++ b/mods/pie/settingtypes.txt @@ -0,0 +1,2 @@ +# Use pie quarters when eating instead of slices +pie.quarters (Pie quarters) bool false diff --git a/mods/pie/textures/bana_bottom.png b/mods/pie/textures/bana_bottom.png index 1409dd31..985c7883 100644 Binary files a/mods/pie/textures/bana_bottom.png and b/mods/pie/textures/bana_bottom.png differ diff --git a/mods/pie/textures/bana_inv.png b/mods/pie/textures/bana_inv.png index 41fd3d27..3bd85c2c 100644 Binary files a/mods/pie/textures/bana_inv.png and b/mods/pie/textures/bana_inv.png differ diff --git a/mods/pie/textures/bana_side.png b/mods/pie/textures/bana_side.png index 03d7656b..7f8460aa 100644 Binary files a/mods/pie/textures/bana_side.png and b/mods/pie/textures/bana_side.png differ diff --git a/mods/pie/textures/bana_side_inside.png b/mods/pie/textures/bana_side_inside.png new file mode 100644 index 00000000..83db1a7a Binary files /dev/null and b/mods/pie/textures/bana_side_inside.png differ diff --git a/mods/pie/textures/brpd_inv.png b/mods/pie/textures/brpd_inv.png index 16765c0f..90bc5404 100644 Binary files a/mods/pie/textures/brpd_inv.png and b/mods/pie/textures/brpd_inv.png differ diff --git a/mods/pie/textures/brpd_side.png b/mods/pie/textures/brpd_side.png index 32435d42..a461f25c 100644 Binary files a/mods/pie/textures/brpd_side.png and b/mods/pie/textures/brpd_side.png differ diff --git a/mods/pie/textures/brpd_side_inside.png b/mods/pie/textures/brpd_side_inside.png new file mode 100644 index 00000000..ff1dba34 Binary files /dev/null and b/mods/pie/textures/brpd_side_inside.png differ diff --git a/mods/pie/textures/choc_inv.png b/mods/pie/textures/choc_inv.png index 6f5eb32f..96cfe5fa 100644 Binary files a/mods/pie/textures/choc_inv.png and b/mods/pie/textures/choc_inv.png differ diff --git a/mods/pie/textures/choc_side.png b/mods/pie/textures/choc_side.png index caf5a049..3de39cf5 100644 Binary files a/mods/pie/textures/choc_side.png and b/mods/pie/textures/choc_side.png differ diff --git a/mods/pie/textures/choc_side_inside.png b/mods/pie/textures/choc_side_inside.png new file mode 100644 index 00000000..5a23dab6 Binary files /dev/null and b/mods/pie/textures/choc_side_inside.png differ diff --git a/mods/pie/textures/coff_bottom.png b/mods/pie/textures/coff_bottom.png index 3421317a..b34207a4 100644 Binary files a/mods/pie/textures/coff_bottom.png and b/mods/pie/textures/coff_bottom.png differ diff --git a/mods/pie/textures/coff_inv.png b/mods/pie/textures/coff_inv.png index 7e01dc2c..ae3b2205 100644 Binary files a/mods/pie/textures/coff_inv.png and b/mods/pie/textures/coff_inv.png differ diff --git a/mods/pie/textures/coff_side.png b/mods/pie/textures/coff_side.png index 50514fd3..dd64f75b 100644 Binary files a/mods/pie/textures/coff_side.png and b/mods/pie/textures/coff_side.png differ diff --git a/mods/pie/textures/coff_side_inside.png b/mods/pie/textures/coff_side_inside.png new file mode 100644 index 00000000..90c25996 Binary files /dev/null and b/mods/pie/textures/coff_side_inside.png differ diff --git a/mods/pie/textures/meat_inv.png b/mods/pie/textures/meat_inv.png index eaae7654..ad406c44 100644 Binary files a/mods/pie/textures/meat_inv.png and b/mods/pie/textures/meat_inv.png differ diff --git a/mods/pie/textures/meat_side.png b/mods/pie/textures/meat_side.png index a5049ad3..78453d9f 100644 Binary files a/mods/pie/textures/meat_side.png and b/mods/pie/textures/meat_side.png differ diff --git a/mods/pie/textures/meat_side_inside.png b/mods/pie/textures/meat_side_inside.png new file mode 100644 index 00000000..c55139f4 Binary files /dev/null and b/mods/pie/textures/meat_side_inside.png differ diff --git a/mods/pie/textures/orange_bottom.png b/mods/pie/textures/orange_bottom.png index 1976cbdf..985c7883 100644 Binary files a/mods/pie/textures/orange_bottom.png and b/mods/pie/textures/orange_bottom.png differ diff --git a/mods/pie/textures/orange_inv.png b/mods/pie/textures/orange_inv.png index 9a07f40d..9b287cf2 100644 Binary files a/mods/pie/textures/orange_inv.png and b/mods/pie/textures/orange_inv.png differ diff --git a/mods/pie/textures/orange_side.png b/mods/pie/textures/orange_side.png index 069c6115..2573ace8 100644 Binary files a/mods/pie/textures/orange_side.png and b/mods/pie/textures/orange_side.png differ diff --git a/mods/pie/textures/orange_side_inside.png b/mods/pie/textures/orange_side_inside.png new file mode 100644 index 00000000..493067ed Binary files /dev/null and b/mods/pie/textures/orange_side_inside.png differ diff --git a/mods/pie/textures/pie_inv.png b/mods/pie/textures/pie_inv.png index ee6026fc..68b987e0 100644 Binary files a/mods/pie/textures/pie_inv.png and b/mods/pie/textures/pie_inv.png differ diff --git a/mods/pie/textures/pie_side.png b/mods/pie/textures/pie_side.png index 5243e00d..23895d84 100644 Binary files a/mods/pie/textures/pie_side.png and b/mods/pie/textures/pie_side.png differ diff --git a/mods/pie/textures/pie_side_inside.png b/mods/pie/textures/pie_side_inside.png new file mode 100644 index 00000000..429d256e Binary files /dev/null and b/mods/pie/textures/pie_side_inside.png differ diff --git a/mods/pie/textures/rvel_bottom.png b/mods/pie/textures/rvel_bottom.png index 1409dd31..985c7883 100644 Binary files a/mods/pie/textures/rvel_bottom.png and b/mods/pie/textures/rvel_bottom.png differ diff --git a/mods/pie/textures/rvel_inv.png b/mods/pie/textures/rvel_inv.png index 290e86c5..3a928029 100644 Binary files a/mods/pie/textures/rvel_inv.png and b/mods/pie/textures/rvel_inv.png differ diff --git a/mods/pie/textures/rvel_side.png b/mods/pie/textures/rvel_side.png index ee441fe0..dd05da29 100644 Binary files a/mods/pie/textures/rvel_side.png and b/mods/pie/textures/rvel_side.png differ diff --git a/mods/pie/textures/rvel_side_inside.png b/mods/pie/textures/rvel_side_inside.png new file mode 100644 index 00000000..20b5f6fa Binary files /dev/null and b/mods/pie/textures/rvel_side_inside.png differ diff --git a/mods/pie/textures/scsk_bottom.png b/mods/pie/textures/scsk_bottom.png index d21456a0..786d14ad 100644 Binary files a/mods/pie/textures/scsk_bottom.png and b/mods/pie/textures/scsk_bottom.png differ diff --git a/mods/pie/textures/scsk_inside.png b/mods/pie/textures/scsk_inside.png index fd0326ca..62725bde 100644 Binary files a/mods/pie/textures/scsk_inside.png and b/mods/pie/textures/scsk_inside.png differ diff --git a/mods/pie/textures/scsk_inv.png b/mods/pie/textures/scsk_inv.png index cad43c4b..d0de850a 100644 Binary files a/mods/pie/textures/scsk_inv.png and b/mods/pie/textures/scsk_inv.png differ diff --git a/mods/pie/textures/scsk_side.png b/mods/pie/textures/scsk_side.png index 7d19b206..62725bde 100644 Binary files a/mods/pie/textures/scsk_side.png and b/mods/pie/textures/scsk_side.png differ diff --git a/mods/pie/textures/scsk_side_inside.png b/mods/pie/textures/scsk_side_inside.png new file mode 100644 index 00000000..36c54f0c Binary files /dev/null and b/mods/pie/textures/scsk_side_inside.png differ diff --git a/mods/pie/textures/scsk_top.png b/mods/pie/textures/scsk_top.png index 6caa24fe..27cc5c8f 100644 Binary files a/mods/pie/textures/scsk_top.png and b/mods/pie/textures/scsk_top.png differ diff --git a/mods/plantlife_modpack/.luacheckrc b/mods/plantlife_modpack/.luacheckrc index 34433944..a8b6e7c9 100644 --- a/mods/plantlife_modpack/.luacheckrc +++ b/mods/plantlife_modpack/.luacheckrc @@ -1,14 +1,21 @@ unused_args = false allow_defined_top = true +max_line_length = 185 -read_globals = { +exclude_files = {".luacheckrc"} + +globals = { "biome_lib", - "DIR_DELIM", - "minetest", "core", - "dump", - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "default", + "bushes_classic", } +read_globals = { + table = {fields = {"copy"}}, + + "minetest", "ItemStack", + "vector", + + "default", + "moretrees", + "dump", +} diff --git a/mods/plantlife_modpack/3dmushrooms/init.lua b/mods/plantlife_modpack/3dmushrooms/init.lua index 3c8b76a1..170a0da0 100644 --- a/mods/plantlife_modpack/3dmushrooms/init.lua +++ b/mods/plantlife_modpack/3dmushrooms/init.lua @@ -1,7 +1,5 @@ -- 3D Mushroom mod by VanessaE -mushroom = {} - minetest.override_item("flowers:mushroom_fertile_brown", { drawtype = "mesh", mesh = "3dmushrooms.obj", @@ -10,7 +8,8 @@ minetest.override_item("flowers:mushroom_fertile_brown", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} }, - inventory_image = "3dmushrooms_brown_inv.png" + inventory_image = "3dmushrooms_brown_inv.png", + wield_image = "3dmushrooms_brown_inv.png" }) minetest.override_item("flowers:mushroom_brown", { @@ -21,7 +20,8 @@ minetest.override_item("flowers:mushroom_brown", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} }, - inventory_image = "3dmushrooms_brown_inv.png" + inventory_image = "3dmushrooms_brown_inv.png", + wield_image = "3dmushrooms_brown_inv.png" }) minetest.override_item("flowers:mushroom_fertile_red", { @@ -32,7 +32,8 @@ minetest.override_item("flowers:mushroom_fertile_red", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} }, - inventory_image = "3dmushrooms_red_inv.png" + inventory_image = "3dmushrooms_red_inv.png", + wield_image = "3dmushrooms_red_inv.png" }) minetest.override_item("flowers:mushroom_red", { @@ -43,7 +44,8 @@ minetest.override_item("flowers:mushroom_red", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} }, - inventory_image = "3dmushrooms_red_inv.png" + inventory_image = "3dmushrooms_red_inv.png", + wield_image = "3dmushrooms_red_inv.png" }) -- aliases to the default mushrooms @@ -61,5 +63,3 @@ minetest.register_alias("mushroom:spore1", "flowers:mushroom_spores_red") minetest.register_alias("mushroom:poison", "flowers:mushroom_red") minetest.register_alias("mushroom:identifier", "default:mese_crystal_fragment") - -print("[3D Mushrooms] loaded.") diff --git a/mods/plantlife_modpack/3dmushrooms/mod.conf b/mods/plantlife_modpack/3dmushrooms/mod.conf index 27d96847..d7b881ec 100644 --- a/mods/plantlife_modpack/3dmushrooms/mod.conf +++ b/mods/plantlife_modpack/3dmushrooms/mod.conf @@ -1,2 +1,2 @@ name = 3dmushrooms -depends = default, flowers +depends = flowers diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png index c36f5240..b82168e3 100644 Binary files a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png differ diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png index dc80e323..91cc4a55 100644 Binary files a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png differ diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png index 796f8674..98680531 100644 Binary files a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png differ diff --git a/mods/plantlife_modpack/bushes/init.lua b/mods/plantlife_modpack/bushes/init.lua index 4c57f856..9b5c553a 100644 --- a/mods/plantlife_modpack/bushes/init.lua +++ b/mods/plantlife_modpack/bushes/init.lua @@ -8,16 +8,9 @@ -- support for i18n local S = minetest.get_translator("bushes") -abstract_bushes = {} - -local bushes_bush_rarity = tonumber(minetest.settings:get("bushes_bush_rarity")) or 99.9 -local bushes_bush_rarity_fertility = tonumber(minetest.settings:get("bushes_bush_rarity_fertility")) or 1.5 -local bushes_bush_fertility = tonumber(minetest.settings:get("bushes_bush_fertility")) or -1 - -local bushes_youngtrees_rarity = tonumber(minetest.settings:get("bushes_youngtrees_rarity")) or 100 -local bushes_youngtrees_rarity_fertility = tonumber(minetest.settings:get("bushes_youngtrees_rarity_fertility")) or 0.6 -local bushes_youngtrees_fertility = tonumber(minetest.settings:get("bushes_youngtrees_fertility")) or -0.5 +local bush_rarity = minetest.settings:get("bushes.bush_rarity") or 0.008 +local youngtree_rarity = minetest.settings:get("youngtree.bush_rarity") or 0.006 minetest.register_node("bushes:youngtree2_bottom", { description = S("Young Tree 2 (bottom)"), @@ -31,7 +24,6 @@ minetest.register_node("bushes:youngtree2_bottom", { node_box = { type = "fixed", fixed = { - --{0.375000,-0.500000,-0.500000,0.500000,0.500000,-0.375000}, --NodeBox 1 {-0.0612,-0.500000,-0.500000,0.0612,0.500000,-0.375000}, --NodeBox 1 } }, @@ -40,10 +32,10 @@ minetest.register_node("bushes:youngtree2_bottom", { drop = 'default:stick' }) -local BushBranchCenter = { {1,1}, {3,2} } +local BushBranchCenter = { {1,1}, {3,2} } for i in pairs(BushBranchCenter) do - local Num = BushBranchCenter[i][1] - local TexNum = BushBranchCenter[i][2] + local Num = BushBranchCenter[i][1] + local TexNum = BushBranchCenter[i][2] minetest.register_node("bushes:bushbranches"..Num, { description = S("Bush Branches @1", Num), drawtype = "nodebox", @@ -51,6 +43,7 @@ for i in pairs(BushBranchCenter) do "bushes_leaves_"..TexNum..".png", "bushes_branches_center_"..TexNum..".png" }, + use_texture_alpha = "clip", node_box = { type = "fixed", fixed = { @@ -78,10 +71,10 @@ for i in pairs(BushBranchCenter) do }) end -local BushBranchSide = { {2,1}, {4,2} } +local BushBranchSide = { {2,1}, {4,2} } for i in pairs(BushBranchSide) do - local Num = BushBranchSide[i][1] - local TexNum = BushBranchSide[i][2] + local Num = BushBranchSide[i][1] + local TexNum = BushBranchSide[i][2] minetest.register_node("bushes:bushbranches"..Num, { description = S("Bush Branches @1", Num), drawtype = "nodebox", @@ -93,6 +86,7 @@ for i in pairs(BushBranchSide) do --[[back]] "bushes_branches_center_"..TexNum..".png",-- unless U really want 'em 2 B different --[[front]] "bushes_branches_right_"..TexNum..".png" }, + use_texture_alpha = "clip", node_box = { type = "fixed", fixed = { @@ -122,61 +116,31 @@ for i in pairs(BushBranchSide) do }) end -local BushLeafNode = { {1}, {2}} +local BushLeafNode = { {1}, {2}} for i in pairs(BushLeafNode) do local Num = BushLeafNode[i][1] minetest.register_node("bushes:BushLeaves"..Num, { description = S("Bush Leaves @1", Num), drawtype = "allfaces_optional", tiles = {"bushes_leaves_"..Num..".png"}, + use_texture_alpha = "clip", paramtype = "light", groups = { -- MM: Should we add leafdecay? snappy=3, flammable=2, - attached_node=1 + attached_node=1, + leaves=1 }, sounds = default.node_sound_leaves_defaults(), }) end -abstract_bushes.grow_bush = function(pos) - local leaf_type = math.random(1,2) - local bush_side_height = math.random(0,1) - local chance_of_bush_node_right = math.random(1,10) - if chance_of_bush_node_right> 5 then - local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z} - abstract_bushes.grow_bush_node(right_pos,3,leaf_type) - end - local chance_of_bush_node_left = math.random(1,10) - if chance_of_bush_node_left> 5 then - bush_side_height = math.random(0,1) - local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z} - abstract_bushes.grow_bush_node(left_pos,1,leaf_type) - end - local chance_of_bush_node_front = math.random(1,10) - if chance_of_bush_node_front> 5 then - bush_side_height = math.random(0,1) - local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1} - abstract_bushes.grow_bush_node(front_pos,2,leaf_type) - end - local chance_of_bush_node_back = math.random(1,10) - if chance_of_bush_node_back> 5 then - bush_side_height = math.random(0,1) - local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1} - abstract_bushes.grow_bush_node(back_pos,0,leaf_type) - end - -abstract_bushes.grow_bush_node(pos,5,leaf_type) -end - - -abstract_bushes.grow_bush_node = function(pos,dir, leaf_type) +local function grow_bush_node(pos, dir, leaf_type) local right_here = {x=pos.x, y=pos.y+1, z=pos.z} local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z} local bush_branch_type = 2 - -- MM: I'm not sure if it's slower now than before... if dir ~= 5 and leaf_type == 1 then bush_branch_type = 2 end @@ -192,53 +156,108 @@ abstract_bushes.grow_bush_node = function(pos,dir, leaf_type) dir = 1 end - if minetest.get_node(right_here).name == "air" -- instead of check_air = true, - or minetest.get_node(right_here).name == "default:junglegrass" then + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true, minetest.swap_node(right_here, {name="bushes:bushbranches"..bush_branch_type , param2=dir}) - --minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")") minetest.swap_node(above_right_here, {name="bushes:BushLeaves"..leaf_type}) + local chance_of_high_leaves = math.random(1,10) - if chance_of_high_leaves> 5 then + if chance_of_high_leaves > 5 then local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z} - --minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")") minetest.swap_node(two_above_right_here, {name="bushes:BushLeaves"..leaf_type}) end end end +local function grow_bush(pos) + -- replace possible grass nodes + minetest.swap_node({x=pos.x, y=pos.y+1, z=pos.z}, {name="air"}) -biome_lib.register_on_generate({ - surface = { - "default:dirt_with_grass", - "stoneage:grass_with_silex", - "sumpf:peat", - "sumpf:sumpf" - }, - rarity = bushes_bush_rarity, - rarity_fertility = bushes_bush_rarity_fertility, - plantlife_limit = bushes_bush_fertility, - min_elevation = 1, -- above sea level - }, - abstract_bushes.grow_bush -) + local leaf_type = math.random(1,2) + local bush_side_height = math.random(0,1) -abstract_bushes.grow_youngtree2 = function(pos) - local height = math.random(4,5) - abstract_bushes.grow_youngtree_node2(pos,height) + local chance_of_bush_node_right = math.random(1,10) + if chance_of_bush_node_right > 5 then + local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z} + grow_bush_node(right_pos,3,leaf_type) + end + + local chance_of_bush_node_left = math.random(1,10) + if chance_of_bush_node_left > 5 then + local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z} + grow_bush_node(left_pos,1,leaf_type) + end + + local chance_of_bush_node_front = math.random(1,10) + if chance_of_bush_node_front > 5 then + local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1} + grow_bush_node(front_pos,2,leaf_type) + end + + local chance_of_bush_node_back = math.random(1,10) + if chance_of_bush_node_back > 5 then + local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1} + grow_bush_node(back_pos,0,leaf_type) + end + + grow_bush_node(pos,5,leaf_type) end +minetest.register_decoration({ + name = "bushes:bush", + decoration = { + "air" + }, + fill_ratio = bush_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) -abstract_bushes.grow_youngtree_node2 = function(pos, height) +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("bushes:bush") + minetest.set_gen_notify("decoration", {did}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_bush(pos) + end +end) + +local function grow_youngtree_node2(pos, height) local right_here = {x=pos.x, y=pos.y+1, z=pos.z} local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z} local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z} local three_above_right_here = {x=pos.x, y=pos.y+4, z=pos.z} - if minetest.get_node(right_here).name == "air" -- instead of check_air = true, - or minetest.get_node(right_here).name == "default:junglegrass" then + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true, if height == 4 then local two_above_right_here_south = {x=pos.x, y=pos.y+3, z=pos.z-1} local three_above_right_here_south = {x=pos.x, y=pos.y+4, z=pos.z-1} + minetest.swap_node(right_here, {name="bushes:youngtree2_bottom"}) minetest.swap_node(above_right_here, {name="bushes:youngtree2_bottom"}) minetest.swap_node(two_above_right_here, {name="bushes:bushbranches2" , param2=2}) @@ -249,18 +268,50 @@ abstract_bushes.grow_youngtree_node2 = function(pos, height) end end +local function grow_youngtree2(pos) + local height = math.random(4,5) + grow_youngtree_node2(pos,height) +end -biome_lib.register_on_generate({ - surface = { - "default:dirt_with_grass", - "stoneage:grass_with_silex", - "sumpf:peat", - "sumpf:sumpf" - }, - rarity = bushes_youngtrees_rarity, - rarity_fertility = bushes_youngtrees_rarity_fertility, - plantlife_limit = bushes_youngtrees_fertility, - min_elevation = 1, -- above sea level +minetest.register_decoration({ + name = "bushes:youngtree", + decoration = { + "air" }, - abstract_bushes.grow_youngtree2 -) + fill_ratio = youngtree_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did2 +minetest.register_on_mods_loaded(function() + did2 = minetest.get_decoration_id("bushes:youngtree") + minetest.set_gen_notify("decoration", {did2}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did2] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_youngtree2(pos) + end +end) \ No newline at end of file diff --git a/mods/plantlife_modpack/bushes/locale/bushes.de.tr b/mods/plantlife_modpack/bushes/locale/bushes.de.tr new file mode 100644 index 00000000..af63ead9 --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/bushes.de.tr @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)=Strauch 2 (Ansatz) +Bush Branches @1=Buschäste @1 +Bush Leaves @1=Buschblätter @1 diff --git a/mods/plantlife_modpack/bushes/locale/bushes.eo.tr b/mods/plantlife_modpack/bushes/locale/bushes.eo.tr new file mode 100644 index 00000000..95ef7abd --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/bushes.eo.tr @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)=Juna Arbo 2 (malsupro) +Bush Branches @1=Arbustaj Branĉoj @1 +Bush Leaves @1=Arbustaj Folioj @1 diff --git a/mods/plantlife_modpack/bushes/locale/bushes.fr.tr b/mods/plantlife_modpack/bushes/locale/bushes.fr.tr index a3388141..6289a527 100644 --- a/mods/plantlife_modpack/bushes/locale/bushes.fr.tr +++ b/mods/plantlife_modpack/bushes/locale/bushes.fr.tr @@ -1,11 +1,4 @@ # textdomain: bushes - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Young Tree 2 (bottom)=Arbuste 2 (bas) Bush Branches @1=Branches de buisson @1 Bush Leaves @1=Feuilles de buisson @1 diff --git a/mods/plantlife_modpack/bushes/locale/template.txt b/mods/plantlife_modpack/bushes/locale/template.txt index e3db363b..412fb60b 100644 --- a/mods/plantlife_modpack/bushes/locale/template.txt +++ b/mods/plantlife_modpack/bushes/locale/template.txt @@ -1,10 +1,4 @@ # textdomain: bushes - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. - Young Tree 2 (bottom)= Bush Branches @1= Bush Leaves @1= diff --git a/mods/plantlife_modpack/bushes/mod.conf b/mods/plantlife_modpack/bushes/mod.conf index 998cdd5a..5ebb64de 100644 --- a/mods/plantlife_modpack/bushes/mod.conf +++ b/mods/plantlife_modpack/bushes/mod.conf @@ -1,3 +1,4 @@ name = bushes -depends = default, biome_lib -optional_depends = stonage, sumpf +title = Bushes +depends = default +optional_depends = stoneage, sumpf, ebiomes diff --git a/mods/plantlife_modpack/bushes/settingtypes.txt b/mods/plantlife_modpack/bushes/settingtypes.txt index 77c5d571..34b2cb0b 100644 --- a/mods/plantlife_modpack/bushes/settingtypes.txt +++ b/mods/plantlife_modpack/bushes/settingtypes.txt @@ -1,17 +1,5 @@ -#Bush rarity % -bushes_bush_rarity (Bush rarity %) float 99.9 0 100 +# Bush rarity (higher number -> higher probability) +bushes.bush_rarity (Bush rarity) float 0.008 0.0001 1 -#How much the rarity is reduced by fertility % -bushes_bush_rarity_fertility (Bush rarity fertility reduction %) float 1.5 0 100 - -#Bush minimum fertility (-1 to +1) -bushes_bush_fertility (Bush minimum fertility) float -0.7 -1 1 - -#Youngtree (from bushes mod) rarity % -bushes_youngtrees_rarity (Youngtree bush rarity %) float 100 0 100 - -#How much the rarity is reduced by fertility % -bushes_youngtrees_rarity_fertility (Youngtree bush rarity fertility reduction %) float 0.6 0 100 - -#Youngtree (from bushes mod) minimum fertility (-1 to +1) -bushes_youngtrees_fertility (Youngtree bush minimum fertility) float -0.5 -1 1 +# Youngtree rarity (higher number -> higher probability) +bushes.youngtree_rarity (Youngtree rarity) float 0.006 0.0001 1 diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1.png b/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1.png deleted file mode 100644 index 28fe91fe..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1L.png b/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1L.png deleted file mode 100644 index 1d8a8e2c..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1L.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1R.png b/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1R.png deleted file mode 100644 index 514b888b..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1R.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1.png deleted file mode 100644 index 5bb2b46f..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm.png deleted file mode 100644 index 5574f38f..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm2.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm2.png deleted file mode 100644 index 6ffd2f36..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm2.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm3.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm3.png deleted file mode 100644 index 5bb9bf5b..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm3.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm4.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm4.png deleted file mode 100644 index b204feff..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm4.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesCenter.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesCenter.png deleted file mode 100644 index 0c9b5af1..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesCenter.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide1.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide1.png deleted file mode 100644 index ca95dd3c..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide1.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide2.png b/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide2.png deleted file mode 100644 index d62499e8..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide2.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/blank.png b/mods/plantlife_modpack/bushes/textures/old & unused/blank.png deleted file mode 100644 index ed495a82..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/blank.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes/textures/old & unused/moretrees_pine_leaves3.png b/mods/plantlife_modpack/bushes/textures/old & unused/moretrees_pine_leaves3.png deleted file mode 100644 index 57d077d0..00000000 Binary files a/mods/plantlife_modpack/bushes/textures/old & unused/moretrees_pine_leaves3.png and /dev/null differ diff --git a/mods/plantlife_modpack/bushes_classic/cooking.lua b/mods/plantlife_modpack/bushes_classic/cooking.lua index 3e46441b..80d264d0 100644 --- a/mods/plantlife_modpack/bushes_classic/cooking.lua +++ b/mods/plantlife_modpack/bushes_classic/cooking.lua @@ -33,9 +33,12 @@ end -- override farming_plus strawberry and add food_ group if minetest.get_modpath("farming_plus") then + local groups = table.copy(minetest.registered_items["farming_plus:strawberry_item"].groups) + groups["food_strawberry"] = 1 + groups["food_berry"] = 1 minetest.override_item("farming_plus:strawberry_item", { - groups = {food_strawberry = 1, food_berry = 1, flammable = 2}, + groups = groups, }) end diff --git a/mods/plantlife_modpack/bushes_classic/init.lua b/mods/plantlife_modpack/bushes_classic/init.lua index a470a8f3..2918a5d7 100644 --- a/mods/plantlife_modpack/bushes_classic/init.lua +++ b/mods/plantlife_modpack/bushes_classic/init.lua @@ -7,7 +7,7 @@ bushes_classic = {} local S = minetest.get_translator("bushes_classic") bushes_classic.bushes = { - "strawberry", + "strawberry", "blackberry", "blueberry", "raspberry", @@ -30,12 +30,19 @@ local modpath = minetest.get_modpath('bushes_classic') dofile(modpath..'/cooking.lua') dofile(modpath..'/nodes.lua') -biome_lib.register_active_spawner({ - spawn_delay = 3600, - spawn_plants = bushes_classic.spawn_list, - avoid_radius = 10, - spawn_chance = 100, - spawn_surfaces = { +local spawn_plants = bushes_classic.spawn_list + +local function get_biome_data(pos, perlin_fertile) + local fertility = perlin_fertile:get_2d({x=pos.x, y=pos.z}) + + local data = minetest.get_biome_data(pos) + -- Original values this method returned were +1 (lowest) to -1 (highest) + -- so we need to convert the 0-100 range from get_biome_data() to that. + return fertility, 1 - (data.heat / 100 * 2), 1 - (data.humidity / 100 * 2) +end + +minetest.register_abm({ + nodenames = { "default:dirt_with_grass", "woodsoils:dirt_with_leaves_1", "woodsoils:grass_with_leaves_1", @@ -43,16 +50,31 @@ biome_lib.register_active_spawner({ "farming:soil", "farming:soil_wet" }, - avoid_nodes = {"group:bush"}, - seed_diff = 545342534, -- chosen by a fair mashing of the keyboard - guaranteed to be random :P - plantlife_limit = -0.1, - light_min = 10, - temp_min = 0.15, -- approx 20C - temp_max = -0.15, -- approx 35C - humidity_min = 0, -- 50% RH - humidity_max = -1, -- 100% RH + interval = 3600, + chance = 100, + label = "[bushes_classic] spawn bushes", + min_y = -16, + max_y = 48, + action = function(pos, node) + local p_top = {x = pos.x, y = pos.y + 1, z = pos.z} + local n_top = minetest.get_node_or_nil(p_top) + if not n_top or n_top.name ~= "air" then return end + + local perlin_fertile_area = minetest.get_perlin(545342534, 3, 0.6, 100) + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + local pos_biome_ok = fertility > -0.1 and temperature <= 0.15 and temperature >= -0.15 and humidity <= 0 and humidity >= -1 + if not pos_biome_ok then return end + + if minetest.find_node_near(p_top, 10 + math.random(-1.5,2), {"group:bush"}) then + return -- Nodes to avoid are nearby + end + + local plant_to_spawn = spawn_plants[math.random(1, #spawn_plants)] + + minetest.swap_node(p_top, {name = plant_to_spawn, param2 = 0}) + end }) minetest.register_alias("bushes:basket_pies", "bushes:basket_strawberry") - -print("[Bushes] Loaded.") diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr index 35520b5c..727b0b26 100644 --- a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr @@ -1,46 +1,39 @@ # textdomain: bushes_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Xanthin, 2017. -# - Sugar=Zucker -Basket with Strawberry pies=Korb mit Erdbeertorten -Cooked Strawberry pie=Erdbeertorte -Raw Strawberry pie=Rohe Erdbeertorte -Slice of Strawberry pie=Erdbeertortenstueck Strawberry=Erdbeere +Raw Strawberry pie=Rohe Erdbeertorte +Cooked Strawberry pie=Erdbeertorte +Slice of Strawberry pie=Erdbeertortenstück +Basket with Strawberry pies=Korb mit Erdbeertorten Strawberry Bush=Erdbeerbusch -Basket with Blackberry pies=Korb mit Brombeertorten Blackberry=Brombeere -Blackberry Bush=Brombeerbusch -Cooked Blackberry pie=Brombeertorte Raw Blackberry pie=Rohe Brombeertorte -Slice of Blackberry pie=Brombeertortenstueck -Basket with Blueberry pies=Korb mit Blaubeertorten +Cooked Blackberry pie=Brombeertorte +Slice of Blackberry pie=Brombeertortenstück +Basket with Blackberry pies=Korb mit Brombeertorten +Blackberry Bush=Brombeerbusch Blueberry=Blaubeere -Blueberry Bush=Blaubeerbusch -Cooked Blueberry pie=Blaubeertorte Raw Blueberry pie=Rohe Blaubeertorte -Slice of Blueberry pie=Blaubeertortenstueck -Basket with Raspberry pies=Korb mit Himbeertorten -Cooked Raspberry pie=Himbeertorte +Cooked Blueberry pie=Blaubeertorte +Slice of Blueberry pie=Blaubeertortenstück +Basket with Blueberry pies=Korb mit Blaubeertorten +Blueberry Bush=Blaubeerbusch Raspberry=Himbeere -Raspberry Bush=Himbeerbusch Raw Raspberry pie=Rohe Himbeertorte -Slice of Raspberry pie=Himbeertortenstueck -Basket with Gooseberry pies=Korb mit Stachelbeertorten -Cooked Gooseberry pie=Stachelbeertorte +Cooked Raspberry pie=Himbeertorte +Slice of Raspberry pie=Himbeertortenstück +Basket with Raspberry pies=Korb mit Himbeertorten +Raspberry Bush=Himbeerbusch Gooseberry=Stachelbeere -Gooseberry Bush=Stachelbeerbusch Raw Gooseberry pie=Rohe Stachelbeertorte -Slice of Gooseberry pie=Stachelbeertortenstueck -Basket with Mixed Berry pies=Korb mit Beerenmixtorten -Cooked Mixed Berry pie=Beerenmixtorte -Currently fruitless Bush=zur Zeit fruechteloser +Cooked Gooseberry pie=Stachelbeertorte +Slice of Gooseberry pie=Stachelbeertortenstück +Basket with Gooseberry pies=Korb mit Stachelbeertorten +Gooseberry Bush=Stachelbeerbusch Mixed Berry=Beerenmix Raw Mixed Berry pie=Rohe Beerenmixtorte -Slice of Mixed Berry pie=Beerenmixtortenstueck +Cooked Mixed Berry pie=Beerenmixtorte +Slice of Mixed Berry pie=Beerenmixtortenstück +Basket with Mixed Berry pies=Korb mit Beerenmixtorten +Currently fruitless Bush=Zur Zeit früchteloser Busch Basket=Korb diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr new file mode 100644 index 00000000..194cc17f --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Sukero +Strawberry=Frago +Raw Strawberry pie=Kruda Fragokuko +Cooked Strawberry pie=Kuirita Fragokuko +Slice of Strawberry pie=Tranĉaĵo de Fragokuko +Basket with Strawberry pies=Korbo kun Fragokukoj +Strawberry Bush=Fraga Arbusto +Blackberry=Rubuso +Raw Blackberry pie=Kruda Rubusokuko +Cooked Blackberry pie=Kuirita Rubusokuko +Slice of Blackberry pie=Tranĉaĵo de Rubusokuko +Basket with Blackberry pies=Korbo kun Rubusokukoj +Blackberry Bush=Rubusa Arbusto +Blueberry=Mirtelo +Raw Blueberry pie=Kruda Mirtelokuko +Cooked Blueberry pie=Kuirita Mirtelokuko +Slice of Blueberry pie=Tranĉaĵo de Mirtelokuko +Basket with Blueberry pies=Korbo kun Mirtelokukoj +Blueberry Bush=Mirtela Arbusto +Raspberry=Frambo +Raw Raspberry pie=Kruda Frambokuko +Cooked Raspberry pie=Kuirita Frambokuko +Slice of Raspberry pie=Tranĉaĵo de Frambokuko +Basket with Raspberry pies=Korbo kun Frambokukoj +Raspberry Bush=Framba Arbusto +Gooseberry=Grosbero +Raw Gooseberry pie=Kruda Grosberkuko +Cooked Gooseberry pie=Kuirita Grosberkuko +Slice of Gooseberry pie=Tranĉaĵo de Grosberkuko +Basket with Gooseberry pies=Korbo kun Grosberkuko +Gooseberry Bush=Grosberarbusto +Mixed Berry=Miksita Bero +Raw Mixed Berry pie=Kruda Miksita Bera Kuko +Cooked Mixed Berry pie=Kuirita Miksa Beraj Kukoj +Slice of Mixed Berry pie=Tranĉaĵo de Miksita Bera Kuko +Basket with Mixed Berry pies=Korbo kun Miksitaj Beraj Kukoj +Currently fruitless Bush=Nuntempe senfrukta Arbusto +Basket=Korbo diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr index 9726073a..2a900bc0 100644 --- a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr @@ -1,46 +1,39 @@ # textdomain: bushes_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Carlos Barraza , 2017. -# - Sugar=Azúcar -Basket with Strawberry pies=Cesta con Pasteles de Frutilla -Cooked Strawberry pie=Pastel de Frutilla Cocido -Raw Strawberry pie=Pastel de Frutilla Crudo -Slice of Strawberry pie=Rebanada de Pastel de Frutilla Strawberry=Frutilla +Raw Strawberry pie=Pastel de Frutilla Crudo +Cooked Strawberry pie=Pastel de Frutilla Cocido +Slice of Strawberry pie=Rebanada de Pastel de Frutilla +Basket with Strawberry pies=Cesta con Pasteles de Frutilla Strawberry Bush=Arbusto de Frutilla -Basket with Blackberry pies=Cesta con Pasteles de Mora Blackberry=Mora -Blackberry Bush=Arbusto de Mora -Cooked Blackberry pie=Pastel de Mora Cocido Raw Blackberry pie=Pastel de Mora Crudo +Cooked Blackberry pie=Pastel de Mora Cocido Slice of Blackberry pie=Rebanada de Pastel de Mora -Basket with Blueberry pies=Cesta con Pasteles de Arándano +Basket with Blackberry pies=Cesta con Pasteles de Mora +Blackberry Bush=Arbusto de Mora Blueberry=Arándano -Blueberry Bush=Arbusto de Arándano -Cooked Blueberry pie=Pastel de Arándano Cocido Raw Blueberry pie=Pastel de Arándano Crudo +Cooked Blueberry pie=Pastel de Arándano Cocido Slice of Blueberry pie=Rebanada de Pastel de Arándano -Basket with Raspberry pies=Cesta con Pasteles de Frambuesa -Cooked Raspberry pie=Pastel de Frambuesa Cocido +Basket with Blueberry pies=Cesta con Pasteles de Arándano +Blueberry Bush=Arbusto de Arándano Raspberry=Frambuesa -Raspberry Bush=Arbusto de Frambuesa Raw Raspberry pie=Pastel de Frambuesa Crudo +Cooked Raspberry pie=Pastel de Frambuesa Cocido Slice of Raspberry pie=Rebanada de Pastel de Frambuesa -Basket with Gooseberry pies=Cesta con Pasteles de Grosella -Cooked Gooseberry pie=Pastel de Grosella Cocido +Basket with Raspberry pies=Cesta con Pasteles de Frambuesa +Raspberry Bush=Arbusto de Frambuesa Gooseberry=Grosella -Gooseberry Bush=Arbusto de Grosella Raw Gooseberry pie=Pastel de Grosella Crudo +Cooked Gooseberry pie=Pastel de Grosella Cocido Slice of Gooseberry pie=Rebanada de Pastel de Grosella -Basket with Mixed Berry pies=Cesta con Pasteles de Mezcla de Baya -Cooked Mixed Berry pie=Pastel de Mezcla de Bayas Cocido -Currently fruitless Bush=Arbusto actualmente infructuoso +Basket with Gooseberry pies=Cesta con Pasteles de Grosella +Gooseberry Bush=Arbusto de Grosella Mixed Berry=Mezcla de Baya Raw Mixed Berry pie=Pastel de Mezcla de Bayas Cruda +Cooked Mixed Berry pie=Pastel de Mezcla de Bayas Cocido Slice of Mixed Berry pie=Rebanada de Pastel de Mezcla de Bayas +Basket with Mixed Berry pies=Cesta con Pasteles de Mezcla de Baya +Currently fruitless Bush=Arbusto actualmente infructuoso Basket=Cesta diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr index 4400433b..b64e3b62 100644 --- a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr @@ -1,46 +1,39 @@ # textdomain: bushes_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Sugar=Sucre -Basket with Strawberry pies=Panier de tartes aux fraises -Cooked Strawberry pie=Tarte aux fraises (cuite) -Raw Strawberry pie=Tarte aux fraises (crue) -Slice of Strawberry pie=Part de tarte aux fraises Strawberry=Fraises +Raw Strawberry pie=Tarte aux fraises (crue) +Cooked Strawberry pie=Tarte aux fraises (cuite) +Slice of Strawberry pie=Part de tarte aux fraises +Basket with Strawberry pies=Panier de tartes aux fraises Strawberry Bush=Buisson de fraises -Basket with Blackberry pies=Panier de tartes aux fraises Blackberry=Mûres -Blackberry Bush=Buisson de mûres -Cooked Blackberry pie=Tarte aux mûres (cuite) Raw Blackberry pie=Tarte aux mûres (crue) +Cooked Blackberry pie=Tarte aux mûres (cuite) Slice of Blackberry pie=Part de tarte aux mûres -Basket with Blueberry pies=Panier de tartes aux mûres +Basket with Blackberry pies=Panier de tartes aux fraises +Blackberry Bush=Buisson de mûres Blueberry=Myrtilles -Blueberry Bush=Buisson de myrtilles -Cooked Blueberry pie=Tarte aux myrtilles (cuite) Raw Blueberry pie=Tarte aux myrtilles (crue) +Cooked Blueberry pie=Tarte aux myrtilles (cuite) Slice of Blueberry pie=Part de tarte aux myrtilles -Basket with Raspberry pies=Panier de tartes aux framboises -Cooked Raspberry pie=Tarte aux framboises (cuite) +Basket with Blueberry pies=Panier de tartes aux mûres +Blueberry Bush=Buisson de myrtilles Raspberry=Framboises -Raspberry Bush=Buisson de framboises Raw Raspberry pie=Tarte aux framboises (crue) +Cooked Raspberry pie=Tarte aux framboises (cuite) Slice of Raspberry pie=Part de tarts aux framboises -Basket with Gooseberry pies=Panier de tartes aux groseilles -Cooked Gooseberry pie=Tarte aux groseilles (cuite) +Basket with Raspberry pies=Panier de tartes aux framboises +Raspberry Bush=Buisson de framboises Gooseberry=Groseilles -Gooseberry Bush=Buisson de groseilles Raw Gooseberry pie=Tarte aux groseilles (crue) +Cooked Gooseberry pie=Tarte aux groseilles (cuite) Slice of Gooseberry pie=Part de tarte aux groseilles -Basket with Mixed Berry pies=Panier de tartes aux fruits rouges -Cooked Mixed Berry pie=Tarte aux fruits rouges (cuite) -Currently fruitless Bush=Buisson sans fruits pour l'instant +Basket with Gooseberry pies=Panier de tartes aux groseilles +Gooseberry Bush=Buisson de groseilles Mixed Berry=Fruits rouges Raw Mixed Berry pie=Tarte aux fruits rouges (crue) +Cooked Mixed Berry pie=Tarte aux fruits rouges (cuite) Slice of Mixed Berry pie=Part de tarte aux fruits rouges +Basket with Mixed Berry pies=Panier de tartes aux fruits rouges +Currently fruitless Bush=Buisson sans fruits pour l'instant Basket=Panier diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr index 38ed28d2..c88b7168 100644 --- a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr @@ -1,46 +1,39 @@ # textdomain: bushes_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mahmutelmas06@hotmail.com, 2017. -# - Sugar=Şeker -Basket with Strawberry pies=Çilekli pasta sepeti -Cooked Strawberry pie=Pişmiş çilekli pasta -Raw Strawberry pie=Çilekli çiğ pasta -Slice of Strawberry pie=Çilekli pasta dilimi Strawberry=Çilek +Raw Strawberry pie=Çilekli çiğ pasta +Cooked Strawberry pie=Pişmiş çilekli pasta +Slice of Strawberry pie=Çilekli pasta dilimi +Basket with Strawberry pies=Çilekli pasta sepeti Strawberry Bush=Çilek fidanı -Basket with Blackberry pies=Böğürtlenli pasta sepeti Blackberry=Böğürtlen -Blackberry Bush=Böğürtlen fidanı -Cooked Blackberry pie=Pişmiş böğürtlenli pasta Raw Blackberry pie=Böğürtlenli çiğ pasta +Cooked Blackberry pie=Pişmiş böğürtlenli pasta Slice of Blackberry pie=Böğürtlenli pasta dilimi -Basket with Blueberry pies=Yaban mersini pastalı sepet +Basket with Blackberry pies=Böğürtlenli pasta sepeti +Blackberry Bush=Böğürtlen fidanı Blueberry=Yaban mersini -Blueberry Bush=Yaban mersini fidanı -Cooked Blueberry pie=Pişmiş yaban mersinli pasta Raw Blueberry pie=Yaban mersinli çiğ pasta +Cooked Blueberry pie=Pişmiş yaban mersinli pasta Slice of Blueberry pie=Yaban mersinli pasta dilimi -Basket with Raspberry pies=Ahududulu pasta sepeti -Cooked Raspberry pie=Pişmiş ahududulu pasta +Basket with Blueberry pies=Yaban mersini pastalı sepet +Blueberry Bush=Yaban mersini fidanı Raspberry=Ahududu -Raspberry Bush=Ahududu fidanı Raw Raspberry pie=Ahududulu çiğ pasta +Cooked Raspberry pie=Pişmiş ahududulu pasta Slice of Raspberry pie=Ahududulu pasta dilimi -Basket with Gooseberry pies=Bektaşi üzümlü pasta sepeti -Cooked Gooseberry pie=Pişmiş bektaşi üzümlü pasta +Basket with Raspberry pies=Ahududulu pasta sepeti +Raspberry Bush=Ahududu fidanı Gooseberry=Bektaşi üzümü -Gooseberry Bush=Bektaşi üzümü fidanı Raw Gooseberry pie=Bektaşi üzümlü çiğ pasta +Cooked Gooseberry pie=Pişmiş bektaşi üzümlü pasta Slice of Gooseberry pie=Bektaşi üzümlü pasta dilimi -Basket with Mixed Berry pies=Dutlu pasta sepeti -Cooked Mixed Berry pie=Pişmiş dutlu pasta -Currently fruitless Bush=Fidanı şu anda meyvesiz +Basket with Gooseberry pies=Bektaşi üzümlü pasta sepeti +Gooseberry Bush=Bektaşi üzümü fidanı Mixed Berry=Dut Raw Mixed Berry pie=Dutlu çiğ pasta +Cooked Mixed Berry pie=Pişmiş dutlu pasta Slice of Mixed Berry pie=Dutlu pasta dilimi +Basket with Mixed Berry pies=Dutlu pasta sepeti +Currently fruitless Bush=Fidanı şu anda meyvesiz Basket=Sepet diff --git a/mods/plantlife_modpack/bushes_classic/locale/template.txt b/mods/plantlife_modpack/bushes_classic/locale/template.txt index c721e236..69fc2a1b 100644 --- a/mods/plantlife_modpack/bushes_classic/locale/template.txt +++ b/mods/plantlife_modpack/bushes_classic/locale/template.txt @@ -1,46 +1,39 @@ # textdomain: bushes_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Sugar= -Basket with Strawberry pies= -Cooked Strawberry pie= -Raw Strawberry pie= -Slice of Strawberry pie= Strawberry= +Raw Strawberry pie= +Cooked Strawberry pie= +Slice of Strawberry pie= +Basket with Strawberry pies= Strawberry Bush= -Basket with Blackberry pies= Blackberry= -Blackberry Bush= -Cooked Blackberry pie= Raw Blackberry pie= +Cooked Blackberry pie= Slice of Blackberry pie= -Basket with Blueberry pies= +Basket with Blackberry pies= +Blackberry Bush= Blueberry= -Blueberry Bush= -Cooked Blueberry pie= Raw Blueberry pie= +Cooked Blueberry pie= Slice of Blueberry pie= -Basket with Raspberry pies= -Cooked Raspberry pie= +Basket with Blueberry pies= +Blueberry Bush= Raspberry= -Raspberry Bush= Raw Raspberry pie= +Cooked Raspberry pie= Slice of Raspberry pie= -Basket with Gooseberry pies= -Cooked Gooseberry pie= +Basket with Raspberry pies= +Raspberry Bush= Gooseberry= -Gooseberry Bush= Raw Gooseberry pie= +Cooked Gooseberry pie= Slice of Gooseberry pie= -Basket with Mixed Berry pies= -Cooked Mixed Berry pie= -Currently fruitless Bush= +Basket with Gooseberry pies= +Gooseberry Bush= Mixed Berry= Raw Mixed Berry pie= +Cooked Mixed Berry pie= Slice of Mixed Berry pie= +Basket with Mixed Berry pies= +Currently fruitless Bush= Basket= diff --git a/mods/plantlife_modpack/bushes_classic/mod.conf b/mods/plantlife_modpack/bushes_classic/mod.conf index 0adcd692..2a74a26f 100644 --- a/mods/plantlife_modpack/bushes_classic/mod.conf +++ b/mods/plantlife_modpack/bushes_classic/mod.conf @@ -1,3 +1,2 @@ name = bushes_classic -depends = biome_lib optional_depends = farming, farming_plus diff --git a/mods/plantlife_modpack/bushes_classic/nodes.lua b/mods/plantlife_modpack/bushes_classic/nodes.lua index cf94d997..6f4a8f00 100644 --- a/mods/plantlife_modpack/bushes_classic/nodes.lua +++ b/mods/plantlife_modpack/bushes_classic/nodes.lua @@ -63,7 +63,7 @@ plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger) -- with a chance of 1/3, return 2 bushes local amount - if math.random(1,3) == 1 then + if can_harvest and math.random(1,3) == 1 then amount = "2" else amount = "1" @@ -159,19 +159,21 @@ for i, bush_name in ipairs(bushes_classic.bushes) do paramtype2 = "facedir", on_use = minetest.item_eat(18), groups = { dig_immediate = 3 }, + is_ground_content = false, }) - local texture_top, texture_bottom local groups = {snappy = 3, bush = 1, flammable = 2, attached_node=1} if bush_name == "mixed_berry" then bush_name = "fruitless"; - texture_top = "bushes_fruitless_bush_top.png" - texture_bottom = "bushes_fruitless_bush_bottom.png" groups.not_in_creative_inventory = 1 - else - texture_top = "bushes_bush_top.png" - texture_bottom = "bushes_bush_bottom.png" + end + + local node_dig_prediction + local node_placement_prediction + if bush_name ~= "fruitless" then + node_dig_prediction = "bushes:fruitless_bush" + node_placement_prediction = "bushes:fruitless_bush" end minetest.register_node(":bushes:" .. bush_name .. "_bush", { @@ -185,6 +187,8 @@ for i, bush_name in ipairs(bushes_classic.bushes) do groups = groups, sounds = default.node_sound_leaves_defaults(), drop = "", + node_dig_prediction = node_dig_prediction, + node_placement_prediction = node_placement_prediction, after_dig_node = function( pos, oldnode, oldmetadata, digger ) return plantlife_bushes.after_dig_node(pos, oldnode, oldmetadata, digger); end, @@ -207,4 +211,5 @@ minetest.register_node(":bushes:basket_empty", { paramtype = "light", paramtype2 = "facedir", groups = { dig_immediate = 3 }, + is_ground_content = false, }) diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png index 4384fba1..098515ac 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png index 83ee63c0..cbf30c60 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png index 9f9b2c6b..9f4c844b 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png index d6bdff4f..4d1404b0 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png index ff271ff9..b63bec62 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png index 3bfd42ff..8cc7d509 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png index c27b0b3a..2ce98767 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png index fa76c616..8cedd1be 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png index 3a305ca8..870c8558 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png index ffa2e0a7..32f14c49 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png index 52eca60f..2d0db196 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png index 01809def..f57c6407 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png index a5060e2f..7e07d73e 100644 Binary files a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png differ diff --git a/mods/plantlife_modpack/cavestuff/init.lua b/mods/plantlife_modpack/cavestuff/init.lua index 3f46ea93..d328f466 100644 --- a/mods/plantlife_modpack/cavestuff/init.lua +++ b/mods/plantlife_modpack/cavestuff/init.lua @@ -1,17 +1,2 @@ ------------------------------------------------------------------------------------------------ -local title = "Cave Stuff" -local version = "0.0.3" -local mname = "cavestuff" ------------------------------------------------------------------------------------------------ - --- support for i18n -local S = minetest.get_translator("cavestuff") - -cavestuff = {} - dofile(minetest.get_modpath("cavestuff").."/nodes.lua") dofile(minetest.get_modpath("cavestuff").."/mapgen.lua") - ------------------------------------------------------------------------------------------------ - -print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr new file mode 100644 index 00000000..69bb0cc7 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble=Kieselstein +Desert Pebble=Wüstenkiesel +Stalactite=Stalaktit diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr new file mode 100644 index 00000000..9da0f26b --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble=Ŝtoneto +Desert Pebble=Dezerta Ŝtoneto +Stalactite=Stalaktito diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr index aae88ac8..0c48fb0e 100644 --- a/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr @@ -1,11 +1,4 @@ # textdomain: cavestuff - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Pebble=Caillou Desert Pebble=Caillou du désert Stalactite=Stalactite diff --git a/mods/plantlife_modpack/cavestuff/locale/template.txt b/mods/plantlife_modpack/cavestuff/locale/template.txt index 8e8d18a3..aae21126 100644 --- a/mods/plantlife_modpack/cavestuff/locale/template.txt +++ b/mods/plantlife_modpack/cavestuff/locale/template.txt @@ -1,11 +1,4 @@ # textdomain: cavestuff - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Pebble= Desert Pebble= Stalactite= diff --git a/mods/plantlife_modpack/cavestuff/mapgen.lua b/mods/plantlife_modpack/cavestuff/mapgen.lua index 92989bc1..64de328a 100644 --- a/mods/plantlife_modpack/cavestuff/mapgen.lua +++ b/mods/plantlife_modpack/cavestuff/mapgen.lua @@ -1,39 +1,65 @@ --Map Generation Stuff -biome_lib.register_on_generate( - { - surface = { - "default:dirt_with_grass", - "default:gravel", - "default:stone", - "default:permafrost_with_stones" - }, - max_count = 50, - rarity = 0, - plantlife_limit = -1, - check_air = true, - random_facedir = {0, 3} - }, - { +minetest.register_decoration({ + decoration = { "cavestuff:pebble_1", "cavestuff:pebble_2" - } -) - -biome_lib.register_on_generate( - { - surface = { - "default:desert_sand", - "default:desert_stone" - }, - max_count = 50, - rarity = 0, - plantlife_limit = -1, - check_air = true, - random_facedir = {0, 3} }, - { + place_on = { + "default:dirt_with_grass", + "default:gravel", + "default:stone", + "default:permafrost_with_stones" + }, + noise_params = { + offset = 0, + scale = 0.0078125, + spread = { + y = 100, + z = 100, + x = 100 + }, + seed = 0, + octaves = 3, + persist = 0.6, + flags = "absvalue", + lacunarity = 2 + }, + param2 = 0, + flags = "all_floors", + deco_type = "simple", + param2_max = 3, + y_min = -16, + y_max = 48 +}) + +minetest.register_decoration({ + decoration = { "cavestuff:desert_pebble_1", "cavestuff:desert_pebble_2" - } -) + }, + place_on = { + "default:desert_sand", + "default:desert_stone" + }, + noise_params = { + offset = 0, + scale = 0.0078125, + spread = { + y = 100, + z = 100, + x = 100 + }, + seed = 0, + octaves = 3, + persist = 0.6, + flags = "absvalue", + lacunarity = 2 + }, + param2 = 0, + flags = "all_floors", + deco_type = "simple", + param2_max = 3, + y_min = -16, + y_max = 48 +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/cavestuff/mod.conf b/mods/plantlife_modpack/cavestuff/mod.conf index 55cdcaba..b021c9e0 100644 --- a/mods/plantlife_modpack/cavestuff/mod.conf +++ b/mods/plantlife_modpack/cavestuff/mod.conf @@ -1,2 +1,2 @@ name = cavestuff -depends = default,biome_lib +depends = default diff --git a/mods/plantlife_modpack/cavestuff/nodes.lua b/mods/plantlife_modpack/cavestuff/nodes.lua index 7dcf6b75..018963c6 100644 --- a/mods/plantlife_modpack/cavestuff/nodes.lua +++ b/mods/plantlife_modpack/cavestuff/nodes.lua @@ -12,33 +12,32 @@ minetest.register_node("cavestuff:pebble_1",{ description = S("Pebble"), drawtype = "mesh", mesh = "cavestuff_pebble.obj", - tiles = {"undergrowth_pebble.png"}, - paramtype = "light", + tiles = {"undergrowth_pebble.png"}, + paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, attached_node=1}, - selection_box = cbox, - collision_box = cbox, - on_place = function(itemstack, placer, pointed_thing) + groups = {cracky=3, stone=1, attached_node=1, dig_immediate=3}, + selection_box = cbox, + collision_box = cbox, + on_place = function(itemstack, placer, pointed_thing) -- place a random pebble node local stack = ItemStack("cavestuff:pebble_"..math.random(1,2)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("cavestuff:pebble_1 "..itemstack:get_count()-(1-ret:get_count())) end, - sounds = default.node_sound_stone_defaults(), + sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cavestuff:pebble_2",{ drawtype = "mesh", mesh = "cavestuff_pebble.obj", - tiles = {"undergrowth_pebble.png"}, + tiles = {"undergrowth_pebble.png"}, drop = "cavestuff:pebble_1", - tiles = {"undergrowth_pebble.png"}, - paramtype = "light", + paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1}, + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1, dig_immediate=3}, selection_box = cbox, collision_box = cbox, - sounds = default.node_sound_stone_defaults(), + sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cavestuff:desert_pebble_1",{ @@ -48,7 +47,7 @@ minetest.register_node("cavestuff:desert_pebble_1",{ tiles = {"default_desert_stone.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, attached_node=1}, + groups = {cracky=3, stone=1, attached_node=1, dig_immediate=3}, selection_box = cbox, collision_box = cbox, on_place = function(itemstack, placer, pointed_thing) @@ -67,7 +66,7 @@ minetest.register_node("cavestuff:desert_pebble_2",{ tiles = {"default_desert_stone.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1}, + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1, dig_immediate=3}, selection_box = cbox, collision_box = cbox, sounds = default.node_sound_stone_defaults(), @@ -79,6 +78,7 @@ minetest.register_node("cavestuff:stalactite_1",{ drawtype="nodebox", tiles = {"undergrowth_pebble.png"}, groups = {cracky=3,attached_node=1}, + is_ground_content = false, description = S("Stalactite"), paramtype = "light", paramtype2 = "wallmounted", @@ -100,7 +100,7 @@ minetest.register_node("cavestuff:stalactite_1",{ if not placer then return end local playername = placer:get_player_name() if minetest.is_protected(place, playername) - or minetest.is_protected(above, playername) then + or minetest.is_protected(above, playername) then minetest.record_protection_violation(place, playername) return end @@ -113,7 +113,7 @@ minetest.register_node("cavestuff:stalactite_1",{ name = "cavestuff:stalactite_"..math.random(1,3), param2 = minetest.dir_to_wallmounted(vector.multiply(dir, -1)) }) - if not minetest.setting_getbool("creative_mode") then + if not minetest.is_creative_enabled(playername) then itemstack:take_item() end end @@ -125,6 +125,7 @@ minetest.register_node("cavestuff:stalactite_2",{ drawtype="nodebox", tiles = {"undergrowth_pebble.png"}, groups = {cracky=3,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, drop = "cavestuff:stalactite_1", paramtype = "light", paramtype2 = "wallmounted", @@ -143,6 +144,7 @@ minetest.register_node("cavestuff:stalactite_3",{ drawtype="nodebox", tiles = {"undergrowth_pebble.png"}, groups = {cracky=3,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, drop = "cavestuff:stalactite_1", paramtype = "light", paramtype2 = "wallmounted", @@ -156,5 +158,3 @@ minetest.register_node("cavestuff:stalactite_3",{ } }, }) - ---Stalagmites diff --git a/mods/plantlife_modpack/dryplants/crafting.lua b/mods/plantlife_modpack/dryplants/crafting.lua index 349661c0..97be53e1 100644 --- a/mods/plantlife_modpack/dryplants/crafting.lua +++ b/mods/plantlife_modpack/dryplants/crafting.lua @@ -53,7 +53,7 @@ minetest.register_craft({ {"default:stick",""} } }) -if minetest.get_modpath("flint") ~= nil then +if minetest.get_modpath("flint") then minetest.register_craft({ output = "dryplants:sickle", recipe = { @@ -63,7 +63,7 @@ if minetest.get_modpath("flint") ~= nil then } }) end -if minetest.get_modpath("stoneage") ~= nil then +if minetest.get_modpath("stoneage") then minetest.register_craft({ output = "dryplants:sickle", recipe = { diff --git a/mods/plantlife_modpack/dryplants/init.lua b/mods/plantlife_modpack/dryplants/init.lua index c145ae07..46b3607e 100644 --- a/mods/plantlife_modpack/dryplants/init.lua +++ b/mods/plantlife_modpack/dryplants/init.lua @@ -1,33 +1,15 @@ ------------------------------------------------------------------------------------------------ -local title = "Grasses" -- former "Dry plants" -local version = "0.1.5" -local mname = "dryplants" ------------------------------------------------------------------------------------------------ --- by Mossmanikin --- textures & ideas partly by Neuromancer - --- Contains code from: default, farming --- Looked at code from: darkage, sickle, stairs --- Dependencies: default, farming, biome_lib --- Supports: ------------------------------------------------------------------------------------------------ -abstract_dryplants = {} - -- support for i18n local S = minetest.get_translator("dryplants") +abstract_dryplants = {} + dofile(minetest.get_modpath("dryplants").."/crafting.lua") -dofile(minetest.get_modpath("dryplants").."/settings.txt") dofile(minetest.get_modpath("dryplants").."/reed.lua") -if REEDMACE_GENERATES == true then + dofile(minetest.get_modpath("dryplants").."/reedmace.lua") -end -if SMALL_JUNCUS_GENERATES == true then dofile(minetest.get_modpath("dryplants").."/juncus.lua") -end -if EXTRA_TALL_GRASS_GENERATES == true then dofile(minetest.get_modpath("dryplants").."/moregrass.lua") -end + --dofile(minetest.get_modpath("dryplants").."/meadowvariation.lua") ----------------------------------------------------------------------------------------------- @@ -130,12 +112,14 @@ minetest.register_node("dryplants:grass", { paramtype = "light", sunlight_propagates = true, tiles = {"dryplants_grass.png"}, + use_texture_alpha = "clip", drawtype = "nodebox", node_box = { type = "fixed", fixed = {-0.5 , -0.5 , -0.5 , 0.5 , -0.4375, 0.5 }, }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -144,7 +128,7 @@ minetest.register_node("dryplants:grass", { ----------------------------------------------------------------------------------------------- minetest.register_abm({ nodenames = {"dryplants:grass"}, - interval = HAY_DRYING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle + interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle chance = 1, action = function(pos) minetest.swap_node(pos, {name="dryplants:hay"}) @@ -161,12 +145,14 @@ minetest.register_node("dryplants:hay", { paramtype = "light", sunlight_propagates = true, tiles = {"dryplants_hay.png"}, + use_texture_alpha = "clip", drawtype = "nodebox", node_box = { type = "fixed", fixed = {-0.5 , -0.5 , -0.5 , 0.5 , -0.4375, 0.5 }, }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -189,8 +175,8 @@ minetest.register_node("dryplants:grass_short", { ----------------------------------------------------------------------------------------------- minetest.register_abm({ nodenames = {"dryplants:grass_short"}, - interval = GRASS_REGROWING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle - chance = 100/GRASS_REGROWING_CHANCE, + interval = 1200, --1200, -- 20 minutes: a minetest-day/night-cycle + chance = 100/1200, action = function(pos) -- Only become dirt with grass if no cut grass or hay lies on top local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) @@ -199,7 +185,3 @@ minetest.register_abm({ end end, }) - ------------------------------------------------------------------------------------------------ -print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ diff --git a/mods/plantlife_modpack/dryplants/juncus.lua b/mods/plantlife_modpack/dryplants/juncus.lua index 0bfd635b..4a73861c 100644 --- a/mods/plantlife_modpack/dryplants/juncus.lua +++ b/mods/plantlife_modpack/dryplants/juncus.lua @@ -1,21 +1,12 @@ ------------------------------------------------------------------------------------------------ --- Grasses - Juncus 0.0.5 ------------------------------------------------------------------------------------------------ --- by Mossmanikin --- textures & ideas partly by Neuromancer - --- Contains code from: biome_lib --- Looked at code from: default ------------------------------------------------------------------------------------------------ - -- support for i18n local S = minetest.get_translator("dryplants") -abstract_dryplants.grow_juncus = function(pos) +local function grow_juncus(pos) local juncus_type = math.random(2,3) local right_here = {x=pos.x, y=pos.y+1, z=pos.z} - if minetest.get_node(right_here).name == "air" -- instead of check_air = true, - or minetest.get_node(right_here).name == "default:junglegrass" then + + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then if juncus_type == 2 then minetest.swap_node(right_here, {name="dryplants:juncus_02"}) else @@ -46,6 +37,10 @@ minetest.register_node("dryplants:juncus", { fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, }, on_place = function(itemstack, placer, pointed_thing) + if not itemstack or not placer or not pointed_thing then + return + end + local playername = placer:get_player_name() if minetest.is_protected(pointed_thing.above, playername) or minetest.is_protected(pointed_thing.under, playername) then @@ -60,12 +55,13 @@ minetest.register_node("dryplants:juncus", { else minetest.swap_node(right_here, {name="dryplants:juncus"}) end - if not minetest.setting_getbool("creative_mode") then + if not minetest.is_creative_enabled(playername) then itemstack:take_item() end return itemstack end, }) + minetest.register_node("dryplants:juncus_02", { description = S("Juncus"), drawtype = "plantlike", @@ -92,44 +88,69 @@ minetest.register_node("dryplants:juncus_02", { -- GENERATE SMALL JUNCUS ----------------------------------------------------------------------------------------------- -- near water or swamp -biome_lib.register_on_generate({ - surface = { +minetest.register_decoration({ + name = "dryplants:juncus_water", + decoration = {"air"}, + fill_ratio = 0.16, + y_min = 1, + y_max = 40, + place_on = { "default:dirt_with_grass", - --"default:desert_sand", - --"default:sand", "stoneage:grass_with_silex", "sumpf:peat", "sumpf:sumpf" }, - max_count = JUNCUS_NEAR_WATER_PER_MAPBLOCK, - rarity = 101 - JUNCUS_NEAR_WATER_RARITY, - min_elevation = 1, -- above sea level - near_nodes = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_juncus -) --- at dunes/beach -biome_lib.register_on_generate({ - surface = { - --"default:dirt_with_grass", - --"default:desert_sand", - "default:sand", - --"stoneage:grass_with_silex", - --"sumpf:peat", - --"sumpf:sumpf" + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf" }, - max_count = JUNCUS_AT_BEACH_PER_MAPBLOCK, - rarity = 101 - JUNCUS_AT_BEACH_RARITY, - min_elevation = 1, -- above sea level - near_nodes = {"default:dirt_with_grass"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_juncus -) + check_offset = -1, + num_spawn_by = 1 +}) + +-- at dunes/beach +minetest.register_decoration({ + name = "dryplants:juncus_beach", + decoration = {"air"}, + fill_ratio = 0.08, + y_min = 1, + y_max = 40, + place_on = { + "default:sand", + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = {"default:dirt_with_grass"}, + check_offset = -1, + num_spawn_by = 1 +}) + +local did, did2 +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("dryplants:juncus_water") + did2 = minetest.get_decoration_id("dryplants:juncus_beach") + minetest.set_gen_notify("decoration", {did, did2}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_1 = g["decoration#" .. did] or {} + local deco_locations_2 = g["decoration#" .. did2] or {} + + for _, pos in pairs(deco_locations_1) do + locations[#locations+1] = pos + end + for _, pos in pairs(deco_locations_2) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_juncus(pos) + end +end) \ No newline at end of file diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr new file mode 100644 index 00000000..9558c584 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle=Sichel +Cut Grass=Grasschnitt +Hay=Heu +Short Grass=Kurzes Gras +Juncus=Binsen +Wet Reed=Nasses Schilf +Wet Reed Slab=Nasse Schilfplatte +Wet Reed Roof=Nasses Schilfdach +Wet Reed Roof Corner 1=Nasser Schilfdachwinkel 1 +Wet Reed Roof Corner 2=Nasser Schilfdachwinkel 2 +Reed=Schilf +Reed Slab=Schilfstufe +Reed Roof=Schilfdach +Reed Roof Corner 1=Schilfdachwinkel 1 +Reed Roof Corner 2=Schilfdachwinkel +Reedmace=Rohrkolben +Reedmace, height: 1=Rohrkolben, Höhe: 1 +Reedmace, height: 2=Rohrkolben, Höhe: 2 +Reedmace, height: 3=Rohrkolben, Höhe: 3 +Reedmace, height: 3 & Spikes=Rohrkolben, Höhe: 3 & Rispe diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr new file mode 100644 index 00000000..afa0c0be --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle= +Cut Grass=Tranĉita Herbenon +Hay=Fojno +Short Grass=Mallonga Herbo +Juncus=Junko +Wet Reed=Malseka Kano +Wet Reed Slab=Slabo de Malseka Kano +Wet Reed Roof=Tegmento de Malseka Kano +Wet Reed Roof Corner 1=Tegmentangulo 1 de Malseka Kano +Wet Reed Roof Corner 2=Tegmentangulo 2 de Malseka Kano +Reed=Kano +Reed Slab=Slabo de Kano +Reed Roof=Tegmento de Kano +Reed Roof Corner 1=Tegmentangulo 1 de Kano +Reed Roof Corner 2=Tegmentangulo 2 de Kano +Reedmace=Tifeo +Reedmace, height: 1=Tifeo, alteco: 1 +Reedmace, height: 2=Tifeo, alteco: 2 +Reedmace, height: 3=Tifeo, alteco: 3 +Reedmace, height: 3 & Spikes=Tifeo, alteco: 3 & Pikiloj diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr index 4172ea84..b2a102f3 100644 --- a/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr @@ -1,11 +1,4 @@ # textdomain: dryplants - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Sickle=Faucille Cut Grass=Herbe coupée Hay=Foin @@ -14,12 +7,12 @@ Juncus=Joncs Wet Reed=Bloc de roseau humide Wet Reed Slab=Dalle en roseau humide Wet Reed Roof=Toit en roseau humide -Wet Reed Roof Corner=Angle de toit en roseau humide +Wet Reed Roof Corner 1=Angle de toit en roseau humide 1 Wet Reed Roof Corner 2=Angle de toit en roseau humide 2 Reed=Roseau Reed Slab=Dalle en roseau Reed Roof=Toit en roseau -Reed Roof Corner=Angle de toit en roseau +Reed Roof Corner 1=Angle de toit en roseau 1 Reed Roof Corner 2=Angle de toit en roseau 2 Reedmace=Roseau Reedmace, height: 1=Roseau, 1 de hauteur diff --git a/mods/plantlife_modpack/dryplants/locale/template.txt b/mods/plantlife_modpack/dryplants/locale/template.txt index a95fb53e..a14ca622 100644 --- a/mods/plantlife_modpack/dryplants/locale/template.txt +++ b/mods/plantlife_modpack/dryplants/locale/template.txt @@ -1,11 +1,4 @@ # textdomain: dryplants - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Sickle= Cut Grass= Hay= @@ -14,12 +7,12 @@ Juncus= Wet Reed= Wet Reed Slab= Wet Reed Roof= -Wet Reed Roof Corner= +Wet Reed Roof Corner 1= Wet Reed Roof Corner 2= Reed= Reed Slab= Reed Roof= -Reed Roof Corner= +Reed Roof Corner 1= Reed Roof Corner 2= Reedmace= Reedmace, height: 1= diff --git a/mods/plantlife_modpack/dryplants/meadowvariation.lua b/mods/plantlife_modpack/dryplants/meadowvariation.lua index d11d7da9..c9ebf1c6 100644 --- a/mods/plantlife_modpack/dryplants/meadowvariation.lua +++ b/mods/plantlife_modpack/dryplants/meadowvariation.lua @@ -1,25 +1,12 @@ ------------------------------------------------------------------------------------------------ --- Grasses - Meadow Variation 0.0.1 ------------------------------------------------------------------------------------------------ --- by Mossmanikin - --- Contains code from: biome_lib --- Looked at code from: default ------------------------------------------------------------------------------------------------ - -abstract_dryplants.grow_grass_variation = function(pos) - local right_here = {x=pos.x, y=pos.y, z=pos.z} - minetest.swap_node(right_here, {name="dryplants:grass_short"}) -end - -biome_lib.register_on_generate({ - surface = { +-- @reviewer: couldn't even find using biome_lib +minetest.register_decoration({ + decoration = {"dryplants:grass_short"}, + fill_ratio = 0.8, + y_min = 1, + y_max = 40, + place_on = { "default:dirt_with_grass", }, - max_count = 4800, - rarity = 25, - min_elevation = 1, -- above sea level - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_grass_variation -) + deco_type = "simple", + flags = "all_floors" +}) diff --git a/mods/plantlife_modpack/dryplants/mod.conf b/mods/plantlife_modpack/dryplants/mod.conf index 3011ab60..e42d8ab0 100644 --- a/mods/plantlife_modpack/dryplants/mod.conf +++ b/mods/plantlife_modpack/dryplants/mod.conf @@ -1,3 +1,3 @@ name = dryplants -depends = default, biome_lib -optional_depends = farming +depends = default +optional_depends = farming, ebiomes diff --git a/mods/plantlife_modpack/dryplants/moregrass.lua b/mods/plantlife_modpack/dryplants/moregrass.lua index e953c270..5e27a9cf 100644 --- a/mods/plantlife_modpack/dryplants/moregrass.lua +++ b/mods/plantlife_modpack/dryplants/moregrass.lua @@ -1,30 +1,20 @@ ------------------------------------------------------------------------------------------------ --- Grasses - More Tall Grass 0.0.2 ------------------------------------------------------------------------------------------------ --- by Mossmanikin - --- Contains code from: biome_lib --- Looked at code from: default ------------------------------------------------------------------------------------------------ - -biome_lib.register_on_generate( - { - surface = { - "default:dirt_with_grass", - "stoneage:grass_with_silex", - "sumpf:peat", - "sumpf:sumpf" - }, - max_count = TALL_GRASS_PER_MAPBLOCK, - rarity = 101 - TALL_GRASS_RARITY, - min_elevation = 1, -- above sea level - plantlife_limit = -0.9, - check_air = true, - }, - { "default:grass_1", +minetest.register_decoration({ + decoration = { + "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5" - } -) + }, + fill_ratio = 0.8, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors" +}) diff --git a/mods/plantlife_modpack/dryplants/reed.lua b/mods/plantlife_modpack/dryplants/reed.lua index f80ffa58..a15ee0ae 100644 --- a/mods/plantlife_modpack/dryplants/reed.lua +++ b/mods/plantlife_modpack/dryplants/reed.lua @@ -44,6 +44,7 @@ minetest.register_node("dryplants:wetreed_slab", { fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -72,109 +73,107 @@ minetest.register_node("dryplants:wetreed_roof", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) -if AUTO_ROOF_CORNER == true then - - local CoRNeR = { +local CoRNeR = { -- MaTeRiaL - {"wetreed"}, - {"reed"} - } + {"wetreed"}, + {"reed"} +} - for i in pairs(CoRNeR) do +for i in pairs(CoRNeR) do - local MaTeRiaL = CoRNeR[i][1] - local roof = "dryplants:"..MaTeRiaL.."_roof" - local corner = "dryplants:"..MaTeRiaL.."_roof_corner" - local corner_2 = "dryplants:"..MaTeRiaL.."_roof_corner_2" + local MaTeRiaL = CoRNeR[i][1] + local roof = "dryplants:"..MaTeRiaL.."_roof" + local corner = "dryplants:"..MaTeRiaL.."_roof_corner" + local corner_2 = "dryplants:"..MaTeRiaL.."_roof_corner_2" - minetest.register_abm({ - nodenames = {roof}, - interval = 1, - chance = 1, - action = function(pos) + minetest.register_abm({ + nodenames = {roof}, + interval = 1, + chance = 1, + action = function(pos) - local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) - local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) - local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) - local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) - -- corner 1 - if ((node_west.name == roof and node_west.param2 == 0) - or (node_west.name == corner and node_west.param2 == 1)) - and ((node_north.name == roof and node_north.param2 == 3) - or (node_north.name == corner and node_north.param2 == 3)) - then - minetest.swap_node(pos, {name=corner, param2=0}) - end + local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) + local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) + local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) + local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) + -- corner 1 + if ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner, param2=0}) + end - if ((node_north.name == roof and node_north.param2 == 1) - or (node_north.name == corner and node_north.param2 == 2)) - and ((node_east.name == roof and node_east.param2 == 0) - or (node_east.name == corner and node_east.param2 == 0)) - then - minetest.swap_node(pos, {name=corner, param2=1}) - end + if ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner, param2=1}) + end - if ((node_east.name == roof and node_east.param2 == 2) - or (node_east.name == corner and node_east.param2 == 3)) - and ((node_south.name == roof and node_south.param2 == 1) - or (node_south.name == corner and node_south.param2 == 1)) - then - minetest.swap_node(pos, {name=corner, param2=2}) - end + if ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner, param2=2}) + end - if ((node_south.name == roof and node_south.param2 == 3) - or (node_south.name == corner and node_south.param2 == 0)) - and ((node_west.name == roof and node_west.param2 == 2) - or (node_west.name == corner and node_west.param2 == 2)) - then - minetest.swap_node(pos, {name=corner, param2=3}) - end - -- corner 2 - if ((node_west.name == roof and node_west.param2 == 2) - or (node_west.name == corner_2 and node_west.param2 == 1)) - and ((node_north.name == roof and node_north.param2 == 1) - or (node_north.name == corner_2 and node_north.param2 == 3)) - then - minetest.swap_node(pos, {name=corner_2, param2=0}) - end + if ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner, param2=3}) + end + -- corner 2 + if ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner_2 and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner_2 and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner_2, param2=0}) + end - if ((node_north.name == roof and node_north.param2 == 3) - or (node_north.name == corner_2 and node_north.param2 == 2)) - and ((node_east.name == roof and node_east.param2 == 2) - or (node_east.name == corner_2 and node_east.param2 == 0)) - then - minetest.swap_node(pos, {name=corner_2, param2=1}) - end + if ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner_2 and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner_2 and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner_2, param2=1}) + end - if ((node_east.name == roof and node_east.param2 == 0) - or (node_east.name == corner_2 and node_east.param2 == 3)) - and ((node_south.name == roof and node_south.param2 == 3) - or (node_south.name == corner_2 and node_south.param2 == 1)) - then - minetest.swap_node(pos, {name=corner_2, param2=2}) - end + if ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner_2 and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner_2 and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner_2, param2=2}) + end - if ((node_south.name == roof and node_south.param2 == 1) - or (node_south.name == corner_2 and node_south.param2 == 0)) - and ((node_west.name == roof and node_west.param2 == 0) - or (node_west.name == corner_2 and node_west.param2 == 2)) - then - minetest.swap_node(pos, {name=corner_2, param2=3}) - end + if ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner_2 and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner_2 and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner_2, param2=3}) + end - end, - }) - end + end, + }) end ----------------------------------------------------------------------------------------------- --- Wet Reed Roof Corner +-- Wet Reed Roof Corner 1 ----------------------------------------------------------------------------------------------- minetest.register_node("dryplants:wetreed_roof_corner", { - description = S("Wet Reed Roof Corner"), + description = S("Wet Reed Roof Corner 1"), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -197,6 +196,7 @@ minetest.register_node("dryplants:wetreed_roof_corner", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -227,37 +227,35 @@ minetest.register_node("dryplants:wetreed_roof_corner_2", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) ----------------------------------------------------------------------------------------------- -- Wet Reed becomes (dry) Reed over time ----------------------------------------------------------------------------------------------- -if REED_WILL_DRY == true then - - local DRyiNG = { +local DRyiNG = { -- WeT DRy - {"dryplants:wetreed", "dryplants:reed"}, - {"dryplants:wetreed_slab", "dryplants:reed_slab"}, - {"dryplants:wetreed_roof", "dryplants:reed_roof"}, - {"dryplants:wetreed_roof_corner", "dryplants:reed_roof_corner"}, - {"dryplants:wetreed_roof_corner_2", "dryplants:reed_roof_corner_2"} - } - for i in pairs(DRyiNG) do + {"dryplants:wetreed", "dryplants:reed"}, + {"dryplants:wetreed_slab", "dryplants:reed_slab"}, + {"dryplants:wetreed_roof", "dryplants:reed_roof"}, + {"dryplants:wetreed_roof_corner", "dryplants:reed_roof_corner"}, + {"dryplants:wetreed_roof_corner_2", "dryplants:reed_roof_corner_2"} +} +for i in pairs(DRyiNG) do - local WeT = DRyiNG[i][1] - local DRy = DRyiNG[i][2] + local WeT = DRyiNG[i][1] + local DRy = DRyiNG[i][2] - minetest.register_abm({ - nodenames = {WeT}, - interval = REED_DRYING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle - chance = 1, - action = function(pos) - local direction = minetest.get_node(pos).param2 - minetest.swap_node(pos, {name=DRy, param2=direction}) - end, - }) - end + minetest.register_abm({ + nodenames = {WeT}, + interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle + chance = 1, + action = function(pos) + local direction = minetest.get_node(pos).param2 + minetest.swap_node(pos, {name=DRy, param2=direction}) + end, + }) end ----------------------------------------------------------------------------------------------- @@ -269,6 +267,7 @@ minetest.register_node("dryplants:reed", { paramtype2 = "facedir", tiles = {"dryplants_reed.png"}, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -290,6 +289,7 @@ minetest.register_node("dryplants:reed_slab", { fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -318,14 +318,15 @@ minetest.register_node("dryplants:reed_roof", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) ----------------------------------------------------------------------------------------------- --- Reed Roof Corner +-- Reed Roof Corner 1 ----------------------------------------------------------------------------------------------- minetest.register_node("dryplants:reed_roof_corner", { - description = S("Reed Roof Corner"), + description = S("Reed Roof Corner 1"), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -348,6 +349,7 @@ minetest.register_node("dryplants:reed_roof_corner", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) @@ -378,5 +380,6 @@ minetest.register_node("dryplants:reed_roof_corner_2", { } }, groups = {snappy=3, flammable=2}, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), }) diff --git a/mods/plantlife_modpack/dryplants/reedmace.lua b/mods/plantlife_modpack/dryplants/reedmace.lua index 3c97f560..483072eb 100644 --- a/mods/plantlife_modpack/dryplants/reedmace.lua +++ b/mods/plantlife_modpack/dryplants/reedmace.lua @@ -1,13 +1,3 @@ ------------------------------------------------------------------------------------------------ --- Grasses - Reedmace 0.1.1 ------------------------------------------------------------------------------------------------ --- by Mossmanikin --- textures & ideas partly by Neuromancer - --- Contains code from: biome_lib --- Looked at code from: default, trees ------------------------------------------------------------------------------------------------ - -- NOTES (from wikipedia, some of this might get implemented) -- rhizomes are edible -- outer portion of young plants can be peeled and the heart can be eaten raw or boiled and eaten like asparagus @@ -24,14 +14,16 @@ local S = minetest.get_translator("dryplants") -- REEDMACE SHAPES ----------------------------------------------------------------------------------------------- -abstract_dryplants.grow_reedmace = function(pos) +local function grow_reedmace(pos) local size = math.random(1,3) local spikes = math.random(1,3) local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z} local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z} local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z} - if minetest.get_node(pos_01).name == "air" -- bug fix - or minetest.get_node(pos_01).name == "dryplants:reedmace_sapling" then + + local nodename = minetest.get_node(pos_01).name + if nodename == "air" -- bug fix + or nodename == "dryplants:reedmace_sapling" then if minetest.get_node(pos_02).name ~= "air" then minetest.swap_node(pos_01, {name="dryplants:reedmace_top"}) elseif minetest.get_node(pos_03).name ~= "air" then @@ -50,14 +42,16 @@ abstract_dryplants.grow_reedmace = function(pos) end end -abstract_dryplants.grow_reedmace_water = function(pos) +local function grow_reedmace_water(pos) local size = math.random(1,3) local spikes = math.random(1,3) local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z} local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z} local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z} local pos_04 = {x = pos.x, y = pos.y + 4, z = pos.z} + minetest.add_entity(pos_01, "dryplants:reedmace_water_entity") + if minetest.get_node(pos_02).name == "air" then -- bug fix if minetest.get_node(pos_03).name ~= "air" then minetest.swap_node(pos_02, {name="dryplants:reedmace_top"}) @@ -77,6 +71,8 @@ abstract_dryplants.grow_reedmace_water = function(pos) end end +abstract_dryplants.grow_reedmace = grow_reedmace -- compatibility + ----------------------------------------------------------------------------------------------- -- REEDMACE SPIKES ----------------------------------------------------------------------------------------------- @@ -92,6 +88,7 @@ minetest.register_node("dryplants:reedmace_spikes", { flammable=2, not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -114,6 +111,7 @@ minetest.register_node("dryplants:reedmace_top", { flammable=2, not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -137,6 +135,7 @@ minetest.register_node("dryplants:reedmace_height_2", { flammable=2--, --not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -160,6 +159,7 @@ minetest.register_node("dryplants:reedmace_height_3", { flammable=2--, --not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -183,6 +183,7 @@ minetest.register_node("dryplants:reedmace_height_3_spikes", { flammable=2--, --not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -205,6 +206,7 @@ minetest.register_node("dryplants:reedmace", { flammable=2, not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -235,6 +237,7 @@ minetest.register_node("dryplants:reedmace_bottom", { flammable=2, not_in_creative_inventory=1 }, + is_ground_content = false, drop = 'dryplants:reedmace_sapling', sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -276,19 +279,19 @@ minetest.register_node("dryplants:reedmace_sapling", { -- abm minetest.register_abm({ nodenames = "dryplants:reedmace_sapling", - interval = REEDMACE_GROWING_TIME, - chance = 100/REEDMACE_GROWING_CHANCE, + interval = 600, + chance = 100/5, action = function(pos, node, _, _) if string.find(minetest.get_node({x = pos.x + 1, y = pos.y, z = pos.z }).name, "default:water") or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z + 1}).name, "default:water") or string.find(minetest.get_node({x = pos.x - 1, y = pos.y, z = pos.z }).name, "default:water") or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z - 1}).name, "default:water") then if minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name == "air" then - abstract_dryplants.grow_reedmace_water({x = pos.x, y = pos.y - 1, z = pos.z}) + grow_reedmace_water({x = pos.x, y = pos.y - 1, z = pos.z}) end minetest.swap_node({x=pos.x, y=pos.y, z=pos.z}, {name="default:water_source"}) else - abstract_dryplants.grow_reedmace({x = pos.x, y = pos.y - 1, z = pos.z}) + grow_reedmace({x = pos.x, y = pos.y - 1, z = pos.z}) end end }) @@ -318,7 +321,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{ collisionbox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}, on_punch = function(self, puncher) if puncher:is_player() and puncher:get_inventory() then - if not minetest.setting_getbool("creative_mode") then + if not minetest.is_creative_enabled(puncher:get_player_name()) then puncher:get_inventory():add_item("main", "dryplants:reedmace_sapling") end self.object:remove() @@ -326,89 +329,120 @@ minetest.register_entity("dryplants:reedmace_water_entity",{ end, }) ----------------------------------------------------------------------------------------------- --- SPAWN REEDMACE ------------------------------------------------------------------------------------------------ ---[[biome_lib.register_active_spawner({ - spawn_delay = 1200, - spawn_plants = {"dryplants:reedmace_sapling"}, - spawn_chance = 400, - spawn_surfaces = { - "default:dirt_with_grass", - "default:desert_sand", - "default:sand", - "dryplants:grass_short", - "stoneage:grass_with_silex" - }, - seed_diff = 329, - near_nodes = {"default:water_source"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, -})]] ------------------------------------------------------------------------------------------------ -- GENERATE REEDMACE ----------------------------------------------------------------------------------------------- -- near water or swamp -biome_lib.register_on_generate({ - surface = { +minetest.register_decoration({ + name = "dryplants:reedmace_swamp", + decoration = {"air"}, + fill_ratio = "0.05", + y_min = 1, + y_max = 40, + place_on = { "default:dirt_with_grass", "default:desert_sand", "stoneage:grass_with_silex", "sumpf:peat", "sumpf:sumpf" }, - max_count = REEDMACE_NEAR_WATER_PER_MAPBLOCK, - rarity = 101 - REEDMACE_NEAR_WATER_RARITY, - --rarity = 60, - min_elevation = 1, -- above sea level - near_nodes = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_reedmace -) + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf" + }, + check_offset = -1, + num_spawn_by = 1 +}) + -- in water -biome_lib.register_on_generate({ - surface = { +minetest.register_decoration({ + name = "dryplants:reedmace_water", + decoration = {"air"}, + fill_ratio = "0.01", + y_min = 0, + y_max = 0, + place_on = { "default:dirt", "default:dirt_with_grass", - --"default:desert_sand", - --"stoneage:grass_with_silex", "stoneage:sand_with_silex", "sumpf:peat", "sumpf:sumpf" }, - max_count = REEDMACE_IN_WATER_PER_MAPBLOCK, - rarity = 101 - REEDMACE_IN_WATER_RARITY, - --rarity = 35, - min_elevation = 0, -- a bit below sea level - max_elevation = 0, -- "" - near_nodes = {"default:water_source","sumpf:dirtywater_source"}, - near_nodes_size = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_reedmace_water -) + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source" + }, + check_offset = -1, + num_spawn_by = 1 +}) + -- for oases & tropical beaches & tropical swamps -biome_lib.register_on_generate({ - surface = { +minetest.register_decoration({ + name = "dryplants:reedmace_beach", + decoration = {"air"}, + fill_ratio = "0.05", + y_min = 1, + y_max = 40, + place_on = { "default:sand", "sumpf:sumpf" }, - max_count = REEDMACE_FOR_OASES_PER_MAPBLOCK, - rarity = 101 - REEDMACE_FOR_OASES_RARITY, - --rarity = 10, - neighbors = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"}, - ncount = 1, - min_elevation = 1, -- above sea level - near_nodes = {"default:desert_sand","sumpf:sumpf"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - abstract_dryplants.grow_reedmace -) + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf", + "default:desert_sand" + }, + check_offset = -1, + num_spawn_by = 1 +}) + +local did, did2, did3 +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("dryplants:reedmace_swamp") + did2 = minetest.get_decoration_id("dryplants:reedmace_water") + did3 = minetest.get_decoration_id("dryplants:reedmace_beach") + minetest.set_gen_notify("decoration", {did, did2, did3}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_1 = g["decoration#" .. did] or {} + local deco_locations_3 = g["decoration#" .. did3] or {} + + for _, pos in pairs(deco_locations_1) do + locations[#locations+1] = pos + end + for _, pos in pairs(deco_locations_3) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_reedmace(pos) + end +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_2 = g["decoration#" .. did2] or {} + + for _, pos in pairs(deco_locations_2) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_reedmace_water(pos) + end +end) diff --git a/mods/plantlife_modpack/dryplants/settings.txt b/mods/plantlife_modpack/dryplants/settings.txt deleted file mode 100644 index cc12a9cb..00000000 --- a/mods/plantlife_modpack/dryplants/settings.txt +++ /dev/null @@ -1,52 +0,0 @@ --- Here you can enable/disable the different plants -REEDMACE_GENERATES = true -SMALL_JUNCUS_GENERATES = true -EXTRA_TALL_GRASS_GENERATES = true - - - --- Amount of Reedmace near water or swamp -REEDMACE_NEAR_WATER_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number) -REEDMACE_NEAR_WATER_RARITY = 40 -- percent - --- Amount of Reedmace in water -REEDMACE_IN_WATER_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number) -REEDMACE_IN_WATER_RARITY = 65 -- percent - --- Amount of Reedmace for oases, tropical beaches and tropical swamps -REEDMACE_FOR_OASES_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number) -REEDMACE_FOR_OASES_RARITY = 90 -- percent - --- growing of reedmace sapling -REEDMACE_GROWING_TIME = 600 -- seconds -REEDMACE_GROWING_CHANCE = 5 -- percent - - - --- Amount of small Juncus near water or swamp -JUNCUS_NEAR_WATER_PER_MAPBLOCK = 70 -- plants per 80x80x80 nodes (absolute maximum number) -JUNCUS_NEAR_WATER_RARITY = 75 -- percent - --- Amount of small Juncus at dunes/beach -JUNCUS_AT_BEACH_PER_MAPBLOCK = 70 -- plants per 80x80x80 nodes (absolute maximum number) -JUNCUS_AT_BEACH_RARITY = 75 -- percent - - - --- Tall Grass on dirt with grass -TALL_GRASS_PER_MAPBLOCK = 4800 -- plants per 80x80x80 nodes (absolute maximum number) -TALL_GRASS_RARITY = 75 -- percent - - - --- short grass becomes dirt with grass again -GRASS_REGROWING_TIME = 1200 -- seconds -GRASS_REGROWING_CHANCE = 5 -- percent - -HAY_DRYING_TIME = 3600 -- seconds - -REED_WILL_DRY = false -- wet reed nodes will become dry reed nodes -REED_DRYING_TIME = 3600 -- seconds - -AUTO_ROOF_CORNER = true - diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_8.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_8.png deleted file mode 100644 index aac95202..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_8.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_9.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_9.png deleted file mode 100644 index 1ebe95c3..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_9.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_cattailsG_m2.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_cattailsG_m2.png deleted file mode 100644 index 0a2cae11..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_cattailsG_m2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_left.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_left.png deleted file mode 100644 index b771a553..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_right.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_right.png deleted file mode 100644 index a9f4b7e4..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_whole2.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_whole2.png deleted file mode 100644 index 67c3cb8c..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_whole2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_left.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_left.png deleted file mode 100644 index dc8a33ec..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_right.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_right.png deleted file mode 100644 index 23b5cf32..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_whole2.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_whole2.png deleted file mode 100644 index d494ae44..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_whole2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_01.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_01.png deleted file mode 100644 index aaab5fe6..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_01.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_02.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_02.png deleted file mode 100644 index 5c8751ae..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_02.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_03.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_03.png deleted file mode 100644 index 342b8b86..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_03.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_04.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_04.png deleted file mode 100644 index a1d708db..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_04.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_left.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_left.png deleted file mode 100644 index 643bbea6..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_right.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_right.png deleted file mode 100644 index d4150036..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_left.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_left.png deleted file mode 100644 index 1a3bd923..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_right.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_right.png deleted file mode 100644 index b178d4a2..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_left.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_left.png deleted file mode 100644 index 18ae716b..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_right.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_right.png deleted file mode 100644 index e511b247..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace2.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace2.png deleted file mode 100644 index ca505bd7..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace3.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace3.png deleted file mode 100644 index d2ec7296..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace3.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace4.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace4.png deleted file mode 100644 index 9ba759b6..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace4.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedtest.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/reedtest.png deleted file mode 100644 index 33822eff..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/reedtest.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/not_in_use/texturing.png b/mods/plantlife_modpack/dryplants/textures/not_in_use/texturing.png deleted file mode 100644 index 6a18fdab..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/not_in_use/texturing.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old3.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old3.png deleted file mode 100644 index f6f6c5b1..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old3.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old4.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old4.png deleted file mode 100644 index 6e7611c4..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old4.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_left_old.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_left_old.png deleted file mode 100644 index ce49ec24..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_left_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_right_old.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_right_old.png deleted file mode 100644 index e512a77d..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_right_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_left_old.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_left_old.png deleted file mode 100644 index 7644a0d1..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_left_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_right_old.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_right_old.png deleted file mode 100644 index 801cf23b..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_right_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_left_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_left_old2.png deleted file mode 100644 index 7d25e494..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_left_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_old4.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_old4.png deleted file mode 100644 index a02b19bd..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_old4.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_right_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_right_old2.png deleted file mode 100644 index 0b13beb4..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_right_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_left_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_left_old2.png deleted file mode 100644 index 784d45d1..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_left_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_old8.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_old8.png deleted file mode 100644 index 1498b5f4..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_old8.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_right_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_right_old2.png deleted file mode 100644 index db758c47..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_right_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_spikes_old3.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_spikes_old3.png deleted file mode 100644 index 207a7470..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_spikes_old3.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_left_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_left_old2.png deleted file mode 100644 index 6d9afced..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_left_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_old3.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_old3.png deleted file mode 100644 index 6eedad4f..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_old3.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_right_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_right_old2.png deleted file mode 100644 index 333f5877..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_right_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_water_old2.png b/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_water_old2.png deleted file mode 100644 index 6b10bff4..00000000 Binary files a/mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_water_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/crafting.lua b/mods/plantlife_modpack/ferns/crafting.lua index f32aa69a..db419ef5 100644 --- a/mods/plantlife_modpack/ferns/crafting.lua +++ b/mods/plantlife_modpack/ferns/crafting.lua @@ -30,7 +30,7 @@ minetest.register_craft({ ----------------------------------------------------------------------------------------------- -- FIDDLEHEAD ----------------------------------------------------------------------------------------------- -minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead") +minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead") minetest.register_craftitem("ferns:fiddlehead", { description = S("Fiddlehead"), @@ -51,7 +51,7 @@ minetest.register_craftitem("ferns:fiddlehead_roasted", { ----------------------------------------------------------------------------------------------- -- FERN TUBER ----------------------------------------------------------------------------------------------- -minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber") +minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber") minetest.register_craftitem("ferns:ferntuber", { description = S("Fern Tuber"), @@ -64,7 +64,7 @@ minetest.register_craft({ cooktime = 3, }) -minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted") +minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted") minetest.register_craftitem("ferns:ferntuber_roasted", { description = S("Roasted Fern Tuber"), diff --git a/mods/plantlife_modpack/ferns/gianttreefern.lua b/mods/plantlife_modpack/ferns/gianttreefern.lua index b0a4baa8..b5115e8d 100644 --- a/mods/plantlife_modpack/ferns/gianttreefern.lua +++ b/mods/plantlife_modpack/ferns/gianttreefern.lua @@ -13,6 +13,25 @@ assert(abstract_ferns.config.enable_giant_treefern == true) local S = minetest.get_translator("ferns") -- lot of code, lot to load +function abstract_ferns.can_grow_giant_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_giant_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + abstract_ferns.grow_giant_tree_fern = function(pos) local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} local name = minetest.get_node(pos_aux).name @@ -65,8 +84,8 @@ abstract_ferns.grow_giant_tree_fern = function(pos) local brk = false for i = 1, size-3 do pos_aux.y = pos.y + i - local name = minetest.get_node(pos_aux).name - if not (name == "air" or (i == 1 and name == "ferns:sapling_giant_tree_fern")) then + local nodename = minetest.get_node(pos_aux).name + if not (nodename == "air" or (i == 1 and nodename == "ferns:sapling_giant_tree_fern")) then brk = true break end @@ -119,6 +138,7 @@ minetest.register_node("ferns:tree_fern_leaves_giant", { attached_node=1, not_in_creative_inventory=1 }, + is_ground_content = false, drop = { max_items = 2, items = { @@ -160,6 +180,7 @@ minetest.register_node("ferns:tree_fern_leave_big", { attached_node=1, not_in_creative_inventory=1 }, + is_ground_content = false, drop = "", sounds = default.node_sound_leaves_defaults(), after_destruct = function(pos,oldnode) @@ -181,6 +202,7 @@ minetest.register_node("ferns:tree_fern_leave_big_end", { paramtype = "light", paramtype2 = "facedir", tiles = { "ferns_tree_fern_leave_big_end.png" }, + use_texture_alpha = "clip", walkable = false, node_box = { type = "fixed", @@ -197,6 +219,7 @@ minetest.register_node("ferns:tree_fern_leave_big_end", { attached_node=1, not_in_creative_inventory=1 }, + is_ground_content = false, drop = "", sounds = default.node_sound_leaves_defaults(), }) @@ -213,6 +236,7 @@ minetest.register_node("ferns:fern_trunk_big_top", { "ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png", "ferns_fern_trunk_big.png" }, + use_texture_alpha = "clip", node_box = { type = "fixed", -- {left, bottom, front, right, top, back } @@ -234,6 +258,7 @@ minetest.register_node("ferns:fern_trunk_big_top", { not_in_creative_inventory=1, leafdecay=3 -- to support vines }, + is_ground_content = false, drop = "ferns:fern_trunk_big", sounds = default.node_sound_wood_defaults(), }) @@ -250,6 +275,7 @@ minetest.register_node("ferns:fern_trunk_big", { "ferns_fern_trunk_big_top.png", "ferns_fern_trunk_big.png" }, + use_texture_alpha = "clip", node_box = { type = "fixed", fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, @@ -259,6 +285,7 @@ minetest.register_node("ferns:fern_trunk_big", { fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, }, groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), after_destruct = function(pos,oldnode) local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) @@ -293,7 +320,9 @@ minetest.register_abm({ interval = 1000, chance = 4, action = function(pos, node, _, _) - abstract_ferns.grow_giant_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + if abstract_ferns.can_grow_giant_tree_fern(pos) then + abstract_ferns.grow_giant_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end end }) diff --git a/mods/plantlife_modpack/ferns/horsetail.lua b/mods/plantlife_modpack/ferns/horsetail.lua index 3fefb045..21ef862b 100644 --- a/mods/plantlife_modpack/ferns/horsetail.lua +++ b/mods/plantlife_modpack/ferns/horsetail.lua @@ -34,13 +34,13 @@ local function create_nodes() local node_drop = "ferns:horsetail_04" if i == 1 then - node_desc = S("Young Horsetail (Equisetum)") + node_desc = S("Young Horsetail (Equisetum) @1", 1) node_on_use = minetest.item_eat(1) -- young ones edible https://en.wikipedia.org/wiki/Equisetum node_drop = node_name elseif i == 4 then node_desc = S("Horsetail (Equisetum)") else - node_desc = S("Horsetail (Equisetum)").." ".. string.format("%02d", i) + node_desc = S("Horsetail (Equisetum) @1", i) end node_names[i] = node_name @@ -75,13 +75,10 @@ create_nodes() -- Spawning ----------------------------------------------------------------------------------------------- if abstract_ferns.config.enable_horsetails_spawning == true then - biome_lib.register_active_spawner({ - spawn_delay = 1200, - spawn_plants = node_names, - spawn_chance = 400, - spawn_surfaces = { + minetest.register_abm({ + nodenames = { "default:dirt_with_grass", - "default:dirt_with_coniferous_litter", -- minetest >= 0.5 + "default:dirt_with_coniferous_litter", "default:desert_sand", "default:sand", "dryplants:grass_short", @@ -89,13 +86,28 @@ if abstract_ferns.config.enable_horsetails_spawning == true then "default:mossycobble", "default:gravel" }, - seed_diff = 329, - min_elevation = 1, -- above sea level - near_nodes = {"default:water_source","default:river_water_source","default:gravel"}, - near_nodes_size = 2, - near_nodes_vertical = 1, - near_nodes_count = 1, - --random_facedir = { 0, 179 }, + interval = 1200, + chance = 400, + label = "[ferns] spawn horsetails", + min_y = 1, + max_y = 48, + action = function(pos, node) + local p_top = {x = pos.x, y = pos.y + 1, z = pos.z} + local n_top = minetest.get_node_or_nil(p_top) + if not n_top or n_top.name ~= "air" then return end + + local NEAR_DST = 2 + if #minetest.find_nodes_in_area( + {x=pos.x-NEAR_DST, y=pos.y-1, z=pos.z-NEAR_DST}, + {x=pos.x+NEAR_DST, y=pos.y+1, z=pos.z+NEAR_DST}, + {"default:water_source","default:river_water_source","default:gravel"} + ) < 1 then return + end + + local plant_to_spawn = node_names[math.random(1, #node_names)] + + minetest.swap_node(p_top, {name = plant_to_spawn, param2 = 0}) + end }) end diff --git a/mods/plantlife_modpack/ferns/init.lua b/mods/plantlife_modpack/ferns/init.lua index 03ce8a90..14249b34 100644 --- a/mods/plantlife_modpack/ferns/init.lua +++ b/mods/plantlife_modpack/ferns/init.lua @@ -1,16 +1,5 @@ ------------------------------------------------------------------------------------------------ -local title = "Ferns" -- former "Archae Plantae" -local version = "0.2.1" -local mname = "ferns" -- former "archaeplantae" ------------------------------------------------------------------------------------------------ --- (by Mossmanikin) ------------------------------------------------------------------------------------------------ - abstract_ferns = {} --- support for i18n -local S = minetest.get_translator("ferns") - dofile(minetest.get_modpath("ferns").."/settings.lua") if abstract_ferns.config.enable_lady_fern == true then @@ -30,42 +19,3 @@ if abstract_ferns.config.enable_giant_treefern == true then end dofile(minetest.get_modpath("ferns").."/crafting.lua") - - ------------------------------------------------------------------------------ --- TESTS ------------------------------------------------------------------------------ -local run_tests = true -- set to false to skip - -if run_tests then - - -- These are, essentially, unit tests to make sure that all required item - -- strings are registered. The init sequence is not time critical so leaving - -- them here won't affect performance. - - -- Check node names - if abstract_ferns.config.enable_horsetails then - print("[Mod] " ..title.. " Checking horsetail item strings") - assert(minetest.registered_items["ferns:horsetail_01"] ~= nil) - assert(minetest.registered_items["ferns:horsetail_02"] ~= nil) - assert(minetest.registered_items["ferns:horsetail_03"] ~= nil) - assert(minetest.registered_items["ferns:horsetail_04"] ~= nil) - end - if abstract_ferns.config.enable_lady_fern then - print("[Mod] ".. title .." Checking lady fern item strings") - assert(minetest.registered_items["ferns:fern_01"] ~= nil) - assert(minetest.registered_items["ferns:fern_02"] ~= nil) - assert(minetest.registered_items["ferns:fern_03"] ~= nil) - end - if abstract_ferns.config.enable_treefern then - print("[Mod] ".. title .." Checking tree fern item strings") - assert(minetest.registered_items["ferns:tree_fern_leaves"] ~= nil) - assert(minetest.registered_items["ferns:tree_fern_leaves_02"] ~= nil) - assert(minetest.registered_items["ferns:fern_trunk"] ~= nil) - assert(minetest.registered_items["ferns:sapling_tree_fern"] ~= nil) - end -end - ------------------------------------------------------------------------------------------------ -print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ diff --git a/mods/plantlife_modpack/ferns/locale/ferns.de.tr b/mods/plantlife_modpack/ferns/locale/ferns.de.tr new file mode 100644 index 00000000..ed949453 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.de.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Geigenkopf +Roasted Fiddlehead=Gerösteter Geigenkopf +Fern Tuber=Farnknolle +Roasted Fern Tuber=Geröstete Farnknolle +Lady-fern (Athyrium)=Frauenfarn (Athyrium) +Giant Tree Fern Leaves=Riesige Baumfarnblätter +Giant Tree Fern Leave End=Riesiges Baumfarnblattende +Giant Fern Trunk=Riesiger Baumfarnstamm +Giant Tree Fern Sapling=Riesiger Baumfarnsetzling +Tree Fern Crown (Dicksonia)=Baumfarnkrone (Dicksonia) +Young Horsetail (Equisetum) @1=Junger Schachtelhalm (Equisetum) @1 +Horsetail (Equisetum)=Schachtelhalm (Equisetum) +Horsetail (Equisetum) @1= Schachtelhalm (Equisetum) @1 +Fern Trunk (Dicksonia)=Farnstamm (Dicksonia) +Tree Fern Sapling (Dicksonia)=Baumfarnsetzling (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.eo.tr b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr new file mode 100644 index 00000000..11d0893f --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Filika Supro +Roasted Fiddlehead=Rostita Filika Supro +Fern Tuber=Filika Tubero +Roasted Fern Tuber=Rostita Filika Tubero +Lady-fern (Athyrium)=Afiriumo (Athyrium) +Giant Tree Fern Leaves=Folioj de Giganta Arba Filiko +Giant Tree Fern Leave End=Folifino de Giganta Arba Filiko +Giant Fern Trunk=Trunko de Giganta Arba Filiko +Giant Tree Fern Sapling=Arbido de Giganta Arba Filiko +Tree Fern Crown (Dicksonia)=Krono de Arba Filiko +Young Horsetail (Equisetum) @1=Juna Ekvizeto (Equisetum) @1 +Horsetail (Equisetum)=Ekvizeto (Equisetum) +Horsetail (Equisetum) @1=Ekvizeto (Equisetum) @1 +Fern Trunk (Dicksonia)=Trunko de Arba Filiko (Dicksonia) +Tree Fern Sapling (Dicksonia)=Arbido de Arba Filiko (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.fr.tr b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr index 9eb8d74c..f7364f5c 100644 --- a/mods/plantlife_modpack/ferns/locale/ferns.fr.tr +++ b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr @@ -1,22 +1,16 @@ # textdomain: ferns - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Fiddlehead=Crosse de fougère Roasted Fiddlehead=Crosse de fougère rôtie Fern Tuber=Tubercule de fougère Roasted Fern Tuber=Tubercule de fougère rôti Lady-fern (Athyrium)=Fougère (Athyrium) -Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia) Giant Tree Fern Leaves=Feuilles de fougère géante Giant Tree Fern Leave End=Feuilles de fougère géante (extrémité) Giant Fern Trunk=Tronc de fougère géante Giant Tree Fern Sapling=Pousse de fougère géante -Young Horsetail (Equisetum)=Pousse de prêle (Equisetum) +Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia) +Young Horsetail (Equisetum) @1=Pousse de prêle (Equisetum) @1 Horsetail (Equisetum)=Prêle (Equisetum) +Horsetail (Equisetum) @1=Prêle (Equisetum) @1 Fern Trunk (Dicksonia)=Tronc de fougère en couronne (Dicksonia) Tree Fern Sapling (Dicksonia)=Pousse de fougère en couronne (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/template.txt b/mods/plantlife_modpack/ferns/locale/template.txt index a824e9c2..80002575 100644 --- a/mods/plantlife_modpack/ferns/locale/template.txt +++ b/mods/plantlife_modpack/ferns/locale/template.txt @@ -1,23 +1,16 @@ # textdomain: ferns - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - - Fiddlehead= Roasted Fiddlehead= Fern Tuber= Roasted Fern Tuber= Lady-fern (Athyrium)= -Tree Fern Crown (Dicksonia)= Giant Tree Fern Leaves= Giant Tree Fern Leave End= Giant Fern Trunk= Giant Tree Fern Sapling= -Young Horsetail (Equisetum)= +Tree Fern Crown (Dicksonia)= +Young Horsetail (Equisetum) @1= Horsetail (Equisetum)= +Horsetail (Equisetum) @1= Fern Trunk (Dicksonia)= Tree Fern Sapling (Dicksonia)= diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png index 2e3adb72..bc9cd457 100644 Binary files a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png index a8e1bf6f..5465ef82 100644 Binary files a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/archaeplantae_horsetails.png b/mods/plantlife_modpack/ferns/textures/not_in_use/archaeplantae_horsetails.png deleted file mode 100644 index 6ba89c15..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/archaeplantae_horsetails.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/big picture 3.png b/mods/plantlife_modpack/ferns/textures/not_in_use/big picture 3.png deleted file mode 100644 index de344e63..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/big picture 3.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_left.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_left.png deleted file mode 100644 index 0fdf5159..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_right.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_right.png deleted file mode 100644 index d30def0b..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_left.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_left.png deleted file mode 100644 index d146df31..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_left.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_right.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_right.png deleted file mode 100644 index e10460a3..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_right.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_bl.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_bl.png deleted file mode 100644 index e2fdb67f..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_bl.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_br.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_br.png deleted file mode 100644 index eb547e82..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_br.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_trunk_big_crown.png b/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_trunk_big_crown.png deleted file mode 100644 index 7a126712..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_trunk_big_crown.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/archaeplantae_fern_old4.png b/mods/plantlife_modpack/ferns/textures/old/archaeplantae_fern_old4.png deleted file mode 100644 index a3d403c1..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/archaeplantae_fern_old4.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/comb.png b/mods/plantlife_modpack/ferns/textures/old/comb.png deleted file mode 100644 index ea1e19f5..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/comb.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_5_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_5_old.png deleted file mode 100644 index 56762781..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_5_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_6_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_6_old.png deleted file mode 100644 index 36d60403..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_6_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_7_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_7_old.png deleted file mode 100644 index 8aabe61d..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_7_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_big_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_big_old.png deleted file mode 100644 index d17ed117..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_big_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_mid_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_mid_old.png deleted file mode 100644 index 08513c2e..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_mid_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_tree_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_tree_old.png deleted file mode 100644 index 45996728..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_tree_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_old2.png deleted file mode 100644 index a048ee0c..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old.png deleted file mode 100644 index d83151f3..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old2.png deleted file mode 100644 index 244ddfe6..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_top_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_top_old.png deleted file mode 100644 index 872fdabb..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_top_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_01_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_01_old2.png deleted file mode 100644 index 7d557185..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_01_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_02_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_02_old2.png deleted file mode 100644 index d0b55630..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_02_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_03_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_03_old2.png deleted file mode 100644 index 42cf76e0..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_03_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_04_old2.png b/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_04_old2.png deleted file mode 100644 index 600ebe76..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_04_old2.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_cross_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_cross_old.png deleted file mode 100644 index 00ec9d89..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_cross_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_end_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_end_old.png deleted file mode 100644 index ce1a87d8..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_end_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_old.png b/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_old.png deleted file mode 100644 index b568383e..00000000 Binary files a/mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/ferns/treefern.lua b/mods/plantlife_modpack/ferns/treefern.lua index 96947a99..7869dff5 100644 --- a/mods/plantlife_modpack/ferns/treefern.lua +++ b/mods/plantlife_modpack/ferns/treefern.lua @@ -11,6 +11,25 @@ local S = minetest.get_translator("ferns") assert(abstract_ferns.config.enable_treefern == true) +function abstract_ferns.can_grow_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + abstract_ferns.grow_tree_fern = function(pos) local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} @@ -61,6 +80,7 @@ minetest.register_node("ferns:tree_fern_leaves", { inventory_image = "ferns_fern_tree_inv.png", walkable = false, groups = {snappy=3,flammable=2,attached_node=1}, + is_ground_content = false, drop = { max_items = 2, items = { @@ -92,6 +112,7 @@ minetest.register_node("ferns:tree_fern_leaves_02", { tiles = {"ferns_fern_big.png"}, walkable = false, groups = {snappy=3,flammable=2,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, drop = { max_items = 2, items = { @@ -128,6 +149,7 @@ minetest.register_node("ferns:fern_trunk", { "ferns_fern_trunk_top.png", "ferns_fern_trunk.png" }, + use_texture_alpha = "clip", node_box = { type = "fixed", fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, @@ -137,6 +159,7 @@ minetest.register_node("ferns:fern_trunk", { fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, }, groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), after_destruct = function(pos,oldnode) local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) @@ -171,7 +194,9 @@ minetest.register_abm({ interval = 1000, chance = 4, action = function(pos, node, _, _) - abstract_ferns.grow_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + if abstract_ferns.can_grow_tree_fern(pos) then + abstract_ferns.grow_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end end }) diff --git a/mods/plantlife_modpack/junglegrass/init.lua b/mods/plantlife_modpack/junglegrass/init.lua deleted file mode 100644 index a394d93d..00000000 --- a/mods/plantlife_modpack/junglegrass/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -minetest.register_alias("junglegrass:shortest", "air") -minetest.register_alias("junglegrass:short", "air") -minetest.register_alias("junglegrass:medium", "air") diff --git a/mods/plantlife_modpack/junglegrass/mod.conf b/mods/plantlife_modpack/junglegrass/mod.conf deleted file mode 100644 index bb0f56b0..00000000 --- a/mods/plantlife_modpack/junglegrass/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = junglegrass diff --git a/mods/plantlife_modpack/modpack.conf b/mods/plantlife_modpack/modpack.conf index c06e07df..7469b3de 100644 --- a/mods/plantlife_modpack/modpack.conf +++ b/mods/plantlife_modpack/modpack.conf @@ -1 +1 @@ -min_minetest_version = 5.2.0 +min_minetest_version = 5.3.0 diff --git a/mods/plantlife_modpack/modpack.txt b/mods/plantlife_modpack/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/plantlife_modpack/molehills/init.lua b/mods/plantlife_modpack/molehills/init.lua index 872e987f..2c35376d 100644 --- a/mods/plantlife_modpack/molehills/init.lua +++ b/mods/plantlife_modpack/molehills/init.lua @@ -1,20 +1,12 @@ ------------------------------------------------------------------------------------------------ -- Idea by Sokomine -- Code & textures by Mossmanikin -abstract_molehills = {} - -local molehills_rarity = tonumber(minetest.settings:get("molehills_rarity")) or 99.5 -local molehills_rarity_fertility = tonumber(minetest.settings:get("molehills_rarity_fertility")) or 1 -local molehills_fertility = tonumber(minetest.settings:get("molehills_fertility")) or -0.6 - - -- support for i18n local S = minetest.get_translator("molehills") ------------------------------------------------------------------------------------------------ --- NoDe ------------------------------------------------------------------------------------------------ +local molehill_rarity = minetest.settings:get("molehills.molehill_rarity") or 0.002 + +-- Node local mh_cbox = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, -0.125, 0.5} @@ -26,6 +18,7 @@ minetest.register_node("molehills:molehill",{ description = S("Mole Hill"), inventory_image = "molehills_side.png", tiles = { "molehills_dirt.png" }, + use_texture_alpha = "clip", paramtype = "light", selection_box = mh_cbox, collision_box = mh_cbox, @@ -33,9 +26,7 @@ minetest.register_node("molehills:molehill",{ sounds = default.node_sound_dirt_defaults(), }) ------------------------------------------------------------------------------------------------ --- CRaFTiNG ------------------------------------------------------------------------------------------------ +-- Crafting minetest.register_craft({ -- molehills --> dirt output = "default:dirt", recipe = { @@ -44,32 +35,19 @@ minetest.register_craft({ -- molehills --> dirt } }) ------------------------------------------------------------------------------------------------ --- GeNeRaTiNG ------------------------------------------------------------------------------------------------ -abstract_molehills.place_molehill = function(pos) - local right_here = {x=pos.x , y=pos.y+1, z=pos.z } - if minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }).name ~= "air" - and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }).name ~= "air" - and minetest.get_node({x=pos.x , y=pos.y, z=pos.z+1}).name ~= "air" - and minetest.get_node({x=pos.x , y=pos.y, z=pos.z-1}).name ~= "air" - and minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z+1}).name ~= "air" - and minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z-1}).name ~= "air" - and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z+1}).name ~= "air" - and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z-1}).name ~= "air" then - minetest.swap_node(right_here, {name="molehills:molehill"}) - end -end - -biome_lib.register_on_generate({ - surface = {"default:dirt_with_grass"}, - rarity = molehills_rarity, - rarity_fertility = molehills_rarity_fertility, - plantlife_limit = molehills_fertility, - min_elevation = 1, - max_elevation = 40, - avoid_nodes = {"group:tree","group:liquid","group:stone","group:falling_node"--[[,"air"]]}, - avoid_radius = 4, +-- Generating +minetest.register_decoration({ + decoration = { + "molehills:molehill" }, - abstract_molehills.place_molehill -) + fill_ratio = molehill_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass" + }, + spawn_by = "air", + num_spawn_by = 3, + deco_type = "simple", + flags = "all_floors", +}) diff --git a/mods/plantlife_modpack/molehills/locale/molehills.de.tr b/mods/plantlife_modpack/molehills/locale/molehills.de.tr new file mode 100644 index 00000000..07d8f7c1 --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/molehills.de.tr @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill=Maulwurfshügel diff --git a/mods/plantlife_modpack/molehills/locale/molehills.eo.tr b/mods/plantlife_modpack/molehills/locale/molehills.eo.tr new file mode 100644 index 00000000..ca7a1c69 --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/molehills.eo.tr @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill=Talpa Monteto diff --git a/mods/plantlife_modpack/molehills/locale/molehills.fr.tr b/mods/plantlife_modpack/molehills/locale/molehills.fr.tr index f3f9aab9..b0eaf665 100644 --- a/mods/plantlife_modpack/molehills/locale/molehills.fr.tr +++ b/mods/plantlife_modpack/molehills/locale/molehills.fr.tr @@ -1,9 +1,2 @@ # textdomain: molehills - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Mole Hill=Taupinière diff --git a/mods/plantlife_modpack/molehills/locale/template.txt b/mods/plantlife_modpack/molehills/locale/template.txt index 46fc119e..bd7f8361 100644 --- a/mods/plantlife_modpack/molehills/locale/template.txt +++ b/mods/plantlife_modpack/molehills/locale/template.txt @@ -1,9 +1,2 @@ # textdomain: molehills - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Mole Hill= diff --git a/mods/plantlife_modpack/molehills/mod.conf b/mods/plantlife_modpack/molehills/mod.conf index d9296792..ef391f96 100644 --- a/mods/plantlife_modpack/molehills/mod.conf +++ b/mods/plantlife_modpack/molehills/mod.conf @@ -1,2 +1,2 @@ name = molehills -depends = default, biome_lib +depends = default diff --git a/mods/plantlife_modpack/molehills/settingtypes.txt b/mods/plantlife_modpack/molehills/settingtypes.txt index a10276a8..4a950845 100644 --- a/mods/plantlife_modpack/molehills/settingtypes.txt +++ b/mods/plantlife_modpack/molehills/settingtypes.txt @@ -1,8 +1,2 @@ -#Molehills rarity % -molehills_rarity (Molehills rarity %) float 99.5 0 100 - -#How much the rarity is reduced by fertility % -molehills_rarity_fertility (Molehills rarity fertility reduction %) float 1 0 100 - -#Molehills minimum fertility (-1 to +1) -molehills_fertility (Molehills minimum fertility) float -0.6 -1 1 +# Molehill rarity (higher number -> higher probability) +molehills.molehill_rarity (Molehill rarity) float 0.002 0.0001 1 diff --git a/mods/plantlife_modpack/molehills/textures/molehills_dirt.png b/mods/plantlife_modpack/molehills/textures/molehills_dirt.png index 79ffa855..288336e1 100644 Binary files a/mods/plantlife_modpack/molehills/textures/molehills_dirt.png and b/mods/plantlife_modpack/molehills/textures/molehills_dirt.png differ diff --git a/mods/plantlife_modpack/molehills/textures/old & unused/molehill_side.png b/mods/plantlife_modpack/molehills/textures/old & unused/molehill_side.png deleted file mode 100644 index 5f0f9768..00000000 Binary files a/mods/plantlife_modpack/molehills/textures/old & unused/molehill_side.png and /dev/null differ diff --git a/mods/plantlife_modpack/molehills/textures/old & unused/molehill_top.png b/mods/plantlife_modpack/molehills/textures/old & unused/molehill_top.png deleted file mode 100644 index 55cc5413..00000000 Binary files a/mods/plantlife_modpack/molehills/textures/old & unused/molehill_top.png and /dev/null differ diff --git a/mods/plantlife_modpack/nature_classic/blossom.lua b/mods/plantlife_modpack/nature_classic/blossom.lua index 6cbb729c..1a6ca973 100644 --- a/mods/plantlife_modpack/nature_classic/blossom.lua +++ b/mods/plantlife_modpack/nature_classic/blossom.lua @@ -19,6 +19,7 @@ minetest.register_node(":"..nature.blossom_node, { tiles = nature.blossom_textures, paramtype = "light", groups = nature.blossom_groups, + is_ground_content = false, sounds = default.node_sound_leaves_defaults(), waving = 1 }) diff --git a/mods/plantlife_modpack/nature_classic/global_function.lua b/mods/plantlife_modpack/nature_classic/global_function.lua index b83201c1..ebf55298 100644 --- a/mods/plantlife_modpack/nature_classic/global_function.lua +++ b/mods/plantlife_modpack/nature_classic/global_function.lua @@ -2,7 +2,7 @@ local function process_blossom_queue_item() local pos = nature.blossomqueue[1][1] - local node = nature.blossomqueue[1][2] + -- local node = nature.blossomqueue[1][2] local replace = nature.blossomqueue[1][3] if (nature.blossomqueue[1][3] == nature.blossom_node and not nature:is_near_water(pos)) then table.remove(nature.blossomqueue, 1) -- don't grow if it's not near water, pop from queue. @@ -32,7 +32,7 @@ end) function nature.enqueue_node(pos, node, replace) local idx = #nature.blossomqueue if idx < nature.blossomqueue_max then - local enqueue_prob = 0 + local enqueue_prob if idx < nature.blossomqueue_max * 0.8 then enqueue_prob = 1 else diff --git a/mods/plantlife_modpack/nature_classic/init.lua b/mods/plantlife_modpack/nature_classic/init.lua index 48a207e1..0d0de999 100644 --- a/mods/plantlife_modpack/nature_classic/init.lua +++ b/mods/plantlife_modpack/nature_classic/init.lua @@ -6,8 +6,6 @@ local current_mod_name = minetest.get_current_modname() nature = {} --- support for i18n -local S = minetest.get_translator("nature_classic") nature.blossomqueue = {} nature.blossomqueue_max = 1000 @@ -25,7 +23,7 @@ if minetest.get_modpath("moretrees") then nature.blossom_node = "moretrees:apple_blossoms" nature.blossom_leaves = "moretrees:apple_tree_leaves" nature.blossom_textures = { "moretrees_apple_tree_leaves.png^nature_blossom.png" } - nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2, moretrees_leaves = 1 }, + nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2, moretrees_leaves = 1 } minetest.register_alias("nature:blossom", "default:leaves") end @@ -39,12 +37,6 @@ nature.apple_spread = 2 nature.meta_blossom_time = "blossom_time" nature.blossom_duration = nature.blossom_delay -function dumppos(pos) - return "("..pos.x..","..pos.y..","..pos.z..")" -end - dofile(minetest.get_modpath(current_mod_name) .. "/config.lua") dofile(minetest.get_modpath(current_mod_name) .. "/global_function.lua") dofile(minetest.get_modpath(current_mod_name) .. "/blossom.lua") - -minetest.log("info", S("[Nature Classic] loaded!")) diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr b/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr new file mode 100644 index 00000000..1f1f4d0a --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr @@ -0,0 +1,2 @@ +# textdomain: nature_classic +Apple blossoms=Apfelblüten diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr b/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr index ffa9c502..6c60509a 100644 --- a/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr @@ -1,10 +1,2 @@ # textdomain: nature_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Apple blossoms=Fleurs de pommier -[Nature Classic] loaded!=[Nature Classic] chargé.! diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt b/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt new file mode 100644 index 00000000..0331d23e --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt @@ -0,0 +1,10 @@ +# textdomain: nature_classic + +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Jolesh, 2022. +# + +Apple blossoms=Poma Floroj +[Nature Classic] loaded!=[Nature Classic] ŝarĝita! diff --git a/mods/plantlife_modpack/nature_classic/locale/template.txt b/mods/plantlife_modpack/nature_classic/locale/template.txt index c39a57b2..a2c7ee47 100644 --- a/mods/plantlife_modpack/nature_classic/locale/template.txt +++ b/mods/plantlife_modpack/nature_classic/locale/template.txt @@ -1,10 +1,2 @@ # textdomain: nature_classic - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Apple blossoms= -[Nature Classic] loaded!= diff --git a/mods/plantlife_modpack/pl_seaweed/init.lua b/mods/plantlife_modpack/pl_seaweed/init.lua index 7dd03928..b99f19a1 100644 --- a/mods/plantlife_modpack/pl_seaweed/init.lua +++ b/mods/plantlife_modpack/pl_seaweed/init.lua @@ -1,11 +1,11 @@ -- support for i18n local S = minetest.get_translator("pl_seaweed") -pl_seaweed = {} - -local seaweed_max_count = tonumber(minetest.settings:get("pl_seaweed_max_count")) or 320 -local seaweed_rarity = tonumber(minetest.settings:get("pl_seaweed_rarity")) or 33 +local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06 +local function get_ndef(name) + return minetest.registered_nodes[name] or {} +end local algae_list = { {nil}, {2}, {3}, {4} } @@ -25,6 +25,7 @@ for i in ipairs(algae_list) do "flowers_seaweed"..num..".png", "flowers_seaweed"..num..".png^[transformFY" }, + use_texture_alpha = "clip", inventory_image = "flowers_seaweed_2.png", wield_image = "flowers_seaweed_2.png", sunlight_propagates = true, @@ -46,7 +47,11 @@ for i in ipairs(algae_list) do liquids_pointable = true, drop = "flowers:seaweed", on_place = function(itemstack, placer, pointed_thing) - local keys=placer:get_player_control() + if not itemstack or not placer or not pointed_thing then + return + end + + local keys = placer:get_player_control() local pt = pointed_thing local place_pos = nil @@ -54,22 +59,21 @@ for i in ipairs(algae_list) do local under_node = minetest.get_node(pt.under) local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) - - if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then + if get_ndef(under_node.name)["buildable_to"] then if under_node.name ~= "default:water_source" then place_pos = pt.under - elseif top_node.name ~= "default:water_source" - and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then + elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then place_pos = top_pos else return end - elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then + elseif get_ndef(above_node.name)["buildable_to"] then place_pos = pt.above end if not place_pos then return end -- something went wrong :P - if not minetest.is_protected(place_pos, placer:get_player_name()) then + local pname = placer:get_player_name() + if not minetest.is_protected(place_pos, pname) then local nodename = "default:cobble" -- :D @@ -91,78 +95,46 @@ for i in ipairs(algae_list) do minetest.swap_node(place_pos, {name = "flowers:seaweed", param2 = fdir}) end - if not biome_lib.expect_infinite_stacks then + if not minetest.is_creative_enabled(pname) then itemstack:take_item() end return itemstack end end, }) + + minetest.register_decoration({ + name = "flowers:seaweed"..num, + decoration = {"flowers:seaweed"..num}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = {"default:dirt_with_grass", "default:sand"}, + num_spawn_by = 1, + fill_ratio = seaweed_rarity, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:seaweed"..num .."_sand", + decoration = {"flowers:seaweed"..num}, + place_on = {"default:sand"}, + deco_type = "simple", + flags = "all_floors", + spawn_by = "default:water_source", + num_spawn_by = 1, + fill_ratio = seaweed_rarity*1.2, + check_offset = -1, + y_min = 1, + y_max = 1, + }) end -pl_seaweed.grow_seaweed = function(pos) - local right_here = {x=pos.x, y=pos.y+1, z=pos.z} - local seaweed = math.random(1,4) - local node_name = "flowers:seaweed" - if seaweed > 1 then - node_name = node_name .. "_" .. seaweed - end - minetest.swap_node(right_here, {name=node_name, param2=math.random(1,3)}) -end - -biome_lib.register_on_generate({ - surface = {"default:water_source"}, - max_count = seaweed_max_count, - rarity = seaweed_rarity, - min_elevation = 1, - max_elevation = 40, - near_nodes = {"default:dirt_with_grass"}, - near_nodes_size = 4, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - }, - pl_seaweed.grow_seaweed -) - --- pl_seaweed at beaches --- MM: not satisfied with it, but IMHO some beaches should have some algae -biome_lib.register_on_generate({ - surface = {"default:water_source"}, - max_count = seaweed_max_count, - rarity = seaweed_rarity, - min_elevation = 1, - max_elevation = 40, - near_nodes = {"default:sand"}, - near_nodes_size = 1, - near_nodes_vertical = 0, - near_nodes_count = 3, - plantlife_limit = -0.9, - temp_max = -0.64, -- MM: more or less random values, just to make sure it's not everywhere - temp_min = -0.22, -- MM: more or less random values, just to make sure it's not everywhere - }, - pl_seaweed.grow_seaweed -) -biome_lib.register_on_generate({ - surface = {"default:sand"}, - max_count = seaweed_max_count*2, - rarity = seaweed_rarity/2, - min_elevation = 1, - max_elevation = 40, - near_nodes = {"default:water_source"}, - near_nodes_size = 1, - near_nodes_vertical = 0, - near_nodes_count = 3, - plantlife_limit = -0.9, - temp_max = -0.64, -- MM: more or less random values, just to make sure it's not everywhere - temp_min = -0.22, -- MM: more or less random values, just to make sure it's not everywhere - }, - pl_seaweed.grow_seaweed -) - -minetest.register_alias( "flowers:flower_seaweed" , "flowers:seaweed" ) -minetest.register_alias( "along_shore:pondscum_1" , "flowers:seaweed" ) -minetest.register_alias( "along_shore:seaweed_1" , "flowers:seaweed" ) -minetest.register_alias( "along_shore:seaweed_2" , "flowers:seaweed_2" ) -minetest.register_alias( "along_shore:seaweed_3" , "flowers:seaweed_3" ) -minetest.register_alias( "along_shore:seaweed_4" , "flowers:seaweed_4" ) +minetest.register_alias("flowers:flower_seaweed", "flowers:seaweed") +minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_2", "flowers:seaweed_2") +minetest.register_alias("along_shore:seaweed_3", "flowers:seaweed_3") +minetest.register_alias("along_shore:seaweed_4", "flowers:seaweed_4") diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr index 89ed60d1..989d7c06 100644 --- a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr @@ -1,11 +1,2 @@ # textdomain: pl_seaweed - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Xanthin, 2017. -# - - - -Seaweed=Seetang +Seaweed=Seegras diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr index 5a76eb8f..39dbbcf0 100644 --- a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr @@ -1,10 +1,2 @@ # textdomain: pl_seaweed - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - - Seaweed=Algues diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr index c1aa4bdf..0e11bb13 100644 --- a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr @@ -1,10 +1,2 @@ # textdomain: pl_seaweed - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mahmutelmas06@hotmail.com, 2017. -# - - Seaweed=Deniz yosunu diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr new file mode 100644 index 00000000..f76dfe23 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algo diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr index 2927e3c4..bcd13a21 100644 --- a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr @@ -1,10 +1,2 @@ # textdomain: pl_seaweed - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Carlos Barraza , 2017. -# - - Seaweed=Algas marinas diff --git a/mods/plantlife_modpack/pl_seaweed/locale/template.txt b/mods/plantlife_modpack/pl_seaweed/locale/template.txt index 1950d906..e2f00f6e 100644 --- a/mods/plantlife_modpack/pl_seaweed/locale/template.txt +++ b/mods/plantlife_modpack/pl_seaweed/locale/template.txt @@ -1,11 +1,2 @@ # textdomain: pl_seaweed - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - - - Seaweed= diff --git a/mods/plantlife_modpack/pl_seaweed/mod.conf b/mods/plantlife_modpack/pl_seaweed/mod.conf index ed99972e..73a791ca 100644 --- a/mods/plantlife_modpack/pl_seaweed/mod.conf +++ b/mods/plantlife_modpack/pl_seaweed/mod.conf @@ -1,3 +1,2 @@ name = pl_seaweed -depends = biome_lib optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_seaweed/settingtypes.txt b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt index 3cb87726..8c073c5b 100644 --- a/mods/plantlife_modpack/pl_seaweed/settingtypes.txt +++ b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt @@ -1,5 +1,2 @@ -#Seaweed maximum count -pl_seaweed_max_count (Seaweed maximum count) int 320 1 1000 - -#Seaweed rarity -pl_seaweed_rarity (Seaweed rarity) int 33 0 100 +# Seaweed rarity (higher number -> higher probability) +pl_seaweed.seaweed_rarity (Seaweed rarity) float 0.06 0.0001 1 diff --git a/mods/plantlife_modpack/pl_sunflowers/init.lua b/mods/plantlife_modpack/pl_sunflowers/init.lua index f997da09..738cab6f 100644 --- a/mods/plantlife_modpack/pl_sunflowers/init.lua +++ b/mods/plantlife_modpack/pl_sunflowers/init.lua @@ -1,9 +1,7 @@ -- support for i18n local S = minetest.get_translator("pl_sunflowers") -local sunflowers_max_count = tonumber(minetest.settings:get("pl_sunflowers_max_count")) or 10 -local sunflowers_rarity = tonumber(minetest.settings:get("pl_sunflowers_rarity")) or 25 - +local sunflower_rarity = minetest.settings:get("pl_sunflowers.sunflower_rarity") or 0.005 local box = { type="fixed", @@ -19,10 +17,11 @@ minetest.register_node(":flowers:sunflower", { description = S("Sunflower"), drawtype = "mesh", paramtype = "light", - paramtype2 = "facedir", + paramtype2 = "degrotate", inventory_image = "flowers_sunflower_inv.png", mesh = "flowers_sunflower.obj", tiles = { "flowers_sunflower.png" }, + use_texture_alpha = "clip", walkable = false, buildable_to = true, is_ground_content = true, @@ -39,17 +38,20 @@ minetest.register_node(":flowers:sunflower", { } }) -biome_lib.register_on_generate({ - surface = {"default:dirt_with_grass"}, - avoid_nodes = { "flowers:sunflower" }, - max_count = sunflowers_max_count, - rarity = sunflowers_rarity, - min_elevation = 0, - plantlife_limit = -0.9, - temp_max = -0.1, - random_facedir = {0,3}, +minetest.register_decoration({ + decoration = { + "flowers:sunflower" }, - "flowers:sunflower" -) + fill_ratio = sunflower_rarity, + y_min = 1, + y_max = 40, + param2 = 0, + param2_max = 239, + place_on = { + "default:dirt_with_grass" + }, + deco_type = "simple", + flags = "all_floors", +}) minetest.register_alias("sunflower:sunflower", "flowers:sunflower") diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr index ab40a42c..d82b0c7b 100644 --- a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr @@ -1,11 +1,2 @@ # textdomain: pl_sunflowers - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Xanthin, 2017. -# - - - Sunflower=Sonnenblume diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr new file mode 100644 index 00000000..f9203e02 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Sunfloro diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr index b57f3b6c..2d5edc31 100644 --- a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr @@ -1,10 +1,2 @@ # textdomain: pl_sunflowers - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Carlos Barraza , 2017. -# - - Sunflower=Girasol diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr index 1c04e4fc..aea069fc 100644 --- a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr @@ -1,10 +1,2 @@ # textdomain: pl_sunflowers - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - - Sunflower=Tournesol diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr index 5b6409ff..13e5a85b 100644 --- a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr @@ -1,10 +1,2 @@ # textdomain: pl_sunflowers - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mahmutelmas06@hotmail.com, 2017. -# - - Sunflower=Ayçiçeği diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/template.txt b/mods/plantlife_modpack/pl_sunflowers/locale/template.txt index 46c6f0a9..96186a89 100644 --- a/mods/plantlife_modpack/pl_sunflowers/locale/template.txt +++ b/mods/plantlife_modpack/pl_sunflowers/locale/template.txt @@ -1,11 +1,2 @@ # textdomain: pl_sunflowers - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - - - Sunflower= diff --git a/mods/plantlife_modpack/pl_sunflowers/mod.conf b/mods/plantlife_modpack/pl_sunflowers/mod.conf index 13327235..238079e4 100644 --- a/mods/plantlife_modpack/pl_sunflowers/mod.conf +++ b/mods/plantlife_modpack/pl_sunflowers/mod.conf @@ -1,3 +1,2 @@ name = pl_sunflowers -depends = biome_lib optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt b/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt index 67af9e45..0de2098a 100644 --- a/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt +++ b/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt @@ -1,5 +1,2 @@ -#Sunflowers maximum count -pl_sunflowers_max_count (Sunflowers maximum count) int 10 1 1000 - -#Sunflowers rarity -pl_sunflowers_rarity (Sunflowers rarity) int 25 0 100 +# Sunflower rarity (higher number -> higher probability) +pl_sunflowers.sunflower_rarity (Sunflower rarity) float 0.005 0.0001 1 diff --git a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png index fb95cb4b..04553782 100644 Binary files a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png and b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png differ diff --git a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png index c36ed010..3605d773 100644 Binary files a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png and b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/init.lua b/mods/plantlife_modpack/pl_waterlilies/init.lua index 94fc3be4..430dcc57 100644 --- a/mods/plantlife_modpack/pl_waterlilies/init.lua +++ b/mods/plantlife_modpack/pl_waterlilies/init.lua @@ -1,11 +1,11 @@ -- support for i18n local S = minetest.get_translator("pl_waterlilies") -pl_waterlilies = {} - -local lilies_max_count = tonumber(minetest.settings:get("pl_waterlilies_max_count")) or 320 -local lilies_rarity = tonumber(minetest.settings:get("pl_waterlilies_rarity")) or 33 +local fill_ratio = minetest.settings:get("pl_waterlilies.waterlily_rarity") or 0.03 +local function get_ndef(name) + return minetest.registered_nodes[name] or {} +end local lilies_list = { { nil , nil , 1 }, @@ -18,6 +18,15 @@ local lilies_list = { { "s4" , "small_4" , 8 }, } +local lilynames_list = {} +for i in ipairs(lilies_list) do + local deg1 = "" + if lilies_list[i][1] ~= nil then + deg1 = "_"..lilies_list[i][1] + end + table.insert(lilynames_list, "flowers:waterlily"..deg1) +end + for i in ipairs(lilies_list) do local deg1 = "" local deg2 = "" @@ -36,6 +45,7 @@ for i in ipairs(lilies_list) do "flowers_waterlily"..deg2..".png", "flowers_waterlily"..deg2..".png^[transformFY" }, + use_texture_alpha = "clip", inventory_image = "flowers_waterlily.png", wield_image = "flowers_waterlily.png", sunlight_propagates = true, @@ -58,7 +68,11 @@ for i in ipairs(lilies_list) do liquids_pointable = true, drop = "flowers:waterlily", on_place = function(itemstack, placer, pointed_thing) - local keys=placer:get_player_control() + if not itemstack or not placer or not pointed_thing then + return + end + + local keys = placer:get_player_control() local pt = pointed_thing local place_pos = nil @@ -67,25 +81,24 @@ for i in ipairs(lilies_list) do local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) - if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then + if get_ndef(under_node.name)["buildable_to"] then if under_node.name ~= "default:water_source" then place_pos = pt.under - elseif top_node.name ~= "default:water_source" - and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then + elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then place_pos = top_pos else return end - elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then + elseif get_ndef(above_node.name)["buildable_to"] then place_pos = pt.above end - if place_pos and not minetest.is_protected(place_pos, placer:get_player_name()) then + local pname = placer:get_player_name() + if place_pos and not minetest.is_protected(place_pos, pname) then local nodename = "default:cobble" -- if this block appears, something went....wrong :-) if not keys["sneak"] then - local node = minetest.get_node(pt.under) local waterlily = math.random(1,8) if waterlily == 1 then nodename = "flowers:waterlily" @@ -110,55 +123,63 @@ for i in ipairs(lilies_list) do minetest.swap_node(place_pos, {name = "flowers:waterlily", param2 = fdir}) end - if not biome_lib.expect_infinite_stacks then + if not minetest.is_creative_enabled(pname) then itemstack:take_item() end return itemstack end end, }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1, + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = "default:sand", + num_spawn_by = 1, + fill_ratio = fill_ratio, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1 .."_relative", + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = lilynames_list, + num_spawn_by = 1, + fill_ratio = fill_ratio*1.25, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1 .."_relative", + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = lilynames_list, + num_spawn_by = 1, + fill_ratio = fill_ratio*1.5, + check_offset = -1, + y_min = 1, + y_max = 1, + }) end -pl_waterlilies.grow_waterlily = function(pos) - local right_here = {x=pos.x, y=pos.y+1, z=pos.z} - for i in ipairs(lilies_list) do - local chance = math.random(1,8) - local ext = "" - local num = lilies_list[i][3] - - if lilies_list[i][1] ~= nil then - ext = "_"..lilies_list[i][1] - end - - if chance == num then - minetest.swap_node(right_here, {name="flowers:waterlily"..ext, param2=math.random(0,3)}) - end - end -end - -biome_lib.register_on_generate({ - surface = {"default:water_source"}, - max_count = lilies_max_count, - rarity = lilies_rarity, - min_elevation = 1, - max_elevation = 40, - near_nodes = {"default:dirt_with_grass"}, - near_nodes_size = 4, - near_nodes_vertical = 1, - near_nodes_count = 1, - plantlife_limit = -0.9, - temp_max = -0.22, - temp_min = 0.22, - }, - pl_waterlilies.grow_waterlily -) - minetest.register_alias( "flowers:flower_waterlily", "flowers:waterlily") minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225") minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45") minetest.register_alias( "flowers:flower_waterlily_675", "flowers:waterlily_675") -minetest.register_alias( "trunks:lilypad" , "flowers:waterlily_s1" ) -minetest.register_alias( "along_shore:lilypads_1" , "flowers:waterlily_s1" ) -minetest.register_alias( "along_shore:lilypads_2" , "flowers:waterlily_s2" ) -minetest.register_alias( "along_shore:lilypads_3" , "flowers:waterlily_s3" ) -minetest.register_alias( "along_shore:lilypads_4" , "flowers:waterlily_s4" ) +minetest.register_alias( "trunks:lilypad", "flowers:waterlily_s1") +minetest.register_alias( "along_shore:lilypads_1", "flowers:waterlily_s1") +minetest.register_alias( "along_shore:lilypads_2", "flowers:waterlily_s2") +minetest.register_alias( "along_shore:lilypads_3", "flowers:waterlily_s3") +minetest.register_alias( "along_shore:lilypads_4", "flowers:waterlily_s4") diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr index 58de1f51..09558c5b 100644 --- a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr @@ -1,11 +1,2 @@ # textdomain: pl_waterlilies - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Xanthin, 2017. -# - - - Waterlily=Seerose diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr new file mode 100644 index 00000000..c2de4677 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Akvolilio diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr index bf936425..55f8874e 100644 --- a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr @@ -1,10 +1,2 @@ # textdomain: pl_waterlilies - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Carlos Barraza , 2017. -# - - Waterlily=Lirio de agua diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr index c0e0fd1e..0770369d 100644 --- a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr @@ -1,10 +1,2 @@ # textdomain: pl_waterlilies - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - - Waterlily=Nénuphar diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr index ae05de61..b9f30e4b 100644 --- a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr @@ -1,10 +1,2 @@ # textdomain: pl_waterlilies - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mahmutelmas06@hotmail.com, 2017. -# - - Waterlily=Nilüfer diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/template.txt b/mods/plantlife_modpack/pl_waterlilies/locale/template.txt index bdf61b30..f9399c72 100644 --- a/mods/plantlife_modpack/pl_waterlilies/locale/template.txt +++ b/mods/plantlife_modpack/pl_waterlilies/locale/template.txt @@ -1,11 +1,2 @@ -# textdomain: pl_waterlillies - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - - - +# textdomain: pl_waterlilies Waterlily= diff --git a/mods/plantlife_modpack/pl_waterlilies/mod.conf b/mods/plantlife_modpack/pl_waterlilies/mod.conf index 5233adbe..3e96eb34 100644 --- a/mods/plantlife_modpack/pl_waterlilies/mod.conf +++ b/mods/plantlife_modpack/pl_waterlilies/mod.conf @@ -1,3 +1,2 @@ name = pl_waterlilies -depends = biome_lib optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt b/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt index 523a6778..c0e1062b 100644 --- a/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt +++ b/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt @@ -1,5 +1,2 @@ -#Water-lilies maximum count -pl_waterlilies_max_count (Water-lilies maximum count) int 320 1 1000 - -#Water-lilies rarity -pl_waterlilies_rarity (Water-lilies rarity) int 33 0 100 +# Waterlily rarity (higher number -> higher probability) +pl_waterlilies.waterlily_rarity (Waterlily rarity) float 0.03 0.0001 1 diff --git a/mods/plantlife_modpack/poisonivy/init.lua b/mods/plantlife_modpack/poisonivy/init.lua index 0c914fa0..cdc238ef 100644 --- a/mods/plantlife_modpack/poisonivy/init.lua +++ b/mods/plantlife_modpack/poisonivy/init.lua @@ -1,14 +1,8 @@ -- This file supplies poison ivy for the plantlife modpack --- Last revision: 2013-01-24 -- support for i18n local S = minetest.get_translator("poisonivy") -local SPAWN_DELAY = 1000 -local SPAWN_CHANCE = 200 -local GROW_DELAY = 500 -local GROW_CHANCE = 30 -local poisonivy_seed_diff = 339 local walls_list = { "default:dirt", "default:dirt_with_grass", @@ -20,7 +14,7 @@ local walls_list = { "default:jungletree", "default:stone_with_coal", "default:stone_with_iron" -}, +} minetest.register_node('poisonivy:seedling', { description = S("Poison ivy (seedling)"), drawtype = 'plantlike', @@ -31,7 +25,7 @@ minetest.register_node('poisonivy:seedling', { sunlight_propagates = true, paramtype = 'light', walkable = false, - groups = { snappy = 3, poisonivy=1, flora_block=1 }, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, sounds = default.node_sound_leaves_defaults(), buildable_to = true, }) @@ -46,7 +40,7 @@ minetest.register_node('poisonivy:sproutling', { sunlight_propagates = true, paramtype = 'light', walkable = false, - groups = { snappy = 3, poisonivy=1, flora_block=1 }, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, sounds = default.node_sound_leaves_defaults(), buildable_to = true, }) @@ -61,7 +55,7 @@ minetest.register_node('poisonivy:climbing', { paramtype = 'light', paramtype2 = 'wallmounted', walkable = false, - groups = { snappy = 3, poisonivy=1, flora_block=1 }, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "wallmounted", @@ -70,35 +64,75 @@ minetest.register_node('poisonivy:climbing', { buildable_to = true, }) -biome_lib.register_active_spawner({ - spawn_delay = SPAWN_DELAY, - spawn_plants = {"poisonivy:seedling"}, - avoid_radius = 10, - spawn_chance = SPAWN_CHANCE/10, - spawn_surfaces = {"default:dirt_with_grass"}, - avoid_nodes = {"group:poisonivy", "group:flower", "group:flora"}, - seed_diff = poisonivy_seed_diff, - light_min = 7, - alt_wallnode = "poisonivy:climbing", - verticals_list = walls_list +local function find_adjacent_wall(pos, verticals, randomflag) + local verts = dump(verticals) + + if string.find(verts, minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end + if string.find(verts, minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end + if string.find(verts, minetest.get_node({x=pos.x , y=pos.y, z=pos.z-1}).name) then return 5 end + if string.find(verts, minetest.get_node({x=pos.x , y=pos.y, z=pos.z+1}).name) then return 4 end + + return nil +end + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass"}, + interval = 1000, + chance = 20, + label = "[poisoninvy] spawn plants", + min_y = -16, + max_y = 48, + action = function(pos, node) + local p_top = {x = pos.x, y = pos.y + 1, z = pos.z} + local n_top = minetest.get_node_or_nil(p_top) + if not n_top or n_top.name ~= "air" then return end + + local n_light = minetest.get_node_light(p_top) + if n_light < 7 then + return + end + + if minetest.find_node_near(p_top, 10 + math.random(-1.5,2), {"group:poisonivy", "group:flower"}) then + return -- Nodes to avoid are nearby + end + + local walldir = find_adjacent_wall(p_top, walls_list) + if walldir then + minetest.swap_node(p_top, {name = "poisonivy:climbing", param2 = walldir}) + return + end + + minetest.swap_node(p_top, {name = "poisonivy:seedling", param2 = 0}) + end }) -biome_lib.update_plant({ - grow_delay = SPAWN_DELAY, - grow_chance = GROW_CHANCE, - grow_plant = "poisonivy:seedling", - grow_result = "poisonivy:sproutling", - grow_nodes = {"default:dirt_with_grass"} +minetest.register_abm({ + nodenames = {"poisonivy:seedling"}, + interval = 1000, + chance = 30, + label = "grow poisonivy", + action = function(pos, node) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local n_top = minetest.get_node(p_top) + + if n_top.name == "air" then + minetest.swap_node(pos, {name = "poisonivy:sproutling"}) + end + end }) -biome_lib.update_plant({ - grow_delay = GROW_DELAY, - grow_chance = GROW_CHANCE*2, - grow_plant = "poisonivy:climbing", - need_wall = true, - grow_vertically = true, - verticals_list = walls_list, - ground_nodes = {"default:dirt_with_grass"} -}) +minetest.register_abm({ + nodenames = {"poisonivy:climbing"}, + interval = 500, + chance = 60, + label = "grow climbing poisonivy", + action = function(pos, node) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local n_top = minetest.get_node(p_top) -print("[Poison Ivy] Loaded.") + local walldir = find_adjacent_wall(p_top, walls_list) + if n_top.name == "air" and walldir then + minetest.swap_node(p_top, {name = "poisonivy:climbing", param2 = walldir}) + end + end +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr index 85b9f131..5a678a50 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr @@ -1,12 +1,4 @@ # textdomain: poisonivy - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Xanthin, 2017. -# - -Poison ivy (seedling)=Giftefeu (Saemling) -Poison ivy (sproutling)=Giftefeu (Sproessling) +Poison ivy (seedling)=Giftefeu (Sämling) +Poison ivy (sproutling)=Giftefeu (Sprössling) Poison ivy (climbing plant)=Giftefeu (Kletterpflanze) -[Poison Ivy] Loaded.=[Poison Ivy] Geladen. diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr new file mode 100644 index 00000000..8db78771 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Venena hedero (plantido) +Poison ivy (sproutling)=Venena hedero (ĝermanta) +Poison ivy (climbing plant)=Venena hedero (grimpplanto) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr index 19aaa3fd..58f2f21e 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr @@ -1,12 +1,4 @@ # textdomain: poisonivy - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Carlos Barraza , 2017. -# - Poison ivy (seedling)=Hiedra venenosa (retoño) Poison ivy (sproutling)=Hiedra venenosa (brotes) Poison ivy (climbing plant)=Hiedra venenosa (planta trepadora) -[Poison Ivy] Loaded.=[Poison Ivy] Cargado. diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr index 1436b0de..519648ed 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr @@ -1,12 +1,4 @@ # textdomain: poisonivy - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Poison ivy (seedling)=Sumac vénéneux (semis) Poison ivy (sproutling)=Sumac vénéneux (pousse) Poison ivy (climbing plant)=Sumac vénéneux (grimpant) -[Poison Ivy] Loaded.=[Poison Ivy] chargé. diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr index 5b6ab87b..9ef066d7 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr @@ -1,12 +1,4 @@ # textdomain: poisonivy - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Poison ivy (seedling)=Hera venenosa (plantilha) Poison ivy (sproutling)=Hera venenosa (brotando) Poison ivy (climbing plant)=Hera venenosa (planta trepadeira) -[Poison Ivy] Loaded.=[Poison Ivy] Carregado diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr index 185ddc9c..d158d7cc 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr @@ -1,6 +1,4 @@ # textdomain: poisonivy - -Poison ivy (seedling) = Hera venenosa (plantilha) -Poison ivy (sproutling) = Hera venenosa (brotando) -Poison ivy (climbing plant) = Hera venenosa (planta trepadeira) -[Poison Ivy] Loaded. =[Poison Ivy] Carregado +Poison ivy (seedling)= +Poison ivy (sproutling)= +Poison ivy (climbing plant)= diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr index ecbb2794..0e12f016 100644 --- a/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr @@ -1,12 +1,4 @@ # textdomain: poisonivy - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mahmutelmas06@hotmail.com, 2017. -# - Poison ivy (seedling)=Sarmaşık (Fidan) Poison ivy (sproutling)=Sarmaşık (Filiz) Poison ivy (climbing plant)=Sarmaşık (Dolanan) -[Poison Ivy] Loaded.=[Poison Ivy] yüklendi. diff --git a/mods/plantlife_modpack/poisonivy/locale/template.txt b/mods/plantlife_modpack/poisonivy/locale/template.txt new file mode 100644 index 00000000..d158d7cc --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)= +Poison ivy (sproutling)= +Poison ivy (climbing plant)= diff --git a/mods/plantlife_modpack/poisonivy/mod.conf b/mods/plantlife_modpack/poisonivy/mod.conf index 7819d1e8..da42df77 100644 --- a/mods/plantlife_modpack/poisonivy/mod.conf +++ b/mods/plantlife_modpack/poisonivy/mod.conf @@ -1,2 +1,2 @@ name = poisonivy -depends = biome_lib +depends = default diff --git a/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png b/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png index 281fa754..aec29657 100644 Binary files a/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png and b/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png differ diff --git a/mods/plantlife_modpack/trunks/crafting.lua b/mods/plantlife_modpack/trunks/crafting.lua index 72f39ba7..63bf7d40 100644 --- a/mods/plantlife_modpack/trunks/crafting.lua +++ b/mods/plantlife_modpack/trunks/crafting.lua @@ -35,11 +35,11 @@ minetest.register_craft({ }) minetest.register_craft({ output = "trunks:twig_1 4", - recipe = {{"bushes:bushbranches2"}} + recipe = {{"bushes:bushbranches3"}} }) minetest.register_craft({ output = "trunks:twig_1 4", - recipe = {{"bushes:bushbranches3"}} + recipe = {{"bushes:bushbranches4"}} }) end minetest.register_craft({ -- twigs block --> twigs diff --git a/mods/plantlife_modpack/trunks/generating.lua b/mods/plantlife_modpack/trunks/generating.lua index 145a945d..0171ecad 100644 --- a/mods/plantlife_modpack/trunks/generating.lua +++ b/mods/plantlife_modpack/trunks/generating.lua @@ -29,8 +29,6 @@ abstract_trunks.place_twig = function(pos) if twig_size <= 16 then minetest.swap_node(right_here, {name="trunks:twig_"..math.random(1,4), param2=math.random(0,3)}) end --- big twigs - if Big_Twigs == true then -- big twig 1 if twig_size == 17 then if not (check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z+1}) @@ -148,14 +146,12 @@ abstract_trunks.place_twig = function(pos) elseif twig_size <= 25 then minetest.swap_node(right_here, {name="trunks:twig_"..math.random(12,13), param2=math.random(0,3)}) end - end end -if Twigs_on_ground == true then biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, - max_count = Twigs_on_ground_Max_Count, - rarity = Twigs_on_ground_Rarity, + max_count = 640, + rarity = 66, min_elevation = 1, max_elevation = 40, near_nodes = {"group:tree","ferns:fern_03","ferns:fern_02","ferns:fern_01"}, @@ -166,13 +162,11 @@ biome_lib.register_on_generate({ }, abstract_trunks.place_twig ) -end -if Twigs_on_water == true then biome_lib.register_on_generate({ surface = {"default:water_source"}, - max_count = Twigs_on_water_Max_Count, - rarity = Twigs_on_water_Rarity, + max_count = 320, + rarity = 33, min_elevation = 1, max_elevation = 40, near_nodes = {"group:tree"}, @@ -183,7 +177,6 @@ biome_lib.register_on_generate({ }, abstract_trunks.place_twig ) -end ----------------------------------------------------------------------------------------------- -- TRuNKS @@ -211,7 +204,6 @@ local TRuNKS = { {"moretrees", "willow_trunk", 17}, } -if Horizontal_Trunks == true then -- see settings.txt for i in pairs(TRuNKS) do local MoD = TRuNKS[i][1] local TRuNK = TRuNKS[i][2] @@ -225,7 +217,6 @@ for i in pairs(TRuNKS) do minetest.register_node(":"..trunkname, temptrunk) end end -end abstract_trunks.place_trunk = function(pos) @@ -254,7 +245,7 @@ abstract_trunks.place_trunk = function(pos) else minetest.swap_node(right_here, {name="default:tree"}) end - elseif trunk_type == 2 and Horizontal_Trunks == true then + elseif trunk_type == 2 then if minetest.get_modpath(MoD) ~= nil then if check_node_buildable_to(north) then minetest.swap_node(north, {name=MoD..":"..TRuNK, param2=4}) @@ -286,7 +277,7 @@ abstract_trunks.place_trunk = function(pos) minetest.swap_node(south2, {name="default:tree", param2=4}) end end - elseif trunk_type == 3 and Horizontal_Trunks == true then + elseif trunk_type == 3 then if minetest.get_modpath(MoD) ~= nil then if check_node_buildable_to(west) then minetest.swap_node(west, {name=MoD..":"..TRuNK, param2=12}) @@ -324,8 +315,8 @@ end biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, - max_count = Trunks_Max_Count, -- 320, - rarity = Trunks_Rarity, -- 99, + max_count = 320, -- 320, + rarity = 99, -- 99, min_elevation = 1, max_elevation = 40, avoid_nodes = {"group:tree"}, @@ -342,7 +333,6 @@ biome_lib.register_on_generate({ ----------------------------------------------------------------------------------------------- -- MoSS & FuNGuS -- on ground ----------------------------------------------------------------------------------------------- -if Moss_on_ground == true then abstract_trunks.grow_moss_on_ground = function(pos) local on_ground = {x=pos.x, y=pos.y+1, z=pos.z} local moss_type = math.random(1,21) @@ -358,8 +348,8 @@ end biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, - max_count = Moss_on_ground_Max_Count, - rarity = Moss_on_ground_Rarity, + max_count = 400, + rarity = 79, min_elevation = 1, max_elevation = 40, near_nodes = { @@ -375,12 +365,10 @@ biome_lib.register_on_generate({ }, abstract_trunks.grow_moss_on_ground ) -end ----------------------------------------------------------------------------------------------- -- MoSS & FuNGuS -- on trunks ----------------------------------------------------------------------------------------------- -if Moss_on_trunk == true then abstract_trunks.grow_moss_on_trunk = function(pos) local on_ground = {x=pos.x, y=pos.y+1, z=pos.z} local at_side_n = {x=pos.x, y=pos.y, z=pos.z+1} @@ -458,8 +446,8 @@ biome_lib.register_on_generate({ "moretrees:willow_trunk", "default:mossycobble" }, - max_count = Moss_on_trunk_Max_Count, - rarity = Moss_on_trunk_Rarity, + max_count = 640, + rarity = 24, min_elevation = 1, max_elevation = 40, plantlife_limit = -0.9, @@ -467,16 +455,11 @@ biome_lib.register_on_generate({ }, "abstract_trunks.grow_moss_on_trunk" ) -end ----------------------------------------------------------------------------------------------- -- RooTS ----------------------------------------------------------------------------------------------- -if Roots == true then -- see settings.txt - abstract_trunks.grow_roots = function(pos) - local twig_size = math.random(1,27) - local right_here = {x=pos.x , y=pos.y , z=pos.z } local below = {x=pos.x , y=pos.y-1, z=pos.z } local north = {x=pos.x , y=pos.y , z=pos.z+1} @@ -525,5 +508,3 @@ biome_lib.register_on_generate({ }, "abstract_trunks.grow_roots" ) - -end diff --git a/mods/plantlife_modpack/trunks/init.lua b/mods/plantlife_modpack/trunks/init.lua index a82f7e3f..4e081402 100644 --- a/mods/plantlife_modpack/trunks/init.lua +++ b/mods/plantlife_modpack/trunks/init.lua @@ -1,20 +1,9 @@ ------------------------------------------------------------------------------------------------ -local title = "Trunks" -local version = "0.1.4" -local mname = "trunks" ------------------------------------------------------------------------------------------------ -- Code by Mossmanikin & Neuromancer abstract_trunks = {} --- support for i18n -local S = minetest.get_translator("trunks") - -dofile(minetest.get_modpath("trunks").."/trunks_settings.txt") dofile(minetest.get_modpath("trunks").."/generating.lua") dofile(minetest.get_modpath("trunks").."/nodes.lua") dofile(minetest.get_modpath("trunks").."/crafting.lua") ------------------------------------------------------------------------------------------------ -print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ +abstract_trunks.loaded = true diff --git a/mods/plantlife_modpack/trunks/locale/template.txt b/mods/plantlife_modpack/trunks/locale/template.txt index 50cbff1f..36579506 100644 --- a/mods/plantlife_modpack/trunks/locale/template.txt +++ b/mods/plantlife_modpack/trunks/locale/template.txt @@ -1,11 +1,4 @@ # textdomain: trunks - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Twig= Moss= Moss with Fungus= diff --git a/mods/plantlife_modpack/trunks/locale/trunks.de.tr b/mods/plantlife_modpack/trunks/locale/trunks.de.tr new file mode 100644 index 00000000..de83a5ae --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/trunks.de.tr @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig=Zweig +Moss=Moos +Moss with Fungus=Moos mit Pilz +Twigs Block=Zweigblock +Twigs Slab=Zweigplatte +Twigs Roof=Zweigdach +Twigs Roof Corner 1=Zweigdachwinkel 1 +Twigs Roof Corner 2=Zweigdachwinkel 2 +@1 Root=Wurzel von @1 diff --git a/mods/plantlife_modpack/trunks/locale/trunks.eo.tr b/mods/plantlife_modpack/trunks/locale/trunks.eo.tr new file mode 100644 index 00000000..2e9255ce --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/trunks.eo.tr @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig=Branĉeto +Moss=Musko +Moss with Fungus=Musko kun Fungo +Twigs Block=Bloko de Branĉetoj +Twigs Slab=Slabo +Twigs Roof=Tegmento +Twigs Roof Corner 1=Tegmentangulo 1 de Branĉetoj +Twigs Roof Corner 2=Tegmentangulo 2 de Branĉetoj +@1 Root=@1 Radiko diff --git a/mods/plantlife_modpack/trunks/locale/trunks.fr.tr b/mods/plantlife_modpack/trunks/locale/trunks.fr.tr index 4ef33922..097c2bb9 100644 --- a/mods/plantlife_modpack/trunks/locale/trunks.fr.tr +++ b/mods/plantlife_modpack/trunks/locale/trunks.fr.tr @@ -1,11 +1,4 @@ # textdomain: trunks - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Twig=Brindille Moss=Mousse Moss with Fungus=Mousse et champignons diff --git a/mods/plantlife_modpack/trunks/nodes.lua b/mods/plantlife_modpack/trunks/nodes.lua index 10c1c6eb..ba3d3fe3 100644 --- a/mods/plantlife_modpack/trunks/nodes.lua +++ b/mods/plantlife_modpack/trunks/nodes.lua @@ -24,6 +24,7 @@ for i in pairs(NoDe) do "trunks_twig_"..NR..".png^[transformFY", -- mirror "trunks_twig_6.png" -- empty }, + use_texture_alpha = "clip", paramtype = "light", paramtype2 = "facedir", walkable = false, @@ -37,6 +38,7 @@ for i in pairs(NoDe) do attached_node=1, not_in_creative_inventory=iNV }, + is_ground_content = false, drop = "trunks:twig_1", sounds = default.node_sound_leaves_defaults(), liquids_pointable = true, @@ -45,7 +47,7 @@ for i in pairs(NoDe) do if not placer then return end local playername = placer:get_player_name() - if minetest.is_protected(pt.above, playername) then + if minetest.is_protected(pt.above, playername) then minetest.record_protection_violation(pt.above, playername) return end @@ -53,7 +55,7 @@ for i in pairs(NoDe) do local direction = minetest.dir_to_facedir(placer:get_look_dir()) if minetest.get_node(pt.above).name=="air" then minetest.swap_node(pt.above, {name="trunks:twig_"..math.random(1,4), param2=direction}) - if not minetest.setting_getbool("creative_mode") then + if not minetest.is_creative_enabled(playername) then itemstack:take_item() end return itemstack @@ -88,6 +90,7 @@ for r = 0, 3 do description = S("Moss"), drawtype = "nodebox", tiles = {"trunks_moss.png"..xform}, + use_texture_alpha = "clip", inventory_image = "trunks_moss.png", wield_image = "trunks_moss.png", paramtype = "light", @@ -110,6 +113,7 @@ for r = 0, 3 do tiles = {"trunks_moss_fungus.png"..xform}, inventory_image = "trunks_moss_fungus.png", wield_image = "trunks_moss_fungus.png", + use_texture_alpha = "clip", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, @@ -122,7 +126,7 @@ for r = 0, 3 do }) end -minetest.register_alias("trunks:moss_plain", "trunks:moss_plain_0") +minetest.register_alias("trunks:moss_plain", "trunks:moss_plain_0") minetest.register_alias("trunks:moss_with_fungus", "trunks:moss_with_fungus_0") ----------------------------------------------------------------------------------------------- @@ -135,6 +139,7 @@ minetest.register_node("trunks:twigs", { paramtype2 = "facedir", tiles = {"trunks_twigs.png"}, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) @@ -154,6 +159,7 @@ minetest.register_node("trunks:twigs_slab", { fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, }, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) @@ -177,13 +183,14 @@ minetest.register_node("trunks:twigs_roof", { } }, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) ----------------------------------------------------------------------------------------------- -- TWiGS RooF CoRNeR ----------------------------------------------------------------------------------------------- -minetest.register_alias("woodstuff:twigs_roof_corner", "trunks:twigs_roof_corner") +minetest.register_alias("woodstuff:twigs_roof_corner", "trunks:twigs_roof_corner") minetest.register_node("trunks:twigs_roof_corner", { description = S("Twigs Roof Corner 1"), @@ -205,13 +212,14 @@ minetest.register_node("trunks:twigs_roof_corner", { } }, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) ----------------------------------------------------------------------------------------------- -- TWiGS RooF CoRNeR 2 ----------------------------------------------------------------------------------------------- -minetest.register_alias("woodstuff:twigs_roof_corner_2", "trunks:twigs_roof_corner_2") +minetest.register_alias("woodstuff:twigs_roof_corner_2", "trunks:twigs_roof_corner_2") minetest.register_node("trunks:twigs_roof_corner_2", { description = S("Twigs Roof Corner 2"), @@ -233,101 +241,97 @@ minetest.register_node("trunks:twigs_roof_corner_2", { } }, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) -if Auto_Roof_Corner == true then +local roof = "trunks:twigs_roof" +local corner = "trunks:twigs_roof_corner" +local corner_2 = "trunks:twigs_roof_corner_2" - local roof = "trunks:twigs_roof" - local corner = "trunks:twigs_roof_corner" - local corner_2 = "trunks:twigs_roof_corner_2" +minetest.register_abm({ + nodenames = {roof}, + interval = 1, + chance = 1, + action = function(pos) - minetest.register_abm({ - nodenames = {roof}, - interval = 1, - chance = 1, - action = function(pos) + local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) + local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) + local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) + local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) + -- corner 1 + if ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner, param2=0}) + end - local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) - local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) - local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) - local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) - -- corner 1 - if ((node_west.name == roof and node_west.param2 == 0) - or (node_west.name == corner and node_west.param2 == 1)) - and ((node_north.name == roof and node_north.param2 == 3) - or (node_north.name == corner and node_north.param2 == 3)) - then - minetest.swap_node(pos, {name=corner, param2=0}) - end + if ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner, param2=1}) + end - if ((node_north.name == roof and node_north.param2 == 1) - or (node_north.name == corner and node_north.param2 == 2)) - and ((node_east.name == roof and node_east.param2 == 0) - or (node_east.name == corner and node_east.param2 == 0)) - then - minetest.swap_node(pos, {name=corner, param2=1}) - end + if ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner, param2=2}) + end - if ((node_east.name == roof and node_east.param2 == 2) - or (node_east.name == corner and node_east.param2 == 3)) - and ((node_south.name == roof and node_south.param2 == 1) - or (node_south.name == corner and node_south.param2 == 1)) - then - minetest.swap_node(pos, {name=corner, param2=2}) - end + if ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner, param2=3}) + end + -- corner 2 + if ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner_2 and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner_2 and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner_2, param2=0}) + end - if ((node_south.name == roof and node_south.param2 == 3) - or (node_south.name == corner and node_south.param2 == 0)) - and ((node_west.name == roof and node_west.param2 == 2) - or (node_west.name == corner and node_west.param2 == 2)) - then - minetest.swap_node(pos, {name=corner, param2=3}) - end - -- corner 2 - if ((node_west.name == roof and node_west.param2 == 2) - or (node_west.name == corner_2 and node_west.param2 == 1)) - and ((node_north.name == roof and node_north.param2 == 1) - or (node_north.name == corner_2 and node_north.param2 == 3)) - then - minetest.swap_node(pos, {name=corner_2, param2=0}) - end + if ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner_2 and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner_2 and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner_2, param2=1}) + end - if ((node_north.name == roof and node_north.param2 == 3) - or (node_north.name == corner_2 and node_north.param2 == 2)) - and ((node_east.name == roof and node_east.param2 == 2) - or (node_east.name == corner_2 and node_east.param2 == 0)) - then - minetest.swap_node(pos, {name=corner_2, param2=1}) - end + if ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner_2 and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner_2 and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner_2, param2=2}) + end - if ((node_east.name == roof and node_east.param2 == 0) - or (node_east.name == corner_2 and node_east.param2 == 3)) - and ((node_south.name == roof and node_south.param2 == 3) - or (node_south.name == corner_2 and node_south.param2 == 1)) - then - minetest.swap_node(pos, {name=corner_2, param2=2}) - end + if ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner_2 and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner_2 and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner_2, param2=3}) + end - if ((node_south.name == roof and node_south.param2 == 1) - or (node_south.name == corner_2 and node_south.param2 == 0)) - and ((node_west.name == roof and node_west.param2 == 0) - or (node_west.name == corner_2 and node_west.param2 == 2)) - then - minetest.swap_node(pos, {name=corner_2, param2=3}) - end - - end, - }) -end + end, +}) -- MM: The following stuff is just for testing purposes for now; no generating of roots. -- I'm not satisfied with this; they should be either bigger or a different drawtype. ----------------------------------------------------------------------------------------------- -- RooTS ----------------------------------------------------------------------------------------------- -if Roots == true then -- see settings.txt - local roots_cube = {-2/16, -1/2, -3/16, 2/16, 1/16, 1/2} local roots_sheet = {0, -1/2, -1/2, 0, 1/16, 1/2} @@ -376,6 +380,7 @@ for i in pairs(TRuNKS) do --[[back]] MoD.."_"..TRuNK..".png", --[[front]] MoD.."_"..TRuNK..".png" }, + use_texture_alpha = "clip", drawtype = "nodebox", selection_box = {type = "fixed", fixed = roots_cube}, node_box = {type = "fixed", fixed = roots_sheet}, @@ -388,6 +393,7 @@ for i in pairs(TRuNKS) do attached_node = 1 --not_in_creative_inventory=1 -- atm in inv for testing }, + is_ground_content = false, --drop = "trunks:twig_1", -- not sure about this yet sounds = default.node_sound_wood_defaults(), }) @@ -397,7 +403,6 @@ for i in pairs(TRuNKS) do end end end -end minetest.register_alias("trunks:pine_trunkroot", "trunks:pine_treeroot") diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks.png b/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks.png deleted file mode 100644 index e3b77702..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks_2.png b/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks_2.png deleted file mode 100644 index 20535928..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/comboSticks_2.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_root_mask_old.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_root_mask_old.png deleted file mode 100644 index 51071c38..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_root_mask_old.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1e.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1e.png deleted file mode 100644 index 518955cb..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1e.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1n.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1n.png deleted file mode 100644 index 157c9570..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1n.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_2n.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_2n.png deleted file mode 100644 index 9945f226..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_2n.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_3n.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_3n.png deleted file mode 100644 index 6aacf9d9..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_3n.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_4n.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_4n.png deleted file mode 100644 index c5286b6c..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_4n.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_5-8.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_5-8.png deleted file mode 100644 index 9dda4784..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_5-8.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_9-12.png b/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_9-12.png deleted file mode 100644 index 42a5d451..00000000 Binary files a/mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_9-12.png and /dev/null differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twigs.png b/mods/plantlife_modpack/trunks/textures/trunks_twigs.png index 20ae6cac..23ff51ed 100644 Binary files a/mods/plantlife_modpack/trunks/textures/trunks_twigs.png and b/mods/plantlife_modpack/trunks/textures/trunks_twigs.png differ diff --git a/mods/plantlife_modpack/trunks/trunks_settings.txt b/mods/plantlife_modpack/trunks/trunks_settings.txt deleted file mode 100644 index 7fe8822e..00000000 --- a/mods/plantlife_modpack/trunks/trunks_settings.txt +++ /dev/null @@ -1,70 +0,0 @@ --- Settings for generation of stuff (at map-generation time) - - - - - -Horizontal_Trunks = true - - - -Trunks_Max_Count = 320 -- absolute maximum number in an area of 80x80x80 nodes - - -Trunks_Rarity = 99 -- larger values make trunks more rare (100 means chance of 0 %) - - - - - -Big_Twigs = true -- twigs larger than one node -Twigs_on_ground = true - - - -Twigs_on_ground_Max_Count = 640 -- absolute maximum number in an area of 80x80x80 nodes - -Twigs_on_ground_Rarity = 66 -- larger values make twigs more rare (100 means chance of 0 %) - - - - - -Twigs_on_water = true - - - -Twigs_on_water_Max_Count = 320 -- absolute maximum number in an area of 80x80x80 nodes - - -Twigs_on_water_Rarity = 33 -- larger values make twigs more rare (100 means chance of 0 %) - - - - - -Moss_on_ground = true - - - -Moss_on_ground_Max_Count = 400 -- absolute maximum number in an area of 80x80x80 nodes - -Moss_on_ground_Rarity = 79 -- larger values makes moss more rare (100 means chance of 0 %) - - - - - -Moss_on_trunk = true - - - -Moss_on_trunk_Max_Count = 640 -- absolute maximum number in an area of 80x80x80 nodes - -Moss_on_trunk_Rarity = 24 -- larger values makes moss more rare (100 means chance of 0 %) - - -Auto_Roof_Corner = true -- behavior is similar (not the same!) to the one of minecraft stairs - - -Roots = true \ No newline at end of file diff --git a/mods/plantlife_modpack/vines/README.md b/mods/plantlife_modpack/vines/README.md index 31006c77..085b590c 100644 --- a/mods/plantlife_modpack/vines/README.md +++ b/mods/plantlife_modpack/vines/README.md @@ -1,6 +1,6 @@ # Vines Mod by Bas80 (Edited by TenPlus1) -### License: MIT for code, CC for textures +### License: MIT for code, CC0 for textures ## Features - Rope block for spawning rope that slowly drops into the deep. diff --git a/mods/plantlife_modpack/vines/init.lua b/mods/plantlife_modpack/vines/init.lua index 02f4224b..fe4a3512 100644 --- a/mods/plantlife_modpack/vines/init.lua +++ b/mods/plantlife_modpack/vines/init.lua @@ -11,8 +11,8 @@ local enable_side = minetest.settings:get_bool("vines_enable_side", true) local enable_jungle = minetest.settings:get_bool("vines_enable_jungle", true) local enable_willow = minetest.settings:get_bool("vines_enable_willow", true) -local rarity_roots = tonumber(minetest.settings:get("vines_rarity_roots")) or 70 -local default_rarity = 95 +local rarity_roots = tonumber(minetest.settings:get("vines_rarity_roots")) or 0.5 +local default_rarity = 0.2 local rarity_standard = tonumber(minetest.settings:get("vines_rarity_standard")) or default_rarity local rarity_side = tonumber(minetest.settings:get("vines_rarity_side")) or default_rarity local rarity_jungle = tonumber(minetest.settings:get("vines_rarity_jungle")) or default_rarity @@ -24,6 +24,25 @@ local growth_max = tonumber(minetest.settings:get("vines_growth_max")) or 360 -- support for i18n local S = minetest.get_translator("vines") +local dids = {} +local spawn_funcs = {} + +local function find_open_side(pos) -- copied from biome_lib + if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2} + end + if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5} + end + return nil +end + -- ITEMS if enable_vines ~= false then @@ -37,15 +56,28 @@ end -- FUNCTIONS local function on_dig(pos, node, player) + if not player or minetest.is_protected(pos, player:get_player_name()) then + return + end local vine_name_end = node.name:gsub("_middle", "_end") local drop_item = "vines:vines" if enable_vines == false then drop_item = vine_name_end end - local wielded_item = player and player:get_wielded_item() + local wielded_item = minetest.is_player(player) and player:get_wielded_item() if wielded_item then - wielded_item:add_wear(1) + local node_def = minetest.registered_nodes[node.name] + local dig_params = minetest.get_dig_params( + node_def.groups, + wielded_item:get_tool_capabilities(), + wielded_item:get_wear() + ) + if dig_params.wear then + wielded_item:add_wear(dig_params.wear) + player:set_wielded_item(wielded_item) + end + if wielded_item:get_name() == 'vines:shears' then drop_item = vine_name_end end @@ -72,7 +104,7 @@ local function ensure_vine_end(pos, oldnode) end -vines.register_vine = function( name, defs, biome ) +vines.register_vine = function( name, defs, def ) local groups = {vines = 1, snappy = 3, flammable = 2} local vine_name_end = 'vines:' .. name .. '_end' @@ -80,16 +112,37 @@ vines.register_vine = function( name, defs, biome ) local vine_image_end = "vines_" .. name .. "_end.png" local vine_image_middle = "vines_" .. name .. "_middle.png" - local spawn_plants = function(pos, fdir) + local spawn_plants = function(pos) + local param2 = 0 + + if def.spawn_on_bottom then -- spawn under e.g. leaves + local newpos = vector.new(pos.x, pos.y - 1, pos.z) + if minetest.get_node(pos).name ~= "air" and minetest.get_node(newpos).name == "air" then + -- (1) prevent floating vines; (2) is there even space? + pos = newpos + else + return + end + elseif def.spawn_on_side then + local onside = find_open_side(pos) + if onside then + pos = onside.newpos + param2 = onside.facedir + else + return + end + end + local max_length = math.random(defs.average_length) local current_length = 1 + -- print("Generate " .. name .. " at " .. minetest.pos_to_string(pos)) if minetest.get_node({ x=pos.x, y=pos.y - 1, z=pos.z }).name == 'air' then while minetest.get_node({ x=pos.x, y=pos.y - 1, z=pos.z }).name == 'air' and current_length < max_length do - minetest.swap_node(pos, { name = vine_name_middle, param2 = fdir }) + minetest.set_node(pos, { name = vine_name_middle, param2 = param2 }) pos.y = pos.y - 1 current_length = current_length + 1 end - minetest.set_node(pos, { name = vine_name_end, param2 = fdir }) + minetest.set_node(pos, { name = vine_name_end, param2 = param2 }) end end @@ -97,7 +150,7 @@ vines.register_vine = function( name, defs, biome ) local drawtype = 'signlike' -- different properties for bottom and side vines. - if not biome.spawn_on_side then + if not def.spawn_on_side then selection_box = { type = "fixed", fixed = { -0.4, -1/2, -0.4, 0.4, 1/2, 0.4 } @@ -116,7 +169,7 @@ vines.register_vine = function( name, defs, biome ) paramtype = "light", paramtype2 = "wallmounted", buildable_to = false, - tiles = {vine_image_end}, + tiles = {vine_image_end .. (drawtype == "plantlike" and "^[transformR180" or "")}, drawtype = drawtype, inventory_image = vine_image_end, groups = groups, @@ -182,9 +235,44 @@ vines.register_vine = function( name, defs, biome ) end, }) - biome_lib.register_on_generate(biome, spawn_plants) + minetest.register_decoration({ + name = "vines:" .. name, + decoration = {"air"}, + fill_ratio = def.rarity, + y_min = -16, + y_max = 48, + place_on = def.place_on, + deco_type = "simple", + flags = "all_floors, all_ceilings" + }) + dids[#dids + 1] = {name = name, spawn_func = spawn_plants} end +minetest.register_on_mods_loaded(function() + for idx, def in ipairs(dids) do + local did = minetest.get_decoration_id("vines:" .. def.name) + dids[idx] = did + spawn_funcs[did] = def.spawn_func + end + + minetest.set_gen_notify("decoration", dids) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + + for _, did in ipairs(dids) do + local deco_locations = g["decoration#" .. did] + + if deco_locations then + local func = spawn_funcs[did] + for _, pos in pairs(deco_locations) do + func(pos) + end + end + end +end) + -- ALIASES -- used to remove the old vine nodes and give room for the new. @@ -357,19 +445,12 @@ minetest.register_craft({ if enable_roots ~= false then vines.register_vine('root', {description = S("Roots"), average_length = 9}, { - check_air = false, - avoid_nodes = {"vines:root_middle"}, - avoid_radius = 5, - surface = { + place_on = { "default:dirt_with_grass", "default:dirt" }, spawn_on_bottom = true, - plantlife_limit = -0.6, rarity = rarity_roots, - tries = 3, - humidity_min = 0.4, - temp_min = 0.4, }) else minetest.register_alias('vines:root_middle', 'air') @@ -380,22 +461,14 @@ end if enable_standard ~= false then vines.register_vine('vine', {description = S("Vines"), average_length = 5}, { - check_air = false, - avoid_nodes = {"group:vines"}, - avoid_radius = 5, - surface = { - -- "default:leaves", + place_on = { "default:jungleleaves", "moretrees:jungletree_leaves_red", "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_green" }, spawn_on_bottom = true, - plantlife_limit = -0.9, rarity = rarity_standard, - tries = 1, - humidity_min = 0.7, - temp_min = 0.4, }) else minetest.register_alias('vines:vine_middle', 'air') @@ -406,22 +479,14 @@ end if enable_side ~= false then vines.register_vine('side', {description = S("Vines"), average_length = 6}, { - check_air = false, - avoid_nodes = {"group:vines", "default:apple"}, - avoid_radius = 3, - surface = { - -- "default:leaves", + place_on = { "default:jungleleaves", "moretrees:jungletree_leaves_red", "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_green" }, spawn_on_side = true, - plantlife_limit = -0.9, rarity = rarity_side, - tries = 1, - humidity_min = 0.4, - temp_min = 0.4, }) else minetest.register_alias('vines:side_middle', 'air') @@ -432,54 +497,25 @@ end if enable_jungle ~= false then vines.register_vine("jungle", {description = S("Jungle Vines"), average_length = 7}, { - check_air = false, - near_nodes = { - "default:jungleleaves", - "moretrees:jungletree_leaves_red", - "moretrees:jungletree_leaves_yellow", - "moretrees:jungletree_leaves_green" - }, - near_nodes_size = 4, - near_nodes_vertical = 4, - avoid_nodes = { - "vines:jungle_middle", - "vines:jungle_end", - }, - avoid_radius = 5, - surface = { + place_on = { "default:jungletree", "moretrees:jungletree_trunk" }, spawn_on_side = true, - plantlife_limit = -0.9, rarity = rarity_jungle, - tries = 1, - humidity_min = 0.2, - temp_min = 0.3, }) else minetest.register_alias('vines:jungle_middle', 'air') minetest.register_alias('vines:jungle_end', 'air') end --- WILLOW VINES +-- WILLOW VINES (Note from 2024-06: Broken for years now, integration w/ new moretrees spawn mechanic needed) if enable_willow ~= false then - vines.register_vine( 'willow', + vines.register_vine("willow", {description = S("Willow Vines"), average_length = 9}, { - check_air = false, - avoid_nodes = {"vines:willow_middle"}, - avoid_radius = 5, - near_nodes = {'default:water_source'}, - near_nodes_size = 1, - near_nodes_count = 1, - near_nodes_vertical = 7, - plantlife_limit = -0.8, spawn_on_side = true, - surface = {"moretrees:willow_leaves"}, + place_on = {"moretrees:willow_leaves"}, rarity = rarity_willow, - tries = 1, - humidity_min = 0.5, - temp_min = 0.5, }) else minetest.register_alias('vines:willow_middle', 'air') diff --git a/mods/plantlife_modpack/vines/locale/template.txt b/mods/plantlife_modpack/vines/locale/template.txt index c8c1a019..43ba2d97 100644 --- a/mods/plantlife_modpack/vines/locale/template.txt +++ b/mods/plantlife_modpack/vines/locale/template.txt @@ -1,10 +1,4 @@ # textdomain: vines - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# Vines= Matured= Rope= diff --git a/mods/plantlife_modpack/vines/locale/vines.de.tr b/mods/plantlife_modpack/vines/locale/vines.de.tr new file mode 100644 index 00000000..81c6cda4 --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/vines.de.tr @@ -0,0 +1,8 @@ +# textdomain: vines +Vines=Ranken +Matured=Gereifte +Rope=Seil +Shears=Schere +Roots=Wurzeln +Jungle Vines=Dschungelranken +Willow Vines=Weidenranken diff --git a/mods/plantlife_modpack/vines/locale/vines.eo.tr b/mods/plantlife_modpack/vines/locale/vines.eo.tr new file mode 100644 index 00000000..12018c2a --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/vines.eo.tr @@ -0,0 +1,8 @@ +# textdomain: vines +Vines=Vitoj +Matured=Maturita +Rope=Ŝnuro +Shears=Tondiloj +Roots=Radikoj +Jungle Vines=Ĝangalaj Vitoj +Willow Vines=Salikaj Vitoj diff --git a/mods/plantlife_modpack/vines/locale/vines.fr.tr b/mods/plantlife_modpack/vines/locale/vines.fr.tr index 56100710..70c7dc10 100644 --- a/mods/plantlife_modpack/vines/locale/vines.fr.tr +++ b/mods/plantlife_modpack/vines/locale/vines.fr.tr @@ -1,11 +1,4 @@ # textdomain: vines - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Vines=Plantes grimpantes Matured=Extrémité de Rope=Corde diff --git a/mods/display_modpack/display_api/depends.txt b/mods/plantlife_modpack/vines/mapgen.lua similarity index 100% rename from mods/display_modpack/display_api/depends.txt rename to mods/plantlife_modpack/vines/mapgen.lua diff --git a/mods/plantlife_modpack/vines/mod.conf b/mods/plantlife_modpack/vines/mod.conf index 494b2dd7..8f23380c 100644 --- a/mods/plantlife_modpack/vines/mod.conf +++ b/mods/plantlife_modpack/vines/mod.conf @@ -1,4 +1,4 @@ name = vines description = Adds climbable vines that are spawned on trees. -depends = default, biome_lib -optional_depends = moretrees +depends = default +optional_depends = moretrees, ebiomes diff --git a/mods/plantlife_modpack/vines/screenshot.png b/mods/plantlife_modpack/vines/screenshot.png index b386f694..7ce1565d 100644 Binary files a/mods/plantlife_modpack/vines/screenshot.png and b/mods/plantlife_modpack/vines/screenshot.png differ diff --git a/mods/plantlife_modpack/vines/settingtypes.txt b/mods/plantlife_modpack/vines/settingtypes.txt index 6a5d0fb7..6e3b34a2 100644 --- a/mods/plantlife_modpack/vines/settingtypes.txt +++ b/mods/plantlife_modpack/vines/settingtypes.txt @@ -7,32 +7,32 @@ vines_enable_rope (Enable vine ropes) bool true #Enables root vines. vines_enable_roots (Enable root vines) bool true -#Rarity of root vines, from 1 to 100, higher numbers are rarer. -vines_rarity_roots (Rarity of roots vines) float 95 0 100 +#Rarity of root vines, from 1 to 10, lower numbers are rarer. +vines_rarity_roots (Rarity of roots vines) float 0.5 1 0 #Enables the standard type of vines. vines_enable_standard (Enable standard vines) bool true -#Rarity of standard vines, from 1 to 100, higher numbers are rarer. -vines_rarity_standard (Rarity of standard vines) float 95 0 100 +#Rarity of standard vines, from 1 to 10, lower numbers are rarer. +vines_rarity_standard (Rarity of standard vines) float 0.2 1 0 #Enables the type of vines that grow on the sides of leaf blocks. vines_enable_side (Enable side vines) bool true -#Rarity of side vines, from 1 to 100, higher numbers are rarer. -vines_rarity_side (Rarity of side vines) float 95 0 100 +#Rarity of side vines, from 1 to 10, lower numbers are rarer. +vines_rarity_side (Rarity of side vines) float 0.2 1 0 #Enables jungle style vines. vines_enable_jungle (Enable jungle vines) bool true -#Rarity of jungle vines, from 1 to 100, higher numbers are rarer. -vines_rarity_jungle (Rarity of jungle vines) float 95 0 100 +#Rarity of jungle vines, from 1 to 10, lower numbers are rarer. +vines_rarity_jungle (Rarity of jungle vines) float 0.2 1 0 #Enables willow vines. vines_enable_willow (Enable willow vines) bool true -#Rarity of willow vines, from 1 to 100, higher numbers are rarer. -vines_rarity_willow (Rarity of willow vines) float 95 0 100 +#Rarity of willow vines, from 1 to 10, lower numbers are rarer. +vines_rarity_willow (Rarity of willow vines) float 0.2 1 0 #Vine growth speed, minimum number of seconds between each growth. vines_growth_min (Minimum number of seconds between growth) int 180 1 3600 diff --git a/mods/plantlife_modpack/vines/textures/vines_item.png b/mods/plantlife_modpack/vines/textures/vines_item.png index c66242ef..637b09ac 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_item.png and b/mods/plantlife_modpack/vines/textures/vines_item.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_jungle_end.png b/mods/plantlife_modpack/vines/textures/vines_jungle_end.png index 6c8d3395..5ccf34e1 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_jungle_end.png and b/mods/plantlife_modpack/vines/textures/vines_jungle_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png b/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png index bf838a50..64a96f71 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png and b/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_root_end.png b/mods/plantlife_modpack/vines/textures/vines_root_end.png index 4fc3f87a..755d08db 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_root_end.png and b/mods/plantlife_modpack/vines/textures/vines_root_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_root_middle.png b/mods/plantlife_modpack/vines/textures/vines_root_middle.png index 49f88c05..72e126fb 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_root_middle.png and b/mods/plantlife_modpack/vines/textures/vines_root_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_rope.png b/mods/plantlife_modpack/vines/textures/vines_rope.png index 0045c4c3..41cf1a74 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_rope.png and b/mods/plantlife_modpack/vines/textures/vines_rope.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_rope_end.png b/mods/plantlife_modpack/vines/textures/vines_rope_end.png index faf2c715..29a3eb93 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_rope_end.png and b/mods/plantlife_modpack/vines/textures/vines_rope_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_shears.png b/mods/plantlife_modpack/vines/textures/vines_shears.png index c4c39f9f..b464bbb0 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_shears.png and b/mods/plantlife_modpack/vines/textures/vines_shears.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_side_end.png b/mods/plantlife_modpack/vines/textures/vines_side_end.png index 5b3b28f7..e87780a4 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_side_end.png and b/mods/plantlife_modpack/vines/textures/vines_side_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_side_middle.png b/mods/plantlife_modpack/vines/textures/vines_side_middle.png index 2576e935..2d2c5cd0 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_side_middle.png and b/mods/plantlife_modpack/vines/textures/vines_side_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_end.png b/mods/plantlife_modpack/vines/textures/vines_vine_end.png index 062857be..f87a2906 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_vine_end.png and b/mods/plantlife_modpack/vines/textures/vines_vine_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_middle.png b/mods/plantlife_modpack/vines/textures/vines_vine_middle.png index 8afffe89..fff2acc5 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_vine_middle.png and b/mods/plantlife_modpack/vines/textures/vines_vine_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_end.png b/mods/plantlife_modpack/vines/textures/vines_willow_end.png index b5b8e594..2f62cb52 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_willow_end.png and b/mods/plantlife_modpack/vines/textures/vines_willow_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_middle.png b/mods/plantlife_modpack/vines/textures/vines_willow_middle.png index ca0b8312..aa7623aa 100644 Binary files a/mods/plantlife_modpack/vines/textures/vines_willow_middle.png and b/mods/plantlife_modpack/vines/textures/vines_willow_middle.png differ diff --git a/mods/plantlife_modpack/woodsoils/init.lua b/mods/plantlife_modpack/woodsoils/init.lua index 5d658378..456ec30d 100644 --- a/mods/plantlife_modpack/woodsoils/init.lua +++ b/mods/plantlife_modpack/woodsoils/init.lua @@ -1,32 +1,4 @@ ------------------------------------------------------------------------------------------------ -local title = "Wood Soils" -- former "Forest Soils" -local version = "0.0.9" -local mname = "woodsoils" -- former "forestsoils" ------------------------------------------------------------------------------------------------ - abstract_woodsoils = {} --- support for i18n -local S = minetest.get_translator("woodsoils") - dofile(minetest.get_modpath("woodsoils").."/nodes.lua") dofile(minetest.get_modpath("woodsoils").."/generating.lua") - --- felt like playing a bit :D ---[[print(" _____ __") -print("_/ ____\\___________ ____ _______/ |_") -print("\\ __\\/ _ \\_ __ \\_/ __ \\ / ___/\\ __\\") -print(" | | ( <_> ) | \\/\\ ___/ \\___ \\ | |") -print(" |__| \\____/|__| \\___ >____ > |__|") -print(" \\/ \\/") - -print(" .__.__") -print(" __________ |__| | ______") -print(" / ___/ _ \\| | | / ___/") -print(" \\___ ( <_> ) | |__\\___ \\") -print("/____ >____/|__|____/____ >") -print(" \\/ \\/")]] - ------------------------------------------------------------------------------------------------ -print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ diff --git a/mods/plantlife_modpack/woodsoils/locale/template.txt b/mods/plantlife_modpack/woodsoils/locale/template.txt index 9c40b2a9..e1ce3674 100644 --- a/mods/plantlife_modpack/woodsoils/locale/template.txt +++ b/mods/plantlife_modpack/woodsoils/locale/template.txt @@ -1,11 +1,4 @@ # textdomain: woodsoils - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Forest Soil 1= Forest Soil 2= Forest Soil 3= diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr new file mode 100644 index 00000000..c87d1b5b --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1=Waldboden 1 +Forest Soil 2=Waldboden 2 +Forest Soil 3=Waldboden 3 +Forest Soil 4=Waldboden 4 diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr new file mode 100644 index 00000000..8905184b --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1=Arbara Grundo 1 +Forest Soil 2=Arbara Grundo 2 +Forest Soil 3=Arbara Grundo 3 +Forest Soil 4=Arbara Grundo 4 diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr index 3ef6a2ce..a9e756e3 100644 --- a/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr @@ -1,11 +1,4 @@ # textdomain: woodsoils - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Forest Soil 1=Humus forestier 1 Forest Soil 2=Humus forestier 2 Forest Soil 3=Humus forestier 3 diff --git a/mods/plantlife_modpack/woodsoils/textures/not in use/woodsoils.png b/mods/plantlife_modpack/woodsoils/textures/not in use/woodsoils.png deleted file mode 100644 index 67253bc6..00000000 Binary files a/mods/plantlife_modpack/woodsoils/textures/not in use/woodsoils.png and /dev/null differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png index d21f2b9e..615c2dd1 100644 Binary files a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png differ diff --git a/mods/plantlife_modpack/youngtrees/init.lua b/mods/plantlife_modpack/youngtrees/init.lua index 96bcb9ac..15301403 100644 --- a/mods/plantlife_modpack/youngtrees/init.lua +++ b/mods/plantlife_modpack/youngtrees/init.lua @@ -1,11 +1,7 @@ -- support for i18n local S = minetest.get_translator("youngtrees") -abstract_youngtrees = {} - -local youngtrees_youngtrees_rarity = tonumber(minetest.settings:get("youngtrees_youngtrees_rarity")) or 100 -local youngtrees_youngtrees_rarity_fertility = tonumber(minetest.settings:get("youngtrees_youngtrees_rarity_fertility")) or 0.5 -local youngtrees_youngtrees_fertility = tonumber(minetest.settings:get("youngtrees_youngtrees_fertility")) or -0.3 +local youngtree_rarity = minetest.settings:get("youngtrees.youngtree_rarity") or 0.0005 minetest.register_node("youngtrees:bamboo", { description = S("Young Bamboo Tree"), @@ -13,7 +9,7 @@ minetest.register_node("youngtrees:bamboo", { tiles = {"bamboo.png"}, paramtype = "light", walkable = false, - is_ground_content = true, + is_ground_content = false, node_box = { type = "fixed", fixed = { @@ -27,27 +23,8 @@ minetest.register_node("youngtrees:bamboo", { drop = 'trunks:twig_1' }) -minetest.register_node("youngtrees:youngtree2_middle",{ - description = S("Young Tree 2 (middle)"), - drawtype="nodebox", - tiles = {"youngtree2branch.png"}, - inventory_image = "youngtree2branch.png", - wield_image = "youngtree2branch.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - node_box = { - type = "fixed", - fixed = { - {0.125000,-0.500000,-0.500000,0.500000,-0.187500,-0.125000}, --NodeBox 1 - {-0.187500,-0.187500,-0.500000,0.500000,0.125000,0.250000}, --NodeBox 2 - {-0.500000,0.125000,-0.500000,0.500000,0.500000,0.500000}, --NodeBox 3 - } - }, - groups = {snappy=3,flammable=2,attached_node=1}, - sounds = default.node_sound_leaves_defaults(), - drop = 'trunks:twig_1' -}) + +minetest.register_alias("youngtrees:youngtree2_middle", "default:bush_stem") minetest.register_node("youngtrees:youngtree_top", { description = S("Young Tree (top)"), @@ -57,7 +34,7 @@ minetest.register_node("youngtrees:youngtree_top", { wield_image = "youngtree16xa.png", paramtype = "light", walkable = false, - is_ground_content = true, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} @@ -75,7 +52,7 @@ minetest.register_node("youngtrees:youngtree_middle", { wield_image = "youngtree16xb.png", paramtype = "light", walkable = false, - is_ground_content = true, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} @@ -93,57 +70,80 @@ minetest.register_node("youngtrees:youngtree_bottom", { wield_image = "youngtree16xc.png", paramtype = "light", walkable = false, - is_ground_content = true, + is_ground_content = false, selection_box = { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, + on_timer = function(pos, elapsed) + local function validateNode(node) + if not minetest.registered_nodes[node.name] or minetest.registered_nodes[node.name].drawtype ~= "airlike" then + return false + end + return true + end + + local onePos, twoPos = vector.new(pos.x, pos.y+1, pos.z), vector.new(pos.x, pos.y+2, pos.z) + local oneAbove, twoAbove = minetest.get_node_or_nil(onePos), minetest.get_node_or_nil(twoPos) + if not oneAbove or not twoAbove or not validateNode(oneAbove) or not validateNode(twoAbove) then + minetest.swap_node(pos, {name="air"}) + return + end + + if math.random() > 0.5 then + minetest.set_node(onePos, {name="youngtrees:youngtree_top"}) + else + minetest.set_node(onePos, {name="youngtrees:youngtree_middle"}) + minetest.set_node(twoPos, {name="youngtrees:youngtree_top"}) + end + end, groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'trunks:twig_1' }) - -abstract_youngtrees.grow_youngtree = function(pos) - local height = math.random(1,3) - abstract_youngtrees.grow_youngtree_node(pos,height) -end - - -abstract_youngtrees.grow_youngtree_node = function(pos, height) - local right_here = {x=pos.x, y=pos.y+1, z=pos.z} - local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z} - - if minetest.get_node(right_here).name == "air" -- instead of check_air = true, - or minetest.get_node(right_here).name == "default:junglegrass" then - if height == 1 then - minetest.swap_node(right_here, {name="youngtrees:youngtree_top"}) - end - if height == 2 then - minetest.swap_node(right_here, {name="youngtrees:youngtree_bottom"}) - minetest.swap_node(above_right_here, {name="youngtrees:youngtree_top"}) - end - if height == 3 then - local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z} - minetest.swap_node(right_here, {name="youngtrees:youngtree_bottom"}) - minetest.swap_node(above_right_here, {name="youngtrees:youngtree_middle"}) - minetest.swap_node(two_above_right_here, {name="youngtrees:youngtree_top"}) - end - end -end - - -biome_lib.register_on_generate({ - surface = { - "default:dirt_with_grass", - "stoneage:grass_with_silex", - "sumpf:peat", - "sumpf:sumpf" - }, - rarity = youngtrees_youngtrees_rarity, - rarity_fertility = youngtrees_youngtrees_rarity_fertility, - plantlife_limit = youngtrees_youngtrees_fertility, - min_elevation = 1, -- above sea level +minetest.register_decoration({ + name = "youngtrees:youngtree", + decoration = { + "youngtrees:youngtree_bottom" }, - abstract_youngtrees.grow_youngtree -) + fill_ratio = youngtree_rarity, + y_min = 1, + y_max = 40, + param2 = 0, + param2_max = 3, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("youngtrees:youngtree") + minetest.set_gen_notify("decoration", {did}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + local timer = minetest.get_node_timer({x=pos.x, y=pos.y+1, z=pos.z}) + timer:start(0) + end +end) diff --git a/mods/plantlife_modpack/youngtrees/locale/template.txt b/mods/plantlife_modpack/youngtrees/locale/template.txt index 745f6b8f..a7ebcaa8 100644 --- a/mods/plantlife_modpack/youngtrees/locale/template.txt +++ b/mods/plantlife_modpack/youngtrees/locale/template.txt @@ -1,13 +1,5 @@ # textdomain: youngtrees - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# - Young Bamboo Tree= -Young Tree 2 (middle)= Young Tree (top)= Young Tree (middle)= Young Tree (bottom)= diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr new file mode 100644 index 00000000..8ada50a1 --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree=Junger Bambus +Young Tree (top)=Strauch (Spitze) +Young Tree (middle)=Strauch (Mitte) +Young Tree (bottom)=Strauch (Ansatz) diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr new file mode 100644 index 00000000..365f0c76 --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree=Juna Bambuarbo +Young Tree (top)=Juna Arbo (supro) +Young Tree (middle)=Juna Arbo (mezo) +Young Tree (bottom)=Juna Arbo (malsupro) diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr index 42de95be..1c9f4375 100644 --- a/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr @@ -1,13 +1,5 @@ # textdomain: youngtrees - -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# fat115 , 2017. -# - Young Bamboo Tree=Bambou jeune -Young Tree 2 (middle)=Arbuste 2 (milieu) Young Tree (top)=Arbuste (haut) Young Tree (middle)=Arbuste (milieu) Young Tree (bottom)=Arbuste (bas) diff --git a/mods/plantlife_modpack/youngtrees/mod.conf b/mods/plantlife_modpack/youngtrees/mod.conf index 7de39280..5a8e9fb9 100644 --- a/mods/plantlife_modpack/youngtrees/mod.conf +++ b/mods/plantlife_modpack/youngtrees/mod.conf @@ -1,2 +1,3 @@ name = youngtrees -depends = default, biome_lib +depends = default +optional_depends = ebiomes diff --git a/mods/plantlife_modpack/youngtrees/settingtypes.txt b/mods/plantlife_modpack/youngtrees/settingtypes.txt index d9e6cfd8..de07b5b1 100644 --- a/mods/plantlife_modpack/youngtrees/settingtypes.txt +++ b/mods/plantlife_modpack/youngtrees/settingtypes.txt @@ -1,8 +1,2 @@ -#Youngtree rarity % -youngtrees_youngtrees_rarity (Youngtree rarity %) float 100 0 100 - -#How much the rarity is reduced by fertility % -youngtrees_youngtrees_rarity_fertility (Youngtree rarity fertility reduction %) float 0.5 0 100 - -#Youngtree minimum fertility (-1 to +1) -youngtrees_youngtrees_fertility (Youngtree minimum fertility) float -0.3 -1 1 +# Youngtree rarity (higher number -> higher probability) +youngtrees.youngtree_rarity (Youngtree rarity) float 0.0005 0.0001 1 diff --git a/mods/plantlife_modpack/youngtrees/textures/unused/sapling.png b/mods/plantlife_modpack/youngtrees/textures/unused/sapling.png deleted file mode 100644 index a3d51271..00000000 Binary files a/mods/plantlife_modpack/youngtrees/textures/unused/sapling.png and /dev/null differ diff --git a/mods/plantlife_modpack/youngtrees/textures/unused/sapling16x.png b/mods/plantlife_modpack/youngtrees/textures/unused/sapling16x.png deleted file mode 100644 index 45b86ee8..00000000 Binary files a/mods/plantlife_modpack/youngtrees/textures/unused/sapling16x.png and /dev/null differ diff --git a/mods/plasticbox/depends.txt b/mods/plasticbox/depends.txt index 23702ac5..dd03e31c 100644 --- a/mods/plasticbox/depends.txt +++ b/mods/plasticbox/depends.txt @@ -1,3 +1,3 @@ -homedecor +homedecor? moreblocks? unifieddyes diff --git a/mods/playeranim/init.lua b/mods/playeranim/init.lua index 785b3bb6..c1383f09 100644 --- a/mods/playeranim/init.lua +++ b/mods/playeranim/init.lua @@ -261,7 +261,14 @@ local function rotate_body_and_head(player) if #yaw_history > BODY_ROTATION_DELAY then local body_yaw = table_remove(yaw_history, 1) local player_yaw = player:get_look_horizontal() - return math_deg(player_yaw - body_yaw) + -- Get the difference and normalize it to [-180,180) range. + -- This will give the shortest rotation between head and body angles. + local angle = ((player_yaw - body_yaw + 3.0*math_pi) % (2.0*math_pi)) - math_pi + -- Arbitrary limit of the head turn angle + local limit = math_pi*0.3 -- value from 0 to pi, less than 0.45*pi looks good + -- Clamp the value to the limit + angle = math.max(math.min(angle, limit), -limit) + return math_deg(angle) end return 0 end)() @@ -274,7 +281,15 @@ end local function animate_player(player, dtime) - local animation = get_animation(player).animation + local data = get_animation(player) + if not data then + -- Minetest Engine workaround for 5.6.0-dev and older + -- minetest.register_globalstep may call to this function before the player is + -- initialized by minetest.register_on_joinplayer in player_api + return + end + + local animation = data.animation -- Yaw history if animation == "lay" or animation == "sit" then diff --git a/mods/playerplus/README.md b/mods/playerplus/README.md index 4bfdcbf5..a531e6f8 100644 --- a/mods/playerplus/README.md +++ b/mods/playerplus/README.md @@ -22,6 +22,9 @@ https://forum.minetest.net/viewtopic.php?t=10090&p=153667 - 1.4 - Add minetest 5.0 check for knockback y_offset - 1.5 - Use Minetext 5.x functions for proper player knockback +Lucky Blocks: 1 + + API: Every second the mod checks which node the player is standing on, which node is diff --git a/mods/playerplus/depends.txt b/mods/playerplus/depends.txt deleted file mode 100644 index b5f672e5..00000000 --- a/mods/playerplus/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default? -3d_armor? -player_monoids? -pova? diff --git a/mods/playerplus/description.txt b/mods/playerplus/description.txt deleted file mode 100644 index c931dd89..00000000 --- a/mods/playerplus/description.txt +++ /dev/null @@ -1 +0,0 @@ -Add speed effects, suffocation and cactus damage to players. \ No newline at end of file diff --git a/mods/playerplus/init.lua b/mods/playerplus/init.lua index 43eef596..5cf7cb8b 100644 --- a/mods/playerplus/init.lua +++ b/mods/playerplus/init.lua @@ -1,26 +1,16 @@ --[[ - walking on ice makes player walk faster, - stepping through snow slows player down, - touching a cactus hurts player, - suffocation when head is inside solid node, - player knock-back effects when punched. + walking on ice makes player walk faster, stepping through snow slows player down, + touching a cactus hurts player, suffocation when head is inside solid node, + player knock-back effects when punched, check for node on_walk_over function. PlayerPlus by TenPlus1 ]] playerplus = {} --- detect minetest 5.0 -local mt50 = minetest.registered_nodes["default:permafrost"] - --- cache if player_monoids mod active? -local monoids = minetest.get_modpath("player_monoids") -local pova_mod = minetest.get_modpath("pova") - -- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - fallback = fallback or "air" +local node_ok = function(pos, fallback) local node = minetest.get_node_or_nil(pos) @@ -28,204 +18,208 @@ local node_ok = function(pos, fallback) return node.name end - return fallback + return fallback or "air" end +-- mod check and timer set +local monoids = minetest.get_modpath("player_monoids") +local pova_mod = minetest.get_modpath("pova") local armor_mod = minetest.get_modpath("3d_armor") -local time = 0 +local timer = 0 +local math_min = math.min +-- main function run for each player minetest.register_globalstep(function(dtime) - time = time + dtime - - -- every 1 second - if time < 1 then - return - end - - -- reset time for next check - time = 0 + -- one second timer + timer = timer + dtime ; if timer < 1 then return end ; timer = 0 -- define locals outside loop local name, pos, ndef, def, nslow, nfast, prop - -- get list of players - local players = minetest.get_connected_players() - -- loop through players - for _,player in pairs(players) do + for _,player in pairs(minetest.get_connected_players()) do -- who am I? name = player:get_player_name() -if name and playerplus[name] then + if name and playerplus[name] then - -- where am I? - pos = player:get_pos() + -- where am I? + pos = player:get_pos() - -- what is around me? - playerplus[name].nod_stand = node_ok({ - x = pos.x, y = pos.y - 0.1, z = pos.z}) + -- node standing on + playerplus[name].nod_stand = node_ok( + {x = pos.x, y = pos.y - 0.1, z = pos.z}) - -- Does the node below me have an on_walk_over function set? - ndef = minetest.registered_nodes[playerplus[name].nod_stand] - if ndef and ndef.on_walk_over then - ndef.on_walk_over(pos, ndef, player) - end + -- Does the node below me have an on_walk_over function set? + ndef = minetest.registered_nodes[playerplus[name].nod_stand] - prop = player:get_properties() - - -- node at eye level - playerplus[name].nod_head = node_ok({ - x = pos.x, y = pos.y + prop.eye_height, z = pos.z}) - - -- node at foot level - playerplus[name].nod_feet = node_ok({ - x = pos.x, y = pos.y + 0.2, z = pos.z}) - - -- get player physics - def = player:get_physics_override() - - if armor_mod and armor and armor.def then - -- get player physics from armor - def.speed = armor.def[name].speed or def.speed - def.jump = armor.def[name].jump or def.jump - def.gravity = armor.def[name].gravity or def.gravity - end - - -- are we standing on any nodes that speed player up? - nfast = nil - if playerplus[name].nod_stand == "default:ice" then - nfast = true - end - - -- are we standing on any nodes that slow player down? - nslow = nil - if playerplus[name].nod_stand == "default:snow" - or playerplus[name].nod_stand == "default:snowblock" then - nslow = true - end - - -- apply speed changes - if nfast and not playerplus[name].nfast then - if monoids then - playerplus[name].nfast = player_monoids.speed:add_change( - player, def.speed + 0.4) - elseif pova_mod then - pova.add_override(name, "playerplus:nfast", {speed = 0.4}) - pova.do_override(player) - else - def.speed = def.speed + 0.4 + if ndef and ndef.on_walk_over then + ndef.on_walk_over(pos, ndef, player) end - playerplus[name].nfast = true + prop = player:get_properties() + + -- node at eye level + playerplus[name].nod_head = node_ok( + {x = pos.x, y = pos.y + prop.eye_height, z = pos.z}) + + -- node at foot level + playerplus[name].nod_feet = node_ok( + {x = pos.x, y = pos.y + 0.2, z = pos.z}) + + -- get player physics + def = player:get_physics_override() + + if armor_mod and armor and armor.def then + + -- get player physics from armor + def.speed = armor.def[name].speed or def.speed + def.jump = armor.def[name].jump or def.jump + def.gravity = armor.def[name].gravity or def.gravity + end + + -- are we standing on any nodes that speed player up? + nfast = nil + + if playerplus[name].nod_stand == "default:ice" then + nfast = true + end + + -- are we standing on any nodes that slow player down? + nslow = nil + + if playerplus[name].nod_stand == "default:snow" + or playerplus[name].nod_stand == "default:snowblock" then + nslow = true + end + + -- apply speed changes + if nfast and not playerplus[name].nfast then + + if pova_mod then + + pova.add_override(name, "playerplus:nfast", {speed = 0.4}) + + pova.do_override(player) + + elseif monoids then + + playerplus[name].nfast = player_monoids.speed:add_change( + player, def.speed + 0.4) + else + def.speed = def.speed + 0.4 + end + + playerplus[name].nfast = true + + elseif not nfast and playerplus[name].nfast then + + if pova_mod then + + pova.del_override(name, "playerplus:nfast") + + pova.do_override(player) + + elseif monoids then + + player_monoids.speed:del_change(player, playerplus[name].nfast) + + playerplus[name].nfast = nil + else + def.speed = def.speed - 0.4 + end - elseif not nfast and playerplus[name].nfast then - if monoids then - player_monoids.speed:del_change(player, playerplus[name].nfast) playerplus[name].nfast = nil - elseif pova_mod then - pova.del_override(name, "playerplus:nfast") - pova.do_override(player) - else - def.speed = def.speed - 0.4 end - playerplus[name].nfast = nil - end + -- apply slowdown changes + if nslow and not playerplus[name].nslow then - -- apply slowdown changes - if nslow and not playerplus[name].nslow then - if monoids then - playerplus[name].nslow = player_monoids.speed:add_change( - player, def.speed - 0.3) - elseif pova_mod then - pova.add_override(name, "playerplus:nslow", {speed = -0.3}) - pova.do_override(player) - else - def.speed = def.speed - 0.3 - end + if pova_mod then - playerplus[name].nslow = true + pova.add_override(name, "playerplus:nslow", {speed = -0.3}) + + pova.do_override(player) + + elseif monoids then + + playerplus[name].nslow = player_monoids.speed:add_change( + player, def.speed - 0.3) + else + def.speed = def.speed - 0.3 + end + + playerplus[name].nslow = true + + elseif not nslow and playerplus[name].nslow then + + if pova_mod then + + pova.del_override(name, "playerplus:nslow") + + pova.do_override(player) + + elseif monoids then + + player_monoids.speed:del_change(player, playerplus[name].nslow) + + playerplus[name].nslow = nil + else + def.speed = def.speed + 0.3 + end - elseif not nslow and playerplus[name].nslow then - if monoids then - player_monoids.speed:del_change(player, playerplus[name].nslow) playerplus[name].nslow = nil - elseif pova_mod then - pova.del_override(name, "playerplus:nslow") - pova.do_override(player) - else - def.speed = def.speed + 0.3 end - playerplus[name].nslow = nil - end + -- set player physics + if not monoids and not pova_mod then - -- set player physics - if not monoids and not pova_mod then - - player:set_physics_override({ - speed = def.speed, - jump = def.jump, - gravity = def.gravity - }) - end ---[[ - print ("Speed: " .. def.speed - .. " / Jump: " .. def.jump - .. " / Gravity: " .. def.gravity) -]] - -- Is player suffocating inside a normal node without no_clip privs? - local ndef = minetest.registered_nodes[playerplus[name].nod_head] - - if ndef.walkable == true - and ndef.drowning == 0 - and ndef.damage_per_second <= 0 - and ndef.groups.disable_suffocation ~= 1 - and ndef.drawtype == "normal" - and not minetest.check_player_privs(name, {noclip = true}) then - - if player:get_hp() > 0 then - player:set_hp(player:get_hp() - 2) + player:set_physics_override( + {speed = def.speed, jump = def.jump, gravity = def.gravity}) end - end - -- am I near a cactus? - local near = minetest.find_node_near(pos, 1, "default:cactus") +--print ("Speed: " .. def.speed .. " / Jump: " .. def.jump .. " / Gravity: " .. def.gravity) - if near then + -- Is player suffocating inside a normal node without no_clip privs? + local ndef = minetest.registered_nodes[playerplus[name].nod_head] - -- am I touching the cactus? if so it hurts - for _,object in pairs(minetest.get_objects_inside_radius(near, 1.1)) do + if ndef.walkable == true + and ndef.drowning == 0 + and ndef.damage_per_second <= 0 + and ndef.groups.disable_suffocation ~= 1 + and ndef.drawtype == "normal" + and not minetest.check_player_privs(name, {noclip = true}) then - if object:get_hp() > 0 then - object:set_hp(object:get_hp() - 2) + if player:get_hp() > 0 then + player:set_hp(player:get_hp() - 2, {suffocation = true}) end end + -- am I near a cactus? + local near = minetest.find_node_near(pos, 1, "default:cactus") + + if near and vector.distance(pos, near) < 1.1 then + player:set_hp(player:get_hp() - 2, {cactus = true}) + end end - -end -- END if name - end end) - -- check for old sneak_glitch setting + local old_sneak = minetest.settings:get_bool("old_sneak") --- set to blank on join (for 3rd party mods) +-- set to blank on join and apply sneak glitch (for 3rd party mods) + minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - playerplus[name] = {} - playerplus[name].nod_head = "" - playerplus[name].nod_feet = "" - playerplus[name].nod_stand = "" + playerplus[name] = {nod_head = "", nod_feet = "", nod_stand = ""} -- apply old sneak glitch if enabled if old_sneak then @@ -233,57 +227,55 @@ minetest.register_on_joinplayer(function(player) end end) - -- clear when player leaves -minetest.register_on_leaveplayer(function(player) +minetest.register_on_leaveplayer(function(player) playerplus[ player:get_player_name() ] = nil end) - -- add privelage to disable knock-back -minetest.register_privilege("no_knockback", { - description = "Disables player knock-back effect", - give_to_singleplayer = false}) --- is player knock-back effect enabled? -if minetest.settings:get_bool("player_knockback") == true then +minetest.register_privilege("no_knockback", { + description = "Disables player knock-back effect", give_to_singleplayer = false +}) -- player knock-back function -local punchy = function( + +local function punchy( player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - if not dir then return end + if not dir then return end -- we need to know where to send player away from + + local name = player:get_player_name() + + -- is player attached to anything (mob, bed, boat etc.) + if player_api.player_attached[name] then return end -- check if player has 'no_knockback' privelage - local privs = minetest.get_player_privs(player:get_player_name()) + local privs = minetest.get_player_privs(name) - if privs["no_knockback"] then - return - end + if privs["no_knockback"] then return end local damage = 0 - -- get tool damage if tool_capabilities then local armor = player:get_armor_groups() or {} local tmp + -- calculate knockback damage for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do tmp = time_from_last_punch / (tool_capabilities.full_punch_interval or 1.4) - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end + if tmp < 0 then tmp = 0.0 elseif tmp > 1 then tmp = 1.0 end - damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp + if group ~= "knockback" then + damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp + end end - -- check for knockback value + -- if custom value found then use instead if tool_capabilities.damage_groups["knockback"] then damage = tool_capabilities.damage_groups["knockback"] end @@ -291,30 +283,30 @@ local punchy = function( end -- END tool damage - local kb = math.min(32, damage * 2) + local kb = math_min(32, damage * 2) --- print ("---", player:get_player_name(), damage, kb) +--print ("--- knockback", player:get_player_name(), damage, kb) -- knock back player - player:add_velocity({ - x = dir.x * kb, - y = -1, - z = dir.z * kb - }) + player:add_velocity({x = dir.x * kb, y = -1, z = dir.z * kb}) end -minetest.register_on_punchplayer(punchy) +-- is player knock-back effect enabled? -end -- END if +if minetest.settings:get_bool("player_knockback") ~= false then + minetest.register_on_punchplayer(punchy) +end minetest.register_tool("playerplus:stick", { - description = "KB Stick", - inventory_image = "default_stick.png", - wield_image = "default_stick.png", + description = "Sword of Boing", + inventory_image = "playerplus_sword_boing.png", + wield_image = "playerplus_sword_boing.png", + groups = {not_in_creative_inventory = 1}, tool_capabilities = { full_punch_interval = 1.4, - damage_groups = {fleshy = 0, knockback = 11}, - }, + damage_groups = {knockback = 11}, + groupcaps = {bouncy = {maxlevel = 0}} -- needed so 3d_armor doesnt damage armor + } }) --[[ @@ -324,3 +316,9 @@ minetest.override_item("default:mese", { end }) ]] + +-- add lucky blocks (if damage and stamina active) + +if minetest.get_modpath("lucky_block") then + dofile(minetest.get_modpath("playerplus") .. "/lucky_block.lua") +end diff --git a/mods/playerplus/lucky_block.lua b/mods/playerplus/lucky_block.lua new file mode 100644 index 00000000..51fe7c4a --- /dev/null +++ b/mods/playerplus/lucky_block.lua @@ -0,0 +1,6 @@ +-- local custom_function = function(pos, player, def) + +-- add lucky blocks +lucky_block:add_blocks({ + {"dro", {"playerplus:stick"}} +}) diff --git a/mods/playerplus/mod.conf b/mods/playerplus/mod.conf index 60ad6fb2..539521ee 100644 --- a/mods/playerplus/mod.conf +++ b/mods/playerplus/mod.conf @@ -1,4 +1,4 @@ name = playerplus -depends = -optional_depends = default, 3d_armor, player_monoids, pova description = Add speed effects, suffocation and cactus damage to players. +optional_depends = default, 3d_armor, player_monoids, pova, lucky_block +min_minetest_version = 5.0 diff --git a/mods/playerplus/settingtypes.txt b/mods/playerplus/settingtypes.txt index 103decbd..8c94f5a5 100644 --- a/mods/playerplus/settingtypes.txt +++ b/mods/playerplus/settingtypes.txt @@ -1,4 +1,4 @@ # If enabled players are knocked back when hit by mobs or other players -player_knockback (Player knockback) bool false +player_knockback (Player knockback) bool true # If enabled the players use the old sneak glitch and movements old_sneak (Use old sneak glitch) bool false diff --git a/mods/playerplus/textures/playerplus_sword_boing.png b/mods/playerplus/textures/playerplus_sword_boing.png new file mode 100644 index 00000000..ec9273da Binary files /dev/null and b/mods/playerplus/textures/playerplus_sword_boing.png differ diff --git a/mods/prefab_redo/.luacheckrc b/mods/prefab_redo/.luacheckrc new file mode 100644 index 00000000..0aec898e --- /dev/null +++ b/mods/prefab_redo/.luacheckrc @@ -0,0 +1,7 @@ +max_line_length = 160 + +read_globals = { + "minetest", + "default", + "doors", +} diff --git a/mods/prefab_redo/depends.txt b/mods/prefab_redo/depends.txt deleted file mode 100644 index 7af3d830..00000000 --- a/mods/prefab_redo/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -doors -basic_materials diff --git a/mods/prefab_redo/init.lua b/mods/prefab_redo/init.lua index 7b28b844..b35bcd61 100644 --- a/mods/prefab_redo/init.lua +++ b/mods/prefab_redo/init.lua @@ -60,7 +60,6 @@ minetest.register_node("prefab_redo:concrete_wall", { end end, on_destruct = function(pos) - local node = minetest.get_node(pos) local pos_above = {x = pos.x,y = pos.y + 1,z = pos.z} local node_above = minetest.get_node(pos_above) if node_above.name == "prefab_redo:concrete_wall_upper" then @@ -88,7 +87,6 @@ minetest.register_node("prefab_redo:concrete_wall_upper", { }, connects_to = {"prefab_redo:concrete_wall","prefab_redo:concrete_wall_upper"}, on_destruct = function(pos) - local node = minetest.get_node(pos) local pos_above = {x = pos.x,y = pos.y + 1,z = pos.z} local node_above = minetest.get_node(pos_above) if node_above.name == "prefab_redo:concrete_wall_upper" then @@ -161,9 +159,9 @@ minetest.register_node("prefab_redo:concrete_catwalk",{ node_box = { type = "fixed", fixed = { - {-0.5,-0.5,-0.5,0.5,-0.375,0.5}, - {-0.5,-0.5,-0.0625,-0.4375,0.5,0.0625}, - {0.4433,-0.5,-0.0625,0.5,0.5,0.0625}, + {-0.5,-0.5,-0.5,0.5,-0.375,0.5}, + {-0.5,-0.5,-0.0625,-0.4375,0.5,0.0625}, + {0.4433,-0.5,-0.0625,0.5,0.5,0.0625}, {0.4433,0.4485,-0.5,0.5,0.5,0.5}, {-0.5,0.4485,-0.5,-0.4375,0.5,0.5}, }, @@ -180,8 +178,8 @@ minetest.register_node("prefab_redo:concrete_bench", { node_box = { type = "fixed", fixed = { - {-0.125,-0.5,-0.125,0.125,0.0625,0.125}, - {-0.5,0.0625,-0.3125,0.5,0.1875,0.3125}, + {-0.125,-0.5,-0.125,0.125,0.0625,0.125}, + {-0.5,0.0625,-0.3125,0.5,0.1875,0.3125}, }, }, groups = {cracky = 2}, diff --git a/mods/prefab_redo/mod.conf b/mods/prefab_redo/mod.conf index a489dd0d..1f7786dc 100644 --- a/mods/prefab_redo/mod.conf +++ b/mods/prefab_redo/mod.conf @@ -1 +1,3 @@ name = prefab_redo +description = Remake of the old "prefab" mod +depends = default,doors,basic_materials diff --git a/mods/protector/README.md b/mods/protector/README.md index 077a3bdf..448f37e4 100644 --- a/mods/protector/README.md +++ b/mods/protector/README.md @@ -61,7 +61,7 @@ Change log: - 3.1 - Ability to hide protection blocks using /protector_hide and /protector_show , italian local added (thanks Hamlet) - 3.2 - Defaults to Minetest translation if found, otherwise intllib fallback if loaded, locale files updated for both. Added 'protector_msg' setting for player text. - 3.3 - Added support for playerfactions new api (thanks louisroyer), added limiter to protection radius of 22. -- 3.4 - Player flip and hurt functions moved to minetest.register_protection_violation function (thanks hlqkj), added 'protector_crafts' setting, changed wood doors n chests to immediate_dig for mineclone2 fix. +- 3.4 - Player flip and hurt functions moved to minetest.register_protection_violation function (thanks hlqkj), added 'protector_crafts' setting, changed wood doors n chests to immediate_dig for mineclone2 fix. Upped protector radius limit to 30. Lucky Blocks: 10 diff --git a/mods/protector/admin.lua b/mods/protector/admin.lua index c7c4446e..c8ae75c7 100644 --- a/mods/protector/admin.lua +++ b/mods/protector/admin.lua @@ -1,27 +1,30 @@ -local S = protector.intllib +-- translation and default name vars + +local S = minetest.get_translator("protector") local removal_names = "" local replace_names = "" +-- remove protection command + minetest.register_chatcommand("protector_remove", { params = S(""), description = S("Remove Protectors around players (separate names with spaces)"), privs = {server = true}, + func = function(name, param) if not param or param == "" then minetest.chat_send_player(name, - S("Protector Names to remove: @1", - removal_names)) + S("Protector Names to remove: @1", removal_names)) return end if param == "-" then - minetest.chat_send_player(name, - S("Name List Reset")) + minetest.chat_send_player(name, S("Name List Reset")) removal_names = "" @@ -32,11 +35,13 @@ minetest.register_chatcommand("protector_remove", { end }) +-- replace protection command minetest.register_chatcommand("protector_replace", { params = S(" "), description = S("Replace Protector Owner with name provided"), privs = {server = true}, + func = function(name, param) -- reset list to empty @@ -50,13 +55,11 @@ minetest.register_chatcommand("protector_replace", { end -- show name info - if param == "" - and replace_names ~= "" then + if param == "" and replace_names ~= "" then local names = replace_names:split(" ") - minetest.chat_send_player(name, - S("Replacing Protector name @1 with @2", + minetest.chat_send_player(name, S("Replacing Protector name @1 with @2", names[1] or "", names[2] or "")) return @@ -66,18 +69,17 @@ minetest.register_chatcommand("protector_replace", { end }) +-- Abm to remove or replace protectors within active player area minetest.register_abm({ nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"}, interval = 6, chance = 1, catch_up = false, + action = function(pos, node) - if removal_names == "" - and replace_names == "" then - return - end + if removal_names == "" and replace_names == "" then return end local meta = minetest.get_meta(pos) @@ -90,9 +92,7 @@ minetest.register_abm({ local names = removal_names:split(" ") for _, n in pairs(names) do - if n == owner then - minetest.set_node(pos, {name = "air"}) - end + if n == owner then minetest.set_node(pos, {name = "air"}) end end end @@ -108,14 +108,19 @@ minetest.register_abm({ end }) --- get protection radius +-- get protection radius (max 30) + local r = tonumber(minetest.settings:get("protector_radius")) or 5 +if r > 30 then r = 30 end + -- show protection areas of nearby protectors owned by you (thanks agaran) + minetest.register_chatcommand("protector_show_area", { params = "", description = S("Show protected areas of your nearby protectors"), privs = {}, + func = function(name, param) local player = minetest.get_player_by_name(name) @@ -123,9 +128,9 @@ minetest.register_chatcommand("protector_show_area", { -- find the protector nodes local pos = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - r, z = pos.z - r}, - {x = pos.x + r, y = pos.y + r, z = pos.z + r}, - {"protector:protect", "protector:protect2", "protector:protect_hidden"}) + {x = pos.x - r, y = pos.y - r, z = pos.z - r}, + {x = pos.x + r, y = pos.y + r, z = pos.z + r}, + {"protector:protect", "protector:protect2", "protector:protect_hidden"}) local meta, owner @@ -143,8 +148,8 @@ minetest.register_chatcommand("protector_show_area", { end }) - -- ability to hide protection blocks (borrowed from doors mod :) + minetest.register_node("protector:protect_hidden", { description = "Hidden Protector", drawtype = "airlike", @@ -159,14 +164,15 @@ minetest.register_node("protector:protect_hidden", { floodable = false, drop = "", groups = {not_in_creative_inventory = 1, unbreakable = 1}, + is_ground_content = false, on_blast = function() end, -- 1px block inside door hinge near node top collision_box = { - type = "fixed", - fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32} + type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32} } }) +-- make own protectors visible in area minetest.register_chatcommand("protector_show", { params = "", @@ -184,9 +190,9 @@ minetest.register_chatcommand("protector_show", { local pos = player:get_pos() local a = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - r, z = pos.z - r}, - {x = pos.x + r, y = pos.y + r, z = pos.z + r}, - {"protector:protect_hidden"}) + {x = pos.x - r, y = pos.y - r, z = pos.z - r}, + {x = pos.x + r, y = pos.y + r, z = pos.z + r}, + {"protector:protect_hidden"}) local meta, owner @@ -203,6 +209,8 @@ minetest.register_chatcommand("protector_show", { end }) +-- make own protectors invisible in area + minetest.register_chatcommand("protector_hide", { params = "", description = S("Hide your nearby protection blocks"), @@ -219,9 +227,9 @@ minetest.register_chatcommand("protector_hide", { local pos = player:get_pos() local a = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - r, z = pos.z - r}, - {x = pos.x + r, y = pos.y + r, z = pos.z + r}, - {"protector:protect", "protector:protect2"}) + {x = pos.x - r, y = pos.y - r, z = pos.z - r}, + {x = pos.x + r, y = pos.y + r, z = pos.z + r}, + {"protector:protect", "protector:protect2"}) local meta, owner diff --git a/mods/protector/depends.txt b/mods/protector/depends.txt deleted file mode 100644 index 5b09c289..00000000 --- a/mods/protector/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default? -intllib? -lucky_block? -mesecons_mvps? -playerfactions? diff --git a/mods/protector/description.txt b/mods/protector/description.txt deleted file mode 100644 index 587fee89..00000000 --- a/mods/protector/description.txt +++ /dev/null @@ -1 +0,0 @@ -Lets players craft special blocks to protect their builds or disable PVP in areas. \ No newline at end of file diff --git a/mods/protector/doors_chest.lua b/mods/protector/doors_chest.lua index cbe89e06..f3b5e0d2 100644 --- a/mods/protector/doors_chest.lua +++ b/mods/protector/doors_chest.lua @@ -1,81 +1,88 @@ --- Since the doors mod has changed in the latest daily builds I have taken the --- WTFPL licenced code from the old doors mod and included an edited version --- within this mod for local use. +-- doors code from an old client re-used -local S = protector.intllib +local S = minetest.get_translator("protector") local F = minetest.formspec_escape --- MineClone2 support -local mcl = not minetest.registered_items["default:steel_ingot"] +-- MineClone support + +local mcl = minetest.get_modpath("mcl_core") +local mcf = minetest.get_modpath("mcl_formspec") -- Are crafts enabled? + local protector_crafts = minetest.settings:get_bool("protector_crafts") ~= false -- Registers a door -function register_door(name, def) - def.groups.not_in_creative_inventory = 1 - local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} +local function register_door(name, def) + + def.groups.not_in_creative_inventory = 1 + def.groups.handy = 1 + def.groups.prot_door = 1 + + local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5 + 1.5/16}} def.node_box_bottom = box def.node_box_top = box def.selection_box_bottom = box def.selection_box_top = box - def.sound_close_door = "doors_door_close" - def.sound_open_door = "doors_door_open" minetest.register_craftitem(name, { description = def.description, inventory_image = def.inventory_image, on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then + + if pointed_thing.type ~= "node" then return itemstack end local ptu = pointed_thing.under local nu = minetest.get_node(ptu) + if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick then return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) end local pt = pointed_thing.above - local pt2 = {x=pt.x, y=pt.y, z=pt.z} - pt2.y = pt2.y+1 - if - not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or - not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or - not placer or - not placer:is_player() - then + local pt2 = {x = pt.x, y = pt.y, z = pt.z} + + pt2.y = pt2.y + 1 + + if not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to + or not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to + or not placer or not placer:is_player() then return itemstack end - if minetest.is_protected(pt, placer:get_player_name()) or - minetest.is_protected(pt2, placer:get_player_name()) then + if minetest.is_protected(pt, placer:get_player_name()) + or minetest.is_protected(pt2, placer:get_player_name()) then minetest.record_protection_violation(pt, placer:get_player_name()) return itemstack end local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - local pt3 = {x=pt.x, y=pt.y, z=pt.z} + local pt3 = {x = pt.x, y = pt.y, z = pt.z} + if p2 == 0 then - pt3.x = pt3.x-1 + pt3.x = pt3.x - 1 elseif p2 == 1 then - pt3.z = pt3.z+1 + pt3.z = pt3.z + 1 elseif p2 == 2 then - pt3.x = pt3.x+1 + pt3.x = pt3.x + 1 elseif p2 == 3 then - pt3.z = pt3.z-1 + pt3.z = pt3.z - 1 end - if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then - minetest.set_node(pt, {name=name.."_b_1", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + + if minetest.get_item_group(minetest.get_node(pt3).name, "prot_door") == 0 then + minetest.set_node(pt, {name = name .. "_b_1", param2 = p2}) + minetest.set_node(pt2, {name = name .. "_t_1", param2 = p2}) else - minetest.set_node(pt, {name=name.."_b_2", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) + minetest.set_node(pt, {name = name .. "_b_2", param2 = p2}) + minetest.set_node(pt2, {name = name .. "_t_2", param2 = p2}) + minetest.get_meta(pt):set_int("right", 1) minetest.get_meta(pt2):set_int("right", 1) end @@ -83,222 +90,212 @@ function register_door(name, def) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end + + minetest.sound_play(def.sounds.place, {pos = pt2}, true) + return itemstack - end, + end }) local tt = def.tiles_top local tb = def.tiles_bottom local function after_dig_node(pos, name, digger) + local node = minetest.get_node(pos) + if node.name == name then minetest.node_dig(pos, node, digger) end end local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) - pos.y = pos.y+dir - if minetest.get_node(pos).name ~= check_name then - return - end + + pos.y = pos.y + dir + + if minetest.get_node(pos).name ~= check_name then return end + local p2 = minetest.get_node(pos).param2 - p2 = params[p2+1] - minetest.swap_node(pos, {name=replace_dir, param2=p2}) + p2 = params[p2 + 1] - pos.y = pos.y-dir - minetest.swap_node(pos, {name=replace, param2=p2}) + minetest.swap_node(pos, {name = replace_dir, param2 = p2}) - local snd_1 = def.sound_close_door - local snd_2 = def.sound_open_door - if params[1] == 3 then - snd_1 = def.sound_open_door - snd_2 = def.sound_close_door - end + pos.y = pos.y - dir - if minetest.get_meta(pos):get_int("right") ~= 0 then - minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) - else - minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) - end + minetest.swap_node(pos, {name = replace, param2=p2}) + + minetest.sound_play("default_dug_node", + {pos = pos, gain = 0.3, max_hear_distance = 10}, true) end local function on_rotate(pos, node, dir, user, check_name, mode, new_param2) - if mode ~= screwdriver.ROTATE_FACE then - return false - end + if mode ~= screwdriver.ROTATE_FACE then return false end pos.y = pos.y + dir - if not minetest.get_node(pos).name == check_name then - return false - end + + if minetest.get_node(pos).name ~= check_name then return false end + if minetest.is_protected(pos, user:get_player_name()) then minetest.record_protection_violation(pos, user:get_player_name()) return false end local node2 = minetest.get_node(pos) + node2.param2 = (node2.param2 + 1) % 4 + minetest.swap_node(pos, node2) pos.y = pos.y - dir + node.param2 = (node.param2 + 1) % 4 + minetest.swap_node(pos, node) + return true end - minetest.register_node(name.."_b_1", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, + minetest.register_node(name .. "_b_1", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1] .. "^[transformfx"}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, + node_dig_prediction = "", drop = name, drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, + node_box = { type = "fixed", fixed = def.node_box_bottom }, + selection_box = { type = "fixed", fixed = def.selection_box_bottom }, groups = def.groups, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1, after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 + pos.y = pos.y + 1 after_dig_node(pos, name.."_t_1", digger) end, on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + on_rightclick(pos, 1, name .. "_t_1", name .. "_b_2", name .. "_t_2", {1,2,3,0}) end end, on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, 1, user, name.."_t_1", mode) + return on_rotate(pos, node, 1, user, name .. "_t_1", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, - on_blast = function() end, + on_blast = function() end }) - minetest.register_node(name.."_t_1", { - tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"}, + minetest.register_node(name .. "_t_1", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1] .. "^[transformfx"}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, + node_dig_prediction = "", drop = "", drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_top - }, + node_box = { type = "fixed", fixed = def.node_box_top }, + selection_box = { type = "fixed", fixed = def.selection_box_top }, groups = def.groups, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1, after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y-1 - after_dig_node(pos, name.."_b_1", digger) + pos.y = pos.y - 1 + after_dig_node(pos, name .. "_b_1", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then - on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) + on_rightclick(pos, -1, name .. "_b_1", name .. "_t_2", name .. "_b_2", {1,2,3,0}) end end, on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, -1, user, name.."_b_1", mode) + return on_rotate(pos, node, -1, user, name .. "_b_1", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, - on_blast = function() end, + on_blast = function() end }) - minetest.register_node(name.."_b_2", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, + minetest.register_node(name .. "_b_2", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1] .. "^[transformfx", tb[1]}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, + node_dig_prediction = "", drop = name, drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, + node_box = { type = "fixed", fixed = def.node_box_bottom }, + selection_box = { type = "fixed", fixed = def.selection_box_bottom }, groups = def.groups, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1, after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_2", digger) + pos.y = pos.y + 1 + after_dig_node(pos, name .. "_t_2", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then - on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + on_rightclick(pos, 1, name .. "_t_2", name .. "_b_1", name .. "_t_1", {3,0,1,2}) end end, on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, 1, user, name.."_t_2", mode) + return on_rotate(pos, node, 1, user, name .. "_t_2", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, - on_blast = function() end, + on_blast = function() end }) - minetest.register_node(name.."_t_2", { - tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]}, + minetest.register_node(name .. "_t_2", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1] .. "^[transformfx", tt[1]}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, + node_dig_prediction = "", drop = "", drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_top - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_top - }, + node_box = { type = "fixed", fixed = def.node_box_top }, + selection_box = { type = "fixed", fixed = def.selection_box_top }, groups = def.groups, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1, after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y-1 - after_dig_node(pos, name.."_b_2", digger) + pos.y = pos.y - 1 + after_dig_node(pos, name .. "_b_2", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then - on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) + on_rightclick(pos, -1, name .. "_b_2", name .. "_t_1", name .. "_b_1", {3,0,1,2}) end end, on_rotate = function(pos, node, user, mode, new_param2) - return on_rotate(pos, node, -1, user, name.."_b_2", mode) + return on_rotate(pos, node, -1, user, name .. "_b_2", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, - on_blast = function() end, + on_blast = function() end }) end @@ -309,10 +306,7 @@ local name = "protector:door_wood" register_door(name, { description = S("Protected Wooden Door"), inventory_image = "doors_wood.png^protector_logo.png", - groups = { - snappy = 1, choppy = 2, dig_immediate = 2, - unbreakable = 1, --door = 1 - }, + groups = {snappy = 1, choppy = 2, dig_immediate = 2, unbreakable = 1, axey = 1}, tiles_bottom = {"doors_wood_b.png^protector_logo.png", "doors_brown.png"}, tiles_top = {"doors_wood_a.png", "doors_brown.png"}, sounds = default.node_sound_wood_defaults(), @@ -320,29 +314,27 @@ register_door(name, { }) if protector_crafts then - if mcl then - minetest.register_craft({ - output = name, - recipe = { - {"mcl_doors:wooden_door", "mcl_core:gold_ingot"} - } - }) - else - minetest.register_craft({ - output = name, - recipe = { - {"group:wood", "group:wood"}, - {"group:wood", "default:copper_ingot"}, - {"group:wood", "group:wood"} - } - }) - minetest.register_craft({ - output = name, - recipe = { - {"doors:door_wood", "default:copper_ingot"} - } - }) + if mcl then + + minetest.register_craft({ + output = name, + recipe = { {"mcl_doors:wooden_door", "mcl_core:gold_ingot"} } + }) + else + minetest.register_craft({ + output = name, + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "default:copper_ingot"}, + {"group:wood", "group:wood"} + } + }) + + minetest.register_craft({ + output = name, + recipe = { {"doors:door_wood", "default:copper_ingot"} } + }) end end @@ -355,59 +347,57 @@ register_door(name, { inventory_image = "doors_steel.png^protector_logo.png", groups = { snappy = 1, bendy = 2, cracky = 1, - level = 2, unbreakable = 1, -- door = 1 + level = (mcl and 0 or 2), pickaxey = 2, unbreakable = 1 }, tiles_bottom = {"doors_steel_b.png^protector_logo.png", "doors_grey.png"}, tiles_top = {"doors_steel_a.png", "doors_grey.png"}, - sounds = default.node_sound_wood_defaults(), + sounds = default.node_sound_metal_defaults(), sunlight = false, }) if protector_crafts then - if mcl then - minetest.register_craft({ - output = name, - recipe = { - {"mcl_doors:iron_door", "mcl_core:gold_ingot"} - } - }) - else - minetest.register_craft({ - output = name, - recipe = { - {"default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:copper_ingot"}, - {"default:steel_ingot", "default:steel_ingot"} - } - }) - minetest.register_craft({ - output = name, - recipe = { - {"doors:door_steel", "default:copper_ingot"} - } - }) + if mcl then + + minetest.register_craft({ + output = name, + recipe = { {"mcl_doors:iron_door", "mcl_core:gold_ingot"} } + }) + else + minetest.register_craft({ + output = name, + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:copper_ingot"}, + {"default:steel_ingot", "default:steel_ingot"} + } + }) + + minetest.register_craft({ + output = name, + recipe = { {"doors:door_steel", "default:copper_ingot"} } + }) end end ----trapdoor---- -function register_trapdoor(name, def) +local function register_trapdoor(name, def) + local name_closed = name - local name_opened = name.."_open" + local name_opened = name .. "_open" def.on_rightclick = function (pos, node, clicker, itemstack, pointed_thing) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end + + if minetest.is_protected(pos, clicker:get_player_name()) then return end + local newname = node.name == name_closed and name_opened or name_closed - local sound = false - if node.name == name_closed then sound = "doors_door_open" end - if node.name == name_opened then sound = "doors_door_close" end - if sound then - minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10}) - end - minetest.swap_node(pos, {name = newname, param1 = node.param1, param2 = node.param2}) + + minetest.sound_play("default_dug_node", + {pos = pos, gain = 0.3, max_hear_distance = 10}, true) + + minetest.swap_node(pos, + {name = newname, param1 = node.param1, param2 = node.param2}) end -- Common trapdoor configuration @@ -416,28 +406,25 @@ function register_trapdoor(name, def) def.paramtype2 = "facedir" def.use_texture_alpha = "clip" def.is_ground_content = false + def.node_dig_prediction = "" local def_opened = table.copy(def) local def_closed = table.copy(def) def_closed.node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } def_closed.selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side, def.tile_side, def.tile_side } def_opened.node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } def_opened.selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } def_opened.tiles = { def.tile_side, def.tile_side, def.tile_side .. "^[transform3", @@ -459,36 +446,33 @@ register_trapdoor("protector:trapdoor", { wield_image = "doors_trapdoor.png^protector_logo.png", tile_front = "doors_trapdoor.png^protector_logo.png", tile_side = "doors_trapdoor_side.png", - groups = { - snappy = 1, choppy = 2, dig_immediate = 2, - unbreakable = 1, --door = 1 - }, + groups = {snappy = 1, choppy = 2, dig_immediate = 2, unbreakable = 1, axey = 1}, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1, sounds = default.node_sound_wood_defaults(), }) if protector_crafts then - if mcl then - minetest.register_craft({ - output = "protector:trapdoor", - recipe = { - {"mcl_doors:trapdoor", "mcl_core:gold_ingot"} - } - }) - else - minetest.register_craft({ - output = "protector:trapdoor 2", - recipe = { - {"group:wood", "default:copper_ingot", "group:wood"}, - {"group:wood", "group:wood", "group:wood"} - } - }) - minetest.register_craft({ - output = "protector:trapdoor", - recipe = { - {"doors:trapdoor", "default:copper_ingot"} - } - }) + if mcl then + + minetest.register_craft({ + output = "protector:trapdoor", + recipe = { {"mcl_doors:trapdoor", "mcl_core:gold_ingot"} } + }) + else + minetest.register_craft({ + output = "protector:trapdoor 2", + recipe = { + {"group:wood", "default:copper_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"} + } + }) + + minetest.register_craft({ + output = "protector:trapdoor", + recipe = { {"doors:trapdoor", "default:copper_ingot"} } + }) end end @@ -501,40 +485,42 @@ register_trapdoor("protector:trapdoor_steel", { tile_front = "doors_trapdoor_steel.png^protector_logo.png", tile_side = "doors_trapdoor_steel_side.png", groups = { - snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2, - unbreakable = 1, --door = 1 + snappy = 1, bendy = 2, cracky = 1, melty = 2, level = (mcl and 0 or 2), + unbreakable = 1, pickaxey = 2 }, - sounds = default.node_sound_wood_defaults(), + _mcl_hardness = 1, + _mcl_blast_resistance = 1, + sounds = default.node_sound_metal_defaults() }) if protector_crafts then - if mcl then - minetest.register_craft({ - output = "protector:trapdoor_steel", - recipe = { - {"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"} - } - }) - else - minetest.register_craft({ - output = "protector:trapdoor_steel", - recipe = { - {"default:copper_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:steel_ingot"} - } - }) - minetest.register_craft({ - output = "protector:trapdoor_steel", - recipe = { - {"doors:trapdoor_steel", "default:copper_ingot"} - } - }) + if mcl then + + minetest.register_craft({ + output = "protector:trapdoor_steel", + recipe = { {"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"} } + }) + else + minetest.register_craft({ + output = "protector:trapdoor_steel", + recipe = { + {"default:copper_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"} + } + }) + + minetest.register_craft({ + output = "protector:trapdoor_steel", + recipe = { {"doors:trapdoor_steel", "default:copper_ingot"} } + }) end end -- Protected Chest +local chest_size = mcl and (9 * 3) or (8 * 4) + minetest.register_node("protector:chest", { description = S("Protected Chest"), tiles = { @@ -555,7 +541,7 @@ minetest.register_node("protector:chest", { meta:set_string("infotext", S("Protected Chest")) meta:set_string("name", S("Protected Chest")) - inv:set_size("main", 8 * 4) + inv:set_size("main", chest_size) end, can_dig = function(pos,player) @@ -573,24 +559,21 @@ minetest.register_node("protector:chest", { on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves stuff to protected chest at " .. - minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() + .. " moves stuff to protected chest at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes stuff from protected chest at " .. - minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() + .. " takes stuff from protected chest at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_move = function( pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name() .. - " moves stuff inside protected chest at " .. - minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() + .. " moves stuff inside protected chest at " .. minetest.pos_to_string(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) @@ -623,18 +606,35 @@ minetest.register_node("protector:chest", { on_rightclick = function(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end + if minetest.is_protected(pos, clicker:get_player_name()) then return end - local meta = minetest.get_meta(pos) - - if not meta then - return - end + local meta = minetest.get_meta(pos) ; if not meta then return end local spos = pos.x .. "," .. pos.y .. "," ..pos.z - local formspec = "size[8,9]" + local formspec + + -- mineclone support + if mcl and mcf then + + formspec = "size[9,8.75]" + .. "label[0,0;" .. minetest.formspec_escape( + minetest.colorize("#313131", "Protected Chest")) .. "]" + .. "list[nodemeta:" .. spos .. ";main;0,0.5;9,3;]" + .. mcl_formspec.get_itemslot_bg(0,0.5,9,3) + .. "image_button[3.0,3.5;1.05,0.8;protector_up_icon.png;protect_up;]" + .. "image_button[4.0,3.5;1.05,0.8;protector_down_icon.png;protect_down;]" + .. "label[0,4.0;" .. minetest.formspec_escape( + minetest.colorize("#313131", "Inventory")) .. "]" + .. "list[current_player;main;0,4.5;9,3;9]" + .. mcl_formspec.get_itemslot_bg(0,4.5,9,3) + .. "list[current_player;main;0,7.74;9,1;]" + .. mcl_formspec.get_itemslot_bg(0,7.74,9,1) + .. "listring[nodemeta:" .. spos .. ";main]" + .. "listring[current_player;main]" + + else -- default formspec + + formspec = "size[8,9]" .. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]" .. "image_button[-0.01,4.26;1.05,0.8;protector_up_icon.png;protect_up;]" @@ -650,18 +650,18 @@ minetest.register_node("protector:chest", { .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" + end - minetest.show_formspec( - clicker:get_player_name(), - "protector:chest_" .. minetest.pos_to_string(pos), - formspec) + minetest.show_formspec(clicker:get_player_name(), + "protector:chest_" .. minetest.pos_to_string(pos), formspec) end, - on_blast = function() end, + on_blast = function() end }) -- Container transfer helper -local to_from = function(src, dst) + +local function to_from(src, dst) local stack, item, leftover local size = dst:get_size("main") @@ -688,16 +688,12 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) - if string.sub(formname, 0, 16) ~= "protector:chest_" then - return - end + if string.sub(formname, 0, 16) ~= "protector:chest_" then return end local pos_s = string.sub(formname, 17) local pos = minetest.string_to_pos(pos_s) - if minetest.is_protected(pos, player:get_player_name()) then - return - end + if minetest.is_protected(pos, player:get_player_name()) then return end local meta = minetest.get_meta(pos) ; if not meta then return end local chest_inv = meta:get_inventory() ; if not chest_inv then return end @@ -718,6 +714,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- change chest infotext to display name if fields.protect_name ~= "" then + if fields.protect_name ~= string.match(fields.protect_name, "[%w%s_-]+") + or fields.protect_name:len() > 35 then + return + end + meta:set_string("name", fields.protect_name) meta:set_string("infotext", fields.protect_name) else @@ -731,28 +732,26 @@ end) -- Protected Chest recipes if protector_crafts then - if mcl then - minetest.register_craft({ - output = "protector:chest", - recipe = { - {"mcl_chests:chest", "mcl_core:gold_ingot"} - } - }) - else - minetest.register_craft({ - output = "protector:chest", - recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"group:wood", "default:copper_ingot", "group:wood"}, - {"group:wood", "group:wood", "group:wood"} - } - }) - minetest.register_craft({ - output = "protector:chest", - recipe = { - {"default:chest", "default:copper_ingot"} - } - }) + if mcl then + + minetest.register_craft({ + output = "protector:chest", + recipe = { {"mcl_chests:chest", "mcl_core:gold_ingot"} } + }) + else + minetest.register_craft({ + output = "protector:chest", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "default:copper_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"} + } + }) + + minetest.register_craft({ + output = "protector:chest", + recipe = { {"default:chest", "default:copper_ingot"} } + }) end end diff --git a/mods/protector/hud.lua b/mods/protector/hud.lua index 4a5d7112..9aaae5df 100644 --- a/mods/protector/hud.lua +++ b/mods/protector/hud.lua @@ -1,22 +1,27 @@ -local S = protector.intllib +-- translation and protector radius + +local S = minetest.get_translator("protector") local radius = (tonumber(minetest.settings:get("protector_radius")) or 5) -- radius limiter (minetest cannot handle node volume of more than 4096000) -if radius > 22 then radius = 22 end + +if radius > 30 then radius = 30 end + +-- hud settings local hud = {} local hud_timer = 0 local hud_interval = (tonumber(minetest.settings:get("protector_hud_interval")) or 5) +local hud_style = minetest.has_feature("hud_def_type_field") if hud_interval > 0 then + minetest.register_globalstep(function(dtime) -- every 5 seconds hud_timer = hud_timer + dtime - if hud_timer < hud_interval then - return - end + if hud_timer < hud_interval then return end hud_timer = 0 for _, player in pairs(minetest.get_connected_players()) do @@ -26,11 +31,12 @@ minetest.register_globalstep(function(dtime) local hud_text = "" local protectors = minetest.find_nodes_in_area( - {x = pos.x - radius , y = pos.y - radius , z = pos.z - radius}, - {x = pos.x + radius , y = pos.y + radius , z = pos.z + radius}, - {"protector:protect","protector:protect2", "protector:protect_hidden"}) + {x = pos.x - radius , y = pos.y - radius , z = pos.z - radius}, + {x = pos.x + radius , y = pos.y + radius , z = pos.z + radius}, + {"protector:protect","protector:protect2", "protector:protect_hidden"}) if #protectors > 0 then + local npos = protectors[1] local meta = minetest.get_meta(npos) local nodeowner = meta:get_string("owner") @@ -42,8 +48,7 @@ minetest.register_globalstep(function(dtime) hud[name] = {} - hud[name].id = player:hud_add({ - hud_elem_type = "text", + local hud_tab = { name = "Protector Area", number = 0xFFFF22, position = {x = 0, y = 0.95}, @@ -51,7 +56,15 @@ minetest.register_globalstep(function(dtime) text = hud_text, scale = {x = 200, y = 60}, alignment = {x = 1, y = -1}, - }) + } + + if hud_style then + hud_tab["type"] = "text" + else + hud_tab["hud_elem_type"] = "text" + end + + hud[name].id = player:hud_add(hud_tab) return else @@ -64,4 +77,4 @@ minetest.register_on_leaveplayer(function(player) hud[player:get_player_name()] = nil end) -end +end -- END hud_interval > 0 diff --git a/mods/protector/init.lua b/mods/protector/init.lua index 6ba678e3..9252d7a4 100644 --- a/mods/protector/init.lua +++ b/mods/protector/init.lua @@ -1,30 +1,36 @@ -- default support (for use with MineClone2 and other [games] -default = default or { - node_sound_stone_defaults = function(table) end, - node_sound_wood_defaults = function(table) end, - gui_bg = "", - gui_bg_img = "", - gui_slots = "" -} --- Load support for intllib. +if not minetest.global_exists("default") then + + default = { + node_sound_stone_defaults = function(table) return {} end, + node_sound_wood_defaults = function(table) return {} end, + node_sound_metal_defaults = function(table) return {} end, + gui_bg = "", gui_bg_img = "", gui_slots = "" + } +end + +if minetest.get_modpath("mcl_sounds") then + default.node_sound_stone_defaults = mcl_sounds.node_sound_stone_defaults + default.node_sound_wood_defaults = mcl_sounds.node_sound_wood_defaults + default.node_sound_metal_defaults = mcl_sounds.node_sound_metal_defaults +end + +-- modpath, formspec helper and translator + local MP = minetest.get_modpath(minetest.get_current_modname()) local F = minetest.formspec_escape -local S = minetest.get_translator and minetest.get_translator("protector") or - dofile(MP .. "/intllib.lua") +local S = minetest.get_translator("protector") + +-- global table + +protector = { mod = "redo", modpath = MP } + +-- settings --- Load support for factions local factions_available = minetest.global_exists("factions") - -protector = { - mod = "redo", - modpath = MP, - intllib = S -} - local protector_max_share_count = 12 --- get minetest.conf settings local protector_radius = tonumber(minetest.settings:get("protector_radius")) or 5 local protector_flip = minetest.settings:get_bool("protector_flip") or false local protector_hurt = tonumber(minetest.settings:get("protector_hurt")) or 0 @@ -35,40 +41,40 @@ local protector_recipe = minetest.settings:get_bool("protector_recipe") ~= false local protector_msg = minetest.settings:get_bool("protector_msg") ~= false -- radius limiter (minetest cannot handle node volume of more than 4096000) -if protector_radius > 22 then protector_radius = 22 end +if protector_radius > 30 then protector_radius = 30 end -- get static spawn position + local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) or {x = 0, y = 2, z = 0} - -- return list of members as a table -local get_member_list = function(meta) + +local function get_member_list(meta) return meta:get_string("members"):split(" ") end - -- write member list table in protector meta as string -local set_member_list = function(meta, list) + +local function set_member_list(meta, list) meta:set_string("members", table.concat(list, " ")) end - -- check for owner name -local is_owner = function(meta, name) + +local function is_owner(meta, name) return name == meta:get_string("owner") end - -- check for member name -local is_member = function(meta, name) - if factions_available - and meta:get_int("faction_members") == 1 then +local function is_member(meta, name) + + if factions_available and meta:get_int("faction_members") == 1 then if factions.version == nil then @@ -97,43 +103,37 @@ local is_member = function(meta, name) for _, n in pairs(get_member_list(meta)) do - if n == name then - return true - end + if n == name then return true end end return false end - -- add player name to table as member -local add_member = function(meta, name) + +local function add_member(meta, name) + + -- Validate player name for MT compliance + if name ~= string.match(name, "[%w_-]+") then return end -- Constant (20) defined by player.h - if name:len() > 25 then - return - end + if name:len() > 25 then return end -- does name already exist? - if is_owner(meta, name) - or is_member(meta, name) then - return - end + if is_owner(meta, name) or is_member(meta, name) then return end local list = get_member_list(meta) - if #list >= protector_max_share_count then - return - end + if #list >= protector_max_share_count then return end table.insert(list, name) set_member_list(meta, list) end - -- remove player name from table -local del_member = function(meta, name) + +local function del_member(meta, name) local list = get_member_list(meta) @@ -148,9 +148,9 @@ local del_member = function(meta, name) set_member_list(meta, list) end - -- protector interface -local protector_formspec = function(meta) + +local function protector_formspec(meta) local formspec = "size[8,7]" .. default.gui_bg @@ -190,9 +190,7 @@ local protector_formspec = function(meta) .. ";" .. (meta:get_int("faction_members") == 1 and "true" or "false") .. "]" - if npp > 8 then - npp = 8 - end + if npp > 8 then npp = 8 end end for n = 1, #members do @@ -229,35 +227,26 @@ local protector_formspec = function(meta) return formspec end - -- check if pos is inside a protected spawn area -local inside_spawn = function(pos, radius) - if protector_spawn <= 0 then - return false - end +local function inside_spawn(pos, radius) - if pos.x < statspawn.x + radius - and pos.x > statspawn.x - radius - and pos.y < statspawn.y + radius - and pos.y > statspawn.y - radius - and pos.z < statspawn.z + radius - and pos.z > statspawn.z - radius then + if protector_spawn <= 0 then return false end + + if pos.x < statspawn.x + radius and pos.x > statspawn.x - radius + and pos.y < statspawn.y + radius and pos.y > statspawn.y - radius + and pos.z < statspawn.z + radius and pos.z > statspawn.z - radius then return true end - - return false end - -- show protection message if enabled -local show_msg = function(player, msg) + +local function show_msg(player, msg) -- if messages disabled or no player name provided - if protector_msg == false or not player or player == "" then - return - end + if protector_msg == false or not player or player == "" then return end minetest.chat_send_player(player, msg) end @@ -269,11 +258,9 @@ end -- 2 for "This area is owned by . -- 3 for checking protector overlaps -protector.can_dig = function(r, pos, digger, onlyowner, infolevel) +function protector.can_dig(r, pos, digger, onlyowner, infolevel) - if not digger or not pos then - return false - end + if not digger or not pos then return false end -- protector_bypass privileged users can override protection if infolevel == 1 @@ -287,8 +274,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) -- is spawn area protected ? if inside_spawn(pos, protector_spawn) then - show_msg(digger, - S("Spawn @1 has been protected up to a @2 block radius.", + show_msg(digger, S("Spawn @1 has been protected up to a @2 block radius.", minetest.pos_to_string(statspawn), protector_spawn)) return false @@ -296,9 +282,9 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) -- find the protector nodes local pos = minetest.find_nodes_in_area( - {x = pos.x - r, y = pos.y - r, z = pos.z - r}, - {x = pos.x + r, y = pos.y + r, z = pos.z + r}, - {"protector:protect", "protector:protect2", "protector:protect_hidden"}) + {x = pos.x - r, y = pos.y - r, z = pos.z - r}, + {x = pos.x + r, y = pos.y + r, z = pos.z + r}, + {"protector:protect", "protector:protect2", "protector:protect_hidden"}) local meta, owner, members @@ -314,8 +300,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) -- and you aren't on the member list if onlyowner or not is_member(meta, digger) then - show_msg(digger, - S("This area is owned by @1", owner) .. "!") + show_msg(digger, S("This area is owned by @1", owner) .. "!") return false end @@ -325,13 +310,12 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) if infolevel == 2 then minetest.chat_send_player(digger, - S("This area is owned by @1", owner) .. ".") + S("This area is owned by @1", owner) .. ".") minetest.chat_send_player(digger, - S("Protection located at: @1", minetest.pos_to_string(pos[n]))) + S("Protection located at: @1", minetest.pos_to_string(pos[n]))) if members ~= "" then - minetest.chat_send_player(digger, S("Members: @1.", members)) end @@ -344,7 +328,6 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) if infolevel == 2 then if #pos < 1 then - minetest.chat_send_player(digger, S("This area is not protected.")) end @@ -354,8 +337,8 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) return true end - -- add protector hurt and flip to protection violation function + minetest.register_on_protection_violation(function(pos, name) local player = minetest.get_player_by_name(name) @@ -390,21 +373,18 @@ minetest.register_on_protection_violation(function(pos, name) local pla_pos = player:get_pos() if pos.y < pla_pos.y then - - player:set_pos({ - x = pla_pos.x, - y = pla_pos.y + 0.8, - z = pla_pos.z - }) + player:set_pos({x = pla_pos.x, y = pla_pos.y + 0.8, z = pla_pos.z}) end end end end) +-- backup old is_protected function local old_is_protected = minetest.is_protected -- check for protected area, return true if protected and digger isn't on list + function minetest.is_protected(pos, digger) digger = digger or "" -- nil check @@ -418,13 +398,11 @@ function minetest.is_protected(pos, digger) return old_is_protected(pos, digger) end - -- make sure protection block doesn't overlap another protector's area -local check_overlap = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end +local function check_overlap(itemstack, placer, pointed_thing) + + if pointed_thing.type ~= "node" then return itemstack end local pos = pointed_thing.above local name = placer:get_player_name() @@ -433,8 +411,8 @@ local check_overlap = function(itemstack, placer, pointed_thing) if inside_spawn(pos, protector_spawn + protector_radius) then minetest.chat_send_player(name, - S("Spawn @1 has been protected up to a @2 block radius.", - minetest.pos_to_string(statspawn), protector_spawn)) + S("Spawn @1 has been protected up to a @2 block radius.", + minetest.pos_to_string(statspawn), protector_spawn)) return itemstack end @@ -443,41 +421,49 @@ local check_overlap = function(itemstack, placer, pointed_thing) if not protector.can_dig(protector_radius * 2, pos, name, true, 3) then minetest.chat_send_player(name, - S("Overlaps into above players protected area")) + S("Overlaps into above players protected area")) return itemstack end return minetest.item_place(itemstack, placer, pointed_thing) - end - -- remove protector display entities -local del_display = function(pos) + +local function del_display(pos) local objects = minetest.get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do - if v and v:get_luaentity() - and v:get_luaentity().name == "protector:display" then + if v and v:get_luaentity() and v:get_luaentity().name == "protector:display" then v:remove() end end end --- temporary pos store +-- temporary position store + local player_pos = {} +-- stone texture + +local stone_tex = "default_stone.png" + +if minetest.get_modpath("nc_terrain") then + stone_tex = "nc_terrain_stone.png" +end + -- protection node + minetest.register_node("protector:protect", { description = S("Protection Block") .. " (" .. S("USE for area check") .. ")", drawtype = "nodebox", tiles = { - "default_stone.png^protector_overlay.png", - "default_stone.png^protector_overlay.png", - "default_stone.png^protector_overlay.png^protector_logo.png" + stone_tex .. "^protector_overlay.png", + stone_tex .. "^protector_overlay.png", + stone_tex .. "^protector_overlay.png^protector_logo.png" }, sounds = default.node_sound_stone_defaults(), groups = {dig_immediate = 2, unbreakable = 1}, @@ -486,10 +472,7 @@ minetest.register_node("protector:protect", { light_source = 4, node_box = { - type = "fixed", - fixed = { - {-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5} - } + type = "fixed", fixed = {{-0.499 ,-0.499, -0.499, 0.499, 0.499, 0.499}} }, on_place = check_overlap, @@ -506,9 +489,7 @@ minetest.register_node("protector:protect", { on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return - end + if pointed_thing.type ~= "node" then return end protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2) @@ -519,8 +500,7 @@ minetest.register_node("protector:protect", { local meta = minetest.get_meta(pos) local name = clicker:get_player_name() - if meta - and protector.can_dig(1, pos, name, true, 1) then + if meta and protector.can_dig(1, pos, name, true, 1) then player_pos[name] = pos @@ -530,9 +510,7 @@ minetest.register_node("protector:protect", { on_punch = function(pos, node, puncher) - if minetest.is_protected(pos, puncher:get_player_name()) then - return - end + if minetest.is_protected(pos, puncher:get_player_name()) then return end minetest.add_entity(pos, "protector:display") end, @@ -548,32 +526,29 @@ minetest.register_node("protector:protect", { }) -- default recipe and alternative for MineClone2 + if protector_recipe then - if minetest.registered_items["default:stone"] then + local item_gold = "default:gold_ingot" + local item_stone = "default:stone" - minetest.register_craft({ - output = "protector:protect", - recipe = { - {"default:stone", "default:stone", "default:stone"}, - {"default:stone", "default:gold_ingot", "default:stone"}, - {"default:stone", "default:stone", "default:stone"} - } - }) - else - - minetest.register_craft({ - output = "protector:protect", - recipe = { - {"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"}, - {"mcl_core:stone", "mcl_core:gold_ingot", "mcl_core:stone"}, - {"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"} - } - }) + if minetest.get_modpath("mcl_core") then + item_gold = "mcl_core:gold_ingot" + item_stone = "mcl_core:stone" end + + minetest.register_craft({ + output = "protector:protect", + recipe = { + {item_stone, item_stone, item_stone}, + {item_stone, item_gold, item_stone}, + {item_stone, item_stone, item_stone} + } + }) end -- protection logo + minetest.register_node("protector:protect2", { description = S("Protection Logo") .. " (" .. S("USE for area check") .. ")", tiles = {"protector_logo.png"}, @@ -581,6 +556,7 @@ minetest.register_node("protector:protect2", { inventory_image = "protector_logo.png", sounds = default.node_sound_stone_defaults(), groups = {dig_immediate = 2, unbreakable = 1}, + is_ground_content = false, use_texture_alpha = "clip", paramtype = "light", paramtype2 = "wallmounted", @@ -611,9 +587,7 @@ minetest.register_node("protector:protect2", { on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return - end + if pointed_thing.type ~= "node" then return end protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2) @@ -624,8 +598,7 @@ minetest.register_node("protector:protect2", { local meta = minetest.get_meta(pos) local name = clicker:get_player_name() - if meta - and protector.can_dig(1, pos, name, true, 1) then + if meta and protector.can_dig(1, pos, name, true, 1) then player_pos[name] = pos @@ -635,9 +608,7 @@ minetest.register_node("protector:protect2", { on_punch = function(pos, node, puncher) - if minetest.is_protected(pos, puncher:get_player_name()) then - return - end + if minetest.is_protected(pos, puncher:get_player_name()) then return end minetest.add_entity(pos, "protector:display") end, @@ -653,6 +624,7 @@ minetest.register_node("protector:protect2", { }) -- recipes to switch between protectors + minetest.register_craft({ output = "protector:protect", recipe = {{"protector:protect2"}} @@ -663,20 +635,16 @@ minetest.register_craft({ recipe = {{"protector:protect"}} }) - -- check formspec buttons or when name entered + minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "protector:node" then - return - end + if formname ~= "protector:node" then return end local name = player:get_player_name() local pos = player_pos[name] - if not name or not pos then - return - end + if not name or not pos then return end local add_member_input = fields.protector_add_member @@ -695,20 +663,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- are we adding member to a protection node ? (csm protection) local nod = minetest.get_node(pos).name - if nod ~= "protector:protect" - and nod ~= "protector:protect2" then + if nod ~= "protector:protect" and nod ~= "protector:protect2" then player_pos[name] = nil return end - local meta = minetest.get_meta(pos) - - if not meta then - return - end + local meta = minetest.get_meta(pos) ; if not meta then return end -- add faction members - if factions_available then + if factions_available and fields.faction_members ~= nil then meta:set_int("faction_members", fields.faction_members == "true" and 1 or 0) end @@ -724,44 +687,46 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for field, value in pairs(fields) do if string.sub(field, 0, - string.len("protector_del_member_")) == "protector_del_member_" then + string.len("protector_del_member_")) == "protector_del_member_" then del_member(meta, - string.sub(field,string.len("protector_del_member_") + 1)) + string.sub(field,string.len("protector_del_member_") + 1)) end end minetest.show_formspec(name, formname, protector_formspec(meta)) end) - -- display entity shown when protector node is punched + minetest.register_entity("protector:display", { - physical = false, - collisionbox = {0, 0, 0, 0, 0, 0}, - visual = "wielditem", - -- wielditem seems to be scaled to 1.5 times original node size - visual_size = {x = 0.67, y = 0.67}, - textures = {"protector:display_node"}, + + initial_properties = { + physical = false, + collisionbox = {0, 0, 0, 0, 0, 0}, + visual = "wielditem", + -- wielditem seems to be scaled to 1.5 times original node size + visual_size = {x = 0.67, y = 0.67}, + textures = {"protector:display_node"}, + glow = 10 + }, + timer = 0, - glow = 10, on_step = function(self, dtime) self.timer = self.timer + dtime -- remove after set number of seconds - if self.timer > protector_show then - self.object:remove() - end + if self.timer > protector_show then self.object:remove() end end }) - -- Display-zone node, Do NOT place the display as a node, -- it is made to be used as an entity (see above) local x = protector_radius + minetest.register_node("protector:display_node", { tiles = {"protector_display.png"}, use_texture_alpha = "clip", @@ -770,42 +735,40 @@ minetest.register_node("protector:display_node", { node_box = { type = "fixed", fixed = { - -- sides - {-(x+.55), -(x+.55), -(x+.55), -(x+.45), (x+.55), (x+.55)}, + {-(x+.55), -(x+.55), -(x+.55), -(x+.45), (x+.55), (x+.55)}, -- sides {-(x+.55), -(x+.55), (x+.45), (x+.55), (x+.55), (x+.55)}, {(x+.45), -(x+.55), -(x+.55), (x+.55), (x+.55), (x+.55)}, {-(x+.55), -(x+.55), -(x+.55), (x+.55), (x+.55), -(x+.45)}, - -- top - {-(x+.55), (x+.45), -(x+.55), (x+.55), (x+.55), (x+.55)}, - -- bottom - {-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)}, - -- middle (surround protector) - {-.55,-.55,-.55, .55,.55,.55} + {-(x+.55), (x+.45), -(x+.55), (x+.55), (x+.55), (x+.55)}, -- top + {-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)}, -- bottom + {-.55,-.55,-.55, .55,.55,.55} -- middle (surrounding protector) } }, - selection_box = { - type = "regular", - }, + selection_box = {type = "regular"}, paramtype = "light", groups = {dig_immediate = 3, not_in_creative_inventory = 1}, drop = "" }) +-- load mod sections dofile(MP .. "/doors_chest.lua") dofile(MP .. "/pvp.lua") dofile(MP .. "/admin.lua") dofile(MP .. "/tool.lua") dofile(MP .. "/hud.lua") -dofile(MP .. "/lucky_block.lua") +if minetest.get_modpath("lucky_block") then + dofile(MP .. "/lucky_block.lua") +end -- stop mesecon pistons from pushing protectors + if minetest.get_modpath("mesecons_mvps") then mesecon.register_mvps_stopper("protector:protect") mesecon.register_mvps_stopper("protector:protect2") + mesecon.register_mvps_stopper("protector:protect_hidden") mesecon.register_mvps_stopper("protector:chest") end - print ("[MOD] Protector Redo loaded") diff --git a/mods/protector/intllib.lua b/mods/protector/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/protector/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/protector/license.txt b/mods/protector/license.txt index fec6f6aa..8b847139 100644 --- a/mods/protector/license.txt +++ b/mods/protector/license.txt @@ -19,3 +19,15 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Original doors mod code (WTFPL license) + +Textures by TenPlus1 (CC0) unless mentioned below + +Textures from original Minetest doors mod (CC-BY-SA 3.0) + doors_*.png +..default_chest*.png + +Textures by Sirrobzeroone (CC0) + protector_tool.png diff --git a/mods/protector/locale/de.po b/mods/protector/locale/de.po deleted file mode 100644 index 478a9ca3..00000000 --- a/mods/protector/locale/de.po +++ /dev/null @@ -1,182 +0,0 @@ -# German translation for PROTECTOR MOD. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the PROTECTOR MOD package. -# Xanthin , 2016. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Entferne Störschützer von bestimmten Namen in der Nähe von Spielern (trenne " -"Namen durch Leerzeichen)" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "Ersetze Besitzer der Störschützer mit neuem Besitzer" - -#: admin.lua -msgid " " -msgstr " " - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "Ersetze Besitzer der Störschützer von '@1' mit '@2'" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "Zeige geschützte Bereiche der Störschützer in der Nähe" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Störschutznamen zum Entfernen: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "Namensliste zurückgesetzt" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Geschützte Holztür" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Geschützte Stahltür" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Geschützte Falltür" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Geschützte Stahlfalltür" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Geschützte Truhe" - -#: doors_chest.lua -msgid "To Chest" -msgstr "Zur Truhe" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "Zum Inventar" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Geschützte Truhe (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "-- Störschutz-Interface --" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "SCHLAGE Node, um geschützten Bereich anzuzeigen oder" - -#: init.lua -msgid "USE for area check" -msgstr "BENUTZE für Bereichsprüfung" - -#: init.lua -msgid "Members:" -msgstr "Mitglieder:" - -#: init.lua -msgid "Close" -msgstr "Schließen" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Störschutz befindet sich bei: @1" - -#: init.lua -msgid "Members: @1." -msgstr "Mitglieder: @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Dieser Bereich ist nicht geschützt." - -#: init.lua -msgid "You can build here." -msgstr "Du kannst hier bauen." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "Überlappung im geschützen Bereich eines Spielers" - -#: init.lua -msgid "Protection Block" -msgstr "Störschutzblock" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Störschutz (gehört @1)" - -#: init.lua -msgid "Protection Logo" -msgstr "Störschutzlogo" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Protector Redo geladen" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "Spawn @1 ist geschützt mit einem Radius von @2 Blöcke." - -#: init.lua -msgid "This area is owned by @1" -msgstr "Dieser Bereich gehört @1" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "on_punchplayer wurde durch \"nil objects\" aufgerufen" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "pvp_protect ist nicht aktiv, aktualisiere deine Minetestversion" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "pvp_protect ist ausgeschaltet" - -#: hud.lua -msgid "Owner: @1" -msgstr "Besitzer: @1" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" -"Störschutz Platzier-Werkzeug (stehe neben Störschutz, schaue in die " -"gewünschte Richtung und anwenden)" - -#: tool.lua -msgid "Protector already in place!" -msgstr "Störschutz is bereits platziert!" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "Keine Störschützer mehr im Inventar!" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Störschutz befindet sich bei: @1" diff --git a/mods/protector/locale/es.po b/mods/protector/locale/es.po deleted file mode 100644 index 3cf20897..00000000 --- a/mods/protector/locale/es.po +++ /dev/null @@ -1,177 +0,0 @@ -# Spanish translation for PROTECTOR MOD. -# Copyright (C) 2018 universales -# This file is distributed under the same license as the PROTECTOR MOD package. -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: 2020-02-27\n" -"Last-Translator: Universales\n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Eliminar protectores alrededor de los jugadores (nombres separados con espacios)" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "Reemplace el propietario del protector con el nombre proporcionado" - -#: admin.lua -msgid " " -msgstr " " - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "Reemplazando el nombre del protector '@1' a '@2'" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "Mostrar áreas protegidas de sus protectores cercanos" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Nombres de protectores para eliminar: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "Restablecer lista de nombres" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Puerta de madera protegida" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Puerta de hierro protegida" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Trampilla Protegida" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Trampilla de hierro protegida" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Cofre protegido" - -#: doors_chest.lua -msgid "To Chest" -msgstr "Al cofre" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "Al inventario" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Cofre protegido (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "-- Interfaz del protector --" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "nodo de perforación para mostrar el área protegida" - -#: init.lua -msgid "USE for area check" -msgstr "Usar para chequeo del área" - -#: init.lua -msgid "Members:" -msgstr "Miembros:" - -#: init.lua -msgid "Close" -msgstr "Cerrar" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Protección ubicada en: @1" - -#: init.lua -msgid "Members: @1." -msgstr "Miembros: @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Esta área no está protegida." - -#: init.lua -msgid "You can build here." -msgstr "Puedes construir aquí." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "Se superpone en el área protegida de los jugadores anteriores" - -#: init.lua -msgid "Protection Block" -msgstr "Bloque de protección" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Protegido (Propiedad de @1)" - -#: init.lua -msgid "Protection Logo" -msgstr "Logotipo de la protección" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Protector recargado" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "Spawn @1 ha sido protegido hasta un radio de bloque @2." - -#: init.lua -msgid "This area is owned by @1" -msgstr "Esta área es propiedad de @1" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "[Protector] on_punchplayer llamado con objetos nulos." - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "[Protector] pvp_protect no está activo, actualiza tu versión de Minetest" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "[Protector] pvp_protect está deshabilitado" - -#: hud.lua -msgid "Owner: @1" -msgstr "Propietario: @1" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" -"Herramienta de colocación del protector (pararse cerca del protector, dirección de la cara y uso) " - -#: tool.lua -msgid "Protector already in place!" -msgstr "¡El protector ya está en este lugar!" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "¡No hay protectores disponibles para colocar!" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Protector colocado en @1" diff --git a/mods/protector/locale/fr.po b/mods/protector/locale/fr.po deleted file mode 100644 index 2452ee49..00000000 --- a/mods/protector/locale/fr.po +++ /dev/null @@ -1,183 +0,0 @@ -# French translation for PROTECTOR MOD. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the PROTECTOR MOD package. -# Doloment, 2017. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Retirer les protecteurs près des joueurs avec les noms fournis (noms séparés " -"avec des espaces)" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "" - -#: admin.lua -msgid " " -msgstr "" - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Noms de protecteurs à supprimer: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "Liste de noms réinitialiser" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Porte en bois protégée" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Porte en acier protégée" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Trappe protégé" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Trap en acier protégé" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Coffre protégé" - -#: doors_chest.lua -msgid "To Chest" -msgstr "Vers le coffre" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "Vers l'inventaire" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Coffre protégé (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "-- Interface Protector --" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "TAPÉ le bloc pour afficher la zone protégée" - -#: init.lua -msgid "USE for area check" -msgstr "UTILISER pour vérifier la zone" - -#: init.lua -msgid "Members:" -msgstr "Membres:" - -#: init.lua -msgid "Close" -msgstr "Fermer" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Protection située à: @1" - -#: init.lua -msgid "Members: @1." -msgstr "Membres: @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Cette zone n'est pas protégée." - -#: init.lua -msgid "You can build here." -msgstr "Vous pouvez construire ici." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "Vous chevauché une zone protégé." - -#: init.lua -msgid "Protection Block" -msgstr "Bloc de protection" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Protection (détenue par @1)" - -#: init.lua -msgid "Protection Logo" -msgstr "Logo de protection" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Protector Redo chargé" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "" - -#: init.lua -#, fuzzy -msgid "This area is owned by @1" -msgstr "Cette zone appartient à @1!" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "[Protector] on_punchplayer appelé avec des objets nil" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "" -"[Protector] pvp_protect est désactivé, mettez à jour votre version de " -"Minetest" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "[Protector] pvp_protect est désactivé" - -#: hud.lua -msgid "Owner: @1" -msgstr "" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" - -#: tool.lua -msgid "Protector already in place!" -msgstr "" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Protection située à: @1" diff --git a/mods/protector/locale/it.po b/mods/protector/locale/it.po deleted file mode 100644 index 97145f40..00000000 --- a/mods/protector/locale/it.po +++ /dev/null @@ -1,180 +0,0 @@ -# Italian translation for PROTECTOR MOD. -# Copyright (C) 2020 Hamlet -# This file is distributed under the same license as the PROTECTOR MOD package. -# Xanthin , 2016. -# CodeXP , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: Hamlet \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: it\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Elimina i protettori attorno ai giocatori (separa i nomi con gli spazi)" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "Sostituisci il proprietario del protettore col nome fornito" - -#: admin.lua -msgid " " -msgstr " " - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "Sostituzione del nome del protettore '@1' con '@2'" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "Mostra le aree protette dei protettori vicino a te" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Nomi dei protettori da eliminare: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "Azzera l'elenco dei nomi" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Porta di legno protetta" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Porta d'acciaio protetta" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Botola protetta" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Botola d'acciaio protetta" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Baule protetto" - -#: doors_chest.lua -msgid "To Chest" -msgstr "Al baule" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "All'inventario" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Baule protetto (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "-- Interfaccia protettore --" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "COLPISCI il nodo per mostrare l'area protetta" - -#: init.lua -msgid "USE for area check" -msgstr "USA per controllare l'area" - -#: init.lua -msgid "Members:" -msgstr "Membri:" - -#: init.lua -msgid "Close" -msgstr "Chiudi" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Protezione collocata a: @1" - -#: init.lua -msgid "Members: @1." -msgstr "Membri: @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Quest'area non è protetta." - -#: init.lua -msgid "You can build here." -msgstr "Qui puoi costruire." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "Si sovrappone ad un'area sovrastante protetta dai giocatori" - -#: init.lua -msgid "Protection Block" -msgstr "Blocco di protezione" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Protezione (di proprietà di @1)" - -#: init.lua -msgid "Protection Logo" -msgstr "Logo di protezione" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Protector Redo caricato" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "Lo spawn @1 è stato protetto fino a un raggio di @2 blocchi." - -#: init.lua -msgid "This area is owned by @1" -msgstr "Quest'area è di proprietà di @1" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "[Protector] on_punchplayer chiamato con oggetti nil" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "[Protector] pvp_protect non attiva, aggiorna la tua versione di Minetest" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "[Protector] pvp_protect è disattivato" - -#: hud.lua -msgid "Owner: @1" -msgstr "Proprietario: @1" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "Strumento di posizionamento protettore (stai vicino al protettore, guarda la direzione e usa)" - -#: tool.lua -msgid "Protector already in place!" -msgstr "Protettore già presente!" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "Nessun protettore disponibile da posizionare!" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Protettore posizionato a @1" \ No newline at end of file diff --git a/mods/protector/locale/protector.tr.tr b/mods/protector/locale/protector.tr.tr index 51e8fb38..368e6248 100644 --- a/mods/protector/locale/protector.tr.tr +++ b/mods/protector/locale/protector.tr.tr @@ -7,7 +7,7 @@ Remove Protectors around players (separate names with spaces)=Ismi verilen oyunc = Replace Protector Owner with name provided=Koruyucu Sahibini belirtilen adla değiştirin = -Replacing Protector name '@1' with '@2'='@ 1' Koruyucu adını '@ 2' ile değiştirin +Replacing Protector name '@1' with '@2'='@1' Koruyucu adını '@2' ile değiştirin Show protected areas of your nearby protectors=Yakındaki koruyucuların korunan alanlarını göster Protector Names to remove: @1=Silinecek korumaların isimleri: @1 Name List Reset=İsim listesini sıfırla diff --git a/mods/protector/locale/ru.po b/mods/protector/locale/ru.po deleted file mode 100644 index 19673bf4..00000000 --- a/mods/protector/locale/ru.po +++ /dev/null @@ -1,183 +0,0 @@ -# Russian translation for PROTECTOR MOD. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the PROTECTOR MOD package. -# Doloment, 2017. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Удалить защиту рядом с игроками (перечислить имена, разделяя пробелами)" - -#: admin.lua -msgid "" -msgstr "<список имён>" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "Заменить владельца защиты новым владельцем" - -#: admin.lua -msgid " " -msgstr "<имя владельца> <имя нового владельца>" - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "Заменяется владелец защиты с '@1' на '@2'" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "Показать защищенные территории с ближней защитой" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Имена защит, подлежащих удалению: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "Сброс списка имен" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Защищенная яблоневая дверь" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Защищенная стальная дверь" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Защищенный яблоневый люк" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Защищенный стальной люк" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Защищенный сундук" - -#: doors_chest.lua -msgid "To Chest" -msgstr "В сундук" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "В инвентрарь" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Защищенный сундук (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "-- Настройка защиты --" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "СТУКНУТЬ узел для подсведки защищенной территории" - -#: init.lua -msgid "USE for area check" -msgstr "ЛКМ для проверки защищенной территории" - -#: init.lua -msgid "Members:" -msgstr "Участники:" - -#: init.lua -msgid "Close" -msgstr "Закрыть" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Защита находится на координатах @1" - -#: init.lua -msgid "Members: @1." -msgstr "Участники: @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Территория свободна." - -#: init.lua -msgid "You can build here." -msgstr "Здесь можно ставить блоки." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "" -"Защитный блок не может быть установлен: пересечение с областями, защищенными " -"другими игроками" - -#: init.lua -msgid "Protection Block" -msgstr "Защитный блок" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Защита игрока @1" - -#: init.lua -msgid "Protection Logo" -msgstr "Защитный знак" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Модификация \"Переделанная Защита\" загружена" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "Спаун @1 защищен в радиусе @2 блока." - -#: init.lua -msgid "This area is owned by @1" -msgstr "Эта территория пренадлежит @1" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "[Защита] on_punchplayer вызвана с нулевыми объектами" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "[Защита] pvp_protect не активен, обновите версию Minetest" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "[Защита] pvp_protect отключен" - -#: hud.lua -msgid "Owner: @1" -msgstr "Владелец: @1" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" -"Инструмент установки защиты (станьте рядом с защитой, повернитесь в нужное " -"направление и используйте)" - -#: tool.lua -msgid "Protector already in place!" -msgstr "Защита уже установлена!" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "У вас нет защитных блоков в инвентаре!" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Защита находится на координатах @1" diff --git a/mods/protector/locale/template.pot b/mods/protector/locale/template.pot deleted file mode 100644 index c8930518..00000000 --- a/mods/protector/locale/template.pot +++ /dev/null @@ -1,179 +0,0 @@ -# Template for PROTECTOR MOD. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the PROTECTOR MOD package. -# Xanthin , 2016. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "" - -#: admin.lua -msgid " " -msgstr "" - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "" - -#: admin.lua -msgid "Name List Reset" -msgstr "" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "" - -#: doors_chest.lua -msgid "To Chest" -msgstr "" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "" - -#: init.lua -msgid "-- Protector interface --" -msgstr "" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "" - -#: init.lua -msgid "USE for area check" -msgstr "" - -#: init.lua -msgid "Members:" -msgstr "" - -#: init.lua -msgid "Close" -msgstr "" - -#: init.lua -msgid "Protection located at: @1" -msgstr "" - -#: init.lua -msgid "Members: @1." -msgstr "" - -#: init.lua -msgid "This area is not protected." -msgstr "" - -#: init.lua -msgid "You can build here." -msgstr "" - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "" - -#: init.lua -msgid "Protection Block" -msgstr "" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "" - -#: init.lua -msgid "Protection Logo" -msgstr "" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "" - -#: init.lua -msgid "This area is owned by @1" -msgstr "" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "" - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "" - -#: hud.lua -msgid "Owner: @1" -msgstr "" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" - -#: tool.lua -msgid "Protector already in place!" -msgstr "" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "" diff --git a/mods/protector/locale/tr.po b/mods/protector/locale/tr.po deleted file mode 100644 index 34341141..00000000 --- a/mods/protector/locale/tr.po +++ /dev/null @@ -1,180 +0,0 @@ -# Turkish translation for PROTECTOR MOD. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the PROTECTOR MOD package. -# mahmutelmas06, 2016. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROTECTOR MOD\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-10 17:33+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: admin.lua -msgid "Remove Protectors around players (separate names with spaces)" -msgstr "Ismi verilen oyuncuların yanındaki korumaları kaldır. (İsimleri boşlukla " -"ayır)" - -#: admin.lua -msgid "" -msgstr "" - -#: admin.lua -msgid "Replace Protector Owner with name provided" -msgstr "" - -#: admin.lua -msgid " " -msgstr "" - -#: admin.lua -msgid "Replacing Protector name '@1' with '@2'" -msgstr "" - -#: admin.lua -msgid "Show protected areas of your nearby protectors" -msgstr "" - -#: admin.lua -msgid "Protector Names to remove: @1" -msgstr "Silinecek korumaların isimleri: @1" - -#: admin.lua -msgid "Name List Reset" -msgstr "İsim listesini sıfırla" - -#: doors_chest.lua -msgid "Protected Wooden Door" -msgstr "Korumalı ahşap kapı" - -#: doors_chest.lua -msgid "Protected Steel Door" -msgstr "Korumalı çelik kapı" - -#: doors_chest.lua -msgid "Protected Trapdoor" -msgstr "Korumalı tuzak kapısı" - -#: doors_chest.lua -msgid "Protected Steel Trapdoor" -msgstr "Korumalı çelik tuzak kapısı" - -#: doors_chest.lua -msgid "Protected Chest" -msgstr "Korumalı sandık" - -#: doors_chest.lua -msgid "To Chest" -msgstr "Sandığa" - -#: doors_chest.lua -msgid "To Inventory" -msgstr "Envantere" - -#: doors_chest.lua -msgid "Protected Chest (@1)" -msgstr "Korumalı sandık (@1)" - -#: init.lua -msgid "-- Protector interface --" -msgstr "" - -#: init.lua -msgid "PUNCH node to show protected area" -msgstr "Korunan alanı göstermek için yumruk" - -#: init.lua -msgid "USE for area check" -msgstr "Bölge kontrolü için kullan" - -#: init.lua -msgid "Members:" -msgstr "Üyeler" - -#: init.lua -msgid "Close" -msgstr "Kapat" - -#: init.lua -msgid "Protection located at: @1" -msgstr "Korumanın bulunduğu yer @1" - -#: init.lua -msgid "Members: @1." -msgstr "Üyeler @1." - -#: init.lua -msgid "This area is not protected." -msgstr "Bu alan korumalı değildir." - -#: init.lua -msgid "You can build here." -msgstr "Buraya inşaa edebilirsiniz." - -#: init.lua tool.lua -msgid "Overlaps into above players protected area" -msgstr "" - -#: init.lua -msgid "Protection Block" -msgstr "Koruma kutusu" - -#: admin.lua init.lua tool.lua -msgid "Protection (owned by @1)" -msgstr "Koruma (@1 sahibidir)" - -#: init.lua -msgid "Protection Logo" -msgstr "Koruma arması" - -#: init.lua -msgid "[MOD] Protector Redo loaded" -msgstr "[MOD] Protector Redo yüklendi" - -#: init.lua -msgid "Spawn @1 has been protected up to a @2 block radius." -msgstr "" - -#: init.lua -msgid "This area is owned by @1" -msgstr "Burasının sahibi @1!" - -#: pvp.lua -msgid "[Protector] on_punchplayer called with nil objects" -msgstr "[Protector] on_punchplayer boş objelerle çağrıldı" - -#: pvp.lua -msgid "[Protector] pvp_protect not active, update your version of Minetest" -msgstr "[Protector] pvp_protect aktif değil, Minetest sürümünüzü güncelleyin." - -#: pvp.lua -msgid "[Protector] pvp_protect is disabled" -msgstr "[Protector] pvp_protect kapatıldı." - -#: hud.lua -msgid "Owner: @1" -msgstr "" - -#: tool.lua -msgid "Protector Placer Tool (stand near protector, face direction and use)" -msgstr "" - -#: tool.lua -msgid "Protector already in place!" -msgstr "" - -#: tool.lua -msgid "No protectors available to place!" -msgstr "" - -#: tool.lua -msgid "Protector placed at @1" -msgstr "Korumanın bulunduğu yer @1" diff --git a/mods/protector/lucky_block.lua b/mods/protector/lucky_block.lua index 8e17614f..b466c61d 100644 --- a/mods/protector/lucky_block.lua +++ b/mods/protector/lucky_block.lua @@ -1,18 +1,15 @@ -- add lucky blocks -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"protector:protect"}, 3}, - {"dro", {"protector:protect2"}, 3}, - {"dro", {"protector:door_wood"}, 1}, - {"dro", {"protector:door_steel"}, 1}, - {"exp", 5, true}, - {"dro", {"protector:trapdoor"}, 1}, - {"dro", {"protector:trapdoor_steel"}, 1}, - {"dro", {"protector:tool"}, 1}, - {"dro", {"protector:chest"}, 1}, - {"exp"} - }) -end +lucky_block:add_blocks({ + {"dro", {"protector:protect"}, 3}, + {"dro", {"protector:protect2"}, 3}, + {"dro", {"protector:door_wood"}, 1}, + {"dro", {"protector:door_steel"}, 1}, + {"exp", 5, true}, + {"dro", {"protector:trapdoor"}, 1}, + {"dro", {"protector:trapdoor_steel"}, 1}, + {"dro", {"protector:tool"}, 1}, + {"dro", {"protector:chest"}, 1}, + {"exp"} +}) diff --git a/mods/protector/mod.conf b/mods/protector/mod.conf index 774f1a18..3c3abb6c 100644 --- a/mods/protector/mod.conf +++ b/mods/protector/mod.conf @@ -1,3 +1,4 @@ name = protector description = Lets players craft special blocks to protect their builds or disable PVP in areas. -optional_depends = default, intllib, lucky_block, mesecons_mvps, playerfactions +optional_depends = default, lucky_block, mesecons_mvps, playerfactions, mcl_core, mcl_formspec, mcl_sounds +min_minetest_version = 5.0 diff --git a/mods/protector/pvp.lua b/mods/protector/pvp.lua index 529fb1ae..68604673 100644 --- a/mods/protector/pvp.lua +++ b/mods/protector/pvp.lua @@ -1,18 +1,20 @@ -local S = protector.intllib - -- get static spawn position + local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) or {x = 0, y = 2, z = 0} -- is spawn protected + local protector_spawn = tonumber(minetest.settings:get("protector_spawn") - or minetest.settings:get("protector_pvp_spawn")) or 0 + or minetest.settings:get("protector_pvp_spawn")) or 0 -- is night-only pvp enabled + local protector_night_pvp = minetest.settings:get_bool("protector_night_pvp") -- disables PVP in your own protected areas + if minetest.settings:get_bool("enable_pvp") and minetest.settings:get_bool("protector_pvp") then @@ -21,15 +23,13 @@ and minetest.settings:get_bool("protector_pvp") then minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - if not player - or not hitter then - print("[Protector] on_punchplayer called with nil objects") - end - - if not hitter:is_player() then + if not player or not hitter then + print("[MOD] Protector - on_punchplayer called with nil objects") return false end + if not hitter:is_player() then return false end + -- no pvp at spawn area local pos = player:get_pos() @@ -64,9 +64,9 @@ and minetest.settings:get_bool("protector_pvp") then end) else - print("[Protector] pvp_protect not active, update your version of Minetest") + print("[MOD] Protector - pvp_protect not active, update your version of Minetest") end else - print("[Protector] pvp_protect is disabled") + print("[MOD] Protector - pvp_protect is disabled") end diff --git a/mods/protector/screenshot.jpg b/mods/protector/screenshot.jpg new file mode 100644 index 00000000..6d01d9c6 Binary files /dev/null and b/mods/protector/screenshot.jpg differ diff --git a/mods/protector/screenshot.png b/mods/protector/screenshot.png deleted file mode 100644 index 641c5f2e..00000000 Binary files a/mods/protector/screenshot.png and /dev/null differ diff --git a/mods/protector/settingtypes.txt b/mods/protector/settingtypes.txt index 723efd4d..7cd6b559 100644 --- a/mods/protector/settingtypes.txt +++ b/mods/protector/settingtypes.txt @@ -1,5 +1,5 @@ # Size of protected area around protection node limiting player interaction -protector_radius (Protector Radius [max 22]) int 5 +protector_radius (Protector Radius [max 30]) int 5 # Flips player around when accessing protected area to stop lag griefing protector_flip (Protector Flip) bool false diff --git a/mods/protector/textures/protector_tool.png b/mods/protector/textures/protector_tool.png new file mode 100644 index 00000000..d2112d67 Binary files /dev/null and b/mods/protector/textures/protector_tool.png differ diff --git a/mods/protector/tool.lua b/mods/protector/tool.lua index 3aae1f78..541f5b95 100644 --- a/mods/protector/tool.lua +++ b/mods/protector/tool.lua @@ -1,17 +1,21 @@ -- protector placement tool (thanks to Shara for code and idea) -local S = protector.intllib +local S = minetest.get_translator("protector") -- get protection radius + local r = tonumber(minetest.settings:get("protector_radius")) or 5 -- radius limiter (minetest cannot handle node volume of more than 4096000) -if r > 22 then r = 22 end + +if r > 30 then r = 30 end + +-- protector placement tool minetest.register_craftitem("protector:tool", { description = S("Protector Placer Tool (stand near protector, face direction and use)"), - inventory_image = "protector_display.png^protector_logo.png", + inventory_image = "protector_tool.png", stack_max = 1, on_use = function(itemstack, user, pointed_thing) @@ -21,8 +25,8 @@ minetest.register_craftitem("protector:tool", { -- check for protector near player (2 block radius) local pos = user:get_pos() local pp = minetest.find_nodes_in_area( - vector.subtract(pos, 2), vector.add(pos, 2), - {"protector:protect", "protector:protect2", "protector:protect_hidden"}) + vector.subtract(pos, 2), vector.add(pos, 2), + {"protector:protect", "protector:protect2", "protector:protect_hidden"}) if #pp == 0 then return end -- none found @@ -62,24 +66,26 @@ minetest.register_craftitem("protector:tool", { if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then minetest.chat_send_player(name, - S("Overlaps into above players protected area")) + S("Overlaps into above players protected area")) return end -- does a protector already exist ? - if #minetest.find_nodes_in_area( - vector.subtract(pos, 1), vector.add(pos, 1), - {"protector:protect", "protector:protect2", - "protector:protect_hidden"}) > 0 then + if #minetest.find_nodes_in_area(vector.subtract(pos, 1), vector.add(pos, 1), + {"protector:protect", "protector:protect2", + "protector:protect_hidden"}) > 0 then minetest.chat_send_player(name, S("Protector already in place!")) return end - -- do not place protector out of map bounds - if minetest.find_node_near(pos, 1, {"ignore"}) then + -- do not place protector out of map bounds or replace bedrock + if #minetest.find_nodes_in_area(pos, pos, {"ignore", "mcl_core:bedrock"}) > 0 then + + minetest.chat_send_player(name, S("Out of bounds!")) + return end @@ -114,17 +120,17 @@ minetest.register_craftitem("protector:tool", { local inv = minetest.get_inventory({type = "node", pos = pos}) if inv then - minetest.chat_send_player(name, - S("Cannot place protector, container at") .. + minetest.chat_send_player(name, S("Cannot place protector, container at") .. " " .. minetest.pos_to_string(pos)) return end -- protection check for other mods like Areas if minetest.is_protected(pos, name) then + minetest.chat_send_player(name, - S("Cannot place protector, already protected at") .. - " " .. minetest.pos_to_string(pos)) + S("Cannot place protector, already protected at") + .. " " .. minetest.pos_to_string(pos)) return end @@ -147,18 +153,17 @@ minetest.register_craftitem("protector:tool", { minetest.chat_send_player(name, S("Protector placed at") .. " " .. minetest.pos_to_string(pos)) - - end, + end }) -- tool recipe + local df = "default:steel_ingot" -if not minetest.registered_items[df] then +if minetest.get_modpath("mcl_core") then df = "mcl_core:iron_ingot" end - minetest.register_craft({ output = "protector:tool", recipe = { diff --git a/mods/regrow/description.txt b/mods/regrow/description.txt deleted file mode 100644 index 2a4a26b8..00000000 --- a/mods/regrow/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod helps to regrow tree fruits instead of replanting saplings. \ No newline at end of file diff --git a/mods/regrow/init.lua b/mods/regrow/init.lua index fa300ff4..29aa7481 100644 --- a/mods/regrow/init.lua +++ b/mods/regrow/init.lua @@ -1,7 +1,13 @@ -regrow = {} +-- setup global with min and max growth invertals from settings + +regrow = { + min_interval = tonumber(minetest.settings:get("regrow_min_interval")) or 600, + max_interval = tonumber(minetest.settings:get("regrow_max_interval")) or 1200 +} -- hidden node that runs timer and regrows fruit stored in meta + minetest.register_node("regrow:hidden", { drawtype = "airlike", paramtype = "light", @@ -13,10 +19,10 @@ minetest.register_node("regrow:hidden", { drop = "", groups = {not_in_creative_inventory = 1}, - -- once placed start random timer between 20 and 30 minutes + -- once placed start random timer between min and max interval setting on_construct = function(pos) - local time = math.random(60 * 20, 60 * 30) + local time = math.random(regrow.min_interval, regrow.max_interval) minetest.get_node_timer(pos):start(time) end, @@ -26,39 +32,44 @@ minetest.register_node("regrow:hidden", { local meta = minetest.get_meta(pos) - if not meta then - return - end + if not meta then return end local fruit = meta:get_string("fruit") or "" local leaf = meta:get_string("leaf") or "" + local p2 = meta:get_int("p2") or 0 if fruit == "" or leaf == "" or not minetest.find_node_near(pos, 1, leaf) then fruit = "air" end - minetest.set_node(pos, {name = fruit}) + minetest.set_node(pos, {name = fruit, param2 = p2}) end }) --- helper function to register fruit nodes -regrow.add_fruit = function(nodename, leafname) +-- global function to register fruit nodes + +regrow.add_fruit = function(nodename, leafname, ignore_param2) -- does node actually exist ? - if not minetest.registered_nodes[nodename] then - return - end + if not minetest.registered_nodes[nodename] then return end + + -- change attached_node values so fruits regrow instead of dropping + local def = minetest.registered_nodes[nodename] + local groups = def.groups and table.copy(def.groups) or {} + + groups.attached_node = 0 - -- override after_dig_node to start regrowth minetest.override_item(nodename, { + -- override on_dig to remove any special functions + on_dig = minetest.node_dig, + + -- override after_dig_node to start regrowth after_dig_node = function(pos, oldnode, oldmetadata, digger) -- if node has been placed by player then do not regrow - if oldnode.param2 > 0 then - return - end + if ignore_param2 ~= true and oldnode.param2 > 0 then return end -- replace fruit with regrowth node, set fruit & leaf name minetest.set_node(pos, {name = "regrow:hidden"}) @@ -67,19 +78,79 @@ regrow.add_fruit = function(nodename, leafname) meta:set_string("fruit", nodename) meta:set_string("leaf", leafname) + meta:set_int("p2", (oldnode.param2 or 0)) end, }) end --- wait until mods are loaded to save dependency mess -minetest.after(0.1, function() +-- override fruits helper +local function add_fruits() + + -- default regrow.add_fruit("default:apple", "default:leaves") + + -- ethereal regrow.add_fruit("ethereal:banana", "ethereal:bananaleaves") + regrow.add_fruit("ethereal:banana_bunch", "ethereal:bananaleaves") regrow.add_fruit("ethereal:orange", "ethereal:orange_leaves") regrow.add_fruit("ethereal:coconut", "ethereal:palmleaves") regrow.add_fruit("ethereal:lemon", "ethereal:lemon_leaves") regrow.add_fruit("ethereal:olive", "ethereal:olive_leaves") --- regrow.add_fruit("ethereal:golden_apple", "ethereal:yellowleaves") +-- regrow.add_fruit("ethereal:golden_apple", "ethereal:yellowleaves") -- too OP -end) + -- cool trees + regrow.add_fruit("cacaotree:pod", "cacaotree:trunk", true) + regrow.add_fruit("cherrytree:cherries", "cherrytree:blossom_leaves") + regrow.add_fruit("clementinetree:clementine", "clementinetree:leaves") + regrow.add_fruit("ebony:persimmon", "ebony:leaves") + regrow.add_fruit("lemontree:lemon", "lemontree:leaves") + regrow.add_fruit("oak:acorn", "oak:leaves") + regrow.add_fruit("palm:coconut", "palm:leaves") +-- regrow.add_fruit("plumtree:plum", "plumtree:leaves") -- regrows already + regrow.add_fruit("pomegranate:pomegranate", "pomegranate:leaves") + regrow.add_fruit("chestnuttree:bur", "chestnuttree:leaves") + + -- farming plus + regrow.add_fruit("farming_plus:cocoa", "farming_plus:cocoa_leaves") + regrow.add_fruit("farming_plus:banana", "farming_plus:banana_leaves") + + -- aotearoa + regrow.add_fruit("aotearoa:karaka_fruit", "aotearoa:karaka_leaves") + regrow.add_fruit("aotearoa:miro_fruit", "aotearoa:miro_leaves") + regrow.add_fruit("aotearoa:tawa_fruit", "aotearoa:tawa_leaves") + regrow.add_fruit("aotearoa:hinau_fruit", "aotearoa:hinau_leaves") + regrow.add_fruit("aotearoa:kawakawa_fruit", "aotearoa:kawakawa_leaves") + + -- australia + regrow.add_fruit("australia:cherry", "australia:cherry_leaves") + regrow.add_fruit("australia:lilly_pilly_berries", "australia:lilly_pilly_leaves") + regrow.add_fruit("australia:macadamia", "australia:macadamia_leaves") + regrow.add_fruit("australia:mangrove_apple", "australia:mangrove_apple_leaves") + regrow.add_fruit("australia:moreton_bay_fig", "australia:moreton_bay_fig_leaves") + regrow.add_fruit("australia:quandong", "australia:quandong_leaves") + + -- more trees + regrow.add_fruit("moretrees:acorn", "moretrees:oak_leaves") + regrow.add_fruit("moretrees:cedar_cone", "moretrees:cedar_leaves") + regrow.add_fruit("moretrees:fir_cone", "moretrees:fir_leaves") + regrow.add_fruit("moretrees:spruce_cone", "moretrees:spruce_leaves") + + -- xnether + regrow.add_fruit("xnether:fruit", "xnether:blue_leaves") + + -- multibiomegen + for f = 0, 230 do + regrow.add_fruit("multibiomegen:fruit_" .. f, "multibiomegen:leaf_" .. f) + end +end + +-- wait until mods are loaded to save dependency mess + +if minetest.register_on_mods_loaded then + minetest.register_on_mods_loaded(add_fruits) +else + minetest.after(0, add_fruits) +end + +print("[MOD] Regrow loaded") diff --git a/mods/regrow/mod.conf b/mods/regrow/mod.conf index 3d055c33..4951a1fe 100644 --- a/mods/regrow/mod.conf +++ b/mods/regrow/mod.conf @@ -1,4 +1,3 @@ name = regrow -depends = -optional_depends = -description = This mod helps to regrow tree fruits instead of replanting saplings. +description = Helps to regrow tree fruits instead of replanting saplings. +min_minetest_version = 5.0 diff --git a/mods/regrow/readme.MD b/mods/regrow/readme.MD index 8a5f9add..6298f3a9 100644 --- a/mods/regrow/readme.MD +++ b/mods/regrow/readme.MD @@ -1,27 +1,118 @@ -REGROW ------- +minetest mod REGROW +=================== + +Mod to regrow fruits with self-contained API + +## Information +----------- This mod helps to regrow tree fruits instead of the need for replanting saplings each time. -USAGE ------ +![screenshot.jpg](screenshot.jpg) -The regrow.add_fruit() function is used to override each fruits after_dig_node -function so that an invisible node is placed once it is taken, then a timer is + +## Technical info +-------------- + +This mod is named `regrow` a simplified optimized version +of fruits nodes to reappears on place after dig using timer parameters. + +#### Dependences + +none, core minetest api, the mod has a node detection inside the api function +so its secure to use no matter if the corresponding node exits or not. + +### Configuration + +Each fruit will grow depending of the minimun and maximun value, +the time the fruit appears is random between the two configured values: + +| setting name | description | type | default | observations | +| ------------------- | ----------------------- | --- | ------- | ----------- | +| regrow_min_interval | Minimum Regrow Interval | int | 600 | Seconds | +| regrow_max_interval | Maximum Regrow Interval | int | 1200 | seconds | + +### Overview: + +Based on "endless_apples" by Shara RedCat (2018). Its starting +at https://forum.minetest.net/viewtopic.php?p=379158#p379158 to solve +an issue over growing fruits and now is mantained. + +The mod works as is but can be used for other mods, currently the mod +has support for `ethereal`, `farming_plus`, `australia`, `aotearoa`, +and `moretrees`. It also support some special others. + +#### Nodes + +| MOD supported | Fruit to regrow (node) | Sustitute when growing (node) | +| ------------- | ---------------------- | ----------------------------- | +| default | default:apple | default:leaves | +| ethereal | ethereal:banana | ethereal:bananaleaves | +| ethereal | ethereal:banana_bunch | ethereal:bananaleaves | +| ethereal | ethereal:orange | ethereal:orange_leaves | +| ethereal | ethereal:coconut | ethereal:palmleaves | +| ethereal | ethereal:lemon | ethereal:lemon_leaves | +| ethereal | ethereal:olive | ethereal:olive_leaves | +| ethereal | ethereal:golden_apple | ethereal:yellowleaves (disabled) | +| cool_trees | cacaotree:pod | cacaotree:trunk (override) | +| cool_trees | cherrytree:cherries | cherrytree:blossom_leaves | +| cool_trees | clementinetree:clementine | clementinetree:leaves | +| cool_trees | ebony:persimmon | ebony:leaves | +| cool_trees | lemontree:lemon | lemontree:leaves | +| cool_trees | oak:acorn | oak:leaves | +| cool_trees | palm:coconut | palm:leaves | +| cool_trees | pomegranate:pomegranate | pomegranate:leaves | +| farming_plus | farming_plus:cocoa | farming_plus:cocoa_leaves | +| farming_plus | farming_plus:banana | farming_plus:banana_leaves | +| aotearoa | aotearoa:karaka_fruit | aotearoa:karaka_leaves | +| aotearoa | aotearoa:miro_fruit | aotearoa:miro_leaves | +| aotearoa | aotearoa:tawa_fruit | aotearoa:tawa_leaves | +| aotearoa | aotearoa:hinau_fruit | aotearoa:hinau_leaves | +| aotearoa | aotearoa:kawakawa_fruit | aotearoa:kawakawa_leaves | +| australia | australia:cherry | australia:cherry_leaves | +| australia | australia:lilly_pilly_berries | australia:lilly_pilly_leaves | +| australia | australia:macadamia | australia:macadamia_leaves | +| australia | australia:mangrove_apple | australia:mangrove_apple_leaves | +| australia | australia:moreton_bay_fig | australia:moreton_bay_fig_leaves | +| australia | australia:quandong | australia:quandong_leaves | +| moretrees | moretrees:acorn | moretrees:oak_leaves | +| moretrees | moretrees:cedar_cone | moretrees:cedar_leaves | +| moretrees | moretrees:fir_cone | moretrees:fir_leaves | +| moretrees | moretrees:spruce_cone | moretrees:spruce_leaves | + +#### API usage + +The `regrow.add_fruit()` function is used to override each fruits `after_dig_node` +function so that an placeholder node (nostly leaves) is placed once it is taken, then a timer is started that will regrow the fruit on completion (unless tree is chopped down). -Example: regrow.add_fruit("default:apple", "default:leaves") +#### Definition -So far default apples and ethereal banana, orange and coconuts are supported. +`regrow.add_fruit(fruit_node, leaves_node, param2_check_override)` +#### Examples: + +``` + regrow.add_fruit("default:apple", "default:leaves") + regrow.add_fruit("cacaotree:pod", "cacaotree:trunk", true) +``` Changelog --------- - - 0.1 - Initial upload. - - 0.2 - Add checks for player placed fruit and tree's nearby. - - 0.3 - Make add_fruit a global function for other mods to use. - - 0.4 - Add check for fruit tree leaf type before re-growing. - - 0.5 - Ethereal Lemons and Olives can now regrow. +- 0.1 - Initial upload. +- 0.2 - Add checks for player placed fruit and tree's nearby. +- 0.3 - Make add_fruit a global function for other mods to use. +- 0.4 - Add check for fruit tree leaf type before re-growing. +- 0.5 - Ethereal Lemons and Olives can now regrow. +- 0.6 - Add support for cool_trees, farming_plus, aotearoa, australia and moretrees +- 0.7 - Add param2 override for cacao with placement param2 check +- 0.8 - Add custom min and max time regrow interval settings (defaults are 600 and 1200) + + +## LICENSE + +MIT see [license.txt](license.txt) file. + diff --git a/mods/regrow/settingtypes.txt b/mods/regrow/settingtypes.txt new file mode 100644 index 00000000..40d5ecf4 --- /dev/null +++ b/mods/regrow/settingtypes.txt @@ -0,0 +1,5 @@ +# Minimum interval in seconds it takes to regrow fruits +regrow_min_interval (Minimum Regrow Interval) int 600 + +# Maximum interval in seconds it takes to regrow fruits +regrow_max_interval (Maximum Regrow Interval) int 1200 diff --git a/mods/roads/infrastructure/advanced_aircraft_warning_light.lua b/mods/roads/infrastructure/advanced_aircraft_warning_light.lua index 1361f7b6..c07e8c08 100644 --- a/mods/roads/infrastructure/advanced_aircraft_warning_light.lua +++ b/mods/roads/infrastructure/advanced_aircraft_warning_light.lua @@ -9,6 +9,7 @@ minetest.register_node("infrastructure:aircraft_warning_light", { {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}}, {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}} }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", groups = {cracky = 1}, diff --git a/mods/roads/infrastructure/advanced_automatic_warning_device.lua b/mods/roads/infrastructure/advanced_automatic_warning_device.lua index 1049c560..0365d079 100644 --- a/mods/roads/infrastructure/advanced_automatic_warning_device.lua +++ b/mods/roads/infrastructure/advanced_automatic_warning_device.lua @@ -201,6 +201,7 @@ minetest.register_node("infrastructure:automatic_warning_device_top", { "infrastructure_automatic_warning_device_top_side.png", "infrastructure_automatic_warning_device_top.png" }, + use_texture_alpha = "clip", on_destruct = infrastructure.stop_bell, drawtype = "nodebox", paramtype = "light", @@ -231,6 +232,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_right_on" "infrastructure_automatic_warning_device_middle_right_side.png", {name="infrastructure_automatic_warning_device_middle_right_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}} }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -259,6 +261,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_right_off "infrastructure_automatic_warning_device_middle_right_side.png", "infrastructure_automatic_warning_device_middle_right_off.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -286,6 +289,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_left_on", "infrastructure_automatic_warning_device_middle_left_side.png", {name="infrastructure_automatic_warning_device_middle_left_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}} }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -314,6 +318,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_left_off" "infrastructure_automatic_warning_device_middle_left_side.png", "infrastructure_automatic_warning_device_middle_left_off.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -341,6 +346,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_center_on "infrastructure_automatic_warning_device_middle_center_side.png", {name="infrastructure_automatic_warning_device_middle_center_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}} }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -375,6 +381,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle_center_of "infrastructure_automatic_warning_device_middle_center_side.png", "infrastructure_automatic_warning_device_middle_center_off.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -408,6 +415,7 @@ minetest.register_node("infrastructure:automatic_warning_device_middle", { "infrastructure_automatic_warning_device_middle_side.png", "infrastructure_automatic_warning_device_middle.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/advanced_boom_barrier.lua b/mods/roads/infrastructure/advanced_boom_barrier.lua index ffc04a69..2e15dda4 100644 --- a/mods/roads/infrastructure/advanced_boom_barrier.lua +++ b/mods/roads/infrastructure/advanced_boom_barrier.lua @@ -383,6 +383,7 @@ minetest.register_node("infrastructure:boom_barrier_arm_h_lightfirst", { "infrastructure_boom_barrier_arm_h_bottom_front_back.png", "infrastructure_boom_barrier_arm_h_bottom_front_back.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -415,6 +416,7 @@ minetest.register_node("infrastructure:boom_barrier_arm_h_darkfirst", { "infrastructure_boom_barrier_arm_h_bottom_front_back.png", "infrastructure_boom_barrier_arm_h_bottom_front_back.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -447,6 +449,7 @@ minetest.register_node("infrastructure:boom_barrier_arm_h_end", { "infrastructure_boom_barrier_arm_h_bottom_front_back.png", "infrastructure_boom_barrier_arm_h_bottom_front_back.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -482,6 +485,7 @@ minetest.register_node("infrastructure:boom_barrier_arm_v", { "infrastructure_boom_barrier_arm_h_top.png", "infrastructure_boom_barrier_arm_h_bottom_front_back.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/advanced_crosswalk_warning_light.lua b/mods/roads/infrastructure/advanced_crosswalk_warning_light.lua index 213223ac..84fa7a47 100644 --- a/mods/roads/infrastructure/advanced_crosswalk_warning_light.lua +++ b/mods/roads/infrastructure/advanced_crosswalk_warning_light.lua @@ -19,6 +19,7 @@ minetest.register_node("infrastructure:crosswalk_warning_light_off", { "infrastructure_crosswalk_warning_light_back.png", "infrastructure_crosswalk_warning_light_front_dark.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -73,6 +74,7 @@ minetest.register_node("infrastructure:crosswalk_warning_light_on", { "infrastructure_crosswalk_warning_light_back.png", {name="infrastructure_crosswalk_warning_light_front_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.5}} }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/advanced_road_signs.lua b/mods/roads/infrastructure/advanced_road_signs.lua index b732bfd0..3efeeeed 100644 --- a/mods/roads/infrastructure/advanced_road_signs.lua +++ b/mods/roads/infrastructure/advanced_road_signs.lua @@ -12,6 +12,7 @@ "infrastructure_road_sign_"..sign_name.."_back.png", "infrastructure_road_sign_"..sign_name.."_front.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/advanced_traffic_lights_pedestrians.lua b/mods/roads/infrastructure/advanced_traffic_lights_pedestrians.lua index 02da8043..1d8519e7 100644 --- a/mods/roads/infrastructure/advanced_traffic_lights_pedestrians.lua +++ b/mods/roads/infrastructure/advanced_traffic_lights_pedestrians.lua @@ -60,6 +60,7 @@ "infrastructure_traffic_lights_pedestrians_top_back.png", "infrastructure_traffic_lights_pedestrians_top_front_"..tostring(i)..".png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -95,6 +96,7 @@ "infrastructure_traffic_lights_pedestrians_bottom_back.png", "infrastructure_traffic_lights_pedestrians_bottom_front_"..tostring(i)..".png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -179,6 +181,7 @@ "infrastructure_traffic_lights_pedestrians_bottom_back.png", "infrastructure_traffic_lights_pedestrians_bottom_front_1.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/advanced_warning_light.lua b/mods/roads/infrastructure/advanced_warning_light.lua index 0ed5b628..9abc33b7 100644 --- a/mods/roads/infrastructure/advanced_warning_light.lua +++ b/mods/roads/infrastructure/advanced_warning_light.lua @@ -10,6 +10,7 @@ minetest.register_node("infrastructure:warning_light", { "infrastructure_warning_light_back.png", {name="infrastructure_warning_light_front_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=3}}, }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/infrastructure/nodes.lua b/mods/roads/infrastructure/nodes.lua index 5b28f1ac..27fe1bf1 100644 --- a/mods/roads/infrastructure/nodes.lua +++ b/mods/roads/infrastructure/nodes.lua @@ -105,6 +105,7 @@ "infrastructure_concrete.png", "infrastructure_concrete.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -150,6 +151,7 @@ "infrastructure_grid_paver_grass.png", "infrastructure_grid_paver_grass.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -203,6 +205,7 @@ minetest.register_node("infrastructure:truss", { description = "Truss", tiles = {"infrastructure_truss.png"}, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", groups = {cracky = 2}, @@ -227,6 +230,7 @@ minetest.register_node("infrastructure:wire_netting", { description = "Wire netting", tiles = {"infrastructure_wire_netting.png"}, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -245,6 +249,7 @@ minetest.register_node("infrastructure:razor_wire", { description = "Razor wire", tiles = {"infrastructure_razor_wire.png"}, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -278,6 +283,7 @@ "infrastructure_galvanized_steel.png", "infrastructure_galvanized_steel.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -1212,6 +1218,7 @@ "infrastructure_crowd_control_barricade_back.png", "infrastructure_crowd_control_barricade_front.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -1301,6 +1308,7 @@ "infrastructure_anti_dazzling_panel_side.png", "infrastructure_anti_dazzling_panel_side.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -1336,6 +1344,7 @@ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png", "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png" }, + use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/roads/labels/init.lua b/mods/roads/labels/init.lua index e8d0624a..36492c7a 100644 --- a/mods/roads/labels/init.lua +++ b/mods/roads/labels/init.lua @@ -240,6 +240,7 @@ streets.register_label = function(friendlyname,name,tex,color,ink_needed,hide) walkable = false, inventory_image = tex, wield_image = tex, + use_texture_alpha = "clip", after_place_node = function(pos) local node = minetest.get_node(pos) local lower_pos = {x = pos.x, y = pos.y-1, z = pos.z} diff --git a/mods/roads/streetsmod/libs/smartfs/README.md b/mods/roads/streetsmod/libs/smartfs/README.md new file mode 100644 index 00000000..df0e166e --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/README.md @@ -0,0 +1,88 @@ +smartfs +======= + +This mod provides a 2nd generation way of creating forms - this means that the modder does not need to worry about complex formspec strings + +* Expandable: you can register your own elements to use on the form. +* Easy event handling: use binding to handle events. +* New elements: Includes a toggle button + +License: WTFPL +To install this library, place the smartfs.lua file in your mod and then include it (dofile). +There is an init.lua file in the download that shows you how to do this. + +#Using Smart Formspec +Smartfs provides 2nd generation Minetest forms to replace clunky formspec strings. Each smartfs form is a container filled with GUI elements. A number of default elements are included with smartfs, but modders can also define their own custom elements. This document describes the basic usage of the smartfs API. + +##Installation +Smartfs can be used as a library or a mod. + +To use smartfs as a library, copy the smartfs.lua file to your mod folder and add + dofile(minetest.get\_modpath(minetest.get\_current\_modname()).."/smartfs.lua") +to the top of any files that use it. + +To use smartfs as a mod, add it to your game's mods folder or to the user mods folder and enable it. + +## Creating and showing forms +A form is a rectangular area of the screen upon which all elements are placed. Use the smartfs.create() function to create a new form. This function takes two arguments and returns a form object. + +The first argument is a unique string that identifies the form. The second argument is a function that should take a single argument called state which is used to set form properties like size and background color. State also has constructors for all form elements and can be used with state:element_name. Below is a quick example. + + myform = smartfs.create("My Form",function(state) + --sets the form's size + -- (width, hieght) + state:size(5,5) + + --creates a label and places it on the form + --(x-pos, y-pos, name, text) + state:label(3,3,"label1", "A label!") + end) + +Forms can be shown to the player by using the show(target) function. The target argument is the name of the player that will see the form. + + myform:show("singleplayer") + +Here is a list of steps the library takes. +* You create a new form using smartfs.create(). +* The form is registered and stored for later use. +* You show a form to a player using the myform:show() +* The state is created and stored. +* The function in smartfs.create runs and creates the elements. +* The form is displayed to the player. + +## Modifying Elements +Elements have functions of the form element:function(args) where you need to have access to the element object. + +You can get the element object by assigning a variable to its creation function like so: + + local button1 = state:button(0,0, 1,4, "btn1", "A button") + --button1 is now a table representing the button + +You can also get the element by using state:get(name). The example below will retrieve a button with the name "btn1": + + button1 = state:get("btn1") + --or + state:get("btn1"):onClick(your\_onclick\_function + +Both of these methods should be used inside the form creation callback function, the function you pass to smartfs.create, or in event callbacks. + +Now that you have located your element you can modify it. + + button1:setPos(4,0) + +## Inventory Support +Smartfs supports adding a button to Inventory+ or Unified Inventory which will open one of your own custom forms. Use the smartfs.add\_to\_inventory(form, icon, title) function where form is the smartfs form linked to by the button, icon is the button image (only for unified inventory), and title is the button text (only for inventory+). + + smartfs.add_to_inventory(form, icon, title) + +## Dynamic forms +Dynamic forms allow you to make a form without having to register it before the game finished loading. + + local state = smartfs.dynamic("smartfs:dyn_form", name) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + state:show() + +Make sure you call state:show() diff --git a/mods/roads/streetsmod/libs/smartfs/api.md b/mods/roads/streetsmod/libs/smartfs/api.md new file mode 100644 index 00000000..69e3f47b --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/api.md @@ -0,0 +1,107 @@ +#Full API +##Smartfs +* smartfs( name ) - returns the form regisered with the name 'name' +* smartfs.create( name,function ) - creates a new form and adds elements to it by running the function. Use before Minetest loads. (like minetest.register_node) +* smartfs.element( name, data ) - creates a new element type. +* smartfs.dynamic( formname, playername ) - creates a dynamic form. Returns state. See example.lua for example. Remember to call state:show() +* smartfs.add\_to\_inventory(form, icon, title) - Adds a form to an installed advanced inventory. Returns true on success. +* smartfs.inventory_mod() - Returns the name of an installed and supported inventory mod that will be used above, or null. +* smartfs.override\_load\_checks() - Allows you to use smartfs.create after the game loads. Not recommended! + +##Form +* form:show( playername [, parameters] ) - shows the form to a player. See state.param. +* form.name - the name of the form. + +##State + +### Methods +* state:size( width,height ) - sets the forms width and height. +* state:get( name ) - gets an element by name. +* state:show() - reshows the form to the player. +* state:close() - closes the form (does not work yet, due to no MT api support). +* state:load( filepath ) - Loads elements from a file. +* state:save( filepath ) - Saves elements to a file. +* state:button( x,y,w,h,name,text [, exit_on_click] ) - create a new button at x,y with name and caption (text) + * ^ optional: exit_on_click - set to true to exit the form when the button is clicked. ( Also see button.setClose() ) +* state:toggle( x,y,w,h,name,list ) - create a new toggle button at x,y with name and possible list of values +* state:label( x,y,name,text ) - create a new label at x,y with name and caption (text) +* state:field( x,y,w,h,name,label ) - create a new field at x,y with label + * state:pwdfield( x,y,w,h,name,label ) - create a password field + * state:textarea( x,y,w,h,name,label ) - create a new textarea +* state:image( x,y,w,h,name,imagepath ) - create an image box. +* state:inventory( x,y,w,h,name ) - create an inventory listing (use 'main' as name for the main player inventory) +* state:checkbox( x,y,name,label,selected ) - create a check box. +* state:element( element_type, data ) - Semi-private, create an element with type and data. + +### Variables +* state.player - The name of the player. +* state.param - The parameters supplied by form:show. +* state.def - The form definition. +* state.is_inv - Boolean which is true if this form is being shown as an inventory. + +##Button +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:setText( text ) - set the caption of the button +* element:getText() - get the caption of the button +* element:setImage( filename ) - sets the background of the button +* element:getImage() - get the background filename of the button +* element:click( func(self,state) ) - specify a function to run when the button is clicked + +##Toggle Button +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:getText() - get the text of the toggle option +* element:setId( filename ) - sets the selected id +* element:getId() - get the selected id +* element:onToggle( func(self,state) ) - specify a function to run when the value if toggled + +##Label +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setText( text ) - set the caption of the label +* element:getText() - get the caption of the label + +##Field and Text Area +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:setText( text ) - set the caption of the button +* element:getText() - get the caption of the field +* element:setImage( filename ) - sets the background of the field +* element:getImage() - get the background filename of the field + +##List box +* element:onClick( func(self,state,idx) ) - function to run when listbox item idx is clicked +* element:onDoubleClick( func(self,state,idx) ) - function to run when listbox item idx is double clicked +* element:setPosition( x,y ) - set the position +* element:getPosition() - returns {x=x, y=y} +* element:setSize( w,h ) - set the size +* element:getSize() - gets the size {w=w, h=h} +* element:addItem( item ) - appends and item +* element:removeItem( idx ) - remove item +* element:popItem() - removes last item and returns + +##Inventory listing +* element:setPosition( x,y ) - set the position +* element:getPosition() - returns {x=x, y=y} +* element:setSize( w,h ) - set the size +* element:getSize() - gets the size {w=w, h=h} +* element:setLocation( location ) - set a custom inventory location or nil for the default (current_player) + * element:usePosition( position ) - use a node metadata attached inventory of the node at the given positon + * element:useDetached( name ) - use a detached inventory with the given name + * element:usePlayer( name ) - use a player inventory other than the current player +* element:getLocation() - returns the inventory location (default: current_player) +* element:setIndex( index ) - set the inventory starting index +* element:getIndex() - returns the inventory starting index + +##Custom Code +* element:onSubmit( func(self) ) - on form submit +* element:onBuild( func(self) ) - run every time form is shown. You can set code from here +* element:setCode( code ) - set the formspec code +* element:getCode( code ) - get the formspec code diff --git a/mods/3d_armor/3d_armor_ui/depends.txt b/mods/roads/streetsmod/libs/smartfs/depends.txt similarity index 54% rename from mods/3d_armor/3d_armor_ui/depends.txt rename to mods/roads/streetsmod/libs/smartfs/depends.txt index cf4ccf91..4893cdc1 100644 --- a/mods/3d_armor/3d_armor_ui/depends.txt +++ b/mods/roads/streetsmod/libs/smartfs/depends.txt @@ -1,2 +1,2 @@ -3d_armor unified_inventory? +inventory_plus? diff --git a/mods/roads/streetsmod/libs/smartfs/example.lua b/mods/roads/streetsmod/libs/smartfs/example.lua new file mode 100644 index 00000000..935dd701 --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/example.lua @@ -0,0 +1,66 @@ +dofile(minetest.get_modpath("smartfs").."/smartfs.lua") + +s = smartfs.create("smartfs:form",function(state) + state:size(10,7) + state:label(2,0,"lbl","SmartFS example formspec!") + state:field(7,1,3,1,"txt","Textbox") + state:image(0,0,2,2,"img","default_stone.png") + state:toggle(0,2,3,1,"tg",{"plenty..","of..","custom..","elements"}) + state:checkbox(2,1,"c","Easy code",true) + local res = "smartfs.create(\"smartfs:form\",function(state)\n" + res = res .. "\tstate:size(10,7)\n" + res = res .. "\tstate:label(2,0,\"lbl\",\"SmartFS example formspec!\")\n" + res = res .. "\tstate:field(7,1,3,1,\"txt\",\"Textbox\")\n" + res = res .. "\tstate:image(0,0,2,2,\"img\",\"default_stone.png\")\n" + res = res .. "\tstate:toggle(0,2,3,1,\"tg\",{\"plenty..\",\"of..\",\"custom..\",\"elements\"})\n" + res = res .. "\tstate:checkbox(2,1,\"c\",\"Easy code\",true)\n" + res = res .. "end)" + state:textarea(1,3.5,9,4,"ta","Code:"):setText(res) + return true +end) + +l = smartfs.create("smartfs:load",function(state) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + return true +end) + +smartfs.add_to_inventory(l,"icon.png","SmartFS") + +minetest.register_chatcommand("sfs_s", { + params = "", + description = "SmartFS test formspec 1: basics", + func = function(name, param) + s:show(name) + end, +}) +minetest.register_chatcommand("sfs_l", { + params = "", + description = "SmartFS test formspec 2: loading", + func = function(name, param) + l:show(name) + end, +}) + +minetest.register_chatcommand("sfs_d", { + params = "", + description = "SmartFS test formspec 3: dynamic", + func = function(name, param) + local state = smartfs.dynamic("smartfs:dyn_form", name) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + state:show() + end, +}) + +minetest.register_chatcommand("sfs_lc", { + params = "", + description = "SmartFS test formspec 4: smartfs.create error catching", + func = function(name, param) + smartfs.create("asdinas",function() end) + end +}) diff --git a/mods/roads/streetsmod/libs/smartfs/example.smartfs b/mods/roads/streetsmod/libs/smartfs/example.smartfs new file mode 100644 index 00000000..cbbaabfd --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/example.smartfs @@ -0,0 +1 @@ +return { ["ele"] = { ["c"] = { ["pos"] = { ["y"] = 1, ["x"] = 1 }, ["label"] = "Check", ["value"] = true, ["type"] = "checkbox", ["name"] = "c" }, ["btn"] = { ["pos"] = { ["y"] = 2, ["x"] = 1 }, ["size"] = { ["h"] = 1, ["w"] = 1 }, ["value"] = "Button", ["type"] = "button", ["name"] = "btn" } }, ["size"] = { ["h"] = 3, ["w"] = 5 } } \ No newline at end of file diff --git a/mods/roads/streetsmod/libs/smartfs/init.lua b/mods/roads/streetsmod/libs/smartfs/init.lua new file mode 100644 index 00000000..b2aaa29c --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/init.lua @@ -0,0 +1,2 @@ +dofile(minetest.get_modpath("smartfs").."/smartfs.lua") +--dofile(minetest.get_modpath("smartfs").."/example.lua") diff --git a/mods/roads/streetsmod/libs/smartfs/smartfs.lua b/mods/roads/streetsmod/libs/smartfs/smartfs.lua new file mode 100644 index 00000000..dfa0819d --- /dev/null +++ b/mods/roads/streetsmod/libs/smartfs/smartfs.lua @@ -0,0 +1,760 @@ +--------------------------- +-- SmartFS: Smart Formspecs +-- by Rubenwardy +--------------------------- + +smartfs = { + _fdef = {}, + _edef = {}, + opened = {}, + inv = {} +} + +-- the smartfs() function +function smartfs.__call(self, name) + return smartfs._fdef[name] +end + +-- Register forms and elements +function smartfs.create(name,onload) + if smartfs._fdef[name] then + error("SmartFS - (Error) Form "..name.." already exists!") + end + if smartfs.loaded and not smartfs._loaded_override then + error("SmartFS - (Error) Forms should be declared while the game loads.") + end + + smartfs._fdef[name] = { + _reg = onload, + name = name, + show = smartfs._show_ + } + + return smartfs._fdef[name] +end +function smartfs.override_load_checks() + smartfs._loaded_override = true +end + +minetest.after(0, function() + smartfs.loaded = true +end) +function smartfs.dynamic(name,player) + if not smartfs._dynamic_warned then + smartfs._dynamic_warned = true + print("SmartFS - (Warning) On the fly forms are being used. May cause bad things to happen") + end + local state = smartfs._makeState_({name=name},player,nil,false) + state.show = state._show_ + smartfs.opened[player] = state + return state +end +function smartfs.element(name,data) + if smartfs._edef[name] then + error("SmartFS - (Error) Element type "..name.." already exists!") + end + smartfs._edef[name] = data + return smartfs._edef[name] +end + +function smartfs.inventory_mod() + if unified_inventory then + return "unified_inventory" + elseif inventory_plus then + return "inventory_plus" + else + return nil + end +end + +function smartfs.add_to_inventory(form,icon,title) + if unified_inventory then + unified_inventory.register_button(form.name, { + type = "image", + image = icon, + }) + unified_inventory.register_page(form.name, { + get_formspec = function(player, formspec) + local name = player:get_player_name() + local opened = smartfs._show_(form, name, nil, true) + return {formspec = opened:_getFS_(false)} + end + }) + return true + elseif inventory_plus then + minetest.register_on_joinplayer(function(player) + inventory_plus.register_button(player, form.name, title) + end) + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "" and fields[form.name] then + local name = player:get_player_name() + local opened = smartfs._show_(form, name, nil, true) + inventory_plus.set_inventory_formspec(player, opened:_getFS_(true)) + end + end) + return true + else + return false + end +end + +function smartfs._makeState_(form,player,params,is_inv) + return { + _ele = {}, + def = form, + player = player, + param = params, + is_inv = is_inv, + get = function(self,name) + return self._ele[name] + end, + close = function(self) + self.closed = true + end, + size = function(self,w,h) + self._size = {w=w,h=h} + end, + _getFS_ = function(self,size) + local res = "" + if self._size and size then + res = "size["..self._size.w..","..self._size.h.."]" + end + for key,val in pairs(self._ele) do + res = res .. val:build() + end + return res + end, + _show_ = function(self) + if self.is_inv then + if unified_inventory then + unified_inventory.set_inventory_formspec(minetest.get_player_by_name(self.player), self.def.name) + elseif inventory_plus then + inventory_plus.set_inventory_formspec(minetest.get_player_by_name(self.player), self:_getFS_(true)) + end + else + local res = self:_getFS_(true) + minetest.show_formspec(player,form.name,res) + end + end, + load = function(self,file) + local file = io.open(file, "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + if table.size then + self._size = table.size + end + for key,val in pairs(table.ele) do + self:element(val.type,val) + end + return true + end + end + return false + end, + save = function(self,file) + local res = {ele={}} + + if self._size then + res.size = self._size + end + + for key,val in pairs(self._ele) do + res.ele[key] = val.data + end + + local file = io.open(file, "w") + if file then + file:write(minetest.serialize(res)) + file:close() + return true + end + return false + end, + button = function(self,x,y,w,h,name,text,exitf) + if exitf == nil then exitf = false end + return self:element("button",{pos={x=x,y=y},size={w=w,h=h},name=name,value=text,closes=exitf}) + end, + label = function(self,x,y,name,text) + return self:element("label",{pos={x=x,y=y},name=name,value=text}) + end, + toggle = function(self,x,y,w,h,name,list) + return self:element("toggle",{pos={x=x,y=y},size={w=w,h=h},name=name,id=1,list=list}) + end, + field = function(self,x,y,w,h,name,label) + return self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + end, + pwdfield = function(self,x,y,w,h,name,label) + local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + res:isPassword(true) + return res + end, + textarea = function(self,x,y,w,h,name,label) + local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + res:isMultiline(true) + return res + end, + image = function(self,x,y,w,h,name,img) + return self:element("image",{pos={x=x,y=y},size={w=w,h=h},name=name,value=img}) + end, + checkbox = function(self,x,y,name,label,selected) + return self:element("checkbox",{pos={x=x,y=y},name=name,value=selected,label=label}) + end, + listbox = function(self,x,y,w,h,name) + return self:element("list", { pos={x=x,y=y}, size={w=w,h=h}, name=name }) + end, + inventory = function(self,x,y,w,h,name) + return self:element("inventory", { pos={x=x,y=y}, size={w=w,h=h}, name=name }) + end, + element = function(self,typen,data) + local type = smartfs._edef[typen] + + if not type then + error("Element type "..typen.." does not exist!") + end + + if self._ele[data.name] then + error("Element "..data.name.." already exists") + end + data.type = typen + + local ele = { + name = data.name, + root = self, + data = data, + remove = function(self) + self.root._ele[self.name] = nil + end + } + + for key,val in pairs(type) do + ele[key] = val + end + + self._ele[data.name] = ele + + return self._ele[data.name] + end + } +end + +-- Show a formspec to a user +function smartfs._show_(form, player, params, is_inv) + local state = smartfs._makeState_(form, player, params, is_inv) + state.show = state._show_ + if form._reg(state)~=false then + if not is_inv then + smartfs.opened[player] = state + state:_show_() + else + smartfs.inv[player] = state + end + end + return state +end + +-- Receive fields from formspec +local function _sfs_recieve_(state,name,fields) + if (fields.quit == "true") then + if not state.is_inv then + smartfs.opened[name] = nil + end + return true + end + + for key,val in pairs(fields) do + if state._ele[key] then + state._ele[key].data.value = val + end + end + for key,val in pairs(state._ele) do + if val.submit then + if (val:submit(fields)==true) then + return true + end + end + end + if state.closed ~= true then + state:_show_() + else + minetest.show_formspec(name,"","size[5,1]label[0,0;Formspec closing not yet created!]") + if not state.is_inv then + smartfs.opened[name] = nil + end + end + return true +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if smartfs.opened[name] and not smartfs.opened[name].is_inv then + if smartfs.opened[name].def.name == formname then + local state = smartfs.opened[name] + return _sfs_recieve_(state,name,fields) + else + smartfs.opened[name] = nil + end + elseif smartfs.inv[name] and smartfs.inv[name].is_inv then + local state = smartfs.inv[name] + _sfs_recieve_(state,name,fields) + end + return false +end) + + +----------------------------------------------------------------- +------------------------- ELEMENTS ---------------------------- +----------------------------------------------------------------- + +smartfs.element("button",{ + build = function(self) + if self.data.img then + return "image_button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.img.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + else + if self.data.closes then + return "button_exit[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + else + return "button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + end + end + end, + submit = function(self,fields,state) + if fields[self.name] and self._click then + self:_click(self.root) + end + + if self.data.closes then + return true + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + onClick = function(self,func) + self._click = func + end, + click = function(self,func) + self._click = func + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end, + setImage = function(self,image) + self.data.img = image + end, + getImage = function(self) + return self.data.img + end, + setClose = function(self,bool) + self.data.closes = bool + end +}) + +smartfs.element("toggle",{ + build = function(self) + return "button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.list[self.data.id].. + "]" + end, + submit = function(self,fields) + if fields[self.name] then + self.data.id = self.data.id + 1 + if self.data.id > #self.data.list then + self.data.id = 1 + end + if self._tog then + self:_tog(self.root) + end + end + end, + onToggle = function(self,func) + self._tog = func + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setId = function(self,id) + self.data.id = id + end, + getId = function(self) + return self.data.id + end, + getText = function(self) + return self.data.list[self.data.id] + end +}) + +smartfs.element("label",{ + build = function(self) + return "label[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.value.. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end +}) + +smartfs.element("field",{ + build = function(self) + if self.data.ml then + return "textarea[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + ";".. + self.data.value.. + "]" + elseif self.data.pwd then + return "pwdfield[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + "]" + else + return "field[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + ";".. + self.data.value.. + "]" + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end, + isPassword = function(self,bool) + self.data.pwd = bool + end, + isMultiline = function(self,bool) + self.data.ml = bool + end +}) + +smartfs.element("image",{ + build = function(self) + return "image[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.value.. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setImage = function(self,text) + self.data.value = text + end, + getImage = function(self) + return self.data.value + end +}) + +smartfs.element("checkbox",{ + build = function(self) + if self.data.value then + return "checkbox[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.name.. + ";".. + self.data.label.. + ";true]" + else + return "checkbox[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.name.. + ";".. + self.data.label.. + ";false]" + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end +}) + +smartfs.element("list",{ + build = function(self) + local listformspec = "textlist[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.name.. + ";" + + --loop through the list's items and add them to the formspec + if not self.data.items then + self.data.items = {" "} + end + for i,value in ipairs(self.data.items) do + listformspec = listformspec..value.."," + end + listformspec = string.sub(listformspec, 0, -2) --removes extra , + --close out the list items section + listformspec = listformspec..";" + + --TODO support selected idx and transparency + + --close formspec definition and return formspec + listformspec = listformspec.."]" + return listformspec + end, + submit = function(self,fields) + if fields[self.name] then + local _type = string.sub(fields[self.data.name],1,3) + local index = string.sub(fields[self.data.name],5) + if _type == "CHG" and self._click then + self:_click(self.root, index) + elseif _type == "DCL" and self._doubleClick then + self:_doubleClick(self.root, index) + end + end + end, + onClick = function(self, func) + self._click = func + end, + click = function(self, func) + self._click = func + end, + onDoubleClick = function(self, func) + self._doubleClick = func + end, + doubleclick = function(self, func) + self._doubleClick = func + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + addItem = function(self, item) + if not self.data.items then + self.data.items = {" "} + end + table.insert(self.data.items, item) + end, + removeItem = function(self,idx) + if not self.data.items then + self.data.items = {" "} + end + table.remove(self.data.items,idx) + end, + popItem = function(self) + if not self.data.items then + self.data.items = {" "} + end + local item = self.data.items[#self.data.items] + table.remove(self.data.items) + return item + end +}) + +smartfs.element("inventory",{ + build = function(self) + return "list[".. + (self.data.location or "current_player") .. + ";".. + self.name.. + ";".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + (self.data.index or "") .. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + -- available inventory locations + -- "current_player": Player to whom the menu is shown + -- "player:": Any player + -- "nodemeta:,,": Any node metadata + -- "detached:": A detached inventory + -- "context" does not apply to smartfs, since there is no node-metadata as context available + setLocation = function(self,location) + self.data.location = location + end, + getLocation = function(self) + return self.data.location or "current_player" + end, + usePosition = function(self, pos) + self.data.location = string.format("nodemeta:%d,%d,%d", pos.x, pos.y, pos.z) + end, + usePlayer = function(self, name) + self.data.location = "player:" .. name + end, + useDetached = function(self, name) + self.data.location = "detached:" .. name + end, + setIndex = function(self,index) + self.data.index = index + end, + getIndex = function(self) + return self.data.index + end +}) + +smartfs.element("code",{ + build = function(self) + if self._build then + self:_build() + end + + return self.data.code + end, + submit = function(self,fields) + if self._sub then + self:_sub(fields) + end + end, + onSubmit = function(self,func) + self._sub = func + end, + onBuild = function(self,func) + self._build = func + end, + setCode = function(self,code) + self.data.code = code + end, + getCode = function(self) + return self.data.code + end +}) diff --git a/mods/signs_lib/.luacheckrc b/mods/signs_lib/.luacheckrc index e30dca6d..5c9af0f8 100644 --- a/mods/signs_lib/.luacheckrc +++ b/mods/signs_lib/.luacheckrc @@ -9,9 +9,8 @@ globals = { read_globals = { -- Builtin table = {fields = {"copy"}}, - "ItemStack", "vector", - + "ItemStack", "vector", "default", + -- Mod deps - "intllib", "screwdriver", } diff --git a/mods/signs_lib/API.md b/mods/signs_lib/API.md index 42c19fca..7491c95d 100644 --- a/mods/signs_lib/API.md +++ b/mods/signs_lib/API.md @@ -236,7 +236,7 @@ signs_lib.register_sign("basic_signs:sign_wall_glass", { allow_onpole = true, allow_onpole_horizontal = true, allow_yard = true, - use_texture_alpha = true, + use_texture_alpha = "blend", }) ``` @@ -250,7 +250,7 @@ signs_lib.register_sign("basic_signs:sign_wall_glass", { * `signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)` - Open the default sign formspec, if the player has the `signslib_edit` privilege. + Open the default sign formspec, if the player has the `signslib_edit` privilege. (privilege can be set by `signs_lib.edit_priv` setting) * `signs_lib.destruct_sign(pos)` diff --git a/mods/signs_lib/README.md b/mods/signs_lib/README.md index 81b53fc8..bb33427c 100644 --- a/mods/signs_lib/README.md +++ b/mods/signs_lib/README.md @@ -67,3 +67,4 @@ The list of loaded, sign-bearing blocks is created/populated by an LBM (and trim * `signslib_edit` Allows to rotate signs and to open (and consequently edit) any default sign formspec. +(privilege can be set by `signs_lib.edit_priv` setting) diff --git a/mods/signs_lib/api.lua b/mods/signs_lib/api.lua index ee0e9763..edcb3ef9 100644 --- a/mods/signs_lib/api.lua +++ b/mods/signs_lib/api.lua @@ -1,6 +1,12 @@ -- signs_lib api, backported from street_signs -local S = signs_lib.gettext +local S = signs_lib.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local has_default_mod = minetest.get_modpath("default") + +local function log(level, messagefmt, ...) + minetest.log(level, "[signs_lib] " .. messagefmt:format(...)) +end local function get_sign_formspec() end @@ -21,16 +27,14 @@ signs_lib.standard_xoffs = 4 signs_lib.standard_yoffs = 0 signs_lib.standard_cpl = 35 -signs_lib.standard_wood_groups = table.copy(minetest.registered_items["default:sign_wall_wood"].groups) -signs_lib.standard_wood_groups.sign = 1 +signs_lib.standard_wood_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].groups or {}) signs_lib.standard_wood_groups.attached_node = nil -signs_lib.standard_steel_groups = table.copy(minetest.registered_items["default:sign_wall_steel"].groups) -signs_lib.standard_steel_groups.sign = 1 +signs_lib.standard_steel_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].groups or {}) signs_lib.standard_steel_groups.attached_node = nil -signs_lib.standard_wood_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_wood"].sounds) -signs_lib.standard_steel_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_steel"].sounds) +signs_lib.standard_wood_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].sounds or {}) +signs_lib.standard_steel_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].sounds or {}) signs_lib.default_text_scale = {x=10, y=10} @@ -162,12 +166,23 @@ local ctexcache_wide = {} -- entity handling minetest.register_entity("signs_lib:text", { - collisionbox = { 0, 0, 0, 0, 0, 0 }, - visual = "mesh", - mesh = "signs_lib_standard_sign_entity_wall.obj", - textures = {}, - static_save = true, - backface_culling = false + initial_properties = { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "mesh", + mesh = "signs_lib_standard_sign_entity_wall.obj", + textures = {}, + static_save = true, + backface_culling = false, + }, + on_activate = function(self) + local node = minetest.get_node(self.object:get_pos()) + if minetest.get_item_group(node.name, "sign") == 0 then + self.object:remove() + end + end, + on_blast = function(self, damage) + return false, false, {} + end, }) function signs_lib.delete_objects(pos) @@ -455,8 +470,8 @@ local math_max = math.max local function fill_line(x, y, w, c, font_size, colorbgw) c = c or "0" local tex = { } - for xx = 0, math.max(0, w), colorbgw do - table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(x + xx, y, c)) + for xx = x, w, colorbgw do + table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(xx, y, c)) end return table.concat(tex) end @@ -568,8 +583,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi end end if w then - width = width + w + 1 - if width >= (line_width - cwidth_tab[" "]) then + width = width + w + if width > line_width then width = 0 else maxw = math_max(width, maxw) @@ -592,6 +607,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi off = ch_offs, tex = tex, col = ("%X"):format(cur_color), + w = w, }) end ch_offs = ch_offs + w @@ -600,8 +616,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi else local w = cwidth_tab[c] if w then - width = width + w + 1 - if width >= (line_width - cwidth_tab[" "]) then + width = width + w + if width > line_width then width = 0 else maxw = math_max(width, maxw) @@ -611,6 +627,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi off = ch_offs, tex = char_tex(font_name, c), col = ("%X"):format(cur_color), + w = w, }) end ch_offs = ch_offs + w @@ -618,7 +635,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi end i = i + 1 end - width = width + cwidth_tab[" "] + 1 + width = width + cwidth_tab[" "] maxw = math_max(width, maxw) table.insert(words, { chars=chars, w=ch_offs }) end @@ -627,7 +644,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi local texture = { } - local start_xpos = math.floor((line_width - maxw) / 2) + def.x_offset + local start_xpos = math.max(0, math.floor((line_width - maxw) / 2)) + def.x_offset + local end_xpos = math.min(start_xpos + maxw, line_width) local xpos = start_xpos local ypos = (line_height + def.line_spacing)* lineno + def.y_offset @@ -636,31 +654,33 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi for word_i, word in ipairs(words) do local xoffs = (xpos - start_xpos) - if (xoffs > 0) and ((xoffs + word.w) > maxw) then - table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) + if (xoffs > 0) and ((xoffs + word.w) > end_xpos) then + table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw)) xpos = start_xpos ypos = ypos + line_height + def.line_spacing lineno = lineno + 1 if lineno >= def.number_of_lines then break end - table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw)) + table.insert(texture, fill_line(xpos, ypos, end_xpos, cur_color, font_size, colorbgw)) end for ch_i, ch in ipairs(word.chars) do + if xpos + ch.off + ch.w > end_xpos then + table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, "n", font_size, colorbgw)) + break + end if ch.col ~= cur_color then cur_color = ch.col - table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color, font_size, colorbgw)) + table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, cur_color, font_size, colorbgw)) end table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) end - table.insert( - texture, - (":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ") - ) - xpos = xpos + word.w + cwidth_tab[" "] - if xpos >= (line_width + cwidth_tab[" "]) then break end + xpos = xpos + word.w + if xpos < end_xpos then + table.insert(texture, (":%d,%d="):format(xpos, ypos) .. char_tex(font_name, " ")) + xpos = xpos + cwidth_tab[" "] + end end - table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) - table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw)) + table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw)) return table.concat(texture), lineno end @@ -722,6 +742,7 @@ end function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing) if not player or not signs_lib.can_modify(pos, player) then return end + if not player.get_meta then return end player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos)) minetest.show_formspec(player:get_player_name(), "signs_lib:sign", get_sign_formspec(pos, node.name)) @@ -737,6 +758,15 @@ function signs_lib.destruct_sign(pos) signs_lib.delete_objects(pos) end +function signs_lib.blast_sign(pos, intensity) + if signs_lib.can_modify(pos, "") then + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node, "tnt:blast") + minetest.remove_node(pos) + return drops + end +end + local function make_infotext(text) text = trim_input(text) local lines = signs_lib.split_lines_and_words(text) or {} @@ -788,6 +818,9 @@ function signs_lib.update_sign(pos, fields) local ownstr = "" if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end + -- Fix pasting from Windows: CR instead of LF + text = string.gsub(text, "\r\n?", "\n") + meta:set_string("text", text) meta:set_string("infotext", ownstr..make_infotext(text).." ") @@ -798,7 +831,16 @@ end function signs_lib.can_modify(pos, player) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") - local playername = player:get_player_name() + local playername + if type(player) == "userdata" then + playername = player:get_player_name() + + elseif type(player) == "string" then + playername = player + + else + playername = "" + end if minetest.is_protected(pos, playername) then minetest.record_protection_violation(pos, playername) @@ -807,7 +849,7 @@ function signs_lib.can_modify(pos, player) if owner == "" or playername == owner - or (minetest.check_player_privs(playername, {signslib_edit=true})) + or minetest.get_player_privs(playername)[signs_lib.edit_priv] or (playername == minetest.settings:get("name")) then return true end @@ -904,7 +946,13 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke local controls = placer:get_player_control() local signname = itemstack:get_name() + + -- in case player has sign nodes they shouldn't, remove extensions for normal sign local no_wall_name = string.gsub(signname, "_wall", "") + no_wall_name = string.gsub(no_wall_name, "_yard", "") + no_wall_name = string.gsub(no_wall_name, "_hanging", "") + no_wall_name = string.gsub(no_wall_name, "_onpole_horiz", "") + no_wall_name = string.gsub(no_wall_name, "_onpole", "") local def = minetest.registered_items[signname] @@ -946,7 +994,7 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke end function signs_lib.register_fence_with_sign() - minetest.log("warning", "[signs_lib] ".."Attempt to call no longer used function signs_lib.register_fence_with_sign()") + log("warning", "Attempt to call no longer used function signs_lib.register_fence_with_sign()") end local use_glow = function(pos, node, puncher, pointed_thing) @@ -968,6 +1016,7 @@ end function signs_lib.register_sign(name, raw_def) local def = table.copy(raw_def) + def.is_ground_content = false if raw_def.entity_info == "standard" then def.entity_info = { @@ -979,6 +1028,7 @@ function signs_lib.register_sign(name, raw_def) end def.after_place_node = raw_def.after_place_node or signs_lib.after_place_node + def.on_blast = raw_def.on_blast or signs_lib.blast_sign if raw_def.entity_info then @@ -1022,6 +1072,9 @@ function signs_lib.register_sign(name, raw_def) def.groups = signs_lib.standard_wood_groups end + -- force all signs into the sign group + def.groups.sign = def.groups.sign or 1 + local cbox = signs_lib.make_selection_boxes(35, 25) def.selection_box = raw_def.selection_box or cbox @@ -1243,7 +1296,7 @@ minetest.register_lbm({ minetest.register_chatcommand("regen_signs", { params = "", privs = {server = true}, - description = "Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.", + description = S("Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any."), func = function(player_name, params) local allsigns = {} local totalsigns = 0 @@ -1262,13 +1315,13 @@ minetest.register_chatcommand("regen_signs", { end if signs_lib.totalblocks < 0 then signs_lib.totalblocks = 0 end if totalsigns == 0 then - minetest.chat_send_player(player_name, "There are no signs in the currently-loaded terrain.") + minetest.chat_send_player(player_name, S("There are no signs in the currently-loaded terrain.")) signs_lib.block_list = {} return end - minetest.chat_send_player(player_name, "Found a total of "..totalsigns.." sign nodes across "..signs_lib.totalblocks.." blocks.") - minetest.chat_send_player(player_name, "Regenerating sign entities...") + minetest.chat_send_player(player_name, S("Found a total of @1 sign nodes across @2 blocks.", totalsigns, signs_lib.totalblocks)) + minetest.chat_send_player(player_name, S("Regenerating sign entities ...")) for _, b in pairs(allsigns) do for _, pos in ipairs(b) do @@ -1280,11 +1333,15 @@ minetest.register_chatcommand("regen_signs", { end end end - minetest.chat_send_player(player_name, "Finished.") + minetest.chat_send_player(player_name, S("Finished.")) end }) -minetest.register_privilege("signslib_edit", {}) +minetest.register_on_mods_loaded(function() + if not minetest.registered_privileges[signs_lib.edit_priv] then + minetest.register_privilege("signslib_edit", {}) + end +end) @@ -1304,14 +1361,14 @@ function get_sign_formspec(pos, nodename) "image[0.1,2.4;7,1;signs_lib_sign_color_palette.png]", "textarea[0.15,-0.2;6.3,2.8;text;;" .. minetest.formspec_escape(txt) .. "]", "button_exit[3.7,3.4;2,1;ok;" .. S("Write") .. "]", - "label[0.3,3.4;Unicode font]", + "label[0.3,3.4;"..FS("Unicode font").."]", "image_button[0.6,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;uni_" .. state .. ";;;false;signs_lib_switch_interm.png]", } if minetest.registered_nodes[nodename].allow_widefont then state = meta:get_int("widefont") == 1 and "on" or "off" - formspec[#formspec+1] = "label[2.1,3.4;Wide font]" + formspec[#formspec+1] = "label[2.1,3.4;"..FS("Wide font").."]" formspec[#formspec+1] = "image_button[2.3,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;wide_" .. state .. ";;;false;signs_lib_switch_interm.png]" end @@ -1329,11 +1386,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local playername = player:get_player_name() if fields.text and fields.ok then - minetest.log("action", S("@1 wrote \"@2\" to sign at @3", + log("action", "%s wrote %q to sign at %s", (playername or ""), - fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"), + fields.text:gsub("\n", "\\n"), pos_string - )) + ) signs_lib.update_sign(pos, fields) elseif fields.wide_on or fields.wide_off or fields.uni_on or fields.uni_off then local node = minetest.get_node(pos) @@ -1357,20 +1414,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end if change_wide then - minetest.log("action", S("@1 flipped the wide-font switch to \"@2\" at @3", + log("action", "%s flipped the wide-font switch to %q at %s", (playername or ""), (fields.wide_on and "off" or "on"), minetest.pos_to_string(pos) - )) + ) signs_lib.update_sign(pos, fields) minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) end if change_uni then - minetest.log("action", S("@1 flipped the unicode-font switch to \"@2\" at @3", + log("action", "%s flipped the unicode-font switch to %q at %s", (playername or ""), (fields.uni_on and "off" or "on"), minetest.pos_to_string(pos) - )) + ) signs_lib.update_sign(pos, fields) minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) end diff --git a/mods/signs_lib/compat.lua b/mods/signs_lib/compat.lua index b9a04a79..137d77ef 100644 --- a/mods/signs_lib/compat.lua +++ b/mods/signs_lib/compat.lua @@ -1,16 +1,17 @@ +if minetest.get_modpath("default") then + local default_fences = { + "default:fence_wood", + "default:fence_acacia_wood", + "default:fence_aspen_wood", + "default:fence_junglewood", + "default:fence_pine_wood" + } -local default_fences = { - "default:fence_wood", - "default:fence_acacia_wood", - "default:fence_aspen_wood", - "default:fence_junglewood", - "default:fence_pine_wood" -} - -for _, n in ipairs(default_fences) do - minetest.override_item(n, { - check_for_pole = true - }) + for _, n in ipairs(default_fences) do + minetest.override_item(n, { + check_for_pole = true + }) + end end if minetest.get_modpath("cottages") then diff --git a/mods/signs_lib/encoding.lua b/mods/signs_lib/encoding.lua index c7c35d1b..fbb77313 100644 --- a/mods/signs_lib/encoding.lua +++ b/mods/signs_lib/encoding.lua @@ -231,6 +231,7 @@ signs_lib.unicode_install({38,"26"}) dofile(signs_lib.path.."/nonascii-de.lua") dofile(signs_lib.path.."/nonascii-fr.lua") dofile(signs_lib.path.."/nonascii-pl.lua") +dofile(signs_lib.path.."/nonascii-ua.lua") local nmdc = { [36] = "$", diff --git a/mods/signs_lib/init.lua b/mods/signs_lib/init.lua index d094dbb6..7518df46 100644 --- a/mods/signs_lib/init.lua +++ b/mods/signs_lib/init.lua @@ -7,8 +7,9 @@ signs_lib = {} signs_lib.path = minetest.get_modpath(minetest.get_current_modname()) -local S = dofile(signs_lib.path .. "/intllib.lua") -signs_lib.gettext = S +signs_lib.S = minetest.get_translator(minetest.get_current_modname()) + +signs_lib.edit_priv = minetest.settings:get("signs_lib.edit_priv") or "signslib_edit" dofile(signs_lib.path.."/encoding.lua") dofile(signs_lib.path.."/api.lua") diff --git a/mods/signs_lib/intllib.lua b/mods/signs_lib/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/signs_lib/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/signs_lib/locale/de.po b/mods/signs_lib/locale/de.po deleted file mode 100644 index a2f4150f..00000000 --- a/mods/signs_lib/locale/de.po +++ /dev/null @@ -1,97 +0,0 @@ -# German Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# Xanthin, 2017. -# CodeXP , 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:31+0200\n" -"PO-Revision-Date: 2018-03-24 22:00+0100\n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: init.lua -msgid "Write" -msgstr "schreiben" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "gesperrter Schild, gehört @1\n" - -#: init.lua -msgid "locked " -msgstr "gesperrt " - -#: init.lua -#, fuzzy -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 schrieb \"@2\" auf das @3Schild bei @4" - -#: init.lua -msgid "Sign" -msgstr "Schild" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Kann alle gesperrte Schilder bearbeiten" - -#: init.lua -msgid "Locked Sign" -msgstr "gesperrter Schild" - -#: init.lua -msgid "green" -msgstr "grün" - -#: init.lua -msgid "yellow" -msgstr "gelb" - -#: init.lua -msgid "red" -msgstr "rot" - -#: init.lua -msgid "white_red" -msgstr "weißrot" - -#: init.lua -msgid "white_black" -msgstr "schwarzweiß" - -#: init.lua -msgid "orange" -msgstr "orange" - -#: init.lua -msgid "blue" -msgstr "blau" - -#: init.lua -msgid "brown" -msgstr "braun" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Schild (@1, Metall)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Versuch ein unbekanntes Element als Zaun zu registrieren" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Registrierte @1 und @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] Schilder-Mod geladen" diff --git a/mods/signs_lib/locale/es.po b/mods/signs_lib/locale/es.po deleted file mode 100644 index 85799370..00000000 --- a/mods/signs_lib/locale/es.po +++ /dev/null @@ -1,95 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:22+0200\n" -"PO-Revision-Date: 2017-07-31 18:30+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: Carlos Barraza\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: es\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "" - -#: init.lua -msgid "locked " -msgstr "bloqueada " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 escribio \"@2\" en el cartel @3en @4" - -#: init.lua -msgid "Sign" -msgstr "Letrero" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "" - -#: init.lua -#, fuzzy -msgid "Locked Sign" -msgstr "Letrero bloqueada" - -#: init.lua -msgid "green" -msgstr "verde" - -#: init.lua -msgid "yellow" -msgstr "amarillo" - -#: init.lua -msgid "red" -msgstr "rojo" - -#: init.lua -#, fuzzy -msgid "white_red" -msgstr "rojo y blanco" - -#: init.lua -#, fuzzy -msgid "white_black" -msgstr "negro y blanco" - -#: init.lua -msgid "orange" -msgstr "naranja" - -#: init.lua -msgid "blue" -msgstr "azul" - -#: init.lua -msgid "brown" -msgstr "marrón" - -#: init.lua -#, fuzzy -msgid "Sign (@1, metal)" -msgstr "Letrero (@1, metal)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Registrado @1 y @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] signs cargados" diff --git a/mods/signs_lib/locale/fr.po b/mods/signs_lib/locale/fr.po deleted file mode 100644 index a5035740..00000000 --- a/mods/signs_lib/locale/fr.po +++ /dev/null @@ -1,91 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:13+0200\n" -"PO-Revision-Date: 2017-07-31 18:22+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: fat115 \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "Panneau verrouillé, appartient à @1\n" - -#: init.lua -msgid "locked " -msgstr "verrouillé " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 a écrit \"@2\" sur le panneau @3en @4" - -#: init.lua -msgid "Sign" -msgstr "Panneau" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Peut modifier les panneaux verrouillés" - -#: init.lua -msgid "Locked Sign" -msgstr "Panneau (verrouillé)" - -#: init.lua -msgid "green" -msgstr "vert" - -#: init.lua -msgid "yellow" -msgstr "jaune" - -#: init.lua -msgid "red" -msgstr "rouge" - -#: init.lua -msgid "white_red" -msgstr "rouge et blanc" - -#: init.lua -msgid "white_black" -msgstr "noir et blanc" - -#: init.lua -msgid "orange" -msgstr "orange" - -#: init.lua -msgid "blue" -msgstr "bleu" - -#: init.lua -msgid "brown" -msgstr "marron" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Panneau (@1, métal)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Tentative d'enregistrer un nœud inconnu comme barrière" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Enregistrement de @1 et @" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] signs chargé" diff --git a/mods/signs_lib/locale/ms.po b/mods/signs_lib/locale/ms.po deleted file mode 100644 index da115120..00000000 --- a/mods/signs_lib/locale/ms.po +++ /dev/null @@ -1,91 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 18:00+0200\n" -"PO-Revision-Date: 2017-11-17 02:38+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "Papan tanda berkunci, milik @1\n" - -#: init.lua -msgid "locked " -msgstr "berkunci " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 menulis \"@2\" atas papan tanda @3dekat @4" - -#: init.lua -msgid "Sign" -msgstr "Papan Tanda" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Boleh sunting semua papan tanda berkunci" - -#: init.lua -msgid "Locked Sign" -msgstr "Papan Tanda Berkunci" - -#: init.lua -msgid "green" -msgstr "hijau" - -#: init.lua -msgid "yellow" -msgstr "kuning" - -#: init.lua -msgid "red" -msgstr "merah" - -#: init.lua -msgid "white_red" -msgstr "putih_merah" - -#: init.lua -msgid "white_black" -msgstr "putih_hitam" - -#: init.lua -msgid "orange" -msgstr "jingga" - -#: init.lua -msgid "blue" -msgstr "biru" - -#: init.lua -msgid "brown" -msgstr "perang" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Papan Tanda (@1, logam)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Cuba untuk mendaftar nod tidak diketahui sebagai pagar" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Telah daftar @1 dan @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MODS] signs telah dimuatkan" diff --git a/mods/signs_lib/locale/ru.po b/mods/signs_lib/locale/ru.po deleted file mode 100644 index 9cd01aa4..00000000 --- a/mods/signs_lib/locale/ru.po +++ /dev/null @@ -1,94 +0,0 @@ -# Russian Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: signs_lib\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-24 22:23+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Write" -msgstr "записать" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "защищенная табличка, пренадлежит @1\n" - -#: init.lua -msgid "locked " -msgstr "защищенный " - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "@1 записал \"@2\" в @3sign на @4" - -#: init.lua -msgid "Sign" -msgstr "табличка" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "Может редактировать все защищенные таблички" - -#: init.lua -msgid "Locked Sign" -msgstr "защищенная табличка" - -#: init.lua -msgid "green" -msgstr "зеленая" - -#: init.lua -msgid "yellow" -msgstr "желтая" - -#: init.lua -msgid "red" -msgstr "красная" - -#: init.lua -msgid "white_red" -msgstr "краснобелая" - -#: init.lua -msgid "white_black" -msgstr "чернобелая" - -#: init.lua -msgid "orange" -msgstr "оранжевая" - -#: init.lua -msgid "blue" -msgstr "синея" - -#: init.lua -msgid "brown" -msgstr "коричневая" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "Табличка (@1, металл)" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "Попытка зарегистрировать неизвестный узел как забор" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "Зарегистрировано @1 для @2" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "[MOD] мод табличек загружен" diff --git a/mods/signs_lib/locale/signs_lib.de.tr b/mods/signs_lib/locale/signs_lib.de.tr new file mode 100644 index 00000000..7152cdea --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.de.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Abgeschlossenes Schild, gehört @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Iteriert durch alle derzeit geladenen Kartenblöcke, die Schilder enthalten, löscht alle Entities innerhalb des Node-Raums eines jeden Schildes und erzeugt ihre Text-Entities, falls vorhanden, neu. +There are no signs in the currently-loaded terrain.=Im derzeit geladenen Gelände befinden sich keine Schilder. +Found a total of @1 sign nodes across @2 blocks.=Insgesamt wurden @1 Schild-Nodes über @2 Kartenblöcke gefunden. +Regenerating sign entities ...=Schild-Entities werden neu erzeugt ... +Finished.=Fertig. +Write=Schreiben +Unicode font=Unicode-Schrift +Wide font=Weite Schrift +Wooden Wall Sign=Holzwandschild +Steel Wall Sign=Stahlwandschild diff --git a/mods/signs_lib/locale/signs_lib.es.tr b/mods/signs_lib/locale/signs_lib.es.tr new file mode 100644 index 00000000..1b0f79ce --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.es.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Cartel bloqueado, propiedad de @1 +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Examina todos los bloques de mapas que contienen letreros cargados actualmente, elimina cualquier entidad dentro del espacio de nodo de cada cartel y regenera sus entidades de texto, si las hay. +There are no signs in the currently-loaded terrain.=No hay carteles en el terreno actual cargado. +Found a total of @1 sign nodes across @2 blocks.=Se han encontrado un total de @1 cartel(es) a traves de @2 bloque(s). +Regenerating sign entities ...=Regenerando entidades de los carteles... +Finished.=Terminado +Write=Escribir +Unicode font=Fuente unicode +Wide font=Fuente ancha +Wooden Wall Sign=Cartel de Madera +Steel Wall Sign=Cartel de Acero diff --git a/mods/signs_lib/locale/signs_lib.fr.tr b/mods/signs_lib/locale/signs_lib.fr.tr new file mode 100644 index 00000000..a2525d19 --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.fr.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Panneau verrouillé, appartient à @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/signs_lib.ms.tr b/mods/signs_lib/locale/signs_lib.ms.tr new file mode 100644 index 00000000..8cd632af --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.ms.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Papan tanda berkunci, milik @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/signs_lib.ru.tr b/mods/signs_lib/locale/signs_lib.ru.tr new file mode 100644 index 00000000..8b9f8f50 --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.ru.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=защищенная табличка, пренадлежит @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write=записать +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/template.pot b/mods/signs_lib/locale/template.pot deleted file mode 100644 index e277437f..00000000 --- a/mods/signs_lib/locale/template.pot +++ /dev/null @@ -1,94 +0,0 @@ -# LANGUAGE Translation for the signs_lib mod. -# Copyright (C) 2018 Vanessa Ezekowitz -# This file is distributed under the same license as the signs_lib package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: signs_lib\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-24 22:23+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Write" -msgstr "" - -#: init.lua -msgid "Locked sign, owned by @1\n" -msgstr "" - -#: init.lua -msgid "locked " -msgstr "" - -#: init.lua -msgid "@1 wrote \"@2\" to @3sign at @4" -msgstr "" - -#: init.lua -msgid "Sign" -msgstr "" - -#: init.lua -msgid "Can edit all locked signs" -msgstr "" - -#: init.lua -msgid "Locked Sign" -msgstr "" - -#: init.lua -msgid "green" -msgstr "" - -#: init.lua -msgid "yellow" -msgstr "" - -#: init.lua -msgid "red" -msgstr "" - -#: init.lua -msgid "white_red" -msgstr "" - -#: init.lua -msgid "white_black" -msgstr "" - -#: init.lua -msgid "orange" -msgstr "" - -#: init.lua -msgid "blue" -msgstr "" - -#: init.lua -msgid "brown" -msgstr "" - -#: init.lua -msgid "Sign (@1, metal)" -msgstr "" - -#: init.lua -msgid "Attempt to register unknown node as fence" -msgstr "" - -#: init.lua -msgid "Registered @1 and @2" -msgstr "" - -#: init.lua -msgid "[MOD] signs loaded" -msgstr "" diff --git a/mods/signs_lib/locale/template.txt b/mods/signs_lib/locale/template.txt new file mode 100644 index 00000000..b20520b3 --- /dev/null +++ b/mods/signs_lib/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n= +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/mod.conf b/mods/signs_lib/mod.conf index 82af3616..84414c99 100644 --- a/mods/signs_lib/mod.conf +++ b/mods/signs_lib/mod.conf @@ -1,6 +1,5 @@ name = signs_lib author = VanessaE -depends = default -optional_depends = intllib, screwdriver, streetspoles, streetlamps, cottages, prefab_redo +optional_depends = screwdriver, streetspoles, streetlamps, cottages, prefab_redo, default description = Adds signs with readable text. min_minetest_version = 5.4.0 diff --git a/mods/signs_lib/nonascii-ua.lua b/mods/signs_lib/nonascii-ua.lua new file mode 100644 index 00000000..09b05130 --- /dev/null +++ b/mods/signs_lib/nonascii-ua.lua @@ -0,0 +1,8 @@ +signs_lib.unicode_install({208,132,"0404"}) +signs_lib.unicode_install({208,134,"0406"}) +signs_lib.unicode_install({208,135,"0407"}) +signs_lib.unicode_install({209,148,"0454"}) +signs_lib.unicode_install({209,150,"0456"}) +signs_lib.unicode_install({209,151,"0457"}) +signs_lib.unicode_install({210,144,"0490"}) +signs_lib.unicode_install({210,145,"0491"}) diff --git a/mods/signs_lib/settingstypes.txt b/mods/signs_lib/settingstypes.txt new file mode 100644 index 00000000..81ba0352 --- /dev/null +++ b/mods/signs_lib/settingstypes.txt @@ -0,0 +1 @@ +signs_lib.edit_priv (Allows to rotate signs and to open (and consequently edit) any default sign formspec) string signslib_edit diff --git a/mods/signs_lib/standard_signs.lua b/mods/signs_lib/standard_signs.lua index 8d7a9e78..edbfefca 100644 --- a/mods/signs_lib/standard_signs.lua +++ b/mods/signs_lib/standard_signs.lua @@ -1,60 +1,63 @@ -- Definitions for standard minetest_game wooden and steel wall signs -signs_lib.register_sign("default:sign_wall_wood", { - description = "Wooden wall sign", - inventory_image = "signs_lib_sign_wall_wooden_inv.png", - tiles = { - "signs_lib_sign_wall_wooden.png", - "signs_lib_sign_wall_wooden_edges.png", - -- items 3 - 5 are not set, so signs_lib will use its standard pole - -- mount, hanging, and yard sign stick textures. - }, - entity_info = "standard", - allow_hanging = true, - allow_widefont = true, - allow_onpole = true, - allow_onpole_horizontal = true, - allow_yard = true, - use_texture_alpha = "clip", -}) +local S = signs_lib.S -signs_lib.register_sign("default:sign_wall_steel", { - description = "Steel wall sign", - inventory_image = "signs_lib_sign_wall_steel_inv.png", - tiles = { - "signs_lib_sign_wall_steel.png", - "signs_lib_sign_wall_steel_edges.png", - nil, -- not set, so it'll use the standard pole mount texture - nil, -- not set, so it'll use the standard hanging chains texture - "default_steel_block.png" -- for the yard sign's stick - }, - groups = signs_lib.standard_steel_groups, - sounds = signs_lib.standard_steel_sign_sounds, - locked = true, - entity_info = "standard", - allow_hanging = true, - allow_widefont = true, - allow_onpole = true, - allow_onpole_horizontal = true, - allow_yard = true, - use_texture_alpha = "clip", -}) +if minetest.get_modpath("default") then + signs_lib.register_sign("default:sign_wall_wood", { + description = S("Wooden Wall Sign"), + inventory_image = "signs_lib_sign_wall_wooden_inv.png", + tiles = { + "signs_lib_sign_wall_wooden.png", + "signs_lib_sign_wall_wooden_edges.png", + -- items 3 - 5 are not set, so signs_lib will use its standard pole + -- mount, hanging, and yard sign stick textures. + }, + entity_info = "standard", + allow_hanging = true, + allow_widefont = true, + allow_onpole = true, + allow_onpole_horizontal = true, + allow_yard = true, + use_texture_alpha = "clip", + }) -minetest.register_alias("signs:sign_hanging", "default:sign_wood_hanging") -minetest.register_alias("basic_signs:hanging_sign", "default:sign_wood_hanging") -minetest.register_alias("signs:sign_yard", "default:sign_wood_yard") -minetest.register_alias("basic_signs:yard_sign", "default:sign_wood_yard") + signs_lib.register_sign("default:sign_wall_steel", { + description = S("Steel Wall Sign"), + inventory_image = "signs_lib_sign_wall_steel_inv.png", + tiles = { + "signs_lib_sign_wall_steel.png", + "signs_lib_sign_wall_steel_edges.png", + nil, -- not set, so it'll use the standard pole mount texture + nil, -- not set, so it'll use the standard hanging chains texture + "default_steel_block.png" -- for the yard sign's stick + }, + groups = signs_lib.standard_steel_groups, + sounds = signs_lib.standard_steel_sign_sounds, + locked = true, + entity_info = "standard", + allow_hanging = true, + allow_widefont = true, + allow_onpole = true, + allow_onpole_horizontal = true, + allow_yard = true, + use_texture_alpha = "clip", + }) -minetest.register_alias("default:sign_wall_wood_onpole", "default:sign_wood_onpole") -minetest.register_alias("default:sign_wall_wood_onpole_horiz", "default:sign_wood_onpole_horiz") -minetest.register_alias("default:sign_wall_wood_hanging", "default:sign_wood_hanging") -minetest.register_alias("default:sign_wall_wood_yard", "default:sign_wood_yard") + minetest.register_alias("signs:sign_hanging", "default:sign_wood_hanging") + minetest.register_alias("basic_signs:hanging_sign", "default:sign_wood_hanging") + minetest.register_alias("signs:sign_yard", "default:sign_wood_yard") + minetest.register_alias("basic_signs:yard_sign", "default:sign_wood_yard") -minetest.register_alias("default:sign_wall_steel_onpole", "default:sign_steel_onpole") -minetest.register_alias("default:sign_wall_steel_onpole_horiz", "default:sign_steel_onpole_horiz") -minetest.register_alias("default:sign_wall_steel_hanging", "default:sign_steel_hanging") -minetest.register_alias("default:sign_wall_steel_yard", "default:sign_steel_yard") + minetest.register_alias("default:sign_wall_wood_onpole", "default:sign_wood_onpole") + minetest.register_alias("default:sign_wall_wood_onpole_horiz", "default:sign_wood_onpole_horiz") + minetest.register_alias("default:sign_wall_wood_hanging", "default:sign_wood_hanging") + minetest.register_alias("default:sign_wall_wood_yard", "default:sign_wood_yard") + minetest.register_alias("default:sign_wall_steel_onpole", "default:sign_steel_onpole") + minetest.register_alias("default:sign_wall_steel_onpole_horiz", "default:sign_steel_onpole_horiz") + minetest.register_alias("default:sign_wall_steel_hanging", "default:sign_steel_hanging") + minetest.register_alias("default:sign_wall_steel_yard", "default:sign_steel_yard") +end table.insert(signs_lib.lbm_restore_nodes, "signs:sign_hanging") table.insert(signs_lib.lbm_restore_nodes, "basic_signs:hanging_sign") diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0404.png b/mods/signs_lib/textures/signs_lib_font_16px_0404.png new file mode 100644 index 00000000..80ac21c7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0404.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0406.png b/mods/signs_lib/textures/signs_lib_font_16px_0406.png new file mode 100644 index 00000000..6828ac27 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0406.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0407.png b/mods/signs_lib/textures/signs_lib_font_16px_0407.png new file mode 100644 index 00000000..26746330 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0407.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0454.png b/mods/signs_lib/textures/signs_lib_font_16px_0454.png new file mode 100644 index 00000000..2dbfd19e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0454.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0456.png b/mods/signs_lib/textures/signs_lib_font_16px_0456.png new file mode 100644 index 00000000..285cd499 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0456.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0457.png b/mods/signs_lib/textures/signs_lib_font_16px_0457.png new file mode 100644 index 00000000..62b99aa6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0457.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0490.png b/mods/signs_lib/textures/signs_lib_font_16px_0490.png new file mode 100644 index 00000000..796629f9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0490.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0491.png b/mods/signs_lib/textures/signs_lib_font_16px_0491.png new file mode 100644 index 00000000..653d14a1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0491.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0404.png b/mods/signs_lib/textures/signs_lib_font_32px_0404.png new file mode 100644 index 00000000..3f11bc67 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0404.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0406.png b/mods/signs_lib/textures/signs_lib_font_32px_0406.png new file mode 100644 index 00000000..f47b5229 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0406.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0407.png b/mods/signs_lib/textures/signs_lib_font_32px_0407.png new file mode 100644 index 00000000..1fc4bc4e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0407.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0454.png b/mods/signs_lib/textures/signs_lib_font_32px_0454.png new file mode 100644 index 00000000..a0693cd3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0454.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0456.png b/mods/signs_lib/textures/signs_lib_font_32px_0456.png new file mode 100644 index 00000000..31a601dd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0456.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0457.png b/mods/signs_lib/textures/signs_lib_font_32px_0457.png new file mode 100644 index 00000000..a4195b01 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0457.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0490.png b/mods/signs_lib/textures/signs_lib_font_32px_0490.png new file mode 100644 index 00000000..930fd462 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0490.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0491.png b/mods/signs_lib/textures/signs_lib_font_32px_0491.png new file mode 100644 index 00000000..f697b553 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0491.png differ diff --git a/mods/signs_lib/models/basic_signs wooden yard sign two sticks.blend b/mods/signs_lib/util/blender/basic_signs wooden yard sign two sticks.blend similarity index 100% rename from mods/signs_lib/models/basic_signs wooden yard sign two sticks.blend rename to mods/signs_lib/util/blender/basic_signs wooden yard sign two sticks.blend diff --git a/mods/signs_lib/models/slim pole mount already positioned.blend b/mods/signs_lib/util/blender/slim pole mount already positioned.blend similarity index 100% rename from mods/signs_lib/models/slim pole mount already positioned.blend rename to mods/signs_lib/util/blender/slim pole mount already positioned.blend diff --git a/mods/signs_lib/models/standard pole mount already positioned.blend b/mods/signs_lib/util/blender/standard pole mount already positioned.blend similarity index 100% rename from mods/signs_lib/models/standard pole mount already positioned.blend rename to mods/signs_lib/util/blender/standard pole mount already positioned.blend diff --git a/mods/signs_lib/models/standard pole mount already positioned.blend1 b/mods/signs_lib/util/blender/standard pole mount already positioned.blend1 similarity index 100% rename from mods/signs_lib/models/standard pole mount already positioned.blend1 rename to mods/signs_lib/util/blender/standard pole mount already positioned.blend1 diff --git a/mods/signs_lib/models/standard wooden sign.blend b/mods/signs_lib/util/blender/standard wooden sign.blend similarity index 100% rename from mods/signs_lib/models/standard wooden sign.blend rename to mods/signs_lib/util/blender/standard wooden sign.blend diff --git a/mods/signs_lib/models/standard wooden sign.blend1 b/mods/signs_lib/util/blender/standard wooden sign.blend1 similarity index 100% rename from mods/signs_lib/models/standard wooden sign.blend1 rename to mods/signs_lib/util/blender/standard wooden sign.blend1 diff --git a/mods/signs_lib/models/standard wooden yard sign.blend b/mods/signs_lib/util/blender/standard wooden yard sign.blend similarity index 100% rename from mods/signs_lib/models/standard wooden yard sign.blend rename to mods/signs_lib/util/blender/standard wooden yard sign.blend diff --git a/mods/signs_lib/util/nonascii-ua b/mods/signs_lib/util/nonascii-ua new file mode 100644 index 00000000..ac014151 --- /dev/null +++ b/mods/signs_lib/util/nonascii-ua @@ -0,0 +1,8 @@ +ґ +і +ї +є +Ґ +І +Ї +Є \ No newline at end of file diff --git a/mods/skinsdb/.luacheckrc b/mods/skinsdb/.luacheckrc new file mode 100644 index 00000000..3b47b2d6 --- /dev/null +++ b/mods/skinsdb/.luacheckrc @@ -0,0 +1,14 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +globals = { + "minetest", "unified_inventory", "core", + "player_api", "clothing", "armor", "sfinv", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + "hand_monoid", +} diff --git a/mods/skinsdb/API.md b/mods/skinsdb/API.md index 29582790..c60c7606 100644 --- a/mods/skinsdb/API.md +++ b/mods/skinsdb/API.md @@ -27,6 +27,31 @@ Get all allowed skins for player. All public and all player's private skins. If Get all skins with metadata key is set to value. Example: skins.get_skinlist_with_meta("playername", playername) - Get all private skins (w.o. public) for playername +## skins.register_skin(path, filename) +Registers a new skin based on the texture file path specified by `path` and `filename`. + + * `path` (string): points to the parent directory of the texture `filename`. + Generally, this should be in the format `mymod.modpath .. "/textures"`. + * `filename` (string): full file name, without any path specifications. + The file name must adhere to [one of the accepted naming formats](textures/readme.txt). + +Note: this function takes the following files into consideration: + +1. `/` (required) + * Main skin texture +2. `/preview.png` (optional) + * Pre-generated preview image +3. `/../meta/.txt` (optional) + * Metadata regarding the skin + +Return values: + + * On failure: `false, reason` + * `reason` (string): human readable reason string (similar to `io.open` errors) + * On success: `true, key` + * `key`: unique skins key for use with e.g. `skins.get(key)` for subsequent + fine-tuning of the skin registration. + ## skins.new(key, object) Create and register a new skin object for given key @@ -55,6 +80,17 @@ Get the skin texture for any reason. Note to apply them the skin:set_skin() shou Could be redefined for dynamic texture generation +## skin:set_hand(hand_node) +Set the hand node to be used with this skin + +## skin:set_hand_from_texture() +Register and set hand node based on skin texture. +Uses different model depending on get_meta("format") ("1.0" or "1.8") +Only works on mod load + +## skin:get_hand() +Get hand node. Returns ItemStack + ## skin:set_preview(texture) Set the skin preview - usually at the init time only @@ -67,7 +103,7 @@ Could be redefined for dynamic preview texture generation Hook for dynamic skins updates on select. Is called in skins.set_player_skin() In skinsdb the default implementation for this function is empty. -skin:apply_skin_to_player(player) +## skin:apply_skin_to_player(player) Apply the skin to the player. Called in skins.update_player_skin() to update visuals ## skin:set_meta(key, value) @@ -80,7 +116,7 @@ The next metadata keys are filled or/and used interally in skinsdb framework - name - A name for the skin - author - The skin author - license - THe skin texture license - - assignment - (obsolete) is "player:playername" in case the skin is assigned to be privat for a player + - assignment - (obsolete) is "player:playername" in case the skin is assigned to be private for a player - playername - Player assignment for private skin. Set false for skins not usable by all players (like NPC-Skins), true or nothing for all player skins - in_inventory_list - If set to false the skin is not visible in inventory skins selection but can be still applied to the player - _sort_id - Thi skins lists are sorted by this field for output (internal key) diff --git a/mods/skinsdb/README.md b/mods/skinsdb/README.md index 8a49f59b..4c5c26b6 100644 --- a/mods/skinsdb/README.md +++ b/mods/skinsdb/README.md @@ -15,19 +15,21 @@ This Minetest mod offers changeable player skins with a graphical interface for - Support for different skins lists: public and a per-player list are currently implemented - Full [3d_armor](https://forum.minetest.net/viewtopic.php?t=4654) support - Compatible to 1.0 and 1.8 Minecraft skins format +- Skinned hand in 1st person view (1.0 skins only) ## Installing skins -### Download from the [database](http://minetest.fensta.bplaced.net/) +### Download from the [database](https://skinsdb.terraqueststudios.net/) #### Ingame Downloader 1) Get Minetest 5.1.0-dev-cb00632 or newer -2) Start your world -3) Run `/skinsdb_download_skins ` -4) Wait for the Minetest server to shut down -5) Start the server again +2) In the settings menu show advanced options, find the "Developer Options" tab and add "skinsdb" to "Trusted mods" (secure.trusted_mods in minetest.conf) +3) Start your world +4) Run `/skinsdb_download_skins ` +5) Wait for the Minetest server to shut down +6) Start the server again You might want to run `minetest` in a Terminal/Console window to check the log output instantly. @@ -53,6 +55,7 @@ The Script will download all the skins from the database for you. ## License: - GPLv3 - skin texture licenses: See "meta" folder +- hand model: CC0 ### Credits @@ -62,3 +65,4 @@ The Script will download all the skins from the database for you. - Krock (source code) - bell07 (source code) - stujones11 (player models) +- jordan4ibanez (1st person view hand) diff --git a/mods/skinsdb/api.lua b/mods/skinsdb/api.lua index 92e1a3f0..c4088107 100644 --- a/mods/skinsdb/api.lua +++ b/mods/skinsdb/api.lua @@ -2,14 +2,26 @@ local storage = minetest.get_mod_storage() function skins.get_player_skin(player) + local player_name = player:get_player_name() local meta = player:get_meta() if meta:get("skinsdb:skin_key") then -- Move player data prior July 2018 to mod storage - storage:set_string(player:get_player_name(), meta:get_string("skinsdb:skin_key")) + storage:set_string(player_name, meta:get_string("skinsdb:skin_key")) meta:set_string("skinsdb:skin_key", "") end - local skin = storage:get_string(player:get_player_name()) - return skins.get(skin) or skins.get(skins.default) + + local skin_name = storage:get_string(player_name) + local skin = skins.get(skin_name) + if #skin_name > 0 and not skin then + -- Migration step to convert `_`-delimited skins to `.` (if possible) + skin = skins.__fuzzy_match_skin_name(player_name, skin_name, true) + if skin then + storage:set_string(player_name, skin:get_key()) + else + storage:set_string(player_name, "") + end + end + return skin or skins.get(skins.default) end -- Assign skin to player @@ -34,7 +46,7 @@ function skins.assign_player_skin(player, skin) else return false end - return true + return true, skin_obj end -- update visuals @@ -53,10 +65,11 @@ end -- Assign and update - should be used on selection externally function skins.set_player_skin(player, skin) - local success = skins.assign_player_skin(player, skin) + local success, skin_obj = skins.assign_player_skin(player, skin) if success then skins.get_player_skin(player):set_skin(player) skins.update_player_skin(player) + minetest.log("action", player:get_player_name().." set skin to "..skin_obj:get_key("")) end return success end diff --git a/mods/skinsdb/chatcommands.lua b/mods/skinsdb/chatcommands.lua index 25e43d01..a60c1ca7 100644 --- a/mods/skinsdb/chatcommands.lua +++ b/mods/skinsdb/chatcommands.lua @@ -11,7 +11,7 @@ end minetest.register_chatcommand("skinsdb", { - params = "[set] | show [] | list | list private | list public | [ui]", + params = S("[set] | show [] | list | list private | list public | [ui]"), description = S("Show, list or set player's skin"), func = function(name, param) local player = minetest.get_player_by_name(name) diff --git a/mods/skinsdb/formspecs.lua b/mods/skinsdb/formspecs.lua index 70a5dd86..3241143f 100644 --- a/mods/skinsdb/formspecs.lua +++ b/mods/skinsdb/formspecs.lua @@ -1,5 +1,5 @@ local S = minetest.get_translator("skinsdb") -local ui = unified_inventory +local ui = minetest.global_exists("unified_inventory") and unified_inventory function skins.get_formspec_context(player) if player then @@ -57,7 +57,7 @@ function skins.get_skin_selection_formspec(player, context, perplayer_formspec) local yspc = 2 local skinwidth = 1 local skinheight = 2 - local xscale = 1 + local xscale = 1 -- luacheck: ignore local btn_y = 8.15 local drop_y = 8 local btn_width = 1 @@ -104,7 +104,7 @@ function skins.get_skin_selection_formspec(player, context, perplayer_formspec) local page = context.skins_page local formspec = "" - + for i = (page-1)*maxdisp+1, page*maxdisp do local skin = context.skins_list[i] if not skin then diff --git a/mods/skinsdb/init.lua b/mods/skinsdb/init.lua index 33345edb..836f2bc8 100644 --- a/mods/skinsdb/init.lua +++ b/mods/skinsdb/init.lua @@ -63,6 +63,13 @@ end) minetest.register_on_leaveplayer(function(player) skins.ui_context[player:get_player_name()] = nil + player:get_inventory():set_size("hand", 0) +end) + +minetest.register_on_shutdown(function() + for _, player in pairs(minetest.get_connected_players()) do + player:get_inventory():set_size("hand", 0) + end end) player_api.register_model("skinsdb_3d_armor_character_5.b3d", { @@ -80,6 +87,10 @@ player_api.register_model("skinsdb_3d_armor_character_5.b3d", { mine = {x=189, y=198}, walk_mine = {x=200, y=219}, sit = {x=81, y=160}, + -- compatibility w/ the emote mod + wave = {x = 192, y = 196, override_local = true}, + point = {x = 196, y = 196, override_local = true}, + freeze = {x = 205, y = 205, override_local = true}, }, }) @@ -91,4 +102,15 @@ if not default_skin_obj then default_skin_obj:set_meta("format", '1.0') default_skin_obj:set_meta("_sort_id", 0) default_skin_obj:set_meta("name", "Sam") + default_skin_obj:set_hand_from_texture() end + +-- Secure hand inventory slot +minetest.register_allow_player_inventory_action(function(player, action, inv, data) + if data.to_list == "hand" or data.from_list == "hand" or data.listname == "hand" then + return 0 + end +end) + +--dofile(skins.modpath.."/unittest.lua") + diff --git a/mods/skinsdb/locale/skinsdb.de.tr b/mods/skinsdb/locale/skinsdb.de.tr index 8813756f..dc15284a 100644 --- a/mods/skinsdb/locale/skinsdb.de.tr +++ b/mods/skinsdb/locale/skinsdb.de.tr @@ -1,19 +1,19 @@ # textdomain: skinsdb -# Translation by Xanthin - -Raw texture=Rohtextur -Name=Name -Author=Autor -Change=Wechseln -Page=Seite -License=Lizenz -Description=Beschreibung +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Anzeigen oder setzen der Spieler-Skins Player not found=Spieler nicht da unknown command=unbekannter Befehl see /help skinsdb for supported parameters=Lese /help für erlaubte Parameter skin set to=Skin ist jetzt invalid skin=unbekannter Skin -unknown parameter=unbekannter Parameter -Skins=Aussehen Requires skin key=Benötigt Skin-Name +unknown parameter=unbekannter Parameter +Raw texture=Rohtextur +Page=Seite +Name=Name +Author=Autor +License=Lizenz + = +Downloads the specified range of skins and shuts down the server= +Change=Wechseln +Skins=Aussehen diff --git a/mods/skinsdb/locale/skinsdb.eo.tr b/mods/skinsdb/locale/skinsdb.eo.tr new file mode 100644 index 00000000..f683d7a1 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.eo.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]=[set] | show [] | list | list private | list public | [ui] +Show, list or set player's skin=Montri haŭtojn («show»), listigi haŭtojn («list»), aŭ agordi onian haŭton («set») +Player not found=Ludanto ne trovita +unknown command=nekonata ordono +see /help skinsdb for supported parameters=rulu «/help skinsdb» por vidi subtenatajn parametrojn +skin set to=haŭto agordita al +invalid skin=nevalida haŭto +Requires skin key=Postulas haŭtonomon +unknown parameter=nekonata parametro +Raw texture=Kruda bildo +Page=Paĝo +Name=Nomo +Author=Aŭtoro +License=Permesilo + = +Downloads the specified range of skins and shuts down the server=Elŝutinte haŭtojn el skindb inter la donitaj paĝoj, restartigas la servilon +Change=Ŝanĝi +Skins=Haŭtoj diff --git a/mods/skinsdb/locale/skinsdb.fr.tr b/mods/skinsdb/locale/skinsdb.fr.tr index 7122d781..5b072b56 100644 --- a/mods/skinsdb/locale/skinsdb.fr.tr +++ b/mods/skinsdb/locale/skinsdb.fr.tr @@ -1,18 +1,19 @@ # textdomain: skinsdb - -Raw texture=Texture -Name=Nom -Author=Auteur -Change=Changer -Page=Page -License=Licence -Description=Description +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Afficher, lister ou définir le skin du joueur Player not found=Joueur non trouvé unknown command=commande inconnue see /help skinsdb for supported parameters=voir /help skinsdb pour les paramètres supportés skin set to=skin définie sur invalid skin=skin peau invalide +Requires skin key= unknown parameter=paramètre inconnu -unknown skin=skin inconnue - +Raw texture=Texture +Page=Page +Name=Nom +Author=Auteur +License=Licence + = +Downloads the specified range of skins and shuts down the server= +Change=Changer +Skins= diff --git a/mods/skinsdb/locale/skinsdb.ms.tr b/mods/skinsdb/locale/skinsdb.ms.tr index 61eb1a03..02fc27cb 100644 --- a/mods/skinsdb/locale/skinsdb.ms.tr +++ b/mods/skinsdb/locale/skinsdb.ms.tr @@ -1,18 +1,19 @@ # textdomain: skinsdb -# Malay translation by muhdnurhidayat - -Raw texture=Tekstur mentah -Name=Nama -Author=Pencipta -Change=Ubah -Page=Halaman -License=Lesen -Description=Keterangan +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Tunjukkan, senaraikan atau tetapkan kulit pemain Player not found=Pemain tidak dijumpai unknown command=perintah tidak diketahui see /help skinsdb for supported parameters=lihat /help skinsdb untuk parameter yang disokong skin set to=kulit ditetapkan kepada invalid skin=kulit tidak sah +Requires skin key= unknown parameter=parameter tidak diketahui -unknown skin=kulit tidak diketahui +Raw texture=Tekstur mentah +Page=Halaman +Name=Nama +Author=Pencipta +License=Lesen + = +Downloads the specified range of skins and shuts down the server= +Change=Ubah +Skins= diff --git a/mods/skinsdb/locale/skinsdb.pt_BR.tr b/mods/skinsdb/locale/skinsdb.pt_BR.tr new file mode 100644 index 00000000..d1246e24 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Mostrar, listar ou definir a skin do jogador +Player not found=Jogador não encontrado +unknown command=Comando desconhecido +see /help skinsdb for supported parameters= consulte /help skinsdb para obter os parâmetros suportados +skin set to=Aparência definida para +invalid skin=Aparência inválida +Requires skin key=Requer chave de aparência +unknown parameter=parâmetro desconhecido +Raw texture=Textura crua +Page=Página +Name=Nome +Author=Autor +License=Licença + = +Downloads the specified range of skins and shuts down the server=Baixa o intervalo especificado de capas e desliga o servidor +Change=Mudar +Skins=Aparência diff --git a/mods/skinsdb/locale/skinsdb.ru.tr b/mods/skinsdb/locale/skinsdb.ru.tr new file mode 100644 index 00000000..cab06185 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.ru.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Показать скин, список скинов, установить скин игрока +Player not found=Игрок не найден +unknown command=неизвестная команда +see /help skinsdb for supported parameters=смотрите /help skinsdb для просмотра параметров +skin set to=установлено скин +invalid skin=некорректный скин +Requires skin key=Зависимый идентификатор скина +unknown parameter=неопределенный параметр +Raw texture=Текстура +Page=Страница +Name=Имя +Author=Автор +License=Лицензия + = +Downloads the specified range of skins and shuts down the server=Загрузить массив скинов и остановить сервер +Change=Изменить +Skins=Скины diff --git a/mods/skinsdb/locale/skinsdb.uk.tr b/mods/skinsdb/locale/skinsdb.uk.tr new file mode 100644 index 00000000..dca44f50 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.uk.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Показати скін, список скінів, встановити скін гравця +Player not found=Гравець не знайдений +unknown command=невідома команда +see /help skinsdb for supported parameters=дивіться /help skinsdb для перегляду параметрів +skin set to=встановлено скін +invalid skin=некоректний скін +Requires skin key=Залежний ідентифікатор скіна +unknown parameter=невизначений параметр +Raw texture=Текстура +Page=Сторінка +Name=Ім'я +Author=Автор +License=Ліцензія + = +Downloads the specified range of skins and shuts down the server=Завантажити масив скінів та зупинити сервер +Change=Змінити +Skins=Скіни diff --git a/mods/skinsdb/locale/skinsdb.zh_CN.tr b/mods/skinsdb/locale/skinsdb.zh_CN.tr index b6832dd5..f608a1f7 100644 --- a/mods/skinsdb/locale/skinsdb.zh_CN.tr +++ b/mods/skinsdb/locale/skinsdb.zh_CN.tr @@ -1,20 +1,19 @@ # textdomain: skinsdb -#Translation by IFRFSX(BingFengFSX) - -Raw texture=自然状态的纹理 -Name=名称 -Author=作者 -Change=更换 -Page=页面 -License=许可证 -Description=说明 +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=显示,列出或者设置玩家的皮肤 Player not found=玩家未找到 unknown command=未知命令 see /help skinsdb for supported parameters=有关skinsdb支持的参数,参见 /help skin set to=皮肤设置为 invalid skin=无效皮肤 +Requires skin key= unknown parameter=未知参数 -unknown skin=未知皮肤 +Raw texture=自然状态的纹理 +Page=页面 +Name=名称 +Author=作者 +License=许可证 + = Downloads the specified range of skins and shuts down the server=下载指定范围的皮肤并关闭服务器 +Change=更换 Skins=皮肤 diff --git a/mods/skinsdb/locale/skinsdb.zh_TW.tr b/mods/skinsdb/locale/skinsdb.zh_TW.tr index 236b55d2..e51d5536 100644 --- a/mods/skinsdb/locale/skinsdb.zh_TW.tr +++ b/mods/skinsdb/locale/skinsdb.zh_TW.tr @@ -1,19 +1,19 @@ # textdomain: skinsdb -#Translation by IFRFSX(BingFengFSX) -Raw texture=自然狀態的紋理 -Name=名稱 -Author=作者 -Change=更換 -Page=頁面 -License=許可證 -Description=說明 -Show,list or set player's skin=顯示,列出或者設定玩家的皮膚 +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=顯示,列出或者設定玩家的皮膚 Player not found=玩家未找到 unknown command=未知命令 see /help skinsdb for supported parameters=有關skinsdb支持的參數,參見/help skin set to=皮膚設定為 invalid skin=無效皮膚 +Requires skin key= unknown parameter=未知參數 -unknown skin=未知皮膚 +Raw texture=自然狀態的紋理 +Page=頁面 +Name=名稱 +Author=作者 +License=許可證 + = Downloads the specified range of skins and shuts down the server=下載指定範圍的皮膚並關閉服務器 +Change=更換 Skins=皮膚 diff --git a/mods/skinsdb/locale/template.txt b/mods/skinsdb/locale/template.txt index 35d3021c..d2285fc4 100644 --- a/mods/skinsdb/locale/template.txt +++ b/mods/skinsdb/locale/template.txt @@ -1,20 +1,19 @@ # textdomain: skinsdb - -Raw texture= -Name= -Author= -Change= -Page= -License= -Description= +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin= Player not found= unknown command= see /help skinsdb for supported parameters= skin set to= invalid skin= -unknown parameter= -unknown skin= -Downloads the specified range of skins and shuts down the server= -Skins= Requires skin key= +unknown parameter= +Raw texture= +Page= +Name= +Author= +License= + = +Downloads the specified range of skins and shuts down the server= +Change= +Skins= diff --git a/mods/skinsdb/meta/character_1.txt b/mods/skinsdb/meta/character.1.txt similarity index 100% rename from mods/skinsdb/meta/character_1.txt rename to mods/skinsdb/meta/character.1.txt diff --git a/mods/skinsdb/meta/character_10.txt b/mods/skinsdb/meta/character.10.txt similarity index 100% rename from mods/skinsdb/meta/character_10.txt rename to mods/skinsdb/meta/character.10.txt diff --git a/mods/skinsdb/meta/character_1000.txt b/mods/skinsdb/meta/character.1000.txt similarity index 100% rename from mods/skinsdb/meta/character_1000.txt rename to mods/skinsdb/meta/character.1000.txt diff --git a/mods/skinsdb/meta/character_1001.txt b/mods/skinsdb/meta/character.1001.txt similarity index 100% rename from mods/skinsdb/meta/character_1001.txt rename to mods/skinsdb/meta/character.1001.txt diff --git a/mods/skinsdb/meta/character_1002.txt b/mods/skinsdb/meta/character.1002.txt similarity index 100% rename from mods/skinsdb/meta/character_1002.txt rename to mods/skinsdb/meta/character.1002.txt diff --git a/mods/skinsdb/meta/character_1003.txt b/mods/skinsdb/meta/character.1003.txt similarity index 100% rename from mods/skinsdb/meta/character_1003.txt rename to mods/skinsdb/meta/character.1003.txt diff --git a/mods/skinsdb/meta/character_1004.txt b/mods/skinsdb/meta/character.1004.txt similarity index 100% rename from mods/skinsdb/meta/character_1004.txt rename to mods/skinsdb/meta/character.1004.txt diff --git a/mods/skinsdb/meta/character_1005.txt b/mods/skinsdb/meta/character.1005.txt similarity index 100% rename from mods/skinsdb/meta/character_1005.txt rename to mods/skinsdb/meta/character.1005.txt diff --git a/mods/skinsdb/meta/character_1006.txt b/mods/skinsdb/meta/character.1006.txt similarity index 100% rename from mods/skinsdb/meta/character_1006.txt rename to mods/skinsdb/meta/character.1006.txt diff --git a/mods/skinsdb/meta/character_1007.txt b/mods/skinsdb/meta/character.1007.txt similarity index 100% rename from mods/skinsdb/meta/character_1007.txt rename to mods/skinsdb/meta/character.1007.txt diff --git a/mods/skinsdb/meta/character_1008.txt b/mods/skinsdb/meta/character.1008.txt similarity index 100% rename from mods/skinsdb/meta/character_1008.txt rename to mods/skinsdb/meta/character.1008.txt diff --git a/mods/skinsdb/meta/character_1009.txt b/mods/skinsdb/meta/character.1009.txt similarity index 100% rename from mods/skinsdb/meta/character_1009.txt rename to mods/skinsdb/meta/character.1009.txt diff --git a/mods/skinsdb/meta/character_101.txt b/mods/skinsdb/meta/character.101.txt similarity index 100% rename from mods/skinsdb/meta/character_101.txt rename to mods/skinsdb/meta/character.101.txt diff --git a/mods/skinsdb/meta/character_1010.txt b/mods/skinsdb/meta/character.1010.txt similarity index 100% rename from mods/skinsdb/meta/character_1010.txt rename to mods/skinsdb/meta/character.1010.txt diff --git a/mods/skinsdb/meta/character_1011.txt b/mods/skinsdb/meta/character.1011.txt similarity index 100% rename from mods/skinsdb/meta/character_1011.txt rename to mods/skinsdb/meta/character.1011.txt diff --git a/mods/skinsdb/meta/character_1012.txt b/mods/skinsdb/meta/character.1012.txt similarity index 100% rename from mods/skinsdb/meta/character_1012.txt rename to mods/skinsdb/meta/character.1012.txt diff --git a/mods/skinsdb/meta/character_1013.txt b/mods/skinsdb/meta/character.1013.txt similarity index 100% rename from mods/skinsdb/meta/character_1013.txt rename to mods/skinsdb/meta/character.1013.txt diff --git a/mods/skinsdb/meta/character_1014.txt b/mods/skinsdb/meta/character.1014.txt similarity index 100% rename from mods/skinsdb/meta/character_1014.txt rename to mods/skinsdb/meta/character.1014.txt diff --git a/mods/skinsdb/meta/character_1015.txt b/mods/skinsdb/meta/character.1015.txt similarity index 100% rename from mods/skinsdb/meta/character_1015.txt rename to mods/skinsdb/meta/character.1015.txt diff --git a/mods/skinsdb/meta/character_1016.txt b/mods/skinsdb/meta/character.1016.txt similarity index 100% rename from mods/skinsdb/meta/character_1016.txt rename to mods/skinsdb/meta/character.1016.txt diff --git a/mods/skinsdb/meta/character_1017.txt b/mods/skinsdb/meta/character.1017.txt similarity index 100% rename from mods/skinsdb/meta/character_1017.txt rename to mods/skinsdb/meta/character.1017.txt diff --git a/mods/skinsdb/meta/character_1018.txt b/mods/skinsdb/meta/character.1018.txt similarity index 100% rename from mods/skinsdb/meta/character_1018.txt rename to mods/skinsdb/meta/character.1018.txt diff --git a/mods/skinsdb/meta/character_1019.txt b/mods/skinsdb/meta/character.1019.txt similarity index 100% rename from mods/skinsdb/meta/character_1019.txt rename to mods/skinsdb/meta/character.1019.txt diff --git a/mods/skinsdb/meta/character_1020.txt b/mods/skinsdb/meta/character.1020.txt similarity index 100% rename from mods/skinsdb/meta/character_1020.txt rename to mods/skinsdb/meta/character.1020.txt diff --git a/mods/skinsdb/meta/character_1021.txt b/mods/skinsdb/meta/character.1021.txt similarity index 100% rename from mods/skinsdb/meta/character_1021.txt rename to mods/skinsdb/meta/character.1021.txt diff --git a/mods/skinsdb/meta/character_1022.txt b/mods/skinsdb/meta/character.1022.txt similarity index 100% rename from mods/skinsdb/meta/character_1022.txt rename to mods/skinsdb/meta/character.1022.txt diff --git a/mods/skinsdb/meta/character_1023.txt b/mods/skinsdb/meta/character.1023.txt similarity index 100% rename from mods/skinsdb/meta/character_1023.txt rename to mods/skinsdb/meta/character.1023.txt diff --git a/mods/skinsdb/meta/character_1024.txt b/mods/skinsdb/meta/character.1024.txt similarity index 100% rename from mods/skinsdb/meta/character_1024.txt rename to mods/skinsdb/meta/character.1024.txt diff --git a/mods/skinsdb/meta/character_1025.txt b/mods/skinsdb/meta/character.1025.txt similarity index 100% rename from mods/skinsdb/meta/character_1025.txt rename to mods/skinsdb/meta/character.1025.txt diff --git a/mods/skinsdb/meta/character_1026.txt b/mods/skinsdb/meta/character.1026.txt similarity index 100% rename from mods/skinsdb/meta/character_1026.txt rename to mods/skinsdb/meta/character.1026.txt diff --git a/mods/skinsdb/meta/character_1027.txt b/mods/skinsdb/meta/character.1027.txt similarity index 100% rename from mods/skinsdb/meta/character_1027.txt rename to mods/skinsdb/meta/character.1027.txt diff --git a/mods/skinsdb/meta/character_1028.txt b/mods/skinsdb/meta/character.1028.txt similarity index 100% rename from mods/skinsdb/meta/character_1028.txt rename to mods/skinsdb/meta/character.1028.txt diff --git a/mods/skinsdb/meta/character_1029.txt b/mods/skinsdb/meta/character.1029.txt similarity index 100% rename from mods/skinsdb/meta/character_1029.txt rename to mods/skinsdb/meta/character.1029.txt diff --git a/mods/skinsdb/meta/character_1030.txt b/mods/skinsdb/meta/character.1030.txt similarity index 100% rename from mods/skinsdb/meta/character_1030.txt rename to mods/skinsdb/meta/character.1030.txt diff --git a/mods/skinsdb/meta/character_1031.txt b/mods/skinsdb/meta/character.1031.txt similarity index 100% rename from mods/skinsdb/meta/character_1031.txt rename to mods/skinsdb/meta/character.1031.txt diff --git a/mods/skinsdb/meta/character_1032.txt b/mods/skinsdb/meta/character.1032.txt similarity index 100% rename from mods/skinsdb/meta/character_1032.txt rename to mods/skinsdb/meta/character.1032.txt diff --git a/mods/skinsdb/meta/character_1033.txt b/mods/skinsdb/meta/character.1033.txt similarity index 100% rename from mods/skinsdb/meta/character_1033.txt rename to mods/skinsdb/meta/character.1033.txt diff --git a/mods/skinsdb/meta/character_1034.txt b/mods/skinsdb/meta/character.1034.txt similarity index 100% rename from mods/skinsdb/meta/character_1034.txt rename to mods/skinsdb/meta/character.1034.txt diff --git a/mods/skinsdb/meta/character_1035.txt b/mods/skinsdb/meta/character.1035.txt similarity index 100% rename from mods/skinsdb/meta/character_1035.txt rename to mods/skinsdb/meta/character.1035.txt diff --git a/mods/skinsdb/meta/character_1036.txt b/mods/skinsdb/meta/character.1036.txt similarity index 100% rename from mods/skinsdb/meta/character_1036.txt rename to mods/skinsdb/meta/character.1036.txt diff --git a/mods/skinsdb/meta/character_1037.txt b/mods/skinsdb/meta/character.1037.txt similarity index 100% rename from mods/skinsdb/meta/character_1037.txt rename to mods/skinsdb/meta/character.1037.txt diff --git a/mods/skinsdb/meta/character_1038.txt b/mods/skinsdb/meta/character.1038.txt similarity index 100% rename from mods/skinsdb/meta/character_1038.txt rename to mods/skinsdb/meta/character.1038.txt diff --git a/mods/skinsdb/meta/character_1039.txt b/mods/skinsdb/meta/character.1039.txt similarity index 100% rename from mods/skinsdb/meta/character_1039.txt rename to mods/skinsdb/meta/character.1039.txt diff --git a/mods/skinsdb/meta/character_1040.txt b/mods/skinsdb/meta/character.1040.txt similarity index 100% rename from mods/skinsdb/meta/character_1040.txt rename to mods/skinsdb/meta/character.1040.txt diff --git a/mods/skinsdb/meta/character_1041.txt b/mods/skinsdb/meta/character.1041.txt similarity index 100% rename from mods/skinsdb/meta/character_1041.txt rename to mods/skinsdb/meta/character.1041.txt diff --git a/mods/skinsdb/meta/character_1042.txt b/mods/skinsdb/meta/character.1042.txt similarity index 100% rename from mods/skinsdb/meta/character_1042.txt rename to mods/skinsdb/meta/character.1042.txt diff --git a/mods/skinsdb/meta/character_1043.txt b/mods/skinsdb/meta/character.1043.txt similarity index 62% rename from mods/skinsdb/meta/character_1043.txt rename to mods/skinsdb/meta/character.1043.txt index 84beb615..a0cf8774 100644 --- a/mods/skinsdb/meta/character_1043.txt +++ b/mods/skinsdb/meta/character.1043.txt @@ -1,3 +1,3 @@ -niño cool +niño cool daniel pereira CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1044.txt b/mods/skinsdb/meta/character.1044.txt similarity index 100% rename from mods/skinsdb/meta/character_1044.txt rename to mods/skinsdb/meta/character.1044.txt diff --git a/mods/skinsdb/meta/character_1045.txt b/mods/skinsdb/meta/character.1045.txt similarity index 100% rename from mods/skinsdb/meta/character_1045.txt rename to mods/skinsdb/meta/character.1045.txt diff --git a/mods/skinsdb/meta/character_1046.txt b/mods/skinsdb/meta/character.1046.txt similarity index 100% rename from mods/skinsdb/meta/character_1046.txt rename to mods/skinsdb/meta/character.1046.txt diff --git a/mods/skinsdb/meta/character_1047.txt b/mods/skinsdb/meta/character.1047.txt similarity index 100% rename from mods/skinsdb/meta/character_1047.txt rename to mods/skinsdb/meta/character.1047.txt diff --git a/mods/skinsdb/meta/character_1048.txt b/mods/skinsdb/meta/character.1048.txt similarity index 100% rename from mods/skinsdb/meta/character_1048.txt rename to mods/skinsdb/meta/character.1048.txt diff --git a/mods/skinsdb/meta/character_1049.txt b/mods/skinsdb/meta/character.1049.txt similarity index 100% rename from mods/skinsdb/meta/character_1049.txt rename to mods/skinsdb/meta/character.1049.txt diff --git a/mods/skinsdb/meta/character_1050.txt b/mods/skinsdb/meta/character.1050.txt similarity index 100% rename from mods/skinsdb/meta/character_1050.txt rename to mods/skinsdb/meta/character.1050.txt diff --git a/mods/skinsdb/meta/character_1051.txt b/mods/skinsdb/meta/character.1051.txt similarity index 100% rename from mods/skinsdb/meta/character_1051.txt rename to mods/skinsdb/meta/character.1051.txt diff --git a/mods/skinsdb/meta/character_1052.txt b/mods/skinsdb/meta/character.1052.txt similarity index 100% rename from mods/skinsdb/meta/character_1052.txt rename to mods/skinsdb/meta/character.1052.txt diff --git a/mods/skinsdb/meta/character_1053.txt b/mods/skinsdb/meta/character.1053.txt similarity index 100% rename from mods/skinsdb/meta/character_1053.txt rename to mods/skinsdb/meta/character.1053.txt diff --git a/mods/skinsdb/meta/character_1054.txt b/mods/skinsdb/meta/character.1054.txt similarity index 100% rename from mods/skinsdb/meta/character_1054.txt rename to mods/skinsdb/meta/character.1054.txt diff --git a/mods/skinsdb/meta/character_1055.txt b/mods/skinsdb/meta/character.1055.txt similarity index 100% rename from mods/skinsdb/meta/character_1055.txt rename to mods/skinsdb/meta/character.1055.txt diff --git a/mods/skinsdb/meta/character_1056.txt b/mods/skinsdb/meta/character.1056.txt similarity index 100% rename from mods/skinsdb/meta/character_1056.txt rename to mods/skinsdb/meta/character.1056.txt diff --git a/mods/skinsdb/meta/character_1057.txt b/mods/skinsdb/meta/character.1057.txt similarity index 100% rename from mods/skinsdb/meta/character_1057.txt rename to mods/skinsdb/meta/character.1057.txt diff --git a/mods/skinsdb/meta/character_1058.txt b/mods/skinsdb/meta/character.1058.txt similarity index 100% rename from mods/skinsdb/meta/character_1058.txt rename to mods/skinsdb/meta/character.1058.txt diff --git a/mods/skinsdb/meta/character_1059.txt b/mods/skinsdb/meta/character.1059.txt similarity index 100% rename from mods/skinsdb/meta/character_1059.txt rename to mods/skinsdb/meta/character.1059.txt diff --git a/mods/skinsdb/meta/character_1060.txt b/mods/skinsdb/meta/character.1060.txt similarity index 100% rename from mods/skinsdb/meta/character_1060.txt rename to mods/skinsdb/meta/character.1060.txt diff --git a/mods/skinsdb/meta/character_1061.txt b/mods/skinsdb/meta/character.1061.txt similarity index 100% rename from mods/skinsdb/meta/character_1061.txt rename to mods/skinsdb/meta/character.1061.txt diff --git a/mods/skinsdb/meta/character_1062.txt b/mods/skinsdb/meta/character.1062.txt similarity index 100% rename from mods/skinsdb/meta/character_1062.txt rename to mods/skinsdb/meta/character.1062.txt diff --git a/mods/skinsdb/meta/character_1063.txt b/mods/skinsdb/meta/character.1063.txt similarity index 100% rename from mods/skinsdb/meta/character_1063.txt rename to mods/skinsdb/meta/character.1063.txt diff --git a/mods/skinsdb/meta/character_1064.txt b/mods/skinsdb/meta/character.1064.txt similarity index 100% rename from mods/skinsdb/meta/character_1064.txt rename to mods/skinsdb/meta/character.1064.txt diff --git a/mods/skinsdb/meta/character_1065.txt b/mods/skinsdb/meta/character.1065.txt similarity index 100% rename from mods/skinsdb/meta/character_1065.txt rename to mods/skinsdb/meta/character.1065.txt diff --git a/mods/skinsdb/meta/character_1066.txt b/mods/skinsdb/meta/character.1066.txt similarity index 100% rename from mods/skinsdb/meta/character_1066.txt rename to mods/skinsdb/meta/character.1066.txt diff --git a/mods/skinsdb/meta/character_1067.txt b/mods/skinsdb/meta/character.1067.txt similarity index 100% rename from mods/skinsdb/meta/character_1067.txt rename to mods/skinsdb/meta/character.1067.txt diff --git a/mods/skinsdb/meta/character_1068.txt b/mods/skinsdb/meta/character.1068.txt similarity index 100% rename from mods/skinsdb/meta/character_1068.txt rename to mods/skinsdb/meta/character.1068.txt diff --git a/mods/skinsdb/meta/character_1069.txt b/mods/skinsdb/meta/character.1069.txt similarity index 100% rename from mods/skinsdb/meta/character_1069.txt rename to mods/skinsdb/meta/character.1069.txt diff --git a/mods/skinsdb/meta/character_1070.txt b/mods/skinsdb/meta/character.1070.txt similarity index 100% rename from mods/skinsdb/meta/character_1070.txt rename to mods/skinsdb/meta/character.1070.txt diff --git a/mods/skinsdb/meta/character_1071.txt b/mods/skinsdb/meta/character.1071.txt similarity index 100% rename from mods/skinsdb/meta/character_1071.txt rename to mods/skinsdb/meta/character.1071.txt diff --git a/mods/skinsdb/meta/character_1072.txt b/mods/skinsdb/meta/character.1072.txt similarity index 100% rename from mods/skinsdb/meta/character_1072.txt rename to mods/skinsdb/meta/character.1072.txt diff --git a/mods/skinsdb/meta/character_1073.txt b/mods/skinsdb/meta/character.1073.txt similarity index 100% rename from mods/skinsdb/meta/character_1073.txt rename to mods/skinsdb/meta/character.1073.txt diff --git a/mods/skinsdb/meta/character_1075.txt b/mods/skinsdb/meta/character.1075.txt similarity index 100% rename from mods/skinsdb/meta/character_1075.txt rename to mods/skinsdb/meta/character.1075.txt diff --git a/mods/skinsdb/meta/character_1076.txt b/mods/skinsdb/meta/character.1076.txt similarity index 100% rename from mods/skinsdb/meta/character_1076.txt rename to mods/skinsdb/meta/character.1076.txt diff --git a/mods/skinsdb/meta/character_1077.txt b/mods/skinsdb/meta/character.1077.txt similarity index 100% rename from mods/skinsdb/meta/character_1077.txt rename to mods/skinsdb/meta/character.1077.txt diff --git a/mods/skinsdb/meta/character_1078.txt b/mods/skinsdb/meta/character.1078.txt similarity index 100% rename from mods/skinsdb/meta/character_1078.txt rename to mods/skinsdb/meta/character.1078.txt diff --git a/mods/skinsdb/meta/character_1079.txt b/mods/skinsdb/meta/character.1079.txt similarity index 100% rename from mods/skinsdb/meta/character_1079.txt rename to mods/skinsdb/meta/character.1079.txt diff --git a/mods/skinsdb/meta/character_108.txt b/mods/skinsdb/meta/character.108.txt similarity index 100% rename from mods/skinsdb/meta/character_108.txt rename to mods/skinsdb/meta/character.108.txt diff --git a/mods/skinsdb/meta/character_1080.txt b/mods/skinsdb/meta/character.1080.txt similarity index 100% rename from mods/skinsdb/meta/character_1080.txt rename to mods/skinsdb/meta/character.1080.txt diff --git a/mods/skinsdb/meta/character_1081.txt b/mods/skinsdb/meta/character.1081.txt similarity index 100% rename from mods/skinsdb/meta/character_1081.txt rename to mods/skinsdb/meta/character.1081.txt diff --git a/mods/skinsdb/meta/character_1082.txt b/mods/skinsdb/meta/character.1082.txt similarity index 100% rename from mods/skinsdb/meta/character_1082.txt rename to mods/skinsdb/meta/character.1082.txt diff --git a/mods/skinsdb/meta/character_1083.txt b/mods/skinsdb/meta/character.1083.txt similarity index 100% rename from mods/skinsdb/meta/character_1083.txt rename to mods/skinsdb/meta/character.1083.txt diff --git a/mods/skinsdb/meta/character_1084.txt b/mods/skinsdb/meta/character.1084.txt similarity index 100% rename from mods/skinsdb/meta/character_1084.txt rename to mods/skinsdb/meta/character.1084.txt diff --git a/mods/skinsdb/meta/character_1085.txt b/mods/skinsdb/meta/character.1085.txt similarity index 100% rename from mods/skinsdb/meta/character_1085.txt rename to mods/skinsdb/meta/character.1085.txt diff --git a/mods/skinsdb/meta/character_1086.txt b/mods/skinsdb/meta/character.1086.txt similarity index 100% rename from mods/skinsdb/meta/character_1086.txt rename to mods/skinsdb/meta/character.1086.txt diff --git a/mods/skinsdb/meta/character_1087.txt b/mods/skinsdb/meta/character.1087.txt similarity index 100% rename from mods/skinsdb/meta/character_1087.txt rename to mods/skinsdb/meta/character.1087.txt diff --git a/mods/skinsdb/meta/character_1088.txt b/mods/skinsdb/meta/character.1088.txt similarity index 100% rename from mods/skinsdb/meta/character_1088.txt rename to mods/skinsdb/meta/character.1088.txt diff --git a/mods/skinsdb/meta/character_1089.txt b/mods/skinsdb/meta/character.1089.txt similarity index 100% rename from mods/skinsdb/meta/character_1089.txt rename to mods/skinsdb/meta/character.1089.txt diff --git a/mods/skinsdb/meta/character_109.txt b/mods/skinsdb/meta/character.109.txt similarity index 100% rename from mods/skinsdb/meta/character_109.txt rename to mods/skinsdb/meta/character.109.txt diff --git a/mods/skinsdb/meta/character_1090.txt b/mods/skinsdb/meta/character.1090.txt similarity index 100% rename from mods/skinsdb/meta/character_1090.txt rename to mods/skinsdb/meta/character.1090.txt diff --git a/mods/skinsdb/meta/character_1091.txt b/mods/skinsdb/meta/character.1091.txt similarity index 100% rename from mods/skinsdb/meta/character_1091.txt rename to mods/skinsdb/meta/character.1091.txt diff --git a/mods/skinsdb/meta/character_1092.txt b/mods/skinsdb/meta/character.1092.txt similarity index 100% rename from mods/skinsdb/meta/character_1092.txt rename to mods/skinsdb/meta/character.1092.txt diff --git a/mods/skinsdb/meta/character_1093.txt b/mods/skinsdb/meta/character.1093.txt similarity index 100% rename from mods/skinsdb/meta/character_1093.txt rename to mods/skinsdb/meta/character.1093.txt diff --git a/mods/skinsdb/meta/character_1094.txt b/mods/skinsdb/meta/character.1094.txt similarity index 100% rename from mods/skinsdb/meta/character_1094.txt rename to mods/skinsdb/meta/character.1094.txt diff --git a/mods/skinsdb/meta/character_1095.txt b/mods/skinsdb/meta/character.1095.txt similarity index 100% rename from mods/skinsdb/meta/character_1095.txt rename to mods/skinsdb/meta/character.1095.txt diff --git a/mods/skinsdb/meta/character_1096.txt b/mods/skinsdb/meta/character.1096.txt similarity index 100% rename from mods/skinsdb/meta/character_1096.txt rename to mods/skinsdb/meta/character.1096.txt diff --git a/mods/skinsdb/meta/character_1097.txt b/mods/skinsdb/meta/character.1097.txt similarity index 100% rename from mods/skinsdb/meta/character_1097.txt rename to mods/skinsdb/meta/character.1097.txt diff --git a/mods/skinsdb/meta/character_1098.txt b/mods/skinsdb/meta/character.1098.txt similarity index 100% rename from mods/skinsdb/meta/character_1098.txt rename to mods/skinsdb/meta/character.1098.txt diff --git a/mods/skinsdb/meta/character_1099.txt b/mods/skinsdb/meta/character.1099.txt similarity index 100% rename from mods/skinsdb/meta/character_1099.txt rename to mods/skinsdb/meta/character.1099.txt diff --git a/mods/skinsdb/meta/character_110.txt b/mods/skinsdb/meta/character.110.txt similarity index 100% rename from mods/skinsdb/meta/character_110.txt rename to mods/skinsdb/meta/character.110.txt diff --git a/mods/skinsdb/meta/character_1100.txt b/mods/skinsdb/meta/character.1100.txt similarity index 100% rename from mods/skinsdb/meta/character_1100.txt rename to mods/skinsdb/meta/character.1100.txt diff --git a/mods/skinsdb/meta/character_1101.txt b/mods/skinsdb/meta/character.1101.txt similarity index 100% rename from mods/skinsdb/meta/character_1101.txt rename to mods/skinsdb/meta/character.1101.txt diff --git a/mods/skinsdb/meta/character_1102.txt b/mods/skinsdb/meta/character.1102.txt similarity index 100% rename from mods/skinsdb/meta/character_1102.txt rename to mods/skinsdb/meta/character.1102.txt diff --git a/mods/skinsdb/meta/character_1103.txt b/mods/skinsdb/meta/character.1103.txt similarity index 100% rename from mods/skinsdb/meta/character_1103.txt rename to mods/skinsdb/meta/character.1103.txt diff --git a/mods/skinsdb/meta/character_1104.txt b/mods/skinsdb/meta/character.1104.txt similarity index 100% rename from mods/skinsdb/meta/character_1104.txt rename to mods/skinsdb/meta/character.1104.txt diff --git a/mods/skinsdb/meta/character_1105.txt b/mods/skinsdb/meta/character.1105.txt similarity index 100% rename from mods/skinsdb/meta/character_1105.txt rename to mods/skinsdb/meta/character.1105.txt diff --git a/mods/skinsdb/meta/character_1106.txt b/mods/skinsdb/meta/character.1106.txt similarity index 100% rename from mods/skinsdb/meta/character_1106.txt rename to mods/skinsdb/meta/character.1106.txt diff --git a/mods/skinsdb/meta/character_1107.txt b/mods/skinsdb/meta/character.1107.txt similarity index 100% rename from mods/skinsdb/meta/character_1107.txt rename to mods/skinsdb/meta/character.1107.txt diff --git a/mods/skinsdb/meta/character_1108.txt b/mods/skinsdb/meta/character.1108.txt similarity index 100% rename from mods/skinsdb/meta/character_1108.txt rename to mods/skinsdb/meta/character.1108.txt diff --git a/mods/skinsdb/meta/character_1109.txt b/mods/skinsdb/meta/character.1109.txt similarity index 100% rename from mods/skinsdb/meta/character_1109.txt rename to mods/skinsdb/meta/character.1109.txt diff --git a/mods/skinsdb/meta/character_111.txt b/mods/skinsdb/meta/character.111.txt similarity index 100% rename from mods/skinsdb/meta/character_111.txt rename to mods/skinsdb/meta/character.111.txt diff --git a/mods/skinsdb/meta/character_1110.txt b/mods/skinsdb/meta/character.1110.txt similarity index 100% rename from mods/skinsdb/meta/character_1110.txt rename to mods/skinsdb/meta/character.1110.txt diff --git a/mods/skinsdb/meta/character_1111.txt b/mods/skinsdb/meta/character.1111.txt similarity index 100% rename from mods/skinsdb/meta/character_1111.txt rename to mods/skinsdb/meta/character.1111.txt diff --git a/mods/skinsdb/meta/character_1112.txt b/mods/skinsdb/meta/character.1112.txt similarity index 100% rename from mods/skinsdb/meta/character_1112.txt rename to mods/skinsdb/meta/character.1112.txt diff --git a/mods/skinsdb/meta/character_1113.txt b/mods/skinsdb/meta/character.1113.txt similarity index 100% rename from mods/skinsdb/meta/character_1113.txt rename to mods/skinsdb/meta/character.1113.txt diff --git a/mods/skinsdb/meta/character_1114.txt b/mods/skinsdb/meta/character.1114.txt similarity index 100% rename from mods/skinsdb/meta/character_1114.txt rename to mods/skinsdb/meta/character.1114.txt diff --git a/mods/skinsdb/meta/character_1115.txt b/mods/skinsdb/meta/character.1115.txt similarity index 100% rename from mods/skinsdb/meta/character_1115.txt rename to mods/skinsdb/meta/character.1115.txt diff --git a/mods/skinsdb/meta/character_1116.txt b/mods/skinsdb/meta/character.1116.txt similarity index 100% rename from mods/skinsdb/meta/character_1116.txt rename to mods/skinsdb/meta/character.1116.txt diff --git a/mods/skinsdb/meta/character_1117.txt b/mods/skinsdb/meta/character.1117.txt similarity index 100% rename from mods/skinsdb/meta/character_1117.txt rename to mods/skinsdb/meta/character.1117.txt diff --git a/mods/skinsdb/meta/character_1118.txt b/mods/skinsdb/meta/character.1118.txt similarity index 100% rename from mods/skinsdb/meta/character_1118.txt rename to mods/skinsdb/meta/character.1118.txt diff --git a/mods/skinsdb/meta/character_1119.txt b/mods/skinsdb/meta/character.1119.txt similarity index 100% rename from mods/skinsdb/meta/character_1119.txt rename to mods/skinsdb/meta/character.1119.txt diff --git a/mods/skinsdb/meta/character_112.txt b/mods/skinsdb/meta/character.112.txt similarity index 100% rename from mods/skinsdb/meta/character_112.txt rename to mods/skinsdb/meta/character.112.txt diff --git a/mods/skinsdb/meta/character_1120.txt b/mods/skinsdb/meta/character.1120.txt similarity index 100% rename from mods/skinsdb/meta/character_1120.txt rename to mods/skinsdb/meta/character.1120.txt diff --git a/mods/skinsdb/meta/character_1121.txt b/mods/skinsdb/meta/character.1121.txt similarity index 100% rename from mods/skinsdb/meta/character_1121.txt rename to mods/skinsdb/meta/character.1121.txt diff --git a/mods/skinsdb/meta/character_1122.txt b/mods/skinsdb/meta/character.1122.txt similarity index 100% rename from mods/skinsdb/meta/character_1122.txt rename to mods/skinsdb/meta/character.1122.txt diff --git a/mods/skinsdb/meta/character_1123.txt b/mods/skinsdb/meta/character.1123.txt similarity index 100% rename from mods/skinsdb/meta/character_1123.txt rename to mods/skinsdb/meta/character.1123.txt diff --git a/mods/skinsdb/meta/character_1124.txt b/mods/skinsdb/meta/character.1124.txt similarity index 100% rename from mods/skinsdb/meta/character_1124.txt rename to mods/skinsdb/meta/character.1124.txt diff --git a/mods/skinsdb/meta/character_1126.txt b/mods/skinsdb/meta/character.1126.txt similarity index 100% rename from mods/skinsdb/meta/character_1126.txt rename to mods/skinsdb/meta/character.1126.txt diff --git a/mods/skinsdb/meta/character_1127.txt b/mods/skinsdb/meta/character.1127.txt similarity index 100% rename from mods/skinsdb/meta/character_1127.txt rename to mods/skinsdb/meta/character.1127.txt diff --git a/mods/skinsdb/meta/character_113.txt b/mods/skinsdb/meta/character.113.txt similarity index 100% rename from mods/skinsdb/meta/character_113.txt rename to mods/skinsdb/meta/character.113.txt diff --git a/mods/skinsdb/meta/character_1133.txt b/mods/skinsdb/meta/character.1133.txt similarity index 100% rename from mods/skinsdb/meta/character_1133.txt rename to mods/skinsdb/meta/character.1133.txt diff --git a/mods/skinsdb/meta/character_1134.txt b/mods/skinsdb/meta/character.1134.txt similarity index 100% rename from mods/skinsdb/meta/character_1134.txt rename to mods/skinsdb/meta/character.1134.txt diff --git a/mods/skinsdb/meta/character.1135.txt b/mods/skinsdb/meta/character.1135.txt new file mode 100644 index 00000000..51b26645 --- /dev/null +++ b/mods/skinsdb/meta/character.1135.txt @@ -0,0 +1,3 @@ +julito pequeño +julito +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1136.txt b/mods/skinsdb/meta/character.1136.txt similarity index 100% rename from mods/skinsdb/meta/character_1136.txt rename to mods/skinsdb/meta/character.1136.txt diff --git a/mods/skinsdb/meta/character_1137.txt b/mods/skinsdb/meta/character.1137.txt similarity index 100% rename from mods/skinsdb/meta/character_1137.txt rename to mods/skinsdb/meta/character.1137.txt diff --git a/mods/skinsdb/meta/character_1138.txt b/mods/skinsdb/meta/character.1138.txt similarity index 61% rename from mods/skinsdb/meta/character_1138.txt rename to mods/skinsdb/meta/character.1138.txt index 170f3fea..5210ae45 100644 --- a/mods/skinsdb/meta/character_1138.txt +++ b/mods/skinsdb/meta/character.1138.txt @@ -1,3 +1,3 @@ Scientist MB -Néoprene +Néoprene CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1139.txt b/mods/skinsdb/meta/character.1139.txt similarity index 100% rename from mods/skinsdb/meta/character_1139.txt rename to mods/skinsdb/meta/character.1139.txt diff --git a/mods/skinsdb/meta/character_114.txt b/mods/skinsdb/meta/character.114.txt similarity index 100% rename from mods/skinsdb/meta/character_114.txt rename to mods/skinsdb/meta/character.114.txt diff --git a/mods/skinsdb/meta/character_1140.txt b/mods/skinsdb/meta/character.1140.txt similarity index 100% rename from mods/skinsdb/meta/character_1140.txt rename to mods/skinsdb/meta/character.1140.txt diff --git a/mods/skinsdb/meta/character_1141.txt b/mods/skinsdb/meta/character.1141.txt similarity index 100% rename from mods/skinsdb/meta/character_1141.txt rename to mods/skinsdb/meta/character.1141.txt diff --git a/mods/skinsdb/meta/character_1142.txt b/mods/skinsdb/meta/character.1142.txt similarity index 100% rename from mods/skinsdb/meta/character_1142.txt rename to mods/skinsdb/meta/character.1142.txt diff --git a/mods/skinsdb/meta/character_1143.txt b/mods/skinsdb/meta/character.1143.txt similarity index 100% rename from mods/skinsdb/meta/character_1143.txt rename to mods/skinsdb/meta/character.1143.txt diff --git a/mods/skinsdb/meta/character_1144.txt b/mods/skinsdb/meta/character.1144.txt similarity index 100% rename from mods/skinsdb/meta/character_1144.txt rename to mods/skinsdb/meta/character.1144.txt diff --git a/mods/skinsdb/meta/character_1145.txt b/mods/skinsdb/meta/character.1145.txt similarity index 100% rename from mods/skinsdb/meta/character_1145.txt rename to mods/skinsdb/meta/character.1145.txt diff --git a/mods/skinsdb/meta/character_1146.txt b/mods/skinsdb/meta/character.1146.txt similarity index 100% rename from mods/skinsdb/meta/character_1146.txt rename to mods/skinsdb/meta/character.1146.txt diff --git a/mods/skinsdb/meta/character_1147.txt b/mods/skinsdb/meta/character.1147.txt similarity index 100% rename from mods/skinsdb/meta/character_1147.txt rename to mods/skinsdb/meta/character.1147.txt diff --git a/mods/skinsdb/meta/character_1148.txt b/mods/skinsdb/meta/character.1148.txt similarity index 100% rename from mods/skinsdb/meta/character_1148.txt rename to mods/skinsdb/meta/character.1148.txt diff --git a/mods/skinsdb/meta/character_1149.txt b/mods/skinsdb/meta/character.1149.txt similarity index 100% rename from mods/skinsdb/meta/character_1149.txt rename to mods/skinsdb/meta/character.1149.txt diff --git a/mods/skinsdb/meta/character_1150.txt b/mods/skinsdb/meta/character.1150.txt similarity index 100% rename from mods/skinsdb/meta/character_1150.txt rename to mods/skinsdb/meta/character.1150.txt diff --git a/mods/skinsdb/meta/character_1151.txt b/mods/skinsdb/meta/character.1151.txt similarity index 100% rename from mods/skinsdb/meta/character_1151.txt rename to mods/skinsdb/meta/character.1151.txt diff --git a/mods/skinsdb/meta/character_1153.txt b/mods/skinsdb/meta/character.1153.txt similarity index 100% rename from mods/skinsdb/meta/character_1153.txt rename to mods/skinsdb/meta/character.1153.txt diff --git a/mods/skinsdb/meta/character_1154.txt b/mods/skinsdb/meta/character.1154.txt similarity index 100% rename from mods/skinsdb/meta/character_1154.txt rename to mods/skinsdb/meta/character.1154.txt diff --git a/mods/skinsdb/meta/character_1155.txt b/mods/skinsdb/meta/character.1155.txt similarity index 100% rename from mods/skinsdb/meta/character_1155.txt rename to mods/skinsdb/meta/character.1155.txt diff --git a/mods/skinsdb/meta/character_1156.txt b/mods/skinsdb/meta/character.1156.txt similarity index 100% rename from mods/skinsdb/meta/character_1156.txt rename to mods/skinsdb/meta/character.1156.txt diff --git a/mods/skinsdb/meta/character_1157.txt b/mods/skinsdb/meta/character.1157.txt similarity index 100% rename from mods/skinsdb/meta/character_1157.txt rename to mods/skinsdb/meta/character.1157.txt diff --git a/mods/skinsdb/meta/character_1158.txt b/mods/skinsdb/meta/character.1158.txt similarity index 100% rename from mods/skinsdb/meta/character_1158.txt rename to mods/skinsdb/meta/character.1158.txt diff --git a/mods/skinsdb/meta/character_1159.txt b/mods/skinsdb/meta/character.1159.txt similarity index 100% rename from mods/skinsdb/meta/character_1159.txt rename to mods/skinsdb/meta/character.1159.txt diff --git a/mods/skinsdb/meta/character_1160.txt b/mods/skinsdb/meta/character.1160.txt similarity index 100% rename from mods/skinsdb/meta/character_1160.txt rename to mods/skinsdb/meta/character.1160.txt diff --git a/mods/skinsdb/meta/character_1161.txt b/mods/skinsdb/meta/character.1161.txt similarity index 100% rename from mods/skinsdb/meta/character_1161.txt rename to mods/skinsdb/meta/character.1161.txt diff --git a/mods/skinsdb/meta/character_1162.txt b/mods/skinsdb/meta/character.1162.txt similarity index 100% rename from mods/skinsdb/meta/character_1162.txt rename to mods/skinsdb/meta/character.1162.txt diff --git a/mods/skinsdb/meta/character_1163.txt b/mods/skinsdb/meta/character.1163.txt similarity index 100% rename from mods/skinsdb/meta/character_1163.txt rename to mods/skinsdb/meta/character.1163.txt diff --git a/mods/skinsdb/meta/character_1164.txt b/mods/skinsdb/meta/character.1164.txt similarity index 100% rename from mods/skinsdb/meta/character_1164.txt rename to mods/skinsdb/meta/character.1164.txt diff --git a/mods/skinsdb/meta/character_1165.txt b/mods/skinsdb/meta/character.1165.txt similarity index 100% rename from mods/skinsdb/meta/character_1165.txt rename to mods/skinsdb/meta/character.1165.txt diff --git a/mods/skinsdb/meta/character_1166.txt b/mods/skinsdb/meta/character.1166.txt similarity index 100% rename from mods/skinsdb/meta/character_1166.txt rename to mods/skinsdb/meta/character.1166.txt diff --git a/mods/skinsdb/meta/character_1167.txt b/mods/skinsdb/meta/character.1167.txt similarity index 100% rename from mods/skinsdb/meta/character_1167.txt rename to mods/skinsdb/meta/character.1167.txt diff --git a/mods/skinsdb/meta/character_1168.txt b/mods/skinsdb/meta/character.1168.txt similarity index 100% rename from mods/skinsdb/meta/character_1168.txt rename to mods/skinsdb/meta/character.1168.txt diff --git a/mods/skinsdb/meta/character_1169.txt b/mods/skinsdb/meta/character.1169.txt similarity index 100% rename from mods/skinsdb/meta/character_1169.txt rename to mods/skinsdb/meta/character.1169.txt diff --git a/mods/skinsdb/meta/character_117.txt b/mods/skinsdb/meta/character.117.txt similarity index 100% rename from mods/skinsdb/meta/character_117.txt rename to mods/skinsdb/meta/character.117.txt diff --git a/mods/skinsdb/meta/character_1170.txt b/mods/skinsdb/meta/character.1170.txt similarity index 100% rename from mods/skinsdb/meta/character_1170.txt rename to mods/skinsdb/meta/character.1170.txt diff --git a/mods/skinsdb/meta/character_1171.txt b/mods/skinsdb/meta/character.1171.txt similarity index 100% rename from mods/skinsdb/meta/character_1171.txt rename to mods/skinsdb/meta/character.1171.txt diff --git a/mods/skinsdb/meta/character_1172.txt b/mods/skinsdb/meta/character.1172.txt similarity index 100% rename from mods/skinsdb/meta/character_1172.txt rename to mods/skinsdb/meta/character.1172.txt diff --git a/mods/skinsdb/meta/character_1173.txt b/mods/skinsdb/meta/character.1173.txt similarity index 100% rename from mods/skinsdb/meta/character_1173.txt rename to mods/skinsdb/meta/character.1173.txt diff --git a/mods/skinsdb/meta/character_1174.txt b/mods/skinsdb/meta/character.1174.txt similarity index 100% rename from mods/skinsdb/meta/character_1174.txt rename to mods/skinsdb/meta/character.1174.txt diff --git a/mods/skinsdb/meta/character_1175.txt b/mods/skinsdb/meta/character.1175.txt similarity index 100% rename from mods/skinsdb/meta/character_1175.txt rename to mods/skinsdb/meta/character.1175.txt diff --git a/mods/skinsdb/meta/character_1176.txt b/mods/skinsdb/meta/character.1176.txt similarity index 100% rename from mods/skinsdb/meta/character_1176.txt rename to mods/skinsdb/meta/character.1176.txt diff --git a/mods/skinsdb/meta/character_1177.txt b/mods/skinsdb/meta/character.1177.txt similarity index 100% rename from mods/skinsdb/meta/character_1177.txt rename to mods/skinsdb/meta/character.1177.txt diff --git a/mods/skinsdb/meta/character_1178.txt b/mods/skinsdb/meta/character.1178.txt similarity index 100% rename from mods/skinsdb/meta/character_1178.txt rename to mods/skinsdb/meta/character.1178.txt diff --git a/mods/skinsdb/meta/character_1179.txt b/mods/skinsdb/meta/character.1179.txt similarity index 100% rename from mods/skinsdb/meta/character_1179.txt rename to mods/skinsdb/meta/character.1179.txt diff --git a/mods/skinsdb/meta/character_118.txt b/mods/skinsdb/meta/character.118.txt similarity index 100% rename from mods/skinsdb/meta/character_118.txt rename to mods/skinsdb/meta/character.118.txt diff --git a/mods/skinsdb/meta/character_1180.txt b/mods/skinsdb/meta/character.1180.txt similarity index 100% rename from mods/skinsdb/meta/character_1180.txt rename to mods/skinsdb/meta/character.1180.txt diff --git a/mods/skinsdb/meta/character_1181.txt b/mods/skinsdb/meta/character.1181.txt similarity index 100% rename from mods/skinsdb/meta/character_1181.txt rename to mods/skinsdb/meta/character.1181.txt diff --git a/mods/skinsdb/meta/character_1182.txt b/mods/skinsdb/meta/character.1182.txt similarity index 100% rename from mods/skinsdb/meta/character_1182.txt rename to mods/skinsdb/meta/character.1182.txt diff --git a/mods/skinsdb/meta/character_1183.txt b/mods/skinsdb/meta/character.1183.txt similarity index 100% rename from mods/skinsdb/meta/character_1183.txt rename to mods/skinsdb/meta/character.1183.txt diff --git a/mods/skinsdb/meta/character_1184.txt b/mods/skinsdb/meta/character.1184.txt similarity index 100% rename from mods/skinsdb/meta/character_1184.txt rename to mods/skinsdb/meta/character.1184.txt diff --git a/mods/skinsdb/meta/character_1185.txt b/mods/skinsdb/meta/character.1185.txt similarity index 100% rename from mods/skinsdb/meta/character_1185.txt rename to mods/skinsdb/meta/character.1185.txt diff --git a/mods/skinsdb/meta/character_1186.txt b/mods/skinsdb/meta/character.1186.txt similarity index 100% rename from mods/skinsdb/meta/character_1186.txt rename to mods/skinsdb/meta/character.1186.txt diff --git a/mods/skinsdb/meta/character_1191.txt b/mods/skinsdb/meta/character.1191.txt similarity index 100% rename from mods/skinsdb/meta/character_1191.txt rename to mods/skinsdb/meta/character.1191.txt diff --git a/mods/skinsdb/meta/character_1192.txt b/mods/skinsdb/meta/character.1192.txt similarity index 100% rename from mods/skinsdb/meta/character_1192.txt rename to mods/skinsdb/meta/character.1192.txt diff --git a/mods/skinsdb/meta/character_1193.txt b/mods/skinsdb/meta/character.1193.txt similarity index 100% rename from mods/skinsdb/meta/character_1193.txt rename to mods/skinsdb/meta/character.1193.txt diff --git a/mods/skinsdb/meta/character_1194.txt b/mods/skinsdb/meta/character.1194.txt similarity index 100% rename from mods/skinsdb/meta/character_1194.txt rename to mods/skinsdb/meta/character.1194.txt diff --git a/mods/skinsdb/meta/character_1195.txt b/mods/skinsdb/meta/character.1195.txt similarity index 100% rename from mods/skinsdb/meta/character_1195.txt rename to mods/skinsdb/meta/character.1195.txt diff --git a/mods/skinsdb/meta/character_1196.txt b/mods/skinsdb/meta/character.1196.txt similarity index 100% rename from mods/skinsdb/meta/character_1196.txt rename to mods/skinsdb/meta/character.1196.txt diff --git a/mods/skinsdb/meta/character_1197.txt b/mods/skinsdb/meta/character.1197.txt similarity index 100% rename from mods/skinsdb/meta/character_1197.txt rename to mods/skinsdb/meta/character.1197.txt diff --git a/mods/skinsdb/meta/character_1198.txt b/mods/skinsdb/meta/character.1198.txt similarity index 100% rename from mods/skinsdb/meta/character_1198.txt rename to mods/skinsdb/meta/character.1198.txt diff --git a/mods/skinsdb/meta/character_1199.txt b/mods/skinsdb/meta/character.1199.txt similarity index 100% rename from mods/skinsdb/meta/character_1199.txt rename to mods/skinsdb/meta/character.1199.txt diff --git a/mods/skinsdb/meta/character_12.txt b/mods/skinsdb/meta/character.12.txt similarity index 100% rename from mods/skinsdb/meta/character_12.txt rename to mods/skinsdb/meta/character.12.txt diff --git a/mods/skinsdb/meta/character_1200.txt b/mods/skinsdb/meta/character.1200.txt similarity index 100% rename from mods/skinsdb/meta/character_1200.txt rename to mods/skinsdb/meta/character.1200.txt diff --git a/mods/skinsdb/meta/character_1201.txt b/mods/skinsdb/meta/character.1201.txt similarity index 100% rename from mods/skinsdb/meta/character_1201.txt rename to mods/skinsdb/meta/character.1201.txt diff --git a/mods/skinsdb/meta/character_1202.txt b/mods/skinsdb/meta/character.1202.txt similarity index 100% rename from mods/skinsdb/meta/character_1202.txt rename to mods/skinsdb/meta/character.1202.txt diff --git a/mods/skinsdb/meta/character_1203.txt b/mods/skinsdb/meta/character.1203.txt similarity index 100% rename from mods/skinsdb/meta/character_1203.txt rename to mods/skinsdb/meta/character.1203.txt diff --git a/mods/skinsdb/meta/character_1204.txt b/mods/skinsdb/meta/character.1204.txt similarity index 100% rename from mods/skinsdb/meta/character_1204.txt rename to mods/skinsdb/meta/character.1204.txt diff --git a/mods/skinsdb/meta/character_1205.txt b/mods/skinsdb/meta/character.1205.txt similarity index 100% rename from mods/skinsdb/meta/character_1205.txt rename to mods/skinsdb/meta/character.1205.txt diff --git a/mods/skinsdb/meta/character_1206.txt b/mods/skinsdb/meta/character.1206.txt similarity index 100% rename from mods/skinsdb/meta/character_1206.txt rename to mods/skinsdb/meta/character.1206.txt diff --git a/mods/skinsdb/meta/character_1207.txt b/mods/skinsdb/meta/character.1207.txt similarity index 100% rename from mods/skinsdb/meta/character_1207.txt rename to mods/skinsdb/meta/character.1207.txt diff --git a/mods/skinsdb/meta/character_1208.txt b/mods/skinsdb/meta/character.1208.txt similarity index 100% rename from mods/skinsdb/meta/character_1208.txt rename to mods/skinsdb/meta/character.1208.txt diff --git a/mods/skinsdb/meta/character_1209.txt b/mods/skinsdb/meta/character.1209.txt similarity index 100% rename from mods/skinsdb/meta/character_1209.txt rename to mods/skinsdb/meta/character.1209.txt diff --git a/mods/skinsdb/meta/character_121.txt b/mods/skinsdb/meta/character.121.txt similarity index 100% rename from mods/skinsdb/meta/character_121.txt rename to mods/skinsdb/meta/character.121.txt diff --git a/mods/skinsdb/meta/character_1210.txt b/mods/skinsdb/meta/character.1210.txt similarity index 100% rename from mods/skinsdb/meta/character_1210.txt rename to mods/skinsdb/meta/character.1210.txt diff --git a/mods/skinsdb/meta/character_1211.txt b/mods/skinsdb/meta/character.1211.txt similarity index 100% rename from mods/skinsdb/meta/character_1211.txt rename to mods/skinsdb/meta/character.1211.txt diff --git a/mods/skinsdb/meta/character_1212.txt b/mods/skinsdb/meta/character.1212.txt similarity index 100% rename from mods/skinsdb/meta/character_1212.txt rename to mods/skinsdb/meta/character.1212.txt diff --git a/mods/skinsdb/meta/character_1213.txt b/mods/skinsdb/meta/character.1213.txt similarity index 100% rename from mods/skinsdb/meta/character_1213.txt rename to mods/skinsdb/meta/character.1213.txt diff --git a/mods/skinsdb/meta/character_1214.txt b/mods/skinsdb/meta/character.1214.txt similarity index 100% rename from mods/skinsdb/meta/character_1214.txt rename to mods/skinsdb/meta/character.1214.txt diff --git a/mods/skinsdb/meta/character_1215.txt b/mods/skinsdb/meta/character.1215.txt similarity index 100% rename from mods/skinsdb/meta/character_1215.txt rename to mods/skinsdb/meta/character.1215.txt diff --git a/mods/skinsdb/meta/character_1216.txt b/mods/skinsdb/meta/character.1216.txt similarity index 100% rename from mods/skinsdb/meta/character_1216.txt rename to mods/skinsdb/meta/character.1216.txt diff --git a/mods/skinsdb/meta/character_1217.txt b/mods/skinsdb/meta/character.1217.txt similarity index 100% rename from mods/skinsdb/meta/character_1217.txt rename to mods/skinsdb/meta/character.1217.txt diff --git a/mods/skinsdb/meta/character_1218.txt b/mods/skinsdb/meta/character.1218.txt similarity index 100% rename from mods/skinsdb/meta/character_1218.txt rename to mods/skinsdb/meta/character.1218.txt diff --git a/mods/skinsdb/meta/character_1219.txt b/mods/skinsdb/meta/character.1219.txt similarity index 100% rename from mods/skinsdb/meta/character_1219.txt rename to mods/skinsdb/meta/character.1219.txt diff --git a/mods/skinsdb/meta/character_1220.txt b/mods/skinsdb/meta/character.1220.txt similarity index 100% rename from mods/skinsdb/meta/character_1220.txt rename to mods/skinsdb/meta/character.1220.txt diff --git a/mods/skinsdb/meta/character_1221.txt b/mods/skinsdb/meta/character.1221.txt similarity index 100% rename from mods/skinsdb/meta/character_1221.txt rename to mods/skinsdb/meta/character.1221.txt diff --git a/mods/skinsdb/meta/character_1222.txt b/mods/skinsdb/meta/character.1222.txt similarity index 100% rename from mods/skinsdb/meta/character_1222.txt rename to mods/skinsdb/meta/character.1222.txt diff --git a/mods/skinsdb/meta/character_1223.txt b/mods/skinsdb/meta/character.1223.txt similarity index 100% rename from mods/skinsdb/meta/character_1223.txt rename to mods/skinsdb/meta/character.1223.txt diff --git a/mods/skinsdb/meta/character_1224.txt b/mods/skinsdb/meta/character.1224.txt similarity index 100% rename from mods/skinsdb/meta/character_1224.txt rename to mods/skinsdb/meta/character.1224.txt diff --git a/mods/skinsdb/meta/character_1225.txt b/mods/skinsdb/meta/character.1225.txt similarity index 100% rename from mods/skinsdb/meta/character_1225.txt rename to mods/skinsdb/meta/character.1225.txt diff --git a/mods/skinsdb/meta/character_1226.txt b/mods/skinsdb/meta/character.1226.txt similarity index 100% rename from mods/skinsdb/meta/character_1226.txt rename to mods/skinsdb/meta/character.1226.txt diff --git a/mods/skinsdb/meta/character_1227.txt b/mods/skinsdb/meta/character.1227.txt similarity index 100% rename from mods/skinsdb/meta/character_1227.txt rename to mods/skinsdb/meta/character.1227.txt diff --git a/mods/skinsdb/meta/character_1228.txt b/mods/skinsdb/meta/character.1228.txt similarity index 100% rename from mods/skinsdb/meta/character_1228.txt rename to mods/skinsdb/meta/character.1228.txt diff --git a/mods/skinsdb/meta/character_1229.txt b/mods/skinsdb/meta/character.1229.txt similarity index 100% rename from mods/skinsdb/meta/character_1229.txt rename to mods/skinsdb/meta/character.1229.txt diff --git a/mods/skinsdb/meta/character_1230.txt b/mods/skinsdb/meta/character.1230.txt similarity index 100% rename from mods/skinsdb/meta/character_1230.txt rename to mods/skinsdb/meta/character.1230.txt diff --git a/mods/skinsdb/meta/character_1231.txt b/mods/skinsdb/meta/character.1231.txt similarity index 100% rename from mods/skinsdb/meta/character_1231.txt rename to mods/skinsdb/meta/character.1231.txt diff --git a/mods/skinsdb/meta/character_1232.txt b/mods/skinsdb/meta/character.1232.txt similarity index 100% rename from mods/skinsdb/meta/character_1232.txt rename to mods/skinsdb/meta/character.1232.txt diff --git a/mods/skinsdb/meta/character_1233.txt b/mods/skinsdb/meta/character.1233.txt similarity index 100% rename from mods/skinsdb/meta/character_1233.txt rename to mods/skinsdb/meta/character.1233.txt diff --git a/mods/skinsdb/meta/character_1234.txt b/mods/skinsdb/meta/character.1234.txt similarity index 100% rename from mods/skinsdb/meta/character_1234.txt rename to mods/skinsdb/meta/character.1234.txt diff --git a/mods/skinsdb/meta/character_1235.txt b/mods/skinsdb/meta/character.1235.txt similarity index 100% rename from mods/skinsdb/meta/character_1235.txt rename to mods/skinsdb/meta/character.1235.txt diff --git a/mods/skinsdb/meta/character_1236.txt b/mods/skinsdb/meta/character.1236.txt similarity index 100% rename from mods/skinsdb/meta/character_1236.txt rename to mods/skinsdb/meta/character.1236.txt diff --git a/mods/skinsdb/meta/character_1237.txt b/mods/skinsdb/meta/character.1237.txt similarity index 100% rename from mods/skinsdb/meta/character_1237.txt rename to mods/skinsdb/meta/character.1237.txt diff --git a/mods/skinsdb/meta/character_1238.txt b/mods/skinsdb/meta/character.1238.txt similarity index 100% rename from mods/skinsdb/meta/character_1238.txt rename to mods/skinsdb/meta/character.1238.txt diff --git a/mods/skinsdb/meta/character_1239.txt b/mods/skinsdb/meta/character.1239.txt similarity index 100% rename from mods/skinsdb/meta/character_1239.txt rename to mods/skinsdb/meta/character.1239.txt diff --git a/mods/skinsdb/meta/character_124.txt b/mods/skinsdb/meta/character.124.txt similarity index 100% rename from mods/skinsdb/meta/character_124.txt rename to mods/skinsdb/meta/character.124.txt diff --git a/mods/skinsdb/meta/character_1240.txt b/mods/skinsdb/meta/character.1240.txt similarity index 100% rename from mods/skinsdb/meta/character_1240.txt rename to mods/skinsdb/meta/character.1240.txt diff --git a/mods/skinsdb/meta/character_1241.txt b/mods/skinsdb/meta/character.1241.txt similarity index 100% rename from mods/skinsdb/meta/character_1241.txt rename to mods/skinsdb/meta/character.1241.txt diff --git a/mods/skinsdb/meta/character_1242.txt b/mods/skinsdb/meta/character.1242.txt similarity index 100% rename from mods/skinsdb/meta/character_1242.txt rename to mods/skinsdb/meta/character.1242.txt diff --git a/mods/skinsdb/meta/character_1243.txt b/mods/skinsdb/meta/character.1243.txt similarity index 100% rename from mods/skinsdb/meta/character_1243.txt rename to mods/skinsdb/meta/character.1243.txt diff --git a/mods/skinsdb/meta/character_1244.txt b/mods/skinsdb/meta/character.1244.txt similarity index 100% rename from mods/skinsdb/meta/character_1244.txt rename to mods/skinsdb/meta/character.1244.txt diff --git a/mods/skinsdb/meta/character_1245.txt b/mods/skinsdb/meta/character.1245.txt similarity index 100% rename from mods/skinsdb/meta/character_1245.txt rename to mods/skinsdb/meta/character.1245.txt diff --git a/mods/skinsdb/meta/character_1246.txt b/mods/skinsdb/meta/character.1246.txt similarity index 100% rename from mods/skinsdb/meta/character_1246.txt rename to mods/skinsdb/meta/character.1246.txt diff --git a/mods/skinsdb/meta/character_1247.txt b/mods/skinsdb/meta/character.1247.txt similarity index 100% rename from mods/skinsdb/meta/character_1247.txt rename to mods/skinsdb/meta/character.1247.txt diff --git a/mods/skinsdb/meta/character_1248.txt b/mods/skinsdb/meta/character.1248.txt similarity index 100% rename from mods/skinsdb/meta/character_1248.txt rename to mods/skinsdb/meta/character.1248.txt diff --git a/mods/skinsdb/meta/character_1249.txt b/mods/skinsdb/meta/character.1249.txt similarity index 100% rename from mods/skinsdb/meta/character_1249.txt rename to mods/skinsdb/meta/character.1249.txt diff --git a/mods/skinsdb/meta/character_1250.txt b/mods/skinsdb/meta/character.1250.txt similarity index 100% rename from mods/skinsdb/meta/character_1250.txt rename to mods/skinsdb/meta/character.1250.txt diff --git a/mods/skinsdb/meta/character_1251.txt b/mods/skinsdb/meta/character.1251.txt similarity index 100% rename from mods/skinsdb/meta/character_1251.txt rename to mods/skinsdb/meta/character.1251.txt diff --git a/mods/skinsdb/meta/character_1252.txt b/mods/skinsdb/meta/character.1252.txt similarity index 100% rename from mods/skinsdb/meta/character_1252.txt rename to mods/skinsdb/meta/character.1252.txt diff --git a/mods/skinsdb/meta/character_1253.txt b/mods/skinsdb/meta/character.1253.txt similarity index 100% rename from mods/skinsdb/meta/character_1253.txt rename to mods/skinsdb/meta/character.1253.txt diff --git a/mods/skinsdb/meta/character_1254.txt b/mods/skinsdb/meta/character.1254.txt similarity index 100% rename from mods/skinsdb/meta/character_1254.txt rename to mods/skinsdb/meta/character.1254.txt diff --git a/mods/skinsdb/meta/character_1255.txt b/mods/skinsdb/meta/character.1255.txt similarity index 100% rename from mods/skinsdb/meta/character_1255.txt rename to mods/skinsdb/meta/character.1255.txt diff --git a/mods/skinsdb/meta/character_1256.txt b/mods/skinsdb/meta/character.1256.txt similarity index 100% rename from mods/skinsdb/meta/character_1256.txt rename to mods/skinsdb/meta/character.1256.txt diff --git a/mods/skinsdb/meta/character_1257.txt b/mods/skinsdb/meta/character.1257.txt similarity index 100% rename from mods/skinsdb/meta/character_1257.txt rename to mods/skinsdb/meta/character.1257.txt diff --git a/mods/skinsdb/meta/character_1258.txt b/mods/skinsdb/meta/character.1258.txt similarity index 100% rename from mods/skinsdb/meta/character_1258.txt rename to mods/skinsdb/meta/character.1258.txt diff --git a/mods/skinsdb/meta/character_1259.txt b/mods/skinsdb/meta/character.1259.txt similarity index 100% rename from mods/skinsdb/meta/character_1259.txt rename to mods/skinsdb/meta/character.1259.txt diff --git a/mods/skinsdb/meta/character_126.txt b/mods/skinsdb/meta/character.126.txt similarity index 100% rename from mods/skinsdb/meta/character_126.txt rename to mods/skinsdb/meta/character.126.txt diff --git a/mods/skinsdb/meta/character_1260.txt b/mods/skinsdb/meta/character.1260.txt similarity index 100% rename from mods/skinsdb/meta/character_1260.txt rename to mods/skinsdb/meta/character.1260.txt diff --git a/mods/skinsdb/meta/character_1261.txt b/mods/skinsdb/meta/character.1261.txt similarity index 100% rename from mods/skinsdb/meta/character_1261.txt rename to mods/skinsdb/meta/character.1261.txt diff --git a/mods/skinsdb/meta/character_1262.txt b/mods/skinsdb/meta/character.1262.txt similarity index 100% rename from mods/skinsdb/meta/character_1262.txt rename to mods/skinsdb/meta/character.1262.txt diff --git a/mods/skinsdb/meta/character_1263.txt b/mods/skinsdb/meta/character.1263.txt similarity index 100% rename from mods/skinsdb/meta/character_1263.txt rename to mods/skinsdb/meta/character.1263.txt diff --git a/mods/skinsdb/meta/character_1264.txt b/mods/skinsdb/meta/character.1264.txt similarity index 100% rename from mods/skinsdb/meta/character_1264.txt rename to mods/skinsdb/meta/character.1264.txt diff --git a/mods/skinsdb/meta/character_1265.txt b/mods/skinsdb/meta/character.1265.txt similarity index 100% rename from mods/skinsdb/meta/character_1265.txt rename to mods/skinsdb/meta/character.1265.txt diff --git a/mods/skinsdb/meta/character_1266.txt b/mods/skinsdb/meta/character.1266.txt similarity index 100% rename from mods/skinsdb/meta/character_1266.txt rename to mods/skinsdb/meta/character.1266.txt diff --git a/mods/skinsdb/meta/character_1267.txt b/mods/skinsdb/meta/character.1267.txt similarity index 100% rename from mods/skinsdb/meta/character_1267.txt rename to mods/skinsdb/meta/character.1267.txt diff --git a/mods/skinsdb/meta/character_1268.txt b/mods/skinsdb/meta/character.1268.txt similarity index 100% rename from mods/skinsdb/meta/character_1268.txt rename to mods/skinsdb/meta/character.1268.txt diff --git a/mods/skinsdb/meta/character_1269.txt b/mods/skinsdb/meta/character.1269.txt similarity index 100% rename from mods/skinsdb/meta/character_1269.txt rename to mods/skinsdb/meta/character.1269.txt diff --git a/mods/skinsdb/meta/character_1270.txt b/mods/skinsdb/meta/character.1270.txt similarity index 100% rename from mods/skinsdb/meta/character_1270.txt rename to mods/skinsdb/meta/character.1270.txt diff --git a/mods/skinsdb/meta/character_1271.txt b/mods/skinsdb/meta/character.1271.txt similarity index 100% rename from mods/skinsdb/meta/character_1271.txt rename to mods/skinsdb/meta/character.1271.txt diff --git a/mods/skinsdb/meta/character_1272.txt b/mods/skinsdb/meta/character.1272.txt similarity index 100% rename from mods/skinsdb/meta/character_1272.txt rename to mods/skinsdb/meta/character.1272.txt diff --git a/mods/skinsdb/meta/character_1273.txt b/mods/skinsdb/meta/character.1273.txt similarity index 100% rename from mods/skinsdb/meta/character_1273.txt rename to mods/skinsdb/meta/character.1273.txt diff --git a/mods/skinsdb/meta/character_1274.txt b/mods/skinsdb/meta/character.1274.txt similarity index 100% rename from mods/skinsdb/meta/character_1274.txt rename to mods/skinsdb/meta/character.1274.txt diff --git a/mods/skinsdb/meta/character_1275.txt b/mods/skinsdb/meta/character.1275.txt similarity index 100% rename from mods/skinsdb/meta/character_1275.txt rename to mods/skinsdb/meta/character.1275.txt diff --git a/mods/skinsdb/meta/character_1276.txt b/mods/skinsdb/meta/character.1276.txt similarity index 100% rename from mods/skinsdb/meta/character_1276.txt rename to mods/skinsdb/meta/character.1276.txt diff --git a/mods/skinsdb/meta/character_1277.txt b/mods/skinsdb/meta/character.1277.txt similarity index 100% rename from mods/skinsdb/meta/character_1277.txt rename to mods/skinsdb/meta/character.1277.txt diff --git a/mods/skinsdb/meta/character_1278.txt b/mods/skinsdb/meta/character.1278.txt similarity index 100% rename from mods/skinsdb/meta/character_1278.txt rename to mods/skinsdb/meta/character.1278.txt diff --git a/mods/skinsdb/meta/character_1279.txt b/mods/skinsdb/meta/character.1279.txt similarity index 100% rename from mods/skinsdb/meta/character_1279.txt rename to mods/skinsdb/meta/character.1279.txt diff --git a/mods/skinsdb/meta/character_128.txt b/mods/skinsdb/meta/character.128.txt similarity index 100% rename from mods/skinsdb/meta/character_128.txt rename to mods/skinsdb/meta/character.128.txt diff --git a/mods/skinsdb/meta/character_1280.txt b/mods/skinsdb/meta/character.1280.txt similarity index 100% rename from mods/skinsdb/meta/character_1280.txt rename to mods/skinsdb/meta/character.1280.txt diff --git a/mods/skinsdb/meta/character_1281.txt b/mods/skinsdb/meta/character.1281.txt similarity index 100% rename from mods/skinsdb/meta/character_1281.txt rename to mods/skinsdb/meta/character.1281.txt diff --git a/mods/skinsdb/meta/character_1282.txt b/mods/skinsdb/meta/character.1282.txt similarity index 100% rename from mods/skinsdb/meta/character_1282.txt rename to mods/skinsdb/meta/character.1282.txt diff --git a/mods/skinsdb/meta/character_1283.txt b/mods/skinsdb/meta/character.1283.txt similarity index 100% rename from mods/skinsdb/meta/character_1283.txt rename to mods/skinsdb/meta/character.1283.txt diff --git a/mods/skinsdb/meta/character_1284.txt b/mods/skinsdb/meta/character.1284.txt similarity index 100% rename from mods/skinsdb/meta/character_1284.txt rename to mods/skinsdb/meta/character.1284.txt diff --git a/mods/skinsdb/meta/character_1285.txt b/mods/skinsdb/meta/character.1285.txt similarity index 100% rename from mods/skinsdb/meta/character_1285.txt rename to mods/skinsdb/meta/character.1285.txt diff --git a/mods/skinsdb/meta/character_1286.txt b/mods/skinsdb/meta/character.1286.txt similarity index 100% rename from mods/skinsdb/meta/character_1286.txt rename to mods/skinsdb/meta/character.1286.txt diff --git a/mods/skinsdb/meta/character_1287.txt b/mods/skinsdb/meta/character.1287.txt similarity index 100% rename from mods/skinsdb/meta/character_1287.txt rename to mods/skinsdb/meta/character.1287.txt diff --git a/mods/skinsdb/meta/character_1288.txt b/mods/skinsdb/meta/character.1288.txt similarity index 100% rename from mods/skinsdb/meta/character_1288.txt rename to mods/skinsdb/meta/character.1288.txt diff --git a/mods/skinsdb/meta/character_1289.txt b/mods/skinsdb/meta/character.1289.txt similarity index 100% rename from mods/skinsdb/meta/character_1289.txt rename to mods/skinsdb/meta/character.1289.txt diff --git a/mods/skinsdb/meta/character_129.txt b/mods/skinsdb/meta/character.129.txt similarity index 100% rename from mods/skinsdb/meta/character_129.txt rename to mods/skinsdb/meta/character.129.txt diff --git a/mods/skinsdb/meta/character_1290.txt b/mods/skinsdb/meta/character.1290.txt similarity index 100% rename from mods/skinsdb/meta/character_1290.txt rename to mods/skinsdb/meta/character.1290.txt diff --git a/mods/skinsdb/meta/character_1291.txt b/mods/skinsdb/meta/character.1291.txt similarity index 100% rename from mods/skinsdb/meta/character_1291.txt rename to mods/skinsdb/meta/character.1291.txt diff --git a/mods/skinsdb/meta/character_1292.txt b/mods/skinsdb/meta/character.1292.txt similarity index 100% rename from mods/skinsdb/meta/character_1292.txt rename to mods/skinsdb/meta/character.1292.txt diff --git a/mods/skinsdb/meta/character_1293.txt b/mods/skinsdb/meta/character.1293.txt similarity index 100% rename from mods/skinsdb/meta/character_1293.txt rename to mods/skinsdb/meta/character.1293.txt diff --git a/mods/skinsdb/meta/character_1294.txt b/mods/skinsdb/meta/character.1294.txt similarity index 100% rename from mods/skinsdb/meta/character_1294.txt rename to mods/skinsdb/meta/character.1294.txt diff --git a/mods/skinsdb/meta/character_1295.txt b/mods/skinsdb/meta/character.1295.txt similarity index 100% rename from mods/skinsdb/meta/character_1295.txt rename to mods/skinsdb/meta/character.1295.txt diff --git a/mods/skinsdb/meta/character_1296.txt b/mods/skinsdb/meta/character.1296.txt similarity index 100% rename from mods/skinsdb/meta/character_1296.txt rename to mods/skinsdb/meta/character.1296.txt diff --git a/mods/skinsdb/meta/character_1297.txt b/mods/skinsdb/meta/character.1297.txt similarity index 100% rename from mods/skinsdb/meta/character_1297.txt rename to mods/skinsdb/meta/character.1297.txt diff --git a/mods/skinsdb/meta/character_1298.txt b/mods/skinsdb/meta/character.1298.txt similarity index 100% rename from mods/skinsdb/meta/character_1298.txt rename to mods/skinsdb/meta/character.1298.txt diff --git a/mods/skinsdb/meta/character_1299.txt b/mods/skinsdb/meta/character.1299.txt similarity index 100% rename from mods/skinsdb/meta/character_1299.txt rename to mods/skinsdb/meta/character.1299.txt diff --git a/mods/skinsdb/meta/character_1300.txt b/mods/skinsdb/meta/character.1300.txt similarity index 100% rename from mods/skinsdb/meta/character_1300.txt rename to mods/skinsdb/meta/character.1300.txt diff --git a/mods/skinsdb/meta/character_1301.txt b/mods/skinsdb/meta/character.1301.txt similarity index 100% rename from mods/skinsdb/meta/character_1301.txt rename to mods/skinsdb/meta/character.1301.txt diff --git a/mods/skinsdb/meta/character_1302.txt b/mods/skinsdb/meta/character.1302.txt similarity index 100% rename from mods/skinsdb/meta/character_1302.txt rename to mods/skinsdb/meta/character.1302.txt diff --git a/mods/skinsdb/meta/character_1303.txt b/mods/skinsdb/meta/character.1303.txt similarity index 100% rename from mods/skinsdb/meta/character_1303.txt rename to mods/skinsdb/meta/character.1303.txt diff --git a/mods/skinsdb/meta/character_1304.txt b/mods/skinsdb/meta/character.1304.txt similarity index 100% rename from mods/skinsdb/meta/character_1304.txt rename to mods/skinsdb/meta/character.1304.txt diff --git a/mods/skinsdb/meta/character_1305.txt b/mods/skinsdb/meta/character.1305.txt similarity index 100% rename from mods/skinsdb/meta/character_1305.txt rename to mods/skinsdb/meta/character.1305.txt diff --git a/mods/skinsdb/meta/character_1306.txt b/mods/skinsdb/meta/character.1306.txt similarity index 100% rename from mods/skinsdb/meta/character_1306.txt rename to mods/skinsdb/meta/character.1306.txt diff --git a/mods/skinsdb/meta/character_1307.txt b/mods/skinsdb/meta/character.1307.txt similarity index 100% rename from mods/skinsdb/meta/character_1307.txt rename to mods/skinsdb/meta/character.1307.txt diff --git a/mods/skinsdb/meta/character_1308.txt b/mods/skinsdb/meta/character.1308.txt similarity index 100% rename from mods/skinsdb/meta/character_1308.txt rename to mods/skinsdb/meta/character.1308.txt diff --git a/mods/skinsdb/meta/character_1309.txt b/mods/skinsdb/meta/character.1309.txt similarity index 100% rename from mods/skinsdb/meta/character_1309.txt rename to mods/skinsdb/meta/character.1309.txt diff --git a/mods/skinsdb/meta/character_1310.txt b/mods/skinsdb/meta/character.1310.txt similarity index 100% rename from mods/skinsdb/meta/character_1310.txt rename to mods/skinsdb/meta/character.1310.txt diff --git a/mods/skinsdb/meta/character_1311.txt b/mods/skinsdb/meta/character.1311.txt similarity index 100% rename from mods/skinsdb/meta/character_1311.txt rename to mods/skinsdb/meta/character.1311.txt diff --git a/mods/skinsdb/meta/character_1312.txt b/mods/skinsdb/meta/character.1312.txt similarity index 100% rename from mods/skinsdb/meta/character_1312.txt rename to mods/skinsdb/meta/character.1312.txt diff --git a/mods/skinsdb/meta/character_1313.txt b/mods/skinsdb/meta/character.1313.txt similarity index 100% rename from mods/skinsdb/meta/character_1313.txt rename to mods/skinsdb/meta/character.1313.txt diff --git a/mods/skinsdb/meta/character_1314.txt b/mods/skinsdb/meta/character.1314.txt similarity index 100% rename from mods/skinsdb/meta/character_1314.txt rename to mods/skinsdb/meta/character.1314.txt diff --git a/mods/skinsdb/meta/character_1315.txt b/mods/skinsdb/meta/character.1315.txt similarity index 100% rename from mods/skinsdb/meta/character_1315.txt rename to mods/skinsdb/meta/character.1315.txt diff --git a/mods/skinsdb/meta/character_1316.txt b/mods/skinsdb/meta/character.1316.txt similarity index 100% rename from mods/skinsdb/meta/character_1316.txt rename to mods/skinsdb/meta/character.1316.txt diff --git a/mods/skinsdb/meta/character_1317.txt b/mods/skinsdb/meta/character.1317.txt similarity index 100% rename from mods/skinsdb/meta/character_1317.txt rename to mods/skinsdb/meta/character.1317.txt diff --git a/mods/skinsdb/meta/character_1318.txt b/mods/skinsdb/meta/character.1318.txt similarity index 100% rename from mods/skinsdb/meta/character_1318.txt rename to mods/skinsdb/meta/character.1318.txt diff --git a/mods/skinsdb/meta/character_1319.txt b/mods/skinsdb/meta/character.1319.txt similarity index 100% rename from mods/skinsdb/meta/character_1319.txt rename to mods/skinsdb/meta/character.1319.txt diff --git a/mods/skinsdb/meta/character_1320.txt b/mods/skinsdb/meta/character.1320.txt similarity index 100% rename from mods/skinsdb/meta/character_1320.txt rename to mods/skinsdb/meta/character.1320.txt diff --git a/mods/skinsdb/meta/character_1321.txt b/mods/skinsdb/meta/character.1321.txt similarity index 100% rename from mods/skinsdb/meta/character_1321.txt rename to mods/skinsdb/meta/character.1321.txt diff --git a/mods/skinsdb/meta/character_1322.txt b/mods/skinsdb/meta/character.1322.txt similarity index 100% rename from mods/skinsdb/meta/character_1322.txt rename to mods/skinsdb/meta/character.1322.txt diff --git a/mods/skinsdb/meta/character_1323.txt b/mods/skinsdb/meta/character.1323.txt similarity index 100% rename from mods/skinsdb/meta/character_1323.txt rename to mods/skinsdb/meta/character.1323.txt diff --git a/mods/skinsdb/meta/character_1324.txt b/mods/skinsdb/meta/character.1324.txt similarity index 100% rename from mods/skinsdb/meta/character_1324.txt rename to mods/skinsdb/meta/character.1324.txt diff --git a/mods/skinsdb/meta/character_1325.txt b/mods/skinsdb/meta/character.1325.txt similarity index 100% rename from mods/skinsdb/meta/character_1325.txt rename to mods/skinsdb/meta/character.1325.txt diff --git a/mods/skinsdb/meta/character_1326.txt b/mods/skinsdb/meta/character.1326.txt similarity index 100% rename from mods/skinsdb/meta/character_1326.txt rename to mods/skinsdb/meta/character.1326.txt diff --git a/mods/skinsdb/meta/character_1327.txt b/mods/skinsdb/meta/character.1327.txt similarity index 100% rename from mods/skinsdb/meta/character_1327.txt rename to mods/skinsdb/meta/character.1327.txt diff --git a/mods/skinsdb/meta/character_1328.txt b/mods/skinsdb/meta/character.1328.txt similarity index 100% rename from mods/skinsdb/meta/character_1328.txt rename to mods/skinsdb/meta/character.1328.txt diff --git a/mods/skinsdb/meta/character_1329.txt b/mods/skinsdb/meta/character.1329.txt similarity index 100% rename from mods/skinsdb/meta/character_1329.txt rename to mods/skinsdb/meta/character.1329.txt diff --git a/mods/skinsdb/meta/character_1330.txt b/mods/skinsdb/meta/character.1330.txt similarity index 100% rename from mods/skinsdb/meta/character_1330.txt rename to mods/skinsdb/meta/character.1330.txt diff --git a/mods/skinsdb/meta/character_1331.txt b/mods/skinsdb/meta/character.1331.txt similarity index 100% rename from mods/skinsdb/meta/character_1331.txt rename to mods/skinsdb/meta/character.1331.txt diff --git a/mods/skinsdb/meta/character_1332.txt b/mods/skinsdb/meta/character.1332.txt similarity index 100% rename from mods/skinsdb/meta/character_1332.txt rename to mods/skinsdb/meta/character.1332.txt diff --git a/mods/skinsdb/meta/character_1333.txt b/mods/skinsdb/meta/character.1333.txt similarity index 100% rename from mods/skinsdb/meta/character_1333.txt rename to mods/skinsdb/meta/character.1333.txt diff --git a/mods/skinsdb/meta/character_1334.txt b/mods/skinsdb/meta/character.1334.txt similarity index 100% rename from mods/skinsdb/meta/character_1334.txt rename to mods/skinsdb/meta/character.1334.txt diff --git a/mods/skinsdb/meta/character_1335.txt b/mods/skinsdb/meta/character.1335.txt similarity index 100% rename from mods/skinsdb/meta/character_1335.txt rename to mods/skinsdb/meta/character.1335.txt diff --git a/mods/skinsdb/meta/character_1336.txt b/mods/skinsdb/meta/character.1336.txt similarity index 100% rename from mods/skinsdb/meta/character_1336.txt rename to mods/skinsdb/meta/character.1336.txt diff --git a/mods/skinsdb/meta/character_1337.txt b/mods/skinsdb/meta/character.1337.txt similarity index 100% rename from mods/skinsdb/meta/character_1337.txt rename to mods/skinsdb/meta/character.1337.txt diff --git a/mods/skinsdb/meta/character_1338.txt b/mods/skinsdb/meta/character.1338.txt similarity index 100% rename from mods/skinsdb/meta/character_1338.txt rename to mods/skinsdb/meta/character.1338.txt diff --git a/mods/skinsdb/meta/character_134.txt b/mods/skinsdb/meta/character.134.txt similarity index 100% rename from mods/skinsdb/meta/character_134.txt rename to mods/skinsdb/meta/character.134.txt diff --git a/mods/skinsdb/meta/character_1340.txt b/mods/skinsdb/meta/character.1340.txt similarity index 100% rename from mods/skinsdb/meta/character_1340.txt rename to mods/skinsdb/meta/character.1340.txt diff --git a/mods/skinsdb/meta/character_1341.txt b/mods/skinsdb/meta/character.1341.txt similarity index 100% rename from mods/skinsdb/meta/character_1341.txt rename to mods/skinsdb/meta/character.1341.txt diff --git a/mods/skinsdb/meta/character_1342.txt b/mods/skinsdb/meta/character.1342.txt similarity index 100% rename from mods/skinsdb/meta/character_1342.txt rename to mods/skinsdb/meta/character.1342.txt diff --git a/mods/skinsdb/meta/character_1343.txt b/mods/skinsdb/meta/character.1343.txt similarity index 100% rename from mods/skinsdb/meta/character_1343.txt rename to mods/skinsdb/meta/character.1343.txt diff --git a/mods/skinsdb/meta/character_1344.txt b/mods/skinsdb/meta/character.1344.txt similarity index 100% rename from mods/skinsdb/meta/character_1344.txt rename to mods/skinsdb/meta/character.1344.txt diff --git a/mods/skinsdb/meta/character_1345.txt b/mods/skinsdb/meta/character.1345.txt similarity index 100% rename from mods/skinsdb/meta/character_1345.txt rename to mods/skinsdb/meta/character.1345.txt diff --git a/mods/skinsdb/meta/character_1346.txt b/mods/skinsdb/meta/character.1346.txt similarity index 100% rename from mods/skinsdb/meta/character_1346.txt rename to mods/skinsdb/meta/character.1346.txt diff --git a/mods/skinsdb/meta/character_1347.txt b/mods/skinsdb/meta/character.1347.txt similarity index 100% rename from mods/skinsdb/meta/character_1347.txt rename to mods/skinsdb/meta/character.1347.txt diff --git a/mods/skinsdb/meta/character_1348.txt b/mods/skinsdb/meta/character.1348.txt similarity index 100% rename from mods/skinsdb/meta/character_1348.txt rename to mods/skinsdb/meta/character.1348.txt diff --git a/mods/skinsdb/meta/character_1349.txt b/mods/skinsdb/meta/character.1349.txt similarity index 100% rename from mods/skinsdb/meta/character_1349.txt rename to mods/skinsdb/meta/character.1349.txt diff --git a/mods/skinsdb/meta/character_135.txt b/mods/skinsdb/meta/character.135.txt similarity index 100% rename from mods/skinsdb/meta/character_135.txt rename to mods/skinsdb/meta/character.135.txt diff --git a/mods/skinsdb/meta/character_1350.txt b/mods/skinsdb/meta/character.1350.txt similarity index 100% rename from mods/skinsdb/meta/character_1350.txt rename to mods/skinsdb/meta/character.1350.txt diff --git a/mods/skinsdb/meta/character_1351.txt b/mods/skinsdb/meta/character.1351.txt similarity index 100% rename from mods/skinsdb/meta/character_1351.txt rename to mods/skinsdb/meta/character.1351.txt diff --git a/mods/skinsdb/meta/character_1352.txt b/mods/skinsdb/meta/character.1352.txt similarity index 100% rename from mods/skinsdb/meta/character_1352.txt rename to mods/skinsdb/meta/character.1352.txt diff --git a/mods/skinsdb/meta/character_1353.txt b/mods/skinsdb/meta/character.1353.txt similarity index 100% rename from mods/skinsdb/meta/character_1353.txt rename to mods/skinsdb/meta/character.1353.txt diff --git a/mods/skinsdb/meta/character_1354.txt b/mods/skinsdb/meta/character.1354.txt similarity index 100% rename from mods/skinsdb/meta/character_1354.txt rename to mods/skinsdb/meta/character.1354.txt diff --git a/mods/skinsdb/meta/character_1355.txt b/mods/skinsdb/meta/character.1355.txt similarity index 100% rename from mods/skinsdb/meta/character_1355.txt rename to mods/skinsdb/meta/character.1355.txt diff --git a/mods/skinsdb/meta/character_1356.txt b/mods/skinsdb/meta/character.1356.txt similarity index 100% rename from mods/skinsdb/meta/character_1356.txt rename to mods/skinsdb/meta/character.1356.txt diff --git a/mods/skinsdb/meta/character_1357.txt b/mods/skinsdb/meta/character.1357.txt similarity index 100% rename from mods/skinsdb/meta/character_1357.txt rename to mods/skinsdb/meta/character.1357.txt diff --git a/mods/skinsdb/meta/character_1358.txt b/mods/skinsdb/meta/character.1358.txt similarity index 100% rename from mods/skinsdb/meta/character_1358.txt rename to mods/skinsdb/meta/character.1358.txt diff --git a/mods/skinsdb/meta/character_1359.txt b/mods/skinsdb/meta/character.1359.txt similarity index 100% rename from mods/skinsdb/meta/character_1359.txt rename to mods/skinsdb/meta/character.1359.txt diff --git a/mods/skinsdb/meta/character_136.txt b/mods/skinsdb/meta/character.136.txt similarity index 100% rename from mods/skinsdb/meta/character_136.txt rename to mods/skinsdb/meta/character.136.txt diff --git a/mods/skinsdb/meta/character_1360.txt b/mods/skinsdb/meta/character.1360.txt similarity index 100% rename from mods/skinsdb/meta/character_1360.txt rename to mods/skinsdb/meta/character.1360.txt diff --git a/mods/skinsdb/meta/character_1361.txt b/mods/skinsdb/meta/character.1361.txt similarity index 100% rename from mods/skinsdb/meta/character_1361.txt rename to mods/skinsdb/meta/character.1361.txt diff --git a/mods/skinsdb/meta/character_1362.txt b/mods/skinsdb/meta/character.1362.txt similarity index 100% rename from mods/skinsdb/meta/character_1362.txt rename to mods/skinsdb/meta/character.1362.txt diff --git a/mods/skinsdb/meta/character_1363.txt b/mods/skinsdb/meta/character.1363.txt similarity index 100% rename from mods/skinsdb/meta/character_1363.txt rename to mods/skinsdb/meta/character.1363.txt diff --git a/mods/skinsdb/meta/character_1364.txt b/mods/skinsdb/meta/character.1364.txt similarity index 100% rename from mods/skinsdb/meta/character_1364.txt rename to mods/skinsdb/meta/character.1364.txt diff --git a/mods/skinsdb/meta/character_1365.txt b/mods/skinsdb/meta/character.1365.txt similarity index 100% rename from mods/skinsdb/meta/character_1365.txt rename to mods/skinsdb/meta/character.1365.txt diff --git a/mods/skinsdb/meta/character_1366.txt b/mods/skinsdb/meta/character.1366.txt similarity index 100% rename from mods/skinsdb/meta/character_1366.txt rename to mods/skinsdb/meta/character.1366.txt diff --git a/mods/skinsdb/meta/character_1367.txt b/mods/skinsdb/meta/character.1367.txt similarity index 100% rename from mods/skinsdb/meta/character_1367.txt rename to mods/skinsdb/meta/character.1367.txt diff --git a/mods/skinsdb/meta/character_1368.txt b/mods/skinsdb/meta/character.1368.txt similarity index 100% rename from mods/skinsdb/meta/character_1368.txt rename to mods/skinsdb/meta/character.1368.txt diff --git a/mods/skinsdb/meta/character_1369.txt b/mods/skinsdb/meta/character.1369.txt similarity index 100% rename from mods/skinsdb/meta/character_1369.txt rename to mods/skinsdb/meta/character.1369.txt diff --git a/mods/skinsdb/meta/character_1370.txt b/mods/skinsdb/meta/character.1370.txt similarity index 100% rename from mods/skinsdb/meta/character_1370.txt rename to mods/skinsdb/meta/character.1370.txt diff --git a/mods/skinsdb/meta/character_1371.txt b/mods/skinsdb/meta/character.1371.txt similarity index 100% rename from mods/skinsdb/meta/character_1371.txt rename to mods/skinsdb/meta/character.1371.txt diff --git a/mods/skinsdb/meta/character_1372.txt b/mods/skinsdb/meta/character.1372.txt similarity index 100% rename from mods/skinsdb/meta/character_1372.txt rename to mods/skinsdb/meta/character.1372.txt diff --git a/mods/skinsdb/meta/character_1373.txt b/mods/skinsdb/meta/character.1373.txt similarity index 100% rename from mods/skinsdb/meta/character_1373.txt rename to mods/skinsdb/meta/character.1373.txt diff --git a/mods/skinsdb/meta/character_1374.txt b/mods/skinsdb/meta/character.1374.txt similarity index 100% rename from mods/skinsdb/meta/character_1374.txt rename to mods/skinsdb/meta/character.1374.txt diff --git a/mods/skinsdb/meta/character_1375.txt b/mods/skinsdb/meta/character.1375.txt similarity index 100% rename from mods/skinsdb/meta/character_1375.txt rename to mods/skinsdb/meta/character.1375.txt diff --git a/mods/skinsdb/meta/character_1376.txt b/mods/skinsdb/meta/character.1376.txt similarity index 100% rename from mods/skinsdb/meta/character_1376.txt rename to mods/skinsdb/meta/character.1376.txt diff --git a/mods/skinsdb/meta/character_1377.txt b/mods/skinsdb/meta/character.1377.txt similarity index 100% rename from mods/skinsdb/meta/character_1377.txt rename to mods/skinsdb/meta/character.1377.txt diff --git a/mods/skinsdb/meta/character_1378.txt b/mods/skinsdb/meta/character.1378.txt similarity index 100% rename from mods/skinsdb/meta/character_1378.txt rename to mods/skinsdb/meta/character.1378.txt diff --git a/mods/skinsdb/meta/character_1379.txt b/mods/skinsdb/meta/character.1379.txt similarity index 100% rename from mods/skinsdb/meta/character_1379.txt rename to mods/skinsdb/meta/character.1379.txt diff --git a/mods/skinsdb/meta/character_1380.txt b/mods/skinsdb/meta/character.1380.txt similarity index 100% rename from mods/skinsdb/meta/character_1380.txt rename to mods/skinsdb/meta/character.1380.txt diff --git a/mods/skinsdb/meta/character_1381.txt b/mods/skinsdb/meta/character.1381.txt similarity index 100% rename from mods/skinsdb/meta/character_1381.txt rename to mods/skinsdb/meta/character.1381.txt diff --git a/mods/skinsdb/meta/character_1382.txt b/mods/skinsdb/meta/character.1382.txt similarity index 100% rename from mods/skinsdb/meta/character_1382.txt rename to mods/skinsdb/meta/character.1382.txt diff --git a/mods/skinsdb/meta/character_1383.txt b/mods/skinsdb/meta/character.1383.txt similarity index 100% rename from mods/skinsdb/meta/character_1383.txt rename to mods/skinsdb/meta/character.1383.txt diff --git a/mods/skinsdb/meta/character_1384.txt b/mods/skinsdb/meta/character.1384.txt similarity index 100% rename from mods/skinsdb/meta/character_1384.txt rename to mods/skinsdb/meta/character.1384.txt diff --git a/mods/skinsdb/meta/character_1385.txt b/mods/skinsdb/meta/character.1385.txt similarity index 100% rename from mods/skinsdb/meta/character_1385.txt rename to mods/skinsdb/meta/character.1385.txt diff --git a/mods/skinsdb/meta/character_1386.txt b/mods/skinsdb/meta/character.1386.txt similarity index 100% rename from mods/skinsdb/meta/character_1386.txt rename to mods/skinsdb/meta/character.1386.txt diff --git a/mods/skinsdb/meta/character_1387.txt b/mods/skinsdb/meta/character.1387.txt similarity index 100% rename from mods/skinsdb/meta/character_1387.txt rename to mods/skinsdb/meta/character.1387.txt diff --git a/mods/skinsdb/meta/character_1388.txt b/mods/skinsdb/meta/character.1388.txt similarity index 100% rename from mods/skinsdb/meta/character_1388.txt rename to mods/skinsdb/meta/character.1388.txt diff --git a/mods/skinsdb/meta/character_1389.txt b/mods/skinsdb/meta/character.1389.txt similarity index 100% rename from mods/skinsdb/meta/character_1389.txt rename to mods/skinsdb/meta/character.1389.txt diff --git a/mods/skinsdb/meta/character_1390.txt b/mods/skinsdb/meta/character.1390.txt similarity index 100% rename from mods/skinsdb/meta/character_1390.txt rename to mods/skinsdb/meta/character.1390.txt diff --git a/mods/skinsdb/meta/character_1391.txt b/mods/skinsdb/meta/character.1391.txt similarity index 100% rename from mods/skinsdb/meta/character_1391.txt rename to mods/skinsdb/meta/character.1391.txt diff --git a/mods/skinsdb/meta/character_1392.txt b/mods/skinsdb/meta/character.1392.txt similarity index 100% rename from mods/skinsdb/meta/character_1392.txt rename to mods/skinsdb/meta/character.1392.txt diff --git a/mods/skinsdb/meta/character_1393.txt b/mods/skinsdb/meta/character.1393.txt similarity index 100% rename from mods/skinsdb/meta/character_1393.txt rename to mods/skinsdb/meta/character.1393.txt diff --git a/mods/skinsdb/meta/character_1394.txt b/mods/skinsdb/meta/character.1394.txt similarity index 100% rename from mods/skinsdb/meta/character_1394.txt rename to mods/skinsdb/meta/character.1394.txt diff --git a/mods/skinsdb/meta/character_1395.txt b/mods/skinsdb/meta/character.1395.txt similarity index 100% rename from mods/skinsdb/meta/character_1395.txt rename to mods/skinsdb/meta/character.1395.txt diff --git a/mods/skinsdb/meta/character_1396.txt b/mods/skinsdb/meta/character.1396.txt similarity index 100% rename from mods/skinsdb/meta/character_1396.txt rename to mods/skinsdb/meta/character.1396.txt diff --git a/mods/skinsdb/meta/character_1397.txt b/mods/skinsdb/meta/character.1397.txt similarity index 100% rename from mods/skinsdb/meta/character_1397.txt rename to mods/skinsdb/meta/character.1397.txt diff --git a/mods/skinsdb/meta/character_1398.txt b/mods/skinsdb/meta/character.1398.txt similarity index 100% rename from mods/skinsdb/meta/character_1398.txt rename to mods/skinsdb/meta/character.1398.txt diff --git a/mods/skinsdb/meta/character_1399.txt b/mods/skinsdb/meta/character.1399.txt similarity index 100% rename from mods/skinsdb/meta/character_1399.txt rename to mods/skinsdb/meta/character.1399.txt diff --git a/mods/skinsdb/meta/character_140.txt b/mods/skinsdb/meta/character.140.txt similarity index 100% rename from mods/skinsdb/meta/character_140.txt rename to mods/skinsdb/meta/character.140.txt diff --git a/mods/skinsdb/meta/character_1400.txt b/mods/skinsdb/meta/character.1400.txt similarity index 100% rename from mods/skinsdb/meta/character_1400.txt rename to mods/skinsdb/meta/character.1400.txt diff --git a/mods/skinsdb/meta/character_1401.txt b/mods/skinsdb/meta/character.1401.txt similarity index 100% rename from mods/skinsdb/meta/character_1401.txt rename to mods/skinsdb/meta/character.1401.txt diff --git a/mods/skinsdb/meta/character_1402.txt b/mods/skinsdb/meta/character.1402.txt similarity index 100% rename from mods/skinsdb/meta/character_1402.txt rename to mods/skinsdb/meta/character.1402.txt diff --git a/mods/skinsdb/meta/character_1403.txt b/mods/skinsdb/meta/character.1403.txt similarity index 100% rename from mods/skinsdb/meta/character_1403.txt rename to mods/skinsdb/meta/character.1403.txt diff --git a/mods/skinsdb/meta/character_1404.txt b/mods/skinsdb/meta/character.1404.txt similarity index 100% rename from mods/skinsdb/meta/character_1404.txt rename to mods/skinsdb/meta/character.1404.txt diff --git a/mods/skinsdb/meta/character_1405.txt b/mods/skinsdb/meta/character.1405.txt similarity index 100% rename from mods/skinsdb/meta/character_1405.txt rename to mods/skinsdb/meta/character.1405.txt diff --git a/mods/skinsdb/meta/character_1406.txt b/mods/skinsdb/meta/character.1406.txt similarity index 100% rename from mods/skinsdb/meta/character_1406.txt rename to mods/skinsdb/meta/character.1406.txt diff --git a/mods/skinsdb/meta/character_1407.txt b/mods/skinsdb/meta/character.1407.txt similarity index 100% rename from mods/skinsdb/meta/character_1407.txt rename to mods/skinsdb/meta/character.1407.txt diff --git a/mods/skinsdb/meta/character_1408.txt b/mods/skinsdb/meta/character.1408.txt similarity index 100% rename from mods/skinsdb/meta/character_1408.txt rename to mods/skinsdb/meta/character.1408.txt diff --git a/mods/skinsdb/meta/character_1409.txt b/mods/skinsdb/meta/character.1409.txt similarity index 100% rename from mods/skinsdb/meta/character_1409.txt rename to mods/skinsdb/meta/character.1409.txt diff --git a/mods/skinsdb/meta/character_141.txt b/mods/skinsdb/meta/character.141.txt similarity index 100% rename from mods/skinsdb/meta/character_141.txt rename to mods/skinsdb/meta/character.141.txt diff --git a/mods/skinsdb/meta/character_1410.txt b/mods/skinsdb/meta/character.1410.txt similarity index 100% rename from mods/skinsdb/meta/character_1410.txt rename to mods/skinsdb/meta/character.1410.txt diff --git a/mods/skinsdb/meta/character_1411.txt b/mods/skinsdb/meta/character.1411.txt similarity index 100% rename from mods/skinsdb/meta/character_1411.txt rename to mods/skinsdb/meta/character.1411.txt diff --git a/mods/skinsdb/meta/character_1414.txt b/mods/skinsdb/meta/character.1414.txt similarity index 100% rename from mods/skinsdb/meta/character_1414.txt rename to mods/skinsdb/meta/character.1414.txt diff --git a/mods/skinsdb/meta/character_1415.txt b/mods/skinsdb/meta/character.1415.txt similarity index 100% rename from mods/skinsdb/meta/character_1415.txt rename to mods/skinsdb/meta/character.1415.txt diff --git a/mods/skinsdb/meta/character_1416.txt b/mods/skinsdb/meta/character.1416.txt similarity index 100% rename from mods/skinsdb/meta/character_1416.txt rename to mods/skinsdb/meta/character.1416.txt diff --git a/mods/skinsdb/meta/character_1417.txt b/mods/skinsdb/meta/character.1417.txt similarity index 100% rename from mods/skinsdb/meta/character_1417.txt rename to mods/skinsdb/meta/character.1417.txt diff --git a/mods/skinsdb/meta/character_1418.txt b/mods/skinsdb/meta/character.1418.txt similarity index 100% rename from mods/skinsdb/meta/character_1418.txt rename to mods/skinsdb/meta/character.1418.txt diff --git a/mods/skinsdb/meta/character_1419.txt b/mods/skinsdb/meta/character.1419.txt similarity index 100% rename from mods/skinsdb/meta/character_1419.txt rename to mods/skinsdb/meta/character.1419.txt diff --git a/mods/skinsdb/meta/character_142.txt b/mods/skinsdb/meta/character.142.txt similarity index 100% rename from mods/skinsdb/meta/character_142.txt rename to mods/skinsdb/meta/character.142.txt diff --git a/mods/skinsdb/meta/character_1420.txt b/mods/skinsdb/meta/character.1420.txt similarity index 100% rename from mods/skinsdb/meta/character_1420.txt rename to mods/skinsdb/meta/character.1420.txt diff --git a/mods/skinsdb/meta/character_1421.txt b/mods/skinsdb/meta/character.1421.txt similarity index 100% rename from mods/skinsdb/meta/character_1421.txt rename to mods/skinsdb/meta/character.1421.txt diff --git a/mods/skinsdb/meta/character_1422.txt b/mods/skinsdb/meta/character.1422.txt similarity index 100% rename from mods/skinsdb/meta/character_1422.txt rename to mods/skinsdb/meta/character.1422.txt diff --git a/mods/skinsdb/meta/character_1423.txt b/mods/skinsdb/meta/character.1423.txt similarity index 100% rename from mods/skinsdb/meta/character_1423.txt rename to mods/skinsdb/meta/character.1423.txt diff --git a/mods/skinsdb/meta/character_1424.txt b/mods/skinsdb/meta/character.1424.txt similarity index 100% rename from mods/skinsdb/meta/character_1424.txt rename to mods/skinsdb/meta/character.1424.txt diff --git a/mods/skinsdb/meta/character_1425.txt b/mods/skinsdb/meta/character.1425.txt similarity index 100% rename from mods/skinsdb/meta/character_1425.txt rename to mods/skinsdb/meta/character.1425.txt diff --git a/mods/skinsdb/meta/character_1426.txt b/mods/skinsdb/meta/character.1426.txt similarity index 100% rename from mods/skinsdb/meta/character_1426.txt rename to mods/skinsdb/meta/character.1426.txt diff --git a/mods/skinsdb/meta/character_1427.txt b/mods/skinsdb/meta/character.1427.txt similarity index 100% rename from mods/skinsdb/meta/character_1427.txt rename to mods/skinsdb/meta/character.1427.txt diff --git a/mods/skinsdb/meta/character_1428.txt b/mods/skinsdb/meta/character.1428.txt similarity index 100% rename from mods/skinsdb/meta/character_1428.txt rename to mods/skinsdb/meta/character.1428.txt diff --git a/mods/skinsdb/meta/character_1429.txt b/mods/skinsdb/meta/character.1429.txt similarity index 100% rename from mods/skinsdb/meta/character_1429.txt rename to mods/skinsdb/meta/character.1429.txt diff --git a/mods/skinsdb/meta/character_143.txt b/mods/skinsdb/meta/character.143.txt similarity index 100% rename from mods/skinsdb/meta/character_143.txt rename to mods/skinsdb/meta/character.143.txt diff --git a/mods/skinsdb/meta/character_1430.txt b/mods/skinsdb/meta/character.1430.txt similarity index 100% rename from mods/skinsdb/meta/character_1430.txt rename to mods/skinsdb/meta/character.1430.txt diff --git a/mods/skinsdb/meta/character_1431.txt b/mods/skinsdb/meta/character.1431.txt similarity index 100% rename from mods/skinsdb/meta/character_1431.txt rename to mods/skinsdb/meta/character.1431.txt diff --git a/mods/skinsdb/meta/character_1432.txt b/mods/skinsdb/meta/character.1432.txt similarity index 100% rename from mods/skinsdb/meta/character_1432.txt rename to mods/skinsdb/meta/character.1432.txt diff --git a/mods/skinsdb/meta/character_1433.txt b/mods/skinsdb/meta/character.1433.txt similarity index 100% rename from mods/skinsdb/meta/character_1433.txt rename to mods/skinsdb/meta/character.1433.txt diff --git a/mods/skinsdb/meta/character_1434.txt b/mods/skinsdb/meta/character.1434.txt similarity index 100% rename from mods/skinsdb/meta/character_1434.txt rename to mods/skinsdb/meta/character.1434.txt diff --git a/mods/skinsdb/meta/character_1435.txt b/mods/skinsdb/meta/character.1435.txt similarity index 100% rename from mods/skinsdb/meta/character_1435.txt rename to mods/skinsdb/meta/character.1435.txt diff --git a/mods/skinsdb/meta/character_1436.txt b/mods/skinsdb/meta/character.1436.txt similarity index 100% rename from mods/skinsdb/meta/character_1436.txt rename to mods/skinsdb/meta/character.1436.txt diff --git a/mods/skinsdb/meta/character_1437.txt b/mods/skinsdb/meta/character.1437.txt similarity index 100% rename from mods/skinsdb/meta/character_1437.txt rename to mods/skinsdb/meta/character.1437.txt diff --git a/mods/skinsdb/meta/character_1438.txt b/mods/skinsdb/meta/character.1438.txt similarity index 100% rename from mods/skinsdb/meta/character_1438.txt rename to mods/skinsdb/meta/character.1438.txt diff --git a/mods/skinsdb/meta/character_1439.txt b/mods/skinsdb/meta/character.1439.txt similarity index 100% rename from mods/skinsdb/meta/character_1439.txt rename to mods/skinsdb/meta/character.1439.txt diff --git a/mods/skinsdb/meta/character_144.txt b/mods/skinsdb/meta/character.144.txt similarity index 100% rename from mods/skinsdb/meta/character_144.txt rename to mods/skinsdb/meta/character.144.txt diff --git a/mods/skinsdb/meta/character_1440.txt b/mods/skinsdb/meta/character.1440.txt similarity index 100% rename from mods/skinsdb/meta/character_1440.txt rename to mods/skinsdb/meta/character.1440.txt diff --git a/mods/skinsdb/meta/character_1441.txt b/mods/skinsdb/meta/character.1441.txt similarity index 100% rename from mods/skinsdb/meta/character_1441.txt rename to mods/skinsdb/meta/character.1441.txt diff --git a/mods/skinsdb/meta/character_1442.txt b/mods/skinsdb/meta/character.1442.txt similarity index 100% rename from mods/skinsdb/meta/character_1442.txt rename to mods/skinsdb/meta/character.1442.txt diff --git a/mods/skinsdb/meta/character_1443.txt b/mods/skinsdb/meta/character.1443.txt similarity index 100% rename from mods/skinsdb/meta/character_1443.txt rename to mods/skinsdb/meta/character.1443.txt diff --git a/mods/skinsdb/meta/character_1444.txt b/mods/skinsdb/meta/character.1444.txt similarity index 100% rename from mods/skinsdb/meta/character_1444.txt rename to mods/skinsdb/meta/character.1444.txt diff --git a/mods/skinsdb/meta/character_1445.txt b/mods/skinsdb/meta/character.1445.txt similarity index 100% rename from mods/skinsdb/meta/character_1445.txt rename to mods/skinsdb/meta/character.1445.txt diff --git a/mods/skinsdb/meta/character_145.txt b/mods/skinsdb/meta/character.145.txt similarity index 100% rename from mods/skinsdb/meta/character_145.txt rename to mods/skinsdb/meta/character.145.txt diff --git a/mods/skinsdb/meta/character_1455.txt b/mods/skinsdb/meta/character.1455.txt similarity index 100% rename from mods/skinsdb/meta/character_1455.txt rename to mods/skinsdb/meta/character.1455.txt diff --git a/mods/skinsdb/meta/character_1456.txt b/mods/skinsdb/meta/character.1456.txt similarity index 100% rename from mods/skinsdb/meta/character_1456.txt rename to mods/skinsdb/meta/character.1456.txt diff --git a/mods/skinsdb/meta/character_1457.txt b/mods/skinsdb/meta/character.1457.txt similarity index 100% rename from mods/skinsdb/meta/character_1457.txt rename to mods/skinsdb/meta/character.1457.txt diff --git a/mods/skinsdb/meta/character_1458.txt b/mods/skinsdb/meta/character.1458.txt similarity index 100% rename from mods/skinsdb/meta/character_1458.txt rename to mods/skinsdb/meta/character.1458.txt diff --git a/mods/skinsdb/meta/character_1459.txt b/mods/skinsdb/meta/character.1459.txt similarity index 100% rename from mods/skinsdb/meta/character_1459.txt rename to mods/skinsdb/meta/character.1459.txt diff --git a/mods/skinsdb/meta/character_146.txt b/mods/skinsdb/meta/character.146.txt similarity index 100% rename from mods/skinsdb/meta/character_146.txt rename to mods/skinsdb/meta/character.146.txt diff --git a/mods/skinsdb/meta/character_1460.txt b/mods/skinsdb/meta/character.1460.txt similarity index 100% rename from mods/skinsdb/meta/character_1460.txt rename to mods/skinsdb/meta/character.1460.txt diff --git a/mods/skinsdb/meta/character_1461.txt b/mods/skinsdb/meta/character.1461.txt similarity index 100% rename from mods/skinsdb/meta/character_1461.txt rename to mods/skinsdb/meta/character.1461.txt diff --git a/mods/skinsdb/meta/character_1462.txt b/mods/skinsdb/meta/character.1462.txt similarity index 100% rename from mods/skinsdb/meta/character_1462.txt rename to mods/skinsdb/meta/character.1462.txt diff --git a/mods/skinsdb/meta/character_1463.txt b/mods/skinsdb/meta/character.1463.txt similarity index 100% rename from mods/skinsdb/meta/character_1463.txt rename to mods/skinsdb/meta/character.1463.txt diff --git a/mods/skinsdb/meta/character_1464.txt b/mods/skinsdb/meta/character.1464.txt similarity index 100% rename from mods/skinsdb/meta/character_1464.txt rename to mods/skinsdb/meta/character.1464.txt diff --git a/mods/skinsdb/meta/character_1465.txt b/mods/skinsdb/meta/character.1465.txt similarity index 100% rename from mods/skinsdb/meta/character_1465.txt rename to mods/skinsdb/meta/character.1465.txt diff --git a/mods/skinsdb/meta/character_1466.txt b/mods/skinsdb/meta/character.1466.txt similarity index 100% rename from mods/skinsdb/meta/character_1466.txt rename to mods/skinsdb/meta/character.1466.txt diff --git a/mods/skinsdb/meta/character_1467.txt b/mods/skinsdb/meta/character.1467.txt similarity index 100% rename from mods/skinsdb/meta/character_1467.txt rename to mods/skinsdb/meta/character.1467.txt diff --git a/mods/skinsdb/meta/character_1468.txt b/mods/skinsdb/meta/character.1468.txt similarity index 100% rename from mods/skinsdb/meta/character_1468.txt rename to mods/skinsdb/meta/character.1468.txt diff --git a/mods/skinsdb/meta/character_1469.txt b/mods/skinsdb/meta/character.1469.txt similarity index 100% rename from mods/skinsdb/meta/character_1469.txt rename to mods/skinsdb/meta/character.1469.txt diff --git a/mods/skinsdb/meta/character_147.txt b/mods/skinsdb/meta/character.147.txt similarity index 100% rename from mods/skinsdb/meta/character_147.txt rename to mods/skinsdb/meta/character.147.txt diff --git a/mods/skinsdb/meta/character_1470.txt b/mods/skinsdb/meta/character.1470.txt similarity index 100% rename from mods/skinsdb/meta/character_1470.txt rename to mods/skinsdb/meta/character.1470.txt diff --git a/mods/skinsdb/meta/character_1471.txt b/mods/skinsdb/meta/character.1471.txt similarity index 100% rename from mods/skinsdb/meta/character_1471.txt rename to mods/skinsdb/meta/character.1471.txt diff --git a/mods/skinsdb/meta/character_1472.txt b/mods/skinsdb/meta/character.1472.txt similarity index 100% rename from mods/skinsdb/meta/character_1472.txt rename to mods/skinsdb/meta/character.1472.txt diff --git a/mods/skinsdb/meta/character_1473.txt b/mods/skinsdb/meta/character.1473.txt similarity index 100% rename from mods/skinsdb/meta/character_1473.txt rename to mods/skinsdb/meta/character.1473.txt diff --git a/mods/skinsdb/meta/character_1474.txt b/mods/skinsdb/meta/character.1474.txt similarity index 100% rename from mods/skinsdb/meta/character_1474.txt rename to mods/skinsdb/meta/character.1474.txt diff --git a/mods/skinsdb/meta/character_1475.txt b/mods/skinsdb/meta/character.1475.txt similarity index 100% rename from mods/skinsdb/meta/character_1475.txt rename to mods/skinsdb/meta/character.1475.txt diff --git a/mods/skinsdb/meta/character_1476.txt b/mods/skinsdb/meta/character.1476.txt similarity index 100% rename from mods/skinsdb/meta/character_1476.txt rename to mods/skinsdb/meta/character.1476.txt diff --git a/mods/skinsdb/meta/character_1477.txt b/mods/skinsdb/meta/character.1477.txt similarity index 60% rename from mods/skinsdb/meta/character_1477.txt rename to mods/skinsdb/meta/character.1477.txt index 63050a60..8b108f01 100644 --- a/mods/skinsdb/meta/character_1477.txt +++ b/mods/skinsdb/meta/character.1477.txt @@ -1,3 +1,3 @@ -ábel +ábel sxsx CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1478.txt b/mods/skinsdb/meta/character.1478.txt similarity index 100% rename from mods/skinsdb/meta/character_1478.txt rename to mods/skinsdb/meta/character.1478.txt diff --git a/mods/skinsdb/meta/character_1479.txt b/mods/skinsdb/meta/character.1479.txt similarity index 100% rename from mods/skinsdb/meta/character_1479.txt rename to mods/skinsdb/meta/character.1479.txt diff --git a/mods/skinsdb/meta/character_148.txt b/mods/skinsdb/meta/character.148.txt similarity index 100% rename from mods/skinsdb/meta/character_148.txt rename to mods/skinsdb/meta/character.148.txt diff --git a/mods/skinsdb/meta/character_1480.txt b/mods/skinsdb/meta/character.1480.txt similarity index 100% rename from mods/skinsdb/meta/character_1480.txt rename to mods/skinsdb/meta/character.1480.txt diff --git a/mods/skinsdb/meta/character_1481.txt b/mods/skinsdb/meta/character.1481.txt similarity index 100% rename from mods/skinsdb/meta/character_1481.txt rename to mods/skinsdb/meta/character.1481.txt diff --git a/mods/skinsdb/meta/character_1482.txt b/mods/skinsdb/meta/character.1482.txt similarity index 100% rename from mods/skinsdb/meta/character_1482.txt rename to mods/skinsdb/meta/character.1482.txt diff --git a/mods/skinsdb/meta/character_1483.txt b/mods/skinsdb/meta/character.1483.txt similarity index 100% rename from mods/skinsdb/meta/character_1483.txt rename to mods/skinsdb/meta/character.1483.txt diff --git a/mods/skinsdb/meta/character_1484.txt b/mods/skinsdb/meta/character.1484.txt similarity index 100% rename from mods/skinsdb/meta/character_1484.txt rename to mods/skinsdb/meta/character.1484.txt diff --git a/mods/skinsdb/meta/character_1485.txt b/mods/skinsdb/meta/character.1485.txt similarity index 100% rename from mods/skinsdb/meta/character_1485.txt rename to mods/skinsdb/meta/character.1485.txt diff --git a/mods/skinsdb/meta/character_1486.txt b/mods/skinsdb/meta/character.1486.txt similarity index 100% rename from mods/skinsdb/meta/character_1486.txt rename to mods/skinsdb/meta/character.1486.txt diff --git a/mods/skinsdb/meta/character_1487.txt b/mods/skinsdb/meta/character.1487.txt similarity index 100% rename from mods/skinsdb/meta/character_1487.txt rename to mods/skinsdb/meta/character.1487.txt diff --git a/mods/skinsdb/meta/character_1488.txt b/mods/skinsdb/meta/character.1488.txt similarity index 100% rename from mods/skinsdb/meta/character_1488.txt rename to mods/skinsdb/meta/character.1488.txt diff --git a/mods/skinsdb/meta/character_1489.txt b/mods/skinsdb/meta/character.1489.txt similarity index 100% rename from mods/skinsdb/meta/character_1489.txt rename to mods/skinsdb/meta/character.1489.txt diff --git a/mods/skinsdb/meta/character_1490.txt b/mods/skinsdb/meta/character.1490.txt similarity index 100% rename from mods/skinsdb/meta/character_1490.txt rename to mods/skinsdb/meta/character.1490.txt diff --git a/mods/skinsdb/meta/character_1491.txt b/mods/skinsdb/meta/character.1491.txt similarity index 100% rename from mods/skinsdb/meta/character_1491.txt rename to mods/skinsdb/meta/character.1491.txt diff --git a/mods/skinsdb/meta/character_1492.txt b/mods/skinsdb/meta/character.1492.txt similarity index 100% rename from mods/skinsdb/meta/character_1492.txt rename to mods/skinsdb/meta/character.1492.txt diff --git a/mods/skinsdb/meta/character_1493.txt b/mods/skinsdb/meta/character.1493.txt similarity index 100% rename from mods/skinsdb/meta/character_1493.txt rename to mods/skinsdb/meta/character.1493.txt diff --git a/mods/skinsdb/meta/character_1494.txt b/mods/skinsdb/meta/character.1494.txt similarity index 100% rename from mods/skinsdb/meta/character_1494.txt rename to mods/skinsdb/meta/character.1494.txt diff --git a/mods/skinsdb/meta/character_1495.txt b/mods/skinsdb/meta/character.1495.txt similarity index 100% rename from mods/skinsdb/meta/character_1495.txt rename to mods/skinsdb/meta/character.1495.txt diff --git a/mods/skinsdb/meta/character_1496.txt b/mods/skinsdb/meta/character.1496.txt similarity index 100% rename from mods/skinsdb/meta/character_1496.txt rename to mods/skinsdb/meta/character.1496.txt diff --git a/mods/skinsdb/meta/character_1497.txt b/mods/skinsdb/meta/character.1497.txt similarity index 100% rename from mods/skinsdb/meta/character_1497.txt rename to mods/skinsdb/meta/character.1497.txt diff --git a/mods/skinsdb/meta/character_1498.txt b/mods/skinsdb/meta/character.1498.txt similarity index 100% rename from mods/skinsdb/meta/character_1498.txt rename to mods/skinsdb/meta/character.1498.txt diff --git a/mods/skinsdb/meta/character_1499.txt b/mods/skinsdb/meta/character.1499.txt similarity index 100% rename from mods/skinsdb/meta/character_1499.txt rename to mods/skinsdb/meta/character.1499.txt diff --git a/mods/skinsdb/meta/character_1500.txt b/mods/skinsdb/meta/character.1500.txt similarity index 100% rename from mods/skinsdb/meta/character_1500.txt rename to mods/skinsdb/meta/character.1500.txt diff --git a/mods/skinsdb/meta/character_1501.txt b/mods/skinsdb/meta/character.1501.txt similarity index 100% rename from mods/skinsdb/meta/character_1501.txt rename to mods/skinsdb/meta/character.1501.txt diff --git a/mods/skinsdb/meta/character_1502.txt b/mods/skinsdb/meta/character.1502.txt similarity index 100% rename from mods/skinsdb/meta/character_1502.txt rename to mods/skinsdb/meta/character.1502.txt diff --git a/mods/skinsdb/meta/character_1503.txt b/mods/skinsdb/meta/character.1503.txt similarity index 100% rename from mods/skinsdb/meta/character_1503.txt rename to mods/skinsdb/meta/character.1503.txt diff --git a/mods/skinsdb/meta/character_1504.txt b/mods/skinsdb/meta/character.1504.txt similarity index 100% rename from mods/skinsdb/meta/character_1504.txt rename to mods/skinsdb/meta/character.1504.txt diff --git a/mods/skinsdb/meta/character_1505.txt b/mods/skinsdb/meta/character.1505.txt similarity index 100% rename from mods/skinsdb/meta/character_1505.txt rename to mods/skinsdb/meta/character.1505.txt diff --git a/mods/skinsdb/meta/character_1506.txt b/mods/skinsdb/meta/character.1506.txt similarity index 100% rename from mods/skinsdb/meta/character_1506.txt rename to mods/skinsdb/meta/character.1506.txt diff --git a/mods/skinsdb/meta/character_1507.txt b/mods/skinsdb/meta/character.1507.txt similarity index 100% rename from mods/skinsdb/meta/character_1507.txt rename to mods/skinsdb/meta/character.1507.txt diff --git a/mods/skinsdb/meta/character_1508.txt b/mods/skinsdb/meta/character.1508.txt similarity index 100% rename from mods/skinsdb/meta/character_1508.txt rename to mods/skinsdb/meta/character.1508.txt diff --git a/mods/skinsdb/meta/character_1509.txt b/mods/skinsdb/meta/character.1509.txt similarity index 100% rename from mods/skinsdb/meta/character_1509.txt rename to mods/skinsdb/meta/character.1509.txt diff --git a/mods/skinsdb/meta/character_151.txt b/mods/skinsdb/meta/character.151.txt similarity index 51% rename from mods/skinsdb/meta/character_151.txt rename to mods/skinsdb/meta/character.151.txt index 684193d0..48af8475 100644 --- a/mods/skinsdb/meta/character_151.txt +++ b/mods/skinsdb/meta/character.151.txt @@ -1,3 +1,3 @@ -S"am"TEVE +S"am"TEVE AMMOnym CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1510.txt b/mods/skinsdb/meta/character.1510.txt similarity index 100% rename from mods/skinsdb/meta/character_1510.txt rename to mods/skinsdb/meta/character.1510.txt diff --git a/mods/skinsdb/meta/character_1511.txt b/mods/skinsdb/meta/character.1511.txt similarity index 100% rename from mods/skinsdb/meta/character_1511.txt rename to mods/skinsdb/meta/character.1511.txt diff --git a/mods/skinsdb/meta/character_1512.txt b/mods/skinsdb/meta/character.1512.txt similarity index 100% rename from mods/skinsdb/meta/character_1512.txt rename to mods/skinsdb/meta/character.1512.txt diff --git a/mods/skinsdb/meta/character_1513.txt b/mods/skinsdb/meta/character.1513.txt similarity index 100% rename from mods/skinsdb/meta/character_1513.txt rename to mods/skinsdb/meta/character.1513.txt diff --git a/mods/skinsdb/meta/character_1514.txt b/mods/skinsdb/meta/character.1514.txt similarity index 100% rename from mods/skinsdb/meta/character_1514.txt rename to mods/skinsdb/meta/character.1514.txt diff --git a/mods/skinsdb/meta/character_1515.txt b/mods/skinsdb/meta/character.1515.txt similarity index 100% rename from mods/skinsdb/meta/character_1515.txt rename to mods/skinsdb/meta/character.1515.txt diff --git a/mods/skinsdb/meta/character_1516.txt b/mods/skinsdb/meta/character.1516.txt similarity index 100% rename from mods/skinsdb/meta/character_1516.txt rename to mods/skinsdb/meta/character.1516.txt diff --git a/mods/skinsdb/meta/character_1517.txt b/mods/skinsdb/meta/character.1517.txt similarity index 100% rename from mods/skinsdb/meta/character_1517.txt rename to mods/skinsdb/meta/character.1517.txt diff --git a/mods/skinsdb/meta/character_1518.txt b/mods/skinsdb/meta/character.1518.txt similarity index 100% rename from mods/skinsdb/meta/character_1518.txt rename to mods/skinsdb/meta/character.1518.txt diff --git a/mods/skinsdb/meta/character_1519.txt b/mods/skinsdb/meta/character.1519.txt similarity index 100% rename from mods/skinsdb/meta/character_1519.txt rename to mods/skinsdb/meta/character.1519.txt diff --git a/mods/skinsdb/meta/character_152.txt b/mods/skinsdb/meta/character.152.txt similarity index 100% rename from mods/skinsdb/meta/character_152.txt rename to mods/skinsdb/meta/character.152.txt diff --git a/mods/skinsdb/meta/character_1520.txt b/mods/skinsdb/meta/character.1520.txt similarity index 100% rename from mods/skinsdb/meta/character_1520.txt rename to mods/skinsdb/meta/character.1520.txt diff --git a/mods/skinsdb/meta/character_1521.txt b/mods/skinsdb/meta/character.1521.txt similarity index 100% rename from mods/skinsdb/meta/character_1521.txt rename to mods/skinsdb/meta/character.1521.txt diff --git a/mods/skinsdb/meta/character_1522.txt b/mods/skinsdb/meta/character.1522.txt similarity index 100% rename from mods/skinsdb/meta/character_1522.txt rename to mods/skinsdb/meta/character.1522.txt diff --git a/mods/skinsdb/meta/character_1523.txt b/mods/skinsdb/meta/character.1523.txt similarity index 100% rename from mods/skinsdb/meta/character_1523.txt rename to mods/skinsdb/meta/character.1523.txt diff --git a/mods/skinsdb/meta/character_1524.txt b/mods/skinsdb/meta/character.1524.txt similarity index 100% rename from mods/skinsdb/meta/character_1524.txt rename to mods/skinsdb/meta/character.1524.txt diff --git a/mods/skinsdb/meta/character_1525.txt b/mods/skinsdb/meta/character.1525.txt similarity index 100% rename from mods/skinsdb/meta/character_1525.txt rename to mods/skinsdb/meta/character.1525.txt diff --git a/mods/skinsdb/meta/character_1526.txt b/mods/skinsdb/meta/character.1526.txt similarity index 100% rename from mods/skinsdb/meta/character_1526.txt rename to mods/skinsdb/meta/character.1526.txt diff --git a/mods/skinsdb/meta/character_1527.txt b/mods/skinsdb/meta/character.1527.txt similarity index 100% rename from mods/skinsdb/meta/character_1527.txt rename to mods/skinsdb/meta/character.1527.txt diff --git a/mods/skinsdb/meta/character_1528.txt b/mods/skinsdb/meta/character.1528.txt similarity index 100% rename from mods/skinsdb/meta/character_1528.txt rename to mods/skinsdb/meta/character.1528.txt diff --git a/mods/skinsdb/meta/character_1529.txt b/mods/skinsdb/meta/character.1529.txt similarity index 100% rename from mods/skinsdb/meta/character_1529.txt rename to mods/skinsdb/meta/character.1529.txt diff --git a/mods/skinsdb/meta/character_153.txt b/mods/skinsdb/meta/character.153.txt similarity index 100% rename from mods/skinsdb/meta/character_153.txt rename to mods/skinsdb/meta/character.153.txt diff --git a/mods/skinsdb/meta/character_1530.txt b/mods/skinsdb/meta/character.1530.txt similarity index 100% rename from mods/skinsdb/meta/character_1530.txt rename to mods/skinsdb/meta/character.1530.txt diff --git a/mods/skinsdb/meta/character_1531.txt b/mods/skinsdb/meta/character.1531.txt similarity index 100% rename from mods/skinsdb/meta/character_1531.txt rename to mods/skinsdb/meta/character.1531.txt diff --git a/mods/skinsdb/meta/character_1532.txt b/mods/skinsdb/meta/character.1532.txt similarity index 100% rename from mods/skinsdb/meta/character_1532.txt rename to mods/skinsdb/meta/character.1532.txt diff --git a/mods/skinsdb/meta/character_1533.txt b/mods/skinsdb/meta/character.1533.txt similarity index 100% rename from mods/skinsdb/meta/character_1533.txt rename to mods/skinsdb/meta/character.1533.txt diff --git a/mods/skinsdb/meta/character_1534.txt b/mods/skinsdb/meta/character.1534.txt similarity index 100% rename from mods/skinsdb/meta/character_1534.txt rename to mods/skinsdb/meta/character.1534.txt diff --git a/mods/skinsdb/meta/character_1535.txt b/mods/skinsdb/meta/character.1535.txt similarity index 100% rename from mods/skinsdb/meta/character_1535.txt rename to mods/skinsdb/meta/character.1535.txt diff --git a/mods/skinsdb/meta/character_1536.txt b/mods/skinsdb/meta/character.1536.txt similarity index 100% rename from mods/skinsdb/meta/character_1536.txt rename to mods/skinsdb/meta/character.1536.txt diff --git a/mods/skinsdb/meta/character_1537.txt b/mods/skinsdb/meta/character.1537.txt similarity index 100% rename from mods/skinsdb/meta/character_1537.txt rename to mods/skinsdb/meta/character.1537.txt diff --git a/mods/skinsdb/meta/character_1538.txt b/mods/skinsdb/meta/character.1538.txt similarity index 100% rename from mods/skinsdb/meta/character_1538.txt rename to mods/skinsdb/meta/character.1538.txt diff --git a/mods/skinsdb/meta/character_1539.txt b/mods/skinsdb/meta/character.1539.txt similarity index 100% rename from mods/skinsdb/meta/character_1539.txt rename to mods/skinsdb/meta/character.1539.txt diff --git a/mods/skinsdb/meta/character_154.txt b/mods/skinsdb/meta/character.154.txt similarity index 100% rename from mods/skinsdb/meta/character_154.txt rename to mods/skinsdb/meta/character.154.txt diff --git a/mods/skinsdb/meta/character_1540.txt b/mods/skinsdb/meta/character.1540.txt similarity index 100% rename from mods/skinsdb/meta/character_1540.txt rename to mods/skinsdb/meta/character.1540.txt diff --git a/mods/skinsdb/meta/character_1541.txt b/mods/skinsdb/meta/character.1541.txt similarity index 100% rename from mods/skinsdb/meta/character_1541.txt rename to mods/skinsdb/meta/character.1541.txt diff --git a/mods/skinsdb/meta/character_1542.txt b/mods/skinsdb/meta/character.1542.txt similarity index 100% rename from mods/skinsdb/meta/character_1542.txt rename to mods/skinsdb/meta/character.1542.txt diff --git a/mods/skinsdb/meta/character_1543.txt b/mods/skinsdb/meta/character.1543.txt similarity index 100% rename from mods/skinsdb/meta/character_1543.txt rename to mods/skinsdb/meta/character.1543.txt diff --git a/mods/skinsdb/meta/character_1544.txt b/mods/skinsdb/meta/character.1544.txt similarity index 100% rename from mods/skinsdb/meta/character_1544.txt rename to mods/skinsdb/meta/character.1544.txt diff --git a/mods/skinsdb/meta/character_1545.txt b/mods/skinsdb/meta/character.1545.txt similarity index 100% rename from mods/skinsdb/meta/character_1545.txt rename to mods/skinsdb/meta/character.1545.txt diff --git a/mods/skinsdb/meta/character_1546.txt b/mods/skinsdb/meta/character.1546.txt similarity index 100% rename from mods/skinsdb/meta/character_1546.txt rename to mods/skinsdb/meta/character.1546.txt diff --git a/mods/skinsdb/meta/character_1547.txt b/mods/skinsdb/meta/character.1547.txt similarity index 100% rename from mods/skinsdb/meta/character_1547.txt rename to mods/skinsdb/meta/character.1547.txt diff --git a/mods/skinsdb/meta/character_1548.txt b/mods/skinsdb/meta/character.1548.txt similarity index 100% rename from mods/skinsdb/meta/character_1548.txt rename to mods/skinsdb/meta/character.1548.txt diff --git a/mods/skinsdb/meta/character_1549.txt b/mods/skinsdb/meta/character.1549.txt similarity index 100% rename from mods/skinsdb/meta/character_1549.txt rename to mods/skinsdb/meta/character.1549.txt diff --git a/mods/skinsdb/meta/character_155.txt b/mods/skinsdb/meta/character.155.txt similarity index 100% rename from mods/skinsdb/meta/character_155.txt rename to mods/skinsdb/meta/character.155.txt diff --git a/mods/skinsdb/meta/character_1550.txt b/mods/skinsdb/meta/character.1550.txt similarity index 100% rename from mods/skinsdb/meta/character_1550.txt rename to mods/skinsdb/meta/character.1550.txt diff --git a/mods/skinsdb/meta/character_1551.txt b/mods/skinsdb/meta/character.1551.txt similarity index 100% rename from mods/skinsdb/meta/character_1551.txt rename to mods/skinsdb/meta/character.1551.txt diff --git a/mods/skinsdb/meta/character_1552.txt b/mods/skinsdb/meta/character.1552.txt similarity index 100% rename from mods/skinsdb/meta/character_1552.txt rename to mods/skinsdb/meta/character.1552.txt diff --git a/mods/skinsdb/meta/character_1553.txt b/mods/skinsdb/meta/character.1553.txt similarity index 100% rename from mods/skinsdb/meta/character_1553.txt rename to mods/skinsdb/meta/character.1553.txt diff --git a/mods/skinsdb/meta/character_1554.txt b/mods/skinsdb/meta/character.1554.txt similarity index 100% rename from mods/skinsdb/meta/character_1554.txt rename to mods/skinsdb/meta/character.1554.txt diff --git a/mods/skinsdb/meta/character_1555.txt b/mods/skinsdb/meta/character.1555.txt similarity index 100% rename from mods/skinsdb/meta/character_1555.txt rename to mods/skinsdb/meta/character.1555.txt diff --git a/mods/skinsdb/meta/character_1556.txt b/mods/skinsdb/meta/character.1556.txt similarity index 100% rename from mods/skinsdb/meta/character_1556.txt rename to mods/skinsdb/meta/character.1556.txt diff --git a/mods/skinsdb/meta/character_1557.txt b/mods/skinsdb/meta/character.1557.txt similarity index 100% rename from mods/skinsdb/meta/character_1557.txt rename to mods/skinsdb/meta/character.1557.txt diff --git a/mods/skinsdb/meta/character_1558.txt b/mods/skinsdb/meta/character.1558.txt similarity index 100% rename from mods/skinsdb/meta/character_1558.txt rename to mods/skinsdb/meta/character.1558.txt diff --git a/mods/skinsdb/meta/character_1559.txt b/mods/skinsdb/meta/character.1559.txt similarity index 100% rename from mods/skinsdb/meta/character_1559.txt rename to mods/skinsdb/meta/character.1559.txt diff --git a/mods/skinsdb/meta/character_156.txt b/mods/skinsdb/meta/character.156.txt similarity index 100% rename from mods/skinsdb/meta/character_156.txt rename to mods/skinsdb/meta/character.156.txt diff --git a/mods/skinsdb/meta/character_1560.txt b/mods/skinsdb/meta/character.1560.txt similarity index 100% rename from mods/skinsdb/meta/character_1560.txt rename to mods/skinsdb/meta/character.1560.txt diff --git a/mods/skinsdb/meta/character_1561.txt b/mods/skinsdb/meta/character.1561.txt similarity index 100% rename from mods/skinsdb/meta/character_1561.txt rename to mods/skinsdb/meta/character.1561.txt diff --git a/mods/skinsdb/meta/character_1562.txt b/mods/skinsdb/meta/character.1562.txt similarity index 100% rename from mods/skinsdb/meta/character_1562.txt rename to mods/skinsdb/meta/character.1562.txt diff --git a/mods/skinsdb/meta/character_1563.txt b/mods/skinsdb/meta/character.1563.txt similarity index 100% rename from mods/skinsdb/meta/character_1563.txt rename to mods/skinsdb/meta/character.1563.txt diff --git a/mods/skinsdb/meta/character_1564.txt b/mods/skinsdb/meta/character.1564.txt similarity index 100% rename from mods/skinsdb/meta/character_1564.txt rename to mods/skinsdb/meta/character.1564.txt diff --git a/mods/skinsdb/meta/character_1565.txt b/mods/skinsdb/meta/character.1565.txt similarity index 100% rename from mods/skinsdb/meta/character_1565.txt rename to mods/skinsdb/meta/character.1565.txt diff --git a/mods/skinsdb/meta/character_1566.txt b/mods/skinsdb/meta/character.1566.txt similarity index 100% rename from mods/skinsdb/meta/character_1566.txt rename to mods/skinsdb/meta/character.1566.txt diff --git a/mods/skinsdb/meta/character_1567.txt b/mods/skinsdb/meta/character.1567.txt similarity index 100% rename from mods/skinsdb/meta/character_1567.txt rename to mods/skinsdb/meta/character.1567.txt diff --git a/mods/skinsdb/meta/character_1568.txt b/mods/skinsdb/meta/character.1568.txt similarity index 100% rename from mods/skinsdb/meta/character_1568.txt rename to mods/skinsdb/meta/character.1568.txt diff --git a/mods/skinsdb/meta/character_1569.txt b/mods/skinsdb/meta/character.1569.txt similarity index 100% rename from mods/skinsdb/meta/character_1569.txt rename to mods/skinsdb/meta/character.1569.txt diff --git a/mods/skinsdb/meta/character_157.txt b/mods/skinsdb/meta/character.157.txt similarity index 100% rename from mods/skinsdb/meta/character_157.txt rename to mods/skinsdb/meta/character.157.txt diff --git a/mods/skinsdb/meta/character_1570.txt b/mods/skinsdb/meta/character.1570.txt similarity index 100% rename from mods/skinsdb/meta/character_1570.txt rename to mods/skinsdb/meta/character.1570.txt diff --git a/mods/skinsdb/meta/character_1571.txt b/mods/skinsdb/meta/character.1571.txt similarity index 100% rename from mods/skinsdb/meta/character_1571.txt rename to mods/skinsdb/meta/character.1571.txt diff --git a/mods/skinsdb/meta/character_1572.txt b/mods/skinsdb/meta/character.1572.txt similarity index 100% rename from mods/skinsdb/meta/character_1572.txt rename to mods/skinsdb/meta/character.1572.txt diff --git a/mods/skinsdb/meta/character_1573.txt b/mods/skinsdb/meta/character.1573.txt similarity index 100% rename from mods/skinsdb/meta/character_1573.txt rename to mods/skinsdb/meta/character.1573.txt diff --git a/mods/skinsdb/meta/character_1574.txt b/mods/skinsdb/meta/character.1574.txt similarity index 100% rename from mods/skinsdb/meta/character_1574.txt rename to mods/skinsdb/meta/character.1574.txt diff --git a/mods/skinsdb/meta/character_1575.txt b/mods/skinsdb/meta/character.1575.txt similarity index 100% rename from mods/skinsdb/meta/character_1575.txt rename to mods/skinsdb/meta/character.1575.txt diff --git a/mods/skinsdb/meta/character_1576.txt b/mods/skinsdb/meta/character.1576.txt similarity index 100% rename from mods/skinsdb/meta/character_1576.txt rename to mods/skinsdb/meta/character.1576.txt diff --git a/mods/skinsdb/meta/character_1577.txt b/mods/skinsdb/meta/character.1577.txt similarity index 100% rename from mods/skinsdb/meta/character_1577.txt rename to mods/skinsdb/meta/character.1577.txt diff --git a/mods/skinsdb/meta/character_1578.txt b/mods/skinsdb/meta/character.1578.txt similarity index 100% rename from mods/skinsdb/meta/character_1578.txt rename to mods/skinsdb/meta/character.1578.txt diff --git a/mods/skinsdb/meta/character_1579.txt b/mods/skinsdb/meta/character.1579.txt similarity index 100% rename from mods/skinsdb/meta/character_1579.txt rename to mods/skinsdb/meta/character.1579.txt diff --git a/mods/skinsdb/meta/character_158.txt b/mods/skinsdb/meta/character.158.txt similarity index 100% rename from mods/skinsdb/meta/character_158.txt rename to mods/skinsdb/meta/character.158.txt diff --git a/mods/skinsdb/meta/character_1580.txt b/mods/skinsdb/meta/character.1580.txt similarity index 100% rename from mods/skinsdb/meta/character_1580.txt rename to mods/skinsdb/meta/character.1580.txt diff --git a/mods/skinsdb/meta/character_1581.txt b/mods/skinsdb/meta/character.1581.txt similarity index 100% rename from mods/skinsdb/meta/character_1581.txt rename to mods/skinsdb/meta/character.1581.txt diff --git a/mods/skinsdb/meta/character_1582.txt b/mods/skinsdb/meta/character.1582.txt similarity index 100% rename from mods/skinsdb/meta/character_1582.txt rename to mods/skinsdb/meta/character.1582.txt diff --git a/mods/skinsdb/meta/character_1583.txt b/mods/skinsdb/meta/character.1583.txt similarity index 100% rename from mods/skinsdb/meta/character_1583.txt rename to mods/skinsdb/meta/character.1583.txt diff --git a/mods/skinsdb/meta/character_1584.txt b/mods/skinsdb/meta/character.1584.txt similarity index 100% rename from mods/skinsdb/meta/character_1584.txt rename to mods/skinsdb/meta/character.1584.txt diff --git a/mods/skinsdb/meta/character_1585.txt b/mods/skinsdb/meta/character.1585.txt similarity index 100% rename from mods/skinsdb/meta/character_1585.txt rename to mods/skinsdb/meta/character.1585.txt diff --git a/mods/skinsdb/meta/character_1586.txt b/mods/skinsdb/meta/character.1586.txt similarity index 100% rename from mods/skinsdb/meta/character_1586.txt rename to mods/skinsdb/meta/character.1586.txt diff --git a/mods/skinsdb/meta/character_1587.txt b/mods/skinsdb/meta/character.1587.txt similarity index 100% rename from mods/skinsdb/meta/character_1587.txt rename to mods/skinsdb/meta/character.1587.txt diff --git a/mods/skinsdb/meta/character_1588.txt b/mods/skinsdb/meta/character.1588.txt similarity index 100% rename from mods/skinsdb/meta/character_1588.txt rename to mods/skinsdb/meta/character.1588.txt diff --git a/mods/skinsdb/meta/character_1589.txt b/mods/skinsdb/meta/character.1589.txt similarity index 100% rename from mods/skinsdb/meta/character_1589.txt rename to mods/skinsdb/meta/character.1589.txt diff --git a/mods/skinsdb/meta/character_159.txt b/mods/skinsdb/meta/character.159.txt similarity index 100% rename from mods/skinsdb/meta/character_159.txt rename to mods/skinsdb/meta/character.159.txt diff --git a/mods/skinsdb/meta/character_1590.txt b/mods/skinsdb/meta/character.1590.txt similarity index 100% rename from mods/skinsdb/meta/character_1590.txt rename to mods/skinsdb/meta/character.1590.txt diff --git a/mods/skinsdb/meta/character_1591.txt b/mods/skinsdb/meta/character.1591.txt similarity index 100% rename from mods/skinsdb/meta/character_1591.txt rename to mods/skinsdb/meta/character.1591.txt diff --git a/mods/skinsdb/meta/character_1592.txt b/mods/skinsdb/meta/character.1592.txt similarity index 100% rename from mods/skinsdb/meta/character_1592.txt rename to mods/skinsdb/meta/character.1592.txt diff --git a/mods/skinsdb/meta/character_1593.txt b/mods/skinsdb/meta/character.1593.txt similarity index 100% rename from mods/skinsdb/meta/character_1593.txt rename to mods/skinsdb/meta/character.1593.txt diff --git a/mods/skinsdb/meta/character_1594.txt b/mods/skinsdb/meta/character.1594.txt similarity index 100% rename from mods/skinsdb/meta/character_1594.txt rename to mods/skinsdb/meta/character.1594.txt diff --git a/mods/skinsdb/meta/character_1595.txt b/mods/skinsdb/meta/character.1595.txt similarity index 100% rename from mods/skinsdb/meta/character_1595.txt rename to mods/skinsdb/meta/character.1595.txt diff --git a/mods/skinsdb/meta/character_1596.txt b/mods/skinsdb/meta/character.1596.txt similarity index 100% rename from mods/skinsdb/meta/character_1596.txt rename to mods/skinsdb/meta/character.1596.txt diff --git a/mods/skinsdb/meta/character_1597.txt b/mods/skinsdb/meta/character.1597.txt similarity index 100% rename from mods/skinsdb/meta/character_1597.txt rename to mods/skinsdb/meta/character.1597.txt diff --git a/mods/skinsdb/meta/character_1598.txt b/mods/skinsdb/meta/character.1598.txt similarity index 100% rename from mods/skinsdb/meta/character_1598.txt rename to mods/skinsdb/meta/character.1598.txt diff --git a/mods/skinsdb/meta/character_1599.txt b/mods/skinsdb/meta/character.1599.txt similarity index 100% rename from mods/skinsdb/meta/character_1599.txt rename to mods/skinsdb/meta/character.1599.txt diff --git a/mods/skinsdb/meta/character_160.txt b/mods/skinsdb/meta/character.160.txt similarity index 100% rename from mods/skinsdb/meta/character_160.txt rename to mods/skinsdb/meta/character.160.txt diff --git a/mods/skinsdb/meta/character_1600.txt b/mods/skinsdb/meta/character.1600.txt similarity index 100% rename from mods/skinsdb/meta/character_1600.txt rename to mods/skinsdb/meta/character.1600.txt diff --git a/mods/skinsdb/meta/character_1601.txt b/mods/skinsdb/meta/character.1601.txt similarity index 100% rename from mods/skinsdb/meta/character_1601.txt rename to mods/skinsdb/meta/character.1601.txt diff --git a/mods/skinsdb/meta/character_1602.txt b/mods/skinsdb/meta/character.1602.txt similarity index 100% rename from mods/skinsdb/meta/character_1602.txt rename to mods/skinsdb/meta/character.1602.txt diff --git a/mods/skinsdb/meta/character_1603.txt b/mods/skinsdb/meta/character.1603.txt similarity index 100% rename from mods/skinsdb/meta/character_1603.txt rename to mods/skinsdb/meta/character.1603.txt diff --git a/mods/skinsdb/meta/character_1604.txt b/mods/skinsdb/meta/character.1604.txt similarity index 100% rename from mods/skinsdb/meta/character_1604.txt rename to mods/skinsdb/meta/character.1604.txt diff --git a/mods/skinsdb/meta/character_1605.txt b/mods/skinsdb/meta/character.1605.txt similarity index 100% rename from mods/skinsdb/meta/character_1605.txt rename to mods/skinsdb/meta/character.1605.txt diff --git a/mods/skinsdb/meta/character_1606.txt b/mods/skinsdb/meta/character.1606.txt similarity index 100% rename from mods/skinsdb/meta/character_1606.txt rename to mods/skinsdb/meta/character.1606.txt diff --git a/mods/skinsdb/meta/character_1607.txt b/mods/skinsdb/meta/character.1607.txt similarity index 100% rename from mods/skinsdb/meta/character_1607.txt rename to mods/skinsdb/meta/character.1607.txt diff --git a/mods/skinsdb/meta/character_1608.txt b/mods/skinsdb/meta/character.1608.txt similarity index 100% rename from mods/skinsdb/meta/character_1608.txt rename to mods/skinsdb/meta/character.1608.txt diff --git a/mods/skinsdb/meta/character_1609.txt b/mods/skinsdb/meta/character.1609.txt similarity index 100% rename from mods/skinsdb/meta/character_1609.txt rename to mods/skinsdb/meta/character.1609.txt diff --git a/mods/skinsdb/meta/character_161.txt b/mods/skinsdb/meta/character.161.txt similarity index 100% rename from mods/skinsdb/meta/character_161.txt rename to mods/skinsdb/meta/character.161.txt diff --git a/mods/skinsdb/meta/character_1610.txt b/mods/skinsdb/meta/character.1610.txt similarity index 100% rename from mods/skinsdb/meta/character_1610.txt rename to mods/skinsdb/meta/character.1610.txt diff --git a/mods/skinsdb/meta/character_1611.txt b/mods/skinsdb/meta/character.1611.txt similarity index 100% rename from mods/skinsdb/meta/character_1611.txt rename to mods/skinsdb/meta/character.1611.txt diff --git a/mods/skinsdb/meta/character_1612.txt b/mods/skinsdb/meta/character.1612.txt similarity index 100% rename from mods/skinsdb/meta/character_1612.txt rename to mods/skinsdb/meta/character.1612.txt diff --git a/mods/skinsdb/meta/character_1613.txt b/mods/skinsdb/meta/character.1613.txt similarity index 100% rename from mods/skinsdb/meta/character_1613.txt rename to mods/skinsdb/meta/character.1613.txt diff --git a/mods/skinsdb/meta/character_1614.txt b/mods/skinsdb/meta/character.1614.txt similarity index 100% rename from mods/skinsdb/meta/character_1614.txt rename to mods/skinsdb/meta/character.1614.txt diff --git a/mods/skinsdb/meta/character_1615.txt b/mods/skinsdb/meta/character.1615.txt similarity index 100% rename from mods/skinsdb/meta/character_1615.txt rename to mods/skinsdb/meta/character.1615.txt diff --git a/mods/skinsdb/meta/character_1616.txt b/mods/skinsdb/meta/character.1616.txt similarity index 100% rename from mods/skinsdb/meta/character_1616.txt rename to mods/skinsdb/meta/character.1616.txt diff --git a/mods/skinsdb/meta/character_1617.txt b/mods/skinsdb/meta/character.1617.txt similarity index 100% rename from mods/skinsdb/meta/character_1617.txt rename to mods/skinsdb/meta/character.1617.txt diff --git a/mods/skinsdb/meta/character_1618.txt b/mods/skinsdb/meta/character.1618.txt similarity index 100% rename from mods/skinsdb/meta/character_1618.txt rename to mods/skinsdb/meta/character.1618.txt diff --git a/mods/skinsdb/meta/character_1619.txt b/mods/skinsdb/meta/character.1619.txt similarity index 100% rename from mods/skinsdb/meta/character_1619.txt rename to mods/skinsdb/meta/character.1619.txt diff --git a/mods/skinsdb/meta/character_162.txt b/mods/skinsdb/meta/character.162.txt similarity index 100% rename from mods/skinsdb/meta/character_162.txt rename to mods/skinsdb/meta/character.162.txt diff --git a/mods/skinsdb/meta/character_1620.txt b/mods/skinsdb/meta/character.1620.txt similarity index 100% rename from mods/skinsdb/meta/character_1620.txt rename to mods/skinsdb/meta/character.1620.txt diff --git a/mods/skinsdb/meta/character_1621.txt b/mods/skinsdb/meta/character.1621.txt similarity index 100% rename from mods/skinsdb/meta/character_1621.txt rename to mods/skinsdb/meta/character.1621.txt diff --git a/mods/skinsdb/meta/character_1622.txt b/mods/skinsdb/meta/character.1622.txt similarity index 100% rename from mods/skinsdb/meta/character_1622.txt rename to mods/skinsdb/meta/character.1622.txt diff --git a/mods/skinsdb/meta/character_1623.txt b/mods/skinsdb/meta/character.1623.txt similarity index 100% rename from mods/skinsdb/meta/character_1623.txt rename to mods/skinsdb/meta/character.1623.txt diff --git a/mods/skinsdb/meta/character_1624.txt b/mods/skinsdb/meta/character.1624.txt similarity index 100% rename from mods/skinsdb/meta/character_1624.txt rename to mods/skinsdb/meta/character.1624.txt diff --git a/mods/skinsdb/meta/character_1625.txt b/mods/skinsdb/meta/character.1625.txt similarity index 100% rename from mods/skinsdb/meta/character_1625.txt rename to mods/skinsdb/meta/character.1625.txt diff --git a/mods/skinsdb/meta/character_1626.txt b/mods/skinsdb/meta/character.1626.txt similarity index 100% rename from mods/skinsdb/meta/character_1626.txt rename to mods/skinsdb/meta/character.1626.txt diff --git a/mods/skinsdb/meta/character_1627.txt b/mods/skinsdb/meta/character.1627.txt similarity index 100% rename from mods/skinsdb/meta/character_1627.txt rename to mods/skinsdb/meta/character.1627.txt diff --git a/mods/skinsdb/meta/character_1628.txt b/mods/skinsdb/meta/character.1628.txt similarity index 100% rename from mods/skinsdb/meta/character_1628.txt rename to mods/skinsdb/meta/character.1628.txt diff --git a/mods/skinsdb/meta/character_1629.txt b/mods/skinsdb/meta/character.1629.txt similarity index 100% rename from mods/skinsdb/meta/character_1629.txt rename to mods/skinsdb/meta/character.1629.txt diff --git a/mods/skinsdb/meta/character_163.txt b/mods/skinsdb/meta/character.163.txt similarity index 63% rename from mods/skinsdb/meta/character_163.txt rename to mods/skinsdb/meta/character.163.txt index f8cc58a9..238cb399 100644 --- a/mods/skinsdb/meta/character_163.txt +++ b/mods/skinsdb/meta/character.163.txt @@ -1,3 +1,3 @@ -4°district +4°district Ferdi Napoli CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_1630.txt b/mods/skinsdb/meta/character.1630.txt similarity index 100% rename from mods/skinsdb/meta/character_1630.txt rename to mods/skinsdb/meta/character.1630.txt diff --git a/mods/skinsdb/meta/character_1631.txt b/mods/skinsdb/meta/character.1631.txt similarity index 100% rename from mods/skinsdb/meta/character_1631.txt rename to mods/skinsdb/meta/character.1631.txt diff --git a/mods/skinsdb/meta/character_1632.txt b/mods/skinsdb/meta/character.1632.txt similarity index 100% rename from mods/skinsdb/meta/character_1632.txt rename to mods/skinsdb/meta/character.1632.txt diff --git a/mods/skinsdb/meta/character_1633.txt b/mods/skinsdb/meta/character.1633.txt similarity index 100% rename from mods/skinsdb/meta/character_1633.txt rename to mods/skinsdb/meta/character.1633.txt diff --git a/mods/skinsdb/meta/character_1634.txt b/mods/skinsdb/meta/character.1634.txt similarity index 100% rename from mods/skinsdb/meta/character_1634.txt rename to mods/skinsdb/meta/character.1634.txt diff --git a/mods/skinsdb/meta/character_1635.txt b/mods/skinsdb/meta/character.1635.txt similarity index 100% rename from mods/skinsdb/meta/character_1635.txt rename to mods/skinsdb/meta/character.1635.txt diff --git a/mods/skinsdb/meta/character_1636.txt b/mods/skinsdb/meta/character.1636.txt similarity index 100% rename from mods/skinsdb/meta/character_1636.txt rename to mods/skinsdb/meta/character.1636.txt diff --git a/mods/skinsdb/meta/character_1637.txt b/mods/skinsdb/meta/character.1637.txt similarity index 100% rename from mods/skinsdb/meta/character_1637.txt rename to mods/skinsdb/meta/character.1637.txt diff --git a/mods/skinsdb/meta/character_1638.txt b/mods/skinsdb/meta/character.1638.txt similarity index 100% rename from mods/skinsdb/meta/character_1638.txt rename to mods/skinsdb/meta/character.1638.txt diff --git a/mods/skinsdb/meta/character_1639.txt b/mods/skinsdb/meta/character.1639.txt similarity index 100% rename from mods/skinsdb/meta/character_1639.txt rename to mods/skinsdb/meta/character.1639.txt diff --git a/mods/skinsdb/meta/character_164.txt b/mods/skinsdb/meta/character.164.txt similarity index 100% rename from mods/skinsdb/meta/character_164.txt rename to mods/skinsdb/meta/character.164.txt diff --git a/mods/skinsdb/meta/character_1640.txt b/mods/skinsdb/meta/character.1640.txt similarity index 100% rename from mods/skinsdb/meta/character_1640.txt rename to mods/skinsdb/meta/character.1640.txt diff --git a/mods/skinsdb/meta/character_1641.txt b/mods/skinsdb/meta/character.1641.txt similarity index 100% rename from mods/skinsdb/meta/character_1641.txt rename to mods/skinsdb/meta/character.1641.txt diff --git a/mods/skinsdb/meta/character_1642.txt b/mods/skinsdb/meta/character.1642.txt similarity index 100% rename from mods/skinsdb/meta/character_1642.txt rename to mods/skinsdb/meta/character.1642.txt diff --git a/mods/skinsdb/meta/character_1643.txt b/mods/skinsdb/meta/character.1643.txt similarity index 100% rename from mods/skinsdb/meta/character_1643.txt rename to mods/skinsdb/meta/character.1643.txt diff --git a/mods/skinsdb/meta/character_1644.txt b/mods/skinsdb/meta/character.1644.txt similarity index 100% rename from mods/skinsdb/meta/character_1644.txt rename to mods/skinsdb/meta/character.1644.txt diff --git a/mods/skinsdb/meta/character_1645.txt b/mods/skinsdb/meta/character.1645.txt similarity index 100% rename from mods/skinsdb/meta/character_1645.txt rename to mods/skinsdb/meta/character.1645.txt diff --git a/mods/skinsdb/meta/character_1646.txt b/mods/skinsdb/meta/character.1646.txt similarity index 100% rename from mods/skinsdb/meta/character_1646.txt rename to mods/skinsdb/meta/character.1646.txt diff --git a/mods/skinsdb/meta/character_1647.txt b/mods/skinsdb/meta/character.1647.txt similarity index 100% rename from mods/skinsdb/meta/character_1647.txt rename to mods/skinsdb/meta/character.1647.txt diff --git a/mods/skinsdb/meta/character_1648.txt b/mods/skinsdb/meta/character.1648.txt similarity index 100% rename from mods/skinsdb/meta/character_1648.txt rename to mods/skinsdb/meta/character.1648.txt diff --git a/mods/skinsdb/meta/character_1649.txt b/mods/skinsdb/meta/character.1649.txt similarity index 100% rename from mods/skinsdb/meta/character_1649.txt rename to mods/skinsdb/meta/character.1649.txt diff --git a/mods/skinsdb/meta/character_165.txt b/mods/skinsdb/meta/character.165.txt similarity index 100% rename from mods/skinsdb/meta/character_165.txt rename to mods/skinsdb/meta/character.165.txt diff --git a/mods/skinsdb/meta/character_1650.txt b/mods/skinsdb/meta/character.1650.txt similarity index 100% rename from mods/skinsdb/meta/character_1650.txt rename to mods/skinsdb/meta/character.1650.txt diff --git a/mods/skinsdb/meta/character_1651.txt b/mods/skinsdb/meta/character.1651.txt similarity index 100% rename from mods/skinsdb/meta/character_1651.txt rename to mods/skinsdb/meta/character.1651.txt diff --git a/mods/skinsdb/meta/character_1652.txt b/mods/skinsdb/meta/character.1652.txt similarity index 100% rename from mods/skinsdb/meta/character_1652.txt rename to mods/skinsdb/meta/character.1652.txt diff --git a/mods/skinsdb/meta/character_1653.txt b/mods/skinsdb/meta/character.1653.txt similarity index 100% rename from mods/skinsdb/meta/character_1653.txt rename to mods/skinsdb/meta/character.1653.txt diff --git a/mods/skinsdb/meta/character_1654.txt b/mods/skinsdb/meta/character.1654.txt similarity index 100% rename from mods/skinsdb/meta/character_1654.txt rename to mods/skinsdb/meta/character.1654.txt diff --git a/mods/skinsdb/meta/character_1655.txt b/mods/skinsdb/meta/character.1655.txt similarity index 100% rename from mods/skinsdb/meta/character_1655.txt rename to mods/skinsdb/meta/character.1655.txt diff --git a/mods/skinsdb/meta/character_1656.txt b/mods/skinsdb/meta/character.1656.txt similarity index 100% rename from mods/skinsdb/meta/character_1656.txt rename to mods/skinsdb/meta/character.1656.txt diff --git a/mods/skinsdb/meta/character_1657.txt b/mods/skinsdb/meta/character.1657.txt similarity index 100% rename from mods/skinsdb/meta/character_1657.txt rename to mods/skinsdb/meta/character.1657.txt diff --git a/mods/skinsdb/meta/character_1658.txt b/mods/skinsdb/meta/character.1658.txt similarity index 100% rename from mods/skinsdb/meta/character_1658.txt rename to mods/skinsdb/meta/character.1658.txt diff --git a/mods/skinsdb/meta/character_1659.txt b/mods/skinsdb/meta/character.1659.txt similarity index 100% rename from mods/skinsdb/meta/character_1659.txt rename to mods/skinsdb/meta/character.1659.txt diff --git a/mods/skinsdb/meta/character_166.txt b/mods/skinsdb/meta/character.166.txt similarity index 100% rename from mods/skinsdb/meta/character_166.txt rename to mods/skinsdb/meta/character.166.txt diff --git a/mods/skinsdb/meta/character_1660.txt b/mods/skinsdb/meta/character.1660.txt similarity index 100% rename from mods/skinsdb/meta/character_1660.txt rename to mods/skinsdb/meta/character.1660.txt diff --git a/mods/skinsdb/meta/character_1661.txt b/mods/skinsdb/meta/character.1661.txt similarity index 100% rename from mods/skinsdb/meta/character_1661.txt rename to mods/skinsdb/meta/character.1661.txt diff --git a/mods/skinsdb/meta/character_1662.txt b/mods/skinsdb/meta/character.1662.txt similarity index 100% rename from mods/skinsdb/meta/character_1662.txt rename to mods/skinsdb/meta/character.1662.txt diff --git a/mods/skinsdb/meta/character_1663.txt b/mods/skinsdb/meta/character.1663.txt similarity index 100% rename from mods/skinsdb/meta/character_1663.txt rename to mods/skinsdb/meta/character.1663.txt diff --git a/mods/skinsdb/meta/character_1664.txt b/mods/skinsdb/meta/character.1664.txt similarity index 100% rename from mods/skinsdb/meta/character_1664.txt rename to mods/skinsdb/meta/character.1664.txt diff --git a/mods/skinsdb/meta/character_1665.txt b/mods/skinsdb/meta/character.1665.txt similarity index 100% rename from mods/skinsdb/meta/character_1665.txt rename to mods/skinsdb/meta/character.1665.txt diff --git a/mods/skinsdb/meta/character_1666.txt b/mods/skinsdb/meta/character.1666.txt similarity index 100% rename from mods/skinsdb/meta/character_1666.txt rename to mods/skinsdb/meta/character.1666.txt diff --git a/mods/skinsdb/meta/character_1667.txt b/mods/skinsdb/meta/character.1667.txt similarity index 100% rename from mods/skinsdb/meta/character_1667.txt rename to mods/skinsdb/meta/character.1667.txt diff --git a/mods/skinsdb/meta/character_1668.txt b/mods/skinsdb/meta/character.1668.txt similarity index 100% rename from mods/skinsdb/meta/character_1668.txt rename to mods/skinsdb/meta/character.1668.txt diff --git a/mods/skinsdb/meta/character_1669.txt b/mods/skinsdb/meta/character.1669.txt similarity index 100% rename from mods/skinsdb/meta/character_1669.txt rename to mods/skinsdb/meta/character.1669.txt diff --git a/mods/skinsdb/meta/character_167.txt b/mods/skinsdb/meta/character.167.txt similarity index 100% rename from mods/skinsdb/meta/character_167.txt rename to mods/skinsdb/meta/character.167.txt diff --git a/mods/skinsdb/meta/character_1670.txt b/mods/skinsdb/meta/character.1670.txt similarity index 100% rename from mods/skinsdb/meta/character_1670.txt rename to mods/skinsdb/meta/character.1670.txt diff --git a/mods/skinsdb/meta/character_1671.txt b/mods/skinsdb/meta/character.1671.txt similarity index 100% rename from mods/skinsdb/meta/character_1671.txt rename to mods/skinsdb/meta/character.1671.txt diff --git a/mods/skinsdb/meta/character_1672.txt b/mods/skinsdb/meta/character.1672.txt similarity index 100% rename from mods/skinsdb/meta/character_1672.txt rename to mods/skinsdb/meta/character.1672.txt diff --git a/mods/skinsdb/meta/character_1673.txt b/mods/skinsdb/meta/character.1673.txt similarity index 100% rename from mods/skinsdb/meta/character_1673.txt rename to mods/skinsdb/meta/character.1673.txt diff --git a/mods/skinsdb/meta/character_1674.txt b/mods/skinsdb/meta/character.1674.txt similarity index 100% rename from mods/skinsdb/meta/character_1674.txt rename to mods/skinsdb/meta/character.1674.txt diff --git a/mods/skinsdb/meta/character_1675.txt b/mods/skinsdb/meta/character.1675.txt similarity index 100% rename from mods/skinsdb/meta/character_1675.txt rename to mods/skinsdb/meta/character.1675.txt diff --git a/mods/skinsdb/meta/character_1676.txt b/mods/skinsdb/meta/character.1676.txt similarity index 100% rename from mods/skinsdb/meta/character_1676.txt rename to mods/skinsdb/meta/character.1676.txt diff --git a/mods/skinsdb/meta/character_1677.txt b/mods/skinsdb/meta/character.1677.txt similarity index 100% rename from mods/skinsdb/meta/character_1677.txt rename to mods/skinsdb/meta/character.1677.txt diff --git a/mods/skinsdb/meta/character_1678.txt b/mods/skinsdb/meta/character.1678.txt similarity index 100% rename from mods/skinsdb/meta/character_1678.txt rename to mods/skinsdb/meta/character.1678.txt diff --git a/mods/skinsdb/meta/character_1679.txt b/mods/skinsdb/meta/character.1679.txt similarity index 100% rename from mods/skinsdb/meta/character_1679.txt rename to mods/skinsdb/meta/character.1679.txt diff --git a/mods/skinsdb/meta/character_168.txt b/mods/skinsdb/meta/character.168.txt similarity index 100% rename from mods/skinsdb/meta/character_168.txt rename to mods/skinsdb/meta/character.168.txt diff --git a/mods/skinsdb/meta/character_1680.txt b/mods/skinsdb/meta/character.1680.txt similarity index 100% rename from mods/skinsdb/meta/character_1680.txt rename to mods/skinsdb/meta/character.1680.txt diff --git a/mods/skinsdb/meta/character_1681.txt b/mods/skinsdb/meta/character.1681.txt similarity index 100% rename from mods/skinsdb/meta/character_1681.txt rename to mods/skinsdb/meta/character.1681.txt diff --git a/mods/skinsdb/meta/character_1682.txt b/mods/skinsdb/meta/character.1682.txt similarity index 100% rename from mods/skinsdb/meta/character_1682.txt rename to mods/skinsdb/meta/character.1682.txt diff --git a/mods/skinsdb/meta/character_1683.txt b/mods/skinsdb/meta/character.1683.txt similarity index 100% rename from mods/skinsdb/meta/character_1683.txt rename to mods/skinsdb/meta/character.1683.txt diff --git a/mods/skinsdb/meta/character_1684.txt b/mods/skinsdb/meta/character.1684.txt similarity index 100% rename from mods/skinsdb/meta/character_1684.txt rename to mods/skinsdb/meta/character.1684.txt diff --git a/mods/skinsdb/meta/character_1685.txt b/mods/skinsdb/meta/character.1685.txt similarity index 100% rename from mods/skinsdb/meta/character_1685.txt rename to mods/skinsdb/meta/character.1685.txt diff --git a/mods/skinsdb/meta/character_1686.txt b/mods/skinsdb/meta/character.1686.txt similarity index 100% rename from mods/skinsdb/meta/character_1686.txt rename to mods/skinsdb/meta/character.1686.txt diff --git a/mods/skinsdb/meta/character_1687.txt b/mods/skinsdb/meta/character.1687.txt similarity index 100% rename from mods/skinsdb/meta/character_1687.txt rename to mods/skinsdb/meta/character.1687.txt diff --git a/mods/skinsdb/meta/character_1688.txt b/mods/skinsdb/meta/character.1688.txt similarity index 100% rename from mods/skinsdb/meta/character_1688.txt rename to mods/skinsdb/meta/character.1688.txt diff --git a/mods/skinsdb/meta/character_1689.txt b/mods/skinsdb/meta/character.1689.txt similarity index 100% rename from mods/skinsdb/meta/character_1689.txt rename to mods/skinsdb/meta/character.1689.txt diff --git a/mods/skinsdb/meta/character_169.txt b/mods/skinsdb/meta/character.169.txt similarity index 100% rename from mods/skinsdb/meta/character_169.txt rename to mods/skinsdb/meta/character.169.txt diff --git a/mods/skinsdb/meta/character_1690.txt b/mods/skinsdb/meta/character.1690.txt similarity index 100% rename from mods/skinsdb/meta/character_1690.txt rename to mods/skinsdb/meta/character.1690.txt diff --git a/mods/skinsdb/meta/character_1691.txt b/mods/skinsdb/meta/character.1691.txt similarity index 100% rename from mods/skinsdb/meta/character_1691.txt rename to mods/skinsdb/meta/character.1691.txt diff --git a/mods/skinsdb/meta/character_1692.txt b/mods/skinsdb/meta/character.1692.txt similarity index 100% rename from mods/skinsdb/meta/character_1692.txt rename to mods/skinsdb/meta/character.1692.txt diff --git a/mods/skinsdb/meta/character_1693.txt b/mods/skinsdb/meta/character.1693.txt similarity index 100% rename from mods/skinsdb/meta/character_1693.txt rename to mods/skinsdb/meta/character.1693.txt diff --git a/mods/skinsdb/meta/character_1694.txt b/mods/skinsdb/meta/character.1694.txt similarity index 100% rename from mods/skinsdb/meta/character_1694.txt rename to mods/skinsdb/meta/character.1694.txt diff --git a/mods/skinsdb/meta/character_1695.txt b/mods/skinsdb/meta/character.1695.txt similarity index 100% rename from mods/skinsdb/meta/character_1695.txt rename to mods/skinsdb/meta/character.1695.txt diff --git a/mods/skinsdb/meta/character_1696.txt b/mods/skinsdb/meta/character.1696.txt similarity index 100% rename from mods/skinsdb/meta/character_1696.txt rename to mods/skinsdb/meta/character.1696.txt diff --git a/mods/skinsdb/meta/character_1697.txt b/mods/skinsdb/meta/character.1697.txt similarity index 100% rename from mods/skinsdb/meta/character_1697.txt rename to mods/skinsdb/meta/character.1697.txt diff --git a/mods/skinsdb/meta/character_1698.txt b/mods/skinsdb/meta/character.1698.txt similarity index 100% rename from mods/skinsdb/meta/character_1698.txt rename to mods/skinsdb/meta/character.1698.txt diff --git a/mods/skinsdb/meta/character_1699.txt b/mods/skinsdb/meta/character.1699.txt similarity index 100% rename from mods/skinsdb/meta/character_1699.txt rename to mods/skinsdb/meta/character.1699.txt diff --git a/mods/skinsdb/meta/character_170.txt b/mods/skinsdb/meta/character.170.txt similarity index 100% rename from mods/skinsdb/meta/character_170.txt rename to mods/skinsdb/meta/character.170.txt diff --git a/mods/skinsdb/meta/character_1700.txt b/mods/skinsdb/meta/character.1700.txt similarity index 100% rename from mods/skinsdb/meta/character_1700.txt rename to mods/skinsdb/meta/character.1700.txt diff --git a/mods/skinsdb/meta/character_1701.txt b/mods/skinsdb/meta/character.1701.txt similarity index 100% rename from mods/skinsdb/meta/character_1701.txt rename to mods/skinsdb/meta/character.1701.txt diff --git a/mods/skinsdb/meta/character_1702.txt b/mods/skinsdb/meta/character.1702.txt similarity index 100% rename from mods/skinsdb/meta/character_1702.txt rename to mods/skinsdb/meta/character.1702.txt diff --git a/mods/skinsdb/meta/character_1703.txt b/mods/skinsdb/meta/character.1703.txt similarity index 100% rename from mods/skinsdb/meta/character_1703.txt rename to mods/skinsdb/meta/character.1703.txt diff --git a/mods/skinsdb/meta/character_1704.txt b/mods/skinsdb/meta/character.1704.txt similarity index 100% rename from mods/skinsdb/meta/character_1704.txt rename to mods/skinsdb/meta/character.1704.txt diff --git a/mods/skinsdb/meta/character_1705.txt b/mods/skinsdb/meta/character.1705.txt similarity index 100% rename from mods/skinsdb/meta/character_1705.txt rename to mods/skinsdb/meta/character.1705.txt diff --git a/mods/skinsdb/meta/character_1706.txt b/mods/skinsdb/meta/character.1706.txt similarity index 100% rename from mods/skinsdb/meta/character_1706.txt rename to mods/skinsdb/meta/character.1706.txt diff --git a/mods/skinsdb/meta/character_1707.txt b/mods/skinsdb/meta/character.1707.txt similarity index 100% rename from mods/skinsdb/meta/character_1707.txt rename to mods/skinsdb/meta/character.1707.txt diff --git a/mods/skinsdb/meta/character_1708.txt b/mods/skinsdb/meta/character.1708.txt similarity index 100% rename from mods/skinsdb/meta/character_1708.txt rename to mods/skinsdb/meta/character.1708.txt diff --git a/mods/skinsdb/meta/character_1709.txt b/mods/skinsdb/meta/character.1709.txt similarity index 100% rename from mods/skinsdb/meta/character_1709.txt rename to mods/skinsdb/meta/character.1709.txt diff --git a/mods/skinsdb/meta/character_171.txt b/mods/skinsdb/meta/character.171.txt similarity index 100% rename from mods/skinsdb/meta/character_171.txt rename to mods/skinsdb/meta/character.171.txt diff --git a/mods/skinsdb/meta/character_1710.txt b/mods/skinsdb/meta/character.1710.txt similarity index 100% rename from mods/skinsdb/meta/character_1710.txt rename to mods/skinsdb/meta/character.1710.txt diff --git a/mods/skinsdb/meta/character_1711.txt b/mods/skinsdb/meta/character.1711.txt similarity index 100% rename from mods/skinsdb/meta/character_1711.txt rename to mods/skinsdb/meta/character.1711.txt diff --git a/mods/skinsdb/meta/character_1712.txt b/mods/skinsdb/meta/character.1712.txt similarity index 100% rename from mods/skinsdb/meta/character_1712.txt rename to mods/skinsdb/meta/character.1712.txt diff --git a/mods/skinsdb/meta/character_1713.txt b/mods/skinsdb/meta/character.1713.txt similarity index 100% rename from mods/skinsdb/meta/character_1713.txt rename to mods/skinsdb/meta/character.1713.txt diff --git a/mods/skinsdb/meta/character_1714.txt b/mods/skinsdb/meta/character.1714.txt similarity index 100% rename from mods/skinsdb/meta/character_1714.txt rename to mods/skinsdb/meta/character.1714.txt diff --git a/mods/skinsdb/meta/character_1715.txt b/mods/skinsdb/meta/character.1715.txt similarity index 100% rename from mods/skinsdb/meta/character_1715.txt rename to mods/skinsdb/meta/character.1715.txt diff --git a/mods/skinsdb/meta/character_1716.txt b/mods/skinsdb/meta/character.1716.txt similarity index 100% rename from mods/skinsdb/meta/character_1716.txt rename to mods/skinsdb/meta/character.1716.txt diff --git a/mods/skinsdb/meta/character_1717.txt b/mods/skinsdb/meta/character.1717.txt similarity index 100% rename from mods/skinsdb/meta/character_1717.txt rename to mods/skinsdb/meta/character.1717.txt diff --git a/mods/skinsdb/meta/character_1718.txt b/mods/skinsdb/meta/character.1718.txt similarity index 100% rename from mods/skinsdb/meta/character_1718.txt rename to mods/skinsdb/meta/character.1718.txt diff --git a/mods/skinsdb/meta/character_1719.txt b/mods/skinsdb/meta/character.1719.txt similarity index 100% rename from mods/skinsdb/meta/character_1719.txt rename to mods/skinsdb/meta/character.1719.txt diff --git a/mods/skinsdb/meta/character_172.txt b/mods/skinsdb/meta/character.172.txt similarity index 100% rename from mods/skinsdb/meta/character_172.txt rename to mods/skinsdb/meta/character.172.txt diff --git a/mods/skinsdb/meta/character_1720.txt b/mods/skinsdb/meta/character.1720.txt similarity index 100% rename from mods/skinsdb/meta/character_1720.txt rename to mods/skinsdb/meta/character.1720.txt diff --git a/mods/skinsdb/meta/character_1721.txt b/mods/skinsdb/meta/character.1721.txt similarity index 100% rename from mods/skinsdb/meta/character_1721.txt rename to mods/skinsdb/meta/character.1721.txt diff --git a/mods/skinsdb/meta/character_1722.txt b/mods/skinsdb/meta/character.1722.txt similarity index 100% rename from mods/skinsdb/meta/character_1722.txt rename to mods/skinsdb/meta/character.1722.txt diff --git a/mods/skinsdb/meta/character_1723.txt b/mods/skinsdb/meta/character.1723.txt similarity index 100% rename from mods/skinsdb/meta/character_1723.txt rename to mods/skinsdb/meta/character.1723.txt diff --git a/mods/skinsdb/meta/character_1724.txt b/mods/skinsdb/meta/character.1724.txt similarity index 100% rename from mods/skinsdb/meta/character_1724.txt rename to mods/skinsdb/meta/character.1724.txt diff --git a/mods/skinsdb/meta/character_1725.txt b/mods/skinsdb/meta/character.1725.txt similarity index 100% rename from mods/skinsdb/meta/character_1725.txt rename to mods/skinsdb/meta/character.1725.txt diff --git a/mods/skinsdb/meta/character_1726.txt b/mods/skinsdb/meta/character.1726.txt similarity index 100% rename from mods/skinsdb/meta/character_1726.txt rename to mods/skinsdb/meta/character.1726.txt diff --git a/mods/skinsdb/meta/character_1727.txt b/mods/skinsdb/meta/character.1727.txt similarity index 100% rename from mods/skinsdb/meta/character_1727.txt rename to mods/skinsdb/meta/character.1727.txt diff --git a/mods/skinsdb/meta/character_1728.txt b/mods/skinsdb/meta/character.1728.txt similarity index 100% rename from mods/skinsdb/meta/character_1728.txt rename to mods/skinsdb/meta/character.1728.txt diff --git a/mods/skinsdb/meta/character_1729.txt b/mods/skinsdb/meta/character.1729.txt similarity index 100% rename from mods/skinsdb/meta/character_1729.txt rename to mods/skinsdb/meta/character.1729.txt diff --git a/mods/skinsdb/meta/character_173.txt b/mods/skinsdb/meta/character.173.txt similarity index 100% rename from mods/skinsdb/meta/character_173.txt rename to mods/skinsdb/meta/character.173.txt diff --git a/mods/skinsdb/meta/character_1730.txt b/mods/skinsdb/meta/character.1730.txt similarity index 100% rename from mods/skinsdb/meta/character_1730.txt rename to mods/skinsdb/meta/character.1730.txt diff --git a/mods/skinsdb/meta/character_1731.txt b/mods/skinsdb/meta/character.1731.txt similarity index 100% rename from mods/skinsdb/meta/character_1731.txt rename to mods/skinsdb/meta/character.1731.txt diff --git a/mods/skinsdb/meta/character_1732.txt b/mods/skinsdb/meta/character.1732.txt similarity index 100% rename from mods/skinsdb/meta/character_1732.txt rename to mods/skinsdb/meta/character.1732.txt diff --git a/mods/skinsdb/meta/character_1733.txt b/mods/skinsdb/meta/character.1733.txt similarity index 100% rename from mods/skinsdb/meta/character_1733.txt rename to mods/skinsdb/meta/character.1733.txt diff --git a/mods/skinsdb/meta/character_1734.txt b/mods/skinsdb/meta/character.1734.txt similarity index 100% rename from mods/skinsdb/meta/character_1734.txt rename to mods/skinsdb/meta/character.1734.txt diff --git a/mods/skinsdb/meta/character_1735.txt b/mods/skinsdb/meta/character.1735.txt similarity index 100% rename from mods/skinsdb/meta/character_1735.txt rename to mods/skinsdb/meta/character.1735.txt diff --git a/mods/skinsdb/meta/character_1736.txt b/mods/skinsdb/meta/character.1736.txt similarity index 100% rename from mods/skinsdb/meta/character_1736.txt rename to mods/skinsdb/meta/character.1736.txt diff --git a/mods/skinsdb/meta/character_1737.txt b/mods/skinsdb/meta/character.1737.txt similarity index 100% rename from mods/skinsdb/meta/character_1737.txt rename to mods/skinsdb/meta/character.1737.txt diff --git a/mods/skinsdb/meta/character_1738.txt b/mods/skinsdb/meta/character.1738.txt similarity index 100% rename from mods/skinsdb/meta/character_1738.txt rename to mods/skinsdb/meta/character.1738.txt diff --git a/mods/skinsdb/meta/character_1739.txt b/mods/skinsdb/meta/character.1739.txt similarity index 100% rename from mods/skinsdb/meta/character_1739.txt rename to mods/skinsdb/meta/character.1739.txt diff --git a/mods/skinsdb/meta/character_174.txt b/mods/skinsdb/meta/character.174.txt similarity index 100% rename from mods/skinsdb/meta/character_174.txt rename to mods/skinsdb/meta/character.174.txt diff --git a/mods/skinsdb/meta/character_1740.txt b/mods/skinsdb/meta/character.1740.txt similarity index 100% rename from mods/skinsdb/meta/character_1740.txt rename to mods/skinsdb/meta/character.1740.txt diff --git a/mods/skinsdb/meta/character_1741.txt b/mods/skinsdb/meta/character.1741.txt similarity index 100% rename from mods/skinsdb/meta/character_1741.txt rename to mods/skinsdb/meta/character.1741.txt diff --git a/mods/skinsdb/meta/character_1742.txt b/mods/skinsdb/meta/character.1742.txt similarity index 100% rename from mods/skinsdb/meta/character_1742.txt rename to mods/skinsdb/meta/character.1742.txt diff --git a/mods/skinsdb/meta/character_1743.txt b/mods/skinsdb/meta/character.1743.txt similarity index 100% rename from mods/skinsdb/meta/character_1743.txt rename to mods/skinsdb/meta/character.1743.txt diff --git a/mods/skinsdb/meta/character_1744.txt b/mods/skinsdb/meta/character.1744.txt similarity index 100% rename from mods/skinsdb/meta/character_1744.txt rename to mods/skinsdb/meta/character.1744.txt diff --git a/mods/skinsdb/meta/character_1745.txt b/mods/skinsdb/meta/character.1745.txt similarity index 100% rename from mods/skinsdb/meta/character_1745.txt rename to mods/skinsdb/meta/character.1745.txt diff --git a/mods/skinsdb/meta/character_1746.txt b/mods/skinsdb/meta/character.1746.txt similarity index 100% rename from mods/skinsdb/meta/character_1746.txt rename to mods/skinsdb/meta/character.1746.txt diff --git a/mods/skinsdb/meta/character_1747.txt b/mods/skinsdb/meta/character.1747.txt similarity index 100% rename from mods/skinsdb/meta/character_1747.txt rename to mods/skinsdb/meta/character.1747.txt diff --git a/mods/skinsdb/meta/character_1748.txt b/mods/skinsdb/meta/character.1748.txt similarity index 100% rename from mods/skinsdb/meta/character_1748.txt rename to mods/skinsdb/meta/character.1748.txt diff --git a/mods/skinsdb/meta/character_1749.txt b/mods/skinsdb/meta/character.1749.txt similarity index 100% rename from mods/skinsdb/meta/character_1749.txt rename to mods/skinsdb/meta/character.1749.txt diff --git a/mods/skinsdb/meta/character_175.txt b/mods/skinsdb/meta/character.175.txt similarity index 100% rename from mods/skinsdb/meta/character_175.txt rename to mods/skinsdb/meta/character.175.txt diff --git a/mods/skinsdb/meta/character_1750.txt b/mods/skinsdb/meta/character.1750.txt similarity index 100% rename from mods/skinsdb/meta/character_1750.txt rename to mods/skinsdb/meta/character.1750.txt diff --git a/mods/skinsdb/meta/character_1751.txt b/mods/skinsdb/meta/character.1751.txt similarity index 100% rename from mods/skinsdb/meta/character_1751.txt rename to mods/skinsdb/meta/character.1751.txt diff --git a/mods/skinsdb/meta/character_1752.txt b/mods/skinsdb/meta/character.1752.txt similarity index 100% rename from mods/skinsdb/meta/character_1752.txt rename to mods/skinsdb/meta/character.1752.txt diff --git a/mods/skinsdb/meta/character_1753.txt b/mods/skinsdb/meta/character.1753.txt similarity index 100% rename from mods/skinsdb/meta/character_1753.txt rename to mods/skinsdb/meta/character.1753.txt diff --git a/mods/skinsdb/meta/character_1754.txt b/mods/skinsdb/meta/character.1754.txt similarity index 100% rename from mods/skinsdb/meta/character_1754.txt rename to mods/skinsdb/meta/character.1754.txt diff --git a/mods/skinsdb/meta/character_1755.txt b/mods/skinsdb/meta/character.1755.txt similarity index 100% rename from mods/skinsdb/meta/character_1755.txt rename to mods/skinsdb/meta/character.1755.txt diff --git a/mods/skinsdb/meta/character_1756.txt b/mods/skinsdb/meta/character.1756.txt similarity index 100% rename from mods/skinsdb/meta/character_1756.txt rename to mods/skinsdb/meta/character.1756.txt diff --git a/mods/skinsdb/meta/character_1757.txt b/mods/skinsdb/meta/character.1757.txt similarity index 100% rename from mods/skinsdb/meta/character_1757.txt rename to mods/skinsdb/meta/character.1757.txt diff --git a/mods/skinsdb/meta/character_1758.txt b/mods/skinsdb/meta/character.1758.txt similarity index 100% rename from mods/skinsdb/meta/character_1758.txt rename to mods/skinsdb/meta/character.1758.txt diff --git a/mods/skinsdb/meta/character_1759.txt b/mods/skinsdb/meta/character.1759.txt similarity index 100% rename from mods/skinsdb/meta/character_1759.txt rename to mods/skinsdb/meta/character.1759.txt diff --git a/mods/skinsdb/meta/character_176.txt b/mods/skinsdb/meta/character.176.txt similarity index 100% rename from mods/skinsdb/meta/character_176.txt rename to mods/skinsdb/meta/character.176.txt diff --git a/mods/skinsdb/meta/character_1760.txt b/mods/skinsdb/meta/character.1760.txt similarity index 100% rename from mods/skinsdb/meta/character_1760.txt rename to mods/skinsdb/meta/character.1760.txt diff --git a/mods/skinsdb/meta/character_1761.txt b/mods/skinsdb/meta/character.1761.txt similarity index 100% rename from mods/skinsdb/meta/character_1761.txt rename to mods/skinsdb/meta/character.1761.txt diff --git a/mods/skinsdb/meta/character_1762.txt b/mods/skinsdb/meta/character.1762.txt similarity index 100% rename from mods/skinsdb/meta/character_1762.txt rename to mods/skinsdb/meta/character.1762.txt diff --git a/mods/skinsdb/meta/character_1763.txt b/mods/skinsdb/meta/character.1763.txt similarity index 100% rename from mods/skinsdb/meta/character_1763.txt rename to mods/skinsdb/meta/character.1763.txt diff --git a/mods/skinsdb/meta/character_1764.txt b/mods/skinsdb/meta/character.1764.txt similarity index 100% rename from mods/skinsdb/meta/character_1764.txt rename to mods/skinsdb/meta/character.1764.txt diff --git a/mods/skinsdb/meta/character_1765.txt b/mods/skinsdb/meta/character.1765.txt similarity index 100% rename from mods/skinsdb/meta/character_1765.txt rename to mods/skinsdb/meta/character.1765.txt diff --git a/mods/skinsdb/meta/character_1766.txt b/mods/skinsdb/meta/character.1766.txt similarity index 100% rename from mods/skinsdb/meta/character_1766.txt rename to mods/skinsdb/meta/character.1766.txt diff --git a/mods/skinsdb/meta/character_1767.txt b/mods/skinsdb/meta/character.1767.txt similarity index 100% rename from mods/skinsdb/meta/character_1767.txt rename to mods/skinsdb/meta/character.1767.txt diff --git a/mods/skinsdb/meta/character_1768.txt b/mods/skinsdb/meta/character.1768.txt similarity index 100% rename from mods/skinsdb/meta/character_1768.txt rename to mods/skinsdb/meta/character.1768.txt diff --git a/mods/skinsdb/meta/character_1769.txt b/mods/skinsdb/meta/character.1769.txt similarity index 100% rename from mods/skinsdb/meta/character_1769.txt rename to mods/skinsdb/meta/character.1769.txt diff --git a/mods/skinsdb/meta/character_177.txt b/mods/skinsdb/meta/character.177.txt similarity index 100% rename from mods/skinsdb/meta/character_177.txt rename to mods/skinsdb/meta/character.177.txt diff --git a/mods/skinsdb/meta/character_1770.txt b/mods/skinsdb/meta/character.1770.txt similarity index 100% rename from mods/skinsdb/meta/character_1770.txt rename to mods/skinsdb/meta/character.1770.txt diff --git a/mods/skinsdb/meta/character_1771.txt b/mods/skinsdb/meta/character.1771.txt similarity index 100% rename from mods/skinsdb/meta/character_1771.txt rename to mods/skinsdb/meta/character.1771.txt diff --git a/mods/skinsdb/meta/character_1772.txt b/mods/skinsdb/meta/character.1772.txt similarity index 100% rename from mods/skinsdb/meta/character_1772.txt rename to mods/skinsdb/meta/character.1772.txt diff --git a/mods/skinsdb/meta/character_1773.txt b/mods/skinsdb/meta/character.1773.txt similarity index 100% rename from mods/skinsdb/meta/character_1773.txt rename to mods/skinsdb/meta/character.1773.txt diff --git a/mods/skinsdb/meta/character_1774.txt b/mods/skinsdb/meta/character.1774.txt similarity index 100% rename from mods/skinsdb/meta/character_1774.txt rename to mods/skinsdb/meta/character.1774.txt diff --git a/mods/skinsdb/meta/character_1775.txt b/mods/skinsdb/meta/character.1775.txt similarity index 100% rename from mods/skinsdb/meta/character_1775.txt rename to mods/skinsdb/meta/character.1775.txt diff --git a/mods/skinsdb/meta/character_1776.txt b/mods/skinsdb/meta/character.1776.txt similarity index 100% rename from mods/skinsdb/meta/character_1776.txt rename to mods/skinsdb/meta/character.1776.txt diff --git a/mods/skinsdb/meta/character_1778.txt b/mods/skinsdb/meta/character.1778.txt similarity index 100% rename from mods/skinsdb/meta/character_1778.txt rename to mods/skinsdb/meta/character.1778.txt diff --git a/mods/skinsdb/meta/character_1779.txt b/mods/skinsdb/meta/character.1779.txt similarity index 100% rename from mods/skinsdb/meta/character_1779.txt rename to mods/skinsdb/meta/character.1779.txt diff --git a/mods/skinsdb/meta/character_178.txt b/mods/skinsdb/meta/character.178.txt similarity index 100% rename from mods/skinsdb/meta/character_178.txt rename to mods/skinsdb/meta/character.178.txt diff --git a/mods/skinsdb/meta/character_1780.txt b/mods/skinsdb/meta/character.1780.txt similarity index 100% rename from mods/skinsdb/meta/character_1780.txt rename to mods/skinsdb/meta/character.1780.txt diff --git a/mods/skinsdb/meta/character_1781.txt b/mods/skinsdb/meta/character.1781.txt similarity index 100% rename from mods/skinsdb/meta/character_1781.txt rename to mods/skinsdb/meta/character.1781.txt diff --git a/mods/skinsdb/meta/character_1782.txt b/mods/skinsdb/meta/character.1782.txt similarity index 100% rename from mods/skinsdb/meta/character_1782.txt rename to mods/skinsdb/meta/character.1782.txt diff --git a/mods/skinsdb/meta/character_1783.txt b/mods/skinsdb/meta/character.1783.txt similarity index 100% rename from mods/skinsdb/meta/character_1783.txt rename to mods/skinsdb/meta/character.1783.txt diff --git a/mods/skinsdb/meta/character_1784.txt b/mods/skinsdb/meta/character.1784.txt similarity index 100% rename from mods/skinsdb/meta/character_1784.txt rename to mods/skinsdb/meta/character.1784.txt diff --git a/mods/skinsdb/meta/character_1785.txt b/mods/skinsdb/meta/character.1785.txt similarity index 100% rename from mods/skinsdb/meta/character_1785.txt rename to mods/skinsdb/meta/character.1785.txt diff --git a/mods/skinsdb/meta/character_1786.txt b/mods/skinsdb/meta/character.1786.txt similarity index 100% rename from mods/skinsdb/meta/character_1786.txt rename to mods/skinsdb/meta/character.1786.txt diff --git a/mods/skinsdb/meta/character_1787.txt b/mods/skinsdb/meta/character.1787.txt similarity index 100% rename from mods/skinsdb/meta/character_1787.txt rename to mods/skinsdb/meta/character.1787.txt diff --git a/mods/skinsdb/meta/character_1788.txt b/mods/skinsdb/meta/character.1788.txt similarity index 100% rename from mods/skinsdb/meta/character_1788.txt rename to mods/skinsdb/meta/character.1788.txt diff --git a/mods/skinsdb/meta/character_1789.txt b/mods/skinsdb/meta/character.1789.txt similarity index 100% rename from mods/skinsdb/meta/character_1789.txt rename to mods/skinsdb/meta/character.1789.txt diff --git a/mods/skinsdb/meta/character_179.txt b/mods/skinsdb/meta/character.179.txt similarity index 100% rename from mods/skinsdb/meta/character_179.txt rename to mods/skinsdb/meta/character.179.txt diff --git a/mods/skinsdb/meta/character_1790.txt b/mods/skinsdb/meta/character.1790.txt similarity index 100% rename from mods/skinsdb/meta/character_1790.txt rename to mods/skinsdb/meta/character.1790.txt diff --git a/mods/skinsdb/meta/character_1791.txt b/mods/skinsdb/meta/character.1791.txt similarity index 100% rename from mods/skinsdb/meta/character_1791.txt rename to mods/skinsdb/meta/character.1791.txt diff --git a/mods/skinsdb/meta/character_1792.txt b/mods/skinsdb/meta/character.1792.txt similarity index 100% rename from mods/skinsdb/meta/character_1792.txt rename to mods/skinsdb/meta/character.1792.txt diff --git a/mods/skinsdb/meta/character_1793.txt b/mods/skinsdb/meta/character.1793.txt similarity index 100% rename from mods/skinsdb/meta/character_1793.txt rename to mods/skinsdb/meta/character.1793.txt diff --git a/mods/skinsdb/meta/character_1794.txt b/mods/skinsdb/meta/character.1794.txt similarity index 100% rename from mods/skinsdb/meta/character_1794.txt rename to mods/skinsdb/meta/character.1794.txt diff --git a/mods/skinsdb/meta/character_1796.txt b/mods/skinsdb/meta/character.1796.txt similarity index 100% rename from mods/skinsdb/meta/character_1796.txt rename to mods/skinsdb/meta/character.1796.txt diff --git a/mods/skinsdb/meta/character_1797.txt b/mods/skinsdb/meta/character.1797.txt similarity index 100% rename from mods/skinsdb/meta/character_1797.txt rename to mods/skinsdb/meta/character.1797.txt diff --git a/mods/skinsdb/meta/character_1798.txt b/mods/skinsdb/meta/character.1798.txt similarity index 100% rename from mods/skinsdb/meta/character_1798.txt rename to mods/skinsdb/meta/character.1798.txt diff --git a/mods/skinsdb/meta/character_1799.txt b/mods/skinsdb/meta/character.1799.txt similarity index 100% rename from mods/skinsdb/meta/character_1799.txt rename to mods/skinsdb/meta/character.1799.txt diff --git a/mods/skinsdb/meta/character_180.txt b/mods/skinsdb/meta/character.180.txt similarity index 100% rename from mods/skinsdb/meta/character_180.txt rename to mods/skinsdb/meta/character.180.txt diff --git a/mods/skinsdb/meta/character_1800.txt b/mods/skinsdb/meta/character.1800.txt similarity index 100% rename from mods/skinsdb/meta/character_1800.txt rename to mods/skinsdb/meta/character.1800.txt diff --git a/mods/skinsdb/meta/character_1801.txt b/mods/skinsdb/meta/character.1801.txt similarity index 100% rename from mods/skinsdb/meta/character_1801.txt rename to mods/skinsdb/meta/character.1801.txt diff --git a/mods/skinsdb/meta/character_1802.txt b/mods/skinsdb/meta/character.1802.txt similarity index 100% rename from mods/skinsdb/meta/character_1802.txt rename to mods/skinsdb/meta/character.1802.txt diff --git a/mods/skinsdb/meta/character_1803.txt b/mods/skinsdb/meta/character.1803.txt similarity index 100% rename from mods/skinsdb/meta/character_1803.txt rename to mods/skinsdb/meta/character.1803.txt diff --git a/mods/skinsdb/meta/character_1804.txt b/mods/skinsdb/meta/character.1804.txt similarity index 100% rename from mods/skinsdb/meta/character_1804.txt rename to mods/skinsdb/meta/character.1804.txt diff --git a/mods/skinsdb/meta/character_1805.txt b/mods/skinsdb/meta/character.1805.txt similarity index 100% rename from mods/skinsdb/meta/character_1805.txt rename to mods/skinsdb/meta/character.1805.txt diff --git a/mods/skinsdb/meta/character_1806.txt b/mods/skinsdb/meta/character.1806.txt similarity index 100% rename from mods/skinsdb/meta/character_1806.txt rename to mods/skinsdb/meta/character.1806.txt diff --git a/mods/skinsdb/meta/character_1807.txt b/mods/skinsdb/meta/character.1807.txt similarity index 100% rename from mods/skinsdb/meta/character_1807.txt rename to mods/skinsdb/meta/character.1807.txt diff --git a/mods/skinsdb/meta/character_1808.txt b/mods/skinsdb/meta/character.1808.txt similarity index 100% rename from mods/skinsdb/meta/character_1808.txt rename to mods/skinsdb/meta/character.1808.txt diff --git a/mods/skinsdb/meta/character_1809.txt b/mods/skinsdb/meta/character.1809.txt similarity index 100% rename from mods/skinsdb/meta/character_1809.txt rename to mods/skinsdb/meta/character.1809.txt diff --git a/mods/skinsdb/meta/character_181.txt b/mods/skinsdb/meta/character.181.txt similarity index 100% rename from mods/skinsdb/meta/character_181.txt rename to mods/skinsdb/meta/character.181.txt diff --git a/mods/skinsdb/meta/character_1810.txt b/mods/skinsdb/meta/character.1810.txt similarity index 100% rename from mods/skinsdb/meta/character_1810.txt rename to mods/skinsdb/meta/character.1810.txt diff --git a/mods/skinsdb/meta/character_1811.txt b/mods/skinsdb/meta/character.1811.txt similarity index 100% rename from mods/skinsdb/meta/character_1811.txt rename to mods/skinsdb/meta/character.1811.txt diff --git a/mods/skinsdb/meta/character_1812.txt b/mods/skinsdb/meta/character.1812.txt similarity index 100% rename from mods/skinsdb/meta/character_1812.txt rename to mods/skinsdb/meta/character.1812.txt diff --git a/mods/skinsdb/meta/character_1813.txt b/mods/skinsdb/meta/character.1813.txt similarity index 100% rename from mods/skinsdb/meta/character_1813.txt rename to mods/skinsdb/meta/character.1813.txt diff --git a/mods/skinsdb/meta/character_1814.txt b/mods/skinsdb/meta/character.1814.txt similarity index 100% rename from mods/skinsdb/meta/character_1814.txt rename to mods/skinsdb/meta/character.1814.txt diff --git a/mods/skinsdb/meta/character_1815.txt b/mods/skinsdb/meta/character.1815.txt similarity index 100% rename from mods/skinsdb/meta/character_1815.txt rename to mods/skinsdb/meta/character.1815.txt diff --git a/mods/skinsdb/meta/character_1816.txt b/mods/skinsdb/meta/character.1816.txt similarity index 100% rename from mods/skinsdb/meta/character_1816.txt rename to mods/skinsdb/meta/character.1816.txt diff --git a/mods/skinsdb/meta/character_1817.txt b/mods/skinsdb/meta/character.1817.txt similarity index 100% rename from mods/skinsdb/meta/character_1817.txt rename to mods/skinsdb/meta/character.1817.txt diff --git a/mods/skinsdb/meta/character_1818.txt b/mods/skinsdb/meta/character.1818.txt similarity index 100% rename from mods/skinsdb/meta/character_1818.txt rename to mods/skinsdb/meta/character.1818.txt diff --git a/mods/skinsdb/meta/character_1819.txt b/mods/skinsdb/meta/character.1819.txt similarity index 100% rename from mods/skinsdb/meta/character_1819.txt rename to mods/skinsdb/meta/character.1819.txt diff --git a/mods/skinsdb/meta/character_182.txt b/mods/skinsdb/meta/character.182.txt similarity index 100% rename from mods/skinsdb/meta/character_182.txt rename to mods/skinsdb/meta/character.182.txt diff --git a/mods/skinsdb/meta/character_1820.txt b/mods/skinsdb/meta/character.1820.txt similarity index 100% rename from mods/skinsdb/meta/character_1820.txt rename to mods/skinsdb/meta/character.1820.txt diff --git a/mods/skinsdb/meta/character_1821.txt b/mods/skinsdb/meta/character.1821.txt similarity index 100% rename from mods/skinsdb/meta/character_1821.txt rename to mods/skinsdb/meta/character.1821.txt diff --git a/mods/skinsdb/meta/character_1822.txt b/mods/skinsdb/meta/character.1822.txt similarity index 100% rename from mods/skinsdb/meta/character_1822.txt rename to mods/skinsdb/meta/character.1822.txt diff --git a/mods/skinsdb/meta/character_1823.txt b/mods/skinsdb/meta/character.1823.txt similarity index 100% rename from mods/skinsdb/meta/character_1823.txt rename to mods/skinsdb/meta/character.1823.txt diff --git a/mods/skinsdb/meta/character_1824.txt b/mods/skinsdb/meta/character.1824.txt similarity index 100% rename from mods/skinsdb/meta/character_1824.txt rename to mods/skinsdb/meta/character.1824.txt diff --git a/mods/skinsdb/meta/character_1825.txt b/mods/skinsdb/meta/character.1825.txt similarity index 100% rename from mods/skinsdb/meta/character_1825.txt rename to mods/skinsdb/meta/character.1825.txt diff --git a/mods/skinsdb/meta/character_1826.txt b/mods/skinsdb/meta/character.1826.txt similarity index 100% rename from mods/skinsdb/meta/character_1826.txt rename to mods/skinsdb/meta/character.1826.txt diff --git a/mods/skinsdb/meta/character_1827.txt b/mods/skinsdb/meta/character.1827.txt similarity index 100% rename from mods/skinsdb/meta/character_1827.txt rename to mods/skinsdb/meta/character.1827.txt diff --git a/mods/skinsdb/meta/character_1828.txt b/mods/skinsdb/meta/character.1828.txt similarity index 100% rename from mods/skinsdb/meta/character_1828.txt rename to mods/skinsdb/meta/character.1828.txt diff --git a/mods/skinsdb/meta/character_1829.txt b/mods/skinsdb/meta/character.1829.txt similarity index 100% rename from mods/skinsdb/meta/character_1829.txt rename to mods/skinsdb/meta/character.1829.txt diff --git a/mods/skinsdb/meta/character_183.txt b/mods/skinsdb/meta/character.183.txt similarity index 100% rename from mods/skinsdb/meta/character_183.txt rename to mods/skinsdb/meta/character.183.txt diff --git a/mods/skinsdb/meta/character_1830.txt b/mods/skinsdb/meta/character.1830.txt similarity index 100% rename from mods/skinsdb/meta/character_1830.txt rename to mods/skinsdb/meta/character.1830.txt diff --git a/mods/skinsdb/meta/character_1831.txt b/mods/skinsdb/meta/character.1831.txt similarity index 100% rename from mods/skinsdb/meta/character_1831.txt rename to mods/skinsdb/meta/character.1831.txt diff --git a/mods/skinsdb/meta/character_1832.txt b/mods/skinsdb/meta/character.1832.txt similarity index 100% rename from mods/skinsdb/meta/character_1832.txt rename to mods/skinsdb/meta/character.1832.txt diff --git a/mods/skinsdb/meta/character_1833.txt b/mods/skinsdb/meta/character.1833.txt similarity index 100% rename from mods/skinsdb/meta/character_1833.txt rename to mods/skinsdb/meta/character.1833.txt diff --git a/mods/skinsdb/meta/character_1834.txt b/mods/skinsdb/meta/character.1834.txt similarity index 100% rename from mods/skinsdb/meta/character_1834.txt rename to mods/skinsdb/meta/character.1834.txt diff --git a/mods/skinsdb/meta/character_1835.txt b/mods/skinsdb/meta/character.1835.txt similarity index 100% rename from mods/skinsdb/meta/character_1835.txt rename to mods/skinsdb/meta/character.1835.txt diff --git a/mods/skinsdb/meta/character_1836.txt b/mods/skinsdb/meta/character.1836.txt similarity index 100% rename from mods/skinsdb/meta/character_1836.txt rename to mods/skinsdb/meta/character.1836.txt diff --git a/mods/skinsdb/meta/character_1837.txt b/mods/skinsdb/meta/character.1837.txt similarity index 100% rename from mods/skinsdb/meta/character_1837.txt rename to mods/skinsdb/meta/character.1837.txt diff --git a/mods/skinsdb/meta/character_1838.txt b/mods/skinsdb/meta/character.1838.txt similarity index 100% rename from mods/skinsdb/meta/character_1838.txt rename to mods/skinsdb/meta/character.1838.txt diff --git a/mods/skinsdb/meta/character_1839.txt b/mods/skinsdb/meta/character.1839.txt similarity index 100% rename from mods/skinsdb/meta/character_1839.txt rename to mods/skinsdb/meta/character.1839.txt diff --git a/mods/skinsdb/meta/character_184.txt b/mods/skinsdb/meta/character.184.txt similarity index 100% rename from mods/skinsdb/meta/character_184.txt rename to mods/skinsdb/meta/character.184.txt diff --git a/mods/skinsdb/meta/character_1840.txt b/mods/skinsdb/meta/character.1840.txt similarity index 100% rename from mods/skinsdb/meta/character_1840.txt rename to mods/skinsdb/meta/character.1840.txt diff --git a/mods/skinsdb/meta/character_1841.txt b/mods/skinsdb/meta/character.1841.txt similarity index 100% rename from mods/skinsdb/meta/character_1841.txt rename to mods/skinsdb/meta/character.1841.txt diff --git a/mods/skinsdb/meta/character_1842.txt b/mods/skinsdb/meta/character.1842.txt similarity index 100% rename from mods/skinsdb/meta/character_1842.txt rename to mods/skinsdb/meta/character.1842.txt diff --git a/mods/skinsdb/meta/character_1843.txt b/mods/skinsdb/meta/character.1843.txt similarity index 100% rename from mods/skinsdb/meta/character_1843.txt rename to mods/skinsdb/meta/character.1843.txt diff --git a/mods/skinsdb/meta/character_1844.txt b/mods/skinsdb/meta/character.1844.txt similarity index 100% rename from mods/skinsdb/meta/character_1844.txt rename to mods/skinsdb/meta/character.1844.txt diff --git a/mods/skinsdb/meta/character_1845.txt b/mods/skinsdb/meta/character.1845.txt similarity index 100% rename from mods/skinsdb/meta/character_1845.txt rename to mods/skinsdb/meta/character.1845.txt diff --git a/mods/skinsdb/meta/character_1846.txt b/mods/skinsdb/meta/character.1846.txt similarity index 100% rename from mods/skinsdb/meta/character_1846.txt rename to mods/skinsdb/meta/character.1846.txt diff --git a/mods/skinsdb/meta/character_1847.txt b/mods/skinsdb/meta/character.1847.txt similarity index 100% rename from mods/skinsdb/meta/character_1847.txt rename to mods/skinsdb/meta/character.1847.txt diff --git a/mods/skinsdb/meta/character_1848.txt b/mods/skinsdb/meta/character.1848.txt similarity index 100% rename from mods/skinsdb/meta/character_1848.txt rename to mods/skinsdb/meta/character.1848.txt diff --git a/mods/skinsdb/meta/character_1849.txt b/mods/skinsdb/meta/character.1849.txt similarity index 100% rename from mods/skinsdb/meta/character_1849.txt rename to mods/skinsdb/meta/character.1849.txt diff --git a/mods/skinsdb/meta/character_185.txt b/mods/skinsdb/meta/character.185.txt similarity index 100% rename from mods/skinsdb/meta/character_185.txt rename to mods/skinsdb/meta/character.185.txt diff --git a/mods/skinsdb/meta/character_1850.txt b/mods/skinsdb/meta/character.1850.txt similarity index 100% rename from mods/skinsdb/meta/character_1850.txt rename to mods/skinsdb/meta/character.1850.txt diff --git a/mods/skinsdb/meta/character_1851.txt b/mods/skinsdb/meta/character.1851.txt similarity index 100% rename from mods/skinsdb/meta/character_1851.txt rename to mods/skinsdb/meta/character.1851.txt diff --git a/mods/skinsdb/meta/character_1852.txt b/mods/skinsdb/meta/character.1852.txt similarity index 100% rename from mods/skinsdb/meta/character_1852.txt rename to mods/skinsdb/meta/character.1852.txt diff --git a/mods/skinsdb/meta/character_1853.txt b/mods/skinsdb/meta/character.1853.txt similarity index 100% rename from mods/skinsdb/meta/character_1853.txt rename to mods/skinsdb/meta/character.1853.txt diff --git a/mods/skinsdb/meta/character_1854.txt b/mods/skinsdb/meta/character.1854.txt similarity index 100% rename from mods/skinsdb/meta/character_1854.txt rename to mods/skinsdb/meta/character.1854.txt diff --git a/mods/skinsdb/meta/character_1855.txt b/mods/skinsdb/meta/character.1855.txt similarity index 100% rename from mods/skinsdb/meta/character_1855.txt rename to mods/skinsdb/meta/character.1855.txt diff --git a/mods/skinsdb/meta/character_1856.txt b/mods/skinsdb/meta/character.1856.txt similarity index 100% rename from mods/skinsdb/meta/character_1856.txt rename to mods/skinsdb/meta/character.1856.txt diff --git a/mods/skinsdb/meta/character_1857.txt b/mods/skinsdb/meta/character.1857.txt similarity index 100% rename from mods/skinsdb/meta/character_1857.txt rename to mods/skinsdb/meta/character.1857.txt diff --git a/mods/skinsdb/meta/character_1858.txt b/mods/skinsdb/meta/character.1858.txt similarity index 100% rename from mods/skinsdb/meta/character_1858.txt rename to mods/skinsdb/meta/character.1858.txt diff --git a/mods/skinsdb/meta/character_1859.txt b/mods/skinsdb/meta/character.1859.txt similarity index 100% rename from mods/skinsdb/meta/character_1859.txt rename to mods/skinsdb/meta/character.1859.txt diff --git a/mods/skinsdb/meta/character_186.txt b/mods/skinsdb/meta/character.186.txt similarity index 100% rename from mods/skinsdb/meta/character_186.txt rename to mods/skinsdb/meta/character.186.txt diff --git a/mods/skinsdb/meta/character_1860.txt b/mods/skinsdb/meta/character.1860.txt similarity index 100% rename from mods/skinsdb/meta/character_1860.txt rename to mods/skinsdb/meta/character.1860.txt diff --git a/mods/skinsdb/meta/character_1861.txt b/mods/skinsdb/meta/character.1861.txt similarity index 100% rename from mods/skinsdb/meta/character_1861.txt rename to mods/skinsdb/meta/character.1861.txt diff --git a/mods/skinsdb/meta/character_1862.txt b/mods/skinsdb/meta/character.1862.txt similarity index 100% rename from mods/skinsdb/meta/character_1862.txt rename to mods/skinsdb/meta/character.1862.txt diff --git a/mods/skinsdb/meta/character_1863.txt b/mods/skinsdb/meta/character.1863.txt similarity index 100% rename from mods/skinsdb/meta/character_1863.txt rename to mods/skinsdb/meta/character.1863.txt diff --git a/mods/skinsdb/meta/character_1864.txt b/mods/skinsdb/meta/character.1864.txt similarity index 100% rename from mods/skinsdb/meta/character_1864.txt rename to mods/skinsdb/meta/character.1864.txt diff --git a/mods/skinsdb/meta/character_1865.txt b/mods/skinsdb/meta/character.1865.txt similarity index 100% rename from mods/skinsdb/meta/character_1865.txt rename to mods/skinsdb/meta/character.1865.txt diff --git a/mods/skinsdb/meta/character_1866.txt b/mods/skinsdb/meta/character.1866.txt similarity index 100% rename from mods/skinsdb/meta/character_1866.txt rename to mods/skinsdb/meta/character.1866.txt diff --git a/mods/skinsdb/meta/character_1867.txt b/mods/skinsdb/meta/character.1867.txt similarity index 100% rename from mods/skinsdb/meta/character_1867.txt rename to mods/skinsdb/meta/character.1867.txt diff --git a/mods/skinsdb/meta/character_1868.txt b/mods/skinsdb/meta/character.1868.txt similarity index 100% rename from mods/skinsdb/meta/character_1868.txt rename to mods/skinsdb/meta/character.1868.txt diff --git a/mods/skinsdb/meta/character_1869.txt b/mods/skinsdb/meta/character.1869.txt similarity index 100% rename from mods/skinsdb/meta/character_1869.txt rename to mods/skinsdb/meta/character.1869.txt diff --git a/mods/skinsdb/meta/character_187.txt b/mods/skinsdb/meta/character.187.txt similarity index 100% rename from mods/skinsdb/meta/character_187.txt rename to mods/skinsdb/meta/character.187.txt diff --git a/mods/skinsdb/meta/character_1870.txt b/mods/skinsdb/meta/character.1870.txt similarity index 100% rename from mods/skinsdb/meta/character_1870.txt rename to mods/skinsdb/meta/character.1870.txt diff --git a/mods/skinsdb/meta/character_1871.txt b/mods/skinsdb/meta/character.1871.txt similarity index 100% rename from mods/skinsdb/meta/character_1871.txt rename to mods/skinsdb/meta/character.1871.txt diff --git a/mods/skinsdb/meta/character_1872.txt b/mods/skinsdb/meta/character.1872.txt similarity index 100% rename from mods/skinsdb/meta/character_1872.txt rename to mods/skinsdb/meta/character.1872.txt diff --git a/mods/skinsdb/meta/character_1873.txt b/mods/skinsdb/meta/character.1873.txt similarity index 100% rename from mods/skinsdb/meta/character_1873.txt rename to mods/skinsdb/meta/character.1873.txt diff --git a/mods/skinsdb/meta/character_1874.txt b/mods/skinsdb/meta/character.1874.txt similarity index 100% rename from mods/skinsdb/meta/character_1874.txt rename to mods/skinsdb/meta/character.1874.txt diff --git a/mods/skinsdb/meta/character_1875.txt b/mods/skinsdb/meta/character.1875.txt similarity index 100% rename from mods/skinsdb/meta/character_1875.txt rename to mods/skinsdb/meta/character.1875.txt diff --git a/mods/skinsdb/meta/character_1876.txt b/mods/skinsdb/meta/character.1876.txt similarity index 100% rename from mods/skinsdb/meta/character_1876.txt rename to mods/skinsdb/meta/character.1876.txt diff --git a/mods/skinsdb/meta/character_1877.txt b/mods/skinsdb/meta/character.1877.txt similarity index 100% rename from mods/skinsdb/meta/character_1877.txt rename to mods/skinsdb/meta/character.1877.txt diff --git a/mods/skinsdb/meta/character_1878.txt b/mods/skinsdb/meta/character.1878.txt similarity index 100% rename from mods/skinsdb/meta/character_1878.txt rename to mods/skinsdb/meta/character.1878.txt diff --git a/mods/skinsdb/meta/character_1879.txt b/mods/skinsdb/meta/character.1879.txt similarity index 100% rename from mods/skinsdb/meta/character_1879.txt rename to mods/skinsdb/meta/character.1879.txt diff --git a/mods/skinsdb/meta/character_188.txt b/mods/skinsdb/meta/character.188.txt similarity index 100% rename from mods/skinsdb/meta/character_188.txt rename to mods/skinsdb/meta/character.188.txt diff --git a/mods/skinsdb/meta/character_1880.txt b/mods/skinsdb/meta/character.1880.txt similarity index 100% rename from mods/skinsdb/meta/character_1880.txt rename to mods/skinsdb/meta/character.1880.txt diff --git a/mods/skinsdb/meta/character_1881.txt b/mods/skinsdb/meta/character.1881.txt similarity index 100% rename from mods/skinsdb/meta/character_1881.txt rename to mods/skinsdb/meta/character.1881.txt diff --git a/mods/skinsdb/meta/character_1882.txt b/mods/skinsdb/meta/character.1882.txt similarity index 100% rename from mods/skinsdb/meta/character_1882.txt rename to mods/skinsdb/meta/character.1882.txt diff --git a/mods/skinsdb/meta/character_1883.txt b/mods/skinsdb/meta/character.1883.txt similarity index 100% rename from mods/skinsdb/meta/character_1883.txt rename to mods/skinsdb/meta/character.1883.txt diff --git a/mods/skinsdb/meta/character_1884.txt b/mods/skinsdb/meta/character.1884.txt similarity index 100% rename from mods/skinsdb/meta/character_1884.txt rename to mods/skinsdb/meta/character.1884.txt diff --git a/mods/skinsdb/meta/character_1885.txt b/mods/skinsdb/meta/character.1885.txt similarity index 100% rename from mods/skinsdb/meta/character_1885.txt rename to mods/skinsdb/meta/character.1885.txt diff --git a/mods/skinsdb/meta/character_1886.txt b/mods/skinsdb/meta/character.1886.txt similarity index 100% rename from mods/skinsdb/meta/character_1886.txt rename to mods/skinsdb/meta/character.1886.txt diff --git a/mods/skinsdb/meta/character_1887.txt b/mods/skinsdb/meta/character.1887.txt similarity index 100% rename from mods/skinsdb/meta/character_1887.txt rename to mods/skinsdb/meta/character.1887.txt diff --git a/mods/skinsdb/meta/character_1888.txt b/mods/skinsdb/meta/character.1888.txt similarity index 100% rename from mods/skinsdb/meta/character_1888.txt rename to mods/skinsdb/meta/character.1888.txt diff --git a/mods/skinsdb/meta/character_1889.txt b/mods/skinsdb/meta/character.1889.txt similarity index 100% rename from mods/skinsdb/meta/character_1889.txt rename to mods/skinsdb/meta/character.1889.txt diff --git a/mods/skinsdb/meta/character_189.txt b/mods/skinsdb/meta/character.189.txt similarity index 100% rename from mods/skinsdb/meta/character_189.txt rename to mods/skinsdb/meta/character.189.txt diff --git a/mods/skinsdb/meta/character_1890.txt b/mods/skinsdb/meta/character.1890.txt similarity index 100% rename from mods/skinsdb/meta/character_1890.txt rename to mods/skinsdb/meta/character.1890.txt diff --git a/mods/skinsdb/meta/character_1891.txt b/mods/skinsdb/meta/character.1891.txt similarity index 100% rename from mods/skinsdb/meta/character_1891.txt rename to mods/skinsdb/meta/character.1891.txt diff --git a/mods/skinsdb/meta/character_1892.txt b/mods/skinsdb/meta/character.1892.txt similarity index 100% rename from mods/skinsdb/meta/character_1892.txt rename to mods/skinsdb/meta/character.1892.txt diff --git a/mods/skinsdb/meta/character_1893.txt b/mods/skinsdb/meta/character.1893.txt similarity index 100% rename from mods/skinsdb/meta/character_1893.txt rename to mods/skinsdb/meta/character.1893.txt diff --git a/mods/skinsdb/meta/character_1894.txt b/mods/skinsdb/meta/character.1894.txt similarity index 100% rename from mods/skinsdb/meta/character_1894.txt rename to mods/skinsdb/meta/character.1894.txt diff --git a/mods/skinsdb/meta/character_1895.txt b/mods/skinsdb/meta/character.1895.txt similarity index 100% rename from mods/skinsdb/meta/character_1895.txt rename to mods/skinsdb/meta/character.1895.txt diff --git a/mods/skinsdb/meta/character_1896.txt b/mods/skinsdb/meta/character.1896.txt similarity index 100% rename from mods/skinsdb/meta/character_1896.txt rename to mods/skinsdb/meta/character.1896.txt diff --git a/mods/skinsdb/meta/character_1897.txt b/mods/skinsdb/meta/character.1897.txt similarity index 100% rename from mods/skinsdb/meta/character_1897.txt rename to mods/skinsdb/meta/character.1897.txt diff --git a/mods/skinsdb/meta/character_1898.txt b/mods/skinsdb/meta/character.1898.txt similarity index 100% rename from mods/skinsdb/meta/character_1898.txt rename to mods/skinsdb/meta/character.1898.txt diff --git a/mods/skinsdb/meta/character_1899.txt b/mods/skinsdb/meta/character.1899.txt similarity index 100% rename from mods/skinsdb/meta/character_1899.txt rename to mods/skinsdb/meta/character.1899.txt diff --git a/mods/skinsdb/meta/character_19.txt b/mods/skinsdb/meta/character.19.txt similarity index 100% rename from mods/skinsdb/meta/character_19.txt rename to mods/skinsdb/meta/character.19.txt diff --git a/mods/skinsdb/meta/character_190.txt b/mods/skinsdb/meta/character.190.txt similarity index 100% rename from mods/skinsdb/meta/character_190.txt rename to mods/skinsdb/meta/character.190.txt diff --git a/mods/skinsdb/meta/character_1900.txt b/mods/skinsdb/meta/character.1900.txt similarity index 100% rename from mods/skinsdb/meta/character_1900.txt rename to mods/skinsdb/meta/character.1900.txt diff --git a/mods/skinsdb/meta/character_1901.txt b/mods/skinsdb/meta/character.1901.txt similarity index 100% rename from mods/skinsdb/meta/character_1901.txt rename to mods/skinsdb/meta/character.1901.txt diff --git a/mods/skinsdb/meta/character_1902.txt b/mods/skinsdb/meta/character.1902.txt similarity index 100% rename from mods/skinsdb/meta/character_1902.txt rename to mods/skinsdb/meta/character.1902.txt diff --git a/mods/skinsdb/meta/character_1903.txt b/mods/skinsdb/meta/character.1903.txt similarity index 100% rename from mods/skinsdb/meta/character_1903.txt rename to mods/skinsdb/meta/character.1903.txt diff --git a/mods/skinsdb/meta/character_1904.txt b/mods/skinsdb/meta/character.1904.txt similarity index 100% rename from mods/skinsdb/meta/character_1904.txt rename to mods/skinsdb/meta/character.1904.txt diff --git a/mods/skinsdb/meta/character_1905.txt b/mods/skinsdb/meta/character.1905.txt similarity index 100% rename from mods/skinsdb/meta/character_1905.txt rename to mods/skinsdb/meta/character.1905.txt diff --git a/mods/skinsdb/meta/character_1906.txt b/mods/skinsdb/meta/character.1906.txt similarity index 100% rename from mods/skinsdb/meta/character_1906.txt rename to mods/skinsdb/meta/character.1906.txt diff --git a/mods/skinsdb/meta/character_1907.txt b/mods/skinsdb/meta/character.1907.txt similarity index 100% rename from mods/skinsdb/meta/character_1907.txt rename to mods/skinsdb/meta/character.1907.txt diff --git a/mods/skinsdb/meta/character_1908.txt b/mods/skinsdb/meta/character.1908.txt similarity index 100% rename from mods/skinsdb/meta/character_1908.txt rename to mods/skinsdb/meta/character.1908.txt diff --git a/mods/skinsdb/meta/character_1909.txt b/mods/skinsdb/meta/character.1909.txt similarity index 100% rename from mods/skinsdb/meta/character_1909.txt rename to mods/skinsdb/meta/character.1909.txt diff --git a/mods/skinsdb/meta/character_191.txt b/mods/skinsdb/meta/character.191.txt similarity index 100% rename from mods/skinsdb/meta/character_191.txt rename to mods/skinsdb/meta/character.191.txt diff --git a/mods/skinsdb/meta/character_1910.txt b/mods/skinsdb/meta/character.1910.txt similarity index 100% rename from mods/skinsdb/meta/character_1910.txt rename to mods/skinsdb/meta/character.1910.txt diff --git a/mods/skinsdb/meta/character_1911.txt b/mods/skinsdb/meta/character.1911.txt similarity index 100% rename from mods/skinsdb/meta/character_1911.txt rename to mods/skinsdb/meta/character.1911.txt diff --git a/mods/skinsdb/meta/character_1912.txt b/mods/skinsdb/meta/character.1912.txt similarity index 100% rename from mods/skinsdb/meta/character_1912.txt rename to mods/skinsdb/meta/character.1912.txt diff --git a/mods/skinsdb/meta/character_1913.txt b/mods/skinsdb/meta/character.1913.txt similarity index 100% rename from mods/skinsdb/meta/character_1913.txt rename to mods/skinsdb/meta/character.1913.txt diff --git a/mods/skinsdb/meta/character_1914.txt b/mods/skinsdb/meta/character.1914.txt similarity index 100% rename from mods/skinsdb/meta/character_1914.txt rename to mods/skinsdb/meta/character.1914.txt diff --git a/mods/skinsdb/meta/character_1915.txt b/mods/skinsdb/meta/character.1915.txt similarity index 100% rename from mods/skinsdb/meta/character_1915.txt rename to mods/skinsdb/meta/character.1915.txt diff --git a/mods/skinsdb/meta/character_1916.txt b/mods/skinsdb/meta/character.1916.txt similarity index 100% rename from mods/skinsdb/meta/character_1916.txt rename to mods/skinsdb/meta/character.1916.txt diff --git a/mods/skinsdb/meta/character_1917.txt b/mods/skinsdb/meta/character.1917.txt similarity index 100% rename from mods/skinsdb/meta/character_1917.txt rename to mods/skinsdb/meta/character.1917.txt diff --git a/mods/skinsdb/meta/character_1918.txt b/mods/skinsdb/meta/character.1918.txt similarity index 100% rename from mods/skinsdb/meta/character_1918.txt rename to mods/skinsdb/meta/character.1918.txt diff --git a/mods/skinsdb/meta/character_1919.txt b/mods/skinsdb/meta/character.1919.txt similarity index 100% rename from mods/skinsdb/meta/character_1919.txt rename to mods/skinsdb/meta/character.1919.txt diff --git a/mods/skinsdb/meta/character_192.txt b/mods/skinsdb/meta/character.192.txt similarity index 100% rename from mods/skinsdb/meta/character_192.txt rename to mods/skinsdb/meta/character.192.txt diff --git a/mods/skinsdb/meta/character_1920.txt b/mods/skinsdb/meta/character.1920.txt similarity index 100% rename from mods/skinsdb/meta/character_1920.txt rename to mods/skinsdb/meta/character.1920.txt diff --git a/mods/skinsdb/meta/character_1921.txt b/mods/skinsdb/meta/character.1921.txt similarity index 100% rename from mods/skinsdb/meta/character_1921.txt rename to mods/skinsdb/meta/character.1921.txt diff --git a/mods/skinsdb/meta/character_1922.txt b/mods/skinsdb/meta/character.1922.txt similarity index 100% rename from mods/skinsdb/meta/character_1922.txt rename to mods/skinsdb/meta/character.1922.txt diff --git a/mods/skinsdb/meta/character_1923.txt b/mods/skinsdb/meta/character.1923.txt similarity index 100% rename from mods/skinsdb/meta/character_1923.txt rename to mods/skinsdb/meta/character.1923.txt diff --git a/mods/skinsdb/meta/character_1924.txt b/mods/skinsdb/meta/character.1924.txt similarity index 100% rename from mods/skinsdb/meta/character_1924.txt rename to mods/skinsdb/meta/character.1924.txt diff --git a/mods/skinsdb/meta/character_1925.txt b/mods/skinsdb/meta/character.1925.txt similarity index 100% rename from mods/skinsdb/meta/character_1925.txt rename to mods/skinsdb/meta/character.1925.txt diff --git a/mods/skinsdb/meta/character_1926.txt b/mods/skinsdb/meta/character.1926.txt similarity index 100% rename from mods/skinsdb/meta/character_1926.txt rename to mods/skinsdb/meta/character.1926.txt diff --git a/mods/skinsdb/meta/character_1927.txt b/mods/skinsdb/meta/character.1927.txt similarity index 100% rename from mods/skinsdb/meta/character_1927.txt rename to mods/skinsdb/meta/character.1927.txt diff --git a/mods/skinsdb/meta/character_1928.txt b/mods/skinsdb/meta/character.1928.txt similarity index 100% rename from mods/skinsdb/meta/character_1928.txt rename to mods/skinsdb/meta/character.1928.txt diff --git a/mods/skinsdb/meta/character_1929.txt b/mods/skinsdb/meta/character.1929.txt similarity index 100% rename from mods/skinsdb/meta/character_1929.txt rename to mods/skinsdb/meta/character.1929.txt diff --git a/mods/skinsdb/meta/character_193.txt b/mods/skinsdb/meta/character.193.txt similarity index 100% rename from mods/skinsdb/meta/character_193.txt rename to mods/skinsdb/meta/character.193.txt diff --git a/mods/skinsdb/meta/character_1930.txt b/mods/skinsdb/meta/character.1930.txt similarity index 100% rename from mods/skinsdb/meta/character_1930.txt rename to mods/skinsdb/meta/character.1930.txt diff --git a/mods/skinsdb/meta/character_1931.txt b/mods/skinsdb/meta/character.1931.txt similarity index 100% rename from mods/skinsdb/meta/character_1931.txt rename to mods/skinsdb/meta/character.1931.txt diff --git a/mods/skinsdb/meta/character_1932.txt b/mods/skinsdb/meta/character.1932.txt similarity index 100% rename from mods/skinsdb/meta/character_1932.txt rename to mods/skinsdb/meta/character.1932.txt diff --git a/mods/skinsdb/meta/character_1933.txt b/mods/skinsdb/meta/character.1933.txt similarity index 100% rename from mods/skinsdb/meta/character_1933.txt rename to mods/skinsdb/meta/character.1933.txt diff --git a/mods/skinsdb/meta/character_1934.txt b/mods/skinsdb/meta/character.1934.txt similarity index 100% rename from mods/skinsdb/meta/character_1934.txt rename to mods/skinsdb/meta/character.1934.txt diff --git a/mods/skinsdb/meta/character_1935.txt b/mods/skinsdb/meta/character.1935.txt similarity index 100% rename from mods/skinsdb/meta/character_1935.txt rename to mods/skinsdb/meta/character.1935.txt diff --git a/mods/skinsdb/meta/character_1937.txt b/mods/skinsdb/meta/character.1937.txt similarity index 100% rename from mods/skinsdb/meta/character_1937.txt rename to mods/skinsdb/meta/character.1937.txt diff --git a/mods/skinsdb/meta/character_1938.txt b/mods/skinsdb/meta/character.1938.txt similarity index 100% rename from mods/skinsdb/meta/character_1938.txt rename to mods/skinsdb/meta/character.1938.txt diff --git a/mods/skinsdb/meta/character_1939.txt b/mods/skinsdb/meta/character.1939.txt similarity index 100% rename from mods/skinsdb/meta/character_1939.txt rename to mods/skinsdb/meta/character.1939.txt diff --git a/mods/skinsdb/meta/character_194.txt b/mods/skinsdb/meta/character.194.txt similarity index 100% rename from mods/skinsdb/meta/character_194.txt rename to mods/skinsdb/meta/character.194.txt diff --git a/mods/skinsdb/meta/character_1940.txt b/mods/skinsdb/meta/character.1940.txt similarity index 100% rename from mods/skinsdb/meta/character_1940.txt rename to mods/skinsdb/meta/character.1940.txt diff --git a/mods/skinsdb/meta/character_1941.txt b/mods/skinsdb/meta/character.1941.txt similarity index 100% rename from mods/skinsdb/meta/character_1941.txt rename to mods/skinsdb/meta/character.1941.txt diff --git a/mods/skinsdb/meta/character_1942.txt b/mods/skinsdb/meta/character.1942.txt similarity index 100% rename from mods/skinsdb/meta/character_1942.txt rename to mods/skinsdb/meta/character.1942.txt diff --git a/mods/skinsdb/meta/character_1943.txt b/mods/skinsdb/meta/character.1943.txt similarity index 100% rename from mods/skinsdb/meta/character_1943.txt rename to mods/skinsdb/meta/character.1943.txt diff --git a/mods/skinsdb/meta/character_1944.txt b/mods/skinsdb/meta/character.1944.txt similarity index 100% rename from mods/skinsdb/meta/character_1944.txt rename to mods/skinsdb/meta/character.1944.txt diff --git a/mods/skinsdb/meta/character_1945.txt b/mods/skinsdb/meta/character.1945.txt similarity index 100% rename from mods/skinsdb/meta/character_1945.txt rename to mods/skinsdb/meta/character.1945.txt diff --git a/mods/skinsdb/meta/character_1946.txt b/mods/skinsdb/meta/character.1946.txt similarity index 100% rename from mods/skinsdb/meta/character_1946.txt rename to mods/skinsdb/meta/character.1946.txt diff --git a/mods/skinsdb/meta/character_1947.txt b/mods/skinsdb/meta/character.1947.txt similarity index 100% rename from mods/skinsdb/meta/character_1947.txt rename to mods/skinsdb/meta/character.1947.txt diff --git a/mods/skinsdb/meta/character_1948.txt b/mods/skinsdb/meta/character.1948.txt similarity index 100% rename from mods/skinsdb/meta/character_1948.txt rename to mods/skinsdb/meta/character.1948.txt diff --git a/mods/skinsdb/meta/character_1949.txt b/mods/skinsdb/meta/character.1949.txt similarity index 100% rename from mods/skinsdb/meta/character_1949.txt rename to mods/skinsdb/meta/character.1949.txt diff --git a/mods/skinsdb/meta/character_195.txt b/mods/skinsdb/meta/character.195.txt similarity index 100% rename from mods/skinsdb/meta/character_195.txt rename to mods/skinsdb/meta/character.195.txt diff --git a/mods/skinsdb/meta/character_1950.txt b/mods/skinsdb/meta/character.1950.txt similarity index 100% rename from mods/skinsdb/meta/character_1950.txt rename to mods/skinsdb/meta/character.1950.txt diff --git a/mods/skinsdb/meta/character_1951.txt b/mods/skinsdb/meta/character.1951.txt similarity index 100% rename from mods/skinsdb/meta/character_1951.txt rename to mods/skinsdb/meta/character.1951.txt diff --git a/mods/skinsdb/meta/character_1952.txt b/mods/skinsdb/meta/character.1952.txt similarity index 100% rename from mods/skinsdb/meta/character_1952.txt rename to mods/skinsdb/meta/character.1952.txt diff --git a/mods/skinsdb/meta/character_1953.txt b/mods/skinsdb/meta/character.1953.txt similarity index 100% rename from mods/skinsdb/meta/character_1953.txt rename to mods/skinsdb/meta/character.1953.txt diff --git a/mods/skinsdb/meta/character_1954.txt b/mods/skinsdb/meta/character.1954.txt similarity index 100% rename from mods/skinsdb/meta/character_1954.txt rename to mods/skinsdb/meta/character.1954.txt diff --git a/mods/skinsdb/meta/character_1955.txt b/mods/skinsdb/meta/character.1955.txt similarity index 100% rename from mods/skinsdb/meta/character_1955.txt rename to mods/skinsdb/meta/character.1955.txt diff --git a/mods/skinsdb/meta/character_1956.txt b/mods/skinsdb/meta/character.1956.txt similarity index 100% rename from mods/skinsdb/meta/character_1956.txt rename to mods/skinsdb/meta/character.1956.txt diff --git a/mods/skinsdb/meta/character_1957.txt b/mods/skinsdb/meta/character.1957.txt similarity index 100% rename from mods/skinsdb/meta/character_1957.txt rename to mods/skinsdb/meta/character.1957.txt diff --git a/mods/skinsdb/meta/character_1958.txt b/mods/skinsdb/meta/character.1958.txt similarity index 100% rename from mods/skinsdb/meta/character_1958.txt rename to mods/skinsdb/meta/character.1958.txt diff --git a/mods/skinsdb/meta/character_1959.txt b/mods/skinsdb/meta/character.1959.txt similarity index 100% rename from mods/skinsdb/meta/character_1959.txt rename to mods/skinsdb/meta/character.1959.txt diff --git a/mods/skinsdb/meta/character_196.txt b/mods/skinsdb/meta/character.196.txt similarity index 100% rename from mods/skinsdb/meta/character_196.txt rename to mods/skinsdb/meta/character.196.txt diff --git a/mods/skinsdb/meta/character_1960.txt b/mods/skinsdb/meta/character.1960.txt similarity index 100% rename from mods/skinsdb/meta/character_1960.txt rename to mods/skinsdb/meta/character.1960.txt diff --git a/mods/skinsdb/meta/character_1961.txt b/mods/skinsdb/meta/character.1961.txt similarity index 100% rename from mods/skinsdb/meta/character_1961.txt rename to mods/skinsdb/meta/character.1961.txt diff --git a/mods/skinsdb/meta/character_1962.txt b/mods/skinsdb/meta/character.1962.txt similarity index 100% rename from mods/skinsdb/meta/character_1962.txt rename to mods/skinsdb/meta/character.1962.txt diff --git a/mods/skinsdb/meta/character_1963.txt b/mods/skinsdb/meta/character.1963.txt similarity index 100% rename from mods/skinsdb/meta/character_1963.txt rename to mods/skinsdb/meta/character.1963.txt diff --git a/mods/skinsdb/meta/character_1964.txt b/mods/skinsdb/meta/character.1964.txt similarity index 100% rename from mods/skinsdb/meta/character_1964.txt rename to mods/skinsdb/meta/character.1964.txt diff --git a/mods/skinsdb/meta/character_1965.txt b/mods/skinsdb/meta/character.1965.txt similarity index 100% rename from mods/skinsdb/meta/character_1965.txt rename to mods/skinsdb/meta/character.1965.txt diff --git a/mods/skinsdb/meta/character_1966.txt b/mods/skinsdb/meta/character.1966.txt similarity index 100% rename from mods/skinsdb/meta/character_1966.txt rename to mods/skinsdb/meta/character.1966.txt diff --git a/mods/skinsdb/meta/character_1967.txt b/mods/skinsdb/meta/character.1967.txt similarity index 100% rename from mods/skinsdb/meta/character_1967.txt rename to mods/skinsdb/meta/character.1967.txt diff --git a/mods/skinsdb/meta/character_1968.txt b/mods/skinsdb/meta/character.1968.txt similarity index 100% rename from mods/skinsdb/meta/character_1968.txt rename to mods/skinsdb/meta/character.1968.txt diff --git a/mods/skinsdb/meta/character_1969.txt b/mods/skinsdb/meta/character.1969.txt similarity index 100% rename from mods/skinsdb/meta/character_1969.txt rename to mods/skinsdb/meta/character.1969.txt diff --git a/mods/skinsdb/meta/character_197.txt b/mods/skinsdb/meta/character.197.txt similarity index 100% rename from mods/skinsdb/meta/character_197.txt rename to mods/skinsdb/meta/character.197.txt diff --git a/mods/skinsdb/meta/character_1970.txt b/mods/skinsdb/meta/character.1970.txt similarity index 100% rename from mods/skinsdb/meta/character_1970.txt rename to mods/skinsdb/meta/character.1970.txt diff --git a/mods/skinsdb/meta/character_1971.txt b/mods/skinsdb/meta/character.1971.txt similarity index 100% rename from mods/skinsdb/meta/character_1971.txt rename to mods/skinsdb/meta/character.1971.txt diff --git a/mods/skinsdb/meta/character_1972.txt b/mods/skinsdb/meta/character.1972.txt similarity index 100% rename from mods/skinsdb/meta/character_1972.txt rename to mods/skinsdb/meta/character.1972.txt diff --git a/mods/skinsdb/meta/character_1973.txt b/mods/skinsdb/meta/character.1973.txt similarity index 100% rename from mods/skinsdb/meta/character_1973.txt rename to mods/skinsdb/meta/character.1973.txt diff --git a/mods/skinsdb/meta/character_1974.txt b/mods/skinsdb/meta/character.1974.txt similarity index 100% rename from mods/skinsdb/meta/character_1974.txt rename to mods/skinsdb/meta/character.1974.txt diff --git a/mods/skinsdb/meta/character_1975.txt b/mods/skinsdb/meta/character.1975.txt similarity index 100% rename from mods/skinsdb/meta/character_1975.txt rename to mods/skinsdb/meta/character.1975.txt diff --git a/mods/skinsdb/meta/character_1976.txt b/mods/skinsdb/meta/character.1976.txt similarity index 100% rename from mods/skinsdb/meta/character_1976.txt rename to mods/skinsdb/meta/character.1976.txt diff --git a/mods/skinsdb/meta/character_1977.txt b/mods/skinsdb/meta/character.1977.txt similarity index 100% rename from mods/skinsdb/meta/character_1977.txt rename to mods/skinsdb/meta/character.1977.txt diff --git a/mods/skinsdb/meta/character_1978.txt b/mods/skinsdb/meta/character.1978.txt similarity index 100% rename from mods/skinsdb/meta/character_1978.txt rename to mods/skinsdb/meta/character.1978.txt diff --git a/mods/skinsdb/meta/character_1979.txt b/mods/skinsdb/meta/character.1979.txt similarity index 100% rename from mods/skinsdb/meta/character_1979.txt rename to mods/skinsdb/meta/character.1979.txt diff --git a/mods/skinsdb/meta/character_198.txt b/mods/skinsdb/meta/character.198.txt similarity index 100% rename from mods/skinsdb/meta/character_198.txt rename to mods/skinsdb/meta/character.198.txt diff --git a/mods/skinsdb/meta/character_1980.txt b/mods/skinsdb/meta/character.1980.txt similarity index 100% rename from mods/skinsdb/meta/character_1980.txt rename to mods/skinsdb/meta/character.1980.txt diff --git a/mods/skinsdb/meta/character_1981.txt b/mods/skinsdb/meta/character.1981.txt similarity index 100% rename from mods/skinsdb/meta/character_1981.txt rename to mods/skinsdb/meta/character.1981.txt diff --git a/mods/skinsdb/meta/character_1982.txt b/mods/skinsdb/meta/character.1982.txt similarity index 100% rename from mods/skinsdb/meta/character_1982.txt rename to mods/skinsdb/meta/character.1982.txt diff --git a/mods/skinsdb/meta/character_1983.txt b/mods/skinsdb/meta/character.1983.txt similarity index 100% rename from mods/skinsdb/meta/character_1983.txt rename to mods/skinsdb/meta/character.1983.txt diff --git a/mods/skinsdb/meta/character_1984.txt b/mods/skinsdb/meta/character.1984.txt similarity index 100% rename from mods/skinsdb/meta/character_1984.txt rename to mods/skinsdb/meta/character.1984.txt diff --git a/mods/skinsdb/meta/character_1985.txt b/mods/skinsdb/meta/character.1985.txt similarity index 100% rename from mods/skinsdb/meta/character_1985.txt rename to mods/skinsdb/meta/character.1985.txt diff --git a/mods/skinsdb/meta/character_1986.txt b/mods/skinsdb/meta/character.1986.txt similarity index 100% rename from mods/skinsdb/meta/character_1986.txt rename to mods/skinsdb/meta/character.1986.txt diff --git a/mods/skinsdb/meta/character_1987.txt b/mods/skinsdb/meta/character.1987.txt similarity index 100% rename from mods/skinsdb/meta/character_1987.txt rename to mods/skinsdb/meta/character.1987.txt diff --git a/mods/skinsdb/meta/character_1988.txt b/mods/skinsdb/meta/character.1988.txt similarity index 100% rename from mods/skinsdb/meta/character_1988.txt rename to mods/skinsdb/meta/character.1988.txt diff --git a/mods/skinsdb/meta/character_1989.txt b/mods/skinsdb/meta/character.1989.txt similarity index 100% rename from mods/skinsdb/meta/character_1989.txt rename to mods/skinsdb/meta/character.1989.txt diff --git a/mods/skinsdb/meta/character_199.txt b/mods/skinsdb/meta/character.199.txt similarity index 100% rename from mods/skinsdb/meta/character_199.txt rename to mods/skinsdb/meta/character.199.txt diff --git a/mods/skinsdb/meta/character_1990.txt b/mods/skinsdb/meta/character.1990.txt similarity index 100% rename from mods/skinsdb/meta/character_1990.txt rename to mods/skinsdb/meta/character.1990.txt diff --git a/mods/skinsdb/meta/character_1991.txt b/mods/skinsdb/meta/character.1991.txt similarity index 100% rename from mods/skinsdb/meta/character_1991.txt rename to mods/skinsdb/meta/character.1991.txt diff --git a/mods/skinsdb/meta/character_1992.txt b/mods/skinsdb/meta/character.1992.txt similarity index 100% rename from mods/skinsdb/meta/character_1992.txt rename to mods/skinsdb/meta/character.1992.txt diff --git a/mods/skinsdb/meta/character_1993.txt b/mods/skinsdb/meta/character.1993.txt similarity index 100% rename from mods/skinsdb/meta/character_1993.txt rename to mods/skinsdb/meta/character.1993.txt diff --git a/mods/skinsdb/meta/character_1994.txt b/mods/skinsdb/meta/character.1994.txt similarity index 100% rename from mods/skinsdb/meta/character_1994.txt rename to mods/skinsdb/meta/character.1994.txt diff --git a/mods/skinsdb/meta/character_1995.txt b/mods/skinsdb/meta/character.1995.txt similarity index 100% rename from mods/skinsdb/meta/character_1995.txt rename to mods/skinsdb/meta/character.1995.txt diff --git a/mods/skinsdb/meta/character_1996.txt b/mods/skinsdb/meta/character.1996.txt similarity index 100% rename from mods/skinsdb/meta/character_1996.txt rename to mods/skinsdb/meta/character.1996.txt diff --git a/mods/skinsdb/meta/character_1997.txt b/mods/skinsdb/meta/character.1997.txt similarity index 100% rename from mods/skinsdb/meta/character_1997.txt rename to mods/skinsdb/meta/character.1997.txt diff --git a/mods/skinsdb/meta/character_1998.txt b/mods/skinsdb/meta/character.1998.txt similarity index 100% rename from mods/skinsdb/meta/character_1998.txt rename to mods/skinsdb/meta/character.1998.txt diff --git a/mods/skinsdb/meta/character_1999.txt b/mods/skinsdb/meta/character.1999.txt similarity index 100% rename from mods/skinsdb/meta/character_1999.txt rename to mods/skinsdb/meta/character.1999.txt diff --git a/mods/skinsdb/meta/character_2.txt b/mods/skinsdb/meta/character.2.txt similarity index 100% rename from mods/skinsdb/meta/character_2.txt rename to mods/skinsdb/meta/character.2.txt diff --git a/mods/skinsdb/meta/character_20.txt b/mods/skinsdb/meta/character.20.txt similarity index 100% rename from mods/skinsdb/meta/character_20.txt rename to mods/skinsdb/meta/character.20.txt diff --git a/mods/skinsdb/meta/character_200.txt b/mods/skinsdb/meta/character.200.txt similarity index 100% rename from mods/skinsdb/meta/character_200.txt rename to mods/skinsdb/meta/character.200.txt diff --git a/mods/skinsdb/meta/character_2000.txt b/mods/skinsdb/meta/character.2000.txt similarity index 100% rename from mods/skinsdb/meta/character_2000.txt rename to mods/skinsdb/meta/character.2000.txt diff --git a/mods/skinsdb/meta/character_2001.txt b/mods/skinsdb/meta/character.2001.txt similarity index 100% rename from mods/skinsdb/meta/character_2001.txt rename to mods/skinsdb/meta/character.2001.txt diff --git a/mods/skinsdb/meta/character_2002.txt b/mods/skinsdb/meta/character.2002.txt similarity index 100% rename from mods/skinsdb/meta/character_2002.txt rename to mods/skinsdb/meta/character.2002.txt diff --git a/mods/skinsdb/meta/character_2003.txt b/mods/skinsdb/meta/character.2003.txt similarity index 100% rename from mods/skinsdb/meta/character_2003.txt rename to mods/skinsdb/meta/character.2003.txt diff --git a/mods/skinsdb/meta/character_2004.txt b/mods/skinsdb/meta/character.2004.txt similarity index 100% rename from mods/skinsdb/meta/character_2004.txt rename to mods/skinsdb/meta/character.2004.txt diff --git a/mods/skinsdb/meta/character_2005.txt b/mods/skinsdb/meta/character.2005.txt similarity index 100% rename from mods/skinsdb/meta/character_2005.txt rename to mods/skinsdb/meta/character.2005.txt diff --git a/mods/skinsdb/meta/character_2006.txt b/mods/skinsdb/meta/character.2006.txt similarity index 100% rename from mods/skinsdb/meta/character_2006.txt rename to mods/skinsdb/meta/character.2006.txt diff --git a/mods/skinsdb/meta/character_2007.txt b/mods/skinsdb/meta/character.2007.txt similarity index 100% rename from mods/skinsdb/meta/character_2007.txt rename to mods/skinsdb/meta/character.2007.txt diff --git a/mods/skinsdb/meta/character_2008.txt b/mods/skinsdb/meta/character.2008.txt similarity index 100% rename from mods/skinsdb/meta/character_2008.txt rename to mods/skinsdb/meta/character.2008.txt diff --git a/mods/skinsdb/meta/character_2009.txt b/mods/skinsdb/meta/character.2009.txt similarity index 100% rename from mods/skinsdb/meta/character_2009.txt rename to mods/skinsdb/meta/character.2009.txt diff --git a/mods/skinsdb/meta/character_201.txt b/mods/skinsdb/meta/character.201.txt similarity index 100% rename from mods/skinsdb/meta/character_201.txt rename to mods/skinsdb/meta/character.201.txt diff --git a/mods/skinsdb/meta/character_2010.txt b/mods/skinsdb/meta/character.2010.txt similarity index 100% rename from mods/skinsdb/meta/character_2010.txt rename to mods/skinsdb/meta/character.2010.txt diff --git a/mods/skinsdb/meta/character_2011.txt b/mods/skinsdb/meta/character.2011.txt similarity index 100% rename from mods/skinsdb/meta/character_2011.txt rename to mods/skinsdb/meta/character.2011.txt diff --git a/mods/skinsdb/meta/character_2012.txt b/mods/skinsdb/meta/character.2012.txt similarity index 100% rename from mods/skinsdb/meta/character_2012.txt rename to mods/skinsdb/meta/character.2012.txt diff --git a/mods/skinsdb/meta/character_2013.txt b/mods/skinsdb/meta/character.2013.txt similarity index 100% rename from mods/skinsdb/meta/character_2013.txt rename to mods/skinsdb/meta/character.2013.txt diff --git a/mods/skinsdb/meta/character_2014.txt b/mods/skinsdb/meta/character.2014.txt similarity index 100% rename from mods/skinsdb/meta/character_2014.txt rename to mods/skinsdb/meta/character.2014.txt diff --git a/mods/skinsdb/meta/character_2015.txt b/mods/skinsdb/meta/character.2015.txt similarity index 100% rename from mods/skinsdb/meta/character_2015.txt rename to mods/skinsdb/meta/character.2015.txt diff --git a/mods/skinsdb/meta/character_2016.txt b/mods/skinsdb/meta/character.2016.txt similarity index 100% rename from mods/skinsdb/meta/character_2016.txt rename to mods/skinsdb/meta/character.2016.txt diff --git a/mods/skinsdb/meta/character_2017.txt b/mods/skinsdb/meta/character.2017.txt similarity index 100% rename from mods/skinsdb/meta/character_2017.txt rename to mods/skinsdb/meta/character.2017.txt diff --git a/mods/skinsdb/meta/character_2018.txt b/mods/skinsdb/meta/character.2018.txt similarity index 100% rename from mods/skinsdb/meta/character_2018.txt rename to mods/skinsdb/meta/character.2018.txt diff --git a/mods/skinsdb/meta/character_2019.txt b/mods/skinsdb/meta/character.2019.txt similarity index 100% rename from mods/skinsdb/meta/character_2019.txt rename to mods/skinsdb/meta/character.2019.txt diff --git a/mods/skinsdb/meta/character_2020.txt b/mods/skinsdb/meta/character.2020.txt similarity index 100% rename from mods/skinsdb/meta/character_2020.txt rename to mods/skinsdb/meta/character.2020.txt diff --git a/mods/skinsdb/meta/character_2021.txt b/mods/skinsdb/meta/character.2021.txt similarity index 100% rename from mods/skinsdb/meta/character_2021.txt rename to mods/skinsdb/meta/character.2021.txt diff --git a/mods/skinsdb/meta/character_2022.txt b/mods/skinsdb/meta/character.2022.txt similarity index 100% rename from mods/skinsdb/meta/character_2022.txt rename to mods/skinsdb/meta/character.2022.txt diff --git a/mods/skinsdb/meta/character_2023.txt b/mods/skinsdb/meta/character.2023.txt similarity index 56% rename from mods/skinsdb/meta/character_2023.txt rename to mods/skinsdb/meta/character.2023.txt index 24738310..38e39e0f 100644 --- a/mods/skinsdb/meta/character_2023.txt +++ b/mods/skinsdb/meta/character.2023.txt @@ -1,3 +1,3 @@ josegamestest_0 -Jose Anastácio +Jose Anastácio CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2024.txt b/mods/skinsdb/meta/character.2024.txt similarity index 100% rename from mods/skinsdb/meta/character_2024.txt rename to mods/skinsdb/meta/character.2024.txt diff --git a/mods/skinsdb/meta/character_2025.txt b/mods/skinsdb/meta/character.2025.txt similarity index 100% rename from mods/skinsdb/meta/character_2025.txt rename to mods/skinsdb/meta/character.2025.txt diff --git a/mods/skinsdb/meta/character_2026.txt b/mods/skinsdb/meta/character.2026.txt similarity index 100% rename from mods/skinsdb/meta/character_2026.txt rename to mods/skinsdb/meta/character.2026.txt diff --git a/mods/skinsdb/meta/character_2027.txt b/mods/skinsdb/meta/character.2027.txt similarity index 100% rename from mods/skinsdb/meta/character_2027.txt rename to mods/skinsdb/meta/character.2027.txt diff --git a/mods/skinsdb/meta/character_2028.txt b/mods/skinsdb/meta/character.2028.txt similarity index 100% rename from mods/skinsdb/meta/character_2028.txt rename to mods/skinsdb/meta/character.2028.txt diff --git a/mods/skinsdb/meta/character_2029.txt b/mods/skinsdb/meta/character.2029.txt similarity index 100% rename from mods/skinsdb/meta/character_2029.txt rename to mods/skinsdb/meta/character.2029.txt diff --git a/mods/skinsdb/meta/character_203.txt b/mods/skinsdb/meta/character.203.txt similarity index 100% rename from mods/skinsdb/meta/character_203.txt rename to mods/skinsdb/meta/character.203.txt diff --git a/mods/skinsdb/meta/character_2030.txt b/mods/skinsdb/meta/character.2030.txt similarity index 100% rename from mods/skinsdb/meta/character_2030.txt rename to mods/skinsdb/meta/character.2030.txt diff --git a/mods/skinsdb/meta/character_2031.txt b/mods/skinsdb/meta/character.2031.txt similarity index 100% rename from mods/skinsdb/meta/character_2031.txt rename to mods/skinsdb/meta/character.2031.txt diff --git a/mods/skinsdb/meta/character_2032.txt b/mods/skinsdb/meta/character.2032.txt similarity index 100% rename from mods/skinsdb/meta/character_2032.txt rename to mods/skinsdb/meta/character.2032.txt diff --git a/mods/skinsdb/meta/character_2033.txt b/mods/skinsdb/meta/character.2033.txt similarity index 100% rename from mods/skinsdb/meta/character_2033.txt rename to mods/skinsdb/meta/character.2033.txt diff --git a/mods/skinsdb/meta/character_2034.txt b/mods/skinsdb/meta/character.2034.txt similarity index 100% rename from mods/skinsdb/meta/character_2034.txt rename to mods/skinsdb/meta/character.2034.txt diff --git a/mods/skinsdb/meta/character_2035.txt b/mods/skinsdb/meta/character.2035.txt similarity index 100% rename from mods/skinsdb/meta/character_2035.txt rename to mods/skinsdb/meta/character.2035.txt diff --git a/mods/skinsdb/meta/character_2036.txt b/mods/skinsdb/meta/character.2036.txt similarity index 100% rename from mods/skinsdb/meta/character_2036.txt rename to mods/skinsdb/meta/character.2036.txt diff --git a/mods/skinsdb/meta/character_2037.txt b/mods/skinsdb/meta/character.2037.txt similarity index 100% rename from mods/skinsdb/meta/character_2037.txt rename to mods/skinsdb/meta/character.2037.txt diff --git a/mods/skinsdb/meta/character_2038.txt b/mods/skinsdb/meta/character.2038.txt similarity index 100% rename from mods/skinsdb/meta/character_2038.txt rename to mods/skinsdb/meta/character.2038.txt diff --git a/mods/skinsdb/meta/character_2039.txt b/mods/skinsdb/meta/character.2039.txt similarity index 100% rename from mods/skinsdb/meta/character_2039.txt rename to mods/skinsdb/meta/character.2039.txt diff --git a/mods/skinsdb/meta/character_2040.txt b/mods/skinsdb/meta/character.2040.txt similarity index 100% rename from mods/skinsdb/meta/character_2040.txt rename to mods/skinsdb/meta/character.2040.txt diff --git a/mods/skinsdb/meta/character_2041.txt b/mods/skinsdb/meta/character.2041.txt similarity index 100% rename from mods/skinsdb/meta/character_2041.txt rename to mods/skinsdb/meta/character.2041.txt diff --git a/mods/skinsdb/meta/character_2042.txt b/mods/skinsdb/meta/character.2042.txt similarity index 100% rename from mods/skinsdb/meta/character_2042.txt rename to mods/skinsdb/meta/character.2042.txt diff --git a/mods/skinsdb/meta/character_2043.txt b/mods/skinsdb/meta/character.2043.txt similarity index 100% rename from mods/skinsdb/meta/character_2043.txt rename to mods/skinsdb/meta/character.2043.txt diff --git a/mods/skinsdb/meta/character_2044.txt b/mods/skinsdb/meta/character.2044.txt similarity index 100% rename from mods/skinsdb/meta/character_2044.txt rename to mods/skinsdb/meta/character.2044.txt diff --git a/mods/skinsdb/meta/character_2045.txt b/mods/skinsdb/meta/character.2045.txt similarity index 100% rename from mods/skinsdb/meta/character_2045.txt rename to mods/skinsdb/meta/character.2045.txt diff --git a/mods/skinsdb/meta/character_2046.txt b/mods/skinsdb/meta/character.2046.txt similarity index 100% rename from mods/skinsdb/meta/character_2046.txt rename to mods/skinsdb/meta/character.2046.txt diff --git a/mods/skinsdb/meta/character_2047.txt b/mods/skinsdb/meta/character.2047.txt similarity index 100% rename from mods/skinsdb/meta/character_2047.txt rename to mods/skinsdb/meta/character.2047.txt diff --git a/mods/skinsdb/meta/character_2048.txt b/mods/skinsdb/meta/character.2048.txt similarity index 100% rename from mods/skinsdb/meta/character_2048.txt rename to mods/skinsdb/meta/character.2048.txt diff --git a/mods/skinsdb/meta/character_2049.txt b/mods/skinsdb/meta/character.2049.txt similarity index 100% rename from mods/skinsdb/meta/character_2049.txt rename to mods/skinsdb/meta/character.2049.txt diff --git a/mods/skinsdb/meta/character_205.txt b/mods/skinsdb/meta/character.205.txt similarity index 100% rename from mods/skinsdb/meta/character_205.txt rename to mods/skinsdb/meta/character.205.txt diff --git a/mods/skinsdb/meta/character_2050.txt b/mods/skinsdb/meta/character.2050.txt similarity index 100% rename from mods/skinsdb/meta/character_2050.txt rename to mods/skinsdb/meta/character.2050.txt diff --git a/mods/skinsdb/meta/character_2051.txt b/mods/skinsdb/meta/character.2051.txt similarity index 100% rename from mods/skinsdb/meta/character_2051.txt rename to mods/skinsdb/meta/character.2051.txt diff --git a/mods/skinsdb/meta/character_2052.txt b/mods/skinsdb/meta/character.2052.txt similarity index 57% rename from mods/skinsdb/meta/character_2052.txt rename to mods/skinsdb/meta/character.2052.txt index 7e2b4ad2..a7860cd8 100644 --- a/mods/skinsdb/meta/character_2052.txt +++ b/mods/skinsdb/meta/character.2052.txt @@ -1,3 +1,3 @@ -X Kostüm +X Kostüm Phill CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2053.txt b/mods/skinsdb/meta/character.2053.txt similarity index 100% rename from mods/skinsdb/meta/character_2053.txt rename to mods/skinsdb/meta/character.2053.txt diff --git a/mods/skinsdb/meta/character_2054.txt b/mods/skinsdb/meta/character.2054.txt similarity index 100% rename from mods/skinsdb/meta/character_2054.txt rename to mods/skinsdb/meta/character.2054.txt diff --git a/mods/skinsdb/meta/character_2055.txt b/mods/skinsdb/meta/character.2055.txt similarity index 100% rename from mods/skinsdb/meta/character_2055.txt rename to mods/skinsdb/meta/character.2055.txt diff --git a/mods/skinsdb/meta/character_2056.txt b/mods/skinsdb/meta/character.2056.txt similarity index 100% rename from mods/skinsdb/meta/character_2056.txt rename to mods/skinsdb/meta/character.2056.txt diff --git a/mods/skinsdb/meta/character_2057.txt b/mods/skinsdb/meta/character.2057.txt similarity index 100% rename from mods/skinsdb/meta/character_2057.txt rename to mods/skinsdb/meta/character.2057.txt diff --git a/mods/skinsdb/meta/character_2058.txt b/mods/skinsdb/meta/character.2058.txt similarity index 100% rename from mods/skinsdb/meta/character_2058.txt rename to mods/skinsdb/meta/character.2058.txt diff --git a/mods/skinsdb/meta/character_2059.txt b/mods/skinsdb/meta/character.2059.txt similarity index 100% rename from mods/skinsdb/meta/character_2059.txt rename to mods/skinsdb/meta/character.2059.txt diff --git a/mods/skinsdb/meta/character_206.txt b/mods/skinsdb/meta/character.206.txt similarity index 100% rename from mods/skinsdb/meta/character_206.txt rename to mods/skinsdb/meta/character.206.txt diff --git a/mods/skinsdb/meta/character_2060.txt b/mods/skinsdb/meta/character.2060.txt similarity index 100% rename from mods/skinsdb/meta/character_2060.txt rename to mods/skinsdb/meta/character.2060.txt diff --git a/mods/skinsdb/meta/character_2061.txt b/mods/skinsdb/meta/character.2061.txt similarity index 100% rename from mods/skinsdb/meta/character_2061.txt rename to mods/skinsdb/meta/character.2061.txt diff --git a/mods/skinsdb/meta/character_2062.txt b/mods/skinsdb/meta/character.2062.txt similarity index 100% rename from mods/skinsdb/meta/character_2062.txt rename to mods/skinsdb/meta/character.2062.txt diff --git a/mods/skinsdb/meta/character_2063.txt b/mods/skinsdb/meta/character.2063.txt similarity index 100% rename from mods/skinsdb/meta/character_2063.txt rename to mods/skinsdb/meta/character.2063.txt diff --git a/mods/skinsdb/meta/character_2064.txt b/mods/skinsdb/meta/character.2064.txt similarity index 100% rename from mods/skinsdb/meta/character_2064.txt rename to mods/skinsdb/meta/character.2064.txt diff --git a/mods/skinsdb/meta/character_2065.txt b/mods/skinsdb/meta/character.2065.txt similarity index 100% rename from mods/skinsdb/meta/character_2065.txt rename to mods/skinsdb/meta/character.2065.txt diff --git a/mods/skinsdb/meta/character_2066.txt b/mods/skinsdb/meta/character.2066.txt similarity index 100% rename from mods/skinsdb/meta/character_2066.txt rename to mods/skinsdb/meta/character.2066.txt diff --git a/mods/skinsdb/meta/character_2067.txt b/mods/skinsdb/meta/character.2067.txt similarity index 100% rename from mods/skinsdb/meta/character_2067.txt rename to mods/skinsdb/meta/character.2067.txt diff --git a/mods/skinsdb/meta/character_2068.txt b/mods/skinsdb/meta/character.2068.txt similarity index 100% rename from mods/skinsdb/meta/character_2068.txt rename to mods/skinsdb/meta/character.2068.txt diff --git a/mods/skinsdb/meta/character_2069.txt b/mods/skinsdb/meta/character.2069.txt similarity index 100% rename from mods/skinsdb/meta/character_2069.txt rename to mods/skinsdb/meta/character.2069.txt diff --git a/mods/skinsdb/meta/character_207.txt b/mods/skinsdb/meta/character.207.txt similarity index 100% rename from mods/skinsdb/meta/character_207.txt rename to mods/skinsdb/meta/character.207.txt diff --git a/mods/skinsdb/meta/character_2070.txt b/mods/skinsdb/meta/character.2070.txt similarity index 100% rename from mods/skinsdb/meta/character_2070.txt rename to mods/skinsdb/meta/character.2070.txt diff --git a/mods/skinsdb/meta/character_2071.txt b/mods/skinsdb/meta/character.2071.txt similarity index 100% rename from mods/skinsdb/meta/character_2071.txt rename to mods/skinsdb/meta/character.2071.txt diff --git a/mods/skinsdb/meta/character_2072.txt b/mods/skinsdb/meta/character.2072.txt similarity index 100% rename from mods/skinsdb/meta/character_2072.txt rename to mods/skinsdb/meta/character.2072.txt diff --git a/mods/skinsdb/meta/character_2073.txt b/mods/skinsdb/meta/character.2073.txt similarity index 100% rename from mods/skinsdb/meta/character_2073.txt rename to mods/skinsdb/meta/character.2073.txt diff --git a/mods/skinsdb/meta/character_2074.txt b/mods/skinsdb/meta/character.2074.txt similarity index 100% rename from mods/skinsdb/meta/character_2074.txt rename to mods/skinsdb/meta/character.2074.txt diff --git a/mods/skinsdb/meta/character_2075.txt b/mods/skinsdb/meta/character.2075.txt similarity index 100% rename from mods/skinsdb/meta/character_2075.txt rename to mods/skinsdb/meta/character.2075.txt diff --git a/mods/skinsdb/meta/character_2076.txt b/mods/skinsdb/meta/character.2076.txt similarity index 100% rename from mods/skinsdb/meta/character_2076.txt rename to mods/skinsdb/meta/character.2076.txt diff --git a/mods/skinsdb/meta/character_2077.txt b/mods/skinsdb/meta/character.2077.txt similarity index 100% rename from mods/skinsdb/meta/character_2077.txt rename to mods/skinsdb/meta/character.2077.txt diff --git a/mods/skinsdb/meta/character_2078.txt b/mods/skinsdb/meta/character.2078.txt similarity index 100% rename from mods/skinsdb/meta/character_2078.txt rename to mods/skinsdb/meta/character.2078.txt diff --git a/mods/skinsdb/meta/character_2079.txt b/mods/skinsdb/meta/character.2079.txt similarity index 100% rename from mods/skinsdb/meta/character_2079.txt rename to mods/skinsdb/meta/character.2079.txt diff --git a/mods/skinsdb/meta/character_208.txt b/mods/skinsdb/meta/character.208.txt similarity index 100% rename from mods/skinsdb/meta/character_208.txt rename to mods/skinsdb/meta/character.208.txt diff --git a/mods/skinsdb/meta/character_2080.txt b/mods/skinsdb/meta/character.2080.txt similarity index 100% rename from mods/skinsdb/meta/character_2080.txt rename to mods/skinsdb/meta/character.2080.txt diff --git a/mods/skinsdb/meta/character_2081.txt b/mods/skinsdb/meta/character.2081.txt similarity index 100% rename from mods/skinsdb/meta/character_2081.txt rename to mods/skinsdb/meta/character.2081.txt diff --git a/mods/skinsdb/meta/character_2082.txt b/mods/skinsdb/meta/character.2082.txt similarity index 100% rename from mods/skinsdb/meta/character_2082.txt rename to mods/skinsdb/meta/character.2082.txt diff --git a/mods/skinsdb/meta/character_2083.txt b/mods/skinsdb/meta/character.2083.txt similarity index 100% rename from mods/skinsdb/meta/character_2083.txt rename to mods/skinsdb/meta/character.2083.txt diff --git a/mods/skinsdb/meta/character_2084.txt b/mods/skinsdb/meta/character.2084.txt similarity index 100% rename from mods/skinsdb/meta/character_2084.txt rename to mods/skinsdb/meta/character.2084.txt diff --git a/mods/skinsdb/meta/character_2085.txt b/mods/skinsdb/meta/character.2085.txt similarity index 100% rename from mods/skinsdb/meta/character_2085.txt rename to mods/skinsdb/meta/character.2085.txt diff --git a/mods/skinsdb/meta/character_2086.txt b/mods/skinsdb/meta/character.2086.txt similarity index 100% rename from mods/skinsdb/meta/character_2086.txt rename to mods/skinsdb/meta/character.2086.txt diff --git a/mods/skinsdb/meta/character_2087.txt b/mods/skinsdb/meta/character.2087.txt similarity index 100% rename from mods/skinsdb/meta/character_2087.txt rename to mods/skinsdb/meta/character.2087.txt diff --git a/mods/skinsdb/meta/character_2088.txt b/mods/skinsdb/meta/character.2088.txt similarity index 100% rename from mods/skinsdb/meta/character_2088.txt rename to mods/skinsdb/meta/character.2088.txt diff --git a/mods/skinsdb/meta/character_2089.txt b/mods/skinsdb/meta/character.2089.txt similarity index 100% rename from mods/skinsdb/meta/character_2089.txt rename to mods/skinsdb/meta/character.2089.txt diff --git a/mods/skinsdb/meta/character_209.txt b/mods/skinsdb/meta/character.209.txt similarity index 100% rename from mods/skinsdb/meta/character_209.txt rename to mods/skinsdb/meta/character.209.txt diff --git a/mods/skinsdb/meta/character_2090.txt b/mods/skinsdb/meta/character.2090.txt similarity index 100% rename from mods/skinsdb/meta/character_2090.txt rename to mods/skinsdb/meta/character.2090.txt diff --git a/mods/skinsdb/meta/character_2091.txt b/mods/skinsdb/meta/character.2091.txt similarity index 100% rename from mods/skinsdb/meta/character_2091.txt rename to mods/skinsdb/meta/character.2091.txt diff --git a/mods/skinsdb/meta/character_2092.txt b/mods/skinsdb/meta/character.2092.txt similarity index 100% rename from mods/skinsdb/meta/character_2092.txt rename to mods/skinsdb/meta/character.2092.txt diff --git a/mods/skinsdb/meta/character_2093.txt b/mods/skinsdb/meta/character.2093.txt similarity index 100% rename from mods/skinsdb/meta/character_2093.txt rename to mods/skinsdb/meta/character.2093.txt diff --git a/mods/skinsdb/meta/character_2094.txt b/mods/skinsdb/meta/character.2094.txt similarity index 100% rename from mods/skinsdb/meta/character_2094.txt rename to mods/skinsdb/meta/character.2094.txt diff --git a/mods/skinsdb/meta/character_2095.txt b/mods/skinsdb/meta/character.2095.txt similarity index 100% rename from mods/skinsdb/meta/character_2095.txt rename to mods/skinsdb/meta/character.2095.txt diff --git a/mods/skinsdb/meta/character_2096.txt b/mods/skinsdb/meta/character.2096.txt similarity index 100% rename from mods/skinsdb/meta/character_2096.txt rename to mods/skinsdb/meta/character.2096.txt diff --git a/mods/skinsdb/meta/character_2097.txt b/mods/skinsdb/meta/character.2097.txt similarity index 100% rename from mods/skinsdb/meta/character_2097.txt rename to mods/skinsdb/meta/character.2097.txt diff --git a/mods/skinsdb/meta/character_2098.txt b/mods/skinsdb/meta/character.2098.txt similarity index 100% rename from mods/skinsdb/meta/character_2098.txt rename to mods/skinsdb/meta/character.2098.txt diff --git a/mods/skinsdb/meta/character_2099.txt b/mods/skinsdb/meta/character.2099.txt similarity index 100% rename from mods/skinsdb/meta/character_2099.txt rename to mods/skinsdb/meta/character.2099.txt diff --git a/mods/skinsdb/meta/character_21.txt b/mods/skinsdb/meta/character.21.txt similarity index 100% rename from mods/skinsdb/meta/character_21.txt rename to mods/skinsdb/meta/character.21.txt diff --git a/mods/skinsdb/meta/character_210.txt b/mods/skinsdb/meta/character.210.txt similarity index 100% rename from mods/skinsdb/meta/character_210.txt rename to mods/skinsdb/meta/character.210.txt diff --git a/mods/skinsdb/meta/character_2100.txt b/mods/skinsdb/meta/character.2100.txt similarity index 100% rename from mods/skinsdb/meta/character_2100.txt rename to mods/skinsdb/meta/character.2100.txt diff --git a/mods/skinsdb/meta/character_2101.txt b/mods/skinsdb/meta/character.2101.txt similarity index 100% rename from mods/skinsdb/meta/character_2101.txt rename to mods/skinsdb/meta/character.2101.txt diff --git a/mods/skinsdb/meta/character_2102.txt b/mods/skinsdb/meta/character.2102.txt similarity index 100% rename from mods/skinsdb/meta/character_2102.txt rename to mods/skinsdb/meta/character.2102.txt diff --git a/mods/skinsdb/meta/character_2103.txt b/mods/skinsdb/meta/character.2103.txt similarity index 100% rename from mods/skinsdb/meta/character_2103.txt rename to mods/skinsdb/meta/character.2103.txt diff --git a/mods/skinsdb/meta/character_2104.txt b/mods/skinsdb/meta/character.2104.txt similarity index 100% rename from mods/skinsdb/meta/character_2104.txt rename to mods/skinsdb/meta/character.2104.txt diff --git a/mods/skinsdb/meta/character_2105.txt b/mods/skinsdb/meta/character.2105.txt similarity index 100% rename from mods/skinsdb/meta/character_2105.txt rename to mods/skinsdb/meta/character.2105.txt diff --git a/mods/skinsdb/meta/character_2106.txt b/mods/skinsdb/meta/character.2106.txt similarity index 100% rename from mods/skinsdb/meta/character_2106.txt rename to mods/skinsdb/meta/character.2106.txt diff --git a/mods/skinsdb/meta/character_2107.txt b/mods/skinsdb/meta/character.2107.txt similarity index 100% rename from mods/skinsdb/meta/character_2107.txt rename to mods/skinsdb/meta/character.2107.txt diff --git a/mods/skinsdb/meta/character_2108.txt b/mods/skinsdb/meta/character.2108.txt similarity index 100% rename from mods/skinsdb/meta/character_2108.txt rename to mods/skinsdb/meta/character.2108.txt diff --git a/mods/skinsdb/meta/character_2109.txt b/mods/skinsdb/meta/character.2109.txt similarity index 100% rename from mods/skinsdb/meta/character_2109.txt rename to mods/skinsdb/meta/character.2109.txt diff --git a/mods/skinsdb/meta/character_211.txt b/mods/skinsdb/meta/character.211.txt similarity index 100% rename from mods/skinsdb/meta/character_211.txt rename to mods/skinsdb/meta/character.211.txt diff --git a/mods/skinsdb/meta/character_2110.txt b/mods/skinsdb/meta/character.2110.txt similarity index 100% rename from mods/skinsdb/meta/character_2110.txt rename to mods/skinsdb/meta/character.2110.txt diff --git a/mods/skinsdb/meta/character_2111.txt b/mods/skinsdb/meta/character.2111.txt similarity index 100% rename from mods/skinsdb/meta/character_2111.txt rename to mods/skinsdb/meta/character.2111.txt diff --git a/mods/skinsdb/meta/character_2112.txt b/mods/skinsdb/meta/character.2112.txt similarity index 100% rename from mods/skinsdb/meta/character_2112.txt rename to mods/skinsdb/meta/character.2112.txt diff --git a/mods/skinsdb/meta/character_2114.txt b/mods/skinsdb/meta/character.2114.txt similarity index 100% rename from mods/skinsdb/meta/character_2114.txt rename to mods/skinsdb/meta/character.2114.txt diff --git a/mods/skinsdb/meta/character_2115.txt b/mods/skinsdb/meta/character.2115.txt similarity index 100% rename from mods/skinsdb/meta/character_2115.txt rename to mods/skinsdb/meta/character.2115.txt diff --git a/mods/skinsdb/meta/character_2116.txt b/mods/skinsdb/meta/character.2116.txt similarity index 100% rename from mods/skinsdb/meta/character_2116.txt rename to mods/skinsdb/meta/character.2116.txt diff --git a/mods/skinsdb/meta/character_2117.txt b/mods/skinsdb/meta/character.2117.txt similarity index 100% rename from mods/skinsdb/meta/character_2117.txt rename to mods/skinsdb/meta/character.2117.txt diff --git a/mods/skinsdb/meta/character_2118.txt b/mods/skinsdb/meta/character.2118.txt similarity index 100% rename from mods/skinsdb/meta/character_2118.txt rename to mods/skinsdb/meta/character.2118.txt diff --git a/mods/skinsdb/meta/character_2119.txt b/mods/skinsdb/meta/character.2119.txt similarity index 100% rename from mods/skinsdb/meta/character_2119.txt rename to mods/skinsdb/meta/character.2119.txt diff --git a/mods/skinsdb/meta/character_212.txt b/mods/skinsdb/meta/character.212.txt similarity index 100% rename from mods/skinsdb/meta/character_212.txt rename to mods/skinsdb/meta/character.212.txt diff --git a/mods/skinsdb/meta/character_2120.txt b/mods/skinsdb/meta/character.2120.txt similarity index 100% rename from mods/skinsdb/meta/character_2120.txt rename to mods/skinsdb/meta/character.2120.txt diff --git a/mods/skinsdb/meta/character_2121.txt b/mods/skinsdb/meta/character.2121.txt similarity index 100% rename from mods/skinsdb/meta/character_2121.txt rename to mods/skinsdb/meta/character.2121.txt diff --git a/mods/skinsdb/meta/character_2122.txt b/mods/skinsdb/meta/character.2122.txt similarity index 100% rename from mods/skinsdb/meta/character_2122.txt rename to mods/skinsdb/meta/character.2122.txt diff --git a/mods/skinsdb/meta/character_2123.txt b/mods/skinsdb/meta/character.2123.txt similarity index 100% rename from mods/skinsdb/meta/character_2123.txt rename to mods/skinsdb/meta/character.2123.txt diff --git a/mods/skinsdb/meta/character_2124.txt b/mods/skinsdb/meta/character.2124.txt similarity index 100% rename from mods/skinsdb/meta/character_2124.txt rename to mods/skinsdb/meta/character.2124.txt diff --git a/mods/skinsdb/meta/character_2125.txt b/mods/skinsdb/meta/character.2125.txt similarity index 100% rename from mods/skinsdb/meta/character_2125.txt rename to mods/skinsdb/meta/character.2125.txt diff --git a/mods/skinsdb/meta/character_2126.txt b/mods/skinsdb/meta/character.2126.txt similarity index 100% rename from mods/skinsdb/meta/character_2126.txt rename to mods/skinsdb/meta/character.2126.txt diff --git a/mods/skinsdb/meta/character_2127.txt b/mods/skinsdb/meta/character.2127.txt similarity index 100% rename from mods/skinsdb/meta/character_2127.txt rename to mods/skinsdb/meta/character.2127.txt diff --git a/mods/skinsdb/meta/character_2128.txt b/mods/skinsdb/meta/character.2128.txt similarity index 100% rename from mods/skinsdb/meta/character_2128.txt rename to mods/skinsdb/meta/character.2128.txt diff --git a/mods/skinsdb/meta/character_2129.txt b/mods/skinsdb/meta/character.2129.txt similarity index 100% rename from mods/skinsdb/meta/character_2129.txt rename to mods/skinsdb/meta/character.2129.txt diff --git a/mods/skinsdb/meta/character_213.txt b/mods/skinsdb/meta/character.213.txt similarity index 100% rename from mods/skinsdb/meta/character_213.txt rename to mods/skinsdb/meta/character.213.txt diff --git a/mods/skinsdb/meta/character_2130.txt b/mods/skinsdb/meta/character.2130.txt similarity index 100% rename from mods/skinsdb/meta/character_2130.txt rename to mods/skinsdb/meta/character.2130.txt diff --git a/mods/skinsdb/meta/character_2131.txt b/mods/skinsdb/meta/character.2131.txt similarity index 100% rename from mods/skinsdb/meta/character_2131.txt rename to mods/skinsdb/meta/character.2131.txt diff --git a/mods/skinsdb/meta/character_2132.txt b/mods/skinsdb/meta/character.2132.txt similarity index 100% rename from mods/skinsdb/meta/character_2132.txt rename to mods/skinsdb/meta/character.2132.txt diff --git a/mods/skinsdb/meta/character_2133.txt b/mods/skinsdb/meta/character.2133.txt similarity index 100% rename from mods/skinsdb/meta/character_2133.txt rename to mods/skinsdb/meta/character.2133.txt diff --git a/mods/skinsdb/meta/character_2134.txt b/mods/skinsdb/meta/character.2134.txt similarity index 100% rename from mods/skinsdb/meta/character_2134.txt rename to mods/skinsdb/meta/character.2134.txt diff --git a/mods/skinsdb/meta/character_2135.txt b/mods/skinsdb/meta/character.2135.txt similarity index 100% rename from mods/skinsdb/meta/character_2135.txt rename to mods/skinsdb/meta/character.2135.txt diff --git a/mods/skinsdb/meta/character_2136.txt b/mods/skinsdb/meta/character.2136.txt similarity index 100% rename from mods/skinsdb/meta/character_2136.txt rename to mods/skinsdb/meta/character.2136.txt diff --git a/mods/skinsdb/meta/character_2137.txt b/mods/skinsdb/meta/character.2137.txt similarity index 100% rename from mods/skinsdb/meta/character_2137.txt rename to mods/skinsdb/meta/character.2137.txt diff --git a/mods/skinsdb/meta/character_2138.txt b/mods/skinsdb/meta/character.2138.txt similarity index 100% rename from mods/skinsdb/meta/character_2138.txt rename to mods/skinsdb/meta/character.2138.txt diff --git a/mods/skinsdb/meta/character_2139.txt b/mods/skinsdb/meta/character.2139.txt similarity index 100% rename from mods/skinsdb/meta/character_2139.txt rename to mods/skinsdb/meta/character.2139.txt diff --git a/mods/skinsdb/meta/character_214.txt b/mods/skinsdb/meta/character.214.txt similarity index 100% rename from mods/skinsdb/meta/character_214.txt rename to mods/skinsdb/meta/character.214.txt diff --git a/mods/skinsdb/meta/character_2140.txt b/mods/skinsdb/meta/character.2140.txt similarity index 100% rename from mods/skinsdb/meta/character_2140.txt rename to mods/skinsdb/meta/character.2140.txt diff --git a/mods/skinsdb/meta/character_2141.txt b/mods/skinsdb/meta/character.2141.txt similarity index 100% rename from mods/skinsdb/meta/character_2141.txt rename to mods/skinsdb/meta/character.2141.txt diff --git a/mods/skinsdb/meta/character_2142.txt b/mods/skinsdb/meta/character.2142.txt similarity index 100% rename from mods/skinsdb/meta/character_2142.txt rename to mods/skinsdb/meta/character.2142.txt diff --git a/mods/skinsdb/meta/character_2143.txt b/mods/skinsdb/meta/character.2143.txt similarity index 100% rename from mods/skinsdb/meta/character_2143.txt rename to mods/skinsdb/meta/character.2143.txt diff --git a/mods/skinsdb/meta/character_2144.txt b/mods/skinsdb/meta/character.2144.txt similarity index 100% rename from mods/skinsdb/meta/character_2144.txt rename to mods/skinsdb/meta/character.2144.txt diff --git a/mods/skinsdb/meta/character_2145.txt b/mods/skinsdb/meta/character.2145.txt similarity index 100% rename from mods/skinsdb/meta/character_2145.txt rename to mods/skinsdb/meta/character.2145.txt diff --git a/mods/skinsdb/meta/character_2146.txt b/mods/skinsdb/meta/character.2146.txt similarity index 100% rename from mods/skinsdb/meta/character_2146.txt rename to mods/skinsdb/meta/character.2146.txt diff --git a/mods/skinsdb/meta/character_2147.txt b/mods/skinsdb/meta/character.2147.txt similarity index 100% rename from mods/skinsdb/meta/character_2147.txt rename to mods/skinsdb/meta/character.2147.txt diff --git a/mods/skinsdb/meta/character_2148.txt b/mods/skinsdb/meta/character.2148.txt similarity index 100% rename from mods/skinsdb/meta/character_2148.txt rename to mods/skinsdb/meta/character.2148.txt diff --git a/mods/skinsdb/meta/character_2149.txt b/mods/skinsdb/meta/character.2149.txt similarity index 100% rename from mods/skinsdb/meta/character_2149.txt rename to mods/skinsdb/meta/character.2149.txt diff --git a/mods/skinsdb/meta/character_215.txt b/mods/skinsdb/meta/character.215.txt similarity index 100% rename from mods/skinsdb/meta/character_215.txt rename to mods/skinsdb/meta/character.215.txt diff --git a/mods/skinsdb/meta/character_2150.txt b/mods/skinsdb/meta/character.2150.txt similarity index 100% rename from mods/skinsdb/meta/character_2150.txt rename to mods/skinsdb/meta/character.2150.txt diff --git a/mods/skinsdb/meta/character_2151.txt b/mods/skinsdb/meta/character.2151.txt similarity index 100% rename from mods/skinsdb/meta/character_2151.txt rename to mods/skinsdb/meta/character.2151.txt diff --git a/mods/skinsdb/meta/character_2152.txt b/mods/skinsdb/meta/character.2152.txt similarity index 100% rename from mods/skinsdb/meta/character_2152.txt rename to mods/skinsdb/meta/character.2152.txt diff --git a/mods/skinsdb/meta/character_2153.txt b/mods/skinsdb/meta/character.2153.txt similarity index 100% rename from mods/skinsdb/meta/character_2153.txt rename to mods/skinsdb/meta/character.2153.txt diff --git a/mods/skinsdb/meta/character.2154.txt b/mods/skinsdb/meta/character.2154.txt new file mode 100644 index 00000000..60203cd0 --- /dev/null +++ b/mods/skinsdb/meta/character.2154.txt @@ -0,0 +1,3 @@ +ICE angle +Junetta +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2155.txt b/mods/skinsdb/meta/character.2155.txt new file mode 100644 index 00000000..242780a7 --- /dev/null +++ b/mods/skinsdb/meta/character.2155.txt @@ -0,0 +1,3 @@ +Bella +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2156.txt b/mods/skinsdb/meta/character.2156.txt new file mode 100644 index 00000000..d9b79d5a --- /dev/null +++ b/mods/skinsdb/meta/character.2156.txt @@ -0,0 +1,3 @@ +YourMom +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2157.txt b/mods/skinsdb/meta/character.2157.txt new file mode 100644 index 00000000..a0f6790c --- /dev/null +++ b/mods/skinsdb/meta/character.2157.txt @@ -0,0 +1,3 @@ +GhostGirl +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2158.txt b/mods/skinsdb/meta/character.2158.txt new file mode 100644 index 00000000..1d063109 --- /dev/null +++ b/mods/skinsdb/meta/character.2158.txt @@ -0,0 +1,3 @@ +Juliana +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2159.txt b/mods/skinsdb/meta/character.2159.txt new file mode 100644 index 00000000..115e51a0 --- /dev/null +++ b/mods/skinsdb/meta/character.2159.txt @@ -0,0 +1,3 @@ +Ella +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_216.txt b/mods/skinsdb/meta/character.216.txt similarity index 100% rename from mods/skinsdb/meta/character_216.txt rename to mods/skinsdb/meta/character.216.txt diff --git a/mods/skinsdb/meta/character.2160.txt b/mods/skinsdb/meta/character.2160.txt new file mode 100644 index 00000000..1e27faab --- /dev/null +++ b/mods/skinsdb/meta/character.2160.txt @@ -0,0 +1,3 @@ +JuliaCat +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2161.txt b/mods/skinsdb/meta/character.2161.txt new file mode 100644 index 00000000..c65f6e65 --- /dev/null +++ b/mods/skinsdb/meta/character.2161.txt @@ -0,0 +1,3 @@ +AxolotlGirl +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2162.txt b/mods/skinsdb/meta/character.2162.txt new file mode 100644 index 00000000..b56f83ec --- /dev/null +++ b/mods/skinsdb/meta/character.2162.txt @@ -0,0 +1,3 @@ +Flower +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2163.txt b/mods/skinsdb/meta/character.2163.txt new file mode 100644 index 00000000..d7d081fd --- /dev/null +++ b/mods/skinsdb/meta/character.2163.txt @@ -0,0 +1,3 @@ +Robot +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2164.txt b/mods/skinsdb/meta/character.2164.txt new file mode 100644 index 00000000..bdf6e484 --- /dev/null +++ b/mods/skinsdb/meta/character.2164.txt @@ -0,0 +1,3 @@ +Gabriel +bielbi12 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2165.txt b/mods/skinsdb/meta/character.2165.txt new file mode 100644 index 00000000..0a47ea8e --- /dev/null +++ b/mods/skinsdb/meta/character.2165.txt @@ -0,0 +1,3 @@ +blue_maid +IFRFSX +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2166.txt b/mods/skinsdb/meta/character.2166.txt new file mode 100644 index 00000000..46cbb855 --- /dev/null +++ b/mods/skinsdb/meta/character.2166.txt @@ -0,0 +1,3 @@ +HulkHogan +henrique123 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2167.txt b/mods/skinsdb/meta/character.2167.txt new file mode 100644 index 00000000..78f78e2f --- /dev/null +++ b/mods/skinsdb/meta/character.2167.txt @@ -0,0 +1,3 @@ +Jayne2 +Andromeda +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2168.txt b/mods/skinsdb/meta/character.2168.txt new file mode 100644 index 00000000..324cebf3 --- /dev/null +++ b/mods/skinsdb/meta/character.2168.txt @@ -0,0 +1,3 @@ +Modern sonic +SonicandAndriu +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2169.txt b/mods/skinsdb/meta/character.2169.txt new file mode 100644 index 00000000..36cab073 --- /dev/null +++ b/mods/skinsdb/meta/character.2169.txt @@ -0,0 +1,3 @@ +Modern sonic fixe +SonicandAndriu +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_217.txt b/mods/skinsdb/meta/character.217.txt similarity index 100% rename from mods/skinsdb/meta/character_217.txt rename to mods/skinsdb/meta/character.217.txt diff --git a/mods/skinsdb/meta/character.2170.txt b/mods/skinsdb/meta/character.2170.txt new file mode 100644 index 00000000..6758ff5d --- /dev/null +++ b/mods/skinsdb/meta/character.2170.txt @@ -0,0 +1,3 @@ +Xx_NARUTO_xXPOPO +Xx_NARUTO_xXPOPO +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2171.txt b/mods/skinsdb/meta/character.2171.txt new file mode 100644 index 00000000..af1b71ef --- /dev/null +++ b/mods/skinsdb/meta/character.2171.txt @@ -0,0 +1,3 @@ +EmoGirl2 +unknown +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2172.txt b/mods/skinsdb/meta/character.2172.txt new file mode 100644 index 00000000..b6b82557 --- /dev/null +++ b/mods/skinsdb/meta/character.2172.txt @@ -0,0 +1,3 @@ +Yoshi +porcupineguy2011 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2173.txt b/mods/skinsdb/meta/character.2173.txt new file mode 100644 index 00000000..b6b82557 --- /dev/null +++ b/mods/skinsdb/meta/character.2173.txt @@ -0,0 +1,3 @@ +Yoshi +porcupineguy2011 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2174.txt b/mods/skinsdb/meta/character.2174.txt new file mode 100644 index 00000000..0ff8ad94 --- /dev/null +++ b/mods/skinsdb/meta/character.2174.txt @@ -0,0 +1,3 @@ +mr.? +Xx_NARUTO_xXPOPO +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2175.txt b/mods/skinsdb/meta/character.2175.txt new file mode 100644 index 00000000..a41a4df1 --- /dev/null +++ b/mods/skinsdb/meta/character.2175.txt @@ -0,0 +1,3 @@ +Neon Cute Girl 2 +ElMehdiBen +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2176.txt b/mods/skinsdb/meta/character.2176.txt new file mode 100644 index 00000000..f4cdf301 --- /dev/null +++ b/mods/skinsdb/meta/character.2176.txt @@ -0,0 +1,3 @@ +EmoGirl3 +unknown +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2177.txt b/mods/skinsdb/meta/character.2177.txt new file mode 100644 index 00000000..5887d0e9 --- /dev/null +++ b/mods/skinsdb/meta/character.2177.txt @@ -0,0 +1,3 @@ +Jessica +lili_dead_ghost +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2178.txt b/mods/skinsdb/meta/character.2178.txt new file mode 100644 index 00000000..c19cebe3 --- /dev/null +++ b/mods/skinsdb/meta/character.2178.txt @@ -0,0 +1,3 @@ +Jinx the Goblin +JinxieHavoc +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2179.txt b/mods/skinsdb/meta/character.2179.txt new file mode 100644 index 00000000..be9815c7 --- /dev/null +++ b/mods/skinsdb/meta/character.2179.txt @@ -0,0 +1,3 @@ +Therottenshadow +Sasha313 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_218.txt b/mods/skinsdb/meta/character.218.txt similarity index 100% rename from mods/skinsdb/meta/character_218.txt rename to mods/skinsdb/meta/character.218.txt diff --git a/mods/skinsdb/meta/character.2180.txt b/mods/skinsdb/meta/character.2180.txt new file mode 100644 index 00000000..08df3df6 --- /dev/null +++ b/mods/skinsdb/meta/character.2180.txt @@ -0,0 +1,3 @@ +Neon Cute Girl 3 +ElMehdiBen +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2181.txt b/mods/skinsdb/meta/character.2181.txt new file mode 100644 index 00000000..5d7bf24a --- /dev/null +++ b/mods/skinsdb/meta/character.2181.txt @@ -0,0 +1,3 @@ +Princess Peach +GoosetheFlerken +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2182.txt b/mods/skinsdb/meta/character.2182.txt new file mode 100644 index 00000000..0ff9c930 --- /dev/null +++ b/mods/skinsdb/meta/character.2182.txt @@ -0,0 +1,3 @@ +May +FunnyInternetMan +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2183.txt b/mods/skinsdb/meta/character.2183.txt new file mode 100644 index 00000000..1bc4fac9 --- /dev/null +++ b/mods/skinsdb/meta/character.2183.txt @@ -0,0 +1,3 @@ +Fire Luigi +Ferdi Napoli +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2184.txt b/mods/skinsdb/meta/character.2184.txt new file mode 100644 index 00000000..9d0b15fb --- /dev/null +++ b/mods/skinsdb/meta/character.2184.txt @@ -0,0 +1,3 @@ +Rosalina +kobodebob +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2185.txt b/mods/skinsdb/meta/character.2185.txt new file mode 100644 index 00000000..f0de868e --- /dev/null +++ b/mods/skinsdb/meta/character.2185.txt @@ -0,0 +1,3 @@ +maria +tatis +CC BY 3.0 diff --git a/mods/skinsdb/meta/character.2186.txt b/mods/skinsdb/meta/character.2186.txt new file mode 100644 index 00000000..2dc9008c --- /dev/null +++ b/mods/skinsdb/meta/character.2186.txt @@ -0,0 +1,3 @@ +MariKero +MariKero +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2187.txt b/mods/skinsdb/meta/character.2187.txt new file mode 100644 index 00000000..9c2c7828 --- /dev/null +++ b/mods/skinsdb/meta/character.2187.txt @@ -0,0 +1,3 @@ +Rasazy +MariKero +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2188.txt b/mods/skinsdb/meta/character.2188.txt new file mode 100644 index 00000000..b2b444c1 --- /dev/null +++ b/mods/skinsdb/meta/character.2188.txt @@ -0,0 +1,3 @@ +Esmeralda :3 +MariKero +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2189.txt b/mods/skinsdb/meta/character.2189.txt new file mode 100644 index 00000000..ee50ee3a --- /dev/null +++ b/mods/skinsdb/meta/character.2189.txt @@ -0,0 +1,3 @@ +Beethoven +Beethoven__ +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_219.txt b/mods/skinsdb/meta/character.219.txt similarity index 100% rename from mods/skinsdb/meta/character_219.txt rename to mods/skinsdb/meta/character.219.txt diff --git a/mods/skinsdb/meta/character.2190.txt b/mods/skinsdb/meta/character.2190.txt new file mode 100644 index 00000000..dd7b149a --- /dev/null +++ b/mods/skinsdb/meta/character.2190.txt @@ -0,0 +1,3 @@ +Blaze +tata9713 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2191.txt b/mods/skinsdb/meta/character.2191.txt new file mode 100644 index 00000000..434942f7 --- /dev/null +++ b/mods/skinsdb/meta/character.2191.txt @@ -0,0 +1,3 @@ +tucker +dank memer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2192.txt b/mods/skinsdb/meta/character.2192.txt new file mode 100644 index 00000000..80f3ae16 --- /dev/null +++ b/mods/skinsdb/meta/character.2192.txt @@ -0,0 +1,3 @@ +WowneroCultist-1.0 +NeroCultist +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2193.txt b/mods/skinsdb/meta/character.2193.txt new file mode 100644 index 00000000..1a3727c7 --- /dev/null +++ b/mods/skinsdb/meta/character.2193.txt @@ -0,0 +1,3 @@ +NeroCultist1.1 +NeroCultist +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2194.txt b/mods/skinsdb/meta/character.2194.txt new file mode 100644 index 00000000..ff3acfce --- /dev/null +++ b/mods/skinsdb/meta/character.2194.txt @@ -0,0 +1,3 @@ +bab-cora-remastered +nerocultist +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2195.txt b/mods/skinsdb/meta/character.2195.txt new file mode 100644 index 00000000..caa817ac --- /dev/null +++ b/mods/skinsdb/meta/character.2195.txt @@ -0,0 +1,3 @@ +Kollins Blue +Kollins +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2196.txt b/mods/skinsdb/meta/character.2196.txt new file mode 100644 index 00000000..e04fc0be --- /dev/null +++ b/mods/skinsdb/meta/character.2196.txt @@ -0,0 +1,3 @@ +Badi +L-A Azeddine +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2197.txt b/mods/skinsdb/meta/character.2197.txt new file mode 100644 index 00000000..976ad389 --- /dev/null +++ b/mods/skinsdb/meta/character.2197.txt @@ -0,0 +1,3 @@ +Badi 2 +L-A Azeddine +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2198.txt b/mods/skinsdb/meta/character.2198.txt new file mode 100644 index 00000000..0826e04e --- /dev/null +++ b/mods/skinsdb/meta/character.2198.txt @@ -0,0 +1,3 @@ +water +water +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2199.txt b/mods/skinsdb/meta/character.2199.txt new file mode 100644 index 00000000..0826e04e --- /dev/null +++ b/mods/skinsdb/meta/character.2199.txt @@ -0,0 +1,3 @@ +water +water +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_22.txt b/mods/skinsdb/meta/character.22.txt similarity index 100% rename from mods/skinsdb/meta/character_22.txt rename to mods/skinsdb/meta/character.22.txt diff --git a/mods/skinsdb/meta/character_220.txt b/mods/skinsdb/meta/character.220.txt similarity index 100% rename from mods/skinsdb/meta/character_220.txt rename to mods/skinsdb/meta/character.220.txt diff --git a/mods/skinsdb/meta/character.2200.txt b/mods/skinsdb/meta/character.2200.txt new file mode 100644 index 00000000..cef4fdfe --- /dev/null +++ b/mods/skinsdb/meta/character.2200.txt @@ -0,0 +1,3 @@ +SYSTEM UNKNOWN +SYSTEM UNKNOWN +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2201.txt b/mods/skinsdb/meta/character.2201.txt new file mode 100644 index 00000000..25012a04 --- /dev/null +++ b/mods/skinsdb/meta/character.2201.txt @@ -0,0 +1,3 @@ +bearded_cop +bitstrap +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2202.txt b/mods/skinsdb/meta/character.2202.txt new file mode 100644 index 00000000..66cd5b5f --- /dev/null +++ b/mods/skinsdb/meta/character.2202.txt @@ -0,0 +1,3 @@ +fireman +bitstrap +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2203.txt b/mods/skinsdb/meta/character.2203.txt new file mode 100644 index 00000000..56522470 --- /dev/null +++ b/mods/skinsdb/meta/character.2203.txt @@ -0,0 +1,3 @@ +Agent Slender +Kynes +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2204.txt b/mods/skinsdb/meta/character.2204.txt new file mode 100644 index 00000000..82e8f3ce --- /dev/null +++ b/mods/skinsdb/meta/character.2204.txt @@ -0,0 +1,3 @@ +MrRar +Johannes Fritz +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2205.txt b/mods/skinsdb/meta/character.2205.txt new file mode 100644 index 00000000..059c64ff --- /dev/null +++ b/mods/skinsdb/meta/character.2205.txt @@ -0,0 +1,3 @@ +Manic Digger Mineplayer +exe +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2206.txt b/mods/skinsdb/meta/character.2206.txt new file mode 100644 index 00000000..0220cbed --- /dev/null +++ b/mods/skinsdb/meta/character.2206.txt @@ -0,0 +1,3 @@ +Jill +Guardian02 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2207.txt b/mods/skinsdb/meta/character.2207.txt new file mode 100644 index 00000000..671e8206 --- /dev/null +++ b/mods/skinsdb/meta/character.2207.txt @@ -0,0 +1,3 @@ +Thanos +Guardian02 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2208.txt b/mods/skinsdb/meta/character.2208.txt new file mode 100644 index 00000000..e3bd6256 --- /dev/null +++ b/mods/skinsdb/meta/character.2208.txt @@ -0,0 +1,3 @@ +Pirata +MaxDestructor +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2209.txt b/mods/skinsdb/meta/character.2209.txt new file mode 100644 index 00000000..514c4438 --- /dev/null +++ b/mods/skinsdb/meta/character.2209.txt @@ -0,0 +1,3 @@ +Badi 3 +L-A Azeddin +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_221.txt b/mods/skinsdb/meta/character.221.txt similarity index 100% rename from mods/skinsdb/meta/character_221.txt rename to mods/skinsdb/meta/character.221.txt diff --git a/mods/skinsdb/meta/character.2210.txt b/mods/skinsdb/meta/character.2210.txt new file mode 100644 index 00000000..5199556e --- /dev/null +++ b/mods/skinsdb/meta/character.2210.txt @@ -0,0 +1,3 @@ +Badi 4 +L-A Azeddin +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2211.txt b/mods/skinsdb/meta/character.2211.txt new file mode 100644 index 00000000..19541752 --- /dev/null +++ b/mods/skinsdb/meta/character.2211.txt @@ -0,0 +1,3 @@ +Badi 5 +L-A Azeddin +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2212.txt b/mods/skinsdb/meta/character.2212.txt new file mode 100644 index 00000000..762a9707 --- /dev/null +++ b/mods/skinsdb/meta/character.2212.txt @@ -0,0 +1,3 @@ +Capybara +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2213.txt b/mods/skinsdb/meta/character.2213.txt new file mode 100644 index 00000000..0d55cc8c --- /dev/null +++ b/mods/skinsdb/meta/character.2213.txt @@ -0,0 +1,3 @@ +Hedgehog +El_Naso +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2214.txt b/mods/skinsdb/meta/character.2214.txt new file mode 100644 index 00000000..c86a67b3 --- /dev/null +++ b/mods/skinsdb/meta/character.2214.txt @@ -0,0 +1,3 @@ +Dan377 +Dan377 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2215.txt b/mods/skinsdb/meta/character.2215.txt new file mode 100644 index 00000000..4b2a752c --- /dev/null +++ b/mods/skinsdb/meta/character.2215.txt @@ -0,0 +1,3 @@ +PbIzhyJI9I +Bingu +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2216.txt b/mods/skinsdb/meta/character.2216.txt new file mode 100644 index 00000000..f630f4dc --- /dev/null +++ b/mods/skinsdb/meta/character.2216.txt @@ -0,0 +1,3 @@ +Bretelles +Samtarot +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2217.txt b/mods/skinsdb/meta/character.2217.txt new file mode 100644 index 00000000..c9f48ef6 --- /dev/null +++ b/mods/skinsdb/meta/character.2217.txt @@ -0,0 +1,3 @@ +GiletJaune +Samtarot +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2218.txt b/mods/skinsdb/meta/character.2218.txt new file mode 100644 index 00000000..8d1d487a --- /dev/null +++ b/mods/skinsdb/meta/character.2218.txt @@ -0,0 +1,3 @@ +Costume1 +Samtarot +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2219.txt b/mods/skinsdb/meta/character.2219.txt new file mode 100644 index 00000000..ec5a3d91 --- /dev/null +++ b/mods/skinsdb/meta/character.2219.txt @@ -0,0 +1,3 @@ +Costume +Samtarot +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_222.txt b/mods/skinsdb/meta/character.222.txt similarity index 100% rename from mods/skinsdb/meta/character_222.txt rename to mods/skinsdb/meta/character.222.txt diff --git a/mods/skinsdb/meta/character.2220.txt b/mods/skinsdb/meta/character.2220.txt new file mode 100644 index 00000000..9551c58c --- /dev/null +++ b/mods/skinsdb/meta/character.2220.txt @@ -0,0 +1,3 @@ +Female Technoblade +dew +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2221.txt b/mods/skinsdb/meta/character.2221.txt new file mode 100644 index 00000000..4ff57b24 --- /dev/null +++ b/mods/skinsdb/meta/character.2221.txt @@ -0,0 +1,3 @@ +Sir Black Cat IV +chatburgir +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2222.txt b/mods/skinsdb/meta/character.2222.txt new file mode 100644 index 00000000..17aa03bf --- /dev/null +++ b/mods/skinsdb/meta/character.2222.txt @@ -0,0 +1,3 @@ +Astolfo +Eduwu +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2223.txt b/mods/skinsdb/meta/character.2223.txt new file mode 100644 index 00000000..7228c98c --- /dev/null +++ b/mods/skinsdb/meta/character.2223.txt @@ -0,0 +1,3 @@ +signora +dew +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2224.txt b/mods/skinsdb/meta/character.2224.txt new file mode 100644 index 00000000..3f307bd6 --- /dev/null +++ b/mods/skinsdb/meta/character.2224.txt @@ -0,0 +1,3 @@ +Ezra Bridger (Star Wars) +dew +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2225.txt b/mods/skinsdb/meta/character.2225.txt new file mode 100644 index 00000000..ed963471 --- /dev/null +++ b/mods/skinsdb/meta/character.2225.txt @@ -0,0 +1,3 @@ +female xiao +sooemi +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2226.txt b/mods/skinsdb/meta/character.2226.txt new file mode 100644 index 00000000..ed6ff67f --- /dev/null +++ b/mods/skinsdb/meta/character.2226.txt @@ -0,0 +1,3 @@ +Ghost Bride +LiTiger2568 +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2227.txt b/mods/skinsdb/meta/character.2227.txt new file mode 100644 index 00000000..149759e5 --- /dev/null +++ b/mods/skinsdb/meta/character.2227.txt @@ -0,0 +1,3 @@ +Iron Spiderman +ironspiderman00232 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2228.txt b/mods/skinsdb/meta/character.2228.txt new file mode 100644 index 00000000..c396eedb --- /dev/null +++ b/mods/skinsdb/meta/character.2228.txt @@ -0,0 +1,3 @@ +raiden shogun +originalSquidgy +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2229.txt b/mods/skinsdb/meta/character.2229.txt new file mode 100644 index 00000000..be190831 --- /dev/null +++ b/mods/skinsdb/meta/character.2229.txt @@ -0,0 +1,3 @@ +Hulda +Ant +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character_223.txt b/mods/skinsdb/meta/character.223.txt similarity index 100% rename from mods/skinsdb/meta/character_223.txt rename to mods/skinsdb/meta/character.223.txt diff --git a/mods/skinsdb/meta/character.2230.txt b/mods/skinsdb/meta/character.2230.txt new file mode 100644 index 00000000..26152462 --- /dev/null +++ b/mods/skinsdb/meta/character.2230.txt @@ -0,0 +1,3 @@ +Haimatsu Power Suit +catlily +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2231.txt b/mods/skinsdb/meta/character.2231.txt new file mode 100644 index 00000000..d69af49a --- /dev/null +++ b/mods/skinsdb/meta/character.2231.txt @@ -0,0 +1,3 @@ +samobrine +The_Smol_One +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2232.txt b/mods/skinsdb/meta/character.2232.txt new file mode 100644 index 00000000..9a005f0a --- /dev/null +++ b/mods/skinsdb/meta/character.2232.txt @@ -0,0 +1,3 @@ +Slimeicle +Andygun11 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2233.txt b/mods/skinsdb/meta/character.2233.txt new file mode 100644 index 00000000..e9c0dbf6 --- /dev/null +++ b/mods/skinsdb/meta/character.2233.txt @@ -0,0 +1,3 @@ +skin girl +daki +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2234.txt b/mods/skinsdb/meta/character.2234.txt new file mode 100644 index 00000000..2edfac86 --- /dev/null +++ b/mods/skinsdb/meta/character.2234.txt @@ -0,0 +1,3 @@ +loner +loner +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2235.txt b/mods/skinsdb/meta/character.2235.txt new file mode 100644 index 00000000..2ab92580 --- /dev/null +++ b/mods/skinsdb/meta/character.2235.txt @@ -0,0 +1,3 @@ +lisa +CC BY-NC 3 0 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2236.txt b/mods/skinsdb/meta/character.2236.txt new file mode 100644 index 00000000..5be9d224 --- /dev/null +++ b/mods/skinsdb/meta/character.2236.txt @@ -0,0 +1,3 @@ +xxxxx +xxxxx +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2237.txt b/mods/skinsdb/meta/character.2237.txt new file mode 100644 index 00000000..f77772bd --- /dev/null +++ b/mods/skinsdb/meta/character.2237.txt @@ -0,0 +1,3 @@ +Lute +Mefjus +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2238.txt b/mods/skinsdb/meta/character.2238.txt new file mode 100644 index 00000000..263d776d --- /dev/null +++ b/mods/skinsdb/meta/character.2238.txt @@ -0,0 +1,3 @@ +tamama +idk, i found it from namemc +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2239.txt b/mods/skinsdb/meta/character.2239.txt new file mode 100644 index 00000000..cd863b02 --- /dev/null +++ b/mods/skinsdb/meta/character.2239.txt @@ -0,0 +1,3 @@ +Oscar of Astora +jackson :) +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_224.txt b/mods/skinsdb/meta/character.224.txt similarity index 56% rename from mods/skinsdb/meta/character_224.txt rename to mods/skinsdb/meta/character.224.txt index 53356b40..9cc6c90a 100644 --- a/mods/skinsdb/meta/character_224.txt +++ b/mods/skinsdb/meta/character.224.txt @@ -1,3 +1,3 @@ Finnzzin -João Neto +João Neto CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2240.txt b/mods/skinsdb/meta/character.2240.txt new file mode 100644 index 00000000..3304b62b --- /dev/null +++ b/mods/skinsdb/meta/character.2240.txt @@ -0,0 +1,3 @@ +uh free skin? +bruh +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2241.txt b/mods/skinsdb/meta/character.2241.txt new file mode 100644 index 00000000..d77a812c --- /dev/null +++ b/mods/skinsdb/meta/character.2241.txt @@ -0,0 +1,3 @@ +TheFlagen430297 - Main +TheFlagen430297 +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2242.txt b/mods/skinsdb/meta/character.2242.txt new file mode 100644 index 00000000..045a63cc --- /dev/null +++ b/mods/skinsdb/meta/character.2242.txt @@ -0,0 +1,3 @@ +Gato Akatsuki +Evansgame +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2243.txt b/mods/skinsdb/meta/character.2243.txt new file mode 100644 index 00000000..8e4f5469 --- /dev/null +++ b/mods/skinsdb/meta/character.2243.txt @@ -0,0 +1,3 @@ +idkkk +i stole this +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2244.txt b/mods/skinsdb/meta/character.2244.txt new file mode 100644 index 00000000..faeef78e --- /dev/null +++ b/mods/skinsdb/meta/character.2244.txt @@ -0,0 +1,3 @@ +Officer +Getcorp +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2245.txt b/mods/skinsdb/meta/character.2245.txt new file mode 100644 index 00000000..391902b6 --- /dev/null +++ b/mods/skinsdb/meta/character.2245.txt @@ -0,0 +1,3 @@ +BoD_Barbarian +Ghialumer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2246.txt b/mods/skinsdb/meta/character.2246.txt new file mode 100644 index 00000000..fc5dfdb5 --- /dev/null +++ b/mods/skinsdb/meta/character.2246.txt @@ -0,0 +1,3 @@ +BoD_knight +Ghialumer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2247.txt b/mods/skinsdb/meta/character.2247.txt new file mode 100644 index 00000000..3c230302 --- /dev/null +++ b/mods/skinsdb/meta/character.2247.txt @@ -0,0 +1,3 @@ +BoD_orc +Ghialumer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2248.txt b/mods/skinsdb/meta/character.2248.txt new file mode 100644 index 00000000..927bc49a --- /dev/null +++ b/mods/skinsdb/meta/character.2248.txt @@ -0,0 +1,3 @@ +STALKER_freedom +Ghialumer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2249.txt b/mods/skinsdb/meta/character.2249.txt new file mode 100644 index 00000000..15fd27e1 --- /dev/null +++ b/mods/skinsdb/meta/character.2249.txt @@ -0,0 +1,3 @@ +Tarkov_SKAV +Ghialumer +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character_225.txt b/mods/skinsdb/meta/character.225.txt similarity index 100% rename from mods/skinsdb/meta/character_225.txt rename to mods/skinsdb/meta/character.225.txt diff --git a/mods/skinsdb/meta/character.2250.txt b/mods/skinsdb/meta/character.2250.txt new file mode 100644 index 00000000..d3aa0857 --- /dev/null +++ b/mods/skinsdb/meta/character.2250.txt @@ -0,0 +1,3 @@ +GironUwU +zgIrOnX +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2251.txt b/mods/skinsdb/meta/character.2251.txt new file mode 100644 index 00000000..d8e1f0b5 --- /dev/null +++ b/mods/skinsdb/meta/character.2251.txt @@ -0,0 +1,3 @@ +IronWoolf587I +IronWoolf587I +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2252.txt b/mods/skinsdb/meta/character.2252.txt new file mode 100644 index 00000000..0d3cc91c --- /dev/null +++ b/mods/skinsdb/meta/character.2252.txt @@ -0,0 +1,3 @@ +samil +fries +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2253.txt b/mods/skinsdb/meta/character.2253.txt new file mode 100644 index 00000000..1e1774a5 --- /dev/null +++ b/mods/skinsdb/meta/character.2253.txt @@ -0,0 +1,3 @@ +Samilv2 +fries +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2254.txt b/mods/skinsdb/meta/character.2254.txt new file mode 100644 index 00000000..1cd21a6c --- /dev/null +++ b/mods/skinsdb/meta/character.2254.txt @@ -0,0 +1,3 @@ +sammilv +plus +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2255.txt b/mods/skinsdb/meta/character.2255.txt new file mode 100644 index 00000000..751c9863 --- /dev/null +++ b/mods/skinsdb/meta/character.2255.txt @@ -0,0 +1,3 @@ +Orangonauta +Cobson +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2256.txt b/mods/skinsdb/meta/character.2256.txt new file mode 100644 index 00000000..e83fe7bc --- /dev/null +++ b/mods/skinsdb/meta/character.2256.txt @@ -0,0 +1,3 @@ +Frog GIrl +Illa +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2257.txt b/mods/skinsdb/meta/character.2257.txt new file mode 100644 index 00000000..1c1ccad2 --- /dev/null +++ b/mods/skinsdb/meta/character.2257.txt @@ -0,0 +1,3 @@ +spifftastic +spifftastic +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2258.txt b/mods/skinsdb/meta/character.2258.txt new file mode 100644 index 00000000..a558e568 --- /dev/null +++ b/mods/skinsdb/meta/character.2258.txt @@ -0,0 +1,3 @@ +spacesuite +aerkiaga +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2259.txt b/mods/skinsdb/meta/character.2259.txt new file mode 100644 index 00000000..a0160778 --- /dev/null +++ b/mods/skinsdb/meta/character.2259.txt @@ -0,0 +1,3 @@ +Walzy +Walzy +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2260.txt b/mods/skinsdb/meta/character.2260.txt new file mode 100644 index 00000000..0a98a3a7 --- /dev/null +++ b/mods/skinsdb/meta/character.2260.txt @@ -0,0 +1,3 @@ +Samantha +Jordach +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2261.txt b/mods/skinsdb/meta/character.2261.txt new file mode 100644 index 00000000..20e0afb6 --- /dev/null +++ b/mods/skinsdb/meta/character.2261.txt @@ -0,0 +1,3 @@ +Samantha v2 +mcl.cubesoftware.xyz +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2262.txt b/mods/skinsdb/meta/character.2262.txt new file mode 100644 index 00000000..ef8dc9ff --- /dev/null +++ b/mods/skinsdb/meta/character.2262.txt @@ -0,0 +1,3 @@ +pip +rotor112 +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2263.txt b/mods/skinsdb/meta/character.2263.txt new file mode 100644 index 00000000..e722d3fe --- /dev/null +++ b/mods/skinsdb/meta/character.2263.txt @@ -0,0 +1,3 @@ +Best samantha +say fnf really fast +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2264.txt b/mods/skinsdb/meta/character.2264.txt new file mode 100644 index 00000000..58b3d4ec --- /dev/null +++ b/mods/skinsdb/meta/character.2264.txt @@ -0,0 +1,3 @@ +GrimLok +GrimLok +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2277.txt b/mods/skinsdb/meta/character.2277.txt new file mode 100644 index 00000000..4373467e --- /dev/null +++ b/mods/skinsdb/meta/character.2277.txt @@ -0,0 +1,3 @@ +Dragon Girl (Fuchsia) +Cash +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2278.txt b/mods/skinsdb/meta/character.2278.txt new file mode 100644 index 00000000..25891a4f --- /dev/null +++ b/mods/skinsdb/meta/character.2278.txt @@ -0,0 +1,3 @@ +Fire/Water girl +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2279.txt b/mods/skinsdb/meta/character.2279.txt new file mode 100644 index 00000000..de45bb5d --- /dev/null +++ b/mods/skinsdb/meta/character.2279.txt @@ -0,0 +1,3 @@ +Dragon Girl (Raspberry) +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_228.txt b/mods/skinsdb/meta/character.228.txt similarity index 100% rename from mods/skinsdb/meta/character_228.txt rename to mods/skinsdb/meta/character.228.txt diff --git a/mods/skinsdb/meta/character.2280.txt b/mods/skinsdb/meta/character.2280.txt new file mode 100644 index 00000000..99d9271c --- /dev/null +++ b/mods/skinsdb/meta/character.2280.txt @@ -0,0 +1,3 @@ +Nezuko Kamado +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2281.txt b/mods/skinsdb/meta/character.2281.txt new file mode 100644 index 00000000..88775b9a --- /dev/null +++ b/mods/skinsdb/meta/character.2281.txt @@ -0,0 +1,3 @@ +Fire Girl +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2282.txt b/mods/skinsdb/meta/character.2282.txt new file mode 100644 index 00000000..35623fe8 --- /dev/null +++ b/mods/skinsdb/meta/character.2282.txt @@ -0,0 +1,3 @@ +Yin ☯️ Yang Japanese girl +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2283.txt b/mods/skinsdb/meta/character.2283.txt new file mode 100644 index 00000000..a5e133ba --- /dev/null +++ b/mods/skinsdb/meta/character.2283.txt @@ -0,0 +1,3 @@ +Boy with a mask +Cash +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2284.txt b/mods/skinsdb/meta/character.2284.txt new file mode 100644 index 00000000..33ce4657 --- /dev/null +++ b/mods/skinsdb/meta/character.2284.txt @@ -0,0 +1,3 @@ +Cool man +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2285.txt b/mods/skinsdb/meta/character.2285.txt new file mode 100644 index 00000000..0035baaa --- /dev/null +++ b/mods/skinsdb/meta/character.2285.txt @@ -0,0 +1,3 @@ +Tim +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2286.txt b/mods/skinsdb/meta/character.2286.txt new file mode 100644 index 00000000..a3571910 --- /dev/null +++ b/mods/skinsdb/meta/character.2286.txt @@ -0,0 +1,3 @@ +Elsa +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2287.txt b/mods/skinsdb/meta/character.2287.txt new file mode 100644 index 00000000..7fa91751 --- /dev/null +++ b/mods/skinsdb/meta/character.2287.txt @@ -0,0 +1,3 @@ +Warrior Princesses +Cash +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2288.txt b/mods/skinsdb/meta/character.2288.txt new file mode 100644 index 00000000..5ed92b48 --- /dev/null +++ b/mods/skinsdb/meta/character.2288.txt @@ -0,0 +1,3 @@ +Eve +CSirolli +CC BY 4.0 diff --git a/mods/skinsdb/meta/character.2289.txt b/mods/skinsdb/meta/character.2289.txt new file mode 100644 index 00000000..e5c12821 --- /dev/null +++ b/mods/skinsdb/meta/character.2289.txt @@ -0,0 +1,3 @@ +limycorn +lmc_rn +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_229.txt b/mods/skinsdb/meta/character.229.txt similarity index 100% rename from mods/skinsdb/meta/character_229.txt rename to mods/skinsdb/meta/character.229.txt diff --git a/mods/skinsdb/meta/character.2290.txt b/mods/skinsdb/meta/character.2290.txt new file mode 100644 index 00000000..0882fa67 --- /dev/null +++ b/mods/skinsdb/meta/character.2290.txt @@ -0,0 +1,3 @@ +Adam +- +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2291.txt b/mods/skinsdb/meta/character.2291.txt new file mode 100644 index 00000000..515d130d --- /dev/null +++ b/mods/skinsdb/meta/character.2291.txt @@ -0,0 +1,3 @@ +Adam (corrected owner re-upload) +plusminus32 +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2292.txt b/mods/skinsdb/meta/character.2292.txt new file mode 100644 index 00000000..a5f78aae --- /dev/null +++ b/mods/skinsdb/meta/character.2292.txt @@ -0,0 +1,3 @@ +Human +Noah +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2293.txt b/mods/skinsdb/meta/character.2293.txt new file mode 100644 index 00000000..08ce6b8b --- /dev/null +++ b/mods/skinsdb/meta/character.2293.txt @@ -0,0 +1,3 @@ +Robot +Noah +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2294.txt b/mods/skinsdb/meta/character.2294.txt new file mode 100644 index 00000000..5c62e433 --- /dev/null +++ b/mods/skinsdb/meta/character.2294.txt @@ -0,0 +1,3 @@ +Vampire +Noah +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2295.txt b/mods/skinsdb/meta/character.2295.txt new file mode 100644 index 00000000..3c483b50 --- /dev/null +++ b/mods/skinsdb/meta/character.2295.txt @@ -0,0 +1,3 @@ +Zombie +Noah +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2296.txt b/mods/skinsdb/meta/character.2296.txt new file mode 100644 index 00000000..5cd2af9c --- /dev/null +++ b/mods/skinsdb/meta/character.2296.txt @@ -0,0 +1,3 @@ +ColinGamer +plusminus32 +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2297.txt b/mods/skinsdb/meta/character.2297.txt new file mode 100644 index 00000000..69fc6c28 --- /dev/null +++ b/mods/skinsdb/meta/character.2297.txt @@ -0,0 +1,3 @@ +Fighter +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2298.txt b/mods/skinsdb/meta/character.2298.txt new file mode 100644 index 00000000..43c472f4 --- /dev/null +++ b/mods/skinsdb/meta/character.2298.txt @@ -0,0 +1,3 @@ +3fccccccccccc +singleplayer +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2299.txt b/mods/skinsdb/meta/character.2299.txt new file mode 100644 index 00000000..842cdc2e --- /dev/null +++ b/mods/skinsdb/meta/character.2299.txt @@ -0,0 +1,3 @@ +Crazy_pinky +nyomi +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_230.txt b/mods/skinsdb/meta/character.230.txt similarity index 100% rename from mods/skinsdb/meta/character_230.txt rename to mods/skinsdb/meta/character.230.txt diff --git a/mods/skinsdb/meta/character.2300.txt b/mods/skinsdb/meta/character.2300.txt new file mode 100644 index 00000000..4a8f6da8 --- /dev/null +++ b/mods/skinsdb/meta/character.2300.txt @@ -0,0 +1,3 @@ +SuperboyDC90 +F +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2301.txt b/mods/skinsdb/meta/character.2301.txt new file mode 100644 index 00000000..b3504974 --- /dev/null +++ b/mods/skinsdb/meta/character.2301.txt @@ -0,0 +1,3 @@ +Jack Zazi A +JackNiko +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2302.txt b/mods/skinsdb/meta/character.2302.txt new file mode 100644 index 00000000..dbc59407 --- /dev/null +++ b/mods/skinsdb/meta/character.2302.txt @@ -0,0 +1,3 @@ +Jack Zazi B +JackNiko +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2303.txt b/mods/skinsdb/meta/character.2303.txt new file mode 100644 index 00000000..e8d1cd81 --- /dev/null +++ b/mods/skinsdb/meta/character.2303.txt @@ -0,0 +1,3 @@ +nitrogenez-flat +veaylugg +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2304.txt b/mods/skinsdb/meta/character.2304.txt new file mode 100644 index 00000000..6e1f7f9a --- /dev/null +++ b/mods/skinsdb/meta/character.2304.txt @@ -0,0 +1,3 @@ +rainbow_man +nyomi +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2305.txt b/mods/skinsdb/meta/character.2305.txt new file mode 100644 index 00000000..d4363b4f --- /dev/null +++ b/mods/skinsdb/meta/character.2305.txt @@ -0,0 +1,3 @@ +Foxy Purple +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2306.txt b/mods/skinsdb/meta/character.2306.txt new file mode 100644 index 00000000..9c8b1e28 --- /dev/null +++ b/mods/skinsdb/meta/character.2306.txt @@ -0,0 +1,3 @@ +War Queen +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2307.txt b/mods/skinsdb/meta/character.2307.txt new file mode 100644 index 00000000..1e9df0bf --- /dev/null +++ b/mods/skinsdb/meta/character.2307.txt @@ -0,0 +1,3 @@ +Phoenix Mage +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2308.txt b/mods/skinsdb/meta/character.2308.txt new file mode 100644 index 00000000..b861705c --- /dev/null +++ b/mods/skinsdb/meta/character.2308.txt @@ -0,0 +1,3 @@ +just test ( not finished skin) +nyomi +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2309.txt b/mods/skinsdb/meta/character.2309.txt new file mode 100644 index 00000000..c9373122 --- /dev/null +++ b/mods/skinsdb/meta/character.2309.txt @@ -0,0 +1,3 @@ +Computerhead +ComputerHead +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_231.txt b/mods/skinsdb/meta/character.231.txt similarity index 100% rename from mods/skinsdb/meta/character_231.txt rename to mods/skinsdb/meta/character.231.txt diff --git a/mods/skinsdb/meta/character.2310.txt b/mods/skinsdb/meta/character.2310.txt new file mode 100644 index 00000000..c44cf526 --- /dev/null +++ b/mods/skinsdb/meta/character.2310.txt @@ -0,0 +1,3 @@ +mr.caos +nyomi +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2311.txt b/mods/skinsdb/meta/character.2311.txt new file mode 100644 index 00000000..8e0848e7 --- /dev/null +++ b/mods/skinsdb/meta/character.2311.txt @@ -0,0 +1,3 @@ +Anonymous +Jugio +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2312.txt b/mods/skinsdb/meta/character.2312.txt new file mode 100644 index 00000000..674f9667 --- /dev/null +++ b/mods/skinsdb/meta/character.2312.txt @@ -0,0 +1,3 @@ +Mizu +other +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2313.txt b/mods/skinsdb/meta/character.2313.txt new file mode 100644 index 00000000..0c8fe501 --- /dev/null +++ b/mods/skinsdb/meta/character.2313.txt @@ -0,0 +1,3 @@ +King of war +Miche +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2314.txt b/mods/skinsdb/meta/character.2314.txt new file mode 100644 index 00000000..23cb34de --- /dev/null +++ b/mods/skinsdb/meta/character.2314.txt @@ -0,0 +1,3 @@ +Elenas +Miche +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2315.txt b/mods/skinsdb/meta/character.2315.txt new file mode 100644 index 00000000..13c52df8 --- /dev/null +++ b/mods/skinsdb/meta/character.2315.txt @@ -0,0 +1,3 @@ +demon goat +Grruelty +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2316.txt b/mods/skinsdb/meta/character.2316.txt new file mode 100644 index 00000000..e741f991 --- /dev/null +++ b/mods/skinsdb/meta/character.2316.txt @@ -0,0 +1,3 @@ +Kurisu from Steins; Gate +Gempkin +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2317.txt b/mods/skinsdb/meta/character.2317.txt new file mode 100644 index 00000000..683f3fed --- /dev/null +++ b/mods/skinsdb/meta/character.2317.txt @@ -0,0 +1,3 @@ +Rainbow +ItsGirlCraft +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2318.txt b/mods/skinsdb/meta/character.2318.txt new file mode 100644 index 00000000..7fef8216 --- /dev/null +++ b/mods/skinsdb/meta/character.2318.txt @@ -0,0 +1,3 @@ +Iron Man Mark 6 +Evans +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2319.txt b/mods/skinsdb/meta/character.2319.txt new file mode 100644 index 00000000..6ae9fbfd --- /dev/null +++ b/mods/skinsdb/meta/character.2319.txt @@ -0,0 +1,3 @@ +Minetest C-55 Sam +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character_232.txt b/mods/skinsdb/meta/character.232.txt similarity index 100% rename from mods/skinsdb/meta/character_232.txt rename to mods/skinsdb/meta/character.232.txt diff --git a/mods/skinsdb/meta/character.2320.txt b/mods/skinsdb/meta/character.2320.txt new file mode 100644 index 00000000..393b950b --- /dev/null +++ b/mods/skinsdb/meta/character.2320.txt @@ -0,0 +1,3 @@ +Minetest C-55 Sam 2.0 +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2321.txt b/mods/skinsdb/meta/character.2321.txt new file mode 100644 index 00000000..ddb418da --- /dev/null +++ b/mods/skinsdb/meta/character.2321.txt @@ -0,0 +1,3 @@ +Saruman +Yap +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2322.txt b/mods/skinsdb/meta/character.2322.txt new file mode 100644 index 00000000..db701ddc --- /dev/null +++ b/mods/skinsdb/meta/character.2322.txt @@ -0,0 +1,3 @@ +Knighted +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2323.txt b/mods/skinsdb/meta/character.2323.txt new file mode 100644 index 00000000..028d168f --- /dev/null +++ b/mods/skinsdb/meta/character.2323.txt @@ -0,0 +1,3 @@ +Maruko +Maruko +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2324.txt b/mods/skinsdb/meta/character.2324.txt new file mode 100644 index 00000000..2aa7cf08 --- /dev/null +++ b/mods/skinsdb/meta/character.2324.txt @@ -0,0 +1,3 @@ +Lady Miche +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2325.txt b/mods/skinsdb/meta/character.2325.txt new file mode 100644 index 00000000..2aa7cf08 --- /dev/null +++ b/mods/skinsdb/meta/character.2325.txt @@ -0,0 +1,3 @@ +Lady Miche +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2326.txt b/mods/skinsdb/meta/character.2326.txt new file mode 100644 index 00000000..8d468b74 --- /dev/null +++ b/mods/skinsdb/meta/character.2326.txt @@ -0,0 +1,3 @@ +Lady Cash +Cash +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2327.txt b/mods/skinsdb/meta/character.2327.txt new file mode 100644 index 00000000..39924c86 --- /dev/null +++ b/mods/skinsdb/meta/character.2327.txt @@ -0,0 +1,3 @@ +character1 +Super +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2328.txt b/mods/skinsdb/meta/character.2328.txt new file mode 100644 index 00000000..5310528e --- /dev/null +++ b/mods/skinsdb/meta/character.2328.txt @@ -0,0 +1,3 @@ +Greek +tera3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2329.txt b/mods/skinsdb/meta/character.2329.txt new file mode 100644 index 00000000..5c994c8e --- /dev/null +++ b/mods/skinsdb/meta/character.2329.txt @@ -0,0 +1,3 @@ +Kitty Cat +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_233.txt b/mods/skinsdb/meta/character.233.txt similarity index 100% rename from mods/skinsdb/meta/character_233.txt rename to mods/skinsdb/meta/character.233.txt diff --git a/mods/skinsdb/meta/character.2330.txt b/mods/skinsdb/meta/character.2330.txt new file mode 100644 index 00000000..226fa650 --- /dev/null +++ b/mods/skinsdb/meta/character.2330.txt @@ -0,0 +1,3 @@ +Party Girl (Purple) +Miche +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character.2331.txt b/mods/skinsdb/meta/character.2331.txt new file mode 100644 index 00000000..e512c828 --- /dev/null +++ b/mods/skinsdb/meta/character.2331.txt @@ -0,0 +1,3 @@ +Ron From Common Sense Soapbox +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2332.txt b/mods/skinsdb/meta/character.2332.txt new file mode 100644 index 00000000..0035baaa --- /dev/null +++ b/mods/skinsdb/meta/character.2332.txt @@ -0,0 +1,3 @@ +Tim +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2333.txt b/mods/skinsdb/meta/character.2333.txt new file mode 100644 index 00000000..d6faaaa4 --- /dev/null +++ b/mods/skinsdb/meta/character.2333.txt @@ -0,0 +1,3 @@ +Josh +Tim7 +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2334.txt b/mods/skinsdb/meta/character.2334.txt new file mode 100644 index 00000000..1cf95ad2 --- /dev/null +++ b/mods/skinsdb/meta/character.2334.txt @@ -0,0 +1,3 @@ +Gamingtime2 +Gamingtime2 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character.2335.txt b/mods/skinsdb/meta/character.2335.txt new file mode 100644 index 00000000..92a2302d --- /dev/null +++ b/mods/skinsdb/meta/character.2335.txt @@ -0,0 +1,3 @@ +Knighted Girl +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2336.txt b/mods/skinsdb/meta/character.2336.txt new file mode 100644 index 00000000..44a22b59 --- /dev/null +++ b/mods/skinsdb/meta/character.2336.txt @@ -0,0 +1,3 @@ +Knighted Celtina +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2337.txt b/mods/skinsdb/meta/character.2337.txt new file mode 100644 index 00000000..5b79a542 --- /dev/null +++ b/mods/skinsdb/meta/character.2337.txt @@ -0,0 +1,3 @@ +Celtutu +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2338.txt b/mods/skinsdb/meta/character.2338.txt new file mode 100644 index 00000000..f6ca11ba --- /dev/null +++ b/mods/skinsdb/meta/character.2338.txt @@ -0,0 +1,3 @@ +Sunset +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2339.txt b/mods/skinsdb/meta/character.2339.txt new file mode 100644 index 00000000..a67cbd51 --- /dev/null +++ b/mods/skinsdb/meta/character.2339.txt @@ -0,0 +1,3 @@ +Heartbeat +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character_234.txt b/mods/skinsdb/meta/character.234.txt similarity index 100% rename from mods/skinsdb/meta/character_234.txt rename to mods/skinsdb/meta/character.234.txt diff --git a/mods/skinsdb/meta/character.2340.txt b/mods/skinsdb/meta/character.2340.txt new file mode 100644 index 00000000..485e2ca0 --- /dev/null +++ b/mods/skinsdb/meta/character.2340.txt @@ -0,0 +1,3 @@ +Youtube +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2341.txt b/mods/skinsdb/meta/character.2341.txt new file mode 100644 index 00000000..1fd729bf --- /dev/null +++ b/mods/skinsdb/meta/character.2341.txt @@ -0,0 +1,3 @@ +Peach +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2342.txt b/mods/skinsdb/meta/character.2342.txt new file mode 100644 index 00000000..eec373d0 --- /dev/null +++ b/mods/skinsdb/meta/character.2342.txt @@ -0,0 +1,3 @@ +Celtina +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2343.txt b/mods/skinsdb/meta/character.2343.txt new file mode 100644 index 00000000..ed3629b4 --- /dev/null +++ b/mods/skinsdb/meta/character.2343.txt @@ -0,0 +1,3 @@ +Panda Celtina +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2344.txt b/mods/skinsdb/meta/character.2344.txt new file mode 100644 index 00000000..0e6b4747 --- /dev/null +++ b/mods/skinsdb/meta/character.2344.txt @@ -0,0 +1,3 @@ +Peachy Queen +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2345.txt b/mods/skinsdb/meta/character.2345.txt new file mode 100644 index 00000000..0bc24f25 --- /dev/null +++ b/mods/skinsdb/meta/character.2345.txt @@ -0,0 +1,3 @@ +Celtina Warrior +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2346.txt b/mods/skinsdb/meta/character.2346.txt new file mode 100644 index 00000000..e0452d36 --- /dev/null +++ b/mods/skinsdb/meta/character.2346.txt @@ -0,0 +1,3 @@ +Warmeth girl Winter +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2347.txt b/mods/skinsdb/meta/character.2347.txt new file mode 100644 index 00000000..2e4abac2 --- /dev/null +++ b/mods/skinsdb/meta/character.2347.txt @@ -0,0 +1,3 @@ +Fighter (no fight clothes* +Celtina +CC 0 (1.0) diff --git a/mods/skinsdb/meta/character.2348.txt b/mods/skinsdb/meta/character.2348.txt new file mode 100644 index 00000000..a6897454 --- /dev/null +++ b/mods/skinsdb/meta/character.2348.txt @@ -0,0 +1,3 @@ +Bunny +Miche +CC BY-SA 4.0 diff --git a/mods/skinsdb/meta/character.2349.txt b/mods/skinsdb/meta/character.2349.txt new file mode 100644 index 00000000..19d9f57f --- /dev/null +++ b/mods/skinsdb/meta/character.2349.txt @@ -0,0 +1,3 @@ +Maruko +MarukoTest +CC BY 4.0 diff --git a/mods/skinsdb/meta/character_235.txt b/mods/skinsdb/meta/character.235.txt similarity index 100% rename from mods/skinsdb/meta/character_235.txt rename to mods/skinsdb/meta/character.235.txt diff --git a/mods/skinsdb/meta/character.2350.txt b/mods/skinsdb/meta/character.2350.txt new file mode 100644 index 00000000..1a80f2a2 --- /dev/null +++ b/mods/skinsdb/meta/character.2350.txt @@ -0,0 +1,3 @@ +Ani +WoShiAnima +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character.2351.txt b/mods/skinsdb/meta/character.2351.txt new file mode 100644 index 00000000..240cbfc0 --- /dev/null +++ b/mods/skinsdb/meta/character.2351.txt @@ -0,0 +1,3 @@ +MeekJR +MeekJR +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_237.txt b/mods/skinsdb/meta/character.237.txt similarity index 100% rename from mods/skinsdb/meta/character_237.txt rename to mods/skinsdb/meta/character.237.txt diff --git a/mods/skinsdb/meta/character_239.txt b/mods/skinsdb/meta/character.239.txt similarity index 100% rename from mods/skinsdb/meta/character_239.txt rename to mods/skinsdb/meta/character.239.txt diff --git a/mods/skinsdb/meta/character_24.txt b/mods/skinsdb/meta/character.24.txt similarity index 100% rename from mods/skinsdb/meta/character_24.txt rename to mods/skinsdb/meta/character.24.txt diff --git a/mods/skinsdb/meta/character_241.txt b/mods/skinsdb/meta/character.241.txt similarity index 100% rename from mods/skinsdb/meta/character_241.txt rename to mods/skinsdb/meta/character.241.txt diff --git a/mods/skinsdb/meta/character_242.txt b/mods/skinsdb/meta/character.242.txt similarity index 100% rename from mods/skinsdb/meta/character_242.txt rename to mods/skinsdb/meta/character.242.txt diff --git a/mods/skinsdb/meta/character_243.txt b/mods/skinsdb/meta/character.243.txt similarity index 100% rename from mods/skinsdb/meta/character_243.txt rename to mods/skinsdb/meta/character.243.txt diff --git a/mods/skinsdb/meta/character_244.txt b/mods/skinsdb/meta/character.244.txt similarity index 100% rename from mods/skinsdb/meta/character_244.txt rename to mods/skinsdb/meta/character.244.txt diff --git a/mods/skinsdb/meta/character_245.txt b/mods/skinsdb/meta/character.245.txt similarity index 100% rename from mods/skinsdb/meta/character_245.txt rename to mods/skinsdb/meta/character.245.txt diff --git a/mods/skinsdb/meta/character_246.txt b/mods/skinsdb/meta/character.246.txt similarity index 100% rename from mods/skinsdb/meta/character_246.txt rename to mods/skinsdb/meta/character.246.txt diff --git a/mods/skinsdb/meta/character_247.txt b/mods/skinsdb/meta/character.247.txt similarity index 100% rename from mods/skinsdb/meta/character_247.txt rename to mods/skinsdb/meta/character.247.txt diff --git a/mods/skinsdb/meta/character_248.txt b/mods/skinsdb/meta/character.248.txt similarity index 100% rename from mods/skinsdb/meta/character_248.txt rename to mods/skinsdb/meta/character.248.txt diff --git a/mods/skinsdb/meta/character_249.txt b/mods/skinsdb/meta/character.249.txt similarity index 100% rename from mods/skinsdb/meta/character_249.txt rename to mods/skinsdb/meta/character.249.txt diff --git a/mods/skinsdb/meta/character_25.txt b/mods/skinsdb/meta/character.25.txt similarity index 100% rename from mods/skinsdb/meta/character_25.txt rename to mods/skinsdb/meta/character.25.txt diff --git a/mods/skinsdb/meta/character_250.txt b/mods/skinsdb/meta/character.250.txt similarity index 100% rename from mods/skinsdb/meta/character_250.txt rename to mods/skinsdb/meta/character.250.txt diff --git a/mods/skinsdb/meta/character_251.txt b/mods/skinsdb/meta/character.251.txt similarity index 100% rename from mods/skinsdb/meta/character_251.txt rename to mods/skinsdb/meta/character.251.txt diff --git a/mods/skinsdb/meta/character_252.txt b/mods/skinsdb/meta/character.252.txt similarity index 100% rename from mods/skinsdb/meta/character_252.txt rename to mods/skinsdb/meta/character.252.txt diff --git a/mods/skinsdb/meta/character_253.txt b/mods/skinsdb/meta/character.253.txt similarity index 100% rename from mods/skinsdb/meta/character_253.txt rename to mods/skinsdb/meta/character.253.txt diff --git a/mods/skinsdb/meta/character_254.txt b/mods/skinsdb/meta/character.254.txt similarity index 100% rename from mods/skinsdb/meta/character_254.txt rename to mods/skinsdb/meta/character.254.txt diff --git a/mods/skinsdb/meta/character_255.txt b/mods/skinsdb/meta/character.255.txt similarity index 100% rename from mods/skinsdb/meta/character_255.txt rename to mods/skinsdb/meta/character.255.txt diff --git a/mods/skinsdb/meta/character_256.txt b/mods/skinsdb/meta/character.256.txt similarity index 100% rename from mods/skinsdb/meta/character_256.txt rename to mods/skinsdb/meta/character.256.txt diff --git a/mods/skinsdb/meta/character_257.txt b/mods/skinsdb/meta/character.257.txt similarity index 100% rename from mods/skinsdb/meta/character_257.txt rename to mods/skinsdb/meta/character.257.txt diff --git a/mods/skinsdb/meta/character_258.txt b/mods/skinsdb/meta/character.258.txt similarity index 100% rename from mods/skinsdb/meta/character_258.txt rename to mods/skinsdb/meta/character.258.txt diff --git a/mods/skinsdb/meta/character_259.txt b/mods/skinsdb/meta/character.259.txt similarity index 100% rename from mods/skinsdb/meta/character_259.txt rename to mods/skinsdb/meta/character.259.txt diff --git a/mods/skinsdb/meta/character_26.txt b/mods/skinsdb/meta/character.26.txt similarity index 100% rename from mods/skinsdb/meta/character_26.txt rename to mods/skinsdb/meta/character.26.txt diff --git a/mods/skinsdb/meta/character_260.txt b/mods/skinsdb/meta/character.260.txt similarity index 100% rename from mods/skinsdb/meta/character_260.txt rename to mods/skinsdb/meta/character.260.txt diff --git a/mods/skinsdb/meta/character_261.txt b/mods/skinsdb/meta/character.261.txt similarity index 100% rename from mods/skinsdb/meta/character_261.txt rename to mods/skinsdb/meta/character.261.txt diff --git a/mods/skinsdb/meta/character_262.txt b/mods/skinsdb/meta/character.262.txt similarity index 100% rename from mods/skinsdb/meta/character_262.txt rename to mods/skinsdb/meta/character.262.txt diff --git a/mods/skinsdb/meta/character_263.txt b/mods/skinsdb/meta/character.263.txt similarity index 100% rename from mods/skinsdb/meta/character_263.txt rename to mods/skinsdb/meta/character.263.txt diff --git a/mods/skinsdb/meta/character_264.txt b/mods/skinsdb/meta/character.264.txt similarity index 100% rename from mods/skinsdb/meta/character_264.txt rename to mods/skinsdb/meta/character.264.txt diff --git a/mods/skinsdb/meta/character_265.txt b/mods/skinsdb/meta/character.265.txt similarity index 100% rename from mods/skinsdb/meta/character_265.txt rename to mods/skinsdb/meta/character.265.txt diff --git a/mods/skinsdb/meta/character_266.txt b/mods/skinsdb/meta/character.266.txt similarity index 100% rename from mods/skinsdb/meta/character_266.txt rename to mods/skinsdb/meta/character.266.txt diff --git a/mods/skinsdb/meta/character_267.txt b/mods/skinsdb/meta/character.267.txt similarity index 100% rename from mods/skinsdb/meta/character_267.txt rename to mods/skinsdb/meta/character.267.txt diff --git a/mods/skinsdb/meta/character_268.txt b/mods/skinsdb/meta/character.268.txt similarity index 100% rename from mods/skinsdb/meta/character_268.txt rename to mods/skinsdb/meta/character.268.txt diff --git a/mods/skinsdb/meta/character_269.txt b/mods/skinsdb/meta/character.269.txt similarity index 100% rename from mods/skinsdb/meta/character_269.txt rename to mods/skinsdb/meta/character.269.txt diff --git a/mods/skinsdb/meta/character_27.txt b/mods/skinsdb/meta/character.27.txt similarity index 100% rename from mods/skinsdb/meta/character_27.txt rename to mods/skinsdb/meta/character.27.txt diff --git a/mods/skinsdb/meta/character_270.txt b/mods/skinsdb/meta/character.270.txt similarity index 100% rename from mods/skinsdb/meta/character_270.txt rename to mods/skinsdb/meta/character.270.txt diff --git a/mods/skinsdb/meta/character_271.txt b/mods/skinsdb/meta/character.271.txt similarity index 100% rename from mods/skinsdb/meta/character_271.txt rename to mods/skinsdb/meta/character.271.txt diff --git a/mods/skinsdb/meta/character_272.txt b/mods/skinsdb/meta/character.272.txt similarity index 100% rename from mods/skinsdb/meta/character_272.txt rename to mods/skinsdb/meta/character.272.txt diff --git a/mods/skinsdb/meta/character_273.txt b/mods/skinsdb/meta/character.273.txt similarity index 100% rename from mods/skinsdb/meta/character_273.txt rename to mods/skinsdb/meta/character.273.txt diff --git a/mods/skinsdb/meta/character_274.txt b/mods/skinsdb/meta/character.274.txt similarity index 100% rename from mods/skinsdb/meta/character_274.txt rename to mods/skinsdb/meta/character.274.txt diff --git a/mods/skinsdb/meta/character_275.txt b/mods/skinsdb/meta/character.275.txt similarity index 100% rename from mods/skinsdb/meta/character_275.txt rename to mods/skinsdb/meta/character.275.txt diff --git a/mods/skinsdb/meta/character_276.txt b/mods/skinsdb/meta/character.276.txt similarity index 100% rename from mods/skinsdb/meta/character_276.txt rename to mods/skinsdb/meta/character.276.txt diff --git a/mods/skinsdb/meta/character_277.txt b/mods/skinsdb/meta/character.277.txt similarity index 100% rename from mods/skinsdb/meta/character_277.txt rename to mods/skinsdb/meta/character.277.txt diff --git a/mods/skinsdb/meta/character_278.txt b/mods/skinsdb/meta/character.278.txt similarity index 100% rename from mods/skinsdb/meta/character_278.txt rename to mods/skinsdb/meta/character.278.txt diff --git a/mods/skinsdb/meta/character_279.txt b/mods/skinsdb/meta/character.279.txt similarity index 100% rename from mods/skinsdb/meta/character_279.txt rename to mods/skinsdb/meta/character.279.txt diff --git a/mods/skinsdb/meta/character_28.txt b/mods/skinsdb/meta/character.28.txt similarity index 100% rename from mods/skinsdb/meta/character_28.txt rename to mods/skinsdb/meta/character.28.txt diff --git a/mods/skinsdb/meta/character_280.txt b/mods/skinsdb/meta/character.280.txt similarity index 100% rename from mods/skinsdb/meta/character_280.txt rename to mods/skinsdb/meta/character.280.txt diff --git a/mods/skinsdb/meta/character_281.txt b/mods/skinsdb/meta/character.281.txt similarity index 100% rename from mods/skinsdb/meta/character_281.txt rename to mods/skinsdb/meta/character.281.txt diff --git a/mods/skinsdb/meta/character_282.txt b/mods/skinsdb/meta/character.282.txt similarity index 100% rename from mods/skinsdb/meta/character_282.txt rename to mods/skinsdb/meta/character.282.txt diff --git a/mods/skinsdb/meta/character_283.txt b/mods/skinsdb/meta/character.283.txt similarity index 100% rename from mods/skinsdb/meta/character_283.txt rename to mods/skinsdb/meta/character.283.txt diff --git a/mods/skinsdb/meta/character_284.txt b/mods/skinsdb/meta/character.284.txt similarity index 100% rename from mods/skinsdb/meta/character_284.txt rename to mods/skinsdb/meta/character.284.txt diff --git a/mods/skinsdb/meta/character_285.txt b/mods/skinsdb/meta/character.285.txt similarity index 100% rename from mods/skinsdb/meta/character_285.txt rename to mods/skinsdb/meta/character.285.txt diff --git a/mods/skinsdb/meta/character_286.txt b/mods/skinsdb/meta/character.286.txt similarity index 100% rename from mods/skinsdb/meta/character_286.txt rename to mods/skinsdb/meta/character.286.txt diff --git a/mods/skinsdb/meta/character_287.txt b/mods/skinsdb/meta/character.287.txt similarity index 100% rename from mods/skinsdb/meta/character_287.txt rename to mods/skinsdb/meta/character.287.txt diff --git a/mods/skinsdb/meta/character_288.txt b/mods/skinsdb/meta/character.288.txt similarity index 100% rename from mods/skinsdb/meta/character_288.txt rename to mods/skinsdb/meta/character.288.txt diff --git a/mods/skinsdb/meta/character_289.txt b/mods/skinsdb/meta/character.289.txt similarity index 100% rename from mods/skinsdb/meta/character_289.txt rename to mods/skinsdb/meta/character.289.txt diff --git a/mods/skinsdb/meta/character_29.txt b/mods/skinsdb/meta/character.29.txt similarity index 100% rename from mods/skinsdb/meta/character_29.txt rename to mods/skinsdb/meta/character.29.txt diff --git a/mods/skinsdb/meta/character_290.txt b/mods/skinsdb/meta/character.290.txt similarity index 100% rename from mods/skinsdb/meta/character_290.txt rename to mods/skinsdb/meta/character.290.txt diff --git a/mods/skinsdb/meta/character_291.txt b/mods/skinsdb/meta/character.291.txt similarity index 100% rename from mods/skinsdb/meta/character_291.txt rename to mods/skinsdb/meta/character.291.txt diff --git a/mods/skinsdb/meta/character_292.txt b/mods/skinsdb/meta/character.292.txt similarity index 100% rename from mods/skinsdb/meta/character_292.txt rename to mods/skinsdb/meta/character.292.txt diff --git a/mods/skinsdb/meta/character_295.txt b/mods/skinsdb/meta/character.295.txt similarity index 100% rename from mods/skinsdb/meta/character_295.txt rename to mods/skinsdb/meta/character.295.txt diff --git a/mods/skinsdb/meta/character_297.txt b/mods/skinsdb/meta/character.297.txt similarity index 100% rename from mods/skinsdb/meta/character_297.txt rename to mods/skinsdb/meta/character.297.txt diff --git a/mods/skinsdb/meta/character_299.txt b/mods/skinsdb/meta/character.299.txt similarity index 100% rename from mods/skinsdb/meta/character_299.txt rename to mods/skinsdb/meta/character.299.txt diff --git a/mods/skinsdb/meta/character_3.txt b/mods/skinsdb/meta/character.3.txt similarity index 100% rename from mods/skinsdb/meta/character_3.txt rename to mods/skinsdb/meta/character.3.txt diff --git a/mods/skinsdb/meta/character_30.txt b/mods/skinsdb/meta/character.30.txt similarity index 100% rename from mods/skinsdb/meta/character_30.txt rename to mods/skinsdb/meta/character.30.txt diff --git a/mods/skinsdb/meta/character_300.txt b/mods/skinsdb/meta/character.300.txt similarity index 100% rename from mods/skinsdb/meta/character_300.txt rename to mods/skinsdb/meta/character.300.txt diff --git a/mods/skinsdb/meta/character_301.txt b/mods/skinsdb/meta/character.301.txt similarity index 100% rename from mods/skinsdb/meta/character_301.txt rename to mods/skinsdb/meta/character.301.txt diff --git a/mods/skinsdb/meta/character_302.txt b/mods/skinsdb/meta/character.302.txt similarity index 100% rename from mods/skinsdb/meta/character_302.txt rename to mods/skinsdb/meta/character.302.txt diff --git a/mods/skinsdb/meta/character_303.txt b/mods/skinsdb/meta/character.303.txt similarity index 100% rename from mods/skinsdb/meta/character_303.txt rename to mods/skinsdb/meta/character.303.txt diff --git a/mods/skinsdb/meta/character_304.txt b/mods/skinsdb/meta/character.304.txt similarity index 100% rename from mods/skinsdb/meta/character_304.txt rename to mods/skinsdb/meta/character.304.txt diff --git a/mods/skinsdb/meta/character_305.txt b/mods/skinsdb/meta/character.305.txt similarity index 100% rename from mods/skinsdb/meta/character_305.txt rename to mods/skinsdb/meta/character.305.txt diff --git a/mods/skinsdb/meta/character_306.txt b/mods/skinsdb/meta/character.306.txt similarity index 100% rename from mods/skinsdb/meta/character_306.txt rename to mods/skinsdb/meta/character.306.txt diff --git a/mods/skinsdb/meta/character_307.txt b/mods/skinsdb/meta/character.307.txt similarity index 100% rename from mods/skinsdb/meta/character_307.txt rename to mods/skinsdb/meta/character.307.txt diff --git a/mods/skinsdb/meta/character_308.txt b/mods/skinsdb/meta/character.308.txt similarity index 100% rename from mods/skinsdb/meta/character_308.txt rename to mods/skinsdb/meta/character.308.txt diff --git a/mods/skinsdb/meta/character_309.txt b/mods/skinsdb/meta/character.309.txt similarity index 100% rename from mods/skinsdb/meta/character_309.txt rename to mods/skinsdb/meta/character.309.txt diff --git a/mods/skinsdb/meta/character_31.txt b/mods/skinsdb/meta/character.31.txt similarity index 100% rename from mods/skinsdb/meta/character_31.txt rename to mods/skinsdb/meta/character.31.txt diff --git a/mods/skinsdb/meta/character_310.txt b/mods/skinsdb/meta/character.310.txt similarity index 100% rename from mods/skinsdb/meta/character_310.txt rename to mods/skinsdb/meta/character.310.txt diff --git a/mods/skinsdb/meta/character_311.txt b/mods/skinsdb/meta/character.311.txt similarity index 100% rename from mods/skinsdb/meta/character_311.txt rename to mods/skinsdb/meta/character.311.txt diff --git a/mods/skinsdb/meta/character_312.txt b/mods/skinsdb/meta/character.312.txt similarity index 100% rename from mods/skinsdb/meta/character_312.txt rename to mods/skinsdb/meta/character.312.txt diff --git a/mods/skinsdb/meta/character_313.txt b/mods/skinsdb/meta/character.313.txt similarity index 51% rename from mods/skinsdb/meta/character_313.txt rename to mods/skinsdb/meta/character.313.txt index c6dde812..13d63e31 100644 --- a/mods/skinsdb/meta/character_313.txt +++ b/mods/skinsdb/meta/character.313.txt @@ -1,3 +1,3 @@ Tuts -MãedaFoca +MãedaFoca CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_314.txt b/mods/skinsdb/meta/character.314.txt similarity index 100% rename from mods/skinsdb/meta/character_314.txt rename to mods/skinsdb/meta/character.314.txt diff --git a/mods/skinsdb/meta/character_315.txt b/mods/skinsdb/meta/character.315.txt similarity index 100% rename from mods/skinsdb/meta/character_315.txt rename to mods/skinsdb/meta/character.315.txt diff --git a/mods/skinsdb/meta/character_316.txt b/mods/skinsdb/meta/character.316.txt similarity index 100% rename from mods/skinsdb/meta/character_316.txt rename to mods/skinsdb/meta/character.316.txt diff --git a/mods/skinsdb/meta/character_317.txt b/mods/skinsdb/meta/character.317.txt similarity index 100% rename from mods/skinsdb/meta/character_317.txt rename to mods/skinsdb/meta/character.317.txt diff --git a/mods/skinsdb/meta/character_318.txt b/mods/skinsdb/meta/character.318.txt similarity index 100% rename from mods/skinsdb/meta/character_318.txt rename to mods/skinsdb/meta/character.318.txt diff --git a/mods/skinsdb/meta/character_319.txt b/mods/skinsdb/meta/character.319.txt similarity index 100% rename from mods/skinsdb/meta/character_319.txt rename to mods/skinsdb/meta/character.319.txt diff --git a/mods/skinsdb/meta/character_320.txt b/mods/skinsdb/meta/character.320.txt similarity index 100% rename from mods/skinsdb/meta/character_320.txt rename to mods/skinsdb/meta/character.320.txt diff --git a/mods/skinsdb/meta/character_321.txt b/mods/skinsdb/meta/character.321.txt similarity index 100% rename from mods/skinsdb/meta/character_321.txt rename to mods/skinsdb/meta/character.321.txt diff --git a/mods/skinsdb/meta/character_322.txt b/mods/skinsdb/meta/character.322.txt similarity index 100% rename from mods/skinsdb/meta/character_322.txt rename to mods/skinsdb/meta/character.322.txt diff --git a/mods/skinsdb/meta/character_323.txt b/mods/skinsdb/meta/character.323.txt similarity index 100% rename from mods/skinsdb/meta/character_323.txt rename to mods/skinsdb/meta/character.323.txt diff --git a/mods/skinsdb/meta/character_324.txt b/mods/skinsdb/meta/character.324.txt similarity index 100% rename from mods/skinsdb/meta/character_324.txt rename to mods/skinsdb/meta/character.324.txt diff --git a/mods/skinsdb/meta/character_325.txt b/mods/skinsdb/meta/character.325.txt similarity index 100% rename from mods/skinsdb/meta/character_325.txt rename to mods/skinsdb/meta/character.325.txt diff --git a/mods/skinsdb/meta/character_326.txt b/mods/skinsdb/meta/character.326.txt similarity index 100% rename from mods/skinsdb/meta/character_326.txt rename to mods/skinsdb/meta/character.326.txt diff --git a/mods/skinsdb/meta/character_327.txt b/mods/skinsdb/meta/character.327.txt similarity index 100% rename from mods/skinsdb/meta/character_327.txt rename to mods/skinsdb/meta/character.327.txt diff --git a/mods/skinsdb/meta/character_328.txt b/mods/skinsdb/meta/character.328.txt similarity index 100% rename from mods/skinsdb/meta/character_328.txt rename to mods/skinsdb/meta/character.328.txt diff --git a/mods/skinsdb/meta/character_329.txt b/mods/skinsdb/meta/character.329.txt similarity index 100% rename from mods/skinsdb/meta/character_329.txt rename to mods/skinsdb/meta/character.329.txt diff --git a/mods/skinsdb/meta/character_330.txt b/mods/skinsdb/meta/character.330.txt similarity index 100% rename from mods/skinsdb/meta/character_330.txt rename to mods/skinsdb/meta/character.330.txt diff --git a/mods/skinsdb/meta/character_331.txt b/mods/skinsdb/meta/character.331.txt similarity index 100% rename from mods/skinsdb/meta/character_331.txt rename to mods/skinsdb/meta/character.331.txt diff --git a/mods/skinsdb/meta/character_332.txt b/mods/skinsdb/meta/character.332.txt similarity index 100% rename from mods/skinsdb/meta/character_332.txt rename to mods/skinsdb/meta/character.332.txt diff --git a/mods/skinsdb/meta/character_333.txt b/mods/skinsdb/meta/character.333.txt similarity index 100% rename from mods/skinsdb/meta/character_333.txt rename to mods/skinsdb/meta/character.333.txt diff --git a/mods/skinsdb/meta/character_334.txt b/mods/skinsdb/meta/character.334.txt similarity index 100% rename from mods/skinsdb/meta/character_334.txt rename to mods/skinsdb/meta/character.334.txt diff --git a/mods/skinsdb/meta/character_335.txt b/mods/skinsdb/meta/character.335.txt similarity index 100% rename from mods/skinsdb/meta/character_335.txt rename to mods/skinsdb/meta/character.335.txt diff --git a/mods/skinsdb/meta/character_336.txt b/mods/skinsdb/meta/character.336.txt similarity index 100% rename from mods/skinsdb/meta/character_336.txt rename to mods/skinsdb/meta/character.336.txt diff --git a/mods/skinsdb/meta/character_337.txt b/mods/skinsdb/meta/character.337.txt similarity index 100% rename from mods/skinsdb/meta/character_337.txt rename to mods/skinsdb/meta/character.337.txt diff --git a/mods/skinsdb/meta/character_338.txt b/mods/skinsdb/meta/character.338.txt similarity index 100% rename from mods/skinsdb/meta/character_338.txt rename to mods/skinsdb/meta/character.338.txt diff --git a/mods/skinsdb/meta/character_339.txt b/mods/skinsdb/meta/character.339.txt similarity index 100% rename from mods/skinsdb/meta/character_339.txt rename to mods/skinsdb/meta/character.339.txt diff --git a/mods/skinsdb/meta/character_34.txt b/mods/skinsdb/meta/character.34.txt similarity index 100% rename from mods/skinsdb/meta/character_34.txt rename to mods/skinsdb/meta/character.34.txt diff --git a/mods/skinsdb/meta/character_340.txt b/mods/skinsdb/meta/character.340.txt similarity index 100% rename from mods/skinsdb/meta/character_340.txt rename to mods/skinsdb/meta/character.340.txt diff --git a/mods/skinsdb/meta/character_341.txt b/mods/skinsdb/meta/character.341.txt similarity index 100% rename from mods/skinsdb/meta/character_341.txt rename to mods/skinsdb/meta/character.341.txt diff --git a/mods/skinsdb/meta/character_342.txt b/mods/skinsdb/meta/character.342.txt similarity index 100% rename from mods/skinsdb/meta/character_342.txt rename to mods/skinsdb/meta/character.342.txt diff --git a/mods/skinsdb/meta/character_344.txt b/mods/skinsdb/meta/character.344.txt similarity index 100% rename from mods/skinsdb/meta/character_344.txt rename to mods/skinsdb/meta/character.344.txt diff --git a/mods/skinsdb/meta/character_349.txt b/mods/skinsdb/meta/character.349.txt similarity index 100% rename from mods/skinsdb/meta/character_349.txt rename to mods/skinsdb/meta/character.349.txt diff --git a/mods/skinsdb/meta/character_35.txt b/mods/skinsdb/meta/character.35.txt similarity index 100% rename from mods/skinsdb/meta/character_35.txt rename to mods/skinsdb/meta/character.35.txt diff --git a/mods/skinsdb/meta/character_352.txt b/mods/skinsdb/meta/character.352.txt similarity index 100% rename from mods/skinsdb/meta/character_352.txt rename to mods/skinsdb/meta/character.352.txt diff --git a/mods/skinsdb/meta/character_353.txt b/mods/skinsdb/meta/character.353.txt similarity index 100% rename from mods/skinsdb/meta/character_353.txt rename to mods/skinsdb/meta/character.353.txt diff --git a/mods/skinsdb/meta/character_356.txt b/mods/skinsdb/meta/character.356.txt similarity index 100% rename from mods/skinsdb/meta/character_356.txt rename to mods/skinsdb/meta/character.356.txt diff --git a/mods/skinsdb/meta/character_357.txt b/mods/skinsdb/meta/character.357.txt similarity index 100% rename from mods/skinsdb/meta/character_357.txt rename to mods/skinsdb/meta/character.357.txt diff --git a/mods/skinsdb/meta/character_359.txt b/mods/skinsdb/meta/character.359.txt similarity index 100% rename from mods/skinsdb/meta/character_359.txt rename to mods/skinsdb/meta/character.359.txt diff --git a/mods/skinsdb/meta/character_36.txt b/mods/skinsdb/meta/character.36.txt similarity index 100% rename from mods/skinsdb/meta/character_36.txt rename to mods/skinsdb/meta/character.36.txt diff --git a/mods/skinsdb/meta/character_361.txt b/mods/skinsdb/meta/character.361.txt similarity index 100% rename from mods/skinsdb/meta/character_361.txt rename to mods/skinsdb/meta/character.361.txt diff --git a/mods/skinsdb/meta/character_362.txt b/mods/skinsdb/meta/character.362.txt similarity index 100% rename from mods/skinsdb/meta/character_362.txt rename to mods/skinsdb/meta/character.362.txt diff --git a/mods/skinsdb/meta/character_363.txt b/mods/skinsdb/meta/character.363.txt similarity index 100% rename from mods/skinsdb/meta/character_363.txt rename to mods/skinsdb/meta/character.363.txt diff --git a/mods/skinsdb/meta/character_364.txt b/mods/skinsdb/meta/character.364.txt similarity index 100% rename from mods/skinsdb/meta/character_364.txt rename to mods/skinsdb/meta/character.364.txt diff --git a/mods/skinsdb/meta/character_365.txt b/mods/skinsdb/meta/character.365.txt similarity index 100% rename from mods/skinsdb/meta/character_365.txt rename to mods/skinsdb/meta/character.365.txt diff --git a/mods/skinsdb/meta/character_366.txt b/mods/skinsdb/meta/character.366.txt similarity index 100% rename from mods/skinsdb/meta/character_366.txt rename to mods/skinsdb/meta/character.366.txt diff --git a/mods/skinsdb/meta/character_367.txt b/mods/skinsdb/meta/character.367.txt similarity index 100% rename from mods/skinsdb/meta/character_367.txt rename to mods/skinsdb/meta/character.367.txt diff --git a/mods/skinsdb/meta/character_368.txt b/mods/skinsdb/meta/character.368.txt similarity index 100% rename from mods/skinsdb/meta/character_368.txt rename to mods/skinsdb/meta/character.368.txt diff --git a/mods/skinsdb/meta/character_369.txt b/mods/skinsdb/meta/character.369.txt similarity index 100% rename from mods/skinsdb/meta/character_369.txt rename to mods/skinsdb/meta/character.369.txt diff --git a/mods/skinsdb/meta/character_37.txt b/mods/skinsdb/meta/character.37.txt similarity index 100% rename from mods/skinsdb/meta/character_37.txt rename to mods/skinsdb/meta/character.37.txt diff --git a/mods/skinsdb/meta/character_370.txt b/mods/skinsdb/meta/character.370.txt similarity index 100% rename from mods/skinsdb/meta/character_370.txt rename to mods/skinsdb/meta/character.370.txt diff --git a/mods/skinsdb/meta/character_371.txt b/mods/skinsdb/meta/character.371.txt similarity index 100% rename from mods/skinsdb/meta/character_371.txt rename to mods/skinsdb/meta/character.371.txt diff --git a/mods/skinsdb/meta/character_372.txt b/mods/skinsdb/meta/character.372.txt similarity index 100% rename from mods/skinsdb/meta/character_372.txt rename to mods/skinsdb/meta/character.372.txt diff --git a/mods/skinsdb/meta/character_373.txt b/mods/skinsdb/meta/character.373.txt similarity index 100% rename from mods/skinsdb/meta/character_373.txt rename to mods/skinsdb/meta/character.373.txt diff --git a/mods/skinsdb/meta/character_374.txt b/mods/skinsdb/meta/character.374.txt similarity index 100% rename from mods/skinsdb/meta/character_374.txt rename to mods/skinsdb/meta/character.374.txt diff --git a/mods/skinsdb/meta/character_375.txt b/mods/skinsdb/meta/character.375.txt similarity index 100% rename from mods/skinsdb/meta/character_375.txt rename to mods/skinsdb/meta/character.375.txt diff --git a/mods/skinsdb/meta/character_376.txt b/mods/skinsdb/meta/character.376.txt similarity index 100% rename from mods/skinsdb/meta/character_376.txt rename to mods/skinsdb/meta/character.376.txt diff --git a/mods/skinsdb/meta/character_377.txt b/mods/skinsdb/meta/character.377.txt similarity index 100% rename from mods/skinsdb/meta/character_377.txt rename to mods/skinsdb/meta/character.377.txt diff --git a/mods/skinsdb/meta/character_378.txt b/mods/skinsdb/meta/character.378.txt similarity index 100% rename from mods/skinsdb/meta/character_378.txt rename to mods/skinsdb/meta/character.378.txt diff --git a/mods/skinsdb/meta/character_379.txt b/mods/skinsdb/meta/character.379.txt similarity index 100% rename from mods/skinsdb/meta/character_379.txt rename to mods/skinsdb/meta/character.379.txt diff --git a/mods/skinsdb/meta/character_380.txt b/mods/skinsdb/meta/character.380.txt similarity index 100% rename from mods/skinsdb/meta/character_380.txt rename to mods/skinsdb/meta/character.380.txt diff --git a/mods/skinsdb/meta/character_381.txt b/mods/skinsdb/meta/character.381.txt similarity index 100% rename from mods/skinsdb/meta/character_381.txt rename to mods/skinsdb/meta/character.381.txt diff --git a/mods/skinsdb/meta/character_382.txt b/mods/skinsdb/meta/character.382.txt similarity index 100% rename from mods/skinsdb/meta/character_382.txt rename to mods/skinsdb/meta/character.382.txt diff --git a/mods/skinsdb/meta/character_383.txt b/mods/skinsdb/meta/character.383.txt similarity index 100% rename from mods/skinsdb/meta/character_383.txt rename to mods/skinsdb/meta/character.383.txt diff --git a/mods/skinsdb/meta/character_384.txt b/mods/skinsdb/meta/character.384.txt similarity index 100% rename from mods/skinsdb/meta/character_384.txt rename to mods/skinsdb/meta/character.384.txt diff --git a/mods/skinsdb/meta/character_385.txt b/mods/skinsdb/meta/character.385.txt similarity index 100% rename from mods/skinsdb/meta/character_385.txt rename to mods/skinsdb/meta/character.385.txt diff --git a/mods/skinsdb/meta/character_387.txt b/mods/skinsdb/meta/character.387.txt similarity index 100% rename from mods/skinsdb/meta/character_387.txt rename to mods/skinsdb/meta/character.387.txt diff --git a/mods/skinsdb/meta/character_389.txt b/mods/skinsdb/meta/character.389.txt similarity index 100% rename from mods/skinsdb/meta/character_389.txt rename to mods/skinsdb/meta/character.389.txt diff --git a/mods/skinsdb/meta/character_390.txt b/mods/skinsdb/meta/character.390.txt similarity index 100% rename from mods/skinsdb/meta/character_390.txt rename to mods/skinsdb/meta/character.390.txt diff --git a/mods/skinsdb/meta/character_392.txt b/mods/skinsdb/meta/character.392.txt similarity index 100% rename from mods/skinsdb/meta/character_392.txt rename to mods/skinsdb/meta/character.392.txt diff --git a/mods/skinsdb/meta/character_393.txt b/mods/skinsdb/meta/character.393.txt similarity index 100% rename from mods/skinsdb/meta/character_393.txt rename to mods/skinsdb/meta/character.393.txt diff --git a/mods/skinsdb/meta/character_396.txt b/mods/skinsdb/meta/character.396.txt similarity index 100% rename from mods/skinsdb/meta/character_396.txt rename to mods/skinsdb/meta/character.396.txt diff --git a/mods/skinsdb/meta/character_399.txt b/mods/skinsdb/meta/character.399.txt similarity index 100% rename from mods/skinsdb/meta/character_399.txt rename to mods/skinsdb/meta/character.399.txt diff --git a/mods/skinsdb/meta/character_4.txt b/mods/skinsdb/meta/character.4.txt similarity index 100% rename from mods/skinsdb/meta/character_4.txt rename to mods/skinsdb/meta/character.4.txt diff --git a/mods/skinsdb/meta/character_400.txt b/mods/skinsdb/meta/character.400.txt similarity index 100% rename from mods/skinsdb/meta/character_400.txt rename to mods/skinsdb/meta/character.400.txt diff --git a/mods/skinsdb/meta/character_401.txt b/mods/skinsdb/meta/character.401.txt similarity index 100% rename from mods/skinsdb/meta/character_401.txt rename to mods/skinsdb/meta/character.401.txt diff --git a/mods/skinsdb/meta/character_402.txt b/mods/skinsdb/meta/character.402.txt similarity index 100% rename from mods/skinsdb/meta/character_402.txt rename to mods/skinsdb/meta/character.402.txt diff --git a/mods/skinsdb/meta/character_403.txt b/mods/skinsdb/meta/character.403.txt similarity index 100% rename from mods/skinsdb/meta/character_403.txt rename to mods/skinsdb/meta/character.403.txt diff --git a/mods/skinsdb/meta/character_404.txt b/mods/skinsdb/meta/character.404.txt similarity index 100% rename from mods/skinsdb/meta/character_404.txt rename to mods/skinsdb/meta/character.404.txt diff --git a/mods/skinsdb/meta/character_405.txt b/mods/skinsdb/meta/character.405.txt similarity index 100% rename from mods/skinsdb/meta/character_405.txt rename to mods/skinsdb/meta/character.405.txt diff --git a/mods/skinsdb/meta/character_406.txt b/mods/skinsdb/meta/character.406.txt similarity index 100% rename from mods/skinsdb/meta/character_406.txt rename to mods/skinsdb/meta/character.406.txt diff --git a/mods/skinsdb/meta/character_407.txt b/mods/skinsdb/meta/character.407.txt similarity index 100% rename from mods/skinsdb/meta/character_407.txt rename to mods/skinsdb/meta/character.407.txt diff --git a/mods/skinsdb/meta/character_408.txt b/mods/skinsdb/meta/character.408.txt similarity index 100% rename from mods/skinsdb/meta/character_408.txt rename to mods/skinsdb/meta/character.408.txt diff --git a/mods/skinsdb/meta/character_409.txt b/mods/skinsdb/meta/character.409.txt similarity index 100% rename from mods/skinsdb/meta/character_409.txt rename to mods/skinsdb/meta/character.409.txt diff --git a/mods/skinsdb/meta/character_410.txt b/mods/skinsdb/meta/character.410.txt similarity index 100% rename from mods/skinsdb/meta/character_410.txt rename to mods/skinsdb/meta/character.410.txt diff --git a/mods/skinsdb/meta/character_411.txt b/mods/skinsdb/meta/character.411.txt similarity index 100% rename from mods/skinsdb/meta/character_411.txt rename to mods/skinsdb/meta/character.411.txt diff --git a/mods/skinsdb/meta/character_412.txt b/mods/skinsdb/meta/character.412.txt similarity index 100% rename from mods/skinsdb/meta/character_412.txt rename to mods/skinsdb/meta/character.412.txt diff --git a/mods/skinsdb/meta/character_413.txt b/mods/skinsdb/meta/character.413.txt similarity index 100% rename from mods/skinsdb/meta/character_413.txt rename to mods/skinsdb/meta/character.413.txt diff --git a/mods/skinsdb/meta/character_414.txt b/mods/skinsdb/meta/character.414.txt similarity index 100% rename from mods/skinsdb/meta/character_414.txt rename to mods/skinsdb/meta/character.414.txt diff --git a/mods/skinsdb/meta/character_415.txt b/mods/skinsdb/meta/character.415.txt similarity index 100% rename from mods/skinsdb/meta/character_415.txt rename to mods/skinsdb/meta/character.415.txt diff --git a/mods/skinsdb/meta/character_416.txt b/mods/skinsdb/meta/character.416.txt similarity index 100% rename from mods/skinsdb/meta/character_416.txt rename to mods/skinsdb/meta/character.416.txt diff --git a/mods/skinsdb/meta/character_417.txt b/mods/skinsdb/meta/character.417.txt similarity index 100% rename from mods/skinsdb/meta/character_417.txt rename to mods/skinsdb/meta/character.417.txt diff --git a/mods/skinsdb/meta/character_418.txt b/mods/skinsdb/meta/character.418.txt similarity index 100% rename from mods/skinsdb/meta/character_418.txt rename to mods/skinsdb/meta/character.418.txt diff --git a/mods/skinsdb/meta/character_419.txt b/mods/skinsdb/meta/character.419.txt similarity index 100% rename from mods/skinsdb/meta/character_419.txt rename to mods/skinsdb/meta/character.419.txt diff --git a/mods/skinsdb/meta/character_420.txt b/mods/skinsdb/meta/character.420.txt similarity index 100% rename from mods/skinsdb/meta/character_420.txt rename to mods/skinsdb/meta/character.420.txt diff --git a/mods/skinsdb/meta/character_421.txt b/mods/skinsdb/meta/character.421.txt similarity index 100% rename from mods/skinsdb/meta/character_421.txt rename to mods/skinsdb/meta/character.421.txt diff --git a/mods/skinsdb/meta/character_428.txt b/mods/skinsdb/meta/character.428.txt similarity index 100% rename from mods/skinsdb/meta/character_428.txt rename to mods/skinsdb/meta/character.428.txt diff --git a/mods/skinsdb/meta/character_429.txt b/mods/skinsdb/meta/character.429.txt similarity index 100% rename from mods/skinsdb/meta/character_429.txt rename to mods/skinsdb/meta/character.429.txt diff --git a/mods/skinsdb/meta/character_430.txt b/mods/skinsdb/meta/character.430.txt similarity index 100% rename from mods/skinsdb/meta/character_430.txt rename to mods/skinsdb/meta/character.430.txt diff --git a/mods/skinsdb/meta/character_431.txt b/mods/skinsdb/meta/character.431.txt similarity index 100% rename from mods/skinsdb/meta/character_431.txt rename to mods/skinsdb/meta/character.431.txt diff --git a/mods/skinsdb/meta/character_432.txt b/mods/skinsdb/meta/character.432.txt similarity index 100% rename from mods/skinsdb/meta/character_432.txt rename to mods/skinsdb/meta/character.432.txt diff --git a/mods/skinsdb/meta/character_433.txt b/mods/skinsdb/meta/character.433.txt similarity index 100% rename from mods/skinsdb/meta/character_433.txt rename to mods/skinsdb/meta/character.433.txt diff --git a/mods/skinsdb/meta/character_434.txt b/mods/skinsdb/meta/character.434.txt similarity index 100% rename from mods/skinsdb/meta/character_434.txt rename to mods/skinsdb/meta/character.434.txt diff --git a/mods/skinsdb/meta/character_435.txt b/mods/skinsdb/meta/character.435.txt similarity index 100% rename from mods/skinsdb/meta/character_435.txt rename to mods/skinsdb/meta/character.435.txt diff --git a/mods/skinsdb/meta/character_436.txt b/mods/skinsdb/meta/character.436.txt similarity index 100% rename from mods/skinsdb/meta/character_436.txt rename to mods/skinsdb/meta/character.436.txt diff --git a/mods/skinsdb/meta/character_437.txt b/mods/skinsdb/meta/character.437.txt similarity index 100% rename from mods/skinsdb/meta/character_437.txt rename to mods/skinsdb/meta/character.437.txt diff --git a/mods/skinsdb/meta/character_438.txt b/mods/skinsdb/meta/character.438.txt similarity index 100% rename from mods/skinsdb/meta/character_438.txt rename to mods/skinsdb/meta/character.438.txt diff --git a/mods/skinsdb/meta/character_439.txt b/mods/skinsdb/meta/character.439.txt similarity index 100% rename from mods/skinsdb/meta/character_439.txt rename to mods/skinsdb/meta/character.439.txt diff --git a/mods/skinsdb/meta/character_440.txt b/mods/skinsdb/meta/character.440.txt similarity index 100% rename from mods/skinsdb/meta/character_440.txt rename to mods/skinsdb/meta/character.440.txt diff --git a/mods/skinsdb/meta/character_441.txt b/mods/skinsdb/meta/character.441.txt similarity index 100% rename from mods/skinsdb/meta/character_441.txt rename to mods/skinsdb/meta/character.441.txt diff --git a/mods/skinsdb/meta/character_442.txt b/mods/skinsdb/meta/character.442.txt similarity index 100% rename from mods/skinsdb/meta/character_442.txt rename to mods/skinsdb/meta/character.442.txt diff --git a/mods/skinsdb/meta/character_443.txt b/mods/skinsdb/meta/character.443.txt similarity index 100% rename from mods/skinsdb/meta/character_443.txt rename to mods/skinsdb/meta/character.443.txt diff --git a/mods/skinsdb/meta/character_444.txt b/mods/skinsdb/meta/character.444.txt similarity index 100% rename from mods/skinsdb/meta/character_444.txt rename to mods/skinsdb/meta/character.444.txt diff --git a/mods/skinsdb/meta/character_445.txt b/mods/skinsdb/meta/character.445.txt similarity index 100% rename from mods/skinsdb/meta/character_445.txt rename to mods/skinsdb/meta/character.445.txt diff --git a/mods/skinsdb/meta/character_446.txt b/mods/skinsdb/meta/character.446.txt similarity index 100% rename from mods/skinsdb/meta/character_446.txt rename to mods/skinsdb/meta/character.446.txt diff --git a/mods/skinsdb/meta/character_447.txt b/mods/skinsdb/meta/character.447.txt similarity index 100% rename from mods/skinsdb/meta/character_447.txt rename to mods/skinsdb/meta/character.447.txt diff --git a/mods/skinsdb/meta/character_448.txt b/mods/skinsdb/meta/character.448.txt similarity index 100% rename from mods/skinsdb/meta/character_448.txt rename to mods/skinsdb/meta/character.448.txt diff --git a/mods/skinsdb/meta/character_449.txt b/mods/skinsdb/meta/character.449.txt similarity index 100% rename from mods/skinsdb/meta/character_449.txt rename to mods/skinsdb/meta/character.449.txt diff --git a/mods/skinsdb/meta/character_450.txt b/mods/skinsdb/meta/character.450.txt similarity index 100% rename from mods/skinsdb/meta/character_450.txt rename to mods/skinsdb/meta/character.450.txt diff --git a/mods/skinsdb/meta/character_451.txt b/mods/skinsdb/meta/character.451.txt similarity index 100% rename from mods/skinsdb/meta/character_451.txt rename to mods/skinsdb/meta/character.451.txt diff --git a/mods/skinsdb/meta/character_452.txt b/mods/skinsdb/meta/character.452.txt similarity index 100% rename from mods/skinsdb/meta/character_452.txt rename to mods/skinsdb/meta/character.452.txt diff --git a/mods/skinsdb/meta/character_453.txt b/mods/skinsdb/meta/character.453.txt similarity index 100% rename from mods/skinsdb/meta/character_453.txt rename to mods/skinsdb/meta/character.453.txt diff --git a/mods/skinsdb/meta/character_454.txt b/mods/skinsdb/meta/character.454.txt similarity index 100% rename from mods/skinsdb/meta/character_454.txt rename to mods/skinsdb/meta/character.454.txt diff --git a/mods/skinsdb/meta/character_456.txt b/mods/skinsdb/meta/character.456.txt similarity index 100% rename from mods/skinsdb/meta/character_456.txt rename to mods/skinsdb/meta/character.456.txt diff --git a/mods/skinsdb/meta/character_457.txt b/mods/skinsdb/meta/character.457.txt similarity index 100% rename from mods/skinsdb/meta/character_457.txt rename to mods/skinsdb/meta/character.457.txt diff --git a/mods/skinsdb/meta/character_458.txt b/mods/skinsdb/meta/character.458.txt similarity index 100% rename from mods/skinsdb/meta/character_458.txt rename to mods/skinsdb/meta/character.458.txt diff --git a/mods/skinsdb/meta/character_459.txt b/mods/skinsdb/meta/character.459.txt similarity index 100% rename from mods/skinsdb/meta/character_459.txt rename to mods/skinsdb/meta/character.459.txt diff --git a/mods/skinsdb/meta/character_460.txt b/mods/skinsdb/meta/character.460.txt similarity index 100% rename from mods/skinsdb/meta/character_460.txt rename to mods/skinsdb/meta/character.460.txt diff --git a/mods/skinsdb/meta/character_461.txt b/mods/skinsdb/meta/character.461.txt similarity index 100% rename from mods/skinsdb/meta/character_461.txt rename to mods/skinsdb/meta/character.461.txt diff --git a/mods/skinsdb/meta/character_462.txt b/mods/skinsdb/meta/character.462.txt similarity index 100% rename from mods/skinsdb/meta/character_462.txt rename to mods/skinsdb/meta/character.462.txt diff --git a/mods/skinsdb/meta/character_463.txt b/mods/skinsdb/meta/character.463.txt similarity index 100% rename from mods/skinsdb/meta/character_463.txt rename to mods/skinsdb/meta/character.463.txt diff --git a/mods/skinsdb/meta/character_464.txt b/mods/skinsdb/meta/character.464.txt similarity index 100% rename from mods/skinsdb/meta/character_464.txt rename to mods/skinsdb/meta/character.464.txt diff --git a/mods/skinsdb/meta/character_465.txt b/mods/skinsdb/meta/character.465.txt similarity index 100% rename from mods/skinsdb/meta/character_465.txt rename to mods/skinsdb/meta/character.465.txt diff --git a/mods/skinsdb/meta/character_466.txt b/mods/skinsdb/meta/character.466.txt similarity index 100% rename from mods/skinsdb/meta/character_466.txt rename to mods/skinsdb/meta/character.466.txt diff --git a/mods/skinsdb/meta/character_467.txt b/mods/skinsdb/meta/character.467.txt similarity index 100% rename from mods/skinsdb/meta/character_467.txt rename to mods/skinsdb/meta/character.467.txt diff --git a/mods/skinsdb/meta/character_468.txt b/mods/skinsdb/meta/character.468.txt similarity index 100% rename from mods/skinsdb/meta/character_468.txt rename to mods/skinsdb/meta/character.468.txt diff --git a/mods/skinsdb/meta/character_469.txt b/mods/skinsdb/meta/character.469.txt similarity index 100% rename from mods/skinsdb/meta/character_469.txt rename to mods/skinsdb/meta/character.469.txt diff --git a/mods/skinsdb/meta/character_470.txt b/mods/skinsdb/meta/character.470.txt similarity index 100% rename from mods/skinsdb/meta/character_470.txt rename to mods/skinsdb/meta/character.470.txt diff --git a/mods/skinsdb/meta/character_471.txt b/mods/skinsdb/meta/character.471.txt similarity index 100% rename from mods/skinsdb/meta/character_471.txt rename to mods/skinsdb/meta/character.471.txt diff --git a/mods/skinsdb/meta/character_473.txt b/mods/skinsdb/meta/character.473.txt similarity index 100% rename from mods/skinsdb/meta/character_473.txt rename to mods/skinsdb/meta/character.473.txt diff --git a/mods/skinsdb/meta/character_474.txt b/mods/skinsdb/meta/character.474.txt similarity index 100% rename from mods/skinsdb/meta/character_474.txt rename to mods/skinsdb/meta/character.474.txt diff --git a/mods/skinsdb/meta/character_475.txt b/mods/skinsdb/meta/character.475.txt similarity index 100% rename from mods/skinsdb/meta/character_475.txt rename to mods/skinsdb/meta/character.475.txt diff --git a/mods/skinsdb/meta/character_476.txt b/mods/skinsdb/meta/character.476.txt similarity index 100% rename from mods/skinsdb/meta/character_476.txt rename to mods/skinsdb/meta/character.476.txt diff --git a/mods/skinsdb/meta/character_477.txt b/mods/skinsdb/meta/character.477.txt similarity index 100% rename from mods/skinsdb/meta/character_477.txt rename to mods/skinsdb/meta/character.477.txt diff --git a/mods/skinsdb/meta/character_478.txt b/mods/skinsdb/meta/character.478.txt similarity index 100% rename from mods/skinsdb/meta/character_478.txt rename to mods/skinsdb/meta/character.478.txt diff --git a/mods/skinsdb/meta/character_479.txt b/mods/skinsdb/meta/character.479.txt similarity index 100% rename from mods/skinsdb/meta/character_479.txt rename to mods/skinsdb/meta/character.479.txt diff --git a/mods/skinsdb/meta/character_480.txt b/mods/skinsdb/meta/character.480.txt similarity index 100% rename from mods/skinsdb/meta/character_480.txt rename to mods/skinsdb/meta/character.480.txt diff --git a/mods/skinsdb/meta/character_482.txt b/mods/skinsdb/meta/character.482.txt similarity index 100% rename from mods/skinsdb/meta/character_482.txt rename to mods/skinsdb/meta/character.482.txt diff --git a/mods/skinsdb/meta/character_483.txt b/mods/skinsdb/meta/character.483.txt similarity index 100% rename from mods/skinsdb/meta/character_483.txt rename to mods/skinsdb/meta/character.483.txt diff --git a/mods/skinsdb/meta/character_484.txt b/mods/skinsdb/meta/character.484.txt similarity index 100% rename from mods/skinsdb/meta/character_484.txt rename to mods/skinsdb/meta/character.484.txt diff --git a/mods/skinsdb/meta/character_485.txt b/mods/skinsdb/meta/character.485.txt similarity index 100% rename from mods/skinsdb/meta/character_485.txt rename to mods/skinsdb/meta/character.485.txt diff --git a/mods/skinsdb/meta/character_486.txt b/mods/skinsdb/meta/character.486.txt similarity index 100% rename from mods/skinsdb/meta/character_486.txt rename to mods/skinsdb/meta/character.486.txt diff --git a/mods/skinsdb/meta/character_487.txt b/mods/skinsdb/meta/character.487.txt similarity index 100% rename from mods/skinsdb/meta/character_487.txt rename to mods/skinsdb/meta/character.487.txt diff --git a/mods/skinsdb/meta/character_488.txt b/mods/skinsdb/meta/character.488.txt similarity index 100% rename from mods/skinsdb/meta/character_488.txt rename to mods/skinsdb/meta/character.488.txt diff --git a/mods/skinsdb/meta/character_489.txt b/mods/skinsdb/meta/character.489.txt similarity index 100% rename from mods/skinsdb/meta/character_489.txt rename to mods/skinsdb/meta/character.489.txt diff --git a/mods/skinsdb/meta/character_490.txt b/mods/skinsdb/meta/character.490.txt similarity index 100% rename from mods/skinsdb/meta/character_490.txt rename to mods/skinsdb/meta/character.490.txt diff --git a/mods/skinsdb/meta/character_491.txt b/mods/skinsdb/meta/character.491.txt similarity index 100% rename from mods/skinsdb/meta/character_491.txt rename to mods/skinsdb/meta/character.491.txt diff --git a/mods/skinsdb/meta/character_492.txt b/mods/skinsdb/meta/character.492.txt similarity index 100% rename from mods/skinsdb/meta/character_492.txt rename to mods/skinsdb/meta/character.492.txt diff --git a/mods/skinsdb/meta/character_493.txt b/mods/skinsdb/meta/character.493.txt similarity index 100% rename from mods/skinsdb/meta/character_493.txt rename to mods/skinsdb/meta/character.493.txt diff --git a/mods/skinsdb/meta/character_494.txt b/mods/skinsdb/meta/character.494.txt similarity index 100% rename from mods/skinsdb/meta/character_494.txt rename to mods/skinsdb/meta/character.494.txt diff --git a/mods/skinsdb/meta/character_495.txt b/mods/skinsdb/meta/character.495.txt similarity index 100% rename from mods/skinsdb/meta/character_495.txt rename to mods/skinsdb/meta/character.495.txt diff --git a/mods/skinsdb/meta/character_496.txt b/mods/skinsdb/meta/character.496.txt similarity index 100% rename from mods/skinsdb/meta/character_496.txt rename to mods/skinsdb/meta/character.496.txt diff --git a/mods/skinsdb/meta/character_497.txt b/mods/skinsdb/meta/character.497.txt similarity index 100% rename from mods/skinsdb/meta/character_497.txt rename to mods/skinsdb/meta/character.497.txt diff --git a/mods/skinsdb/meta/character_498.txt b/mods/skinsdb/meta/character.498.txt similarity index 100% rename from mods/skinsdb/meta/character_498.txt rename to mods/skinsdb/meta/character.498.txt diff --git a/mods/skinsdb/meta/character_5.txt b/mods/skinsdb/meta/character.5.txt similarity index 100% rename from mods/skinsdb/meta/character_5.txt rename to mods/skinsdb/meta/character.5.txt diff --git a/mods/skinsdb/meta/character_50.txt b/mods/skinsdb/meta/character.50.txt similarity index 100% rename from mods/skinsdb/meta/character_50.txt rename to mods/skinsdb/meta/character.50.txt diff --git a/mods/skinsdb/meta/character_500.txt b/mods/skinsdb/meta/character.500.txt similarity index 100% rename from mods/skinsdb/meta/character_500.txt rename to mods/skinsdb/meta/character.500.txt diff --git a/mods/skinsdb/meta/character_501.txt b/mods/skinsdb/meta/character.501.txt similarity index 100% rename from mods/skinsdb/meta/character_501.txt rename to mods/skinsdb/meta/character.501.txt diff --git a/mods/skinsdb/meta/character_502.txt b/mods/skinsdb/meta/character.502.txt similarity index 100% rename from mods/skinsdb/meta/character_502.txt rename to mods/skinsdb/meta/character.502.txt diff --git a/mods/skinsdb/meta/character_503.txt b/mods/skinsdb/meta/character.503.txt similarity index 100% rename from mods/skinsdb/meta/character_503.txt rename to mods/skinsdb/meta/character.503.txt diff --git a/mods/skinsdb/meta/character_504.txt b/mods/skinsdb/meta/character.504.txt similarity index 100% rename from mods/skinsdb/meta/character_504.txt rename to mods/skinsdb/meta/character.504.txt diff --git a/mods/skinsdb/meta/character_505.txt b/mods/skinsdb/meta/character.505.txt similarity index 100% rename from mods/skinsdb/meta/character_505.txt rename to mods/skinsdb/meta/character.505.txt diff --git a/mods/skinsdb/meta/character_507.txt b/mods/skinsdb/meta/character.507.txt similarity index 100% rename from mods/skinsdb/meta/character_507.txt rename to mods/skinsdb/meta/character.507.txt diff --git a/mods/skinsdb/meta/character_510.txt b/mods/skinsdb/meta/character.510.txt similarity index 100% rename from mods/skinsdb/meta/character_510.txt rename to mods/skinsdb/meta/character.510.txt diff --git a/mods/skinsdb/meta/character_511.txt b/mods/skinsdb/meta/character.511.txt similarity index 100% rename from mods/skinsdb/meta/character_511.txt rename to mods/skinsdb/meta/character.511.txt diff --git a/mods/skinsdb/meta/character_512.txt b/mods/skinsdb/meta/character.512.txt similarity index 100% rename from mods/skinsdb/meta/character_512.txt rename to mods/skinsdb/meta/character.512.txt diff --git a/mods/skinsdb/meta/character_513.txt b/mods/skinsdb/meta/character.513.txt similarity index 100% rename from mods/skinsdb/meta/character_513.txt rename to mods/skinsdb/meta/character.513.txt diff --git a/mods/skinsdb/meta/character_514.txt b/mods/skinsdb/meta/character.514.txt similarity index 100% rename from mods/skinsdb/meta/character_514.txt rename to mods/skinsdb/meta/character.514.txt diff --git a/mods/skinsdb/meta/character_515.txt b/mods/skinsdb/meta/character.515.txt similarity index 100% rename from mods/skinsdb/meta/character_515.txt rename to mods/skinsdb/meta/character.515.txt diff --git a/mods/skinsdb/meta/character_516.txt b/mods/skinsdb/meta/character.516.txt similarity index 100% rename from mods/skinsdb/meta/character_516.txt rename to mods/skinsdb/meta/character.516.txt diff --git a/mods/skinsdb/meta/character_517.txt b/mods/skinsdb/meta/character.517.txt similarity index 100% rename from mods/skinsdb/meta/character_517.txt rename to mods/skinsdb/meta/character.517.txt diff --git a/mods/skinsdb/meta/character_518.txt b/mods/skinsdb/meta/character.518.txt similarity index 100% rename from mods/skinsdb/meta/character_518.txt rename to mods/skinsdb/meta/character.518.txt diff --git a/mods/skinsdb/meta/character_519.txt b/mods/skinsdb/meta/character.519.txt similarity index 100% rename from mods/skinsdb/meta/character_519.txt rename to mods/skinsdb/meta/character.519.txt diff --git a/mods/skinsdb/meta/character_52.txt b/mods/skinsdb/meta/character.52.txt similarity index 100% rename from mods/skinsdb/meta/character_52.txt rename to mods/skinsdb/meta/character.52.txt diff --git a/mods/skinsdb/meta/character_520.txt b/mods/skinsdb/meta/character.520.txt similarity index 100% rename from mods/skinsdb/meta/character_520.txt rename to mods/skinsdb/meta/character.520.txt diff --git a/mods/skinsdb/meta/character_521.txt b/mods/skinsdb/meta/character.521.txt similarity index 100% rename from mods/skinsdb/meta/character_521.txt rename to mods/skinsdb/meta/character.521.txt diff --git a/mods/skinsdb/meta/character_522.txt b/mods/skinsdb/meta/character.522.txt similarity index 100% rename from mods/skinsdb/meta/character_522.txt rename to mods/skinsdb/meta/character.522.txt diff --git a/mods/skinsdb/meta/character_523.txt b/mods/skinsdb/meta/character.523.txt similarity index 100% rename from mods/skinsdb/meta/character_523.txt rename to mods/skinsdb/meta/character.523.txt diff --git a/mods/skinsdb/meta/character_524.txt b/mods/skinsdb/meta/character.524.txt similarity index 100% rename from mods/skinsdb/meta/character_524.txt rename to mods/skinsdb/meta/character.524.txt diff --git a/mods/skinsdb/meta/character_525.txt b/mods/skinsdb/meta/character.525.txt similarity index 100% rename from mods/skinsdb/meta/character_525.txt rename to mods/skinsdb/meta/character.525.txt diff --git a/mods/skinsdb/meta/character_526.txt b/mods/skinsdb/meta/character.526.txt similarity index 100% rename from mods/skinsdb/meta/character_526.txt rename to mods/skinsdb/meta/character.526.txt diff --git a/mods/skinsdb/meta/character_527.txt b/mods/skinsdb/meta/character.527.txt similarity index 100% rename from mods/skinsdb/meta/character_527.txt rename to mods/skinsdb/meta/character.527.txt diff --git a/mods/skinsdb/meta/character_528.txt b/mods/skinsdb/meta/character.528.txt similarity index 100% rename from mods/skinsdb/meta/character_528.txt rename to mods/skinsdb/meta/character.528.txt diff --git a/mods/skinsdb/meta/character_529.txt b/mods/skinsdb/meta/character.529.txt similarity index 100% rename from mods/skinsdb/meta/character_529.txt rename to mods/skinsdb/meta/character.529.txt diff --git a/mods/skinsdb/meta/character_530.txt b/mods/skinsdb/meta/character.530.txt similarity index 100% rename from mods/skinsdb/meta/character_530.txt rename to mods/skinsdb/meta/character.530.txt diff --git a/mods/skinsdb/meta/character_531.txt b/mods/skinsdb/meta/character.531.txt similarity index 100% rename from mods/skinsdb/meta/character_531.txt rename to mods/skinsdb/meta/character.531.txt diff --git a/mods/skinsdb/meta/character_532.txt b/mods/skinsdb/meta/character.532.txt similarity index 100% rename from mods/skinsdb/meta/character_532.txt rename to mods/skinsdb/meta/character.532.txt diff --git a/mods/skinsdb/meta/character_533.txt b/mods/skinsdb/meta/character.533.txt similarity index 100% rename from mods/skinsdb/meta/character_533.txt rename to mods/skinsdb/meta/character.533.txt diff --git a/mods/skinsdb/meta/character_534.txt b/mods/skinsdb/meta/character.534.txt similarity index 100% rename from mods/skinsdb/meta/character_534.txt rename to mods/skinsdb/meta/character.534.txt diff --git a/mods/skinsdb/meta/character_535.txt b/mods/skinsdb/meta/character.535.txt similarity index 100% rename from mods/skinsdb/meta/character_535.txt rename to mods/skinsdb/meta/character.535.txt diff --git a/mods/skinsdb/meta/character_536.txt b/mods/skinsdb/meta/character.536.txt similarity index 100% rename from mods/skinsdb/meta/character_536.txt rename to mods/skinsdb/meta/character.536.txt diff --git a/mods/skinsdb/meta/character_537.txt b/mods/skinsdb/meta/character.537.txt similarity index 100% rename from mods/skinsdb/meta/character_537.txt rename to mods/skinsdb/meta/character.537.txt diff --git a/mods/skinsdb/meta/character_539.txt b/mods/skinsdb/meta/character.539.txt similarity index 100% rename from mods/skinsdb/meta/character_539.txt rename to mods/skinsdb/meta/character.539.txt diff --git a/mods/skinsdb/meta/character_54.txt b/mods/skinsdb/meta/character.54.txt similarity index 100% rename from mods/skinsdb/meta/character_54.txt rename to mods/skinsdb/meta/character.54.txt diff --git a/mods/skinsdb/meta/character_540.txt b/mods/skinsdb/meta/character.540.txt similarity index 100% rename from mods/skinsdb/meta/character_540.txt rename to mods/skinsdb/meta/character.540.txt diff --git a/mods/skinsdb/meta/character_541.txt b/mods/skinsdb/meta/character.541.txt similarity index 100% rename from mods/skinsdb/meta/character_541.txt rename to mods/skinsdb/meta/character.541.txt diff --git a/mods/skinsdb/meta/character_542.txt b/mods/skinsdb/meta/character.542.txt similarity index 100% rename from mods/skinsdb/meta/character_542.txt rename to mods/skinsdb/meta/character.542.txt diff --git a/mods/skinsdb/meta/character_543.txt b/mods/skinsdb/meta/character.543.txt similarity index 100% rename from mods/skinsdb/meta/character_543.txt rename to mods/skinsdb/meta/character.543.txt diff --git a/mods/skinsdb/meta/character_544.txt b/mods/skinsdb/meta/character.544.txt similarity index 100% rename from mods/skinsdb/meta/character_544.txt rename to mods/skinsdb/meta/character.544.txt diff --git a/mods/skinsdb/meta/character_545.txt b/mods/skinsdb/meta/character.545.txt similarity index 100% rename from mods/skinsdb/meta/character_545.txt rename to mods/skinsdb/meta/character.545.txt diff --git a/mods/skinsdb/meta/character_546.txt b/mods/skinsdb/meta/character.546.txt similarity index 100% rename from mods/skinsdb/meta/character_546.txt rename to mods/skinsdb/meta/character.546.txt diff --git a/mods/skinsdb/meta/character_547.txt b/mods/skinsdb/meta/character.547.txt similarity index 100% rename from mods/skinsdb/meta/character_547.txt rename to mods/skinsdb/meta/character.547.txt diff --git a/mods/skinsdb/meta/character_548.txt b/mods/skinsdb/meta/character.548.txt similarity index 100% rename from mods/skinsdb/meta/character_548.txt rename to mods/skinsdb/meta/character.548.txt diff --git a/mods/skinsdb/meta/character_549.txt b/mods/skinsdb/meta/character.549.txt similarity index 100% rename from mods/skinsdb/meta/character_549.txt rename to mods/skinsdb/meta/character.549.txt diff --git a/mods/skinsdb/meta/character_55.txt b/mods/skinsdb/meta/character.55.txt similarity index 100% rename from mods/skinsdb/meta/character_55.txt rename to mods/skinsdb/meta/character.55.txt diff --git a/mods/skinsdb/meta/character_550.txt b/mods/skinsdb/meta/character.550.txt similarity index 100% rename from mods/skinsdb/meta/character_550.txt rename to mods/skinsdb/meta/character.550.txt diff --git a/mods/skinsdb/meta/character_551.txt b/mods/skinsdb/meta/character.551.txt similarity index 100% rename from mods/skinsdb/meta/character_551.txt rename to mods/skinsdb/meta/character.551.txt diff --git a/mods/skinsdb/meta/character_552.txt b/mods/skinsdb/meta/character.552.txt similarity index 100% rename from mods/skinsdb/meta/character_552.txt rename to mods/skinsdb/meta/character.552.txt diff --git a/mods/skinsdb/meta/character_553.txt b/mods/skinsdb/meta/character.553.txt similarity index 100% rename from mods/skinsdb/meta/character_553.txt rename to mods/skinsdb/meta/character.553.txt diff --git a/mods/skinsdb/meta/character_554.txt b/mods/skinsdb/meta/character.554.txt similarity index 100% rename from mods/skinsdb/meta/character_554.txt rename to mods/skinsdb/meta/character.554.txt diff --git a/mods/skinsdb/meta/character_555.txt b/mods/skinsdb/meta/character.555.txt similarity index 100% rename from mods/skinsdb/meta/character_555.txt rename to mods/skinsdb/meta/character.555.txt diff --git a/mods/skinsdb/meta/character_556.txt b/mods/skinsdb/meta/character.556.txt similarity index 100% rename from mods/skinsdb/meta/character_556.txt rename to mods/skinsdb/meta/character.556.txt diff --git a/mods/skinsdb/meta/character_558.txt b/mods/skinsdb/meta/character.558.txt similarity index 100% rename from mods/skinsdb/meta/character_558.txt rename to mods/skinsdb/meta/character.558.txt diff --git a/mods/skinsdb/meta/character_559.txt b/mods/skinsdb/meta/character.559.txt similarity index 100% rename from mods/skinsdb/meta/character_559.txt rename to mods/skinsdb/meta/character.559.txt diff --git a/mods/skinsdb/meta/character_560.txt b/mods/skinsdb/meta/character.560.txt similarity index 100% rename from mods/skinsdb/meta/character_560.txt rename to mods/skinsdb/meta/character.560.txt diff --git a/mods/skinsdb/meta/character_561.txt b/mods/skinsdb/meta/character.561.txt similarity index 100% rename from mods/skinsdb/meta/character_561.txt rename to mods/skinsdb/meta/character.561.txt diff --git a/mods/skinsdb/meta/character_562.txt b/mods/skinsdb/meta/character.562.txt similarity index 100% rename from mods/skinsdb/meta/character_562.txt rename to mods/skinsdb/meta/character.562.txt diff --git a/mods/skinsdb/meta/character_563.txt b/mods/skinsdb/meta/character.563.txt similarity index 100% rename from mods/skinsdb/meta/character_563.txt rename to mods/skinsdb/meta/character.563.txt diff --git a/mods/skinsdb/meta/character_564.txt b/mods/skinsdb/meta/character.564.txt similarity index 100% rename from mods/skinsdb/meta/character_564.txt rename to mods/skinsdb/meta/character.564.txt diff --git a/mods/skinsdb/meta/character_565.txt b/mods/skinsdb/meta/character.565.txt similarity index 100% rename from mods/skinsdb/meta/character_565.txt rename to mods/skinsdb/meta/character.565.txt diff --git a/mods/skinsdb/meta/character_567.txt b/mods/skinsdb/meta/character.567.txt similarity index 100% rename from mods/skinsdb/meta/character_567.txt rename to mods/skinsdb/meta/character.567.txt diff --git a/mods/skinsdb/meta/character_57.txt b/mods/skinsdb/meta/character.57.txt similarity index 100% rename from mods/skinsdb/meta/character_57.txt rename to mods/skinsdb/meta/character.57.txt diff --git a/mods/skinsdb/meta/character_570.txt b/mods/skinsdb/meta/character.570.txt similarity index 100% rename from mods/skinsdb/meta/character_570.txt rename to mods/skinsdb/meta/character.570.txt diff --git a/mods/skinsdb/meta/character_571.txt b/mods/skinsdb/meta/character.571.txt similarity index 100% rename from mods/skinsdb/meta/character_571.txt rename to mods/skinsdb/meta/character.571.txt diff --git a/mods/skinsdb/meta/character_572.txt b/mods/skinsdb/meta/character.572.txt similarity index 100% rename from mods/skinsdb/meta/character_572.txt rename to mods/skinsdb/meta/character.572.txt diff --git a/mods/skinsdb/meta/character_573.txt b/mods/skinsdb/meta/character.573.txt similarity index 100% rename from mods/skinsdb/meta/character_573.txt rename to mods/skinsdb/meta/character.573.txt diff --git a/mods/skinsdb/meta/character_575.txt b/mods/skinsdb/meta/character.575.txt similarity index 100% rename from mods/skinsdb/meta/character_575.txt rename to mods/skinsdb/meta/character.575.txt diff --git a/mods/skinsdb/meta/character_576.txt b/mods/skinsdb/meta/character.576.txt similarity index 100% rename from mods/skinsdb/meta/character_576.txt rename to mods/skinsdb/meta/character.576.txt diff --git a/mods/skinsdb/meta/character_577.txt b/mods/skinsdb/meta/character.577.txt similarity index 100% rename from mods/skinsdb/meta/character_577.txt rename to mods/skinsdb/meta/character.577.txt diff --git a/mods/skinsdb/meta/character_578.txt b/mods/skinsdb/meta/character.578.txt similarity index 100% rename from mods/skinsdb/meta/character_578.txt rename to mods/skinsdb/meta/character.578.txt diff --git a/mods/skinsdb/meta/character_579.txt b/mods/skinsdb/meta/character.579.txt similarity index 100% rename from mods/skinsdb/meta/character_579.txt rename to mods/skinsdb/meta/character.579.txt diff --git a/mods/skinsdb/meta/character_580.txt b/mods/skinsdb/meta/character.580.txt similarity index 100% rename from mods/skinsdb/meta/character_580.txt rename to mods/skinsdb/meta/character.580.txt diff --git a/mods/skinsdb/meta/character_581.txt b/mods/skinsdb/meta/character.581.txt similarity index 100% rename from mods/skinsdb/meta/character_581.txt rename to mods/skinsdb/meta/character.581.txt diff --git a/mods/skinsdb/meta/character_582.txt b/mods/skinsdb/meta/character.582.txt similarity index 100% rename from mods/skinsdb/meta/character_582.txt rename to mods/skinsdb/meta/character.582.txt diff --git a/mods/skinsdb/meta/character_583.txt b/mods/skinsdb/meta/character.583.txt similarity index 100% rename from mods/skinsdb/meta/character_583.txt rename to mods/skinsdb/meta/character.583.txt diff --git a/mods/skinsdb/meta/character_584.txt b/mods/skinsdb/meta/character.584.txt similarity index 100% rename from mods/skinsdb/meta/character_584.txt rename to mods/skinsdb/meta/character.584.txt diff --git a/mods/skinsdb/meta/character_585.txt b/mods/skinsdb/meta/character.585.txt similarity index 100% rename from mods/skinsdb/meta/character_585.txt rename to mods/skinsdb/meta/character.585.txt diff --git a/mods/skinsdb/meta/character_586.txt b/mods/skinsdb/meta/character.586.txt similarity index 100% rename from mods/skinsdb/meta/character_586.txt rename to mods/skinsdb/meta/character.586.txt diff --git a/mods/skinsdb/meta/character_587.txt b/mods/skinsdb/meta/character.587.txt similarity index 100% rename from mods/skinsdb/meta/character_587.txt rename to mods/skinsdb/meta/character.587.txt diff --git a/mods/skinsdb/meta/character_588.txt b/mods/skinsdb/meta/character.588.txt similarity index 100% rename from mods/skinsdb/meta/character_588.txt rename to mods/skinsdb/meta/character.588.txt diff --git a/mods/skinsdb/meta/character_589.txt b/mods/skinsdb/meta/character.589.txt similarity index 100% rename from mods/skinsdb/meta/character_589.txt rename to mods/skinsdb/meta/character.589.txt diff --git a/mods/skinsdb/meta/character_590.txt b/mods/skinsdb/meta/character.590.txt similarity index 100% rename from mods/skinsdb/meta/character_590.txt rename to mods/skinsdb/meta/character.590.txt diff --git a/mods/skinsdb/meta/character_591.txt b/mods/skinsdb/meta/character.591.txt similarity index 100% rename from mods/skinsdb/meta/character_591.txt rename to mods/skinsdb/meta/character.591.txt diff --git a/mods/skinsdb/meta/character_592.txt b/mods/skinsdb/meta/character.592.txt similarity index 100% rename from mods/skinsdb/meta/character_592.txt rename to mods/skinsdb/meta/character.592.txt diff --git a/mods/skinsdb/meta/character.593.txt b/mods/skinsdb/meta/character.593.txt new file mode 100644 index 00000000..f3247f3f --- /dev/null +++ b/mods/skinsdb/meta/character.593.txt @@ -0,0 +1,3 @@ +Red ÿoshi +ÿoshi_Retro +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_594.txt b/mods/skinsdb/meta/character.594.txt similarity index 100% rename from mods/skinsdb/meta/character_594.txt rename to mods/skinsdb/meta/character.594.txt diff --git a/mods/skinsdb/meta/character_595.txt b/mods/skinsdb/meta/character.595.txt similarity index 100% rename from mods/skinsdb/meta/character_595.txt rename to mods/skinsdb/meta/character.595.txt diff --git a/mods/skinsdb/meta/character_596.txt b/mods/skinsdb/meta/character.596.txt similarity index 100% rename from mods/skinsdb/meta/character_596.txt rename to mods/skinsdb/meta/character.596.txt diff --git a/mods/skinsdb/meta/character_597.txt b/mods/skinsdb/meta/character.597.txt similarity index 100% rename from mods/skinsdb/meta/character_597.txt rename to mods/skinsdb/meta/character.597.txt diff --git a/mods/skinsdb/meta/character_598.txt b/mods/skinsdb/meta/character.598.txt similarity index 100% rename from mods/skinsdb/meta/character_598.txt rename to mods/skinsdb/meta/character.598.txt diff --git a/mods/skinsdb/meta/character_599.txt b/mods/skinsdb/meta/character.599.txt similarity index 100% rename from mods/skinsdb/meta/character_599.txt rename to mods/skinsdb/meta/character.599.txt diff --git a/mods/skinsdb/meta/character_6.txt b/mods/skinsdb/meta/character.6.txt similarity index 100% rename from mods/skinsdb/meta/character_6.txt rename to mods/skinsdb/meta/character.6.txt diff --git a/mods/skinsdb/meta/character_600.txt b/mods/skinsdb/meta/character.600.txt similarity index 100% rename from mods/skinsdb/meta/character_600.txt rename to mods/skinsdb/meta/character.600.txt diff --git a/mods/skinsdb/meta/character_601.txt b/mods/skinsdb/meta/character.601.txt similarity index 100% rename from mods/skinsdb/meta/character_601.txt rename to mods/skinsdb/meta/character.601.txt diff --git a/mods/skinsdb/meta/character_602.txt b/mods/skinsdb/meta/character.602.txt similarity index 100% rename from mods/skinsdb/meta/character_602.txt rename to mods/skinsdb/meta/character.602.txt diff --git a/mods/skinsdb/meta/character_603.txt b/mods/skinsdb/meta/character.603.txt similarity index 100% rename from mods/skinsdb/meta/character_603.txt rename to mods/skinsdb/meta/character.603.txt diff --git a/mods/skinsdb/meta/character_604.txt b/mods/skinsdb/meta/character.604.txt similarity index 100% rename from mods/skinsdb/meta/character_604.txt rename to mods/skinsdb/meta/character.604.txt diff --git a/mods/skinsdb/meta/character_605.txt b/mods/skinsdb/meta/character.605.txt similarity index 100% rename from mods/skinsdb/meta/character_605.txt rename to mods/skinsdb/meta/character.605.txt diff --git a/mods/skinsdb/meta/character_606.txt b/mods/skinsdb/meta/character.606.txt similarity index 100% rename from mods/skinsdb/meta/character_606.txt rename to mods/skinsdb/meta/character.606.txt diff --git a/mods/skinsdb/meta/character_607.txt b/mods/skinsdb/meta/character.607.txt similarity index 100% rename from mods/skinsdb/meta/character_607.txt rename to mods/skinsdb/meta/character.607.txt diff --git a/mods/skinsdb/meta/character_608.txt b/mods/skinsdb/meta/character.608.txt similarity index 100% rename from mods/skinsdb/meta/character_608.txt rename to mods/skinsdb/meta/character.608.txt diff --git a/mods/skinsdb/meta/character_609.txt b/mods/skinsdb/meta/character.609.txt similarity index 100% rename from mods/skinsdb/meta/character_609.txt rename to mods/skinsdb/meta/character.609.txt diff --git a/mods/skinsdb/meta/character_61.txt b/mods/skinsdb/meta/character.61.txt similarity index 100% rename from mods/skinsdb/meta/character_61.txt rename to mods/skinsdb/meta/character.61.txt diff --git a/mods/skinsdb/meta/character_610.txt b/mods/skinsdb/meta/character.610.txt similarity index 100% rename from mods/skinsdb/meta/character_610.txt rename to mods/skinsdb/meta/character.610.txt diff --git a/mods/skinsdb/meta/character_611.txt b/mods/skinsdb/meta/character.611.txt similarity index 100% rename from mods/skinsdb/meta/character_611.txt rename to mods/skinsdb/meta/character.611.txt diff --git a/mods/skinsdb/meta/character_612.txt b/mods/skinsdb/meta/character.612.txt similarity index 100% rename from mods/skinsdb/meta/character_612.txt rename to mods/skinsdb/meta/character.612.txt diff --git a/mods/skinsdb/meta/character_613.txt b/mods/skinsdb/meta/character.613.txt similarity index 100% rename from mods/skinsdb/meta/character_613.txt rename to mods/skinsdb/meta/character.613.txt diff --git a/mods/skinsdb/meta/character_614.txt b/mods/skinsdb/meta/character.614.txt similarity index 100% rename from mods/skinsdb/meta/character_614.txt rename to mods/skinsdb/meta/character.614.txt diff --git a/mods/skinsdb/meta/character_615.txt b/mods/skinsdb/meta/character.615.txt similarity index 100% rename from mods/skinsdb/meta/character_615.txt rename to mods/skinsdb/meta/character.615.txt diff --git a/mods/skinsdb/meta/character_616.txt b/mods/skinsdb/meta/character.616.txt similarity index 100% rename from mods/skinsdb/meta/character_616.txt rename to mods/skinsdb/meta/character.616.txt diff --git a/mods/skinsdb/meta/character_618.txt b/mods/skinsdb/meta/character.618.txt similarity index 100% rename from mods/skinsdb/meta/character_618.txt rename to mods/skinsdb/meta/character.618.txt diff --git a/mods/skinsdb/meta/character_619.txt b/mods/skinsdb/meta/character.619.txt similarity index 100% rename from mods/skinsdb/meta/character_619.txt rename to mods/skinsdb/meta/character.619.txt diff --git a/mods/skinsdb/meta/character_620.txt b/mods/skinsdb/meta/character.620.txt similarity index 100% rename from mods/skinsdb/meta/character_620.txt rename to mods/skinsdb/meta/character.620.txt diff --git a/mods/skinsdb/meta/character_621.txt b/mods/skinsdb/meta/character.621.txt similarity index 100% rename from mods/skinsdb/meta/character_621.txt rename to mods/skinsdb/meta/character.621.txt diff --git a/mods/skinsdb/meta/character_622.txt b/mods/skinsdb/meta/character.622.txt similarity index 100% rename from mods/skinsdb/meta/character_622.txt rename to mods/skinsdb/meta/character.622.txt diff --git a/mods/skinsdb/meta/character_623.txt b/mods/skinsdb/meta/character.623.txt similarity index 100% rename from mods/skinsdb/meta/character_623.txt rename to mods/skinsdb/meta/character.623.txt diff --git a/mods/skinsdb/meta/character_624.txt b/mods/skinsdb/meta/character.624.txt similarity index 100% rename from mods/skinsdb/meta/character_624.txt rename to mods/skinsdb/meta/character.624.txt diff --git a/mods/skinsdb/meta/character_625.txt b/mods/skinsdb/meta/character.625.txt similarity index 100% rename from mods/skinsdb/meta/character_625.txt rename to mods/skinsdb/meta/character.625.txt diff --git a/mods/skinsdb/meta/character_626.txt b/mods/skinsdb/meta/character.626.txt similarity index 100% rename from mods/skinsdb/meta/character_626.txt rename to mods/skinsdb/meta/character.626.txt diff --git a/mods/skinsdb/meta/character_627.txt b/mods/skinsdb/meta/character.627.txt similarity index 100% rename from mods/skinsdb/meta/character_627.txt rename to mods/skinsdb/meta/character.627.txt diff --git a/mods/skinsdb/meta/character_628.txt b/mods/skinsdb/meta/character.628.txt similarity index 100% rename from mods/skinsdb/meta/character_628.txt rename to mods/skinsdb/meta/character.628.txt diff --git a/mods/skinsdb/meta/character_629.txt b/mods/skinsdb/meta/character.629.txt similarity index 100% rename from mods/skinsdb/meta/character_629.txt rename to mods/skinsdb/meta/character.629.txt diff --git a/mods/skinsdb/meta/character_630.txt b/mods/skinsdb/meta/character.630.txt similarity index 100% rename from mods/skinsdb/meta/character_630.txt rename to mods/skinsdb/meta/character.630.txt diff --git a/mods/skinsdb/meta/character_631.txt b/mods/skinsdb/meta/character.631.txt similarity index 100% rename from mods/skinsdb/meta/character_631.txt rename to mods/skinsdb/meta/character.631.txt diff --git a/mods/skinsdb/meta/character_632.txt b/mods/skinsdb/meta/character.632.txt similarity index 100% rename from mods/skinsdb/meta/character_632.txt rename to mods/skinsdb/meta/character.632.txt diff --git a/mods/skinsdb/meta/character_633.txt b/mods/skinsdb/meta/character.633.txt similarity index 100% rename from mods/skinsdb/meta/character_633.txt rename to mods/skinsdb/meta/character.633.txt diff --git a/mods/skinsdb/meta/character_634.txt b/mods/skinsdb/meta/character.634.txt similarity index 100% rename from mods/skinsdb/meta/character_634.txt rename to mods/skinsdb/meta/character.634.txt diff --git a/mods/skinsdb/meta/character_635.txt b/mods/skinsdb/meta/character.635.txt similarity index 100% rename from mods/skinsdb/meta/character_635.txt rename to mods/skinsdb/meta/character.635.txt diff --git a/mods/skinsdb/meta/character_636.txt b/mods/skinsdb/meta/character.636.txt similarity index 100% rename from mods/skinsdb/meta/character_636.txt rename to mods/skinsdb/meta/character.636.txt diff --git a/mods/skinsdb/meta/character_637.txt b/mods/skinsdb/meta/character.637.txt similarity index 100% rename from mods/skinsdb/meta/character_637.txt rename to mods/skinsdb/meta/character.637.txt diff --git a/mods/skinsdb/meta/character_638.txt b/mods/skinsdb/meta/character.638.txt similarity index 100% rename from mods/skinsdb/meta/character_638.txt rename to mods/skinsdb/meta/character.638.txt diff --git a/mods/skinsdb/meta/character_639.txt b/mods/skinsdb/meta/character.639.txt similarity index 100% rename from mods/skinsdb/meta/character_639.txt rename to mods/skinsdb/meta/character.639.txt diff --git a/mods/skinsdb/meta/character_640.txt b/mods/skinsdb/meta/character.640.txt similarity index 100% rename from mods/skinsdb/meta/character_640.txt rename to mods/skinsdb/meta/character.640.txt diff --git a/mods/skinsdb/meta/character_641.txt b/mods/skinsdb/meta/character.641.txt similarity index 100% rename from mods/skinsdb/meta/character_641.txt rename to mods/skinsdb/meta/character.641.txt diff --git a/mods/skinsdb/meta/character_642.txt b/mods/skinsdb/meta/character.642.txt similarity index 100% rename from mods/skinsdb/meta/character_642.txt rename to mods/skinsdb/meta/character.642.txt diff --git a/mods/skinsdb/meta/character_643.txt b/mods/skinsdb/meta/character.643.txt similarity index 100% rename from mods/skinsdb/meta/character_643.txt rename to mods/skinsdb/meta/character.643.txt diff --git a/mods/skinsdb/meta/character_644.txt b/mods/skinsdb/meta/character.644.txt similarity index 100% rename from mods/skinsdb/meta/character_644.txt rename to mods/skinsdb/meta/character.644.txt diff --git a/mods/skinsdb/meta/character_645.txt b/mods/skinsdb/meta/character.645.txt similarity index 100% rename from mods/skinsdb/meta/character_645.txt rename to mods/skinsdb/meta/character.645.txt diff --git a/mods/skinsdb/meta/character_646.txt b/mods/skinsdb/meta/character.646.txt similarity index 100% rename from mods/skinsdb/meta/character_646.txt rename to mods/skinsdb/meta/character.646.txt diff --git a/mods/skinsdb/meta/character_647.txt b/mods/skinsdb/meta/character.647.txt similarity index 100% rename from mods/skinsdb/meta/character_647.txt rename to mods/skinsdb/meta/character.647.txt diff --git a/mods/skinsdb/meta/character.648.txt b/mods/skinsdb/meta/character.648.txt new file mode 100644 index 00000000..ac6086fd --- /dev/null +++ b/mods/skinsdb/meta/character.648.txt @@ -0,0 +1,3 @@ +SCP-049 "Plague Doctor" (SCP Foundation) +Esteban +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_649.txt b/mods/skinsdb/meta/character.649.txt similarity index 100% rename from mods/skinsdb/meta/character_649.txt rename to mods/skinsdb/meta/character.649.txt diff --git a/mods/skinsdb/meta/character_650.txt b/mods/skinsdb/meta/character.650.txt similarity index 100% rename from mods/skinsdb/meta/character_650.txt rename to mods/skinsdb/meta/character.650.txt diff --git a/mods/skinsdb/meta/character_651.txt b/mods/skinsdb/meta/character.651.txt similarity index 100% rename from mods/skinsdb/meta/character_651.txt rename to mods/skinsdb/meta/character.651.txt diff --git a/mods/skinsdb/meta/character_652.txt b/mods/skinsdb/meta/character.652.txt similarity index 100% rename from mods/skinsdb/meta/character_652.txt rename to mods/skinsdb/meta/character.652.txt diff --git a/mods/skinsdb/meta/character_656.txt b/mods/skinsdb/meta/character.656.txt similarity index 100% rename from mods/skinsdb/meta/character_656.txt rename to mods/skinsdb/meta/character.656.txt diff --git a/mods/skinsdb/meta/character_657.txt b/mods/skinsdb/meta/character.657.txt similarity index 100% rename from mods/skinsdb/meta/character_657.txt rename to mods/skinsdb/meta/character.657.txt diff --git a/mods/skinsdb/meta/character_658.txt b/mods/skinsdb/meta/character.658.txt similarity index 100% rename from mods/skinsdb/meta/character_658.txt rename to mods/skinsdb/meta/character.658.txt diff --git a/mods/skinsdb/meta/character_659.txt b/mods/skinsdb/meta/character.659.txt similarity index 100% rename from mods/skinsdb/meta/character_659.txt rename to mods/skinsdb/meta/character.659.txt diff --git a/mods/skinsdb/meta/character_660.txt b/mods/skinsdb/meta/character.660.txt similarity index 100% rename from mods/skinsdb/meta/character_660.txt rename to mods/skinsdb/meta/character.660.txt diff --git a/mods/skinsdb/meta/character_661.txt b/mods/skinsdb/meta/character.661.txt similarity index 100% rename from mods/skinsdb/meta/character_661.txt rename to mods/skinsdb/meta/character.661.txt diff --git a/mods/skinsdb/meta/character_662.txt b/mods/skinsdb/meta/character.662.txt similarity index 100% rename from mods/skinsdb/meta/character_662.txt rename to mods/skinsdb/meta/character.662.txt diff --git a/mods/skinsdb/meta/character_663.txt b/mods/skinsdb/meta/character.663.txt similarity index 100% rename from mods/skinsdb/meta/character_663.txt rename to mods/skinsdb/meta/character.663.txt diff --git a/mods/skinsdb/meta/character_664.txt b/mods/skinsdb/meta/character.664.txt similarity index 100% rename from mods/skinsdb/meta/character_664.txt rename to mods/skinsdb/meta/character.664.txt diff --git a/mods/skinsdb/meta/character_666.txt b/mods/skinsdb/meta/character.666.txt similarity index 100% rename from mods/skinsdb/meta/character_666.txt rename to mods/skinsdb/meta/character.666.txt diff --git a/mods/skinsdb/meta/character_667.txt b/mods/skinsdb/meta/character.667.txt similarity index 100% rename from mods/skinsdb/meta/character_667.txt rename to mods/skinsdb/meta/character.667.txt diff --git a/mods/skinsdb/meta/character_668.txt b/mods/skinsdb/meta/character.668.txt similarity index 100% rename from mods/skinsdb/meta/character_668.txt rename to mods/skinsdb/meta/character.668.txt diff --git a/mods/skinsdb/meta/character_669.txt b/mods/skinsdb/meta/character.669.txt similarity index 100% rename from mods/skinsdb/meta/character_669.txt rename to mods/skinsdb/meta/character.669.txt diff --git a/mods/skinsdb/meta/character_670.txt b/mods/skinsdb/meta/character.670.txt similarity index 100% rename from mods/skinsdb/meta/character_670.txt rename to mods/skinsdb/meta/character.670.txt diff --git a/mods/skinsdb/meta/character_671.txt b/mods/skinsdb/meta/character.671.txt similarity index 100% rename from mods/skinsdb/meta/character_671.txt rename to mods/skinsdb/meta/character.671.txt diff --git a/mods/skinsdb/meta/character_672.txt b/mods/skinsdb/meta/character.672.txt similarity index 100% rename from mods/skinsdb/meta/character_672.txt rename to mods/skinsdb/meta/character.672.txt diff --git a/mods/skinsdb/meta/character_673.txt b/mods/skinsdb/meta/character.673.txt similarity index 100% rename from mods/skinsdb/meta/character_673.txt rename to mods/skinsdb/meta/character.673.txt diff --git a/mods/skinsdb/meta/character_674.txt b/mods/skinsdb/meta/character.674.txt similarity index 100% rename from mods/skinsdb/meta/character_674.txt rename to mods/skinsdb/meta/character.674.txt diff --git a/mods/skinsdb/meta/character_675.txt b/mods/skinsdb/meta/character.675.txt similarity index 100% rename from mods/skinsdb/meta/character_675.txt rename to mods/skinsdb/meta/character.675.txt diff --git a/mods/skinsdb/meta/character_676.txt b/mods/skinsdb/meta/character.676.txt similarity index 100% rename from mods/skinsdb/meta/character_676.txt rename to mods/skinsdb/meta/character.676.txt diff --git a/mods/skinsdb/meta/character_677.txt b/mods/skinsdb/meta/character.677.txt similarity index 100% rename from mods/skinsdb/meta/character_677.txt rename to mods/skinsdb/meta/character.677.txt diff --git a/mods/skinsdb/meta/character_678.txt b/mods/skinsdb/meta/character.678.txt similarity index 100% rename from mods/skinsdb/meta/character_678.txt rename to mods/skinsdb/meta/character.678.txt diff --git a/mods/skinsdb/meta/character_679.txt b/mods/skinsdb/meta/character.679.txt similarity index 100% rename from mods/skinsdb/meta/character_679.txt rename to mods/skinsdb/meta/character.679.txt diff --git a/mods/skinsdb/meta/character_680.txt b/mods/skinsdb/meta/character.680.txt similarity index 100% rename from mods/skinsdb/meta/character_680.txt rename to mods/skinsdb/meta/character.680.txt diff --git a/mods/skinsdb/meta/character_681.txt b/mods/skinsdb/meta/character.681.txt similarity index 100% rename from mods/skinsdb/meta/character_681.txt rename to mods/skinsdb/meta/character.681.txt diff --git a/mods/skinsdb/meta/character_682.txt b/mods/skinsdb/meta/character.682.txt similarity index 100% rename from mods/skinsdb/meta/character_682.txt rename to mods/skinsdb/meta/character.682.txt diff --git a/mods/skinsdb/meta/character_683.txt b/mods/skinsdb/meta/character.683.txt similarity index 100% rename from mods/skinsdb/meta/character_683.txt rename to mods/skinsdb/meta/character.683.txt diff --git a/mods/skinsdb/meta/character_684.txt b/mods/skinsdb/meta/character.684.txt similarity index 100% rename from mods/skinsdb/meta/character_684.txt rename to mods/skinsdb/meta/character.684.txt diff --git a/mods/skinsdb/meta/character_685.txt b/mods/skinsdb/meta/character.685.txt similarity index 100% rename from mods/skinsdb/meta/character_685.txt rename to mods/skinsdb/meta/character.685.txt diff --git a/mods/skinsdb/meta/character_686.txt b/mods/skinsdb/meta/character.686.txt similarity index 100% rename from mods/skinsdb/meta/character_686.txt rename to mods/skinsdb/meta/character.686.txt diff --git a/mods/skinsdb/meta/character_687.txt b/mods/skinsdb/meta/character.687.txt similarity index 100% rename from mods/skinsdb/meta/character_687.txt rename to mods/skinsdb/meta/character.687.txt diff --git a/mods/skinsdb/meta/character_688.txt b/mods/skinsdb/meta/character.688.txt similarity index 100% rename from mods/skinsdb/meta/character_688.txt rename to mods/skinsdb/meta/character.688.txt diff --git a/mods/skinsdb/meta/character_689.txt b/mods/skinsdb/meta/character.689.txt similarity index 100% rename from mods/skinsdb/meta/character_689.txt rename to mods/skinsdb/meta/character.689.txt diff --git a/mods/skinsdb/meta/character_69.txt b/mods/skinsdb/meta/character.69.txt similarity index 100% rename from mods/skinsdb/meta/character_69.txt rename to mods/skinsdb/meta/character.69.txt diff --git a/mods/skinsdb/meta/character_690.txt b/mods/skinsdb/meta/character.690.txt similarity index 100% rename from mods/skinsdb/meta/character_690.txt rename to mods/skinsdb/meta/character.690.txt diff --git a/mods/skinsdb/meta/character_691.txt b/mods/skinsdb/meta/character.691.txt similarity index 100% rename from mods/skinsdb/meta/character_691.txt rename to mods/skinsdb/meta/character.691.txt diff --git a/mods/skinsdb/meta/character_692.txt b/mods/skinsdb/meta/character.692.txt similarity index 100% rename from mods/skinsdb/meta/character_692.txt rename to mods/skinsdb/meta/character.692.txt diff --git a/mods/skinsdb/meta/character_693.txt b/mods/skinsdb/meta/character.693.txt similarity index 100% rename from mods/skinsdb/meta/character_693.txt rename to mods/skinsdb/meta/character.693.txt diff --git a/mods/skinsdb/meta/character_694.txt b/mods/skinsdb/meta/character.694.txt similarity index 100% rename from mods/skinsdb/meta/character_694.txt rename to mods/skinsdb/meta/character.694.txt diff --git a/mods/skinsdb/meta/character_695.txt b/mods/skinsdb/meta/character.695.txt similarity index 100% rename from mods/skinsdb/meta/character_695.txt rename to mods/skinsdb/meta/character.695.txt diff --git a/mods/skinsdb/meta/character_696.txt b/mods/skinsdb/meta/character.696.txt similarity index 100% rename from mods/skinsdb/meta/character_696.txt rename to mods/skinsdb/meta/character.696.txt diff --git a/mods/skinsdb/meta/character_697.txt b/mods/skinsdb/meta/character.697.txt similarity index 100% rename from mods/skinsdb/meta/character_697.txt rename to mods/skinsdb/meta/character.697.txt diff --git a/mods/skinsdb/meta/character_698.txt b/mods/skinsdb/meta/character.698.txt similarity index 100% rename from mods/skinsdb/meta/character_698.txt rename to mods/skinsdb/meta/character.698.txt diff --git a/mods/skinsdb/meta/character_699.txt b/mods/skinsdb/meta/character.699.txt similarity index 100% rename from mods/skinsdb/meta/character_699.txt rename to mods/skinsdb/meta/character.699.txt diff --git a/mods/skinsdb/meta/character_7.txt b/mods/skinsdb/meta/character.7.txt similarity index 100% rename from mods/skinsdb/meta/character_7.txt rename to mods/skinsdb/meta/character.7.txt diff --git a/mods/skinsdb/meta/character_70.txt b/mods/skinsdb/meta/character.70.txt similarity index 100% rename from mods/skinsdb/meta/character_70.txt rename to mods/skinsdb/meta/character.70.txt diff --git a/mods/skinsdb/meta/character_700.txt b/mods/skinsdb/meta/character.700.txt similarity index 100% rename from mods/skinsdb/meta/character_700.txt rename to mods/skinsdb/meta/character.700.txt diff --git a/mods/skinsdb/meta/character_701.txt b/mods/skinsdb/meta/character.701.txt similarity index 100% rename from mods/skinsdb/meta/character_701.txt rename to mods/skinsdb/meta/character.701.txt diff --git a/mods/skinsdb/meta/character_702.txt b/mods/skinsdb/meta/character.702.txt similarity index 100% rename from mods/skinsdb/meta/character_702.txt rename to mods/skinsdb/meta/character.702.txt diff --git a/mods/skinsdb/meta/character_703.txt b/mods/skinsdb/meta/character.703.txt similarity index 100% rename from mods/skinsdb/meta/character_703.txt rename to mods/skinsdb/meta/character.703.txt diff --git a/mods/skinsdb/meta/character_704.txt b/mods/skinsdb/meta/character.704.txt similarity index 100% rename from mods/skinsdb/meta/character_704.txt rename to mods/skinsdb/meta/character.704.txt diff --git a/mods/skinsdb/meta/character_705.txt b/mods/skinsdb/meta/character.705.txt similarity index 100% rename from mods/skinsdb/meta/character_705.txt rename to mods/skinsdb/meta/character.705.txt diff --git a/mods/skinsdb/meta/character_706.txt b/mods/skinsdb/meta/character.706.txt similarity index 100% rename from mods/skinsdb/meta/character_706.txt rename to mods/skinsdb/meta/character.706.txt diff --git a/mods/skinsdb/meta/character_707.txt b/mods/skinsdb/meta/character.707.txt similarity index 100% rename from mods/skinsdb/meta/character_707.txt rename to mods/skinsdb/meta/character.707.txt diff --git a/mods/skinsdb/meta/character_708.txt b/mods/skinsdb/meta/character.708.txt similarity index 100% rename from mods/skinsdb/meta/character_708.txt rename to mods/skinsdb/meta/character.708.txt diff --git a/mods/skinsdb/meta/character_709.txt b/mods/skinsdb/meta/character.709.txt similarity index 100% rename from mods/skinsdb/meta/character_709.txt rename to mods/skinsdb/meta/character.709.txt diff --git a/mods/skinsdb/meta/character_71.txt b/mods/skinsdb/meta/character.71.txt similarity index 100% rename from mods/skinsdb/meta/character_71.txt rename to mods/skinsdb/meta/character.71.txt diff --git a/mods/skinsdb/meta/character_710.txt b/mods/skinsdb/meta/character.710.txt similarity index 100% rename from mods/skinsdb/meta/character_710.txt rename to mods/skinsdb/meta/character.710.txt diff --git a/mods/skinsdb/meta/character_711.txt b/mods/skinsdb/meta/character.711.txt similarity index 100% rename from mods/skinsdb/meta/character_711.txt rename to mods/skinsdb/meta/character.711.txt diff --git a/mods/skinsdb/meta/character_712.txt b/mods/skinsdb/meta/character.712.txt similarity index 100% rename from mods/skinsdb/meta/character_712.txt rename to mods/skinsdb/meta/character.712.txt diff --git a/mods/skinsdb/meta/character_713.txt b/mods/skinsdb/meta/character.713.txt similarity index 100% rename from mods/skinsdb/meta/character_713.txt rename to mods/skinsdb/meta/character.713.txt diff --git a/mods/skinsdb/meta/character_714.txt b/mods/skinsdb/meta/character.714.txt similarity index 100% rename from mods/skinsdb/meta/character_714.txt rename to mods/skinsdb/meta/character.714.txt diff --git a/mods/skinsdb/meta/character_715.txt b/mods/skinsdb/meta/character.715.txt similarity index 100% rename from mods/skinsdb/meta/character_715.txt rename to mods/skinsdb/meta/character.715.txt diff --git a/mods/skinsdb/meta/character_716.txt b/mods/skinsdb/meta/character.716.txt similarity index 100% rename from mods/skinsdb/meta/character_716.txt rename to mods/skinsdb/meta/character.716.txt diff --git a/mods/skinsdb/meta/character_717.txt b/mods/skinsdb/meta/character.717.txt similarity index 100% rename from mods/skinsdb/meta/character_717.txt rename to mods/skinsdb/meta/character.717.txt diff --git a/mods/skinsdb/meta/character_718.txt b/mods/skinsdb/meta/character.718.txt similarity index 100% rename from mods/skinsdb/meta/character_718.txt rename to mods/skinsdb/meta/character.718.txt diff --git a/mods/skinsdb/meta/character_72.txt b/mods/skinsdb/meta/character.72.txt similarity index 100% rename from mods/skinsdb/meta/character_72.txt rename to mods/skinsdb/meta/character.72.txt diff --git a/mods/skinsdb/meta/character_720.txt b/mods/skinsdb/meta/character.720.txt similarity index 100% rename from mods/skinsdb/meta/character_720.txt rename to mods/skinsdb/meta/character.720.txt diff --git a/mods/skinsdb/meta/character_721.txt b/mods/skinsdb/meta/character.721.txt similarity index 100% rename from mods/skinsdb/meta/character_721.txt rename to mods/skinsdb/meta/character.721.txt diff --git a/mods/skinsdb/meta/character_723.txt b/mods/skinsdb/meta/character.723.txt similarity index 100% rename from mods/skinsdb/meta/character_723.txt rename to mods/skinsdb/meta/character.723.txt diff --git a/mods/skinsdb/meta/character_724.txt b/mods/skinsdb/meta/character.724.txt similarity index 100% rename from mods/skinsdb/meta/character_724.txt rename to mods/skinsdb/meta/character.724.txt diff --git a/mods/skinsdb/meta/character_725.txt b/mods/skinsdb/meta/character.725.txt similarity index 100% rename from mods/skinsdb/meta/character_725.txt rename to mods/skinsdb/meta/character.725.txt diff --git a/mods/skinsdb/meta/character_726.txt b/mods/skinsdb/meta/character.726.txt similarity index 100% rename from mods/skinsdb/meta/character_726.txt rename to mods/skinsdb/meta/character.726.txt diff --git a/mods/skinsdb/meta/character_727.txt b/mods/skinsdb/meta/character.727.txt similarity index 100% rename from mods/skinsdb/meta/character_727.txt rename to mods/skinsdb/meta/character.727.txt diff --git a/mods/skinsdb/meta/character_728.txt b/mods/skinsdb/meta/character.728.txt similarity index 100% rename from mods/skinsdb/meta/character_728.txt rename to mods/skinsdb/meta/character.728.txt diff --git a/mods/skinsdb/meta/character_729.txt b/mods/skinsdb/meta/character.729.txt similarity index 100% rename from mods/skinsdb/meta/character_729.txt rename to mods/skinsdb/meta/character.729.txt diff --git a/mods/skinsdb/meta/character_73.txt b/mods/skinsdb/meta/character.73.txt similarity index 100% rename from mods/skinsdb/meta/character_73.txt rename to mods/skinsdb/meta/character.73.txt diff --git a/mods/skinsdb/meta/character_730.txt b/mods/skinsdb/meta/character.730.txt similarity index 100% rename from mods/skinsdb/meta/character_730.txt rename to mods/skinsdb/meta/character.730.txt diff --git a/mods/skinsdb/meta/character_731.txt b/mods/skinsdb/meta/character.731.txt similarity index 100% rename from mods/skinsdb/meta/character_731.txt rename to mods/skinsdb/meta/character.731.txt diff --git a/mods/skinsdb/meta/character_732.txt b/mods/skinsdb/meta/character.732.txt similarity index 100% rename from mods/skinsdb/meta/character_732.txt rename to mods/skinsdb/meta/character.732.txt diff --git a/mods/skinsdb/meta/character_734.txt b/mods/skinsdb/meta/character.734.txt similarity index 100% rename from mods/skinsdb/meta/character_734.txt rename to mods/skinsdb/meta/character.734.txt diff --git a/mods/skinsdb/meta/character_735.txt b/mods/skinsdb/meta/character.735.txt similarity index 100% rename from mods/skinsdb/meta/character_735.txt rename to mods/skinsdb/meta/character.735.txt diff --git a/mods/skinsdb/meta/character_736.txt b/mods/skinsdb/meta/character.736.txt similarity index 100% rename from mods/skinsdb/meta/character_736.txt rename to mods/skinsdb/meta/character.736.txt diff --git a/mods/skinsdb/meta/character_737.txt b/mods/skinsdb/meta/character.737.txt similarity index 100% rename from mods/skinsdb/meta/character_737.txt rename to mods/skinsdb/meta/character.737.txt diff --git a/mods/skinsdb/meta/character_738.txt b/mods/skinsdb/meta/character.738.txt similarity index 100% rename from mods/skinsdb/meta/character_738.txt rename to mods/skinsdb/meta/character.738.txt diff --git a/mods/skinsdb/meta/character_739.txt b/mods/skinsdb/meta/character.739.txt similarity index 100% rename from mods/skinsdb/meta/character_739.txt rename to mods/skinsdb/meta/character.739.txt diff --git a/mods/skinsdb/meta/character_74.txt b/mods/skinsdb/meta/character.74.txt similarity index 100% rename from mods/skinsdb/meta/character_74.txt rename to mods/skinsdb/meta/character.74.txt diff --git a/mods/skinsdb/meta/character_740.txt b/mods/skinsdb/meta/character.740.txt similarity index 100% rename from mods/skinsdb/meta/character_740.txt rename to mods/skinsdb/meta/character.740.txt diff --git a/mods/skinsdb/meta/character_741.txt b/mods/skinsdb/meta/character.741.txt similarity index 100% rename from mods/skinsdb/meta/character_741.txt rename to mods/skinsdb/meta/character.741.txt diff --git a/mods/skinsdb/meta/character_742.txt b/mods/skinsdb/meta/character.742.txt similarity index 100% rename from mods/skinsdb/meta/character_742.txt rename to mods/skinsdb/meta/character.742.txt diff --git a/mods/skinsdb/meta/character_743.txt b/mods/skinsdb/meta/character.743.txt similarity index 100% rename from mods/skinsdb/meta/character_743.txt rename to mods/skinsdb/meta/character.743.txt diff --git a/mods/skinsdb/meta/character_744.txt b/mods/skinsdb/meta/character.744.txt similarity index 100% rename from mods/skinsdb/meta/character_744.txt rename to mods/skinsdb/meta/character.744.txt diff --git a/mods/skinsdb/meta/character_745.txt b/mods/skinsdb/meta/character.745.txt similarity index 100% rename from mods/skinsdb/meta/character_745.txt rename to mods/skinsdb/meta/character.745.txt diff --git a/mods/skinsdb/meta/character_746.txt b/mods/skinsdb/meta/character.746.txt similarity index 100% rename from mods/skinsdb/meta/character_746.txt rename to mods/skinsdb/meta/character.746.txt diff --git a/mods/skinsdb/meta/character_747.txt b/mods/skinsdb/meta/character.747.txt similarity index 100% rename from mods/skinsdb/meta/character_747.txt rename to mods/skinsdb/meta/character.747.txt diff --git a/mods/skinsdb/meta/character_748.txt b/mods/skinsdb/meta/character.748.txt similarity index 100% rename from mods/skinsdb/meta/character_748.txt rename to mods/skinsdb/meta/character.748.txt diff --git a/mods/skinsdb/meta/character_749.txt b/mods/skinsdb/meta/character.749.txt similarity index 100% rename from mods/skinsdb/meta/character_749.txt rename to mods/skinsdb/meta/character.749.txt diff --git a/mods/skinsdb/meta/character_75.txt b/mods/skinsdb/meta/character.75.txt similarity index 100% rename from mods/skinsdb/meta/character_75.txt rename to mods/skinsdb/meta/character.75.txt diff --git a/mods/skinsdb/meta/character_750.txt b/mods/skinsdb/meta/character.750.txt similarity index 100% rename from mods/skinsdb/meta/character_750.txt rename to mods/skinsdb/meta/character.750.txt diff --git a/mods/skinsdb/meta/character_751.txt b/mods/skinsdb/meta/character.751.txt similarity index 100% rename from mods/skinsdb/meta/character_751.txt rename to mods/skinsdb/meta/character.751.txt diff --git a/mods/skinsdb/meta/character_752.txt b/mods/skinsdb/meta/character.752.txt similarity index 100% rename from mods/skinsdb/meta/character_752.txt rename to mods/skinsdb/meta/character.752.txt diff --git a/mods/skinsdb/meta/character_753.txt b/mods/skinsdb/meta/character.753.txt similarity index 100% rename from mods/skinsdb/meta/character_753.txt rename to mods/skinsdb/meta/character.753.txt diff --git a/mods/skinsdb/meta/character_754.txt b/mods/skinsdb/meta/character.754.txt similarity index 100% rename from mods/skinsdb/meta/character_754.txt rename to mods/skinsdb/meta/character.754.txt diff --git a/mods/skinsdb/meta/character_755.txt b/mods/skinsdb/meta/character.755.txt similarity index 100% rename from mods/skinsdb/meta/character_755.txt rename to mods/skinsdb/meta/character.755.txt diff --git a/mods/skinsdb/meta/character_756.txt b/mods/skinsdb/meta/character.756.txt similarity index 100% rename from mods/skinsdb/meta/character_756.txt rename to mods/skinsdb/meta/character.756.txt diff --git a/mods/skinsdb/meta/character_757.txt b/mods/skinsdb/meta/character.757.txt similarity index 100% rename from mods/skinsdb/meta/character_757.txt rename to mods/skinsdb/meta/character.757.txt diff --git a/mods/skinsdb/meta/character_758.txt b/mods/skinsdb/meta/character.758.txt similarity index 100% rename from mods/skinsdb/meta/character_758.txt rename to mods/skinsdb/meta/character.758.txt diff --git a/mods/skinsdb/meta/character_759.txt b/mods/skinsdb/meta/character.759.txt similarity index 100% rename from mods/skinsdb/meta/character_759.txt rename to mods/skinsdb/meta/character.759.txt diff --git a/mods/skinsdb/meta/character_76.txt b/mods/skinsdb/meta/character.76.txt similarity index 100% rename from mods/skinsdb/meta/character_76.txt rename to mods/skinsdb/meta/character.76.txt diff --git a/mods/skinsdb/meta/character_760.txt b/mods/skinsdb/meta/character.760.txt similarity index 100% rename from mods/skinsdb/meta/character_760.txt rename to mods/skinsdb/meta/character.760.txt diff --git a/mods/skinsdb/meta/character_761.txt b/mods/skinsdb/meta/character.761.txt similarity index 100% rename from mods/skinsdb/meta/character_761.txt rename to mods/skinsdb/meta/character.761.txt diff --git a/mods/skinsdb/meta/character_762.txt b/mods/skinsdb/meta/character.762.txt similarity index 100% rename from mods/skinsdb/meta/character_762.txt rename to mods/skinsdb/meta/character.762.txt diff --git a/mods/skinsdb/meta/character_763.txt b/mods/skinsdb/meta/character.763.txt similarity index 100% rename from mods/skinsdb/meta/character_763.txt rename to mods/skinsdb/meta/character.763.txt diff --git a/mods/skinsdb/meta/character_764.txt b/mods/skinsdb/meta/character.764.txt similarity index 100% rename from mods/skinsdb/meta/character_764.txt rename to mods/skinsdb/meta/character.764.txt diff --git a/mods/skinsdb/meta/character_765.txt b/mods/skinsdb/meta/character.765.txt similarity index 100% rename from mods/skinsdb/meta/character_765.txt rename to mods/skinsdb/meta/character.765.txt diff --git a/mods/skinsdb/meta/character_766.txt b/mods/skinsdb/meta/character.766.txt similarity index 100% rename from mods/skinsdb/meta/character_766.txt rename to mods/skinsdb/meta/character.766.txt diff --git a/mods/skinsdb/meta/character_767.txt b/mods/skinsdb/meta/character.767.txt similarity index 100% rename from mods/skinsdb/meta/character_767.txt rename to mods/skinsdb/meta/character.767.txt diff --git a/mods/skinsdb/meta/character_768.txt b/mods/skinsdb/meta/character.768.txt similarity index 100% rename from mods/skinsdb/meta/character_768.txt rename to mods/skinsdb/meta/character.768.txt diff --git a/mods/skinsdb/meta/character_769.txt b/mods/skinsdb/meta/character.769.txt similarity index 100% rename from mods/skinsdb/meta/character_769.txt rename to mods/skinsdb/meta/character.769.txt diff --git a/mods/skinsdb/meta/character_77.txt b/mods/skinsdb/meta/character.77.txt similarity index 100% rename from mods/skinsdb/meta/character_77.txt rename to mods/skinsdb/meta/character.77.txt diff --git a/mods/skinsdb/meta/character_770.txt b/mods/skinsdb/meta/character.770.txt similarity index 100% rename from mods/skinsdb/meta/character_770.txt rename to mods/skinsdb/meta/character.770.txt diff --git a/mods/skinsdb/meta/character_771.txt b/mods/skinsdb/meta/character.771.txt similarity index 100% rename from mods/skinsdb/meta/character_771.txt rename to mods/skinsdb/meta/character.771.txt diff --git a/mods/skinsdb/meta/character_772.txt b/mods/skinsdb/meta/character.772.txt similarity index 100% rename from mods/skinsdb/meta/character_772.txt rename to mods/skinsdb/meta/character.772.txt diff --git a/mods/skinsdb/meta/character_773.txt b/mods/skinsdb/meta/character.773.txt similarity index 100% rename from mods/skinsdb/meta/character_773.txt rename to mods/skinsdb/meta/character.773.txt diff --git a/mods/skinsdb/meta/character_774.txt b/mods/skinsdb/meta/character.774.txt similarity index 100% rename from mods/skinsdb/meta/character_774.txt rename to mods/skinsdb/meta/character.774.txt diff --git a/mods/skinsdb/meta/character_775.txt b/mods/skinsdb/meta/character.775.txt similarity index 100% rename from mods/skinsdb/meta/character_775.txt rename to mods/skinsdb/meta/character.775.txt diff --git a/mods/skinsdb/meta/character_776.txt b/mods/skinsdb/meta/character.776.txt similarity index 100% rename from mods/skinsdb/meta/character_776.txt rename to mods/skinsdb/meta/character.776.txt diff --git a/mods/skinsdb/meta/character_777.txt b/mods/skinsdb/meta/character.777.txt similarity index 100% rename from mods/skinsdb/meta/character_777.txt rename to mods/skinsdb/meta/character.777.txt diff --git a/mods/skinsdb/meta/character_778.txt b/mods/skinsdb/meta/character.778.txt similarity index 100% rename from mods/skinsdb/meta/character_778.txt rename to mods/skinsdb/meta/character.778.txt diff --git a/mods/skinsdb/meta/character_779.txt b/mods/skinsdb/meta/character.779.txt similarity index 100% rename from mods/skinsdb/meta/character_779.txt rename to mods/skinsdb/meta/character.779.txt diff --git a/mods/skinsdb/meta/character_78.txt b/mods/skinsdb/meta/character.78.txt similarity index 100% rename from mods/skinsdb/meta/character_78.txt rename to mods/skinsdb/meta/character.78.txt diff --git a/mods/skinsdb/meta/character_780.txt b/mods/skinsdb/meta/character.780.txt similarity index 100% rename from mods/skinsdb/meta/character_780.txt rename to mods/skinsdb/meta/character.780.txt diff --git a/mods/skinsdb/meta/character_781.txt b/mods/skinsdb/meta/character.781.txt similarity index 100% rename from mods/skinsdb/meta/character_781.txt rename to mods/skinsdb/meta/character.781.txt diff --git a/mods/skinsdb/meta/character_782.txt b/mods/skinsdb/meta/character.782.txt similarity index 100% rename from mods/skinsdb/meta/character_782.txt rename to mods/skinsdb/meta/character.782.txt diff --git a/mods/skinsdb/meta/character_783.txt b/mods/skinsdb/meta/character.783.txt similarity index 100% rename from mods/skinsdb/meta/character_783.txt rename to mods/skinsdb/meta/character.783.txt diff --git a/mods/skinsdb/meta/character_784.txt b/mods/skinsdb/meta/character.784.txt similarity index 100% rename from mods/skinsdb/meta/character_784.txt rename to mods/skinsdb/meta/character.784.txt diff --git a/mods/skinsdb/meta/character_785.txt b/mods/skinsdb/meta/character.785.txt similarity index 100% rename from mods/skinsdb/meta/character_785.txt rename to mods/skinsdb/meta/character.785.txt diff --git a/mods/skinsdb/meta/character_786.txt b/mods/skinsdb/meta/character.786.txt similarity index 100% rename from mods/skinsdb/meta/character_786.txt rename to mods/skinsdb/meta/character.786.txt diff --git a/mods/skinsdb/meta/character_787.txt b/mods/skinsdb/meta/character.787.txt similarity index 100% rename from mods/skinsdb/meta/character_787.txt rename to mods/skinsdb/meta/character.787.txt diff --git a/mods/skinsdb/meta/character_788.txt b/mods/skinsdb/meta/character.788.txt similarity index 100% rename from mods/skinsdb/meta/character_788.txt rename to mods/skinsdb/meta/character.788.txt diff --git a/mods/skinsdb/meta/character_789.txt b/mods/skinsdb/meta/character.789.txt similarity index 100% rename from mods/skinsdb/meta/character_789.txt rename to mods/skinsdb/meta/character.789.txt diff --git a/mods/skinsdb/meta/character_790.txt b/mods/skinsdb/meta/character.790.txt similarity index 100% rename from mods/skinsdb/meta/character_790.txt rename to mods/skinsdb/meta/character.790.txt diff --git a/mods/skinsdb/meta/character_791.txt b/mods/skinsdb/meta/character.791.txt similarity index 100% rename from mods/skinsdb/meta/character_791.txt rename to mods/skinsdb/meta/character.791.txt diff --git a/mods/skinsdb/meta/character_792.txt b/mods/skinsdb/meta/character.792.txt similarity index 100% rename from mods/skinsdb/meta/character_792.txt rename to mods/skinsdb/meta/character.792.txt diff --git a/mods/skinsdb/meta/character_793.txt b/mods/skinsdb/meta/character.793.txt similarity index 100% rename from mods/skinsdb/meta/character_793.txt rename to mods/skinsdb/meta/character.793.txt diff --git a/mods/skinsdb/meta/character_794.txt b/mods/skinsdb/meta/character.794.txt similarity index 100% rename from mods/skinsdb/meta/character_794.txt rename to mods/skinsdb/meta/character.794.txt diff --git a/mods/skinsdb/meta/character_795.txt b/mods/skinsdb/meta/character.795.txt similarity index 100% rename from mods/skinsdb/meta/character_795.txt rename to mods/skinsdb/meta/character.795.txt diff --git a/mods/skinsdb/meta/character_796.txt b/mods/skinsdb/meta/character.796.txt similarity index 100% rename from mods/skinsdb/meta/character_796.txt rename to mods/skinsdb/meta/character.796.txt diff --git a/mods/skinsdb/meta/character_797.txt b/mods/skinsdb/meta/character.797.txt similarity index 100% rename from mods/skinsdb/meta/character_797.txt rename to mods/skinsdb/meta/character.797.txt diff --git a/mods/skinsdb/meta/character_798.txt b/mods/skinsdb/meta/character.798.txt similarity index 100% rename from mods/skinsdb/meta/character_798.txt rename to mods/skinsdb/meta/character.798.txt diff --git a/mods/skinsdb/meta/character_799.txt b/mods/skinsdb/meta/character.799.txt similarity index 100% rename from mods/skinsdb/meta/character_799.txt rename to mods/skinsdb/meta/character.799.txt diff --git a/mods/skinsdb/meta/character_8.txt b/mods/skinsdb/meta/character.8.txt similarity index 100% rename from mods/skinsdb/meta/character_8.txt rename to mods/skinsdb/meta/character.8.txt diff --git a/mods/skinsdb/meta/character_80.txt b/mods/skinsdb/meta/character.80.txt similarity index 100% rename from mods/skinsdb/meta/character_80.txt rename to mods/skinsdb/meta/character.80.txt diff --git a/mods/skinsdb/meta/character_800.txt b/mods/skinsdb/meta/character.800.txt similarity index 100% rename from mods/skinsdb/meta/character_800.txt rename to mods/skinsdb/meta/character.800.txt diff --git a/mods/skinsdb/meta/character_801.txt b/mods/skinsdb/meta/character.801.txt similarity index 100% rename from mods/skinsdb/meta/character_801.txt rename to mods/skinsdb/meta/character.801.txt diff --git a/mods/skinsdb/meta/character_802.txt b/mods/skinsdb/meta/character.802.txt similarity index 100% rename from mods/skinsdb/meta/character_802.txt rename to mods/skinsdb/meta/character.802.txt diff --git a/mods/skinsdb/meta/character_803.txt b/mods/skinsdb/meta/character.803.txt similarity index 100% rename from mods/skinsdb/meta/character_803.txt rename to mods/skinsdb/meta/character.803.txt diff --git a/mods/skinsdb/meta/character_804.txt b/mods/skinsdb/meta/character.804.txt similarity index 100% rename from mods/skinsdb/meta/character_804.txt rename to mods/skinsdb/meta/character.804.txt diff --git a/mods/skinsdb/meta/character_805.txt b/mods/skinsdb/meta/character.805.txt similarity index 100% rename from mods/skinsdb/meta/character_805.txt rename to mods/skinsdb/meta/character.805.txt diff --git a/mods/skinsdb/meta/character_806.txt b/mods/skinsdb/meta/character.806.txt similarity index 100% rename from mods/skinsdb/meta/character_806.txt rename to mods/skinsdb/meta/character.806.txt diff --git a/mods/skinsdb/meta/character_807.txt b/mods/skinsdb/meta/character.807.txt similarity index 100% rename from mods/skinsdb/meta/character_807.txt rename to mods/skinsdb/meta/character.807.txt diff --git a/mods/skinsdb/meta/character_808.txt b/mods/skinsdb/meta/character.808.txt similarity index 100% rename from mods/skinsdb/meta/character_808.txt rename to mods/skinsdb/meta/character.808.txt diff --git a/mods/skinsdb/meta/character_809.txt b/mods/skinsdb/meta/character.809.txt similarity index 100% rename from mods/skinsdb/meta/character_809.txt rename to mods/skinsdb/meta/character.809.txt diff --git a/mods/skinsdb/meta/character_81.txt b/mods/skinsdb/meta/character.81.txt similarity index 100% rename from mods/skinsdb/meta/character_81.txt rename to mods/skinsdb/meta/character.81.txt diff --git a/mods/skinsdb/meta/character_810.txt b/mods/skinsdb/meta/character.810.txt similarity index 100% rename from mods/skinsdb/meta/character_810.txt rename to mods/skinsdb/meta/character.810.txt diff --git a/mods/skinsdb/meta/character_811.txt b/mods/skinsdb/meta/character.811.txt similarity index 100% rename from mods/skinsdb/meta/character_811.txt rename to mods/skinsdb/meta/character.811.txt diff --git a/mods/skinsdb/meta/character_812.txt b/mods/skinsdb/meta/character.812.txt similarity index 100% rename from mods/skinsdb/meta/character_812.txt rename to mods/skinsdb/meta/character.812.txt diff --git a/mods/skinsdb/meta/character_813.txt b/mods/skinsdb/meta/character.813.txt similarity index 100% rename from mods/skinsdb/meta/character_813.txt rename to mods/skinsdb/meta/character.813.txt diff --git a/mods/skinsdb/meta/character_814.txt b/mods/skinsdb/meta/character.814.txt similarity index 100% rename from mods/skinsdb/meta/character_814.txt rename to mods/skinsdb/meta/character.814.txt diff --git a/mods/skinsdb/meta/character_815.txt b/mods/skinsdb/meta/character.815.txt similarity index 100% rename from mods/skinsdb/meta/character_815.txt rename to mods/skinsdb/meta/character.815.txt diff --git a/mods/skinsdb/meta/character_816.txt b/mods/skinsdb/meta/character.816.txt similarity index 100% rename from mods/skinsdb/meta/character_816.txt rename to mods/skinsdb/meta/character.816.txt diff --git a/mods/skinsdb/meta/character_817.txt b/mods/skinsdb/meta/character.817.txt similarity index 100% rename from mods/skinsdb/meta/character_817.txt rename to mods/skinsdb/meta/character.817.txt diff --git a/mods/skinsdb/meta/character_818.txt b/mods/skinsdb/meta/character.818.txt similarity index 100% rename from mods/skinsdb/meta/character_818.txt rename to mods/skinsdb/meta/character.818.txt diff --git a/mods/skinsdb/meta/character_819.txt b/mods/skinsdb/meta/character.819.txt similarity index 100% rename from mods/skinsdb/meta/character_819.txt rename to mods/skinsdb/meta/character.819.txt diff --git a/mods/skinsdb/meta/character_82.txt b/mods/skinsdb/meta/character.82.txt similarity index 100% rename from mods/skinsdb/meta/character_82.txt rename to mods/skinsdb/meta/character.82.txt diff --git a/mods/skinsdb/meta/character_821.txt b/mods/skinsdb/meta/character.821.txt similarity index 100% rename from mods/skinsdb/meta/character_821.txt rename to mods/skinsdb/meta/character.821.txt diff --git a/mods/skinsdb/meta/character_822.txt b/mods/skinsdb/meta/character.822.txt similarity index 100% rename from mods/skinsdb/meta/character_822.txt rename to mods/skinsdb/meta/character.822.txt diff --git a/mods/skinsdb/meta/character_823.txt b/mods/skinsdb/meta/character.823.txt similarity index 100% rename from mods/skinsdb/meta/character_823.txt rename to mods/skinsdb/meta/character.823.txt diff --git a/mods/skinsdb/meta/character_824.txt b/mods/skinsdb/meta/character.824.txt similarity index 100% rename from mods/skinsdb/meta/character_824.txt rename to mods/skinsdb/meta/character.824.txt diff --git a/mods/skinsdb/meta/character_827.txt b/mods/skinsdb/meta/character.827.txt similarity index 100% rename from mods/skinsdb/meta/character_827.txt rename to mods/skinsdb/meta/character.827.txt diff --git a/mods/skinsdb/meta/character_828.txt b/mods/skinsdb/meta/character.828.txt similarity index 100% rename from mods/skinsdb/meta/character_828.txt rename to mods/skinsdb/meta/character.828.txt diff --git a/mods/skinsdb/meta/character_829.txt b/mods/skinsdb/meta/character.829.txt similarity index 100% rename from mods/skinsdb/meta/character_829.txt rename to mods/skinsdb/meta/character.829.txt diff --git a/mods/skinsdb/meta/character_83.txt b/mods/skinsdb/meta/character.83.txt similarity index 100% rename from mods/skinsdb/meta/character_83.txt rename to mods/skinsdb/meta/character.83.txt diff --git a/mods/skinsdb/meta/character_830.txt b/mods/skinsdb/meta/character.830.txt similarity index 100% rename from mods/skinsdb/meta/character_830.txt rename to mods/skinsdb/meta/character.830.txt diff --git a/mods/skinsdb/meta/character_831.txt b/mods/skinsdb/meta/character.831.txt similarity index 100% rename from mods/skinsdb/meta/character_831.txt rename to mods/skinsdb/meta/character.831.txt diff --git a/mods/skinsdb/meta/character_832.txt b/mods/skinsdb/meta/character.832.txt similarity index 100% rename from mods/skinsdb/meta/character_832.txt rename to mods/skinsdb/meta/character.832.txt diff --git a/mods/skinsdb/meta/character_833.txt b/mods/skinsdb/meta/character.833.txt similarity index 100% rename from mods/skinsdb/meta/character_833.txt rename to mods/skinsdb/meta/character.833.txt diff --git a/mods/skinsdb/meta/character_834.txt b/mods/skinsdb/meta/character.834.txt similarity index 100% rename from mods/skinsdb/meta/character_834.txt rename to mods/skinsdb/meta/character.834.txt diff --git a/mods/skinsdb/meta/character_835.txt b/mods/skinsdb/meta/character.835.txt similarity index 100% rename from mods/skinsdb/meta/character_835.txt rename to mods/skinsdb/meta/character.835.txt diff --git a/mods/skinsdb/meta/character_836.txt b/mods/skinsdb/meta/character.836.txt similarity index 100% rename from mods/skinsdb/meta/character_836.txt rename to mods/skinsdb/meta/character.836.txt diff --git a/mods/skinsdb/meta/character_837.txt b/mods/skinsdb/meta/character.837.txt similarity index 100% rename from mods/skinsdb/meta/character_837.txt rename to mods/skinsdb/meta/character.837.txt diff --git a/mods/skinsdb/meta/character_838.txt b/mods/skinsdb/meta/character.838.txt similarity index 100% rename from mods/skinsdb/meta/character_838.txt rename to mods/skinsdb/meta/character.838.txt diff --git a/mods/skinsdb/meta/character_839.txt b/mods/skinsdb/meta/character.839.txt similarity index 100% rename from mods/skinsdb/meta/character_839.txt rename to mods/skinsdb/meta/character.839.txt diff --git a/mods/skinsdb/meta/character_84.txt b/mods/skinsdb/meta/character.84.txt similarity index 100% rename from mods/skinsdb/meta/character_84.txt rename to mods/skinsdb/meta/character.84.txt diff --git a/mods/skinsdb/meta/character_841.txt b/mods/skinsdb/meta/character.841.txt similarity index 100% rename from mods/skinsdb/meta/character_841.txt rename to mods/skinsdb/meta/character.841.txt diff --git a/mods/skinsdb/meta/character_843.txt b/mods/skinsdb/meta/character.843.txt similarity index 100% rename from mods/skinsdb/meta/character_843.txt rename to mods/skinsdb/meta/character.843.txt diff --git a/mods/skinsdb/meta/character_844.txt b/mods/skinsdb/meta/character.844.txt similarity index 100% rename from mods/skinsdb/meta/character_844.txt rename to mods/skinsdb/meta/character.844.txt diff --git a/mods/skinsdb/meta/character_845.txt b/mods/skinsdb/meta/character.845.txt similarity index 100% rename from mods/skinsdb/meta/character_845.txt rename to mods/skinsdb/meta/character.845.txt diff --git a/mods/skinsdb/meta/character_846.txt b/mods/skinsdb/meta/character.846.txt similarity index 100% rename from mods/skinsdb/meta/character_846.txt rename to mods/skinsdb/meta/character.846.txt diff --git a/mods/skinsdb/meta/character_847.txt b/mods/skinsdb/meta/character.847.txt similarity index 100% rename from mods/skinsdb/meta/character_847.txt rename to mods/skinsdb/meta/character.847.txt diff --git a/mods/skinsdb/meta/character_848.txt b/mods/skinsdb/meta/character.848.txt similarity index 100% rename from mods/skinsdb/meta/character_848.txt rename to mods/skinsdb/meta/character.848.txt diff --git a/mods/skinsdb/meta/character_85.txt b/mods/skinsdb/meta/character.85.txt similarity index 100% rename from mods/skinsdb/meta/character_85.txt rename to mods/skinsdb/meta/character.85.txt diff --git a/mods/skinsdb/meta/character_850.txt b/mods/skinsdb/meta/character.850.txt similarity index 100% rename from mods/skinsdb/meta/character_850.txt rename to mods/skinsdb/meta/character.850.txt diff --git a/mods/skinsdb/meta/character_851.txt b/mods/skinsdb/meta/character.851.txt similarity index 100% rename from mods/skinsdb/meta/character_851.txt rename to mods/skinsdb/meta/character.851.txt diff --git a/mods/skinsdb/meta/character_852.txt b/mods/skinsdb/meta/character.852.txt similarity index 100% rename from mods/skinsdb/meta/character_852.txt rename to mods/skinsdb/meta/character.852.txt diff --git a/mods/skinsdb/meta/character_853.txt b/mods/skinsdb/meta/character.853.txt similarity index 100% rename from mods/skinsdb/meta/character_853.txt rename to mods/skinsdb/meta/character.853.txt diff --git a/mods/skinsdb/meta/character_855.txt b/mods/skinsdb/meta/character.855.txt similarity index 100% rename from mods/skinsdb/meta/character_855.txt rename to mods/skinsdb/meta/character.855.txt diff --git a/mods/skinsdb/meta/character_856.txt b/mods/skinsdb/meta/character.856.txt similarity index 100% rename from mods/skinsdb/meta/character_856.txt rename to mods/skinsdb/meta/character.856.txt diff --git a/mods/skinsdb/meta/character_857.txt b/mods/skinsdb/meta/character.857.txt similarity index 100% rename from mods/skinsdb/meta/character_857.txt rename to mods/skinsdb/meta/character.857.txt diff --git a/mods/skinsdb/meta/character_859.txt b/mods/skinsdb/meta/character.859.txt similarity index 100% rename from mods/skinsdb/meta/character_859.txt rename to mods/skinsdb/meta/character.859.txt diff --git a/mods/skinsdb/meta/character_860.txt b/mods/skinsdb/meta/character.860.txt similarity index 100% rename from mods/skinsdb/meta/character_860.txt rename to mods/skinsdb/meta/character.860.txt diff --git a/mods/skinsdb/meta/character_861.txt b/mods/skinsdb/meta/character.861.txt similarity index 100% rename from mods/skinsdb/meta/character_861.txt rename to mods/skinsdb/meta/character.861.txt diff --git a/mods/skinsdb/meta/character_862.txt b/mods/skinsdb/meta/character.862.txt similarity index 100% rename from mods/skinsdb/meta/character_862.txt rename to mods/skinsdb/meta/character.862.txt diff --git a/mods/skinsdb/meta/character_863.txt b/mods/skinsdb/meta/character.863.txt similarity index 100% rename from mods/skinsdb/meta/character_863.txt rename to mods/skinsdb/meta/character.863.txt diff --git a/mods/skinsdb/meta/character_864.txt b/mods/skinsdb/meta/character.864.txt similarity index 100% rename from mods/skinsdb/meta/character_864.txt rename to mods/skinsdb/meta/character.864.txt diff --git a/mods/skinsdb/meta/character_865.txt b/mods/skinsdb/meta/character.865.txt similarity index 100% rename from mods/skinsdb/meta/character_865.txt rename to mods/skinsdb/meta/character.865.txt diff --git a/mods/skinsdb/meta/character_866.txt b/mods/skinsdb/meta/character.866.txt similarity index 100% rename from mods/skinsdb/meta/character_866.txt rename to mods/skinsdb/meta/character.866.txt diff --git a/mods/skinsdb/meta/character_869.txt b/mods/skinsdb/meta/character.869.txt similarity index 100% rename from mods/skinsdb/meta/character_869.txt rename to mods/skinsdb/meta/character.869.txt diff --git a/mods/skinsdb/meta/character_87.txt b/mods/skinsdb/meta/character.87.txt similarity index 100% rename from mods/skinsdb/meta/character_87.txt rename to mods/skinsdb/meta/character.87.txt diff --git a/mods/skinsdb/meta/character_870.txt b/mods/skinsdb/meta/character.870.txt similarity index 100% rename from mods/skinsdb/meta/character_870.txt rename to mods/skinsdb/meta/character.870.txt diff --git a/mods/skinsdb/meta/character_871.txt b/mods/skinsdb/meta/character.871.txt similarity index 100% rename from mods/skinsdb/meta/character_871.txt rename to mods/skinsdb/meta/character.871.txt diff --git a/mods/skinsdb/meta/character_874.txt b/mods/skinsdb/meta/character.874.txt similarity index 100% rename from mods/skinsdb/meta/character_874.txt rename to mods/skinsdb/meta/character.874.txt diff --git a/mods/skinsdb/meta/character_877.txt b/mods/skinsdb/meta/character.877.txt similarity index 100% rename from mods/skinsdb/meta/character_877.txt rename to mods/skinsdb/meta/character.877.txt diff --git a/mods/skinsdb/meta/character_878.txt b/mods/skinsdb/meta/character.878.txt similarity index 100% rename from mods/skinsdb/meta/character_878.txt rename to mods/skinsdb/meta/character.878.txt diff --git a/mods/skinsdb/meta/character_879.txt b/mods/skinsdb/meta/character.879.txt similarity index 100% rename from mods/skinsdb/meta/character_879.txt rename to mods/skinsdb/meta/character.879.txt diff --git a/mods/skinsdb/meta/character_88.txt b/mods/skinsdb/meta/character.88.txt similarity index 100% rename from mods/skinsdb/meta/character_88.txt rename to mods/skinsdb/meta/character.88.txt diff --git a/mods/skinsdb/meta/character_880.txt b/mods/skinsdb/meta/character.880.txt similarity index 100% rename from mods/skinsdb/meta/character_880.txt rename to mods/skinsdb/meta/character.880.txt diff --git a/mods/skinsdb/meta/character_881.txt b/mods/skinsdb/meta/character.881.txt similarity index 100% rename from mods/skinsdb/meta/character_881.txt rename to mods/skinsdb/meta/character.881.txt diff --git a/mods/skinsdb/meta/character_882.txt b/mods/skinsdb/meta/character.882.txt similarity index 100% rename from mods/skinsdb/meta/character_882.txt rename to mods/skinsdb/meta/character.882.txt diff --git a/mods/skinsdb/meta/character_883.txt b/mods/skinsdb/meta/character.883.txt similarity index 100% rename from mods/skinsdb/meta/character_883.txt rename to mods/skinsdb/meta/character.883.txt diff --git a/mods/skinsdb/meta/character_884.txt b/mods/skinsdb/meta/character.884.txt similarity index 100% rename from mods/skinsdb/meta/character_884.txt rename to mods/skinsdb/meta/character.884.txt diff --git a/mods/skinsdb/meta/character_885.txt b/mods/skinsdb/meta/character.885.txt similarity index 100% rename from mods/skinsdb/meta/character_885.txt rename to mods/skinsdb/meta/character.885.txt diff --git a/mods/skinsdb/meta/character_886.txt b/mods/skinsdb/meta/character.886.txt similarity index 100% rename from mods/skinsdb/meta/character_886.txt rename to mods/skinsdb/meta/character.886.txt diff --git a/mods/skinsdb/meta/character_887.txt b/mods/skinsdb/meta/character.887.txt similarity index 100% rename from mods/skinsdb/meta/character_887.txt rename to mods/skinsdb/meta/character.887.txt diff --git a/mods/skinsdb/meta/character_888.txt b/mods/skinsdb/meta/character.888.txt similarity index 100% rename from mods/skinsdb/meta/character_888.txt rename to mods/skinsdb/meta/character.888.txt diff --git a/mods/skinsdb/meta/character_889.txt b/mods/skinsdb/meta/character.889.txt similarity index 100% rename from mods/skinsdb/meta/character_889.txt rename to mods/skinsdb/meta/character.889.txt diff --git a/mods/skinsdb/meta/character_89.txt b/mods/skinsdb/meta/character.89.txt similarity index 100% rename from mods/skinsdb/meta/character_89.txt rename to mods/skinsdb/meta/character.89.txt diff --git a/mods/skinsdb/meta/character_890.txt b/mods/skinsdb/meta/character.890.txt similarity index 100% rename from mods/skinsdb/meta/character_890.txt rename to mods/skinsdb/meta/character.890.txt diff --git a/mods/skinsdb/meta/character_891.txt b/mods/skinsdb/meta/character.891.txt similarity index 100% rename from mods/skinsdb/meta/character_891.txt rename to mods/skinsdb/meta/character.891.txt diff --git a/mods/skinsdb/meta/character_893.txt b/mods/skinsdb/meta/character.893.txt similarity index 100% rename from mods/skinsdb/meta/character_893.txt rename to mods/skinsdb/meta/character.893.txt diff --git a/mods/skinsdb/meta/character_894.txt b/mods/skinsdb/meta/character.894.txt similarity index 100% rename from mods/skinsdb/meta/character_894.txt rename to mods/skinsdb/meta/character.894.txt diff --git a/mods/skinsdb/meta/character_895.txt b/mods/skinsdb/meta/character.895.txt similarity index 100% rename from mods/skinsdb/meta/character_895.txt rename to mods/skinsdb/meta/character.895.txt diff --git a/mods/skinsdb/meta/character_896.txt b/mods/skinsdb/meta/character.896.txt similarity index 100% rename from mods/skinsdb/meta/character_896.txt rename to mods/skinsdb/meta/character.896.txt diff --git a/mods/skinsdb/meta/character_897.txt b/mods/skinsdb/meta/character.897.txt similarity index 100% rename from mods/skinsdb/meta/character_897.txt rename to mods/skinsdb/meta/character.897.txt diff --git a/mods/skinsdb/meta/character_898.txt b/mods/skinsdb/meta/character.898.txt similarity index 100% rename from mods/skinsdb/meta/character_898.txt rename to mods/skinsdb/meta/character.898.txt diff --git a/mods/skinsdb/meta/character_899.txt b/mods/skinsdb/meta/character.899.txt similarity index 100% rename from mods/skinsdb/meta/character_899.txt rename to mods/skinsdb/meta/character.899.txt diff --git a/mods/skinsdb/meta/character_9.txt b/mods/skinsdb/meta/character.9.txt similarity index 100% rename from mods/skinsdb/meta/character_9.txt rename to mods/skinsdb/meta/character.9.txt diff --git a/mods/skinsdb/meta/character_900.txt b/mods/skinsdb/meta/character.900.txt similarity index 100% rename from mods/skinsdb/meta/character_900.txt rename to mods/skinsdb/meta/character.900.txt diff --git a/mods/skinsdb/meta/character_901.txt b/mods/skinsdb/meta/character.901.txt similarity index 100% rename from mods/skinsdb/meta/character_901.txt rename to mods/skinsdb/meta/character.901.txt diff --git a/mods/skinsdb/meta/character_902.txt b/mods/skinsdb/meta/character.902.txt similarity index 100% rename from mods/skinsdb/meta/character_902.txt rename to mods/skinsdb/meta/character.902.txt diff --git a/mods/skinsdb/meta/character_903.txt b/mods/skinsdb/meta/character.903.txt similarity index 100% rename from mods/skinsdb/meta/character_903.txt rename to mods/skinsdb/meta/character.903.txt diff --git a/mods/skinsdb/meta/character_904.txt b/mods/skinsdb/meta/character.904.txt similarity index 100% rename from mods/skinsdb/meta/character_904.txt rename to mods/skinsdb/meta/character.904.txt diff --git a/mods/skinsdb/meta/character_905.txt b/mods/skinsdb/meta/character.905.txt similarity index 100% rename from mods/skinsdb/meta/character_905.txt rename to mods/skinsdb/meta/character.905.txt diff --git a/mods/skinsdb/meta/character_906.txt b/mods/skinsdb/meta/character.906.txt similarity index 100% rename from mods/skinsdb/meta/character_906.txt rename to mods/skinsdb/meta/character.906.txt diff --git a/mods/skinsdb/meta/character_907.txt b/mods/skinsdb/meta/character.907.txt similarity index 100% rename from mods/skinsdb/meta/character_907.txt rename to mods/skinsdb/meta/character.907.txt diff --git a/mods/skinsdb/meta/character_908.txt b/mods/skinsdb/meta/character.908.txt similarity index 100% rename from mods/skinsdb/meta/character_908.txt rename to mods/skinsdb/meta/character.908.txt diff --git a/mods/skinsdb/meta/character_909.txt b/mods/skinsdb/meta/character.909.txt similarity index 100% rename from mods/skinsdb/meta/character_909.txt rename to mods/skinsdb/meta/character.909.txt diff --git a/mods/skinsdb/meta/character_910.txt b/mods/skinsdb/meta/character.910.txt similarity index 100% rename from mods/skinsdb/meta/character_910.txt rename to mods/skinsdb/meta/character.910.txt diff --git a/mods/skinsdb/meta/character_911.txt b/mods/skinsdb/meta/character.911.txt similarity index 100% rename from mods/skinsdb/meta/character_911.txt rename to mods/skinsdb/meta/character.911.txt diff --git a/mods/skinsdb/meta/character_912.txt b/mods/skinsdb/meta/character.912.txt similarity index 100% rename from mods/skinsdb/meta/character_912.txt rename to mods/skinsdb/meta/character.912.txt diff --git a/mods/skinsdb/meta/character_913.txt b/mods/skinsdb/meta/character.913.txt similarity index 100% rename from mods/skinsdb/meta/character_913.txt rename to mods/skinsdb/meta/character.913.txt diff --git a/mods/skinsdb/meta/character_914.txt b/mods/skinsdb/meta/character.914.txt similarity index 100% rename from mods/skinsdb/meta/character_914.txt rename to mods/skinsdb/meta/character.914.txt diff --git a/mods/skinsdb/meta/character_915.txt b/mods/skinsdb/meta/character.915.txt similarity index 100% rename from mods/skinsdb/meta/character_915.txt rename to mods/skinsdb/meta/character.915.txt diff --git a/mods/skinsdb/meta/character_916.txt b/mods/skinsdb/meta/character.916.txt similarity index 100% rename from mods/skinsdb/meta/character_916.txt rename to mods/skinsdb/meta/character.916.txt diff --git a/mods/skinsdb/meta/character_917.txt b/mods/skinsdb/meta/character.917.txt similarity index 100% rename from mods/skinsdb/meta/character_917.txt rename to mods/skinsdb/meta/character.917.txt diff --git a/mods/skinsdb/meta/character_918.txt b/mods/skinsdb/meta/character.918.txt similarity index 100% rename from mods/skinsdb/meta/character_918.txt rename to mods/skinsdb/meta/character.918.txt diff --git a/mods/skinsdb/meta/character_919.txt b/mods/skinsdb/meta/character.919.txt similarity index 100% rename from mods/skinsdb/meta/character_919.txt rename to mods/skinsdb/meta/character.919.txt diff --git a/mods/skinsdb/meta/character_92.txt b/mods/skinsdb/meta/character.92.txt similarity index 100% rename from mods/skinsdb/meta/character_92.txt rename to mods/skinsdb/meta/character.92.txt diff --git a/mods/skinsdb/meta/character_920.txt b/mods/skinsdb/meta/character.920.txt similarity index 100% rename from mods/skinsdb/meta/character_920.txt rename to mods/skinsdb/meta/character.920.txt diff --git a/mods/skinsdb/meta/character_921.txt b/mods/skinsdb/meta/character.921.txt similarity index 100% rename from mods/skinsdb/meta/character_921.txt rename to mods/skinsdb/meta/character.921.txt diff --git a/mods/skinsdb/meta/character_922.txt b/mods/skinsdb/meta/character.922.txt similarity index 100% rename from mods/skinsdb/meta/character_922.txt rename to mods/skinsdb/meta/character.922.txt diff --git a/mods/skinsdb/meta/character_923.txt b/mods/skinsdb/meta/character.923.txt similarity index 100% rename from mods/skinsdb/meta/character_923.txt rename to mods/skinsdb/meta/character.923.txt diff --git a/mods/skinsdb/meta/character_924.txt b/mods/skinsdb/meta/character.924.txt similarity index 100% rename from mods/skinsdb/meta/character_924.txt rename to mods/skinsdb/meta/character.924.txt diff --git a/mods/skinsdb/meta/character_925.txt b/mods/skinsdb/meta/character.925.txt similarity index 100% rename from mods/skinsdb/meta/character_925.txt rename to mods/skinsdb/meta/character.925.txt diff --git a/mods/skinsdb/meta/character_926.txt b/mods/skinsdb/meta/character.926.txt similarity index 100% rename from mods/skinsdb/meta/character_926.txt rename to mods/skinsdb/meta/character.926.txt diff --git a/mods/skinsdb/meta/character_927.txt b/mods/skinsdb/meta/character.927.txt similarity index 100% rename from mods/skinsdb/meta/character_927.txt rename to mods/skinsdb/meta/character.927.txt diff --git a/mods/skinsdb/meta/character_928.txt b/mods/skinsdb/meta/character.928.txt similarity index 100% rename from mods/skinsdb/meta/character_928.txt rename to mods/skinsdb/meta/character.928.txt diff --git a/mods/skinsdb/meta/character_929.txt b/mods/skinsdb/meta/character.929.txt similarity index 100% rename from mods/skinsdb/meta/character_929.txt rename to mods/skinsdb/meta/character.929.txt diff --git a/mods/skinsdb/meta/character_93.txt b/mods/skinsdb/meta/character.93.txt similarity index 100% rename from mods/skinsdb/meta/character_93.txt rename to mods/skinsdb/meta/character.93.txt diff --git a/mods/skinsdb/meta/character_930.txt b/mods/skinsdb/meta/character.930.txt similarity index 100% rename from mods/skinsdb/meta/character_930.txt rename to mods/skinsdb/meta/character.930.txt diff --git a/mods/skinsdb/meta/character_931.txt b/mods/skinsdb/meta/character.931.txt similarity index 100% rename from mods/skinsdb/meta/character_931.txt rename to mods/skinsdb/meta/character.931.txt diff --git a/mods/skinsdb/meta/character_932.txt b/mods/skinsdb/meta/character.932.txt similarity index 100% rename from mods/skinsdb/meta/character_932.txt rename to mods/skinsdb/meta/character.932.txt diff --git a/mods/skinsdb/meta/character_933.txt b/mods/skinsdb/meta/character.933.txt similarity index 100% rename from mods/skinsdb/meta/character_933.txt rename to mods/skinsdb/meta/character.933.txt diff --git a/mods/skinsdb/meta/character_934.txt b/mods/skinsdb/meta/character.934.txt similarity index 100% rename from mods/skinsdb/meta/character_934.txt rename to mods/skinsdb/meta/character.934.txt diff --git a/mods/skinsdb/meta/character_935.txt b/mods/skinsdb/meta/character.935.txt similarity index 100% rename from mods/skinsdb/meta/character_935.txt rename to mods/skinsdb/meta/character.935.txt diff --git a/mods/skinsdb/meta/character_936.txt b/mods/skinsdb/meta/character.936.txt similarity index 100% rename from mods/skinsdb/meta/character_936.txt rename to mods/skinsdb/meta/character.936.txt diff --git a/mods/skinsdb/meta/character_937.txt b/mods/skinsdb/meta/character.937.txt similarity index 100% rename from mods/skinsdb/meta/character_937.txt rename to mods/skinsdb/meta/character.937.txt diff --git a/mods/skinsdb/meta/character_938.txt b/mods/skinsdb/meta/character.938.txt similarity index 100% rename from mods/skinsdb/meta/character_938.txt rename to mods/skinsdb/meta/character.938.txt diff --git a/mods/skinsdb/meta/character_939.txt b/mods/skinsdb/meta/character.939.txt similarity index 100% rename from mods/skinsdb/meta/character_939.txt rename to mods/skinsdb/meta/character.939.txt diff --git a/mods/skinsdb/meta/character_940.txt b/mods/skinsdb/meta/character.940.txt similarity index 100% rename from mods/skinsdb/meta/character_940.txt rename to mods/skinsdb/meta/character.940.txt diff --git a/mods/skinsdb/meta/character_941.txt b/mods/skinsdb/meta/character.941.txt similarity index 100% rename from mods/skinsdb/meta/character_941.txt rename to mods/skinsdb/meta/character.941.txt diff --git a/mods/skinsdb/meta/character_942.txt b/mods/skinsdb/meta/character.942.txt similarity index 100% rename from mods/skinsdb/meta/character_942.txt rename to mods/skinsdb/meta/character.942.txt diff --git a/mods/skinsdb/meta/character_943.txt b/mods/skinsdb/meta/character.943.txt similarity index 100% rename from mods/skinsdb/meta/character_943.txt rename to mods/skinsdb/meta/character.943.txt diff --git a/mods/skinsdb/meta/character_944.txt b/mods/skinsdb/meta/character.944.txt similarity index 100% rename from mods/skinsdb/meta/character_944.txt rename to mods/skinsdb/meta/character.944.txt diff --git a/mods/skinsdb/meta/character_945.txt b/mods/skinsdb/meta/character.945.txt similarity index 100% rename from mods/skinsdb/meta/character_945.txt rename to mods/skinsdb/meta/character.945.txt diff --git a/mods/skinsdb/meta/character_946.txt b/mods/skinsdb/meta/character.946.txt similarity index 100% rename from mods/skinsdb/meta/character_946.txt rename to mods/skinsdb/meta/character.946.txt diff --git a/mods/skinsdb/meta/character_947.txt b/mods/skinsdb/meta/character.947.txt similarity index 100% rename from mods/skinsdb/meta/character_947.txt rename to mods/skinsdb/meta/character.947.txt diff --git a/mods/skinsdb/meta/character_948.txt b/mods/skinsdb/meta/character.948.txt similarity index 100% rename from mods/skinsdb/meta/character_948.txt rename to mods/skinsdb/meta/character.948.txt diff --git a/mods/skinsdb/meta/character_949.txt b/mods/skinsdb/meta/character.949.txt similarity index 100% rename from mods/skinsdb/meta/character_949.txt rename to mods/skinsdb/meta/character.949.txt diff --git a/mods/skinsdb/meta/character_95.txt b/mods/skinsdb/meta/character.95.txt similarity index 100% rename from mods/skinsdb/meta/character_95.txt rename to mods/skinsdb/meta/character.95.txt diff --git a/mods/skinsdb/meta/character_950.txt b/mods/skinsdb/meta/character.950.txt similarity index 100% rename from mods/skinsdb/meta/character_950.txt rename to mods/skinsdb/meta/character.950.txt diff --git a/mods/skinsdb/meta/character_951.txt b/mods/skinsdb/meta/character.951.txt similarity index 100% rename from mods/skinsdb/meta/character_951.txt rename to mods/skinsdb/meta/character.951.txt diff --git a/mods/skinsdb/meta/character_952.txt b/mods/skinsdb/meta/character.952.txt similarity index 100% rename from mods/skinsdb/meta/character_952.txt rename to mods/skinsdb/meta/character.952.txt diff --git a/mods/skinsdb/meta/character_953.txt b/mods/skinsdb/meta/character.953.txt similarity index 100% rename from mods/skinsdb/meta/character_953.txt rename to mods/skinsdb/meta/character.953.txt diff --git a/mods/skinsdb/meta/character_954.txt b/mods/skinsdb/meta/character.954.txt similarity index 100% rename from mods/skinsdb/meta/character_954.txt rename to mods/skinsdb/meta/character.954.txt diff --git a/mods/skinsdb/meta/character_955.txt b/mods/skinsdb/meta/character.955.txt similarity index 100% rename from mods/skinsdb/meta/character_955.txt rename to mods/skinsdb/meta/character.955.txt diff --git a/mods/skinsdb/meta/character_956.txt b/mods/skinsdb/meta/character.956.txt similarity index 100% rename from mods/skinsdb/meta/character_956.txt rename to mods/skinsdb/meta/character.956.txt diff --git a/mods/skinsdb/meta/character_957.txt b/mods/skinsdb/meta/character.957.txt similarity index 100% rename from mods/skinsdb/meta/character_957.txt rename to mods/skinsdb/meta/character.957.txt diff --git a/mods/skinsdb/meta/character_958.txt b/mods/skinsdb/meta/character.958.txt similarity index 100% rename from mods/skinsdb/meta/character_958.txt rename to mods/skinsdb/meta/character.958.txt diff --git a/mods/skinsdb/meta/character_959.txt b/mods/skinsdb/meta/character.959.txt similarity index 100% rename from mods/skinsdb/meta/character_959.txt rename to mods/skinsdb/meta/character.959.txt diff --git a/mods/skinsdb/meta/character_96.txt b/mods/skinsdb/meta/character.96.txt similarity index 100% rename from mods/skinsdb/meta/character_96.txt rename to mods/skinsdb/meta/character.96.txt diff --git a/mods/skinsdb/meta/character_960.txt b/mods/skinsdb/meta/character.960.txt similarity index 100% rename from mods/skinsdb/meta/character_960.txt rename to mods/skinsdb/meta/character.960.txt diff --git a/mods/skinsdb/meta/character_961.txt b/mods/skinsdb/meta/character.961.txt similarity index 100% rename from mods/skinsdb/meta/character_961.txt rename to mods/skinsdb/meta/character.961.txt diff --git a/mods/skinsdb/meta/character_962.txt b/mods/skinsdb/meta/character.962.txt similarity index 100% rename from mods/skinsdb/meta/character_962.txt rename to mods/skinsdb/meta/character.962.txt diff --git a/mods/skinsdb/meta/character_963.txt b/mods/skinsdb/meta/character.963.txt similarity index 100% rename from mods/skinsdb/meta/character_963.txt rename to mods/skinsdb/meta/character.963.txt diff --git a/mods/skinsdb/meta/character_964.txt b/mods/skinsdb/meta/character.964.txt similarity index 100% rename from mods/skinsdb/meta/character_964.txt rename to mods/skinsdb/meta/character.964.txt diff --git a/mods/skinsdb/meta/character_965.txt b/mods/skinsdb/meta/character.965.txt similarity index 100% rename from mods/skinsdb/meta/character_965.txt rename to mods/skinsdb/meta/character.965.txt diff --git a/mods/skinsdb/meta/character_966.txt b/mods/skinsdb/meta/character.966.txt similarity index 100% rename from mods/skinsdb/meta/character_966.txt rename to mods/skinsdb/meta/character.966.txt diff --git a/mods/skinsdb/meta/character_967.txt b/mods/skinsdb/meta/character.967.txt similarity index 100% rename from mods/skinsdb/meta/character_967.txt rename to mods/skinsdb/meta/character.967.txt diff --git a/mods/skinsdb/meta/character_968.txt b/mods/skinsdb/meta/character.968.txt similarity index 100% rename from mods/skinsdb/meta/character_968.txt rename to mods/skinsdb/meta/character.968.txt diff --git a/mods/skinsdb/meta/character_969.txt b/mods/skinsdb/meta/character.969.txt similarity index 100% rename from mods/skinsdb/meta/character_969.txt rename to mods/skinsdb/meta/character.969.txt diff --git a/mods/skinsdb/meta/character_970.txt b/mods/skinsdb/meta/character.970.txt similarity index 100% rename from mods/skinsdb/meta/character_970.txt rename to mods/skinsdb/meta/character.970.txt diff --git a/mods/skinsdb/meta/character_971.txt b/mods/skinsdb/meta/character.971.txt similarity index 100% rename from mods/skinsdb/meta/character_971.txt rename to mods/skinsdb/meta/character.971.txt diff --git a/mods/skinsdb/meta/character_972.txt b/mods/skinsdb/meta/character.972.txt similarity index 100% rename from mods/skinsdb/meta/character_972.txt rename to mods/skinsdb/meta/character.972.txt diff --git a/mods/skinsdb/meta/character_973.txt b/mods/skinsdb/meta/character.973.txt similarity index 100% rename from mods/skinsdb/meta/character_973.txt rename to mods/skinsdb/meta/character.973.txt diff --git a/mods/skinsdb/meta/character_974.txt b/mods/skinsdb/meta/character.974.txt similarity index 100% rename from mods/skinsdb/meta/character_974.txt rename to mods/skinsdb/meta/character.974.txt diff --git a/mods/skinsdb/meta/character_975.txt b/mods/skinsdb/meta/character.975.txt similarity index 100% rename from mods/skinsdb/meta/character_975.txt rename to mods/skinsdb/meta/character.975.txt diff --git a/mods/skinsdb/meta/character_976.txt b/mods/skinsdb/meta/character.976.txt similarity index 100% rename from mods/skinsdb/meta/character_976.txt rename to mods/skinsdb/meta/character.976.txt diff --git a/mods/skinsdb/meta/character_977.txt b/mods/skinsdb/meta/character.977.txt similarity index 100% rename from mods/skinsdb/meta/character_977.txt rename to mods/skinsdb/meta/character.977.txt diff --git a/mods/skinsdb/meta/character_978.txt b/mods/skinsdb/meta/character.978.txt similarity index 100% rename from mods/skinsdb/meta/character_978.txt rename to mods/skinsdb/meta/character.978.txt diff --git a/mods/skinsdb/meta/character_979.txt b/mods/skinsdb/meta/character.979.txt similarity index 100% rename from mods/skinsdb/meta/character_979.txt rename to mods/skinsdb/meta/character.979.txt diff --git a/mods/skinsdb/meta/character_98.txt b/mods/skinsdb/meta/character.98.txt similarity index 100% rename from mods/skinsdb/meta/character_98.txt rename to mods/skinsdb/meta/character.98.txt diff --git a/mods/skinsdb/meta/character_980.txt b/mods/skinsdb/meta/character.980.txt similarity index 100% rename from mods/skinsdb/meta/character_980.txt rename to mods/skinsdb/meta/character.980.txt diff --git a/mods/skinsdb/meta/character_981.txt b/mods/skinsdb/meta/character.981.txt similarity index 100% rename from mods/skinsdb/meta/character_981.txt rename to mods/skinsdb/meta/character.981.txt diff --git a/mods/skinsdb/meta/character_982.txt b/mods/skinsdb/meta/character.982.txt similarity index 100% rename from mods/skinsdb/meta/character_982.txt rename to mods/skinsdb/meta/character.982.txt diff --git a/mods/skinsdb/meta/character_983.txt b/mods/skinsdb/meta/character.983.txt similarity index 100% rename from mods/skinsdb/meta/character_983.txt rename to mods/skinsdb/meta/character.983.txt diff --git a/mods/skinsdb/meta/character_984.txt b/mods/skinsdb/meta/character.984.txt similarity index 100% rename from mods/skinsdb/meta/character_984.txt rename to mods/skinsdb/meta/character.984.txt diff --git a/mods/skinsdb/meta/character_985.txt b/mods/skinsdb/meta/character.985.txt similarity index 100% rename from mods/skinsdb/meta/character_985.txt rename to mods/skinsdb/meta/character.985.txt diff --git a/mods/skinsdb/meta/character_986.txt b/mods/skinsdb/meta/character.986.txt similarity index 100% rename from mods/skinsdb/meta/character_986.txt rename to mods/skinsdb/meta/character.986.txt diff --git a/mods/skinsdb/meta/character_987.txt b/mods/skinsdb/meta/character.987.txt similarity index 100% rename from mods/skinsdb/meta/character_987.txt rename to mods/skinsdb/meta/character.987.txt diff --git a/mods/skinsdb/meta/character_988.txt b/mods/skinsdb/meta/character.988.txt similarity index 100% rename from mods/skinsdb/meta/character_988.txt rename to mods/skinsdb/meta/character.988.txt diff --git a/mods/skinsdb/meta/character_989.txt b/mods/skinsdb/meta/character.989.txt similarity index 100% rename from mods/skinsdb/meta/character_989.txt rename to mods/skinsdb/meta/character.989.txt diff --git a/mods/skinsdb/meta/character_99.txt b/mods/skinsdb/meta/character.99.txt similarity index 100% rename from mods/skinsdb/meta/character_99.txt rename to mods/skinsdb/meta/character.99.txt diff --git a/mods/skinsdb/meta/character_990.txt b/mods/skinsdb/meta/character.990.txt similarity index 100% rename from mods/skinsdb/meta/character_990.txt rename to mods/skinsdb/meta/character.990.txt diff --git a/mods/skinsdb/meta/character_991.txt b/mods/skinsdb/meta/character.991.txt similarity index 100% rename from mods/skinsdb/meta/character_991.txt rename to mods/skinsdb/meta/character.991.txt diff --git a/mods/skinsdb/meta/character_992.txt b/mods/skinsdb/meta/character.992.txt similarity index 100% rename from mods/skinsdb/meta/character_992.txt rename to mods/skinsdb/meta/character.992.txt diff --git a/mods/skinsdb/meta/character_993.txt b/mods/skinsdb/meta/character.993.txt similarity index 100% rename from mods/skinsdb/meta/character_993.txt rename to mods/skinsdb/meta/character.993.txt diff --git a/mods/skinsdb/meta/character_994.txt b/mods/skinsdb/meta/character.994.txt similarity index 100% rename from mods/skinsdb/meta/character_994.txt rename to mods/skinsdb/meta/character.994.txt diff --git a/mods/skinsdb/meta/character_995.txt b/mods/skinsdb/meta/character.995.txt similarity index 100% rename from mods/skinsdb/meta/character_995.txt rename to mods/skinsdb/meta/character.995.txt diff --git a/mods/skinsdb/meta/character_996.txt b/mods/skinsdb/meta/character.996.txt similarity index 100% rename from mods/skinsdb/meta/character_996.txt rename to mods/skinsdb/meta/character.996.txt diff --git a/mods/skinsdb/meta/character_997.txt b/mods/skinsdb/meta/character.997.txt similarity index 100% rename from mods/skinsdb/meta/character_997.txt rename to mods/skinsdb/meta/character.997.txt diff --git a/mods/skinsdb/meta/character_998.txt b/mods/skinsdb/meta/character.998.txt similarity index 100% rename from mods/skinsdb/meta/character_998.txt rename to mods/skinsdb/meta/character.998.txt diff --git a/mods/skinsdb/meta/character_999.txt b/mods/skinsdb/meta/character.999.txt similarity index 100% rename from mods/skinsdb/meta/character_999.txt rename to mods/skinsdb/meta/character.999.txt diff --git a/mods/skinsdb/meta/character_1135.txt b/mods/skinsdb/meta/character_1135.txt deleted file mode 100644 index 47af5e61..00000000 --- a/mods/skinsdb/meta/character_1135.txt +++ /dev/null @@ -1,3 +0,0 @@ -julito pequeño -julito -CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_593.txt b/mods/skinsdb/meta/character_593.txt deleted file mode 100644 index 745a02e7..00000000 --- a/mods/skinsdb/meta/character_593.txt +++ /dev/null @@ -1,3 +0,0 @@ -Red ÿoshi -ÿoshi_Retro -CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_648.txt b/mods/skinsdb/meta/character_648.txt deleted file mode 100644 index f07e3f9b..00000000 --- a/mods/skinsdb/meta/character_648.txt +++ /dev/null @@ -1,3 +0,0 @@ -SCP-049 "Plague Doctor" (SCP Foundation) -Esteban -CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/mod.conf b/mods/skinsdb/mod.conf index b79cd343..38a62c3b 100644 --- a/mods/skinsdb/mod.conf +++ b/mods/skinsdb/mod.conf @@ -1,5 +1,5 @@ name = skinsdb description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory depends = player_api -optional_depends = unified_inventory,3d_armor,clothing,sfinv +optional_depends = unified_inventory,3d_armor,clothing,sfinv,hand_monoid min_minetest_version = 5.4.0 diff --git a/mods/skinsdb/models/skinsdb_hand.b3d b/mods/skinsdb/models/skinsdb_hand.b3d new file mode 100644 index 00000000..a38124c6 Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand.b3d differ diff --git a/mods/skinsdb/models/skinsdb_hand.blend b/mods/skinsdb/models/skinsdb_hand.blend new file mode 100644 index 00000000..495e74eb Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand.blend differ diff --git a/mods/skinsdb/models/skinsdb_hand_18.b3d b/mods/skinsdb/models/skinsdb_hand_18.b3d new file mode 100644 index 00000000..88449c6d Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand_18.b3d differ diff --git a/mods/skinsdb/models/skinsdb_hand_18.blend b/mods/skinsdb/models/skinsdb_hand_18.blend new file mode 100644 index 00000000..decc873c Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand_18.blend differ diff --git a/mods/skinsdb/skin_meta_api.lua b/mods/skinsdb/skin_meta_api.lua index 29e174ba..1ce04ed8 100644 --- a/mods/skinsdb/skin_meta_api.lua +++ b/mods/skinsdb/skin_meta_api.lua @@ -1,5 +1,7 @@ skins.meta = {} +local has_hand_monoid = minetest.get_modpath("hand_monoid") + local skin_class = {} skin_class.__index = skin_class skins.skin_class = skin_class @@ -51,6 +53,38 @@ function skin_class:get_texture() return self._texture end +function skin_class:set_hand(hand) + self._hand = hand +end + +local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true +function skin_class:set_hand_from_texture() + local hand = core.get_current_modname()..':'..self._texture:gsub('[%p%c%s]', '') + local hand_def = {} + for k,v in pairs(minetest.registered_items[""]) do + if k ~= "mod_origin" and k ~= "type" and k ~= "wield_image" then + hand_def[k] = v + end + end + hand_def.tiles = {self:get_texture()} + hand_def.visual_scale = 1 + hand_def.wield_scale = {x=1,y=1,z=1} + hand_def.paramtype = "light" + hand_def.drawtype = "mesh" + if(self:get_meta("format") == "1.0") then + hand_def.mesh = "skinsdb_hand.b3d" + else + hand_def.mesh = "skinsdb_hand_18.b3d" + end + hand_def.use_texture_alpha = ALPHA_CLIP + minetest.register_node(hand, hand_def) + self:set_hand(hand) +end + +function skin_class:get_hand() + return self._hand +end + function skin_class:set_preview(value) self._preview = value end @@ -174,6 +208,22 @@ function skin_class:apply_skin_to_player(player) y = self:get_meta("visual_size_y") or 1 } }) + + local hand = self:get_hand() + if has_hand_monoid then + if hand then + hand_monoid.monoid:add_change(player, {name = hand}, "skinsdb:hand") + else + hand_monoid.monoid:del_change(player, "skinsdb:hand") + end + else + if hand then + player:get_inventory():set_size("hand", 1) + player:get_inventory():set_stack("hand", 1, hand) + else + player:get_inventory():set_stack("hand", 1, "") + end + end end function skin_class:set_skin(player) @@ -185,6 +235,6 @@ end function skin_class:is_applicable_for_player(playername) local assigned_player = self:get_meta("playername") return assigned_player == nil or assigned_player == true or - playername and (minetest.check_player_privs(playername, {server=true}) or - assigned_player:lower() == playername:lower()) + playername and (minetest.check_player_privs(playername, {server=true}) or + assigned_player:lower() == playername:lower()) end diff --git a/mods/skinsdb/skinlist.lua b/mods/skinsdb/skinlist.lua index cb8d050d..66045eda 100644 --- a/mods/skinsdb/skinlist.lua +++ b/mods/skinsdb/skinlist.lua @@ -1,71 +1,151 @@ -local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures") +local dbgprint = false and print or function() end -for _, fn in pairs(skins_dir_list) do - local name, sort_id, assignment, is_preview, playername - local nameparts = string.gsub(fn, "[.]", "_"):split("_") +--- @param path Path to the "textures" directory, without tailing slash. +--- @param filename Current file name, such as "player.groot.17.png". +--- @return On error: false, error message. On success: true, skin key +function skins.register_skin(path, filename) + -- See "textures/readme.txt" for allowed formats - -- check allowed prefix and file extension - if (nameparts[1] == 'player' or nameparts[1] == 'character') and - nameparts[#nameparts]:lower() == 'png' then + local prefix, sep, identifier, extension = filename:match("^(%a+)([_.])([%w_.-]+)%.(%a+)$") + --[[ + prefix: "character" or "player" + sep: "." (new) or "_" (legacy) + identifier: number, name or (name + sep + number) + ^ previews are explicity skipped + extension: "png" only due `skins.get_skin_format` + ]] - -- cut filename extension - table.remove(nameparts, #nameparts) + -- Filter out files that do not match the allowed patterns + if not extension or extension:lower() ~= "png" then + return false, "invalid skin name" + end + if prefix ~= "player" and prefix ~= "character" then + return false, "unknown type" + end - -- check preview suffix - if nameparts[#nameparts] == 'preview' then - is_preview = true - table.remove(nameparts, #nameparts) + local preview_suffix = sep .. "preview" + if identifier:sub(-#preview_suffix) == preview_suffix then + -- The preview texture is added by the main skin texture (if exists) + return false, "preview texture" + end + + assert(path) + if path == ":UNITTEST:" then + path = nil + end + + dbgprint("Found skin", prefix, identifier, extension) + + local sort_id -- number, sorting "rank" in the skin list + local playername -- string, if player-specific + if prefix == "player" then + -- Allow "player.PLAYERNAME.png" and "player.PLAYERNAME.123.png" + local splits = identifier:split(sep) + + playername = splits[1] + -- Put in front + sort_id = 0 + (tonumber(splits[2]) or 0) + + if #splits > 1 and sep == "_" then + minetest.log("warning", "skinsdb: The skin name '" .. filename .. "' is ambigous." .. + " Please use the separator '.' to lock it down to the correct player name.") end + else -- Public skin "character*" + -- Less priority + sort_id = 5000 + (tonumber(identifier) or 0) + end - -- Build technically skin name - name = table.concat(nameparts, '_') + local filename_noext = prefix .. sep .. identifier - -- Handle metadata from file name - if not is_preview then - -- Get player name - if nameparts[1] == "player" then - playername = nameparts[2] - table.remove(nameparts, 1) - sort_id = 0 - else - sort_id = 5000 - end + dbgprint("Register skin", filename_noext, playername, sort_id) - -- Get sort index - if tonumber(nameparts[#nameparts]) then - sort_id = sort_id + nameparts[#nameparts] - end + -- Register skin texture + local skin_obj = skins.get(filename_noext) or skins.new(filename_noext) + skin_obj:set_texture(filename) + skin_obj:set_meta("_sort_id", sort_id) + if sep ~= "_" then + skin_obj._legacy_name = filename_noext:gsub("[._]+", "_") + end + + if playername then + skin_obj:set_meta("assignment", "player:"..playername) + skin_obj:set_meta("playername", playername) + end + + if path then + -- Get type of skin based on dimensions + local file = io.open(path .. "/" .. filename, "r") + local skin_format = skins.get_skin_format(file) + skin_obj:set_meta("format", skin_format) + file:close() + end + + skin_obj:set_hand_from_texture() + skin_obj:set_meta("name", identifier) + + if path then + -- Optional skin information + local file = io.open(path .. "/../meta/" .. filename_noext .. ".txt", "r") + if file then + dbgprint("Found meta") + local data = string.split(file:read("*all"), "\n", 3) + skin_obj:set_meta("name", data[1]) + skin_obj:set_meta("author", data[2]) + skin_obj:set_meta("license", data[3]) + file:close() -- do not rely on delayed GC end + end - local skin_obj = skins.get(name) or skins.new(name) - if is_preview then - skin_obj:set_preview(fn) - else - skin_obj:set_texture(fn) - skin_obj:set_meta("_sort_id", sort_id) - if playername then - skin_obj:set_meta("assignment", "player:"..playername) - skin_obj:set_meta("playername", playername) - end - local file = io.open(skins.modpath.."/textures/"..fn, "r") - skin_obj:set_meta("format", skins.get_skin_format(file)) - file:close() - file = io.open(skins.modpath.."/meta/"..name..".txt", "r") - if file then - local data = string.split(file:read("*all"), "\n", 3) - file:close() - skin_obj:set_meta("name", data[1]) - skin_obj:set_meta("author", data[2]) - skin_obj:set_meta("license", data[3]) - else - -- remove player / character prefix if further naming given - if nameparts[2] and not tonumber(nameparts[2]) then - table.remove(nameparts, 1) - end - skin_obj:set_meta("name", table.concat(nameparts, ' ')) - end + if path then + -- Optional preview texture + local preview_name = filename_noext .. sep .. "preview.png" + local fh = io.open(path .. "/" .. preview_name) + if fh then + dbgprint("Found preview", preview_name) + skin_obj:set_preview(preview_name) + fh:close() -- do not rely on delayed GC end end + + return true, skin_obj:get_key() +end + +--- Internal function. Fallback/migration code for `.`-delimited skin names that +--- were equipped between d3c7fa7 and 312780c (master branch). +--- During this period, `.`-delimited skin names were internally registered with +--- `_` delimiters. This function tries to find a matching skin. +--- @param player_name (string) +--- @param skin_name (string) e.g. `player_foo_mc_bar` +--- @param be_noisy (boolean) whether to print a warning in case of mismatches` +--- @return On match, the new skin (skins.skin_class) or `nil` if nothing matched. +function skins.__fuzzy_match_skin_name(player_name, skin_name, be_noisy) + if select(2, skin_name:gsub("%.", "")) > 0 then + -- Not affected by ambiguity + return + end + + for _, skin in pairs(skins.meta) do + if skin._legacy_name == skin_name then + dbgprint("Match", skin_name, skin:get_key()) + return skin + end + --dbgprint("Try match", skin_name, skin:get_key(), skin._legacy_name) + end + + if be_noisy then + minetest.log("warning", "skinsdb: cannot find matching skin '" .. + skin_name .. "' for player '" .. player_name .. "'.") + end +end + +do + -- Load skins from the current mod directory + local skins_path = skins.modpath.."/textures" + local skins_dir_list = minetest.get_dir_list(skins_path) + + for _, fn in pairs(skins_dir_list) do + skins.register_skin(skins_path, fn) + end end local function skins_sort(skinslist) @@ -73,9 +153,9 @@ local function skins_sort(skinslist) local a_id = a:get_meta("_sort_id") or 10000 local b_id = b:get_meta("_sort_id") or 10000 if a_id ~= b_id then - return a:get_meta("_sort_id") < b:get_meta("_sort_id") + return a_id < b_id else - return a:get_meta("name") < b:get_meta("name") + return (a:get_meta("name") or 'ZZ') < (b:get_meta("name") or 'ZZ') end end) end diff --git a/mods/skinsdb/skins_updater.lua b/mods/skinsdb/skins_updater.lua index 22f3486d..41bb48e5 100644 --- a/mods/skinsdb/skins_updater.lua +++ b/mods/skinsdb/skins_updater.lua @@ -20,7 +20,7 @@ if not ie or not http then end minetest.register_chatcommand("skinsdb_download_skins", { - params = " ", + params = S(" "), description = S("Downloads the specified range of skins and shuts down the server"), privs = {server=true}, func = function(name, param) @@ -47,13 +47,12 @@ if #internal.errors > 0 then end -- http://minetest.fensta.bplaced.net/api/apidoku.md -local root_url = "http://minetest.fensta.bplaced.net" -local page_url = root_url .. "/api/v2/get.json.php?getlist&page=%i&outformat=base64" -- [1] = Page# -local preview_url = root_url .. "/skins/1/%i.png" -- [1] = ID +local root_url = "http://skinsdb.terraqueststudios.net" +local page_url = root_url .. "/api/v1/content?client=mod&page=%i" -- [1] = Page# -local mod_path = skins.modpath -local meta_path = mod_path .. "/meta/" -local skins_path = mod_path .. "/textures/" +local download_path = skins.modpath +local meta_path = download_path .. "/meta/" +local skins_path = download_path .. "/textures/" -- Fancy debug wrapper to download an URL local function fetch_url(url, callback) @@ -81,14 +80,22 @@ local function unsafe_file_write(path, contents) end -- Takes a valid skin table from the Skins Database and saves it -local function safe_single_skin(skin) +local function save_single_skin(skin) local meta = { skin.name, skin.author, skin.license } - local name = "character_" .. skin.id + local name = "character." .. skin.id + do + local legacy_name = "character_" .. skin.id + local fh = ie.io.open(skins_path .. legacy_name .. ".png", "r") + -- Use the old name if either the texture ... + if fh then + name = legacy_name + end + end -- core.safe_file_write does not work here unsafe_file_write( @@ -100,9 +107,6 @@ local function safe_single_skin(skin) skins_path .. name .. ".png", core.decode_base64(skin.img) ) - fetch_url(preview_url:format(skin.id), function(preview) - unsafe_file_write(skins_path .. name .. "_preview.png", preview) - end) core.log("action", ("%s: Completed skin %s"):format(_ID_, name)) end @@ -115,7 +119,7 @@ internal.get_pages_count = function(callback, ...) callback(math.ceil(list.pages / 20), unpack(vars)) end) end - + -- Function to fetch a range of pages internal.fetch_function = function(pages_total, start_page, len) start_page = math.max(start_page, 1) @@ -132,7 +136,7 @@ internal.fetch_function = function(pages_total, start_page, len) assert(skin.id ~= "") if skin.id ~= 1 then -- Skin 1 is bundled with skinsdb - safe_single_skin(skin) + save_single_skin(skin) end end diff --git a/mods/skinsdb/textures/character_1.png b/mods/skinsdb/textures/character.1.png similarity index 100% rename from mods/skinsdb/textures/character_1.png rename to mods/skinsdb/textures/character.1.png diff --git a/mods/skinsdb/textures/character_10.png b/mods/skinsdb/textures/character.10.png similarity index 100% rename from mods/skinsdb/textures/character_10.png rename to mods/skinsdb/textures/character.10.png diff --git a/mods/skinsdb/textures/character_1000.png b/mods/skinsdb/textures/character.1000.png similarity index 100% rename from mods/skinsdb/textures/character_1000.png rename to mods/skinsdb/textures/character.1000.png diff --git a/mods/skinsdb/textures/character_1001.png b/mods/skinsdb/textures/character.1001.png similarity index 100% rename from mods/skinsdb/textures/character_1001.png rename to mods/skinsdb/textures/character.1001.png diff --git a/mods/skinsdb/textures/character_1002.png b/mods/skinsdb/textures/character.1002.png similarity index 100% rename from mods/skinsdb/textures/character_1002.png rename to mods/skinsdb/textures/character.1002.png diff --git a/mods/skinsdb/textures/character_1003.png b/mods/skinsdb/textures/character.1003.png similarity index 100% rename from mods/skinsdb/textures/character_1003.png rename to mods/skinsdb/textures/character.1003.png diff --git a/mods/skinsdb/textures/character_1004.png b/mods/skinsdb/textures/character.1004.png similarity index 100% rename from mods/skinsdb/textures/character_1004.png rename to mods/skinsdb/textures/character.1004.png diff --git a/mods/skinsdb/textures/character_1005.png b/mods/skinsdb/textures/character.1005.png similarity index 100% rename from mods/skinsdb/textures/character_1005.png rename to mods/skinsdb/textures/character.1005.png diff --git a/mods/skinsdb/textures/character_1006.png b/mods/skinsdb/textures/character.1006.png similarity index 100% rename from mods/skinsdb/textures/character_1006.png rename to mods/skinsdb/textures/character.1006.png diff --git a/mods/skinsdb/textures/character_1007.png b/mods/skinsdb/textures/character.1007.png similarity index 100% rename from mods/skinsdb/textures/character_1007.png rename to mods/skinsdb/textures/character.1007.png diff --git a/mods/skinsdb/textures/character_1008.png b/mods/skinsdb/textures/character.1008.png similarity index 100% rename from mods/skinsdb/textures/character_1008.png rename to mods/skinsdb/textures/character.1008.png diff --git a/mods/skinsdb/textures/character_1009.png b/mods/skinsdb/textures/character.1009.png similarity index 100% rename from mods/skinsdb/textures/character_1009.png rename to mods/skinsdb/textures/character.1009.png diff --git a/mods/skinsdb/textures/character_101.png b/mods/skinsdb/textures/character.101.png similarity index 100% rename from mods/skinsdb/textures/character_101.png rename to mods/skinsdb/textures/character.101.png diff --git a/mods/skinsdb/textures/character_1010.png b/mods/skinsdb/textures/character.1010.png similarity index 100% rename from mods/skinsdb/textures/character_1010.png rename to mods/skinsdb/textures/character.1010.png diff --git a/mods/skinsdb/textures/character_1011.png b/mods/skinsdb/textures/character.1011.png similarity index 100% rename from mods/skinsdb/textures/character_1011.png rename to mods/skinsdb/textures/character.1011.png diff --git a/mods/skinsdb/textures/character_1012.png b/mods/skinsdb/textures/character.1012.png similarity index 100% rename from mods/skinsdb/textures/character_1012.png rename to mods/skinsdb/textures/character.1012.png diff --git a/mods/skinsdb/textures/character_1013.png b/mods/skinsdb/textures/character.1013.png similarity index 100% rename from mods/skinsdb/textures/character_1013.png rename to mods/skinsdb/textures/character.1013.png diff --git a/mods/skinsdb/textures/character_1014.png b/mods/skinsdb/textures/character.1014.png similarity index 100% rename from mods/skinsdb/textures/character_1014.png rename to mods/skinsdb/textures/character.1014.png diff --git a/mods/skinsdb/textures/character_1015.png b/mods/skinsdb/textures/character.1015.png similarity index 100% rename from mods/skinsdb/textures/character_1015.png rename to mods/skinsdb/textures/character.1015.png diff --git a/mods/skinsdb/textures/character_1016.png b/mods/skinsdb/textures/character.1016.png similarity index 100% rename from mods/skinsdb/textures/character_1016.png rename to mods/skinsdb/textures/character.1016.png diff --git a/mods/skinsdb/textures/character_1017.png b/mods/skinsdb/textures/character.1017.png similarity index 100% rename from mods/skinsdb/textures/character_1017.png rename to mods/skinsdb/textures/character.1017.png diff --git a/mods/skinsdb/textures/character_1018.png b/mods/skinsdb/textures/character.1018.png similarity index 100% rename from mods/skinsdb/textures/character_1018.png rename to mods/skinsdb/textures/character.1018.png diff --git a/mods/skinsdb/textures/character_1019.png b/mods/skinsdb/textures/character.1019.png similarity index 100% rename from mods/skinsdb/textures/character_1019.png rename to mods/skinsdb/textures/character.1019.png diff --git a/mods/skinsdb/textures/character_1020.png b/mods/skinsdb/textures/character.1020.png similarity index 100% rename from mods/skinsdb/textures/character_1020.png rename to mods/skinsdb/textures/character.1020.png diff --git a/mods/skinsdb/textures/character_1021.png b/mods/skinsdb/textures/character.1021.png similarity index 100% rename from mods/skinsdb/textures/character_1021.png rename to mods/skinsdb/textures/character.1021.png diff --git a/mods/skinsdb/textures/character_1022.png b/mods/skinsdb/textures/character.1022.png similarity index 100% rename from mods/skinsdb/textures/character_1022.png rename to mods/skinsdb/textures/character.1022.png diff --git a/mods/skinsdb/textures/character_1023.png b/mods/skinsdb/textures/character.1023.png similarity index 100% rename from mods/skinsdb/textures/character_1023.png rename to mods/skinsdb/textures/character.1023.png diff --git a/mods/skinsdb/textures/character_1024.png b/mods/skinsdb/textures/character.1024.png similarity index 100% rename from mods/skinsdb/textures/character_1024.png rename to mods/skinsdb/textures/character.1024.png diff --git a/mods/skinsdb/textures/character_1025.png b/mods/skinsdb/textures/character.1025.png similarity index 100% rename from mods/skinsdb/textures/character_1025.png rename to mods/skinsdb/textures/character.1025.png diff --git a/mods/skinsdb/textures/character_1026.png b/mods/skinsdb/textures/character.1026.png similarity index 100% rename from mods/skinsdb/textures/character_1026.png rename to mods/skinsdb/textures/character.1026.png diff --git a/mods/skinsdb/textures/character_1027.png b/mods/skinsdb/textures/character.1027.png similarity index 100% rename from mods/skinsdb/textures/character_1027.png rename to mods/skinsdb/textures/character.1027.png diff --git a/mods/skinsdb/textures/character_1028.png b/mods/skinsdb/textures/character.1028.png similarity index 100% rename from mods/skinsdb/textures/character_1028.png rename to mods/skinsdb/textures/character.1028.png diff --git a/mods/skinsdb/textures/character_1029.png b/mods/skinsdb/textures/character.1029.png similarity index 100% rename from mods/skinsdb/textures/character_1029.png rename to mods/skinsdb/textures/character.1029.png diff --git a/mods/skinsdb/textures/character_1030.png b/mods/skinsdb/textures/character.1030.png similarity index 100% rename from mods/skinsdb/textures/character_1030.png rename to mods/skinsdb/textures/character.1030.png diff --git a/mods/skinsdb/textures/character_1031.png b/mods/skinsdb/textures/character.1031.png similarity index 100% rename from mods/skinsdb/textures/character_1031.png rename to mods/skinsdb/textures/character.1031.png diff --git a/mods/skinsdb/textures/character_1032.png b/mods/skinsdb/textures/character.1032.png similarity index 100% rename from mods/skinsdb/textures/character_1032.png rename to mods/skinsdb/textures/character.1032.png diff --git a/mods/skinsdb/textures/character_1033.png b/mods/skinsdb/textures/character.1033.png similarity index 100% rename from mods/skinsdb/textures/character_1033.png rename to mods/skinsdb/textures/character.1033.png diff --git a/mods/skinsdb/textures/character_1034.png b/mods/skinsdb/textures/character.1034.png similarity index 100% rename from mods/skinsdb/textures/character_1034.png rename to mods/skinsdb/textures/character.1034.png diff --git a/mods/skinsdb/textures/character_1035.png b/mods/skinsdb/textures/character.1035.png similarity index 100% rename from mods/skinsdb/textures/character_1035.png rename to mods/skinsdb/textures/character.1035.png diff --git a/mods/skinsdb/textures/character_1036.png b/mods/skinsdb/textures/character.1036.png similarity index 100% rename from mods/skinsdb/textures/character_1036.png rename to mods/skinsdb/textures/character.1036.png diff --git a/mods/skinsdb/textures/character_1037.png b/mods/skinsdb/textures/character.1037.png similarity index 100% rename from mods/skinsdb/textures/character_1037.png rename to mods/skinsdb/textures/character.1037.png diff --git a/mods/skinsdb/textures/character_1038.png b/mods/skinsdb/textures/character.1038.png similarity index 100% rename from mods/skinsdb/textures/character_1038.png rename to mods/skinsdb/textures/character.1038.png diff --git a/mods/skinsdb/textures/character_1039.png b/mods/skinsdb/textures/character.1039.png similarity index 100% rename from mods/skinsdb/textures/character_1039.png rename to mods/skinsdb/textures/character.1039.png diff --git a/mods/skinsdb/textures/character_1040.png b/mods/skinsdb/textures/character.1040.png similarity index 100% rename from mods/skinsdb/textures/character_1040.png rename to mods/skinsdb/textures/character.1040.png diff --git a/mods/skinsdb/textures/character_1041.png b/mods/skinsdb/textures/character.1041.png similarity index 100% rename from mods/skinsdb/textures/character_1041.png rename to mods/skinsdb/textures/character.1041.png diff --git a/mods/skinsdb/textures/character_1042.png b/mods/skinsdb/textures/character.1042.png similarity index 100% rename from mods/skinsdb/textures/character_1042.png rename to mods/skinsdb/textures/character.1042.png diff --git a/mods/skinsdb/textures/character_1043.png b/mods/skinsdb/textures/character.1043.png similarity index 100% rename from mods/skinsdb/textures/character_1043.png rename to mods/skinsdb/textures/character.1043.png diff --git a/mods/skinsdb/textures/character_1044.png b/mods/skinsdb/textures/character.1044.png similarity index 100% rename from mods/skinsdb/textures/character_1044.png rename to mods/skinsdb/textures/character.1044.png diff --git a/mods/skinsdb/textures/character_1045.png b/mods/skinsdb/textures/character.1045.png similarity index 100% rename from mods/skinsdb/textures/character_1045.png rename to mods/skinsdb/textures/character.1045.png diff --git a/mods/skinsdb/textures/character_1046.png b/mods/skinsdb/textures/character.1046.png similarity index 100% rename from mods/skinsdb/textures/character_1046.png rename to mods/skinsdb/textures/character.1046.png diff --git a/mods/skinsdb/textures/character_1047.png b/mods/skinsdb/textures/character.1047.png similarity index 100% rename from mods/skinsdb/textures/character_1047.png rename to mods/skinsdb/textures/character.1047.png diff --git a/mods/skinsdb/textures/character_1048.png b/mods/skinsdb/textures/character.1048.png similarity index 100% rename from mods/skinsdb/textures/character_1048.png rename to mods/skinsdb/textures/character.1048.png diff --git a/mods/skinsdb/textures/character_1049.png b/mods/skinsdb/textures/character.1049.png similarity index 100% rename from mods/skinsdb/textures/character_1049.png rename to mods/skinsdb/textures/character.1049.png diff --git a/mods/skinsdb/textures/character_1050.png b/mods/skinsdb/textures/character.1050.png similarity index 100% rename from mods/skinsdb/textures/character_1050.png rename to mods/skinsdb/textures/character.1050.png diff --git a/mods/skinsdb/textures/character_1051.png b/mods/skinsdb/textures/character.1051.png similarity index 100% rename from mods/skinsdb/textures/character_1051.png rename to mods/skinsdb/textures/character.1051.png diff --git a/mods/skinsdb/textures/character_1052.png b/mods/skinsdb/textures/character.1052.png similarity index 100% rename from mods/skinsdb/textures/character_1052.png rename to mods/skinsdb/textures/character.1052.png diff --git a/mods/skinsdb/textures/character_1053.png b/mods/skinsdb/textures/character.1053.png similarity index 100% rename from mods/skinsdb/textures/character_1053.png rename to mods/skinsdb/textures/character.1053.png diff --git a/mods/skinsdb/textures/character_1054.png b/mods/skinsdb/textures/character.1054.png similarity index 100% rename from mods/skinsdb/textures/character_1054.png rename to mods/skinsdb/textures/character.1054.png diff --git a/mods/skinsdb/textures/character_1055.png b/mods/skinsdb/textures/character.1055.png similarity index 100% rename from mods/skinsdb/textures/character_1055.png rename to mods/skinsdb/textures/character.1055.png diff --git a/mods/skinsdb/textures/character_1056.png b/mods/skinsdb/textures/character.1056.png similarity index 100% rename from mods/skinsdb/textures/character_1056.png rename to mods/skinsdb/textures/character.1056.png diff --git a/mods/skinsdb/textures/character_1057.png b/mods/skinsdb/textures/character.1057.png similarity index 100% rename from mods/skinsdb/textures/character_1057.png rename to mods/skinsdb/textures/character.1057.png diff --git a/mods/skinsdb/textures/character_1058.png b/mods/skinsdb/textures/character.1058.png similarity index 100% rename from mods/skinsdb/textures/character_1058.png rename to mods/skinsdb/textures/character.1058.png diff --git a/mods/skinsdb/textures/character_1059.png b/mods/skinsdb/textures/character.1059.png similarity index 100% rename from mods/skinsdb/textures/character_1059.png rename to mods/skinsdb/textures/character.1059.png diff --git a/mods/skinsdb/textures/character_1060.png b/mods/skinsdb/textures/character.1060.png similarity index 100% rename from mods/skinsdb/textures/character_1060.png rename to mods/skinsdb/textures/character.1060.png diff --git a/mods/skinsdb/textures/character_1061.png b/mods/skinsdb/textures/character.1061.png similarity index 100% rename from mods/skinsdb/textures/character_1061.png rename to mods/skinsdb/textures/character.1061.png diff --git a/mods/skinsdb/textures/character_1062.png b/mods/skinsdb/textures/character.1062.png similarity index 100% rename from mods/skinsdb/textures/character_1062.png rename to mods/skinsdb/textures/character.1062.png diff --git a/mods/skinsdb/textures/character_1063.png b/mods/skinsdb/textures/character.1063.png similarity index 100% rename from mods/skinsdb/textures/character_1063.png rename to mods/skinsdb/textures/character.1063.png diff --git a/mods/skinsdb/textures/character_1064.png b/mods/skinsdb/textures/character.1064.png similarity index 100% rename from mods/skinsdb/textures/character_1064.png rename to mods/skinsdb/textures/character.1064.png diff --git a/mods/skinsdb/textures/character_1065.png b/mods/skinsdb/textures/character.1065.png similarity index 100% rename from mods/skinsdb/textures/character_1065.png rename to mods/skinsdb/textures/character.1065.png diff --git a/mods/skinsdb/textures/character_1066.png b/mods/skinsdb/textures/character.1066.png similarity index 100% rename from mods/skinsdb/textures/character_1066.png rename to mods/skinsdb/textures/character.1066.png diff --git a/mods/skinsdb/textures/character_1067.png b/mods/skinsdb/textures/character.1067.png similarity index 100% rename from mods/skinsdb/textures/character_1067.png rename to mods/skinsdb/textures/character.1067.png diff --git a/mods/skinsdb/textures/character_1068.png b/mods/skinsdb/textures/character.1068.png similarity index 100% rename from mods/skinsdb/textures/character_1068.png rename to mods/skinsdb/textures/character.1068.png diff --git a/mods/skinsdb/textures/character_1069.png b/mods/skinsdb/textures/character.1069.png similarity index 100% rename from mods/skinsdb/textures/character_1069.png rename to mods/skinsdb/textures/character.1069.png diff --git a/mods/skinsdb/textures/character_1070.png b/mods/skinsdb/textures/character.1070.png similarity index 100% rename from mods/skinsdb/textures/character_1070.png rename to mods/skinsdb/textures/character.1070.png diff --git a/mods/skinsdb/textures/character_1071.png b/mods/skinsdb/textures/character.1071.png similarity index 100% rename from mods/skinsdb/textures/character_1071.png rename to mods/skinsdb/textures/character.1071.png diff --git a/mods/skinsdb/textures/character_1072.png b/mods/skinsdb/textures/character.1072.png similarity index 100% rename from mods/skinsdb/textures/character_1072.png rename to mods/skinsdb/textures/character.1072.png diff --git a/mods/skinsdb/textures/character_1073.png b/mods/skinsdb/textures/character.1073.png similarity index 100% rename from mods/skinsdb/textures/character_1073.png rename to mods/skinsdb/textures/character.1073.png diff --git a/mods/skinsdb/textures/character_1075.png b/mods/skinsdb/textures/character.1075.png similarity index 100% rename from mods/skinsdb/textures/character_1075.png rename to mods/skinsdb/textures/character.1075.png diff --git a/mods/skinsdb/textures/character_1076.png b/mods/skinsdb/textures/character.1076.png similarity index 100% rename from mods/skinsdb/textures/character_1076.png rename to mods/skinsdb/textures/character.1076.png diff --git a/mods/skinsdb/textures/character_1077.png b/mods/skinsdb/textures/character.1077.png similarity index 100% rename from mods/skinsdb/textures/character_1077.png rename to mods/skinsdb/textures/character.1077.png diff --git a/mods/skinsdb/textures/character_1078.png b/mods/skinsdb/textures/character.1078.png similarity index 100% rename from mods/skinsdb/textures/character_1078.png rename to mods/skinsdb/textures/character.1078.png diff --git a/mods/skinsdb/textures/character_1079.png b/mods/skinsdb/textures/character.1079.png similarity index 100% rename from mods/skinsdb/textures/character_1079.png rename to mods/skinsdb/textures/character.1079.png diff --git a/mods/skinsdb/textures/character_108.png b/mods/skinsdb/textures/character.108.png similarity index 100% rename from mods/skinsdb/textures/character_108.png rename to mods/skinsdb/textures/character.108.png diff --git a/mods/skinsdb/textures/character_1080.png b/mods/skinsdb/textures/character.1080.png similarity index 100% rename from mods/skinsdb/textures/character_1080.png rename to mods/skinsdb/textures/character.1080.png diff --git a/mods/skinsdb/textures/character_1081.png b/mods/skinsdb/textures/character.1081.png similarity index 100% rename from mods/skinsdb/textures/character_1081.png rename to mods/skinsdb/textures/character.1081.png diff --git a/mods/skinsdb/textures/character_1082.png b/mods/skinsdb/textures/character.1082.png similarity index 100% rename from mods/skinsdb/textures/character_1082.png rename to mods/skinsdb/textures/character.1082.png diff --git a/mods/skinsdb/textures/character_1083.png b/mods/skinsdb/textures/character.1083.png similarity index 100% rename from mods/skinsdb/textures/character_1083.png rename to mods/skinsdb/textures/character.1083.png diff --git a/mods/skinsdb/textures/character_1084.png b/mods/skinsdb/textures/character.1084.png similarity index 100% rename from mods/skinsdb/textures/character_1084.png rename to mods/skinsdb/textures/character.1084.png diff --git a/mods/skinsdb/textures/character_1085.png b/mods/skinsdb/textures/character.1085.png similarity index 100% rename from mods/skinsdb/textures/character_1085.png rename to mods/skinsdb/textures/character.1085.png diff --git a/mods/skinsdb/textures/character_1086.png b/mods/skinsdb/textures/character.1086.png similarity index 100% rename from mods/skinsdb/textures/character_1086.png rename to mods/skinsdb/textures/character.1086.png diff --git a/mods/skinsdb/textures/character_1087.png b/mods/skinsdb/textures/character.1087.png similarity index 100% rename from mods/skinsdb/textures/character_1087.png rename to mods/skinsdb/textures/character.1087.png diff --git a/mods/skinsdb/textures/character_1088.png b/mods/skinsdb/textures/character.1088.png similarity index 100% rename from mods/skinsdb/textures/character_1088.png rename to mods/skinsdb/textures/character.1088.png diff --git a/mods/skinsdb/textures/character_1089.png b/mods/skinsdb/textures/character.1089.png similarity index 100% rename from mods/skinsdb/textures/character_1089.png rename to mods/skinsdb/textures/character.1089.png diff --git a/mods/skinsdb/textures/character_109.png b/mods/skinsdb/textures/character.109.png similarity index 100% rename from mods/skinsdb/textures/character_109.png rename to mods/skinsdb/textures/character.109.png diff --git a/mods/skinsdb/textures/character_1090.png b/mods/skinsdb/textures/character.1090.png similarity index 100% rename from mods/skinsdb/textures/character_1090.png rename to mods/skinsdb/textures/character.1090.png diff --git a/mods/skinsdb/textures/character_1091.png b/mods/skinsdb/textures/character.1091.png similarity index 100% rename from mods/skinsdb/textures/character_1091.png rename to mods/skinsdb/textures/character.1091.png diff --git a/mods/skinsdb/textures/character_1092.png b/mods/skinsdb/textures/character.1092.png similarity index 100% rename from mods/skinsdb/textures/character_1092.png rename to mods/skinsdb/textures/character.1092.png diff --git a/mods/skinsdb/textures/character_1093.png b/mods/skinsdb/textures/character.1093.png similarity index 100% rename from mods/skinsdb/textures/character_1093.png rename to mods/skinsdb/textures/character.1093.png diff --git a/mods/skinsdb/textures/character_1094.png b/mods/skinsdb/textures/character.1094.png similarity index 100% rename from mods/skinsdb/textures/character_1094.png rename to mods/skinsdb/textures/character.1094.png diff --git a/mods/skinsdb/textures/character_1095.png b/mods/skinsdb/textures/character.1095.png similarity index 100% rename from mods/skinsdb/textures/character_1095.png rename to mods/skinsdb/textures/character.1095.png diff --git a/mods/skinsdb/textures/character_1096.png b/mods/skinsdb/textures/character.1096.png similarity index 100% rename from mods/skinsdb/textures/character_1096.png rename to mods/skinsdb/textures/character.1096.png diff --git a/mods/skinsdb/textures/character_1097.png b/mods/skinsdb/textures/character.1097.png similarity index 100% rename from mods/skinsdb/textures/character_1097.png rename to mods/skinsdb/textures/character.1097.png diff --git a/mods/skinsdb/textures/character_1098.png b/mods/skinsdb/textures/character.1098.png similarity index 100% rename from mods/skinsdb/textures/character_1098.png rename to mods/skinsdb/textures/character.1098.png diff --git a/mods/skinsdb/textures/character_1099.png b/mods/skinsdb/textures/character.1099.png similarity index 100% rename from mods/skinsdb/textures/character_1099.png rename to mods/skinsdb/textures/character.1099.png diff --git a/mods/skinsdb/textures/character_110.png b/mods/skinsdb/textures/character.110.png similarity index 100% rename from mods/skinsdb/textures/character_110.png rename to mods/skinsdb/textures/character.110.png diff --git a/mods/skinsdb/textures/character_1100.png b/mods/skinsdb/textures/character.1100.png similarity index 100% rename from mods/skinsdb/textures/character_1100.png rename to mods/skinsdb/textures/character.1100.png diff --git a/mods/skinsdb/textures/character_1101.png b/mods/skinsdb/textures/character.1101.png similarity index 100% rename from mods/skinsdb/textures/character_1101.png rename to mods/skinsdb/textures/character.1101.png diff --git a/mods/skinsdb/textures/character_1102.png b/mods/skinsdb/textures/character.1102.png similarity index 100% rename from mods/skinsdb/textures/character_1102.png rename to mods/skinsdb/textures/character.1102.png diff --git a/mods/skinsdb/textures/character_1103.png b/mods/skinsdb/textures/character.1103.png similarity index 100% rename from mods/skinsdb/textures/character_1103.png rename to mods/skinsdb/textures/character.1103.png diff --git a/mods/skinsdb/textures/character_1104.png b/mods/skinsdb/textures/character.1104.png similarity index 100% rename from mods/skinsdb/textures/character_1104.png rename to mods/skinsdb/textures/character.1104.png diff --git a/mods/skinsdb/textures/character_1105.png b/mods/skinsdb/textures/character.1105.png similarity index 100% rename from mods/skinsdb/textures/character_1105.png rename to mods/skinsdb/textures/character.1105.png diff --git a/mods/skinsdb/textures/character_1106.png b/mods/skinsdb/textures/character.1106.png similarity index 100% rename from mods/skinsdb/textures/character_1106.png rename to mods/skinsdb/textures/character.1106.png diff --git a/mods/skinsdb/textures/character_1107.png b/mods/skinsdb/textures/character.1107.png similarity index 100% rename from mods/skinsdb/textures/character_1107.png rename to mods/skinsdb/textures/character.1107.png diff --git a/mods/skinsdb/textures/character_1108.png b/mods/skinsdb/textures/character.1108.png similarity index 100% rename from mods/skinsdb/textures/character_1108.png rename to mods/skinsdb/textures/character.1108.png diff --git a/mods/skinsdb/textures/character_1109.png b/mods/skinsdb/textures/character.1109.png similarity index 100% rename from mods/skinsdb/textures/character_1109.png rename to mods/skinsdb/textures/character.1109.png diff --git a/mods/skinsdb/textures/character_111.png b/mods/skinsdb/textures/character.111.png similarity index 100% rename from mods/skinsdb/textures/character_111.png rename to mods/skinsdb/textures/character.111.png diff --git a/mods/skinsdb/textures/character_1110.png b/mods/skinsdb/textures/character.1110.png similarity index 100% rename from mods/skinsdb/textures/character_1110.png rename to mods/skinsdb/textures/character.1110.png diff --git a/mods/skinsdb/textures/character_1111.png b/mods/skinsdb/textures/character.1111.png similarity index 100% rename from mods/skinsdb/textures/character_1111.png rename to mods/skinsdb/textures/character.1111.png diff --git a/mods/skinsdb/textures/character_1112.png b/mods/skinsdb/textures/character.1112.png similarity index 100% rename from mods/skinsdb/textures/character_1112.png rename to mods/skinsdb/textures/character.1112.png diff --git a/mods/skinsdb/textures/character_1113.png b/mods/skinsdb/textures/character.1113.png similarity index 100% rename from mods/skinsdb/textures/character_1113.png rename to mods/skinsdb/textures/character.1113.png diff --git a/mods/skinsdb/textures/character_1114.png b/mods/skinsdb/textures/character.1114.png similarity index 100% rename from mods/skinsdb/textures/character_1114.png rename to mods/skinsdb/textures/character.1114.png diff --git a/mods/skinsdb/textures/character_1115.png b/mods/skinsdb/textures/character.1115.png similarity index 100% rename from mods/skinsdb/textures/character_1115.png rename to mods/skinsdb/textures/character.1115.png diff --git a/mods/skinsdb/textures/character_1116.png b/mods/skinsdb/textures/character.1116.png similarity index 100% rename from mods/skinsdb/textures/character_1116.png rename to mods/skinsdb/textures/character.1116.png diff --git a/mods/skinsdb/textures/character_1117.png b/mods/skinsdb/textures/character.1117.png similarity index 100% rename from mods/skinsdb/textures/character_1117.png rename to mods/skinsdb/textures/character.1117.png diff --git a/mods/skinsdb/textures/character_1118.png b/mods/skinsdb/textures/character.1118.png similarity index 100% rename from mods/skinsdb/textures/character_1118.png rename to mods/skinsdb/textures/character.1118.png diff --git a/mods/skinsdb/textures/character_1119.png b/mods/skinsdb/textures/character.1119.png similarity index 100% rename from mods/skinsdb/textures/character_1119.png rename to mods/skinsdb/textures/character.1119.png diff --git a/mods/skinsdb/textures/character_112.png b/mods/skinsdb/textures/character.112.png similarity index 100% rename from mods/skinsdb/textures/character_112.png rename to mods/skinsdb/textures/character.112.png diff --git a/mods/skinsdb/textures/character_1120.png b/mods/skinsdb/textures/character.1120.png similarity index 100% rename from mods/skinsdb/textures/character_1120.png rename to mods/skinsdb/textures/character.1120.png diff --git a/mods/skinsdb/textures/character_1121.png b/mods/skinsdb/textures/character.1121.png similarity index 100% rename from mods/skinsdb/textures/character_1121.png rename to mods/skinsdb/textures/character.1121.png diff --git a/mods/skinsdb/textures/character_1122.png b/mods/skinsdb/textures/character.1122.png similarity index 100% rename from mods/skinsdb/textures/character_1122.png rename to mods/skinsdb/textures/character.1122.png diff --git a/mods/skinsdb/textures/character_1123.png b/mods/skinsdb/textures/character.1123.png similarity index 100% rename from mods/skinsdb/textures/character_1123.png rename to mods/skinsdb/textures/character.1123.png diff --git a/mods/skinsdb/textures/character_1124.png b/mods/skinsdb/textures/character.1124.png similarity index 100% rename from mods/skinsdb/textures/character_1124.png rename to mods/skinsdb/textures/character.1124.png diff --git a/mods/skinsdb/textures/character_1126.png b/mods/skinsdb/textures/character.1126.png similarity index 100% rename from mods/skinsdb/textures/character_1126.png rename to mods/skinsdb/textures/character.1126.png diff --git a/mods/skinsdb/textures/character_1127.png b/mods/skinsdb/textures/character.1127.png similarity index 100% rename from mods/skinsdb/textures/character_1127.png rename to mods/skinsdb/textures/character.1127.png diff --git a/mods/skinsdb/textures/character_113.png b/mods/skinsdb/textures/character.113.png similarity index 100% rename from mods/skinsdb/textures/character_113.png rename to mods/skinsdb/textures/character.113.png diff --git a/mods/skinsdb/textures/character_1133.png b/mods/skinsdb/textures/character.1133.png similarity index 100% rename from mods/skinsdb/textures/character_1133.png rename to mods/skinsdb/textures/character.1133.png diff --git a/mods/skinsdb/textures/character_1134.png b/mods/skinsdb/textures/character.1134.png similarity index 100% rename from mods/skinsdb/textures/character_1134.png rename to mods/skinsdb/textures/character.1134.png diff --git a/mods/skinsdb/textures/character_1135.png b/mods/skinsdb/textures/character.1135.png similarity index 100% rename from mods/skinsdb/textures/character_1135.png rename to mods/skinsdb/textures/character.1135.png diff --git a/mods/skinsdb/textures/character_1136.png b/mods/skinsdb/textures/character.1136.png similarity index 100% rename from mods/skinsdb/textures/character_1136.png rename to mods/skinsdb/textures/character.1136.png diff --git a/mods/skinsdb/textures/character_1137.png b/mods/skinsdb/textures/character.1137.png similarity index 100% rename from mods/skinsdb/textures/character_1137.png rename to mods/skinsdb/textures/character.1137.png diff --git a/mods/skinsdb/textures/character_1138.png b/mods/skinsdb/textures/character.1138.png similarity index 100% rename from mods/skinsdb/textures/character_1138.png rename to mods/skinsdb/textures/character.1138.png diff --git a/mods/skinsdb/textures/character_1139.png b/mods/skinsdb/textures/character.1139.png similarity index 100% rename from mods/skinsdb/textures/character_1139.png rename to mods/skinsdb/textures/character.1139.png diff --git a/mods/skinsdb/textures/character_114.png b/mods/skinsdb/textures/character.114.png similarity index 100% rename from mods/skinsdb/textures/character_114.png rename to mods/skinsdb/textures/character.114.png diff --git a/mods/skinsdb/textures/character_1140.png b/mods/skinsdb/textures/character.1140.png similarity index 100% rename from mods/skinsdb/textures/character_1140.png rename to mods/skinsdb/textures/character.1140.png diff --git a/mods/skinsdb/textures/character_1141.png b/mods/skinsdb/textures/character.1141.png similarity index 100% rename from mods/skinsdb/textures/character_1141.png rename to mods/skinsdb/textures/character.1141.png diff --git a/mods/skinsdb/textures/character_1142.png b/mods/skinsdb/textures/character.1142.png similarity index 100% rename from mods/skinsdb/textures/character_1142.png rename to mods/skinsdb/textures/character.1142.png diff --git a/mods/skinsdb/textures/character_1143.png b/mods/skinsdb/textures/character.1143.png similarity index 100% rename from mods/skinsdb/textures/character_1143.png rename to mods/skinsdb/textures/character.1143.png diff --git a/mods/skinsdb/textures/character_1144.png b/mods/skinsdb/textures/character.1144.png similarity index 100% rename from mods/skinsdb/textures/character_1144.png rename to mods/skinsdb/textures/character.1144.png diff --git a/mods/skinsdb/textures/character_1145.png b/mods/skinsdb/textures/character.1145.png similarity index 100% rename from mods/skinsdb/textures/character_1145.png rename to mods/skinsdb/textures/character.1145.png diff --git a/mods/skinsdb/textures/character_1146.png b/mods/skinsdb/textures/character.1146.png similarity index 100% rename from mods/skinsdb/textures/character_1146.png rename to mods/skinsdb/textures/character.1146.png diff --git a/mods/skinsdb/textures/character_1147.png b/mods/skinsdb/textures/character.1147.png similarity index 100% rename from mods/skinsdb/textures/character_1147.png rename to mods/skinsdb/textures/character.1147.png diff --git a/mods/skinsdb/textures/character_1148.png b/mods/skinsdb/textures/character.1148.png similarity index 100% rename from mods/skinsdb/textures/character_1148.png rename to mods/skinsdb/textures/character.1148.png diff --git a/mods/skinsdb/textures/character_1149.png b/mods/skinsdb/textures/character.1149.png similarity index 100% rename from mods/skinsdb/textures/character_1149.png rename to mods/skinsdb/textures/character.1149.png diff --git a/mods/skinsdb/textures/character_1150.png b/mods/skinsdb/textures/character.1150.png similarity index 100% rename from mods/skinsdb/textures/character_1150.png rename to mods/skinsdb/textures/character.1150.png diff --git a/mods/skinsdb/textures/character_1151.png b/mods/skinsdb/textures/character.1151.png similarity index 100% rename from mods/skinsdb/textures/character_1151.png rename to mods/skinsdb/textures/character.1151.png diff --git a/mods/skinsdb/textures/character_1153.png b/mods/skinsdb/textures/character.1153.png similarity index 100% rename from mods/skinsdb/textures/character_1153.png rename to mods/skinsdb/textures/character.1153.png diff --git a/mods/skinsdb/textures/character_1154.png b/mods/skinsdb/textures/character.1154.png similarity index 100% rename from mods/skinsdb/textures/character_1154.png rename to mods/skinsdb/textures/character.1154.png diff --git a/mods/skinsdb/textures/character_1155.png b/mods/skinsdb/textures/character.1155.png similarity index 100% rename from mods/skinsdb/textures/character_1155.png rename to mods/skinsdb/textures/character.1155.png diff --git a/mods/skinsdb/textures/character_1156.png b/mods/skinsdb/textures/character.1156.png similarity index 100% rename from mods/skinsdb/textures/character_1156.png rename to mods/skinsdb/textures/character.1156.png diff --git a/mods/skinsdb/textures/character_1157.png b/mods/skinsdb/textures/character.1157.png similarity index 100% rename from mods/skinsdb/textures/character_1157.png rename to mods/skinsdb/textures/character.1157.png diff --git a/mods/skinsdb/textures/character_1158.png b/mods/skinsdb/textures/character.1158.png similarity index 100% rename from mods/skinsdb/textures/character_1158.png rename to mods/skinsdb/textures/character.1158.png diff --git a/mods/skinsdb/textures/character_1159.png b/mods/skinsdb/textures/character.1159.png similarity index 100% rename from mods/skinsdb/textures/character_1159.png rename to mods/skinsdb/textures/character.1159.png diff --git a/mods/skinsdb/textures/character_1160.png b/mods/skinsdb/textures/character.1160.png similarity index 100% rename from mods/skinsdb/textures/character_1160.png rename to mods/skinsdb/textures/character.1160.png diff --git a/mods/skinsdb/textures/character_1161.png b/mods/skinsdb/textures/character.1161.png similarity index 100% rename from mods/skinsdb/textures/character_1161.png rename to mods/skinsdb/textures/character.1161.png diff --git a/mods/skinsdb/textures/character_1162.png b/mods/skinsdb/textures/character.1162.png similarity index 100% rename from mods/skinsdb/textures/character_1162.png rename to mods/skinsdb/textures/character.1162.png diff --git a/mods/skinsdb/textures/character_1163.png b/mods/skinsdb/textures/character.1163.png similarity index 100% rename from mods/skinsdb/textures/character_1163.png rename to mods/skinsdb/textures/character.1163.png diff --git a/mods/skinsdb/textures/character_1164.png b/mods/skinsdb/textures/character.1164.png similarity index 100% rename from mods/skinsdb/textures/character_1164.png rename to mods/skinsdb/textures/character.1164.png diff --git a/mods/skinsdb/textures/character_1165.png b/mods/skinsdb/textures/character.1165.png similarity index 100% rename from mods/skinsdb/textures/character_1165.png rename to mods/skinsdb/textures/character.1165.png diff --git a/mods/skinsdb/textures/character_1166.png b/mods/skinsdb/textures/character.1166.png similarity index 100% rename from mods/skinsdb/textures/character_1166.png rename to mods/skinsdb/textures/character.1166.png diff --git a/mods/skinsdb/textures/character_1167.png b/mods/skinsdb/textures/character.1167.png similarity index 100% rename from mods/skinsdb/textures/character_1167.png rename to mods/skinsdb/textures/character.1167.png diff --git a/mods/skinsdb/textures/character_1168.png b/mods/skinsdb/textures/character.1168.png similarity index 100% rename from mods/skinsdb/textures/character_1168.png rename to mods/skinsdb/textures/character.1168.png diff --git a/mods/skinsdb/textures/character_1169.png b/mods/skinsdb/textures/character.1169.png similarity index 100% rename from mods/skinsdb/textures/character_1169.png rename to mods/skinsdb/textures/character.1169.png diff --git a/mods/skinsdb/textures/character_117.png b/mods/skinsdb/textures/character.117.png similarity index 100% rename from mods/skinsdb/textures/character_117.png rename to mods/skinsdb/textures/character.117.png diff --git a/mods/skinsdb/textures/character_1170.png b/mods/skinsdb/textures/character.1170.png similarity index 100% rename from mods/skinsdb/textures/character_1170.png rename to mods/skinsdb/textures/character.1170.png diff --git a/mods/skinsdb/textures/character_1171.png b/mods/skinsdb/textures/character.1171.png similarity index 100% rename from mods/skinsdb/textures/character_1171.png rename to mods/skinsdb/textures/character.1171.png diff --git a/mods/skinsdb/textures/character_1172.png b/mods/skinsdb/textures/character.1172.png similarity index 100% rename from mods/skinsdb/textures/character_1172.png rename to mods/skinsdb/textures/character.1172.png diff --git a/mods/skinsdb/textures/character_1173.png b/mods/skinsdb/textures/character.1173.png similarity index 100% rename from mods/skinsdb/textures/character_1173.png rename to mods/skinsdb/textures/character.1173.png diff --git a/mods/skinsdb/textures/character_1174.png b/mods/skinsdb/textures/character.1174.png similarity index 100% rename from mods/skinsdb/textures/character_1174.png rename to mods/skinsdb/textures/character.1174.png diff --git a/mods/skinsdb/textures/character_1175.png b/mods/skinsdb/textures/character.1175.png similarity index 100% rename from mods/skinsdb/textures/character_1175.png rename to mods/skinsdb/textures/character.1175.png diff --git a/mods/skinsdb/textures/character_1176.png b/mods/skinsdb/textures/character.1176.png similarity index 100% rename from mods/skinsdb/textures/character_1176.png rename to mods/skinsdb/textures/character.1176.png diff --git a/mods/skinsdb/textures/character_1177.png b/mods/skinsdb/textures/character.1177.png similarity index 100% rename from mods/skinsdb/textures/character_1177.png rename to mods/skinsdb/textures/character.1177.png diff --git a/mods/skinsdb/textures/character_1178.png b/mods/skinsdb/textures/character.1178.png similarity index 100% rename from mods/skinsdb/textures/character_1178.png rename to mods/skinsdb/textures/character.1178.png diff --git a/mods/skinsdb/textures/character_1179.png b/mods/skinsdb/textures/character.1179.png similarity index 100% rename from mods/skinsdb/textures/character_1179.png rename to mods/skinsdb/textures/character.1179.png diff --git a/mods/skinsdb/textures/character_118.png b/mods/skinsdb/textures/character.118.png similarity index 100% rename from mods/skinsdb/textures/character_118.png rename to mods/skinsdb/textures/character.118.png diff --git a/mods/skinsdb/textures/character_1180.png b/mods/skinsdb/textures/character.1180.png similarity index 100% rename from mods/skinsdb/textures/character_1180.png rename to mods/skinsdb/textures/character.1180.png diff --git a/mods/skinsdb/textures/character_1181.png b/mods/skinsdb/textures/character.1181.png similarity index 100% rename from mods/skinsdb/textures/character_1181.png rename to mods/skinsdb/textures/character.1181.png diff --git a/mods/skinsdb/textures/character_1182.png b/mods/skinsdb/textures/character.1182.png similarity index 100% rename from mods/skinsdb/textures/character_1182.png rename to mods/skinsdb/textures/character.1182.png diff --git a/mods/skinsdb/textures/character_1183.png b/mods/skinsdb/textures/character.1183.png similarity index 100% rename from mods/skinsdb/textures/character_1183.png rename to mods/skinsdb/textures/character.1183.png diff --git a/mods/skinsdb/textures/character_1184.png b/mods/skinsdb/textures/character.1184.png similarity index 100% rename from mods/skinsdb/textures/character_1184.png rename to mods/skinsdb/textures/character.1184.png diff --git a/mods/skinsdb/textures/character_1185.png b/mods/skinsdb/textures/character.1185.png similarity index 100% rename from mods/skinsdb/textures/character_1185.png rename to mods/skinsdb/textures/character.1185.png diff --git a/mods/skinsdb/textures/character_1186.png b/mods/skinsdb/textures/character.1186.png similarity index 100% rename from mods/skinsdb/textures/character_1186.png rename to mods/skinsdb/textures/character.1186.png diff --git a/mods/skinsdb/textures/character_1191.png b/mods/skinsdb/textures/character.1191.png similarity index 100% rename from mods/skinsdb/textures/character_1191.png rename to mods/skinsdb/textures/character.1191.png diff --git a/mods/skinsdb/textures/character_1192.png b/mods/skinsdb/textures/character.1192.png similarity index 100% rename from mods/skinsdb/textures/character_1192.png rename to mods/skinsdb/textures/character.1192.png diff --git a/mods/skinsdb/textures/character_1193.png b/mods/skinsdb/textures/character.1193.png similarity index 100% rename from mods/skinsdb/textures/character_1193.png rename to mods/skinsdb/textures/character.1193.png diff --git a/mods/skinsdb/textures/character_1194.png b/mods/skinsdb/textures/character.1194.png similarity index 100% rename from mods/skinsdb/textures/character_1194.png rename to mods/skinsdb/textures/character.1194.png diff --git a/mods/skinsdb/textures/character_1195.png b/mods/skinsdb/textures/character.1195.png similarity index 100% rename from mods/skinsdb/textures/character_1195.png rename to mods/skinsdb/textures/character.1195.png diff --git a/mods/skinsdb/textures/character_1196.png b/mods/skinsdb/textures/character.1196.png similarity index 100% rename from mods/skinsdb/textures/character_1196.png rename to mods/skinsdb/textures/character.1196.png diff --git a/mods/skinsdb/textures/character_1197.png b/mods/skinsdb/textures/character.1197.png similarity index 100% rename from mods/skinsdb/textures/character_1197.png rename to mods/skinsdb/textures/character.1197.png diff --git a/mods/skinsdb/textures/character_1198.png b/mods/skinsdb/textures/character.1198.png similarity index 100% rename from mods/skinsdb/textures/character_1198.png rename to mods/skinsdb/textures/character.1198.png diff --git a/mods/skinsdb/textures/character_1199.png b/mods/skinsdb/textures/character.1199.png similarity index 100% rename from mods/skinsdb/textures/character_1199.png rename to mods/skinsdb/textures/character.1199.png diff --git a/mods/skinsdb/textures/character_12.png b/mods/skinsdb/textures/character.12.png similarity index 100% rename from mods/skinsdb/textures/character_12.png rename to mods/skinsdb/textures/character.12.png diff --git a/mods/skinsdb/textures/character_1200.png b/mods/skinsdb/textures/character.1200.png similarity index 100% rename from mods/skinsdb/textures/character_1200.png rename to mods/skinsdb/textures/character.1200.png diff --git a/mods/skinsdb/textures/character_1201.png b/mods/skinsdb/textures/character.1201.png similarity index 100% rename from mods/skinsdb/textures/character_1201.png rename to mods/skinsdb/textures/character.1201.png diff --git a/mods/skinsdb/textures/character_1202.png b/mods/skinsdb/textures/character.1202.png similarity index 100% rename from mods/skinsdb/textures/character_1202.png rename to mods/skinsdb/textures/character.1202.png diff --git a/mods/skinsdb/textures/character_1203.png b/mods/skinsdb/textures/character.1203.png similarity index 100% rename from mods/skinsdb/textures/character_1203.png rename to mods/skinsdb/textures/character.1203.png diff --git a/mods/skinsdb/textures/character_1204.png b/mods/skinsdb/textures/character.1204.png similarity index 100% rename from mods/skinsdb/textures/character_1204.png rename to mods/skinsdb/textures/character.1204.png diff --git a/mods/skinsdb/textures/character_1205.png b/mods/skinsdb/textures/character.1205.png similarity index 100% rename from mods/skinsdb/textures/character_1205.png rename to mods/skinsdb/textures/character.1205.png diff --git a/mods/skinsdb/textures/character_1206.png b/mods/skinsdb/textures/character.1206.png similarity index 100% rename from mods/skinsdb/textures/character_1206.png rename to mods/skinsdb/textures/character.1206.png diff --git a/mods/skinsdb/textures/character_1207.png b/mods/skinsdb/textures/character.1207.png similarity index 100% rename from mods/skinsdb/textures/character_1207.png rename to mods/skinsdb/textures/character.1207.png diff --git a/mods/skinsdb/textures/character_1208.png b/mods/skinsdb/textures/character.1208.png similarity index 100% rename from mods/skinsdb/textures/character_1208.png rename to mods/skinsdb/textures/character.1208.png diff --git a/mods/skinsdb/textures/character_1209.png b/mods/skinsdb/textures/character.1209.png similarity index 100% rename from mods/skinsdb/textures/character_1209.png rename to mods/skinsdb/textures/character.1209.png diff --git a/mods/skinsdb/textures/character_121.png b/mods/skinsdb/textures/character.121.png similarity index 100% rename from mods/skinsdb/textures/character_121.png rename to mods/skinsdb/textures/character.121.png diff --git a/mods/skinsdb/textures/character_1210.png b/mods/skinsdb/textures/character.1210.png similarity index 100% rename from mods/skinsdb/textures/character_1210.png rename to mods/skinsdb/textures/character.1210.png diff --git a/mods/skinsdb/textures/character_1211.png b/mods/skinsdb/textures/character.1211.png similarity index 100% rename from mods/skinsdb/textures/character_1211.png rename to mods/skinsdb/textures/character.1211.png diff --git a/mods/skinsdb/textures/character_1212.png b/mods/skinsdb/textures/character.1212.png similarity index 100% rename from mods/skinsdb/textures/character_1212.png rename to mods/skinsdb/textures/character.1212.png diff --git a/mods/skinsdb/textures/character_1213.png b/mods/skinsdb/textures/character.1213.png similarity index 100% rename from mods/skinsdb/textures/character_1213.png rename to mods/skinsdb/textures/character.1213.png diff --git a/mods/skinsdb/textures/character_1214.png b/mods/skinsdb/textures/character.1214.png similarity index 100% rename from mods/skinsdb/textures/character_1214.png rename to mods/skinsdb/textures/character.1214.png diff --git a/mods/skinsdb/textures/character_1215.png b/mods/skinsdb/textures/character.1215.png similarity index 100% rename from mods/skinsdb/textures/character_1215.png rename to mods/skinsdb/textures/character.1215.png diff --git a/mods/skinsdb/textures/character_1216.png b/mods/skinsdb/textures/character.1216.png similarity index 100% rename from mods/skinsdb/textures/character_1216.png rename to mods/skinsdb/textures/character.1216.png diff --git a/mods/skinsdb/textures/character_1217.png b/mods/skinsdb/textures/character.1217.png similarity index 100% rename from mods/skinsdb/textures/character_1217.png rename to mods/skinsdb/textures/character.1217.png diff --git a/mods/skinsdb/textures/character_1218.png b/mods/skinsdb/textures/character.1218.png similarity index 100% rename from mods/skinsdb/textures/character_1218.png rename to mods/skinsdb/textures/character.1218.png diff --git a/mods/skinsdb/textures/character_1219.png b/mods/skinsdb/textures/character.1219.png similarity index 100% rename from mods/skinsdb/textures/character_1219.png rename to mods/skinsdb/textures/character.1219.png diff --git a/mods/skinsdb/textures/character_1220.png b/mods/skinsdb/textures/character.1220.png similarity index 100% rename from mods/skinsdb/textures/character_1220.png rename to mods/skinsdb/textures/character.1220.png diff --git a/mods/skinsdb/textures/character_1221.png b/mods/skinsdb/textures/character.1221.png similarity index 100% rename from mods/skinsdb/textures/character_1221.png rename to mods/skinsdb/textures/character.1221.png diff --git a/mods/skinsdb/textures/character_1222.png b/mods/skinsdb/textures/character.1222.png similarity index 100% rename from mods/skinsdb/textures/character_1222.png rename to mods/skinsdb/textures/character.1222.png diff --git a/mods/skinsdb/textures/character_1223.png b/mods/skinsdb/textures/character.1223.png similarity index 100% rename from mods/skinsdb/textures/character_1223.png rename to mods/skinsdb/textures/character.1223.png diff --git a/mods/skinsdb/textures/character_1224.png b/mods/skinsdb/textures/character.1224.png similarity index 100% rename from mods/skinsdb/textures/character_1224.png rename to mods/skinsdb/textures/character.1224.png diff --git a/mods/skinsdb/textures/character_1225.png b/mods/skinsdb/textures/character.1225.png similarity index 100% rename from mods/skinsdb/textures/character_1225.png rename to mods/skinsdb/textures/character.1225.png diff --git a/mods/skinsdb/textures/character_1226.png b/mods/skinsdb/textures/character.1226.png similarity index 100% rename from mods/skinsdb/textures/character_1226.png rename to mods/skinsdb/textures/character.1226.png diff --git a/mods/skinsdb/textures/character_1227.png b/mods/skinsdb/textures/character.1227.png similarity index 100% rename from mods/skinsdb/textures/character_1227.png rename to mods/skinsdb/textures/character.1227.png diff --git a/mods/skinsdb/textures/character_1228.png b/mods/skinsdb/textures/character.1228.png similarity index 100% rename from mods/skinsdb/textures/character_1228.png rename to mods/skinsdb/textures/character.1228.png diff --git a/mods/skinsdb/textures/character_1229.png b/mods/skinsdb/textures/character.1229.png similarity index 100% rename from mods/skinsdb/textures/character_1229.png rename to mods/skinsdb/textures/character.1229.png diff --git a/mods/skinsdb/textures/character_1230.png b/mods/skinsdb/textures/character.1230.png similarity index 100% rename from mods/skinsdb/textures/character_1230.png rename to mods/skinsdb/textures/character.1230.png diff --git a/mods/skinsdb/textures/character_1231.png b/mods/skinsdb/textures/character.1231.png similarity index 100% rename from mods/skinsdb/textures/character_1231.png rename to mods/skinsdb/textures/character.1231.png diff --git a/mods/skinsdb/textures/character_1232.png b/mods/skinsdb/textures/character.1232.png similarity index 100% rename from mods/skinsdb/textures/character_1232.png rename to mods/skinsdb/textures/character.1232.png diff --git a/mods/skinsdb/textures/character_1233.png b/mods/skinsdb/textures/character.1233.png similarity index 100% rename from mods/skinsdb/textures/character_1233.png rename to mods/skinsdb/textures/character.1233.png diff --git a/mods/skinsdb/textures/character_1234.png b/mods/skinsdb/textures/character.1234.png similarity index 100% rename from mods/skinsdb/textures/character_1234.png rename to mods/skinsdb/textures/character.1234.png diff --git a/mods/skinsdb/textures/character_1235.png b/mods/skinsdb/textures/character.1235.png similarity index 100% rename from mods/skinsdb/textures/character_1235.png rename to mods/skinsdb/textures/character.1235.png diff --git a/mods/skinsdb/textures/character_1236.png b/mods/skinsdb/textures/character.1236.png similarity index 100% rename from mods/skinsdb/textures/character_1236.png rename to mods/skinsdb/textures/character.1236.png diff --git a/mods/skinsdb/textures/character_1237.png b/mods/skinsdb/textures/character.1237.png similarity index 100% rename from mods/skinsdb/textures/character_1237.png rename to mods/skinsdb/textures/character.1237.png diff --git a/mods/skinsdb/textures/character_1238.png b/mods/skinsdb/textures/character.1238.png similarity index 100% rename from mods/skinsdb/textures/character_1238.png rename to mods/skinsdb/textures/character.1238.png diff --git a/mods/skinsdb/textures/character_1239.png b/mods/skinsdb/textures/character.1239.png similarity index 100% rename from mods/skinsdb/textures/character_1239.png rename to mods/skinsdb/textures/character.1239.png diff --git a/mods/skinsdb/textures/character_124.png b/mods/skinsdb/textures/character.124.png similarity index 100% rename from mods/skinsdb/textures/character_124.png rename to mods/skinsdb/textures/character.124.png diff --git a/mods/skinsdb/textures/character_1240.png b/mods/skinsdb/textures/character.1240.png similarity index 100% rename from mods/skinsdb/textures/character_1240.png rename to mods/skinsdb/textures/character.1240.png diff --git a/mods/skinsdb/textures/character_1241.png b/mods/skinsdb/textures/character.1241.png similarity index 100% rename from mods/skinsdb/textures/character_1241.png rename to mods/skinsdb/textures/character.1241.png diff --git a/mods/skinsdb/textures/character_1242.png b/mods/skinsdb/textures/character.1242.png similarity index 100% rename from mods/skinsdb/textures/character_1242.png rename to mods/skinsdb/textures/character.1242.png diff --git a/mods/skinsdb/textures/character_1243.png b/mods/skinsdb/textures/character.1243.png similarity index 100% rename from mods/skinsdb/textures/character_1243.png rename to mods/skinsdb/textures/character.1243.png diff --git a/mods/skinsdb/textures/character_1244.png b/mods/skinsdb/textures/character.1244.png similarity index 100% rename from mods/skinsdb/textures/character_1244.png rename to mods/skinsdb/textures/character.1244.png diff --git a/mods/skinsdb/textures/character_1245.png b/mods/skinsdb/textures/character.1245.png similarity index 100% rename from mods/skinsdb/textures/character_1245.png rename to mods/skinsdb/textures/character.1245.png diff --git a/mods/skinsdb/textures/character_1246.png b/mods/skinsdb/textures/character.1246.png similarity index 100% rename from mods/skinsdb/textures/character_1246.png rename to mods/skinsdb/textures/character.1246.png diff --git a/mods/skinsdb/textures/character_1247.png b/mods/skinsdb/textures/character.1247.png similarity index 100% rename from mods/skinsdb/textures/character_1247.png rename to mods/skinsdb/textures/character.1247.png diff --git a/mods/skinsdb/textures/character_1248.png b/mods/skinsdb/textures/character.1248.png similarity index 100% rename from mods/skinsdb/textures/character_1248.png rename to mods/skinsdb/textures/character.1248.png diff --git a/mods/skinsdb/textures/character_1249.png b/mods/skinsdb/textures/character.1249.png similarity index 100% rename from mods/skinsdb/textures/character_1249.png rename to mods/skinsdb/textures/character.1249.png diff --git a/mods/skinsdb/textures/character_1250.png b/mods/skinsdb/textures/character.1250.png similarity index 100% rename from mods/skinsdb/textures/character_1250.png rename to mods/skinsdb/textures/character.1250.png diff --git a/mods/skinsdb/textures/character_1251.png b/mods/skinsdb/textures/character.1251.png similarity index 100% rename from mods/skinsdb/textures/character_1251.png rename to mods/skinsdb/textures/character.1251.png diff --git a/mods/skinsdb/textures/character_1252.png b/mods/skinsdb/textures/character.1252.png similarity index 100% rename from mods/skinsdb/textures/character_1252.png rename to mods/skinsdb/textures/character.1252.png diff --git a/mods/skinsdb/textures/character_1253.png b/mods/skinsdb/textures/character.1253.png similarity index 100% rename from mods/skinsdb/textures/character_1253.png rename to mods/skinsdb/textures/character.1253.png diff --git a/mods/skinsdb/textures/character_1254.png b/mods/skinsdb/textures/character.1254.png similarity index 100% rename from mods/skinsdb/textures/character_1254.png rename to mods/skinsdb/textures/character.1254.png diff --git a/mods/skinsdb/textures/character_1255.png b/mods/skinsdb/textures/character.1255.png similarity index 100% rename from mods/skinsdb/textures/character_1255.png rename to mods/skinsdb/textures/character.1255.png diff --git a/mods/skinsdb/textures/character_1256.png b/mods/skinsdb/textures/character.1256.png similarity index 100% rename from mods/skinsdb/textures/character_1256.png rename to mods/skinsdb/textures/character.1256.png diff --git a/mods/skinsdb/textures/character_1257.png b/mods/skinsdb/textures/character.1257.png similarity index 100% rename from mods/skinsdb/textures/character_1257.png rename to mods/skinsdb/textures/character.1257.png diff --git a/mods/skinsdb/textures/character_1258.png b/mods/skinsdb/textures/character.1258.png similarity index 100% rename from mods/skinsdb/textures/character_1258.png rename to mods/skinsdb/textures/character.1258.png diff --git a/mods/skinsdb/textures/character_1259.png b/mods/skinsdb/textures/character.1259.png similarity index 100% rename from mods/skinsdb/textures/character_1259.png rename to mods/skinsdb/textures/character.1259.png diff --git a/mods/skinsdb/textures/character_126.png b/mods/skinsdb/textures/character.126.png similarity index 100% rename from mods/skinsdb/textures/character_126.png rename to mods/skinsdb/textures/character.126.png diff --git a/mods/skinsdb/textures/character_1260.png b/mods/skinsdb/textures/character.1260.png similarity index 100% rename from mods/skinsdb/textures/character_1260.png rename to mods/skinsdb/textures/character.1260.png diff --git a/mods/skinsdb/textures/character_1261.png b/mods/skinsdb/textures/character.1261.png similarity index 100% rename from mods/skinsdb/textures/character_1261.png rename to mods/skinsdb/textures/character.1261.png diff --git a/mods/skinsdb/textures/character_1262.png b/mods/skinsdb/textures/character.1262.png similarity index 100% rename from mods/skinsdb/textures/character_1262.png rename to mods/skinsdb/textures/character.1262.png diff --git a/mods/skinsdb/textures/character_1263.png b/mods/skinsdb/textures/character.1263.png similarity index 100% rename from mods/skinsdb/textures/character_1263.png rename to mods/skinsdb/textures/character.1263.png diff --git a/mods/skinsdb/textures/character_1264.png b/mods/skinsdb/textures/character.1264.png similarity index 100% rename from mods/skinsdb/textures/character_1264.png rename to mods/skinsdb/textures/character.1264.png diff --git a/mods/skinsdb/textures/character_1265.png b/mods/skinsdb/textures/character.1265.png similarity index 100% rename from mods/skinsdb/textures/character_1265.png rename to mods/skinsdb/textures/character.1265.png diff --git a/mods/skinsdb/textures/character_1266.png b/mods/skinsdb/textures/character.1266.png similarity index 100% rename from mods/skinsdb/textures/character_1266.png rename to mods/skinsdb/textures/character.1266.png diff --git a/mods/skinsdb/textures/character_1267.png b/mods/skinsdb/textures/character.1267.png similarity index 100% rename from mods/skinsdb/textures/character_1267.png rename to mods/skinsdb/textures/character.1267.png diff --git a/mods/skinsdb/textures/character_1268.png b/mods/skinsdb/textures/character.1268.png similarity index 100% rename from mods/skinsdb/textures/character_1268.png rename to mods/skinsdb/textures/character.1268.png diff --git a/mods/skinsdb/textures/character_1269.png b/mods/skinsdb/textures/character.1269.png similarity index 100% rename from mods/skinsdb/textures/character_1269.png rename to mods/skinsdb/textures/character.1269.png diff --git a/mods/skinsdb/textures/character_1270.png b/mods/skinsdb/textures/character.1270.png similarity index 100% rename from mods/skinsdb/textures/character_1270.png rename to mods/skinsdb/textures/character.1270.png diff --git a/mods/skinsdb/textures/character_1271.png b/mods/skinsdb/textures/character.1271.png similarity index 100% rename from mods/skinsdb/textures/character_1271.png rename to mods/skinsdb/textures/character.1271.png diff --git a/mods/skinsdb/textures/character_1272.png b/mods/skinsdb/textures/character.1272.png similarity index 100% rename from mods/skinsdb/textures/character_1272.png rename to mods/skinsdb/textures/character.1272.png diff --git a/mods/skinsdb/textures/character_1273.png b/mods/skinsdb/textures/character.1273.png similarity index 100% rename from mods/skinsdb/textures/character_1273.png rename to mods/skinsdb/textures/character.1273.png diff --git a/mods/skinsdb/textures/character_1274.png b/mods/skinsdb/textures/character.1274.png similarity index 100% rename from mods/skinsdb/textures/character_1274.png rename to mods/skinsdb/textures/character.1274.png diff --git a/mods/skinsdb/textures/character_1275.png b/mods/skinsdb/textures/character.1275.png similarity index 100% rename from mods/skinsdb/textures/character_1275.png rename to mods/skinsdb/textures/character.1275.png diff --git a/mods/skinsdb/textures/character_1276.png b/mods/skinsdb/textures/character.1276.png similarity index 100% rename from mods/skinsdb/textures/character_1276.png rename to mods/skinsdb/textures/character.1276.png diff --git a/mods/skinsdb/textures/character_1277.png b/mods/skinsdb/textures/character.1277.png similarity index 100% rename from mods/skinsdb/textures/character_1277.png rename to mods/skinsdb/textures/character.1277.png diff --git a/mods/skinsdb/textures/character_1278.png b/mods/skinsdb/textures/character.1278.png similarity index 100% rename from mods/skinsdb/textures/character_1278.png rename to mods/skinsdb/textures/character.1278.png diff --git a/mods/skinsdb/textures/character_1279.png b/mods/skinsdb/textures/character.1279.png similarity index 100% rename from mods/skinsdb/textures/character_1279.png rename to mods/skinsdb/textures/character.1279.png diff --git a/mods/skinsdb/textures/character_128.png b/mods/skinsdb/textures/character.128.png similarity index 100% rename from mods/skinsdb/textures/character_128.png rename to mods/skinsdb/textures/character.128.png diff --git a/mods/skinsdb/textures/character_1280.png b/mods/skinsdb/textures/character.1280.png similarity index 100% rename from mods/skinsdb/textures/character_1280.png rename to mods/skinsdb/textures/character.1280.png diff --git a/mods/skinsdb/textures/character_1281.png b/mods/skinsdb/textures/character.1281.png similarity index 100% rename from mods/skinsdb/textures/character_1281.png rename to mods/skinsdb/textures/character.1281.png diff --git a/mods/skinsdb/textures/character_1282.png b/mods/skinsdb/textures/character.1282.png similarity index 100% rename from mods/skinsdb/textures/character_1282.png rename to mods/skinsdb/textures/character.1282.png diff --git a/mods/skinsdb/textures/character_1283.png b/mods/skinsdb/textures/character.1283.png similarity index 100% rename from mods/skinsdb/textures/character_1283.png rename to mods/skinsdb/textures/character.1283.png diff --git a/mods/skinsdb/textures/character_1284.png b/mods/skinsdb/textures/character.1284.png similarity index 100% rename from mods/skinsdb/textures/character_1284.png rename to mods/skinsdb/textures/character.1284.png diff --git a/mods/skinsdb/textures/character_1285.png b/mods/skinsdb/textures/character.1285.png similarity index 100% rename from mods/skinsdb/textures/character_1285.png rename to mods/skinsdb/textures/character.1285.png diff --git a/mods/skinsdb/textures/character_1286.png b/mods/skinsdb/textures/character.1286.png similarity index 100% rename from mods/skinsdb/textures/character_1286.png rename to mods/skinsdb/textures/character.1286.png diff --git a/mods/skinsdb/textures/character_1287.png b/mods/skinsdb/textures/character.1287.png similarity index 100% rename from mods/skinsdb/textures/character_1287.png rename to mods/skinsdb/textures/character.1287.png diff --git a/mods/skinsdb/textures/character_1288.png b/mods/skinsdb/textures/character.1288.png similarity index 100% rename from mods/skinsdb/textures/character_1288.png rename to mods/skinsdb/textures/character.1288.png diff --git a/mods/skinsdb/textures/character_1289.png b/mods/skinsdb/textures/character.1289.png similarity index 100% rename from mods/skinsdb/textures/character_1289.png rename to mods/skinsdb/textures/character.1289.png diff --git a/mods/skinsdb/textures/character_129.png b/mods/skinsdb/textures/character.129.png similarity index 100% rename from mods/skinsdb/textures/character_129.png rename to mods/skinsdb/textures/character.129.png diff --git a/mods/skinsdb/textures/character_1290.png b/mods/skinsdb/textures/character.1290.png similarity index 100% rename from mods/skinsdb/textures/character_1290.png rename to mods/skinsdb/textures/character.1290.png diff --git a/mods/skinsdb/textures/character_1291.png b/mods/skinsdb/textures/character.1291.png similarity index 100% rename from mods/skinsdb/textures/character_1291.png rename to mods/skinsdb/textures/character.1291.png diff --git a/mods/skinsdb/textures/character_1292.png b/mods/skinsdb/textures/character.1292.png similarity index 100% rename from mods/skinsdb/textures/character_1292.png rename to mods/skinsdb/textures/character.1292.png diff --git a/mods/skinsdb/textures/character_1293.png b/mods/skinsdb/textures/character.1293.png similarity index 100% rename from mods/skinsdb/textures/character_1293.png rename to mods/skinsdb/textures/character.1293.png diff --git a/mods/skinsdb/textures/character_1294.png b/mods/skinsdb/textures/character.1294.png similarity index 100% rename from mods/skinsdb/textures/character_1294.png rename to mods/skinsdb/textures/character.1294.png diff --git a/mods/skinsdb/textures/character_1295.png b/mods/skinsdb/textures/character.1295.png similarity index 100% rename from mods/skinsdb/textures/character_1295.png rename to mods/skinsdb/textures/character.1295.png diff --git a/mods/skinsdb/textures/character_1296.png b/mods/skinsdb/textures/character.1296.png similarity index 100% rename from mods/skinsdb/textures/character_1296.png rename to mods/skinsdb/textures/character.1296.png diff --git a/mods/skinsdb/textures/character_1297.png b/mods/skinsdb/textures/character.1297.png similarity index 100% rename from mods/skinsdb/textures/character_1297.png rename to mods/skinsdb/textures/character.1297.png diff --git a/mods/skinsdb/textures/character_1298.png b/mods/skinsdb/textures/character.1298.png similarity index 100% rename from mods/skinsdb/textures/character_1298.png rename to mods/skinsdb/textures/character.1298.png diff --git a/mods/skinsdb/textures/character_1299.png b/mods/skinsdb/textures/character.1299.png similarity index 100% rename from mods/skinsdb/textures/character_1299.png rename to mods/skinsdb/textures/character.1299.png diff --git a/mods/skinsdb/textures/character_1300.png b/mods/skinsdb/textures/character.1300.png similarity index 100% rename from mods/skinsdb/textures/character_1300.png rename to mods/skinsdb/textures/character.1300.png diff --git a/mods/skinsdb/textures/character_1301.png b/mods/skinsdb/textures/character.1301.png similarity index 100% rename from mods/skinsdb/textures/character_1301.png rename to mods/skinsdb/textures/character.1301.png diff --git a/mods/skinsdb/textures/character_1302.png b/mods/skinsdb/textures/character.1302.png similarity index 100% rename from mods/skinsdb/textures/character_1302.png rename to mods/skinsdb/textures/character.1302.png diff --git a/mods/skinsdb/textures/character_1303.png b/mods/skinsdb/textures/character.1303.png similarity index 100% rename from mods/skinsdb/textures/character_1303.png rename to mods/skinsdb/textures/character.1303.png diff --git a/mods/skinsdb/textures/character_1304.png b/mods/skinsdb/textures/character.1304.png similarity index 100% rename from mods/skinsdb/textures/character_1304.png rename to mods/skinsdb/textures/character.1304.png diff --git a/mods/skinsdb/textures/character_1305.png b/mods/skinsdb/textures/character.1305.png similarity index 100% rename from mods/skinsdb/textures/character_1305.png rename to mods/skinsdb/textures/character.1305.png diff --git a/mods/skinsdb/textures/character_1306.png b/mods/skinsdb/textures/character.1306.png similarity index 100% rename from mods/skinsdb/textures/character_1306.png rename to mods/skinsdb/textures/character.1306.png diff --git a/mods/skinsdb/textures/character_1307.png b/mods/skinsdb/textures/character.1307.png similarity index 100% rename from mods/skinsdb/textures/character_1307.png rename to mods/skinsdb/textures/character.1307.png diff --git a/mods/skinsdb/textures/character_1308.png b/mods/skinsdb/textures/character.1308.png similarity index 100% rename from mods/skinsdb/textures/character_1308.png rename to mods/skinsdb/textures/character.1308.png diff --git a/mods/skinsdb/textures/character_1309.png b/mods/skinsdb/textures/character.1309.png similarity index 100% rename from mods/skinsdb/textures/character_1309.png rename to mods/skinsdb/textures/character.1309.png diff --git a/mods/skinsdb/textures/character_1310.png b/mods/skinsdb/textures/character.1310.png similarity index 100% rename from mods/skinsdb/textures/character_1310.png rename to mods/skinsdb/textures/character.1310.png diff --git a/mods/skinsdb/textures/character_1311.png b/mods/skinsdb/textures/character.1311.png similarity index 100% rename from mods/skinsdb/textures/character_1311.png rename to mods/skinsdb/textures/character.1311.png diff --git a/mods/skinsdb/textures/character_1312.png b/mods/skinsdb/textures/character.1312.png similarity index 100% rename from mods/skinsdb/textures/character_1312.png rename to mods/skinsdb/textures/character.1312.png diff --git a/mods/skinsdb/textures/character_1313.png b/mods/skinsdb/textures/character.1313.png similarity index 100% rename from mods/skinsdb/textures/character_1313.png rename to mods/skinsdb/textures/character.1313.png diff --git a/mods/skinsdb/textures/character_1314.png b/mods/skinsdb/textures/character.1314.png similarity index 100% rename from mods/skinsdb/textures/character_1314.png rename to mods/skinsdb/textures/character.1314.png diff --git a/mods/skinsdb/textures/character_1315.png b/mods/skinsdb/textures/character.1315.png similarity index 100% rename from mods/skinsdb/textures/character_1315.png rename to mods/skinsdb/textures/character.1315.png diff --git a/mods/skinsdb/textures/character_1316.png b/mods/skinsdb/textures/character.1316.png similarity index 100% rename from mods/skinsdb/textures/character_1316.png rename to mods/skinsdb/textures/character.1316.png diff --git a/mods/skinsdb/textures/character_1317.png b/mods/skinsdb/textures/character.1317.png similarity index 100% rename from mods/skinsdb/textures/character_1317.png rename to mods/skinsdb/textures/character.1317.png diff --git a/mods/skinsdb/textures/character_1318.png b/mods/skinsdb/textures/character.1318.png similarity index 100% rename from mods/skinsdb/textures/character_1318.png rename to mods/skinsdb/textures/character.1318.png diff --git a/mods/skinsdb/textures/character_1319.png b/mods/skinsdb/textures/character.1319.png similarity index 100% rename from mods/skinsdb/textures/character_1319.png rename to mods/skinsdb/textures/character.1319.png diff --git a/mods/skinsdb/textures/character_1320.png b/mods/skinsdb/textures/character.1320.png similarity index 100% rename from mods/skinsdb/textures/character_1320.png rename to mods/skinsdb/textures/character.1320.png diff --git a/mods/skinsdb/textures/character_1321.png b/mods/skinsdb/textures/character.1321.png similarity index 100% rename from mods/skinsdb/textures/character_1321.png rename to mods/skinsdb/textures/character.1321.png diff --git a/mods/skinsdb/textures/character_1322.png b/mods/skinsdb/textures/character.1322.png similarity index 100% rename from mods/skinsdb/textures/character_1322.png rename to mods/skinsdb/textures/character.1322.png diff --git a/mods/skinsdb/textures/character_1323.png b/mods/skinsdb/textures/character.1323.png similarity index 100% rename from mods/skinsdb/textures/character_1323.png rename to mods/skinsdb/textures/character.1323.png diff --git a/mods/skinsdb/textures/character_1324.png b/mods/skinsdb/textures/character.1324.png similarity index 100% rename from mods/skinsdb/textures/character_1324.png rename to mods/skinsdb/textures/character.1324.png diff --git a/mods/skinsdb/textures/character_1325.png b/mods/skinsdb/textures/character.1325.png similarity index 100% rename from mods/skinsdb/textures/character_1325.png rename to mods/skinsdb/textures/character.1325.png diff --git a/mods/skinsdb/textures/character_1326.png b/mods/skinsdb/textures/character.1326.png similarity index 100% rename from mods/skinsdb/textures/character_1326.png rename to mods/skinsdb/textures/character.1326.png diff --git a/mods/skinsdb/textures/character_1327.png b/mods/skinsdb/textures/character.1327.png similarity index 100% rename from mods/skinsdb/textures/character_1327.png rename to mods/skinsdb/textures/character.1327.png diff --git a/mods/skinsdb/textures/character_1328.png b/mods/skinsdb/textures/character.1328.png similarity index 100% rename from mods/skinsdb/textures/character_1328.png rename to mods/skinsdb/textures/character.1328.png diff --git a/mods/skinsdb/textures/character_1329.png b/mods/skinsdb/textures/character.1329.png similarity index 100% rename from mods/skinsdb/textures/character_1329.png rename to mods/skinsdb/textures/character.1329.png diff --git a/mods/skinsdb/textures/character_1330.png b/mods/skinsdb/textures/character.1330.png similarity index 100% rename from mods/skinsdb/textures/character_1330.png rename to mods/skinsdb/textures/character.1330.png diff --git a/mods/skinsdb/textures/character_1331.png b/mods/skinsdb/textures/character.1331.png similarity index 100% rename from mods/skinsdb/textures/character_1331.png rename to mods/skinsdb/textures/character.1331.png diff --git a/mods/skinsdb/textures/character_1332.png b/mods/skinsdb/textures/character.1332.png similarity index 100% rename from mods/skinsdb/textures/character_1332.png rename to mods/skinsdb/textures/character.1332.png diff --git a/mods/skinsdb/textures/character_1333.png b/mods/skinsdb/textures/character.1333.png similarity index 100% rename from mods/skinsdb/textures/character_1333.png rename to mods/skinsdb/textures/character.1333.png diff --git a/mods/skinsdb/textures/character_1334.png b/mods/skinsdb/textures/character.1334.png similarity index 100% rename from mods/skinsdb/textures/character_1334.png rename to mods/skinsdb/textures/character.1334.png diff --git a/mods/skinsdb/textures/character_1335.png b/mods/skinsdb/textures/character.1335.png similarity index 100% rename from mods/skinsdb/textures/character_1335.png rename to mods/skinsdb/textures/character.1335.png diff --git a/mods/skinsdb/textures/character_1336.png b/mods/skinsdb/textures/character.1336.png similarity index 100% rename from mods/skinsdb/textures/character_1336.png rename to mods/skinsdb/textures/character.1336.png diff --git a/mods/skinsdb/textures/character_1337.png b/mods/skinsdb/textures/character.1337.png similarity index 100% rename from mods/skinsdb/textures/character_1337.png rename to mods/skinsdb/textures/character.1337.png diff --git a/mods/skinsdb/textures/character_1338.png b/mods/skinsdb/textures/character.1338.png similarity index 100% rename from mods/skinsdb/textures/character_1338.png rename to mods/skinsdb/textures/character.1338.png diff --git a/mods/skinsdb/textures/character_134.png b/mods/skinsdb/textures/character.134.png similarity index 100% rename from mods/skinsdb/textures/character_134.png rename to mods/skinsdb/textures/character.134.png diff --git a/mods/skinsdb/textures/character_1340.png b/mods/skinsdb/textures/character.1340.png similarity index 100% rename from mods/skinsdb/textures/character_1340.png rename to mods/skinsdb/textures/character.1340.png diff --git a/mods/skinsdb/textures/character_1341.png b/mods/skinsdb/textures/character.1341.png similarity index 100% rename from mods/skinsdb/textures/character_1341.png rename to mods/skinsdb/textures/character.1341.png diff --git a/mods/skinsdb/textures/character_1342.png b/mods/skinsdb/textures/character.1342.png similarity index 100% rename from mods/skinsdb/textures/character_1342.png rename to mods/skinsdb/textures/character.1342.png diff --git a/mods/skinsdb/textures/character_1343.png b/mods/skinsdb/textures/character.1343.png similarity index 100% rename from mods/skinsdb/textures/character_1343.png rename to mods/skinsdb/textures/character.1343.png diff --git a/mods/skinsdb/textures/character_1344.png b/mods/skinsdb/textures/character.1344.png similarity index 100% rename from mods/skinsdb/textures/character_1344.png rename to mods/skinsdb/textures/character.1344.png diff --git a/mods/skinsdb/textures/character_1345.png b/mods/skinsdb/textures/character.1345.png similarity index 100% rename from mods/skinsdb/textures/character_1345.png rename to mods/skinsdb/textures/character.1345.png diff --git a/mods/skinsdb/textures/character_1346.png b/mods/skinsdb/textures/character.1346.png similarity index 100% rename from mods/skinsdb/textures/character_1346.png rename to mods/skinsdb/textures/character.1346.png diff --git a/mods/skinsdb/textures/character_1347.png b/mods/skinsdb/textures/character.1347.png similarity index 100% rename from mods/skinsdb/textures/character_1347.png rename to mods/skinsdb/textures/character.1347.png diff --git a/mods/skinsdb/textures/character_1348.png b/mods/skinsdb/textures/character.1348.png similarity index 100% rename from mods/skinsdb/textures/character_1348.png rename to mods/skinsdb/textures/character.1348.png diff --git a/mods/skinsdb/textures/character_1349.png b/mods/skinsdb/textures/character.1349.png similarity index 100% rename from mods/skinsdb/textures/character_1349.png rename to mods/skinsdb/textures/character.1349.png diff --git a/mods/skinsdb/textures/character_135.png b/mods/skinsdb/textures/character.135.png similarity index 100% rename from mods/skinsdb/textures/character_135.png rename to mods/skinsdb/textures/character.135.png diff --git a/mods/skinsdb/textures/character_1350.png b/mods/skinsdb/textures/character.1350.png similarity index 100% rename from mods/skinsdb/textures/character_1350.png rename to mods/skinsdb/textures/character.1350.png diff --git a/mods/skinsdb/textures/character_1351.png b/mods/skinsdb/textures/character.1351.png similarity index 100% rename from mods/skinsdb/textures/character_1351.png rename to mods/skinsdb/textures/character.1351.png diff --git a/mods/skinsdb/textures/character_1352.png b/mods/skinsdb/textures/character.1352.png similarity index 100% rename from mods/skinsdb/textures/character_1352.png rename to mods/skinsdb/textures/character.1352.png diff --git a/mods/skinsdb/textures/character_1353.png b/mods/skinsdb/textures/character.1353.png similarity index 100% rename from mods/skinsdb/textures/character_1353.png rename to mods/skinsdb/textures/character.1353.png diff --git a/mods/skinsdb/textures/character_1354.png b/mods/skinsdb/textures/character.1354.png similarity index 100% rename from mods/skinsdb/textures/character_1354.png rename to mods/skinsdb/textures/character.1354.png diff --git a/mods/skinsdb/textures/character_1355.png b/mods/skinsdb/textures/character.1355.png similarity index 100% rename from mods/skinsdb/textures/character_1355.png rename to mods/skinsdb/textures/character.1355.png diff --git a/mods/skinsdb/textures/character_1356.png b/mods/skinsdb/textures/character.1356.png similarity index 100% rename from mods/skinsdb/textures/character_1356.png rename to mods/skinsdb/textures/character.1356.png diff --git a/mods/skinsdb/textures/character_1357.png b/mods/skinsdb/textures/character.1357.png similarity index 100% rename from mods/skinsdb/textures/character_1357.png rename to mods/skinsdb/textures/character.1357.png diff --git a/mods/skinsdb/textures/character_1358.png b/mods/skinsdb/textures/character.1358.png similarity index 100% rename from mods/skinsdb/textures/character_1358.png rename to mods/skinsdb/textures/character.1358.png diff --git a/mods/skinsdb/textures/character_1359.png b/mods/skinsdb/textures/character.1359.png similarity index 100% rename from mods/skinsdb/textures/character_1359.png rename to mods/skinsdb/textures/character.1359.png diff --git a/mods/skinsdb/textures/character_136.png b/mods/skinsdb/textures/character.136.png similarity index 100% rename from mods/skinsdb/textures/character_136.png rename to mods/skinsdb/textures/character.136.png diff --git a/mods/skinsdb/textures/character_1360.png b/mods/skinsdb/textures/character.1360.png similarity index 100% rename from mods/skinsdb/textures/character_1360.png rename to mods/skinsdb/textures/character.1360.png diff --git a/mods/skinsdb/textures/character_1361.png b/mods/skinsdb/textures/character.1361.png similarity index 100% rename from mods/skinsdb/textures/character_1361.png rename to mods/skinsdb/textures/character.1361.png diff --git a/mods/skinsdb/textures/character_1362.png b/mods/skinsdb/textures/character.1362.png similarity index 100% rename from mods/skinsdb/textures/character_1362.png rename to mods/skinsdb/textures/character.1362.png diff --git a/mods/skinsdb/textures/character_1363.png b/mods/skinsdb/textures/character.1363.png similarity index 100% rename from mods/skinsdb/textures/character_1363.png rename to mods/skinsdb/textures/character.1363.png diff --git a/mods/skinsdb/textures/character_1364.png b/mods/skinsdb/textures/character.1364.png similarity index 100% rename from mods/skinsdb/textures/character_1364.png rename to mods/skinsdb/textures/character.1364.png diff --git a/mods/skinsdb/textures/character_1365.png b/mods/skinsdb/textures/character.1365.png similarity index 100% rename from mods/skinsdb/textures/character_1365.png rename to mods/skinsdb/textures/character.1365.png diff --git a/mods/skinsdb/textures/character_1366.png b/mods/skinsdb/textures/character.1366.png similarity index 100% rename from mods/skinsdb/textures/character_1366.png rename to mods/skinsdb/textures/character.1366.png diff --git a/mods/skinsdb/textures/character_1367.png b/mods/skinsdb/textures/character.1367.png similarity index 100% rename from mods/skinsdb/textures/character_1367.png rename to mods/skinsdb/textures/character.1367.png diff --git a/mods/skinsdb/textures/character_1368.png b/mods/skinsdb/textures/character.1368.png similarity index 100% rename from mods/skinsdb/textures/character_1368.png rename to mods/skinsdb/textures/character.1368.png diff --git a/mods/skinsdb/textures/character_1369.png b/mods/skinsdb/textures/character.1369.png similarity index 100% rename from mods/skinsdb/textures/character_1369.png rename to mods/skinsdb/textures/character.1369.png diff --git a/mods/skinsdb/textures/character_1370.png b/mods/skinsdb/textures/character.1370.png similarity index 100% rename from mods/skinsdb/textures/character_1370.png rename to mods/skinsdb/textures/character.1370.png diff --git a/mods/skinsdb/textures/character_1371.png b/mods/skinsdb/textures/character.1371.png similarity index 100% rename from mods/skinsdb/textures/character_1371.png rename to mods/skinsdb/textures/character.1371.png diff --git a/mods/skinsdb/textures/character_1372.png b/mods/skinsdb/textures/character.1372.png similarity index 100% rename from mods/skinsdb/textures/character_1372.png rename to mods/skinsdb/textures/character.1372.png diff --git a/mods/skinsdb/textures/character_1373.png b/mods/skinsdb/textures/character.1373.png similarity index 100% rename from mods/skinsdb/textures/character_1373.png rename to mods/skinsdb/textures/character.1373.png diff --git a/mods/skinsdb/textures/character_1374.png b/mods/skinsdb/textures/character.1374.png similarity index 100% rename from mods/skinsdb/textures/character_1374.png rename to mods/skinsdb/textures/character.1374.png diff --git a/mods/skinsdb/textures/character_1375.png b/mods/skinsdb/textures/character.1375.png similarity index 100% rename from mods/skinsdb/textures/character_1375.png rename to mods/skinsdb/textures/character.1375.png diff --git a/mods/skinsdb/textures/character_1376.png b/mods/skinsdb/textures/character.1376.png similarity index 100% rename from mods/skinsdb/textures/character_1376.png rename to mods/skinsdb/textures/character.1376.png diff --git a/mods/skinsdb/textures/character_1377.png b/mods/skinsdb/textures/character.1377.png similarity index 100% rename from mods/skinsdb/textures/character_1377.png rename to mods/skinsdb/textures/character.1377.png diff --git a/mods/skinsdb/textures/character_1378.png b/mods/skinsdb/textures/character.1378.png similarity index 100% rename from mods/skinsdb/textures/character_1378.png rename to mods/skinsdb/textures/character.1378.png diff --git a/mods/skinsdb/textures/character_1379.png b/mods/skinsdb/textures/character.1379.png similarity index 100% rename from mods/skinsdb/textures/character_1379.png rename to mods/skinsdb/textures/character.1379.png diff --git a/mods/skinsdb/textures/character_1380.png b/mods/skinsdb/textures/character.1380.png similarity index 100% rename from mods/skinsdb/textures/character_1380.png rename to mods/skinsdb/textures/character.1380.png diff --git a/mods/skinsdb/textures/character_1381.png b/mods/skinsdb/textures/character.1381.png similarity index 100% rename from mods/skinsdb/textures/character_1381.png rename to mods/skinsdb/textures/character.1381.png diff --git a/mods/skinsdb/textures/character_1382.png b/mods/skinsdb/textures/character.1382.png similarity index 100% rename from mods/skinsdb/textures/character_1382.png rename to mods/skinsdb/textures/character.1382.png diff --git a/mods/skinsdb/textures/character_1383.png b/mods/skinsdb/textures/character.1383.png similarity index 100% rename from mods/skinsdb/textures/character_1383.png rename to mods/skinsdb/textures/character.1383.png diff --git a/mods/skinsdb/textures/character_1384.png b/mods/skinsdb/textures/character.1384.png similarity index 100% rename from mods/skinsdb/textures/character_1384.png rename to mods/skinsdb/textures/character.1384.png diff --git a/mods/skinsdb/textures/character_1385.png b/mods/skinsdb/textures/character.1385.png similarity index 100% rename from mods/skinsdb/textures/character_1385.png rename to mods/skinsdb/textures/character.1385.png diff --git a/mods/skinsdb/textures/character_1386.png b/mods/skinsdb/textures/character.1386.png similarity index 100% rename from mods/skinsdb/textures/character_1386.png rename to mods/skinsdb/textures/character.1386.png diff --git a/mods/skinsdb/textures/character_1387.png b/mods/skinsdb/textures/character.1387.png similarity index 100% rename from mods/skinsdb/textures/character_1387.png rename to mods/skinsdb/textures/character.1387.png diff --git a/mods/skinsdb/textures/character_1388.png b/mods/skinsdb/textures/character.1388.png similarity index 100% rename from mods/skinsdb/textures/character_1388.png rename to mods/skinsdb/textures/character.1388.png diff --git a/mods/skinsdb/textures/character_1389.png b/mods/skinsdb/textures/character.1389.png similarity index 100% rename from mods/skinsdb/textures/character_1389.png rename to mods/skinsdb/textures/character.1389.png diff --git a/mods/skinsdb/textures/character_1390.png b/mods/skinsdb/textures/character.1390.png similarity index 100% rename from mods/skinsdb/textures/character_1390.png rename to mods/skinsdb/textures/character.1390.png diff --git a/mods/skinsdb/textures/character_1391.png b/mods/skinsdb/textures/character.1391.png similarity index 100% rename from mods/skinsdb/textures/character_1391.png rename to mods/skinsdb/textures/character.1391.png diff --git a/mods/skinsdb/textures/character_1392.png b/mods/skinsdb/textures/character.1392.png similarity index 100% rename from mods/skinsdb/textures/character_1392.png rename to mods/skinsdb/textures/character.1392.png diff --git a/mods/skinsdb/textures/character_1393.png b/mods/skinsdb/textures/character.1393.png similarity index 100% rename from mods/skinsdb/textures/character_1393.png rename to mods/skinsdb/textures/character.1393.png diff --git a/mods/skinsdb/textures/character_1394.png b/mods/skinsdb/textures/character.1394.png similarity index 100% rename from mods/skinsdb/textures/character_1394.png rename to mods/skinsdb/textures/character.1394.png diff --git a/mods/skinsdb/textures/character_1395.png b/mods/skinsdb/textures/character.1395.png similarity index 100% rename from mods/skinsdb/textures/character_1395.png rename to mods/skinsdb/textures/character.1395.png diff --git a/mods/skinsdb/textures/character_1396.png b/mods/skinsdb/textures/character.1396.png similarity index 100% rename from mods/skinsdb/textures/character_1396.png rename to mods/skinsdb/textures/character.1396.png diff --git a/mods/skinsdb/textures/character_1397.png b/mods/skinsdb/textures/character.1397.png similarity index 100% rename from mods/skinsdb/textures/character_1397.png rename to mods/skinsdb/textures/character.1397.png diff --git a/mods/skinsdb/textures/character_1398.png b/mods/skinsdb/textures/character.1398.png similarity index 100% rename from mods/skinsdb/textures/character_1398.png rename to mods/skinsdb/textures/character.1398.png diff --git a/mods/skinsdb/textures/character_1399.png b/mods/skinsdb/textures/character.1399.png similarity index 100% rename from mods/skinsdb/textures/character_1399.png rename to mods/skinsdb/textures/character.1399.png diff --git a/mods/skinsdb/textures/character_140.png b/mods/skinsdb/textures/character.140.png similarity index 100% rename from mods/skinsdb/textures/character_140.png rename to mods/skinsdb/textures/character.140.png diff --git a/mods/skinsdb/textures/character_1400.png b/mods/skinsdb/textures/character.1400.png similarity index 100% rename from mods/skinsdb/textures/character_1400.png rename to mods/skinsdb/textures/character.1400.png diff --git a/mods/skinsdb/textures/character_1401.png b/mods/skinsdb/textures/character.1401.png similarity index 100% rename from mods/skinsdb/textures/character_1401.png rename to mods/skinsdb/textures/character.1401.png diff --git a/mods/skinsdb/textures/character_1402.png b/mods/skinsdb/textures/character.1402.png similarity index 100% rename from mods/skinsdb/textures/character_1402.png rename to mods/skinsdb/textures/character.1402.png diff --git a/mods/skinsdb/textures/character_1403.png b/mods/skinsdb/textures/character.1403.png similarity index 100% rename from mods/skinsdb/textures/character_1403.png rename to mods/skinsdb/textures/character.1403.png diff --git a/mods/skinsdb/textures/character_1404.png b/mods/skinsdb/textures/character.1404.png similarity index 100% rename from mods/skinsdb/textures/character_1404.png rename to mods/skinsdb/textures/character.1404.png diff --git a/mods/skinsdb/textures/character_1405.png b/mods/skinsdb/textures/character.1405.png similarity index 100% rename from mods/skinsdb/textures/character_1405.png rename to mods/skinsdb/textures/character.1405.png diff --git a/mods/skinsdb/textures/character_1406.png b/mods/skinsdb/textures/character.1406.png similarity index 100% rename from mods/skinsdb/textures/character_1406.png rename to mods/skinsdb/textures/character.1406.png diff --git a/mods/skinsdb/textures/character_1407.png b/mods/skinsdb/textures/character.1407.png similarity index 100% rename from mods/skinsdb/textures/character_1407.png rename to mods/skinsdb/textures/character.1407.png diff --git a/mods/skinsdb/textures/character_1408.png b/mods/skinsdb/textures/character.1408.png similarity index 100% rename from mods/skinsdb/textures/character_1408.png rename to mods/skinsdb/textures/character.1408.png diff --git a/mods/skinsdb/textures/character_1409.png b/mods/skinsdb/textures/character.1409.png similarity index 100% rename from mods/skinsdb/textures/character_1409.png rename to mods/skinsdb/textures/character.1409.png diff --git a/mods/skinsdb/textures/character_141.png b/mods/skinsdb/textures/character.141.png similarity index 100% rename from mods/skinsdb/textures/character_141.png rename to mods/skinsdb/textures/character.141.png diff --git a/mods/skinsdb/textures/character_1410.png b/mods/skinsdb/textures/character.1410.png similarity index 100% rename from mods/skinsdb/textures/character_1410.png rename to mods/skinsdb/textures/character.1410.png diff --git a/mods/skinsdb/textures/character_1411.png b/mods/skinsdb/textures/character.1411.png similarity index 100% rename from mods/skinsdb/textures/character_1411.png rename to mods/skinsdb/textures/character.1411.png diff --git a/mods/skinsdb/textures/character_1414.png b/mods/skinsdb/textures/character.1414.png similarity index 100% rename from mods/skinsdb/textures/character_1414.png rename to mods/skinsdb/textures/character.1414.png diff --git a/mods/skinsdb/textures/character_1415.png b/mods/skinsdb/textures/character.1415.png similarity index 100% rename from mods/skinsdb/textures/character_1415.png rename to mods/skinsdb/textures/character.1415.png diff --git a/mods/skinsdb/textures/character_1416.png b/mods/skinsdb/textures/character.1416.png similarity index 100% rename from mods/skinsdb/textures/character_1416.png rename to mods/skinsdb/textures/character.1416.png diff --git a/mods/skinsdb/textures/character_1417.png b/mods/skinsdb/textures/character.1417.png similarity index 100% rename from mods/skinsdb/textures/character_1417.png rename to mods/skinsdb/textures/character.1417.png diff --git a/mods/skinsdb/textures/character_1418.png b/mods/skinsdb/textures/character.1418.png similarity index 100% rename from mods/skinsdb/textures/character_1418.png rename to mods/skinsdb/textures/character.1418.png diff --git a/mods/skinsdb/textures/character_1419.png b/mods/skinsdb/textures/character.1419.png similarity index 100% rename from mods/skinsdb/textures/character_1419.png rename to mods/skinsdb/textures/character.1419.png diff --git a/mods/skinsdb/textures/character_142.png b/mods/skinsdb/textures/character.142.png similarity index 100% rename from mods/skinsdb/textures/character_142.png rename to mods/skinsdb/textures/character.142.png diff --git a/mods/skinsdb/textures/character_1420.png b/mods/skinsdb/textures/character.1420.png similarity index 100% rename from mods/skinsdb/textures/character_1420.png rename to mods/skinsdb/textures/character.1420.png diff --git a/mods/skinsdb/textures/character_1421.png b/mods/skinsdb/textures/character.1421.png similarity index 100% rename from mods/skinsdb/textures/character_1421.png rename to mods/skinsdb/textures/character.1421.png diff --git a/mods/skinsdb/textures/character_1422.png b/mods/skinsdb/textures/character.1422.png similarity index 100% rename from mods/skinsdb/textures/character_1422.png rename to mods/skinsdb/textures/character.1422.png diff --git a/mods/skinsdb/textures/character_1423.png b/mods/skinsdb/textures/character.1423.png similarity index 100% rename from mods/skinsdb/textures/character_1423.png rename to mods/skinsdb/textures/character.1423.png diff --git a/mods/skinsdb/textures/character_1424.png b/mods/skinsdb/textures/character.1424.png similarity index 100% rename from mods/skinsdb/textures/character_1424.png rename to mods/skinsdb/textures/character.1424.png diff --git a/mods/skinsdb/textures/character_1425.png b/mods/skinsdb/textures/character.1425.png similarity index 100% rename from mods/skinsdb/textures/character_1425.png rename to mods/skinsdb/textures/character.1425.png diff --git a/mods/skinsdb/textures/character_1426.png b/mods/skinsdb/textures/character.1426.png similarity index 100% rename from mods/skinsdb/textures/character_1426.png rename to mods/skinsdb/textures/character.1426.png diff --git a/mods/skinsdb/textures/character_1427.png b/mods/skinsdb/textures/character.1427.png similarity index 100% rename from mods/skinsdb/textures/character_1427.png rename to mods/skinsdb/textures/character.1427.png diff --git a/mods/skinsdb/textures/character_1428.png b/mods/skinsdb/textures/character.1428.png similarity index 100% rename from mods/skinsdb/textures/character_1428.png rename to mods/skinsdb/textures/character.1428.png diff --git a/mods/skinsdb/textures/character_1429.png b/mods/skinsdb/textures/character.1429.png similarity index 100% rename from mods/skinsdb/textures/character_1429.png rename to mods/skinsdb/textures/character.1429.png diff --git a/mods/skinsdb/textures/character_143.png b/mods/skinsdb/textures/character.143.png similarity index 100% rename from mods/skinsdb/textures/character_143.png rename to mods/skinsdb/textures/character.143.png diff --git a/mods/skinsdb/textures/character_1430.png b/mods/skinsdb/textures/character.1430.png similarity index 100% rename from mods/skinsdb/textures/character_1430.png rename to mods/skinsdb/textures/character.1430.png diff --git a/mods/skinsdb/textures/character_1431.png b/mods/skinsdb/textures/character.1431.png similarity index 100% rename from mods/skinsdb/textures/character_1431.png rename to mods/skinsdb/textures/character.1431.png diff --git a/mods/skinsdb/textures/character_1432.png b/mods/skinsdb/textures/character.1432.png similarity index 100% rename from mods/skinsdb/textures/character_1432.png rename to mods/skinsdb/textures/character.1432.png diff --git a/mods/skinsdb/textures/character_1433.png b/mods/skinsdb/textures/character.1433.png similarity index 100% rename from mods/skinsdb/textures/character_1433.png rename to mods/skinsdb/textures/character.1433.png diff --git a/mods/skinsdb/textures/character_1434.png b/mods/skinsdb/textures/character.1434.png similarity index 100% rename from mods/skinsdb/textures/character_1434.png rename to mods/skinsdb/textures/character.1434.png diff --git a/mods/skinsdb/textures/character_1435.png b/mods/skinsdb/textures/character.1435.png similarity index 100% rename from mods/skinsdb/textures/character_1435.png rename to mods/skinsdb/textures/character.1435.png diff --git a/mods/skinsdb/textures/character_1436.png b/mods/skinsdb/textures/character.1436.png similarity index 100% rename from mods/skinsdb/textures/character_1436.png rename to mods/skinsdb/textures/character.1436.png diff --git a/mods/skinsdb/textures/character_1437.png b/mods/skinsdb/textures/character.1437.png similarity index 100% rename from mods/skinsdb/textures/character_1437.png rename to mods/skinsdb/textures/character.1437.png diff --git a/mods/skinsdb/textures/character_1438.png b/mods/skinsdb/textures/character.1438.png similarity index 100% rename from mods/skinsdb/textures/character_1438.png rename to mods/skinsdb/textures/character.1438.png diff --git a/mods/skinsdb/textures/character_1439.png b/mods/skinsdb/textures/character.1439.png similarity index 100% rename from mods/skinsdb/textures/character_1439.png rename to mods/skinsdb/textures/character.1439.png diff --git a/mods/skinsdb/textures/character_144.png b/mods/skinsdb/textures/character.144.png similarity index 100% rename from mods/skinsdb/textures/character_144.png rename to mods/skinsdb/textures/character.144.png diff --git a/mods/skinsdb/textures/character_1440.png b/mods/skinsdb/textures/character.1440.png similarity index 100% rename from mods/skinsdb/textures/character_1440.png rename to mods/skinsdb/textures/character.1440.png diff --git a/mods/skinsdb/textures/character_1441.png b/mods/skinsdb/textures/character.1441.png similarity index 100% rename from mods/skinsdb/textures/character_1441.png rename to mods/skinsdb/textures/character.1441.png diff --git a/mods/skinsdb/textures/character_1442.png b/mods/skinsdb/textures/character.1442.png similarity index 100% rename from mods/skinsdb/textures/character_1442.png rename to mods/skinsdb/textures/character.1442.png diff --git a/mods/skinsdb/textures/character_1443.png b/mods/skinsdb/textures/character.1443.png similarity index 100% rename from mods/skinsdb/textures/character_1443.png rename to mods/skinsdb/textures/character.1443.png diff --git a/mods/skinsdb/textures/character_1444.png b/mods/skinsdb/textures/character.1444.png similarity index 100% rename from mods/skinsdb/textures/character_1444.png rename to mods/skinsdb/textures/character.1444.png diff --git a/mods/skinsdb/textures/character_1445.png b/mods/skinsdb/textures/character.1445.png similarity index 100% rename from mods/skinsdb/textures/character_1445.png rename to mods/skinsdb/textures/character.1445.png diff --git a/mods/skinsdb/textures/character_145.png b/mods/skinsdb/textures/character.145.png similarity index 100% rename from mods/skinsdb/textures/character_145.png rename to mods/skinsdb/textures/character.145.png diff --git a/mods/skinsdb/textures/character_1455.png b/mods/skinsdb/textures/character.1455.png similarity index 100% rename from mods/skinsdb/textures/character_1455.png rename to mods/skinsdb/textures/character.1455.png diff --git a/mods/skinsdb/textures/character_1456.png b/mods/skinsdb/textures/character.1456.png similarity index 100% rename from mods/skinsdb/textures/character_1456.png rename to mods/skinsdb/textures/character.1456.png diff --git a/mods/skinsdb/textures/character_1457.png b/mods/skinsdb/textures/character.1457.png similarity index 100% rename from mods/skinsdb/textures/character_1457.png rename to mods/skinsdb/textures/character.1457.png diff --git a/mods/skinsdb/textures/character_1458.png b/mods/skinsdb/textures/character.1458.png similarity index 100% rename from mods/skinsdb/textures/character_1458.png rename to mods/skinsdb/textures/character.1458.png diff --git a/mods/skinsdb/textures/character_1459.png b/mods/skinsdb/textures/character.1459.png similarity index 100% rename from mods/skinsdb/textures/character_1459.png rename to mods/skinsdb/textures/character.1459.png diff --git a/mods/skinsdb/textures/character_146.png b/mods/skinsdb/textures/character.146.png similarity index 100% rename from mods/skinsdb/textures/character_146.png rename to mods/skinsdb/textures/character.146.png diff --git a/mods/skinsdb/textures/character_1460.png b/mods/skinsdb/textures/character.1460.png similarity index 100% rename from mods/skinsdb/textures/character_1460.png rename to mods/skinsdb/textures/character.1460.png diff --git a/mods/skinsdb/textures/character_1461.png b/mods/skinsdb/textures/character.1461.png similarity index 100% rename from mods/skinsdb/textures/character_1461.png rename to mods/skinsdb/textures/character.1461.png diff --git a/mods/skinsdb/textures/character_1462.png b/mods/skinsdb/textures/character.1462.png similarity index 100% rename from mods/skinsdb/textures/character_1462.png rename to mods/skinsdb/textures/character.1462.png diff --git a/mods/skinsdb/textures/character_1463.png b/mods/skinsdb/textures/character.1463.png similarity index 100% rename from mods/skinsdb/textures/character_1463.png rename to mods/skinsdb/textures/character.1463.png diff --git a/mods/skinsdb/textures/character_1464.png b/mods/skinsdb/textures/character.1464.png similarity index 100% rename from mods/skinsdb/textures/character_1464.png rename to mods/skinsdb/textures/character.1464.png diff --git a/mods/skinsdb/textures/character_1465.png b/mods/skinsdb/textures/character.1465.png similarity index 100% rename from mods/skinsdb/textures/character_1465.png rename to mods/skinsdb/textures/character.1465.png diff --git a/mods/skinsdb/textures/character_1466.png b/mods/skinsdb/textures/character.1466.png similarity index 100% rename from mods/skinsdb/textures/character_1466.png rename to mods/skinsdb/textures/character.1466.png diff --git a/mods/skinsdb/textures/character_1467.png b/mods/skinsdb/textures/character.1467.png similarity index 100% rename from mods/skinsdb/textures/character_1467.png rename to mods/skinsdb/textures/character.1467.png diff --git a/mods/skinsdb/textures/character_1468.png b/mods/skinsdb/textures/character.1468.png similarity index 100% rename from mods/skinsdb/textures/character_1468.png rename to mods/skinsdb/textures/character.1468.png diff --git a/mods/skinsdb/textures/character_1469.png b/mods/skinsdb/textures/character.1469.png similarity index 100% rename from mods/skinsdb/textures/character_1469.png rename to mods/skinsdb/textures/character.1469.png diff --git a/mods/skinsdb/textures/character_147.png b/mods/skinsdb/textures/character.147.png similarity index 100% rename from mods/skinsdb/textures/character_147.png rename to mods/skinsdb/textures/character.147.png diff --git a/mods/skinsdb/textures/character_1470.png b/mods/skinsdb/textures/character.1470.png similarity index 100% rename from mods/skinsdb/textures/character_1470.png rename to mods/skinsdb/textures/character.1470.png diff --git a/mods/skinsdb/textures/character_1471.png b/mods/skinsdb/textures/character.1471.png similarity index 100% rename from mods/skinsdb/textures/character_1471.png rename to mods/skinsdb/textures/character.1471.png diff --git a/mods/skinsdb/textures/character_1472.png b/mods/skinsdb/textures/character.1472.png similarity index 100% rename from mods/skinsdb/textures/character_1472.png rename to mods/skinsdb/textures/character.1472.png diff --git a/mods/skinsdb/textures/character_1473.png b/mods/skinsdb/textures/character.1473.png similarity index 100% rename from mods/skinsdb/textures/character_1473.png rename to mods/skinsdb/textures/character.1473.png diff --git a/mods/skinsdb/textures/character_1474.png b/mods/skinsdb/textures/character.1474.png similarity index 100% rename from mods/skinsdb/textures/character_1474.png rename to mods/skinsdb/textures/character.1474.png diff --git a/mods/skinsdb/textures/character_1475.png b/mods/skinsdb/textures/character.1475.png similarity index 100% rename from mods/skinsdb/textures/character_1475.png rename to mods/skinsdb/textures/character.1475.png diff --git a/mods/skinsdb/textures/character_1476.png b/mods/skinsdb/textures/character.1476.png similarity index 100% rename from mods/skinsdb/textures/character_1476.png rename to mods/skinsdb/textures/character.1476.png diff --git a/mods/skinsdb/textures/character_1477.png b/mods/skinsdb/textures/character.1477.png similarity index 100% rename from mods/skinsdb/textures/character_1477.png rename to mods/skinsdb/textures/character.1477.png diff --git a/mods/skinsdb/textures/character_1478.png b/mods/skinsdb/textures/character.1478.png similarity index 100% rename from mods/skinsdb/textures/character_1478.png rename to mods/skinsdb/textures/character.1478.png diff --git a/mods/skinsdb/textures/character_1479.png b/mods/skinsdb/textures/character.1479.png similarity index 100% rename from mods/skinsdb/textures/character_1479.png rename to mods/skinsdb/textures/character.1479.png diff --git a/mods/skinsdb/textures/character_148.png b/mods/skinsdb/textures/character.148.png similarity index 100% rename from mods/skinsdb/textures/character_148.png rename to mods/skinsdb/textures/character.148.png diff --git a/mods/skinsdb/textures/character_1480.png b/mods/skinsdb/textures/character.1480.png similarity index 100% rename from mods/skinsdb/textures/character_1480.png rename to mods/skinsdb/textures/character.1480.png diff --git a/mods/skinsdb/textures/character_1481.png b/mods/skinsdb/textures/character.1481.png similarity index 100% rename from mods/skinsdb/textures/character_1481.png rename to mods/skinsdb/textures/character.1481.png diff --git a/mods/skinsdb/textures/character_1482.png b/mods/skinsdb/textures/character.1482.png similarity index 100% rename from mods/skinsdb/textures/character_1482.png rename to mods/skinsdb/textures/character.1482.png diff --git a/mods/skinsdb/textures/character_1483.png b/mods/skinsdb/textures/character.1483.png similarity index 100% rename from mods/skinsdb/textures/character_1483.png rename to mods/skinsdb/textures/character.1483.png diff --git a/mods/skinsdb/textures/character_1484.png b/mods/skinsdb/textures/character.1484.png similarity index 100% rename from mods/skinsdb/textures/character_1484.png rename to mods/skinsdb/textures/character.1484.png diff --git a/mods/skinsdb/textures/character_1485.png b/mods/skinsdb/textures/character.1485.png similarity index 100% rename from mods/skinsdb/textures/character_1485.png rename to mods/skinsdb/textures/character.1485.png diff --git a/mods/skinsdb/textures/character_1486.png b/mods/skinsdb/textures/character.1486.png similarity index 100% rename from mods/skinsdb/textures/character_1486.png rename to mods/skinsdb/textures/character.1486.png diff --git a/mods/skinsdb/textures/character_1487.png b/mods/skinsdb/textures/character.1487.png similarity index 100% rename from mods/skinsdb/textures/character_1487.png rename to mods/skinsdb/textures/character.1487.png diff --git a/mods/skinsdb/textures/character_1488.png b/mods/skinsdb/textures/character.1488.png similarity index 100% rename from mods/skinsdb/textures/character_1488.png rename to mods/skinsdb/textures/character.1488.png diff --git a/mods/skinsdb/textures/character_1489.png b/mods/skinsdb/textures/character.1489.png similarity index 100% rename from mods/skinsdb/textures/character_1489.png rename to mods/skinsdb/textures/character.1489.png diff --git a/mods/skinsdb/textures/character_1490.png b/mods/skinsdb/textures/character.1490.png similarity index 100% rename from mods/skinsdb/textures/character_1490.png rename to mods/skinsdb/textures/character.1490.png diff --git a/mods/skinsdb/textures/character_1491.png b/mods/skinsdb/textures/character.1491.png similarity index 100% rename from mods/skinsdb/textures/character_1491.png rename to mods/skinsdb/textures/character.1491.png diff --git a/mods/skinsdb/textures/character_1492.png b/mods/skinsdb/textures/character.1492.png similarity index 100% rename from mods/skinsdb/textures/character_1492.png rename to mods/skinsdb/textures/character.1492.png diff --git a/mods/skinsdb/textures/character_1493.png b/mods/skinsdb/textures/character.1493.png similarity index 100% rename from mods/skinsdb/textures/character_1493.png rename to mods/skinsdb/textures/character.1493.png diff --git a/mods/skinsdb/textures/character_1494.png b/mods/skinsdb/textures/character.1494.png similarity index 100% rename from mods/skinsdb/textures/character_1494.png rename to mods/skinsdb/textures/character.1494.png diff --git a/mods/skinsdb/textures/character_1495.png b/mods/skinsdb/textures/character.1495.png similarity index 100% rename from mods/skinsdb/textures/character_1495.png rename to mods/skinsdb/textures/character.1495.png diff --git a/mods/skinsdb/textures/character_1496.png b/mods/skinsdb/textures/character.1496.png similarity index 100% rename from mods/skinsdb/textures/character_1496.png rename to mods/skinsdb/textures/character.1496.png diff --git a/mods/skinsdb/textures/character_1497.png b/mods/skinsdb/textures/character.1497.png similarity index 100% rename from mods/skinsdb/textures/character_1497.png rename to mods/skinsdb/textures/character.1497.png diff --git a/mods/skinsdb/textures/character_1498.png b/mods/skinsdb/textures/character.1498.png similarity index 100% rename from mods/skinsdb/textures/character_1498.png rename to mods/skinsdb/textures/character.1498.png diff --git a/mods/skinsdb/textures/character_1499.png b/mods/skinsdb/textures/character.1499.png similarity index 100% rename from mods/skinsdb/textures/character_1499.png rename to mods/skinsdb/textures/character.1499.png diff --git a/mods/skinsdb/textures/character_1500.png b/mods/skinsdb/textures/character.1500.png similarity index 100% rename from mods/skinsdb/textures/character_1500.png rename to mods/skinsdb/textures/character.1500.png diff --git a/mods/skinsdb/textures/character_1501.png b/mods/skinsdb/textures/character.1501.png similarity index 100% rename from mods/skinsdb/textures/character_1501.png rename to mods/skinsdb/textures/character.1501.png diff --git a/mods/skinsdb/textures/character_1502.png b/mods/skinsdb/textures/character.1502.png similarity index 100% rename from mods/skinsdb/textures/character_1502.png rename to mods/skinsdb/textures/character.1502.png diff --git a/mods/skinsdb/textures/character_1503.png b/mods/skinsdb/textures/character.1503.png similarity index 100% rename from mods/skinsdb/textures/character_1503.png rename to mods/skinsdb/textures/character.1503.png diff --git a/mods/skinsdb/textures/character_1504.png b/mods/skinsdb/textures/character.1504.png similarity index 100% rename from mods/skinsdb/textures/character_1504.png rename to mods/skinsdb/textures/character.1504.png diff --git a/mods/skinsdb/textures/character_1505.png b/mods/skinsdb/textures/character.1505.png similarity index 100% rename from mods/skinsdb/textures/character_1505.png rename to mods/skinsdb/textures/character.1505.png diff --git a/mods/skinsdb/textures/character_1506.png b/mods/skinsdb/textures/character.1506.png similarity index 100% rename from mods/skinsdb/textures/character_1506.png rename to mods/skinsdb/textures/character.1506.png diff --git a/mods/skinsdb/textures/character_1507.png b/mods/skinsdb/textures/character.1507.png similarity index 100% rename from mods/skinsdb/textures/character_1507.png rename to mods/skinsdb/textures/character.1507.png diff --git a/mods/skinsdb/textures/character_1508.png b/mods/skinsdb/textures/character.1508.png similarity index 100% rename from mods/skinsdb/textures/character_1508.png rename to mods/skinsdb/textures/character.1508.png diff --git a/mods/skinsdb/textures/character_1509.png b/mods/skinsdb/textures/character.1509.png similarity index 100% rename from mods/skinsdb/textures/character_1509.png rename to mods/skinsdb/textures/character.1509.png diff --git a/mods/skinsdb/textures/character_151.png b/mods/skinsdb/textures/character.151.png similarity index 100% rename from mods/skinsdb/textures/character_151.png rename to mods/skinsdb/textures/character.151.png diff --git a/mods/skinsdb/textures/character_1510.png b/mods/skinsdb/textures/character.1510.png similarity index 100% rename from mods/skinsdb/textures/character_1510.png rename to mods/skinsdb/textures/character.1510.png diff --git a/mods/skinsdb/textures/character_1511.png b/mods/skinsdb/textures/character.1511.png similarity index 100% rename from mods/skinsdb/textures/character_1511.png rename to mods/skinsdb/textures/character.1511.png diff --git a/mods/skinsdb/textures/character_1512.png b/mods/skinsdb/textures/character.1512.png similarity index 100% rename from mods/skinsdb/textures/character_1512.png rename to mods/skinsdb/textures/character.1512.png diff --git a/mods/skinsdb/textures/character_1513.png b/mods/skinsdb/textures/character.1513.png similarity index 100% rename from mods/skinsdb/textures/character_1513.png rename to mods/skinsdb/textures/character.1513.png diff --git a/mods/skinsdb/textures/character_1514.png b/mods/skinsdb/textures/character.1514.png similarity index 100% rename from mods/skinsdb/textures/character_1514.png rename to mods/skinsdb/textures/character.1514.png diff --git a/mods/skinsdb/textures/character_1515.png b/mods/skinsdb/textures/character.1515.png similarity index 100% rename from mods/skinsdb/textures/character_1515.png rename to mods/skinsdb/textures/character.1515.png diff --git a/mods/skinsdb/textures/character_1516.png b/mods/skinsdb/textures/character.1516.png similarity index 100% rename from mods/skinsdb/textures/character_1516.png rename to mods/skinsdb/textures/character.1516.png diff --git a/mods/skinsdb/textures/character_1517.png b/mods/skinsdb/textures/character.1517.png similarity index 100% rename from mods/skinsdb/textures/character_1517.png rename to mods/skinsdb/textures/character.1517.png diff --git a/mods/skinsdb/textures/character_1518.png b/mods/skinsdb/textures/character.1518.png similarity index 100% rename from mods/skinsdb/textures/character_1518.png rename to mods/skinsdb/textures/character.1518.png diff --git a/mods/skinsdb/textures/character_1519.png b/mods/skinsdb/textures/character.1519.png similarity index 100% rename from mods/skinsdb/textures/character_1519.png rename to mods/skinsdb/textures/character.1519.png diff --git a/mods/skinsdb/textures/character_152.png b/mods/skinsdb/textures/character.152.png similarity index 100% rename from mods/skinsdb/textures/character_152.png rename to mods/skinsdb/textures/character.152.png diff --git a/mods/skinsdb/textures/character_1520.png b/mods/skinsdb/textures/character.1520.png similarity index 100% rename from mods/skinsdb/textures/character_1520.png rename to mods/skinsdb/textures/character.1520.png diff --git a/mods/skinsdb/textures/character_1521.png b/mods/skinsdb/textures/character.1521.png similarity index 100% rename from mods/skinsdb/textures/character_1521.png rename to mods/skinsdb/textures/character.1521.png diff --git a/mods/skinsdb/textures/character_1522.png b/mods/skinsdb/textures/character.1522.png similarity index 100% rename from mods/skinsdb/textures/character_1522.png rename to mods/skinsdb/textures/character.1522.png diff --git a/mods/skinsdb/textures/character_1523.png b/mods/skinsdb/textures/character.1523.png similarity index 100% rename from mods/skinsdb/textures/character_1523.png rename to mods/skinsdb/textures/character.1523.png diff --git a/mods/skinsdb/textures/character_1524.png b/mods/skinsdb/textures/character.1524.png similarity index 100% rename from mods/skinsdb/textures/character_1524.png rename to mods/skinsdb/textures/character.1524.png diff --git a/mods/skinsdb/textures/character_1525.png b/mods/skinsdb/textures/character.1525.png similarity index 100% rename from mods/skinsdb/textures/character_1525.png rename to mods/skinsdb/textures/character.1525.png diff --git a/mods/skinsdb/textures/character_1526.png b/mods/skinsdb/textures/character.1526.png similarity index 100% rename from mods/skinsdb/textures/character_1526.png rename to mods/skinsdb/textures/character.1526.png diff --git a/mods/skinsdb/textures/character_1527.png b/mods/skinsdb/textures/character.1527.png similarity index 100% rename from mods/skinsdb/textures/character_1527.png rename to mods/skinsdb/textures/character.1527.png diff --git a/mods/skinsdb/textures/character_1528.png b/mods/skinsdb/textures/character.1528.png similarity index 100% rename from mods/skinsdb/textures/character_1528.png rename to mods/skinsdb/textures/character.1528.png diff --git a/mods/skinsdb/textures/character_1529.png b/mods/skinsdb/textures/character.1529.png similarity index 100% rename from mods/skinsdb/textures/character_1529.png rename to mods/skinsdb/textures/character.1529.png diff --git a/mods/skinsdb/textures/character_153.png b/mods/skinsdb/textures/character.153.png similarity index 100% rename from mods/skinsdb/textures/character_153.png rename to mods/skinsdb/textures/character.153.png diff --git a/mods/skinsdb/textures/character_1530.png b/mods/skinsdb/textures/character.1530.png similarity index 100% rename from mods/skinsdb/textures/character_1530.png rename to mods/skinsdb/textures/character.1530.png diff --git a/mods/skinsdb/textures/character_1531.png b/mods/skinsdb/textures/character.1531.png similarity index 100% rename from mods/skinsdb/textures/character_1531.png rename to mods/skinsdb/textures/character.1531.png diff --git a/mods/skinsdb/textures/character_1532.png b/mods/skinsdb/textures/character.1532.png similarity index 100% rename from mods/skinsdb/textures/character_1532.png rename to mods/skinsdb/textures/character.1532.png diff --git a/mods/skinsdb/textures/character_1533.png b/mods/skinsdb/textures/character.1533.png similarity index 100% rename from mods/skinsdb/textures/character_1533.png rename to mods/skinsdb/textures/character.1533.png diff --git a/mods/skinsdb/textures/character_1534.png b/mods/skinsdb/textures/character.1534.png similarity index 100% rename from mods/skinsdb/textures/character_1534.png rename to mods/skinsdb/textures/character.1534.png diff --git a/mods/skinsdb/textures/character_1535.png b/mods/skinsdb/textures/character.1535.png similarity index 100% rename from mods/skinsdb/textures/character_1535.png rename to mods/skinsdb/textures/character.1535.png diff --git a/mods/skinsdb/textures/character_1536.png b/mods/skinsdb/textures/character.1536.png similarity index 100% rename from mods/skinsdb/textures/character_1536.png rename to mods/skinsdb/textures/character.1536.png diff --git a/mods/skinsdb/textures/character_1537.png b/mods/skinsdb/textures/character.1537.png similarity index 100% rename from mods/skinsdb/textures/character_1537.png rename to mods/skinsdb/textures/character.1537.png diff --git a/mods/skinsdb/textures/character_1538.png b/mods/skinsdb/textures/character.1538.png similarity index 100% rename from mods/skinsdb/textures/character_1538.png rename to mods/skinsdb/textures/character.1538.png diff --git a/mods/skinsdb/textures/character_1539.png b/mods/skinsdb/textures/character.1539.png similarity index 100% rename from mods/skinsdb/textures/character_1539.png rename to mods/skinsdb/textures/character.1539.png diff --git a/mods/skinsdb/textures/character_154.png b/mods/skinsdb/textures/character.154.png similarity index 100% rename from mods/skinsdb/textures/character_154.png rename to mods/skinsdb/textures/character.154.png diff --git a/mods/skinsdb/textures/character_1540.png b/mods/skinsdb/textures/character.1540.png similarity index 100% rename from mods/skinsdb/textures/character_1540.png rename to mods/skinsdb/textures/character.1540.png diff --git a/mods/skinsdb/textures/character_1541.png b/mods/skinsdb/textures/character.1541.png similarity index 100% rename from mods/skinsdb/textures/character_1541.png rename to mods/skinsdb/textures/character.1541.png diff --git a/mods/skinsdb/textures/character_1542.png b/mods/skinsdb/textures/character.1542.png similarity index 100% rename from mods/skinsdb/textures/character_1542.png rename to mods/skinsdb/textures/character.1542.png diff --git a/mods/skinsdb/textures/character_1543.png b/mods/skinsdb/textures/character.1543.png similarity index 100% rename from mods/skinsdb/textures/character_1543.png rename to mods/skinsdb/textures/character.1543.png diff --git a/mods/skinsdb/textures/character_1544.png b/mods/skinsdb/textures/character.1544.png similarity index 100% rename from mods/skinsdb/textures/character_1544.png rename to mods/skinsdb/textures/character.1544.png diff --git a/mods/skinsdb/textures/character_1545.png b/mods/skinsdb/textures/character.1545.png similarity index 100% rename from mods/skinsdb/textures/character_1545.png rename to mods/skinsdb/textures/character.1545.png diff --git a/mods/skinsdb/textures/character_1546.png b/mods/skinsdb/textures/character.1546.png similarity index 100% rename from mods/skinsdb/textures/character_1546.png rename to mods/skinsdb/textures/character.1546.png diff --git a/mods/skinsdb/textures/character_1547.png b/mods/skinsdb/textures/character.1547.png similarity index 100% rename from mods/skinsdb/textures/character_1547.png rename to mods/skinsdb/textures/character.1547.png diff --git a/mods/skinsdb/textures/character_1548.png b/mods/skinsdb/textures/character.1548.png similarity index 100% rename from mods/skinsdb/textures/character_1548.png rename to mods/skinsdb/textures/character.1548.png diff --git a/mods/skinsdb/textures/character_1549.png b/mods/skinsdb/textures/character.1549.png similarity index 100% rename from mods/skinsdb/textures/character_1549.png rename to mods/skinsdb/textures/character.1549.png diff --git a/mods/skinsdb/textures/character_155.png b/mods/skinsdb/textures/character.155.png similarity index 100% rename from mods/skinsdb/textures/character_155.png rename to mods/skinsdb/textures/character.155.png diff --git a/mods/skinsdb/textures/character_1550.png b/mods/skinsdb/textures/character.1550.png similarity index 100% rename from mods/skinsdb/textures/character_1550.png rename to mods/skinsdb/textures/character.1550.png diff --git a/mods/skinsdb/textures/character_1551.png b/mods/skinsdb/textures/character.1551.png similarity index 100% rename from mods/skinsdb/textures/character_1551.png rename to mods/skinsdb/textures/character.1551.png diff --git a/mods/skinsdb/textures/character_1552.png b/mods/skinsdb/textures/character.1552.png similarity index 100% rename from mods/skinsdb/textures/character_1552.png rename to mods/skinsdb/textures/character.1552.png diff --git a/mods/skinsdb/textures/character_1553.png b/mods/skinsdb/textures/character.1553.png similarity index 100% rename from mods/skinsdb/textures/character_1553.png rename to mods/skinsdb/textures/character.1553.png diff --git a/mods/skinsdb/textures/character_1554.png b/mods/skinsdb/textures/character.1554.png similarity index 100% rename from mods/skinsdb/textures/character_1554.png rename to mods/skinsdb/textures/character.1554.png diff --git a/mods/skinsdb/textures/character_1555.png b/mods/skinsdb/textures/character.1555.png similarity index 100% rename from mods/skinsdb/textures/character_1555.png rename to mods/skinsdb/textures/character.1555.png diff --git a/mods/skinsdb/textures/character_1556.png b/mods/skinsdb/textures/character.1556.png similarity index 100% rename from mods/skinsdb/textures/character_1556.png rename to mods/skinsdb/textures/character.1556.png diff --git a/mods/skinsdb/textures/character_1557.png b/mods/skinsdb/textures/character.1557.png similarity index 100% rename from mods/skinsdb/textures/character_1557.png rename to mods/skinsdb/textures/character.1557.png diff --git a/mods/skinsdb/textures/character_1558.png b/mods/skinsdb/textures/character.1558.png similarity index 100% rename from mods/skinsdb/textures/character_1558.png rename to mods/skinsdb/textures/character.1558.png diff --git a/mods/skinsdb/textures/character_1559.png b/mods/skinsdb/textures/character.1559.png similarity index 100% rename from mods/skinsdb/textures/character_1559.png rename to mods/skinsdb/textures/character.1559.png diff --git a/mods/skinsdb/textures/character_156.png b/mods/skinsdb/textures/character.156.png similarity index 100% rename from mods/skinsdb/textures/character_156.png rename to mods/skinsdb/textures/character.156.png diff --git a/mods/skinsdb/textures/character_1560.png b/mods/skinsdb/textures/character.1560.png similarity index 100% rename from mods/skinsdb/textures/character_1560.png rename to mods/skinsdb/textures/character.1560.png diff --git a/mods/skinsdb/textures/character_1561.png b/mods/skinsdb/textures/character.1561.png similarity index 100% rename from mods/skinsdb/textures/character_1561.png rename to mods/skinsdb/textures/character.1561.png diff --git a/mods/skinsdb/textures/character_1562.png b/mods/skinsdb/textures/character.1562.png similarity index 100% rename from mods/skinsdb/textures/character_1562.png rename to mods/skinsdb/textures/character.1562.png diff --git a/mods/skinsdb/textures/character_1563.png b/mods/skinsdb/textures/character.1563.png similarity index 100% rename from mods/skinsdb/textures/character_1563.png rename to mods/skinsdb/textures/character.1563.png diff --git a/mods/skinsdb/textures/character_1564.png b/mods/skinsdb/textures/character.1564.png similarity index 100% rename from mods/skinsdb/textures/character_1564.png rename to mods/skinsdb/textures/character.1564.png diff --git a/mods/skinsdb/textures/character_1565.png b/mods/skinsdb/textures/character.1565.png similarity index 100% rename from mods/skinsdb/textures/character_1565.png rename to mods/skinsdb/textures/character.1565.png diff --git a/mods/skinsdb/textures/character_1566.png b/mods/skinsdb/textures/character.1566.png similarity index 100% rename from mods/skinsdb/textures/character_1566.png rename to mods/skinsdb/textures/character.1566.png diff --git a/mods/skinsdb/textures/character_1567.png b/mods/skinsdb/textures/character.1567.png similarity index 100% rename from mods/skinsdb/textures/character_1567.png rename to mods/skinsdb/textures/character.1567.png diff --git a/mods/skinsdb/textures/character_1568.png b/mods/skinsdb/textures/character.1568.png similarity index 100% rename from mods/skinsdb/textures/character_1568.png rename to mods/skinsdb/textures/character.1568.png diff --git a/mods/skinsdb/textures/character_1569.png b/mods/skinsdb/textures/character.1569.png similarity index 100% rename from mods/skinsdb/textures/character_1569.png rename to mods/skinsdb/textures/character.1569.png diff --git a/mods/skinsdb/textures/character_157.png b/mods/skinsdb/textures/character.157.png similarity index 100% rename from mods/skinsdb/textures/character_157.png rename to mods/skinsdb/textures/character.157.png diff --git a/mods/skinsdb/textures/character_1570.png b/mods/skinsdb/textures/character.1570.png similarity index 100% rename from mods/skinsdb/textures/character_1570.png rename to mods/skinsdb/textures/character.1570.png diff --git a/mods/skinsdb/textures/character_1571.png b/mods/skinsdb/textures/character.1571.png similarity index 100% rename from mods/skinsdb/textures/character_1571.png rename to mods/skinsdb/textures/character.1571.png diff --git a/mods/skinsdb/textures/character_1572.png b/mods/skinsdb/textures/character.1572.png similarity index 100% rename from mods/skinsdb/textures/character_1572.png rename to mods/skinsdb/textures/character.1572.png diff --git a/mods/skinsdb/textures/character_1573.png b/mods/skinsdb/textures/character.1573.png similarity index 100% rename from mods/skinsdb/textures/character_1573.png rename to mods/skinsdb/textures/character.1573.png diff --git a/mods/skinsdb/textures/character_1574.png b/mods/skinsdb/textures/character.1574.png similarity index 100% rename from mods/skinsdb/textures/character_1574.png rename to mods/skinsdb/textures/character.1574.png diff --git a/mods/skinsdb/textures/character_1575.png b/mods/skinsdb/textures/character.1575.png similarity index 100% rename from mods/skinsdb/textures/character_1575.png rename to mods/skinsdb/textures/character.1575.png diff --git a/mods/skinsdb/textures/character_1576.png b/mods/skinsdb/textures/character.1576.png similarity index 100% rename from mods/skinsdb/textures/character_1576.png rename to mods/skinsdb/textures/character.1576.png diff --git a/mods/skinsdb/textures/character_1577.png b/mods/skinsdb/textures/character.1577.png similarity index 100% rename from mods/skinsdb/textures/character_1577.png rename to mods/skinsdb/textures/character.1577.png diff --git a/mods/skinsdb/textures/character_1578.png b/mods/skinsdb/textures/character.1578.png similarity index 100% rename from mods/skinsdb/textures/character_1578.png rename to mods/skinsdb/textures/character.1578.png diff --git a/mods/skinsdb/textures/character_1579.png b/mods/skinsdb/textures/character.1579.png similarity index 100% rename from mods/skinsdb/textures/character_1579.png rename to mods/skinsdb/textures/character.1579.png diff --git a/mods/skinsdb/textures/character_158.png b/mods/skinsdb/textures/character.158.png similarity index 100% rename from mods/skinsdb/textures/character_158.png rename to mods/skinsdb/textures/character.158.png diff --git a/mods/skinsdb/textures/character_1580.png b/mods/skinsdb/textures/character.1580.png similarity index 100% rename from mods/skinsdb/textures/character_1580.png rename to mods/skinsdb/textures/character.1580.png diff --git a/mods/skinsdb/textures/character_1581.png b/mods/skinsdb/textures/character.1581.png similarity index 100% rename from mods/skinsdb/textures/character_1581.png rename to mods/skinsdb/textures/character.1581.png diff --git a/mods/skinsdb/textures/character_1582.png b/mods/skinsdb/textures/character.1582.png similarity index 100% rename from mods/skinsdb/textures/character_1582.png rename to mods/skinsdb/textures/character.1582.png diff --git a/mods/skinsdb/textures/character_1583.png b/mods/skinsdb/textures/character.1583.png similarity index 100% rename from mods/skinsdb/textures/character_1583.png rename to mods/skinsdb/textures/character.1583.png diff --git a/mods/skinsdb/textures/character_1584.png b/mods/skinsdb/textures/character.1584.png similarity index 100% rename from mods/skinsdb/textures/character_1584.png rename to mods/skinsdb/textures/character.1584.png diff --git a/mods/skinsdb/textures/character_1585.png b/mods/skinsdb/textures/character.1585.png similarity index 100% rename from mods/skinsdb/textures/character_1585.png rename to mods/skinsdb/textures/character.1585.png diff --git a/mods/skinsdb/textures/character_1586.png b/mods/skinsdb/textures/character.1586.png similarity index 100% rename from mods/skinsdb/textures/character_1586.png rename to mods/skinsdb/textures/character.1586.png diff --git a/mods/skinsdb/textures/character_1587.png b/mods/skinsdb/textures/character.1587.png similarity index 100% rename from mods/skinsdb/textures/character_1587.png rename to mods/skinsdb/textures/character.1587.png diff --git a/mods/skinsdb/textures/character_1588.png b/mods/skinsdb/textures/character.1588.png similarity index 100% rename from mods/skinsdb/textures/character_1588.png rename to mods/skinsdb/textures/character.1588.png diff --git a/mods/skinsdb/textures/character_1589.png b/mods/skinsdb/textures/character.1589.png similarity index 100% rename from mods/skinsdb/textures/character_1589.png rename to mods/skinsdb/textures/character.1589.png diff --git a/mods/skinsdb/textures/character_159.png b/mods/skinsdb/textures/character.159.png similarity index 100% rename from mods/skinsdb/textures/character_159.png rename to mods/skinsdb/textures/character.159.png diff --git a/mods/skinsdb/textures/character_1590.png b/mods/skinsdb/textures/character.1590.png similarity index 100% rename from mods/skinsdb/textures/character_1590.png rename to mods/skinsdb/textures/character.1590.png diff --git a/mods/skinsdb/textures/character_1591.png b/mods/skinsdb/textures/character.1591.png similarity index 100% rename from mods/skinsdb/textures/character_1591.png rename to mods/skinsdb/textures/character.1591.png diff --git a/mods/skinsdb/textures/character_1592.png b/mods/skinsdb/textures/character.1592.png similarity index 100% rename from mods/skinsdb/textures/character_1592.png rename to mods/skinsdb/textures/character.1592.png diff --git a/mods/skinsdb/textures/character_1593.png b/mods/skinsdb/textures/character.1593.png similarity index 100% rename from mods/skinsdb/textures/character_1593.png rename to mods/skinsdb/textures/character.1593.png diff --git a/mods/skinsdb/textures/character_1594.png b/mods/skinsdb/textures/character.1594.png similarity index 100% rename from mods/skinsdb/textures/character_1594.png rename to mods/skinsdb/textures/character.1594.png diff --git a/mods/skinsdb/textures/character_1595.png b/mods/skinsdb/textures/character.1595.png similarity index 100% rename from mods/skinsdb/textures/character_1595.png rename to mods/skinsdb/textures/character.1595.png diff --git a/mods/skinsdb/textures/character_1596.png b/mods/skinsdb/textures/character.1596.png similarity index 100% rename from mods/skinsdb/textures/character_1596.png rename to mods/skinsdb/textures/character.1596.png diff --git a/mods/skinsdb/textures/character_1597.png b/mods/skinsdb/textures/character.1597.png similarity index 100% rename from mods/skinsdb/textures/character_1597.png rename to mods/skinsdb/textures/character.1597.png diff --git a/mods/skinsdb/textures/character_1598.png b/mods/skinsdb/textures/character.1598.png similarity index 100% rename from mods/skinsdb/textures/character_1598.png rename to mods/skinsdb/textures/character.1598.png diff --git a/mods/skinsdb/textures/character_1599.png b/mods/skinsdb/textures/character.1599.png similarity index 100% rename from mods/skinsdb/textures/character_1599.png rename to mods/skinsdb/textures/character.1599.png diff --git a/mods/skinsdb/textures/character_160.png b/mods/skinsdb/textures/character.160.png similarity index 100% rename from mods/skinsdb/textures/character_160.png rename to mods/skinsdb/textures/character.160.png diff --git a/mods/skinsdb/textures/character_1600.png b/mods/skinsdb/textures/character.1600.png similarity index 100% rename from mods/skinsdb/textures/character_1600.png rename to mods/skinsdb/textures/character.1600.png diff --git a/mods/skinsdb/textures/character_1601.png b/mods/skinsdb/textures/character.1601.png similarity index 100% rename from mods/skinsdb/textures/character_1601.png rename to mods/skinsdb/textures/character.1601.png diff --git a/mods/skinsdb/textures/character_1602.png b/mods/skinsdb/textures/character.1602.png similarity index 100% rename from mods/skinsdb/textures/character_1602.png rename to mods/skinsdb/textures/character.1602.png diff --git a/mods/skinsdb/textures/character_1603.png b/mods/skinsdb/textures/character.1603.png similarity index 100% rename from mods/skinsdb/textures/character_1603.png rename to mods/skinsdb/textures/character.1603.png diff --git a/mods/skinsdb/textures/character_1604.png b/mods/skinsdb/textures/character.1604.png similarity index 100% rename from mods/skinsdb/textures/character_1604.png rename to mods/skinsdb/textures/character.1604.png diff --git a/mods/skinsdb/textures/character_1605.png b/mods/skinsdb/textures/character.1605.png similarity index 100% rename from mods/skinsdb/textures/character_1605.png rename to mods/skinsdb/textures/character.1605.png diff --git a/mods/skinsdb/textures/character_1606.png b/mods/skinsdb/textures/character.1606.png similarity index 100% rename from mods/skinsdb/textures/character_1606.png rename to mods/skinsdb/textures/character.1606.png diff --git a/mods/skinsdb/textures/character_1607.png b/mods/skinsdb/textures/character.1607.png similarity index 100% rename from mods/skinsdb/textures/character_1607.png rename to mods/skinsdb/textures/character.1607.png diff --git a/mods/skinsdb/textures/character_1608.png b/mods/skinsdb/textures/character.1608.png similarity index 100% rename from mods/skinsdb/textures/character_1608.png rename to mods/skinsdb/textures/character.1608.png diff --git a/mods/skinsdb/textures/character_1609.png b/mods/skinsdb/textures/character.1609.png similarity index 100% rename from mods/skinsdb/textures/character_1609.png rename to mods/skinsdb/textures/character.1609.png diff --git a/mods/skinsdb/textures/character_161.png b/mods/skinsdb/textures/character.161.png similarity index 100% rename from mods/skinsdb/textures/character_161.png rename to mods/skinsdb/textures/character.161.png diff --git a/mods/skinsdb/textures/character_1610.png b/mods/skinsdb/textures/character.1610.png similarity index 100% rename from mods/skinsdb/textures/character_1610.png rename to mods/skinsdb/textures/character.1610.png diff --git a/mods/skinsdb/textures/character_1611.png b/mods/skinsdb/textures/character.1611.png similarity index 100% rename from mods/skinsdb/textures/character_1611.png rename to mods/skinsdb/textures/character.1611.png diff --git a/mods/skinsdb/textures/character_1612.png b/mods/skinsdb/textures/character.1612.png similarity index 100% rename from mods/skinsdb/textures/character_1612.png rename to mods/skinsdb/textures/character.1612.png diff --git a/mods/skinsdb/textures/character_1613.png b/mods/skinsdb/textures/character.1613.png similarity index 100% rename from mods/skinsdb/textures/character_1613.png rename to mods/skinsdb/textures/character.1613.png diff --git a/mods/skinsdb/textures/character_1614.png b/mods/skinsdb/textures/character.1614.png similarity index 100% rename from mods/skinsdb/textures/character_1614.png rename to mods/skinsdb/textures/character.1614.png diff --git a/mods/skinsdb/textures/character_1615.png b/mods/skinsdb/textures/character.1615.png similarity index 100% rename from mods/skinsdb/textures/character_1615.png rename to mods/skinsdb/textures/character.1615.png diff --git a/mods/skinsdb/textures/character_1616.png b/mods/skinsdb/textures/character.1616.png similarity index 100% rename from mods/skinsdb/textures/character_1616.png rename to mods/skinsdb/textures/character.1616.png diff --git a/mods/skinsdb/textures/character_1617.png b/mods/skinsdb/textures/character.1617.png similarity index 100% rename from mods/skinsdb/textures/character_1617.png rename to mods/skinsdb/textures/character.1617.png diff --git a/mods/skinsdb/textures/character_1618.png b/mods/skinsdb/textures/character.1618.png similarity index 100% rename from mods/skinsdb/textures/character_1618.png rename to mods/skinsdb/textures/character.1618.png diff --git a/mods/skinsdb/textures/character_1619.png b/mods/skinsdb/textures/character.1619.png similarity index 100% rename from mods/skinsdb/textures/character_1619.png rename to mods/skinsdb/textures/character.1619.png diff --git a/mods/skinsdb/textures/character_162.png b/mods/skinsdb/textures/character.162.png similarity index 100% rename from mods/skinsdb/textures/character_162.png rename to mods/skinsdb/textures/character.162.png diff --git a/mods/skinsdb/textures/character_1620.png b/mods/skinsdb/textures/character.1620.png similarity index 100% rename from mods/skinsdb/textures/character_1620.png rename to mods/skinsdb/textures/character.1620.png diff --git a/mods/skinsdb/textures/character_1621.png b/mods/skinsdb/textures/character.1621.png similarity index 100% rename from mods/skinsdb/textures/character_1621.png rename to mods/skinsdb/textures/character.1621.png diff --git a/mods/skinsdb/textures/character_1622.png b/mods/skinsdb/textures/character.1622.png similarity index 100% rename from mods/skinsdb/textures/character_1622.png rename to mods/skinsdb/textures/character.1622.png diff --git a/mods/skinsdb/textures/character_1623.png b/mods/skinsdb/textures/character.1623.png similarity index 100% rename from mods/skinsdb/textures/character_1623.png rename to mods/skinsdb/textures/character.1623.png diff --git a/mods/skinsdb/textures/character_1624.png b/mods/skinsdb/textures/character.1624.png similarity index 100% rename from mods/skinsdb/textures/character_1624.png rename to mods/skinsdb/textures/character.1624.png diff --git a/mods/skinsdb/textures/character_1625.png b/mods/skinsdb/textures/character.1625.png similarity index 100% rename from mods/skinsdb/textures/character_1625.png rename to mods/skinsdb/textures/character.1625.png diff --git a/mods/skinsdb/textures/character_1626.png b/mods/skinsdb/textures/character.1626.png similarity index 100% rename from mods/skinsdb/textures/character_1626.png rename to mods/skinsdb/textures/character.1626.png diff --git a/mods/skinsdb/textures/character_1627.png b/mods/skinsdb/textures/character.1627.png similarity index 100% rename from mods/skinsdb/textures/character_1627.png rename to mods/skinsdb/textures/character.1627.png diff --git a/mods/skinsdb/textures/character_1628.png b/mods/skinsdb/textures/character.1628.png similarity index 100% rename from mods/skinsdb/textures/character_1628.png rename to mods/skinsdb/textures/character.1628.png diff --git a/mods/skinsdb/textures/character_1629.png b/mods/skinsdb/textures/character.1629.png similarity index 100% rename from mods/skinsdb/textures/character_1629.png rename to mods/skinsdb/textures/character.1629.png diff --git a/mods/skinsdb/textures/character_163.png b/mods/skinsdb/textures/character.163.png similarity index 100% rename from mods/skinsdb/textures/character_163.png rename to mods/skinsdb/textures/character.163.png diff --git a/mods/skinsdb/textures/character_1630.png b/mods/skinsdb/textures/character.1630.png similarity index 100% rename from mods/skinsdb/textures/character_1630.png rename to mods/skinsdb/textures/character.1630.png diff --git a/mods/skinsdb/textures/character_1631.png b/mods/skinsdb/textures/character.1631.png similarity index 100% rename from mods/skinsdb/textures/character_1631.png rename to mods/skinsdb/textures/character.1631.png diff --git a/mods/skinsdb/textures/character_1632.png b/mods/skinsdb/textures/character.1632.png similarity index 100% rename from mods/skinsdb/textures/character_1632.png rename to mods/skinsdb/textures/character.1632.png diff --git a/mods/skinsdb/textures/character_1633.png b/mods/skinsdb/textures/character.1633.png similarity index 100% rename from mods/skinsdb/textures/character_1633.png rename to mods/skinsdb/textures/character.1633.png diff --git a/mods/skinsdb/textures/character_1634.png b/mods/skinsdb/textures/character.1634.png similarity index 100% rename from mods/skinsdb/textures/character_1634.png rename to mods/skinsdb/textures/character.1634.png diff --git a/mods/skinsdb/textures/character_1635.png b/mods/skinsdb/textures/character.1635.png similarity index 100% rename from mods/skinsdb/textures/character_1635.png rename to mods/skinsdb/textures/character.1635.png diff --git a/mods/skinsdb/textures/character_1636.png b/mods/skinsdb/textures/character.1636.png similarity index 100% rename from mods/skinsdb/textures/character_1636.png rename to mods/skinsdb/textures/character.1636.png diff --git a/mods/skinsdb/textures/character_1637.png b/mods/skinsdb/textures/character.1637.png similarity index 100% rename from mods/skinsdb/textures/character_1637.png rename to mods/skinsdb/textures/character.1637.png diff --git a/mods/skinsdb/textures/character_1638.png b/mods/skinsdb/textures/character.1638.png similarity index 100% rename from mods/skinsdb/textures/character_1638.png rename to mods/skinsdb/textures/character.1638.png diff --git a/mods/skinsdb/textures/character_1639.png b/mods/skinsdb/textures/character.1639.png similarity index 100% rename from mods/skinsdb/textures/character_1639.png rename to mods/skinsdb/textures/character.1639.png diff --git a/mods/skinsdb/textures/character_164.png b/mods/skinsdb/textures/character.164.png similarity index 100% rename from mods/skinsdb/textures/character_164.png rename to mods/skinsdb/textures/character.164.png diff --git a/mods/skinsdb/textures/character_1640.png b/mods/skinsdb/textures/character.1640.png similarity index 100% rename from mods/skinsdb/textures/character_1640.png rename to mods/skinsdb/textures/character.1640.png diff --git a/mods/skinsdb/textures/character_1641.png b/mods/skinsdb/textures/character.1641.png similarity index 100% rename from mods/skinsdb/textures/character_1641.png rename to mods/skinsdb/textures/character.1641.png diff --git a/mods/skinsdb/textures/character_1642.png b/mods/skinsdb/textures/character.1642.png similarity index 100% rename from mods/skinsdb/textures/character_1642.png rename to mods/skinsdb/textures/character.1642.png diff --git a/mods/skinsdb/textures/character_1643.png b/mods/skinsdb/textures/character.1643.png similarity index 100% rename from mods/skinsdb/textures/character_1643.png rename to mods/skinsdb/textures/character.1643.png diff --git a/mods/skinsdb/textures/character_1644.png b/mods/skinsdb/textures/character.1644.png similarity index 100% rename from mods/skinsdb/textures/character_1644.png rename to mods/skinsdb/textures/character.1644.png diff --git a/mods/skinsdb/textures/character_1645.png b/mods/skinsdb/textures/character.1645.png similarity index 100% rename from mods/skinsdb/textures/character_1645.png rename to mods/skinsdb/textures/character.1645.png diff --git a/mods/skinsdb/textures/character_1646.png b/mods/skinsdb/textures/character.1646.png similarity index 100% rename from mods/skinsdb/textures/character_1646.png rename to mods/skinsdb/textures/character.1646.png diff --git a/mods/skinsdb/textures/character_1647.png b/mods/skinsdb/textures/character.1647.png similarity index 100% rename from mods/skinsdb/textures/character_1647.png rename to mods/skinsdb/textures/character.1647.png diff --git a/mods/skinsdb/textures/character_1648.png b/mods/skinsdb/textures/character.1648.png similarity index 100% rename from mods/skinsdb/textures/character_1648.png rename to mods/skinsdb/textures/character.1648.png diff --git a/mods/skinsdb/textures/character_1649.png b/mods/skinsdb/textures/character.1649.png similarity index 100% rename from mods/skinsdb/textures/character_1649.png rename to mods/skinsdb/textures/character.1649.png diff --git a/mods/skinsdb/textures/character_165.png b/mods/skinsdb/textures/character.165.png similarity index 100% rename from mods/skinsdb/textures/character_165.png rename to mods/skinsdb/textures/character.165.png diff --git a/mods/skinsdb/textures/character_1650.png b/mods/skinsdb/textures/character.1650.png similarity index 100% rename from mods/skinsdb/textures/character_1650.png rename to mods/skinsdb/textures/character.1650.png diff --git a/mods/skinsdb/textures/character_1651.png b/mods/skinsdb/textures/character.1651.png similarity index 100% rename from mods/skinsdb/textures/character_1651.png rename to mods/skinsdb/textures/character.1651.png diff --git a/mods/skinsdb/textures/character_1652.png b/mods/skinsdb/textures/character.1652.png similarity index 100% rename from mods/skinsdb/textures/character_1652.png rename to mods/skinsdb/textures/character.1652.png diff --git a/mods/skinsdb/textures/character_1653.png b/mods/skinsdb/textures/character.1653.png similarity index 100% rename from mods/skinsdb/textures/character_1653.png rename to mods/skinsdb/textures/character.1653.png diff --git a/mods/skinsdb/textures/character_1654.png b/mods/skinsdb/textures/character.1654.png similarity index 100% rename from mods/skinsdb/textures/character_1654.png rename to mods/skinsdb/textures/character.1654.png diff --git a/mods/skinsdb/textures/character_1655.png b/mods/skinsdb/textures/character.1655.png similarity index 100% rename from mods/skinsdb/textures/character_1655.png rename to mods/skinsdb/textures/character.1655.png diff --git a/mods/skinsdb/textures/character_1656.png b/mods/skinsdb/textures/character.1656.png similarity index 100% rename from mods/skinsdb/textures/character_1656.png rename to mods/skinsdb/textures/character.1656.png diff --git a/mods/skinsdb/textures/character_1657.png b/mods/skinsdb/textures/character.1657.png similarity index 100% rename from mods/skinsdb/textures/character_1657.png rename to mods/skinsdb/textures/character.1657.png diff --git a/mods/skinsdb/textures/character_1658.png b/mods/skinsdb/textures/character.1658.png similarity index 100% rename from mods/skinsdb/textures/character_1658.png rename to mods/skinsdb/textures/character.1658.png diff --git a/mods/skinsdb/textures/character_1659.png b/mods/skinsdb/textures/character.1659.png similarity index 100% rename from mods/skinsdb/textures/character_1659.png rename to mods/skinsdb/textures/character.1659.png diff --git a/mods/skinsdb/textures/character_166.png b/mods/skinsdb/textures/character.166.png similarity index 100% rename from mods/skinsdb/textures/character_166.png rename to mods/skinsdb/textures/character.166.png diff --git a/mods/skinsdb/textures/character_1660.png b/mods/skinsdb/textures/character.1660.png similarity index 100% rename from mods/skinsdb/textures/character_1660.png rename to mods/skinsdb/textures/character.1660.png diff --git a/mods/skinsdb/textures/character_1661.png b/mods/skinsdb/textures/character.1661.png similarity index 100% rename from mods/skinsdb/textures/character_1661.png rename to mods/skinsdb/textures/character.1661.png diff --git a/mods/skinsdb/textures/character_1662.png b/mods/skinsdb/textures/character.1662.png similarity index 100% rename from mods/skinsdb/textures/character_1662.png rename to mods/skinsdb/textures/character.1662.png diff --git a/mods/skinsdb/textures/character_1663.png b/mods/skinsdb/textures/character.1663.png similarity index 100% rename from mods/skinsdb/textures/character_1663.png rename to mods/skinsdb/textures/character.1663.png diff --git a/mods/skinsdb/textures/character_1664.png b/mods/skinsdb/textures/character.1664.png similarity index 100% rename from mods/skinsdb/textures/character_1664.png rename to mods/skinsdb/textures/character.1664.png diff --git a/mods/skinsdb/textures/character_1665.png b/mods/skinsdb/textures/character.1665.png similarity index 100% rename from mods/skinsdb/textures/character_1665.png rename to mods/skinsdb/textures/character.1665.png diff --git a/mods/skinsdb/textures/character_1666.png b/mods/skinsdb/textures/character.1666.png similarity index 100% rename from mods/skinsdb/textures/character_1666.png rename to mods/skinsdb/textures/character.1666.png diff --git a/mods/skinsdb/textures/character_1667.png b/mods/skinsdb/textures/character.1667.png similarity index 100% rename from mods/skinsdb/textures/character_1667.png rename to mods/skinsdb/textures/character.1667.png diff --git a/mods/skinsdb/textures/character_1668.png b/mods/skinsdb/textures/character.1668.png similarity index 100% rename from mods/skinsdb/textures/character_1668.png rename to mods/skinsdb/textures/character.1668.png diff --git a/mods/skinsdb/textures/character_1669.png b/mods/skinsdb/textures/character.1669.png similarity index 100% rename from mods/skinsdb/textures/character_1669.png rename to mods/skinsdb/textures/character.1669.png diff --git a/mods/skinsdb/textures/character_167.png b/mods/skinsdb/textures/character.167.png similarity index 100% rename from mods/skinsdb/textures/character_167.png rename to mods/skinsdb/textures/character.167.png diff --git a/mods/skinsdb/textures/character_1670.png b/mods/skinsdb/textures/character.1670.png similarity index 100% rename from mods/skinsdb/textures/character_1670.png rename to mods/skinsdb/textures/character.1670.png diff --git a/mods/skinsdb/textures/character_1671.png b/mods/skinsdb/textures/character.1671.png similarity index 100% rename from mods/skinsdb/textures/character_1671.png rename to mods/skinsdb/textures/character.1671.png diff --git a/mods/skinsdb/textures/character_1672.png b/mods/skinsdb/textures/character.1672.png similarity index 100% rename from mods/skinsdb/textures/character_1672.png rename to mods/skinsdb/textures/character.1672.png diff --git a/mods/skinsdb/textures/character_1673.png b/mods/skinsdb/textures/character.1673.png similarity index 100% rename from mods/skinsdb/textures/character_1673.png rename to mods/skinsdb/textures/character.1673.png diff --git a/mods/skinsdb/textures/character_1674.png b/mods/skinsdb/textures/character.1674.png similarity index 100% rename from mods/skinsdb/textures/character_1674.png rename to mods/skinsdb/textures/character.1674.png diff --git a/mods/skinsdb/textures/character_1675.png b/mods/skinsdb/textures/character.1675.png similarity index 100% rename from mods/skinsdb/textures/character_1675.png rename to mods/skinsdb/textures/character.1675.png diff --git a/mods/skinsdb/textures/character_1676.png b/mods/skinsdb/textures/character.1676.png similarity index 100% rename from mods/skinsdb/textures/character_1676.png rename to mods/skinsdb/textures/character.1676.png diff --git a/mods/skinsdb/textures/character_1677.png b/mods/skinsdb/textures/character.1677.png similarity index 100% rename from mods/skinsdb/textures/character_1677.png rename to mods/skinsdb/textures/character.1677.png diff --git a/mods/skinsdb/textures/character_1678.png b/mods/skinsdb/textures/character.1678.png similarity index 100% rename from mods/skinsdb/textures/character_1678.png rename to mods/skinsdb/textures/character.1678.png diff --git a/mods/skinsdb/textures/character_1679.png b/mods/skinsdb/textures/character.1679.png similarity index 100% rename from mods/skinsdb/textures/character_1679.png rename to mods/skinsdb/textures/character.1679.png diff --git a/mods/skinsdb/textures/character_168.png b/mods/skinsdb/textures/character.168.png similarity index 100% rename from mods/skinsdb/textures/character_168.png rename to mods/skinsdb/textures/character.168.png diff --git a/mods/skinsdb/textures/character_1680.png b/mods/skinsdb/textures/character.1680.png similarity index 100% rename from mods/skinsdb/textures/character_1680.png rename to mods/skinsdb/textures/character.1680.png diff --git a/mods/skinsdb/textures/character_1681.png b/mods/skinsdb/textures/character.1681.png similarity index 100% rename from mods/skinsdb/textures/character_1681.png rename to mods/skinsdb/textures/character.1681.png diff --git a/mods/skinsdb/textures/character_1682.png b/mods/skinsdb/textures/character.1682.png similarity index 100% rename from mods/skinsdb/textures/character_1682.png rename to mods/skinsdb/textures/character.1682.png diff --git a/mods/skinsdb/textures/character_1683.png b/mods/skinsdb/textures/character.1683.png similarity index 100% rename from mods/skinsdb/textures/character_1683.png rename to mods/skinsdb/textures/character.1683.png diff --git a/mods/skinsdb/textures/character_1684.png b/mods/skinsdb/textures/character.1684.png similarity index 100% rename from mods/skinsdb/textures/character_1684.png rename to mods/skinsdb/textures/character.1684.png diff --git a/mods/skinsdb/textures/character_1685.png b/mods/skinsdb/textures/character.1685.png similarity index 100% rename from mods/skinsdb/textures/character_1685.png rename to mods/skinsdb/textures/character.1685.png diff --git a/mods/skinsdb/textures/character_1686.png b/mods/skinsdb/textures/character.1686.png similarity index 100% rename from mods/skinsdb/textures/character_1686.png rename to mods/skinsdb/textures/character.1686.png diff --git a/mods/skinsdb/textures/character_1687.png b/mods/skinsdb/textures/character.1687.png similarity index 100% rename from mods/skinsdb/textures/character_1687.png rename to mods/skinsdb/textures/character.1687.png diff --git a/mods/skinsdb/textures/character_1688.png b/mods/skinsdb/textures/character.1688.png similarity index 100% rename from mods/skinsdb/textures/character_1688.png rename to mods/skinsdb/textures/character.1688.png diff --git a/mods/skinsdb/textures/character_1689.png b/mods/skinsdb/textures/character.1689.png similarity index 100% rename from mods/skinsdb/textures/character_1689.png rename to mods/skinsdb/textures/character.1689.png diff --git a/mods/skinsdb/textures/character_169.png b/mods/skinsdb/textures/character.169.png similarity index 100% rename from mods/skinsdb/textures/character_169.png rename to mods/skinsdb/textures/character.169.png diff --git a/mods/skinsdb/textures/character_1690.png b/mods/skinsdb/textures/character.1690.png similarity index 100% rename from mods/skinsdb/textures/character_1690.png rename to mods/skinsdb/textures/character.1690.png diff --git a/mods/skinsdb/textures/character_1691.png b/mods/skinsdb/textures/character.1691.png similarity index 100% rename from mods/skinsdb/textures/character_1691.png rename to mods/skinsdb/textures/character.1691.png diff --git a/mods/skinsdb/textures/character_1692.png b/mods/skinsdb/textures/character.1692.png similarity index 100% rename from mods/skinsdb/textures/character_1692.png rename to mods/skinsdb/textures/character.1692.png diff --git a/mods/skinsdb/textures/character_1693.png b/mods/skinsdb/textures/character.1693.png similarity index 100% rename from mods/skinsdb/textures/character_1693.png rename to mods/skinsdb/textures/character.1693.png diff --git a/mods/skinsdb/textures/character_1694.png b/mods/skinsdb/textures/character.1694.png similarity index 100% rename from mods/skinsdb/textures/character_1694.png rename to mods/skinsdb/textures/character.1694.png diff --git a/mods/skinsdb/textures/character_1695.png b/mods/skinsdb/textures/character.1695.png similarity index 100% rename from mods/skinsdb/textures/character_1695.png rename to mods/skinsdb/textures/character.1695.png diff --git a/mods/skinsdb/textures/character_1696.png b/mods/skinsdb/textures/character.1696.png similarity index 100% rename from mods/skinsdb/textures/character_1696.png rename to mods/skinsdb/textures/character.1696.png diff --git a/mods/skinsdb/textures/character_1697.png b/mods/skinsdb/textures/character.1697.png similarity index 100% rename from mods/skinsdb/textures/character_1697.png rename to mods/skinsdb/textures/character.1697.png diff --git a/mods/skinsdb/textures/character_1698.png b/mods/skinsdb/textures/character.1698.png similarity index 100% rename from mods/skinsdb/textures/character_1698.png rename to mods/skinsdb/textures/character.1698.png diff --git a/mods/skinsdb/textures/character_1699.png b/mods/skinsdb/textures/character.1699.png similarity index 100% rename from mods/skinsdb/textures/character_1699.png rename to mods/skinsdb/textures/character.1699.png diff --git a/mods/skinsdb/textures/character_170.png b/mods/skinsdb/textures/character.170.png similarity index 100% rename from mods/skinsdb/textures/character_170.png rename to mods/skinsdb/textures/character.170.png diff --git a/mods/skinsdb/textures/character_1700.png b/mods/skinsdb/textures/character.1700.png similarity index 100% rename from mods/skinsdb/textures/character_1700.png rename to mods/skinsdb/textures/character.1700.png diff --git a/mods/skinsdb/textures/character_1701.png b/mods/skinsdb/textures/character.1701.png similarity index 100% rename from mods/skinsdb/textures/character_1701.png rename to mods/skinsdb/textures/character.1701.png diff --git a/mods/skinsdb/textures/character_1702.png b/mods/skinsdb/textures/character.1702.png similarity index 100% rename from mods/skinsdb/textures/character_1702.png rename to mods/skinsdb/textures/character.1702.png diff --git a/mods/skinsdb/textures/character_1703.png b/mods/skinsdb/textures/character.1703.png similarity index 100% rename from mods/skinsdb/textures/character_1703.png rename to mods/skinsdb/textures/character.1703.png diff --git a/mods/skinsdb/textures/character_1704.png b/mods/skinsdb/textures/character.1704.png similarity index 100% rename from mods/skinsdb/textures/character_1704.png rename to mods/skinsdb/textures/character.1704.png diff --git a/mods/skinsdb/textures/character_1705.png b/mods/skinsdb/textures/character.1705.png similarity index 100% rename from mods/skinsdb/textures/character_1705.png rename to mods/skinsdb/textures/character.1705.png diff --git a/mods/skinsdb/textures/character_1706.png b/mods/skinsdb/textures/character.1706.png similarity index 100% rename from mods/skinsdb/textures/character_1706.png rename to mods/skinsdb/textures/character.1706.png diff --git a/mods/skinsdb/textures/character_1707.png b/mods/skinsdb/textures/character.1707.png similarity index 100% rename from mods/skinsdb/textures/character_1707.png rename to mods/skinsdb/textures/character.1707.png diff --git a/mods/skinsdb/textures/character_1708.png b/mods/skinsdb/textures/character.1708.png similarity index 100% rename from mods/skinsdb/textures/character_1708.png rename to mods/skinsdb/textures/character.1708.png diff --git a/mods/skinsdb/textures/character_1709.png b/mods/skinsdb/textures/character.1709.png similarity index 100% rename from mods/skinsdb/textures/character_1709.png rename to mods/skinsdb/textures/character.1709.png diff --git a/mods/skinsdb/textures/character_171.png b/mods/skinsdb/textures/character.171.png similarity index 100% rename from mods/skinsdb/textures/character_171.png rename to mods/skinsdb/textures/character.171.png diff --git a/mods/skinsdb/textures/character_1710.png b/mods/skinsdb/textures/character.1710.png similarity index 100% rename from mods/skinsdb/textures/character_1710.png rename to mods/skinsdb/textures/character.1710.png diff --git a/mods/skinsdb/textures/character_1711.png b/mods/skinsdb/textures/character.1711.png similarity index 100% rename from mods/skinsdb/textures/character_1711.png rename to mods/skinsdb/textures/character.1711.png diff --git a/mods/skinsdb/textures/character_1712.png b/mods/skinsdb/textures/character.1712.png similarity index 100% rename from mods/skinsdb/textures/character_1712.png rename to mods/skinsdb/textures/character.1712.png diff --git a/mods/skinsdb/textures/character_1713.png b/mods/skinsdb/textures/character.1713.png similarity index 100% rename from mods/skinsdb/textures/character_1713.png rename to mods/skinsdb/textures/character.1713.png diff --git a/mods/skinsdb/textures/character_1714.png b/mods/skinsdb/textures/character.1714.png similarity index 100% rename from mods/skinsdb/textures/character_1714.png rename to mods/skinsdb/textures/character.1714.png diff --git a/mods/skinsdb/textures/character_1715.png b/mods/skinsdb/textures/character.1715.png similarity index 100% rename from mods/skinsdb/textures/character_1715.png rename to mods/skinsdb/textures/character.1715.png diff --git a/mods/skinsdb/textures/character_1716.png b/mods/skinsdb/textures/character.1716.png similarity index 100% rename from mods/skinsdb/textures/character_1716.png rename to mods/skinsdb/textures/character.1716.png diff --git a/mods/skinsdb/textures/character_1717.png b/mods/skinsdb/textures/character.1717.png similarity index 100% rename from mods/skinsdb/textures/character_1717.png rename to mods/skinsdb/textures/character.1717.png diff --git a/mods/skinsdb/textures/character_1718.png b/mods/skinsdb/textures/character.1718.png similarity index 100% rename from mods/skinsdb/textures/character_1718.png rename to mods/skinsdb/textures/character.1718.png diff --git a/mods/skinsdb/textures/character_1719.png b/mods/skinsdb/textures/character.1719.png similarity index 100% rename from mods/skinsdb/textures/character_1719.png rename to mods/skinsdb/textures/character.1719.png diff --git a/mods/skinsdb/textures/character_172.png b/mods/skinsdb/textures/character.172.png similarity index 100% rename from mods/skinsdb/textures/character_172.png rename to mods/skinsdb/textures/character.172.png diff --git a/mods/skinsdb/textures/character_1720.png b/mods/skinsdb/textures/character.1720.png similarity index 100% rename from mods/skinsdb/textures/character_1720.png rename to mods/skinsdb/textures/character.1720.png diff --git a/mods/skinsdb/textures/character_1721.png b/mods/skinsdb/textures/character.1721.png similarity index 100% rename from mods/skinsdb/textures/character_1721.png rename to mods/skinsdb/textures/character.1721.png diff --git a/mods/skinsdb/textures/character_1722.png b/mods/skinsdb/textures/character.1722.png similarity index 100% rename from mods/skinsdb/textures/character_1722.png rename to mods/skinsdb/textures/character.1722.png diff --git a/mods/skinsdb/textures/character_1723.png b/mods/skinsdb/textures/character.1723.png similarity index 100% rename from mods/skinsdb/textures/character_1723.png rename to mods/skinsdb/textures/character.1723.png diff --git a/mods/skinsdb/textures/character_1724.png b/mods/skinsdb/textures/character.1724.png similarity index 100% rename from mods/skinsdb/textures/character_1724.png rename to mods/skinsdb/textures/character.1724.png diff --git a/mods/skinsdb/textures/character_1725.png b/mods/skinsdb/textures/character.1725.png similarity index 100% rename from mods/skinsdb/textures/character_1725.png rename to mods/skinsdb/textures/character.1725.png diff --git a/mods/skinsdb/textures/character_1726.png b/mods/skinsdb/textures/character.1726.png similarity index 100% rename from mods/skinsdb/textures/character_1726.png rename to mods/skinsdb/textures/character.1726.png diff --git a/mods/skinsdb/textures/character_1727.png b/mods/skinsdb/textures/character.1727.png similarity index 100% rename from mods/skinsdb/textures/character_1727.png rename to mods/skinsdb/textures/character.1727.png diff --git a/mods/skinsdb/textures/character_1728.png b/mods/skinsdb/textures/character.1728.png similarity index 100% rename from mods/skinsdb/textures/character_1728.png rename to mods/skinsdb/textures/character.1728.png diff --git a/mods/skinsdb/textures/character_1729.png b/mods/skinsdb/textures/character.1729.png similarity index 100% rename from mods/skinsdb/textures/character_1729.png rename to mods/skinsdb/textures/character.1729.png diff --git a/mods/skinsdb/textures/character_173.png b/mods/skinsdb/textures/character.173.png similarity index 100% rename from mods/skinsdb/textures/character_173.png rename to mods/skinsdb/textures/character.173.png diff --git a/mods/skinsdb/textures/character_1730.png b/mods/skinsdb/textures/character.1730.png similarity index 100% rename from mods/skinsdb/textures/character_1730.png rename to mods/skinsdb/textures/character.1730.png diff --git a/mods/skinsdb/textures/character_1731.png b/mods/skinsdb/textures/character.1731.png similarity index 100% rename from mods/skinsdb/textures/character_1731.png rename to mods/skinsdb/textures/character.1731.png diff --git a/mods/skinsdb/textures/character_1732.png b/mods/skinsdb/textures/character.1732.png similarity index 100% rename from mods/skinsdb/textures/character_1732.png rename to mods/skinsdb/textures/character.1732.png diff --git a/mods/skinsdb/textures/character_1733.png b/mods/skinsdb/textures/character.1733.png similarity index 100% rename from mods/skinsdb/textures/character_1733.png rename to mods/skinsdb/textures/character.1733.png diff --git a/mods/skinsdb/textures/character_1734.png b/mods/skinsdb/textures/character.1734.png similarity index 100% rename from mods/skinsdb/textures/character_1734.png rename to mods/skinsdb/textures/character.1734.png diff --git a/mods/skinsdb/textures/character_1735.png b/mods/skinsdb/textures/character.1735.png similarity index 100% rename from mods/skinsdb/textures/character_1735.png rename to mods/skinsdb/textures/character.1735.png diff --git a/mods/skinsdb/textures/character_1736.png b/mods/skinsdb/textures/character.1736.png similarity index 100% rename from mods/skinsdb/textures/character_1736.png rename to mods/skinsdb/textures/character.1736.png diff --git a/mods/skinsdb/textures/character_1737.png b/mods/skinsdb/textures/character.1737.png similarity index 100% rename from mods/skinsdb/textures/character_1737.png rename to mods/skinsdb/textures/character.1737.png diff --git a/mods/skinsdb/textures/character_1738.png b/mods/skinsdb/textures/character.1738.png similarity index 100% rename from mods/skinsdb/textures/character_1738.png rename to mods/skinsdb/textures/character.1738.png diff --git a/mods/skinsdb/textures/character_1739.png b/mods/skinsdb/textures/character.1739.png similarity index 100% rename from mods/skinsdb/textures/character_1739.png rename to mods/skinsdb/textures/character.1739.png diff --git a/mods/skinsdb/textures/character_174.png b/mods/skinsdb/textures/character.174.png similarity index 100% rename from mods/skinsdb/textures/character_174.png rename to mods/skinsdb/textures/character.174.png diff --git a/mods/skinsdb/textures/character_1740.png b/mods/skinsdb/textures/character.1740.png similarity index 100% rename from mods/skinsdb/textures/character_1740.png rename to mods/skinsdb/textures/character.1740.png diff --git a/mods/skinsdb/textures/character_1741.png b/mods/skinsdb/textures/character.1741.png similarity index 100% rename from mods/skinsdb/textures/character_1741.png rename to mods/skinsdb/textures/character.1741.png diff --git a/mods/skinsdb/textures/character_1742.png b/mods/skinsdb/textures/character.1742.png similarity index 100% rename from mods/skinsdb/textures/character_1742.png rename to mods/skinsdb/textures/character.1742.png diff --git a/mods/skinsdb/textures/character_1743.png b/mods/skinsdb/textures/character.1743.png similarity index 100% rename from mods/skinsdb/textures/character_1743.png rename to mods/skinsdb/textures/character.1743.png diff --git a/mods/skinsdb/textures/character_1744.png b/mods/skinsdb/textures/character.1744.png similarity index 100% rename from mods/skinsdb/textures/character_1744.png rename to mods/skinsdb/textures/character.1744.png diff --git a/mods/skinsdb/textures/character_1745.png b/mods/skinsdb/textures/character.1745.png similarity index 100% rename from mods/skinsdb/textures/character_1745.png rename to mods/skinsdb/textures/character.1745.png diff --git a/mods/skinsdb/textures/character_1746.png b/mods/skinsdb/textures/character.1746.png similarity index 100% rename from mods/skinsdb/textures/character_1746.png rename to mods/skinsdb/textures/character.1746.png diff --git a/mods/skinsdb/textures/character_1747.png b/mods/skinsdb/textures/character.1747.png similarity index 100% rename from mods/skinsdb/textures/character_1747.png rename to mods/skinsdb/textures/character.1747.png diff --git a/mods/skinsdb/textures/character_1748.png b/mods/skinsdb/textures/character.1748.png similarity index 100% rename from mods/skinsdb/textures/character_1748.png rename to mods/skinsdb/textures/character.1748.png diff --git a/mods/skinsdb/textures/character_1749.png b/mods/skinsdb/textures/character.1749.png similarity index 100% rename from mods/skinsdb/textures/character_1749.png rename to mods/skinsdb/textures/character.1749.png diff --git a/mods/skinsdb/textures/character_175.png b/mods/skinsdb/textures/character.175.png similarity index 100% rename from mods/skinsdb/textures/character_175.png rename to mods/skinsdb/textures/character.175.png diff --git a/mods/skinsdb/textures/character_1750.png b/mods/skinsdb/textures/character.1750.png similarity index 100% rename from mods/skinsdb/textures/character_1750.png rename to mods/skinsdb/textures/character.1750.png diff --git a/mods/skinsdb/textures/character_1751.png b/mods/skinsdb/textures/character.1751.png similarity index 100% rename from mods/skinsdb/textures/character_1751.png rename to mods/skinsdb/textures/character.1751.png diff --git a/mods/skinsdb/textures/character_1752.png b/mods/skinsdb/textures/character.1752.png similarity index 100% rename from mods/skinsdb/textures/character_1752.png rename to mods/skinsdb/textures/character.1752.png diff --git a/mods/skinsdb/textures/character_1753.png b/mods/skinsdb/textures/character.1753.png similarity index 100% rename from mods/skinsdb/textures/character_1753.png rename to mods/skinsdb/textures/character.1753.png diff --git a/mods/skinsdb/textures/character_1754.png b/mods/skinsdb/textures/character.1754.png similarity index 100% rename from mods/skinsdb/textures/character_1754.png rename to mods/skinsdb/textures/character.1754.png diff --git a/mods/skinsdb/textures/character_1755.png b/mods/skinsdb/textures/character.1755.png similarity index 100% rename from mods/skinsdb/textures/character_1755.png rename to mods/skinsdb/textures/character.1755.png diff --git a/mods/skinsdb/textures/character_1756.png b/mods/skinsdb/textures/character.1756.png similarity index 100% rename from mods/skinsdb/textures/character_1756.png rename to mods/skinsdb/textures/character.1756.png diff --git a/mods/skinsdb/textures/character_1757.png b/mods/skinsdb/textures/character.1757.png similarity index 100% rename from mods/skinsdb/textures/character_1757.png rename to mods/skinsdb/textures/character.1757.png diff --git a/mods/skinsdb/textures/character_1758.png b/mods/skinsdb/textures/character.1758.png similarity index 100% rename from mods/skinsdb/textures/character_1758.png rename to mods/skinsdb/textures/character.1758.png diff --git a/mods/skinsdb/textures/character_1759.png b/mods/skinsdb/textures/character.1759.png similarity index 100% rename from mods/skinsdb/textures/character_1759.png rename to mods/skinsdb/textures/character.1759.png diff --git a/mods/skinsdb/textures/character_176.png b/mods/skinsdb/textures/character.176.png similarity index 100% rename from mods/skinsdb/textures/character_176.png rename to mods/skinsdb/textures/character.176.png diff --git a/mods/skinsdb/textures/character_1760.png b/mods/skinsdb/textures/character.1760.png similarity index 100% rename from mods/skinsdb/textures/character_1760.png rename to mods/skinsdb/textures/character.1760.png diff --git a/mods/skinsdb/textures/character_1761.png b/mods/skinsdb/textures/character.1761.png similarity index 100% rename from mods/skinsdb/textures/character_1761.png rename to mods/skinsdb/textures/character.1761.png diff --git a/mods/skinsdb/textures/character_1762.png b/mods/skinsdb/textures/character.1762.png similarity index 100% rename from mods/skinsdb/textures/character_1762.png rename to mods/skinsdb/textures/character.1762.png diff --git a/mods/skinsdb/textures/character_1763.png b/mods/skinsdb/textures/character.1763.png similarity index 100% rename from mods/skinsdb/textures/character_1763.png rename to mods/skinsdb/textures/character.1763.png diff --git a/mods/skinsdb/textures/character_1764.png b/mods/skinsdb/textures/character.1764.png similarity index 100% rename from mods/skinsdb/textures/character_1764.png rename to mods/skinsdb/textures/character.1764.png diff --git a/mods/skinsdb/textures/character_1765.png b/mods/skinsdb/textures/character.1765.png similarity index 100% rename from mods/skinsdb/textures/character_1765.png rename to mods/skinsdb/textures/character.1765.png diff --git a/mods/skinsdb/textures/character_1766.png b/mods/skinsdb/textures/character.1766.png similarity index 100% rename from mods/skinsdb/textures/character_1766.png rename to mods/skinsdb/textures/character.1766.png diff --git a/mods/skinsdb/textures/character_1767.png b/mods/skinsdb/textures/character.1767.png similarity index 100% rename from mods/skinsdb/textures/character_1767.png rename to mods/skinsdb/textures/character.1767.png diff --git a/mods/skinsdb/textures/character_1768.png b/mods/skinsdb/textures/character.1768.png similarity index 100% rename from mods/skinsdb/textures/character_1768.png rename to mods/skinsdb/textures/character.1768.png diff --git a/mods/skinsdb/textures/character_1769.png b/mods/skinsdb/textures/character.1769.png similarity index 100% rename from mods/skinsdb/textures/character_1769.png rename to mods/skinsdb/textures/character.1769.png diff --git a/mods/skinsdb/textures/character_177.png b/mods/skinsdb/textures/character.177.png similarity index 100% rename from mods/skinsdb/textures/character_177.png rename to mods/skinsdb/textures/character.177.png diff --git a/mods/skinsdb/textures/character_1770.png b/mods/skinsdb/textures/character.1770.png similarity index 100% rename from mods/skinsdb/textures/character_1770.png rename to mods/skinsdb/textures/character.1770.png diff --git a/mods/skinsdb/textures/character_1771.png b/mods/skinsdb/textures/character.1771.png similarity index 100% rename from mods/skinsdb/textures/character_1771.png rename to mods/skinsdb/textures/character.1771.png diff --git a/mods/skinsdb/textures/character_1772.png b/mods/skinsdb/textures/character.1772.png similarity index 100% rename from mods/skinsdb/textures/character_1772.png rename to mods/skinsdb/textures/character.1772.png diff --git a/mods/skinsdb/textures/character_1773.png b/mods/skinsdb/textures/character.1773.png similarity index 100% rename from mods/skinsdb/textures/character_1773.png rename to mods/skinsdb/textures/character.1773.png diff --git a/mods/skinsdb/textures/character_1774.png b/mods/skinsdb/textures/character.1774.png similarity index 100% rename from mods/skinsdb/textures/character_1774.png rename to mods/skinsdb/textures/character.1774.png diff --git a/mods/skinsdb/textures/character_1775.png b/mods/skinsdb/textures/character.1775.png similarity index 100% rename from mods/skinsdb/textures/character_1775.png rename to mods/skinsdb/textures/character.1775.png diff --git a/mods/skinsdb/textures/character_1776.png b/mods/skinsdb/textures/character.1776.png similarity index 100% rename from mods/skinsdb/textures/character_1776.png rename to mods/skinsdb/textures/character.1776.png diff --git a/mods/skinsdb/textures/character_1778.png b/mods/skinsdb/textures/character.1778.png similarity index 100% rename from mods/skinsdb/textures/character_1778.png rename to mods/skinsdb/textures/character.1778.png diff --git a/mods/skinsdb/textures/character_1779.png b/mods/skinsdb/textures/character.1779.png similarity index 100% rename from mods/skinsdb/textures/character_1779.png rename to mods/skinsdb/textures/character.1779.png diff --git a/mods/skinsdb/textures/character_178.png b/mods/skinsdb/textures/character.178.png similarity index 100% rename from mods/skinsdb/textures/character_178.png rename to mods/skinsdb/textures/character.178.png diff --git a/mods/skinsdb/textures/character_1780.png b/mods/skinsdb/textures/character.1780.png similarity index 100% rename from mods/skinsdb/textures/character_1780.png rename to mods/skinsdb/textures/character.1780.png diff --git a/mods/skinsdb/textures/character_1781.png b/mods/skinsdb/textures/character.1781.png similarity index 100% rename from mods/skinsdb/textures/character_1781.png rename to mods/skinsdb/textures/character.1781.png diff --git a/mods/skinsdb/textures/character_1782.png b/mods/skinsdb/textures/character.1782.png similarity index 100% rename from mods/skinsdb/textures/character_1782.png rename to mods/skinsdb/textures/character.1782.png diff --git a/mods/skinsdb/textures/character_1783.png b/mods/skinsdb/textures/character.1783.png similarity index 100% rename from mods/skinsdb/textures/character_1783.png rename to mods/skinsdb/textures/character.1783.png diff --git a/mods/skinsdb/textures/character_1784.png b/mods/skinsdb/textures/character.1784.png similarity index 100% rename from mods/skinsdb/textures/character_1784.png rename to mods/skinsdb/textures/character.1784.png diff --git a/mods/skinsdb/textures/character_1785.png b/mods/skinsdb/textures/character.1785.png similarity index 100% rename from mods/skinsdb/textures/character_1785.png rename to mods/skinsdb/textures/character.1785.png diff --git a/mods/skinsdb/textures/character_1786.png b/mods/skinsdb/textures/character.1786.png similarity index 100% rename from mods/skinsdb/textures/character_1786.png rename to mods/skinsdb/textures/character.1786.png diff --git a/mods/skinsdb/textures/character_1787.png b/mods/skinsdb/textures/character.1787.png similarity index 100% rename from mods/skinsdb/textures/character_1787.png rename to mods/skinsdb/textures/character.1787.png diff --git a/mods/skinsdb/textures/character_1788.png b/mods/skinsdb/textures/character.1788.png similarity index 100% rename from mods/skinsdb/textures/character_1788.png rename to mods/skinsdb/textures/character.1788.png diff --git a/mods/skinsdb/textures/character_1789.png b/mods/skinsdb/textures/character.1789.png similarity index 100% rename from mods/skinsdb/textures/character_1789.png rename to mods/skinsdb/textures/character.1789.png diff --git a/mods/skinsdb/textures/character_179.png b/mods/skinsdb/textures/character.179.png similarity index 100% rename from mods/skinsdb/textures/character_179.png rename to mods/skinsdb/textures/character.179.png diff --git a/mods/skinsdb/textures/character_1790.png b/mods/skinsdb/textures/character.1790.png similarity index 100% rename from mods/skinsdb/textures/character_1790.png rename to mods/skinsdb/textures/character.1790.png diff --git a/mods/skinsdb/textures/character_1791.png b/mods/skinsdb/textures/character.1791.png similarity index 100% rename from mods/skinsdb/textures/character_1791.png rename to mods/skinsdb/textures/character.1791.png diff --git a/mods/skinsdb/textures/character_1792.png b/mods/skinsdb/textures/character.1792.png similarity index 100% rename from mods/skinsdb/textures/character_1792.png rename to mods/skinsdb/textures/character.1792.png diff --git a/mods/skinsdb/textures/character_1793.png b/mods/skinsdb/textures/character.1793.png similarity index 100% rename from mods/skinsdb/textures/character_1793.png rename to mods/skinsdb/textures/character.1793.png diff --git a/mods/skinsdb/textures/character_1794.png b/mods/skinsdb/textures/character.1794.png similarity index 100% rename from mods/skinsdb/textures/character_1794.png rename to mods/skinsdb/textures/character.1794.png diff --git a/mods/skinsdb/textures/character_1796.png b/mods/skinsdb/textures/character.1796.png similarity index 100% rename from mods/skinsdb/textures/character_1796.png rename to mods/skinsdb/textures/character.1796.png diff --git a/mods/skinsdb/textures/character_1797.png b/mods/skinsdb/textures/character.1797.png similarity index 100% rename from mods/skinsdb/textures/character_1797.png rename to mods/skinsdb/textures/character.1797.png diff --git a/mods/skinsdb/textures/character_1798.png b/mods/skinsdb/textures/character.1798.png similarity index 100% rename from mods/skinsdb/textures/character_1798.png rename to mods/skinsdb/textures/character.1798.png diff --git a/mods/skinsdb/textures/character_1799.png b/mods/skinsdb/textures/character.1799.png similarity index 100% rename from mods/skinsdb/textures/character_1799.png rename to mods/skinsdb/textures/character.1799.png diff --git a/mods/skinsdb/textures/character_180.png b/mods/skinsdb/textures/character.180.png similarity index 100% rename from mods/skinsdb/textures/character_180.png rename to mods/skinsdb/textures/character.180.png diff --git a/mods/skinsdb/textures/character_1800.png b/mods/skinsdb/textures/character.1800.png similarity index 100% rename from mods/skinsdb/textures/character_1800.png rename to mods/skinsdb/textures/character.1800.png diff --git a/mods/skinsdb/textures/character_1801.png b/mods/skinsdb/textures/character.1801.png similarity index 100% rename from mods/skinsdb/textures/character_1801.png rename to mods/skinsdb/textures/character.1801.png diff --git a/mods/skinsdb/textures/character_1802.png b/mods/skinsdb/textures/character.1802.png similarity index 100% rename from mods/skinsdb/textures/character_1802.png rename to mods/skinsdb/textures/character.1802.png diff --git a/mods/skinsdb/textures/character_1803.png b/mods/skinsdb/textures/character.1803.png similarity index 100% rename from mods/skinsdb/textures/character_1803.png rename to mods/skinsdb/textures/character.1803.png diff --git a/mods/skinsdb/textures/character_1804.png b/mods/skinsdb/textures/character.1804.png similarity index 100% rename from mods/skinsdb/textures/character_1804.png rename to mods/skinsdb/textures/character.1804.png diff --git a/mods/skinsdb/textures/character_1805.png b/mods/skinsdb/textures/character.1805.png similarity index 100% rename from mods/skinsdb/textures/character_1805.png rename to mods/skinsdb/textures/character.1805.png diff --git a/mods/skinsdb/textures/character_1806.png b/mods/skinsdb/textures/character.1806.png similarity index 100% rename from mods/skinsdb/textures/character_1806.png rename to mods/skinsdb/textures/character.1806.png diff --git a/mods/skinsdb/textures/character_1807.png b/mods/skinsdb/textures/character.1807.png similarity index 100% rename from mods/skinsdb/textures/character_1807.png rename to mods/skinsdb/textures/character.1807.png diff --git a/mods/skinsdb/textures/character_1808.png b/mods/skinsdb/textures/character.1808.png similarity index 100% rename from mods/skinsdb/textures/character_1808.png rename to mods/skinsdb/textures/character.1808.png diff --git a/mods/skinsdb/textures/character_1809.png b/mods/skinsdb/textures/character.1809.png similarity index 100% rename from mods/skinsdb/textures/character_1809.png rename to mods/skinsdb/textures/character.1809.png diff --git a/mods/skinsdb/textures/character_181.png b/mods/skinsdb/textures/character.181.png similarity index 100% rename from mods/skinsdb/textures/character_181.png rename to mods/skinsdb/textures/character.181.png diff --git a/mods/skinsdb/textures/character_1810.png b/mods/skinsdb/textures/character.1810.png similarity index 100% rename from mods/skinsdb/textures/character_1810.png rename to mods/skinsdb/textures/character.1810.png diff --git a/mods/skinsdb/textures/character_1811.png b/mods/skinsdb/textures/character.1811.png similarity index 100% rename from mods/skinsdb/textures/character_1811.png rename to mods/skinsdb/textures/character.1811.png diff --git a/mods/skinsdb/textures/character_1812.png b/mods/skinsdb/textures/character.1812.png similarity index 100% rename from mods/skinsdb/textures/character_1812.png rename to mods/skinsdb/textures/character.1812.png diff --git a/mods/skinsdb/textures/character_1813.png b/mods/skinsdb/textures/character.1813.png similarity index 100% rename from mods/skinsdb/textures/character_1813.png rename to mods/skinsdb/textures/character.1813.png diff --git a/mods/skinsdb/textures/character_1814.png b/mods/skinsdb/textures/character.1814.png similarity index 100% rename from mods/skinsdb/textures/character_1814.png rename to mods/skinsdb/textures/character.1814.png diff --git a/mods/skinsdb/textures/character_1815.png b/mods/skinsdb/textures/character.1815.png similarity index 100% rename from mods/skinsdb/textures/character_1815.png rename to mods/skinsdb/textures/character.1815.png diff --git a/mods/skinsdb/textures/character_1816.png b/mods/skinsdb/textures/character.1816.png similarity index 100% rename from mods/skinsdb/textures/character_1816.png rename to mods/skinsdb/textures/character.1816.png diff --git a/mods/skinsdb/textures/character_1817.png b/mods/skinsdb/textures/character.1817.png similarity index 100% rename from mods/skinsdb/textures/character_1817.png rename to mods/skinsdb/textures/character.1817.png diff --git a/mods/skinsdb/textures/character_1818.png b/mods/skinsdb/textures/character.1818.png similarity index 100% rename from mods/skinsdb/textures/character_1818.png rename to mods/skinsdb/textures/character.1818.png diff --git a/mods/skinsdb/textures/character_1819.png b/mods/skinsdb/textures/character.1819.png similarity index 100% rename from mods/skinsdb/textures/character_1819.png rename to mods/skinsdb/textures/character.1819.png diff --git a/mods/skinsdb/textures/character_182.png b/mods/skinsdb/textures/character.182.png similarity index 100% rename from mods/skinsdb/textures/character_182.png rename to mods/skinsdb/textures/character.182.png diff --git a/mods/skinsdb/textures/character_1820.png b/mods/skinsdb/textures/character.1820.png similarity index 100% rename from mods/skinsdb/textures/character_1820.png rename to mods/skinsdb/textures/character.1820.png diff --git a/mods/skinsdb/textures/character_1821.png b/mods/skinsdb/textures/character.1821.png similarity index 100% rename from mods/skinsdb/textures/character_1821.png rename to mods/skinsdb/textures/character.1821.png diff --git a/mods/skinsdb/textures/character_1822.png b/mods/skinsdb/textures/character.1822.png similarity index 100% rename from mods/skinsdb/textures/character_1822.png rename to mods/skinsdb/textures/character.1822.png diff --git a/mods/skinsdb/textures/character_1823.png b/mods/skinsdb/textures/character.1823.png similarity index 100% rename from mods/skinsdb/textures/character_1823.png rename to mods/skinsdb/textures/character.1823.png diff --git a/mods/skinsdb/textures/character_1824.png b/mods/skinsdb/textures/character.1824.png similarity index 100% rename from mods/skinsdb/textures/character_1824.png rename to mods/skinsdb/textures/character.1824.png diff --git a/mods/skinsdb/textures/character_1825.png b/mods/skinsdb/textures/character.1825.png similarity index 100% rename from mods/skinsdb/textures/character_1825.png rename to mods/skinsdb/textures/character.1825.png diff --git a/mods/skinsdb/textures/character_1826.png b/mods/skinsdb/textures/character.1826.png similarity index 100% rename from mods/skinsdb/textures/character_1826.png rename to mods/skinsdb/textures/character.1826.png diff --git a/mods/skinsdb/textures/character_1827.png b/mods/skinsdb/textures/character.1827.png similarity index 100% rename from mods/skinsdb/textures/character_1827.png rename to mods/skinsdb/textures/character.1827.png diff --git a/mods/skinsdb/textures/character_1828.png b/mods/skinsdb/textures/character.1828.png similarity index 100% rename from mods/skinsdb/textures/character_1828.png rename to mods/skinsdb/textures/character.1828.png diff --git a/mods/skinsdb/textures/character_1829.png b/mods/skinsdb/textures/character.1829.png similarity index 100% rename from mods/skinsdb/textures/character_1829.png rename to mods/skinsdb/textures/character.1829.png diff --git a/mods/skinsdb/textures/character_183.png b/mods/skinsdb/textures/character.183.png similarity index 100% rename from mods/skinsdb/textures/character_183.png rename to mods/skinsdb/textures/character.183.png diff --git a/mods/skinsdb/textures/character_1830.png b/mods/skinsdb/textures/character.1830.png similarity index 100% rename from mods/skinsdb/textures/character_1830.png rename to mods/skinsdb/textures/character.1830.png diff --git a/mods/skinsdb/textures/character_1831.png b/mods/skinsdb/textures/character.1831.png similarity index 100% rename from mods/skinsdb/textures/character_1831.png rename to mods/skinsdb/textures/character.1831.png diff --git a/mods/skinsdb/textures/character_1832.png b/mods/skinsdb/textures/character.1832.png similarity index 100% rename from mods/skinsdb/textures/character_1832.png rename to mods/skinsdb/textures/character.1832.png diff --git a/mods/skinsdb/textures/character_1833.png b/mods/skinsdb/textures/character.1833.png similarity index 100% rename from mods/skinsdb/textures/character_1833.png rename to mods/skinsdb/textures/character.1833.png diff --git a/mods/skinsdb/textures/character_1834.png b/mods/skinsdb/textures/character.1834.png similarity index 100% rename from mods/skinsdb/textures/character_1834.png rename to mods/skinsdb/textures/character.1834.png diff --git a/mods/skinsdb/textures/character_1835.png b/mods/skinsdb/textures/character.1835.png similarity index 100% rename from mods/skinsdb/textures/character_1835.png rename to mods/skinsdb/textures/character.1835.png diff --git a/mods/skinsdb/textures/character_1836.png b/mods/skinsdb/textures/character.1836.png similarity index 100% rename from mods/skinsdb/textures/character_1836.png rename to mods/skinsdb/textures/character.1836.png diff --git a/mods/skinsdb/textures/character_1837.png b/mods/skinsdb/textures/character.1837.png similarity index 100% rename from mods/skinsdb/textures/character_1837.png rename to mods/skinsdb/textures/character.1837.png diff --git a/mods/skinsdb/textures/character_1838.png b/mods/skinsdb/textures/character.1838.png similarity index 100% rename from mods/skinsdb/textures/character_1838.png rename to mods/skinsdb/textures/character.1838.png diff --git a/mods/skinsdb/textures/character_1839.png b/mods/skinsdb/textures/character.1839.png similarity index 100% rename from mods/skinsdb/textures/character_1839.png rename to mods/skinsdb/textures/character.1839.png diff --git a/mods/skinsdb/textures/character_184.png b/mods/skinsdb/textures/character.184.png similarity index 100% rename from mods/skinsdb/textures/character_184.png rename to mods/skinsdb/textures/character.184.png diff --git a/mods/skinsdb/textures/character_1840.png b/mods/skinsdb/textures/character.1840.png similarity index 100% rename from mods/skinsdb/textures/character_1840.png rename to mods/skinsdb/textures/character.1840.png diff --git a/mods/skinsdb/textures/character_1841.png b/mods/skinsdb/textures/character.1841.png similarity index 100% rename from mods/skinsdb/textures/character_1841.png rename to mods/skinsdb/textures/character.1841.png diff --git a/mods/skinsdb/textures/character_1842.png b/mods/skinsdb/textures/character.1842.png similarity index 100% rename from mods/skinsdb/textures/character_1842.png rename to mods/skinsdb/textures/character.1842.png diff --git a/mods/skinsdb/textures/character_1843.png b/mods/skinsdb/textures/character.1843.png similarity index 100% rename from mods/skinsdb/textures/character_1843.png rename to mods/skinsdb/textures/character.1843.png diff --git a/mods/skinsdb/textures/character_1844.png b/mods/skinsdb/textures/character.1844.png similarity index 100% rename from mods/skinsdb/textures/character_1844.png rename to mods/skinsdb/textures/character.1844.png diff --git a/mods/skinsdb/textures/character_1845.png b/mods/skinsdb/textures/character.1845.png similarity index 100% rename from mods/skinsdb/textures/character_1845.png rename to mods/skinsdb/textures/character.1845.png diff --git a/mods/skinsdb/textures/character_1846.png b/mods/skinsdb/textures/character.1846.png similarity index 100% rename from mods/skinsdb/textures/character_1846.png rename to mods/skinsdb/textures/character.1846.png diff --git a/mods/skinsdb/textures/character_1847.png b/mods/skinsdb/textures/character.1847.png similarity index 100% rename from mods/skinsdb/textures/character_1847.png rename to mods/skinsdb/textures/character.1847.png diff --git a/mods/skinsdb/textures/character_1848.png b/mods/skinsdb/textures/character.1848.png similarity index 100% rename from mods/skinsdb/textures/character_1848.png rename to mods/skinsdb/textures/character.1848.png diff --git a/mods/skinsdb/textures/character_1849.png b/mods/skinsdb/textures/character.1849.png similarity index 100% rename from mods/skinsdb/textures/character_1849.png rename to mods/skinsdb/textures/character.1849.png diff --git a/mods/skinsdb/textures/character_185.png b/mods/skinsdb/textures/character.185.png similarity index 100% rename from mods/skinsdb/textures/character_185.png rename to mods/skinsdb/textures/character.185.png diff --git a/mods/skinsdb/textures/character_1850.png b/mods/skinsdb/textures/character.1850.png similarity index 100% rename from mods/skinsdb/textures/character_1850.png rename to mods/skinsdb/textures/character.1850.png diff --git a/mods/skinsdb/textures/character_1851.png b/mods/skinsdb/textures/character.1851.png similarity index 100% rename from mods/skinsdb/textures/character_1851.png rename to mods/skinsdb/textures/character.1851.png diff --git a/mods/skinsdb/textures/character_1852.png b/mods/skinsdb/textures/character.1852.png similarity index 100% rename from mods/skinsdb/textures/character_1852.png rename to mods/skinsdb/textures/character.1852.png diff --git a/mods/skinsdb/textures/character_1853.png b/mods/skinsdb/textures/character.1853.png similarity index 100% rename from mods/skinsdb/textures/character_1853.png rename to mods/skinsdb/textures/character.1853.png diff --git a/mods/skinsdb/textures/character_1854.png b/mods/skinsdb/textures/character.1854.png similarity index 100% rename from mods/skinsdb/textures/character_1854.png rename to mods/skinsdb/textures/character.1854.png diff --git a/mods/skinsdb/textures/character_1855.png b/mods/skinsdb/textures/character.1855.png similarity index 100% rename from mods/skinsdb/textures/character_1855.png rename to mods/skinsdb/textures/character.1855.png diff --git a/mods/skinsdb/textures/character_1856.png b/mods/skinsdb/textures/character.1856.png similarity index 100% rename from mods/skinsdb/textures/character_1856.png rename to mods/skinsdb/textures/character.1856.png diff --git a/mods/skinsdb/textures/character_1857.png b/mods/skinsdb/textures/character.1857.png similarity index 100% rename from mods/skinsdb/textures/character_1857.png rename to mods/skinsdb/textures/character.1857.png diff --git a/mods/skinsdb/textures/character_1858.png b/mods/skinsdb/textures/character.1858.png similarity index 100% rename from mods/skinsdb/textures/character_1858.png rename to mods/skinsdb/textures/character.1858.png diff --git a/mods/skinsdb/textures/character_1859.png b/mods/skinsdb/textures/character.1859.png similarity index 100% rename from mods/skinsdb/textures/character_1859.png rename to mods/skinsdb/textures/character.1859.png diff --git a/mods/skinsdb/textures/character_186.png b/mods/skinsdb/textures/character.186.png similarity index 100% rename from mods/skinsdb/textures/character_186.png rename to mods/skinsdb/textures/character.186.png diff --git a/mods/skinsdb/textures/character_1860.png b/mods/skinsdb/textures/character.1860.png similarity index 100% rename from mods/skinsdb/textures/character_1860.png rename to mods/skinsdb/textures/character.1860.png diff --git a/mods/skinsdb/textures/character_1861.png b/mods/skinsdb/textures/character.1861.png similarity index 100% rename from mods/skinsdb/textures/character_1861.png rename to mods/skinsdb/textures/character.1861.png diff --git a/mods/skinsdb/textures/character_1862.png b/mods/skinsdb/textures/character.1862.png similarity index 100% rename from mods/skinsdb/textures/character_1862.png rename to mods/skinsdb/textures/character.1862.png diff --git a/mods/skinsdb/textures/character_1863.png b/mods/skinsdb/textures/character.1863.png similarity index 100% rename from mods/skinsdb/textures/character_1863.png rename to mods/skinsdb/textures/character.1863.png diff --git a/mods/skinsdb/textures/character_1864.png b/mods/skinsdb/textures/character.1864.png similarity index 100% rename from mods/skinsdb/textures/character_1864.png rename to mods/skinsdb/textures/character.1864.png diff --git a/mods/skinsdb/textures/character_1865.png b/mods/skinsdb/textures/character.1865.png similarity index 100% rename from mods/skinsdb/textures/character_1865.png rename to mods/skinsdb/textures/character.1865.png diff --git a/mods/skinsdb/textures/character_1866.png b/mods/skinsdb/textures/character.1866.png similarity index 100% rename from mods/skinsdb/textures/character_1866.png rename to mods/skinsdb/textures/character.1866.png diff --git a/mods/skinsdb/textures/character_1867.png b/mods/skinsdb/textures/character.1867.png similarity index 100% rename from mods/skinsdb/textures/character_1867.png rename to mods/skinsdb/textures/character.1867.png diff --git a/mods/skinsdb/textures/character_1868.png b/mods/skinsdb/textures/character.1868.png similarity index 100% rename from mods/skinsdb/textures/character_1868.png rename to mods/skinsdb/textures/character.1868.png diff --git a/mods/skinsdb/textures/character_1869.png b/mods/skinsdb/textures/character.1869.png similarity index 100% rename from mods/skinsdb/textures/character_1869.png rename to mods/skinsdb/textures/character.1869.png diff --git a/mods/skinsdb/textures/character_187.png b/mods/skinsdb/textures/character.187.png similarity index 100% rename from mods/skinsdb/textures/character_187.png rename to mods/skinsdb/textures/character.187.png diff --git a/mods/skinsdb/textures/character_1870.png b/mods/skinsdb/textures/character.1870.png similarity index 100% rename from mods/skinsdb/textures/character_1870.png rename to mods/skinsdb/textures/character.1870.png diff --git a/mods/skinsdb/textures/character_1871.png b/mods/skinsdb/textures/character.1871.png similarity index 100% rename from mods/skinsdb/textures/character_1871.png rename to mods/skinsdb/textures/character.1871.png diff --git a/mods/skinsdb/textures/character_1872.png b/mods/skinsdb/textures/character.1872.png similarity index 100% rename from mods/skinsdb/textures/character_1872.png rename to mods/skinsdb/textures/character.1872.png diff --git a/mods/skinsdb/textures/character_1873.png b/mods/skinsdb/textures/character.1873.png similarity index 100% rename from mods/skinsdb/textures/character_1873.png rename to mods/skinsdb/textures/character.1873.png diff --git a/mods/skinsdb/textures/character_1874.png b/mods/skinsdb/textures/character.1874.png similarity index 100% rename from mods/skinsdb/textures/character_1874.png rename to mods/skinsdb/textures/character.1874.png diff --git a/mods/skinsdb/textures/character_1875.png b/mods/skinsdb/textures/character.1875.png similarity index 100% rename from mods/skinsdb/textures/character_1875.png rename to mods/skinsdb/textures/character.1875.png diff --git a/mods/skinsdb/textures/character_1876.png b/mods/skinsdb/textures/character.1876.png similarity index 100% rename from mods/skinsdb/textures/character_1876.png rename to mods/skinsdb/textures/character.1876.png diff --git a/mods/skinsdb/textures/character_1877.png b/mods/skinsdb/textures/character.1877.png similarity index 100% rename from mods/skinsdb/textures/character_1877.png rename to mods/skinsdb/textures/character.1877.png diff --git a/mods/skinsdb/textures/character_1878.png b/mods/skinsdb/textures/character.1878.png similarity index 100% rename from mods/skinsdb/textures/character_1878.png rename to mods/skinsdb/textures/character.1878.png diff --git a/mods/skinsdb/textures/character_1879.png b/mods/skinsdb/textures/character.1879.png similarity index 100% rename from mods/skinsdb/textures/character_1879.png rename to mods/skinsdb/textures/character.1879.png diff --git a/mods/skinsdb/textures/character_188.png b/mods/skinsdb/textures/character.188.png similarity index 100% rename from mods/skinsdb/textures/character_188.png rename to mods/skinsdb/textures/character.188.png diff --git a/mods/skinsdb/textures/character_1880.png b/mods/skinsdb/textures/character.1880.png similarity index 100% rename from mods/skinsdb/textures/character_1880.png rename to mods/skinsdb/textures/character.1880.png diff --git a/mods/skinsdb/textures/character_1881.png b/mods/skinsdb/textures/character.1881.png similarity index 100% rename from mods/skinsdb/textures/character_1881.png rename to mods/skinsdb/textures/character.1881.png diff --git a/mods/skinsdb/textures/character_1882.png b/mods/skinsdb/textures/character.1882.png similarity index 100% rename from mods/skinsdb/textures/character_1882.png rename to mods/skinsdb/textures/character.1882.png diff --git a/mods/skinsdb/textures/character_1883.png b/mods/skinsdb/textures/character.1883.png similarity index 100% rename from mods/skinsdb/textures/character_1883.png rename to mods/skinsdb/textures/character.1883.png diff --git a/mods/skinsdb/textures/character_1884.png b/mods/skinsdb/textures/character.1884.png similarity index 100% rename from mods/skinsdb/textures/character_1884.png rename to mods/skinsdb/textures/character.1884.png diff --git a/mods/skinsdb/textures/character_1885.png b/mods/skinsdb/textures/character.1885.png similarity index 100% rename from mods/skinsdb/textures/character_1885.png rename to mods/skinsdb/textures/character.1885.png diff --git a/mods/skinsdb/textures/character_1886.png b/mods/skinsdb/textures/character.1886.png similarity index 100% rename from mods/skinsdb/textures/character_1886.png rename to mods/skinsdb/textures/character.1886.png diff --git a/mods/skinsdb/textures/character_1887.png b/mods/skinsdb/textures/character.1887.png similarity index 100% rename from mods/skinsdb/textures/character_1887.png rename to mods/skinsdb/textures/character.1887.png diff --git a/mods/skinsdb/textures/character_1888.png b/mods/skinsdb/textures/character.1888.png similarity index 100% rename from mods/skinsdb/textures/character_1888.png rename to mods/skinsdb/textures/character.1888.png diff --git a/mods/skinsdb/textures/character_1889.png b/mods/skinsdb/textures/character.1889.png similarity index 100% rename from mods/skinsdb/textures/character_1889.png rename to mods/skinsdb/textures/character.1889.png diff --git a/mods/skinsdb/textures/character_189.png b/mods/skinsdb/textures/character.189.png similarity index 100% rename from mods/skinsdb/textures/character_189.png rename to mods/skinsdb/textures/character.189.png diff --git a/mods/skinsdb/textures/character_1890.png b/mods/skinsdb/textures/character.1890.png similarity index 100% rename from mods/skinsdb/textures/character_1890.png rename to mods/skinsdb/textures/character.1890.png diff --git a/mods/skinsdb/textures/character_1891.png b/mods/skinsdb/textures/character.1891.png similarity index 100% rename from mods/skinsdb/textures/character_1891.png rename to mods/skinsdb/textures/character.1891.png diff --git a/mods/skinsdb/textures/character_1892.png b/mods/skinsdb/textures/character.1892.png similarity index 100% rename from mods/skinsdb/textures/character_1892.png rename to mods/skinsdb/textures/character.1892.png diff --git a/mods/skinsdb/textures/character_1893.png b/mods/skinsdb/textures/character.1893.png similarity index 100% rename from mods/skinsdb/textures/character_1893.png rename to mods/skinsdb/textures/character.1893.png diff --git a/mods/skinsdb/textures/character_1894.png b/mods/skinsdb/textures/character.1894.png similarity index 100% rename from mods/skinsdb/textures/character_1894.png rename to mods/skinsdb/textures/character.1894.png diff --git a/mods/skinsdb/textures/character_1895.png b/mods/skinsdb/textures/character.1895.png similarity index 100% rename from mods/skinsdb/textures/character_1895.png rename to mods/skinsdb/textures/character.1895.png diff --git a/mods/skinsdb/textures/character_1896.png b/mods/skinsdb/textures/character.1896.png similarity index 100% rename from mods/skinsdb/textures/character_1896.png rename to mods/skinsdb/textures/character.1896.png diff --git a/mods/skinsdb/textures/character_1897.png b/mods/skinsdb/textures/character.1897.png similarity index 100% rename from mods/skinsdb/textures/character_1897.png rename to mods/skinsdb/textures/character.1897.png diff --git a/mods/skinsdb/textures/character_1898.png b/mods/skinsdb/textures/character.1898.png similarity index 100% rename from mods/skinsdb/textures/character_1898.png rename to mods/skinsdb/textures/character.1898.png diff --git a/mods/skinsdb/textures/character_1899.png b/mods/skinsdb/textures/character.1899.png similarity index 100% rename from mods/skinsdb/textures/character_1899.png rename to mods/skinsdb/textures/character.1899.png diff --git a/mods/skinsdb/textures/character_19.png b/mods/skinsdb/textures/character.19.png similarity index 100% rename from mods/skinsdb/textures/character_19.png rename to mods/skinsdb/textures/character.19.png diff --git a/mods/skinsdb/textures/character_190.png b/mods/skinsdb/textures/character.190.png similarity index 100% rename from mods/skinsdb/textures/character_190.png rename to mods/skinsdb/textures/character.190.png diff --git a/mods/skinsdb/textures/character_1900.png b/mods/skinsdb/textures/character.1900.png similarity index 100% rename from mods/skinsdb/textures/character_1900.png rename to mods/skinsdb/textures/character.1900.png diff --git a/mods/skinsdb/textures/character_1901.png b/mods/skinsdb/textures/character.1901.png similarity index 100% rename from mods/skinsdb/textures/character_1901.png rename to mods/skinsdb/textures/character.1901.png diff --git a/mods/skinsdb/textures/character_1902.png b/mods/skinsdb/textures/character.1902.png similarity index 100% rename from mods/skinsdb/textures/character_1902.png rename to mods/skinsdb/textures/character.1902.png diff --git a/mods/skinsdb/textures/character_1903.png b/mods/skinsdb/textures/character.1903.png similarity index 100% rename from mods/skinsdb/textures/character_1903.png rename to mods/skinsdb/textures/character.1903.png diff --git a/mods/skinsdb/textures/character_1904.png b/mods/skinsdb/textures/character.1904.png similarity index 100% rename from mods/skinsdb/textures/character_1904.png rename to mods/skinsdb/textures/character.1904.png diff --git a/mods/skinsdb/textures/character_1905.png b/mods/skinsdb/textures/character.1905.png similarity index 100% rename from mods/skinsdb/textures/character_1905.png rename to mods/skinsdb/textures/character.1905.png diff --git a/mods/skinsdb/textures/character_1906.png b/mods/skinsdb/textures/character.1906.png similarity index 100% rename from mods/skinsdb/textures/character_1906.png rename to mods/skinsdb/textures/character.1906.png diff --git a/mods/skinsdb/textures/character_1907.png b/mods/skinsdb/textures/character.1907.png similarity index 100% rename from mods/skinsdb/textures/character_1907.png rename to mods/skinsdb/textures/character.1907.png diff --git a/mods/skinsdb/textures/character_1908.png b/mods/skinsdb/textures/character.1908.png similarity index 100% rename from mods/skinsdb/textures/character_1908.png rename to mods/skinsdb/textures/character.1908.png diff --git a/mods/skinsdb/textures/character_1909.png b/mods/skinsdb/textures/character.1909.png similarity index 100% rename from mods/skinsdb/textures/character_1909.png rename to mods/skinsdb/textures/character.1909.png diff --git a/mods/skinsdb/textures/character_191.png b/mods/skinsdb/textures/character.191.png similarity index 100% rename from mods/skinsdb/textures/character_191.png rename to mods/skinsdb/textures/character.191.png diff --git a/mods/skinsdb/textures/character_1910.png b/mods/skinsdb/textures/character.1910.png similarity index 100% rename from mods/skinsdb/textures/character_1910.png rename to mods/skinsdb/textures/character.1910.png diff --git a/mods/skinsdb/textures/character_1911.png b/mods/skinsdb/textures/character.1911.png similarity index 100% rename from mods/skinsdb/textures/character_1911.png rename to mods/skinsdb/textures/character.1911.png diff --git a/mods/skinsdb/textures/character_1912.png b/mods/skinsdb/textures/character.1912.png similarity index 100% rename from mods/skinsdb/textures/character_1912.png rename to mods/skinsdb/textures/character.1912.png diff --git a/mods/skinsdb/textures/character_1913.png b/mods/skinsdb/textures/character.1913.png similarity index 100% rename from mods/skinsdb/textures/character_1913.png rename to mods/skinsdb/textures/character.1913.png diff --git a/mods/skinsdb/textures/character_1914.png b/mods/skinsdb/textures/character.1914.png similarity index 100% rename from mods/skinsdb/textures/character_1914.png rename to mods/skinsdb/textures/character.1914.png diff --git a/mods/skinsdb/textures/character_1915.png b/mods/skinsdb/textures/character.1915.png similarity index 100% rename from mods/skinsdb/textures/character_1915.png rename to mods/skinsdb/textures/character.1915.png diff --git a/mods/skinsdb/textures/character_1916.png b/mods/skinsdb/textures/character.1916.png similarity index 100% rename from mods/skinsdb/textures/character_1916.png rename to mods/skinsdb/textures/character.1916.png diff --git a/mods/skinsdb/textures/character_1917.png b/mods/skinsdb/textures/character.1917.png similarity index 100% rename from mods/skinsdb/textures/character_1917.png rename to mods/skinsdb/textures/character.1917.png diff --git a/mods/skinsdb/textures/character_1918.png b/mods/skinsdb/textures/character.1918.png similarity index 100% rename from mods/skinsdb/textures/character_1918.png rename to mods/skinsdb/textures/character.1918.png diff --git a/mods/skinsdb/textures/character_1919.png b/mods/skinsdb/textures/character.1919.png similarity index 100% rename from mods/skinsdb/textures/character_1919.png rename to mods/skinsdb/textures/character.1919.png diff --git a/mods/skinsdb/textures/character_192.png b/mods/skinsdb/textures/character.192.png similarity index 100% rename from mods/skinsdb/textures/character_192.png rename to mods/skinsdb/textures/character.192.png diff --git a/mods/skinsdb/textures/character_1920.png b/mods/skinsdb/textures/character.1920.png similarity index 100% rename from mods/skinsdb/textures/character_1920.png rename to mods/skinsdb/textures/character.1920.png diff --git a/mods/skinsdb/textures/character_1921.png b/mods/skinsdb/textures/character.1921.png similarity index 100% rename from mods/skinsdb/textures/character_1921.png rename to mods/skinsdb/textures/character.1921.png diff --git a/mods/skinsdb/textures/character_1922.png b/mods/skinsdb/textures/character.1922.png similarity index 100% rename from mods/skinsdb/textures/character_1922.png rename to mods/skinsdb/textures/character.1922.png diff --git a/mods/skinsdb/textures/character_1923.png b/mods/skinsdb/textures/character.1923.png similarity index 100% rename from mods/skinsdb/textures/character_1923.png rename to mods/skinsdb/textures/character.1923.png diff --git a/mods/skinsdb/textures/character_1924.png b/mods/skinsdb/textures/character.1924.png similarity index 100% rename from mods/skinsdb/textures/character_1924.png rename to mods/skinsdb/textures/character.1924.png diff --git a/mods/skinsdb/textures/character_1925.png b/mods/skinsdb/textures/character.1925.png similarity index 100% rename from mods/skinsdb/textures/character_1925.png rename to mods/skinsdb/textures/character.1925.png diff --git a/mods/skinsdb/textures/character_1926.png b/mods/skinsdb/textures/character.1926.png similarity index 100% rename from mods/skinsdb/textures/character_1926.png rename to mods/skinsdb/textures/character.1926.png diff --git a/mods/skinsdb/textures/character_1927.png b/mods/skinsdb/textures/character.1927.png similarity index 100% rename from mods/skinsdb/textures/character_1927.png rename to mods/skinsdb/textures/character.1927.png diff --git a/mods/skinsdb/textures/character_1928.png b/mods/skinsdb/textures/character.1928.png similarity index 100% rename from mods/skinsdb/textures/character_1928.png rename to mods/skinsdb/textures/character.1928.png diff --git a/mods/skinsdb/textures/character_1929.png b/mods/skinsdb/textures/character.1929.png similarity index 100% rename from mods/skinsdb/textures/character_1929.png rename to mods/skinsdb/textures/character.1929.png diff --git a/mods/skinsdb/textures/character_193.png b/mods/skinsdb/textures/character.193.png similarity index 100% rename from mods/skinsdb/textures/character_193.png rename to mods/skinsdb/textures/character.193.png diff --git a/mods/skinsdb/textures/character_1930.png b/mods/skinsdb/textures/character.1930.png similarity index 100% rename from mods/skinsdb/textures/character_1930.png rename to mods/skinsdb/textures/character.1930.png diff --git a/mods/skinsdb/textures/character_1931.png b/mods/skinsdb/textures/character.1931.png similarity index 100% rename from mods/skinsdb/textures/character_1931.png rename to mods/skinsdb/textures/character.1931.png diff --git a/mods/skinsdb/textures/character_1932.png b/mods/skinsdb/textures/character.1932.png similarity index 100% rename from mods/skinsdb/textures/character_1932.png rename to mods/skinsdb/textures/character.1932.png diff --git a/mods/skinsdb/textures/character_1933.png b/mods/skinsdb/textures/character.1933.png similarity index 100% rename from mods/skinsdb/textures/character_1933.png rename to mods/skinsdb/textures/character.1933.png diff --git a/mods/skinsdb/textures/character_1934.png b/mods/skinsdb/textures/character.1934.png similarity index 100% rename from mods/skinsdb/textures/character_1934.png rename to mods/skinsdb/textures/character.1934.png diff --git a/mods/skinsdb/textures/character_1935.png b/mods/skinsdb/textures/character.1935.png similarity index 100% rename from mods/skinsdb/textures/character_1935.png rename to mods/skinsdb/textures/character.1935.png diff --git a/mods/skinsdb/textures/character_1937.png b/mods/skinsdb/textures/character.1937.png similarity index 100% rename from mods/skinsdb/textures/character_1937.png rename to mods/skinsdb/textures/character.1937.png diff --git a/mods/skinsdb/textures/character_1938.png b/mods/skinsdb/textures/character.1938.png similarity index 100% rename from mods/skinsdb/textures/character_1938.png rename to mods/skinsdb/textures/character.1938.png diff --git a/mods/skinsdb/textures/character_1939.png b/mods/skinsdb/textures/character.1939.png similarity index 100% rename from mods/skinsdb/textures/character_1939.png rename to mods/skinsdb/textures/character.1939.png diff --git a/mods/skinsdb/textures/character_194.png b/mods/skinsdb/textures/character.194.png similarity index 100% rename from mods/skinsdb/textures/character_194.png rename to mods/skinsdb/textures/character.194.png diff --git a/mods/skinsdb/textures/character_1940.png b/mods/skinsdb/textures/character.1940.png similarity index 100% rename from mods/skinsdb/textures/character_1940.png rename to mods/skinsdb/textures/character.1940.png diff --git a/mods/skinsdb/textures/character_1941.png b/mods/skinsdb/textures/character.1941.png similarity index 100% rename from mods/skinsdb/textures/character_1941.png rename to mods/skinsdb/textures/character.1941.png diff --git a/mods/skinsdb/textures/character_1942.png b/mods/skinsdb/textures/character.1942.png similarity index 100% rename from mods/skinsdb/textures/character_1942.png rename to mods/skinsdb/textures/character.1942.png diff --git a/mods/skinsdb/textures/character_1943.png b/mods/skinsdb/textures/character.1943.png similarity index 100% rename from mods/skinsdb/textures/character_1943.png rename to mods/skinsdb/textures/character.1943.png diff --git a/mods/skinsdb/textures/character_1944.png b/mods/skinsdb/textures/character.1944.png similarity index 100% rename from mods/skinsdb/textures/character_1944.png rename to mods/skinsdb/textures/character.1944.png diff --git a/mods/skinsdb/textures/character_1945.png b/mods/skinsdb/textures/character.1945.png similarity index 100% rename from mods/skinsdb/textures/character_1945.png rename to mods/skinsdb/textures/character.1945.png diff --git a/mods/skinsdb/textures/character_1946.png b/mods/skinsdb/textures/character.1946.png similarity index 100% rename from mods/skinsdb/textures/character_1946.png rename to mods/skinsdb/textures/character.1946.png diff --git a/mods/skinsdb/textures/character_1947.png b/mods/skinsdb/textures/character.1947.png similarity index 100% rename from mods/skinsdb/textures/character_1947.png rename to mods/skinsdb/textures/character.1947.png diff --git a/mods/skinsdb/textures/character_1948.png b/mods/skinsdb/textures/character.1948.png similarity index 100% rename from mods/skinsdb/textures/character_1948.png rename to mods/skinsdb/textures/character.1948.png diff --git a/mods/skinsdb/textures/character_1949.png b/mods/skinsdb/textures/character.1949.png similarity index 100% rename from mods/skinsdb/textures/character_1949.png rename to mods/skinsdb/textures/character.1949.png diff --git a/mods/skinsdb/textures/character_195.png b/mods/skinsdb/textures/character.195.png similarity index 100% rename from mods/skinsdb/textures/character_195.png rename to mods/skinsdb/textures/character.195.png diff --git a/mods/skinsdb/textures/character_1950.png b/mods/skinsdb/textures/character.1950.png similarity index 100% rename from mods/skinsdb/textures/character_1950.png rename to mods/skinsdb/textures/character.1950.png diff --git a/mods/skinsdb/textures/character_1951.png b/mods/skinsdb/textures/character.1951.png similarity index 100% rename from mods/skinsdb/textures/character_1951.png rename to mods/skinsdb/textures/character.1951.png diff --git a/mods/skinsdb/textures/character_1952.png b/mods/skinsdb/textures/character.1952.png similarity index 100% rename from mods/skinsdb/textures/character_1952.png rename to mods/skinsdb/textures/character.1952.png diff --git a/mods/skinsdb/textures/character_1953.png b/mods/skinsdb/textures/character.1953.png similarity index 100% rename from mods/skinsdb/textures/character_1953.png rename to mods/skinsdb/textures/character.1953.png diff --git a/mods/skinsdb/textures/character_1954.png b/mods/skinsdb/textures/character.1954.png similarity index 100% rename from mods/skinsdb/textures/character_1954.png rename to mods/skinsdb/textures/character.1954.png diff --git a/mods/skinsdb/textures/character_1955.png b/mods/skinsdb/textures/character.1955.png similarity index 100% rename from mods/skinsdb/textures/character_1955.png rename to mods/skinsdb/textures/character.1955.png diff --git a/mods/skinsdb/textures/character_1956.png b/mods/skinsdb/textures/character.1956.png similarity index 100% rename from mods/skinsdb/textures/character_1956.png rename to mods/skinsdb/textures/character.1956.png diff --git a/mods/skinsdb/textures/character_1957.png b/mods/skinsdb/textures/character.1957.png similarity index 100% rename from mods/skinsdb/textures/character_1957.png rename to mods/skinsdb/textures/character.1957.png diff --git a/mods/skinsdb/textures/character_1958.png b/mods/skinsdb/textures/character.1958.png similarity index 100% rename from mods/skinsdb/textures/character_1958.png rename to mods/skinsdb/textures/character.1958.png diff --git a/mods/skinsdb/textures/character_1959.png b/mods/skinsdb/textures/character.1959.png similarity index 100% rename from mods/skinsdb/textures/character_1959.png rename to mods/skinsdb/textures/character.1959.png diff --git a/mods/skinsdb/textures/character_196.png b/mods/skinsdb/textures/character.196.png similarity index 100% rename from mods/skinsdb/textures/character_196.png rename to mods/skinsdb/textures/character.196.png diff --git a/mods/skinsdb/textures/character_1960.png b/mods/skinsdb/textures/character.1960.png similarity index 100% rename from mods/skinsdb/textures/character_1960.png rename to mods/skinsdb/textures/character.1960.png diff --git a/mods/skinsdb/textures/character_1961.png b/mods/skinsdb/textures/character.1961.png similarity index 100% rename from mods/skinsdb/textures/character_1961.png rename to mods/skinsdb/textures/character.1961.png diff --git a/mods/skinsdb/textures/character_1962.png b/mods/skinsdb/textures/character.1962.png similarity index 100% rename from mods/skinsdb/textures/character_1962.png rename to mods/skinsdb/textures/character.1962.png diff --git a/mods/skinsdb/textures/character_1963.png b/mods/skinsdb/textures/character.1963.png similarity index 100% rename from mods/skinsdb/textures/character_1963.png rename to mods/skinsdb/textures/character.1963.png diff --git a/mods/skinsdb/textures/character_1964.png b/mods/skinsdb/textures/character.1964.png similarity index 100% rename from mods/skinsdb/textures/character_1964.png rename to mods/skinsdb/textures/character.1964.png diff --git a/mods/skinsdb/textures/character_1965.png b/mods/skinsdb/textures/character.1965.png similarity index 100% rename from mods/skinsdb/textures/character_1965.png rename to mods/skinsdb/textures/character.1965.png diff --git a/mods/skinsdb/textures/character_1966.png b/mods/skinsdb/textures/character.1966.png similarity index 100% rename from mods/skinsdb/textures/character_1966.png rename to mods/skinsdb/textures/character.1966.png diff --git a/mods/skinsdb/textures/character_1967.png b/mods/skinsdb/textures/character.1967.png similarity index 100% rename from mods/skinsdb/textures/character_1967.png rename to mods/skinsdb/textures/character.1967.png diff --git a/mods/skinsdb/textures/character_1968.png b/mods/skinsdb/textures/character.1968.png similarity index 100% rename from mods/skinsdb/textures/character_1968.png rename to mods/skinsdb/textures/character.1968.png diff --git a/mods/skinsdb/textures/character_1969.png b/mods/skinsdb/textures/character.1969.png similarity index 100% rename from mods/skinsdb/textures/character_1969.png rename to mods/skinsdb/textures/character.1969.png diff --git a/mods/skinsdb/textures/character_197.png b/mods/skinsdb/textures/character.197.png similarity index 100% rename from mods/skinsdb/textures/character_197.png rename to mods/skinsdb/textures/character.197.png diff --git a/mods/skinsdb/textures/character_1970.png b/mods/skinsdb/textures/character.1970.png similarity index 100% rename from mods/skinsdb/textures/character_1970.png rename to mods/skinsdb/textures/character.1970.png diff --git a/mods/skinsdb/textures/character_1971.png b/mods/skinsdb/textures/character.1971.png similarity index 100% rename from mods/skinsdb/textures/character_1971.png rename to mods/skinsdb/textures/character.1971.png diff --git a/mods/skinsdb/textures/character_1972.png b/mods/skinsdb/textures/character.1972.png similarity index 100% rename from mods/skinsdb/textures/character_1972.png rename to mods/skinsdb/textures/character.1972.png diff --git a/mods/skinsdb/textures/character_1973.png b/mods/skinsdb/textures/character.1973.png similarity index 100% rename from mods/skinsdb/textures/character_1973.png rename to mods/skinsdb/textures/character.1973.png diff --git a/mods/skinsdb/textures/character_1974.png b/mods/skinsdb/textures/character.1974.png similarity index 100% rename from mods/skinsdb/textures/character_1974.png rename to mods/skinsdb/textures/character.1974.png diff --git a/mods/skinsdb/textures/character_1975.png b/mods/skinsdb/textures/character.1975.png similarity index 100% rename from mods/skinsdb/textures/character_1975.png rename to mods/skinsdb/textures/character.1975.png diff --git a/mods/skinsdb/textures/character_1976.png b/mods/skinsdb/textures/character.1976.png similarity index 100% rename from mods/skinsdb/textures/character_1976.png rename to mods/skinsdb/textures/character.1976.png diff --git a/mods/skinsdb/textures/character_1977.png b/mods/skinsdb/textures/character.1977.png similarity index 100% rename from mods/skinsdb/textures/character_1977.png rename to mods/skinsdb/textures/character.1977.png diff --git a/mods/skinsdb/textures/character_1978.png b/mods/skinsdb/textures/character.1978.png similarity index 100% rename from mods/skinsdb/textures/character_1978.png rename to mods/skinsdb/textures/character.1978.png diff --git a/mods/skinsdb/textures/character_1979.png b/mods/skinsdb/textures/character.1979.png similarity index 100% rename from mods/skinsdb/textures/character_1979.png rename to mods/skinsdb/textures/character.1979.png diff --git a/mods/skinsdb/textures/character_198.png b/mods/skinsdb/textures/character.198.png similarity index 100% rename from mods/skinsdb/textures/character_198.png rename to mods/skinsdb/textures/character.198.png diff --git a/mods/skinsdb/textures/character_1980.png b/mods/skinsdb/textures/character.1980.png similarity index 100% rename from mods/skinsdb/textures/character_1980.png rename to mods/skinsdb/textures/character.1980.png diff --git a/mods/skinsdb/textures/character_1981.png b/mods/skinsdb/textures/character.1981.png similarity index 100% rename from mods/skinsdb/textures/character_1981.png rename to mods/skinsdb/textures/character.1981.png diff --git a/mods/skinsdb/textures/character_1982.png b/mods/skinsdb/textures/character.1982.png similarity index 100% rename from mods/skinsdb/textures/character_1982.png rename to mods/skinsdb/textures/character.1982.png diff --git a/mods/skinsdb/textures/character_1983.png b/mods/skinsdb/textures/character.1983.png similarity index 100% rename from mods/skinsdb/textures/character_1983.png rename to mods/skinsdb/textures/character.1983.png diff --git a/mods/skinsdb/textures/character_1984.png b/mods/skinsdb/textures/character.1984.png similarity index 100% rename from mods/skinsdb/textures/character_1984.png rename to mods/skinsdb/textures/character.1984.png diff --git a/mods/skinsdb/textures/character_1985.png b/mods/skinsdb/textures/character.1985.png similarity index 100% rename from mods/skinsdb/textures/character_1985.png rename to mods/skinsdb/textures/character.1985.png diff --git a/mods/skinsdb/textures/character_1986.png b/mods/skinsdb/textures/character.1986.png similarity index 100% rename from mods/skinsdb/textures/character_1986.png rename to mods/skinsdb/textures/character.1986.png diff --git a/mods/skinsdb/textures/character_1987.png b/mods/skinsdb/textures/character.1987.png similarity index 100% rename from mods/skinsdb/textures/character_1987.png rename to mods/skinsdb/textures/character.1987.png diff --git a/mods/skinsdb/textures/character_1988.png b/mods/skinsdb/textures/character.1988.png similarity index 100% rename from mods/skinsdb/textures/character_1988.png rename to mods/skinsdb/textures/character.1988.png diff --git a/mods/skinsdb/textures/character_1989.png b/mods/skinsdb/textures/character.1989.png similarity index 100% rename from mods/skinsdb/textures/character_1989.png rename to mods/skinsdb/textures/character.1989.png diff --git a/mods/skinsdb/textures/character_199.png b/mods/skinsdb/textures/character.199.png similarity index 100% rename from mods/skinsdb/textures/character_199.png rename to mods/skinsdb/textures/character.199.png diff --git a/mods/skinsdb/textures/character_1990.png b/mods/skinsdb/textures/character.1990.png similarity index 100% rename from mods/skinsdb/textures/character_1990.png rename to mods/skinsdb/textures/character.1990.png diff --git a/mods/skinsdb/textures/character_1991.png b/mods/skinsdb/textures/character.1991.png similarity index 100% rename from mods/skinsdb/textures/character_1991.png rename to mods/skinsdb/textures/character.1991.png diff --git a/mods/skinsdb/textures/character_1992.png b/mods/skinsdb/textures/character.1992.png similarity index 100% rename from mods/skinsdb/textures/character_1992.png rename to mods/skinsdb/textures/character.1992.png diff --git a/mods/skinsdb/textures/character_1993.png b/mods/skinsdb/textures/character.1993.png similarity index 100% rename from mods/skinsdb/textures/character_1993.png rename to mods/skinsdb/textures/character.1993.png diff --git a/mods/skinsdb/textures/character_1994.png b/mods/skinsdb/textures/character.1994.png similarity index 100% rename from mods/skinsdb/textures/character_1994.png rename to mods/skinsdb/textures/character.1994.png diff --git a/mods/skinsdb/textures/character_1995.png b/mods/skinsdb/textures/character.1995.png similarity index 100% rename from mods/skinsdb/textures/character_1995.png rename to mods/skinsdb/textures/character.1995.png diff --git a/mods/skinsdb/textures/character_1996.png b/mods/skinsdb/textures/character.1996.png similarity index 100% rename from mods/skinsdb/textures/character_1996.png rename to mods/skinsdb/textures/character.1996.png diff --git a/mods/skinsdb/textures/character_1997.png b/mods/skinsdb/textures/character.1997.png similarity index 100% rename from mods/skinsdb/textures/character_1997.png rename to mods/skinsdb/textures/character.1997.png diff --git a/mods/skinsdb/textures/character_1998.png b/mods/skinsdb/textures/character.1998.png similarity index 100% rename from mods/skinsdb/textures/character_1998.png rename to mods/skinsdb/textures/character.1998.png diff --git a/mods/skinsdb/textures/character_1999.png b/mods/skinsdb/textures/character.1999.png similarity index 100% rename from mods/skinsdb/textures/character_1999.png rename to mods/skinsdb/textures/character.1999.png diff --git a/mods/skinsdb/textures/character_2.png b/mods/skinsdb/textures/character.2.png similarity index 100% rename from mods/skinsdb/textures/character_2.png rename to mods/skinsdb/textures/character.2.png diff --git a/mods/skinsdb/textures/character_20.png b/mods/skinsdb/textures/character.20.png similarity index 100% rename from mods/skinsdb/textures/character_20.png rename to mods/skinsdb/textures/character.20.png diff --git a/mods/skinsdb/textures/character_200.png b/mods/skinsdb/textures/character.200.png similarity index 100% rename from mods/skinsdb/textures/character_200.png rename to mods/skinsdb/textures/character.200.png diff --git a/mods/skinsdb/textures/character_2000.png b/mods/skinsdb/textures/character.2000.png similarity index 100% rename from mods/skinsdb/textures/character_2000.png rename to mods/skinsdb/textures/character.2000.png diff --git a/mods/skinsdb/textures/character_2001.png b/mods/skinsdb/textures/character.2001.png similarity index 100% rename from mods/skinsdb/textures/character_2001.png rename to mods/skinsdb/textures/character.2001.png diff --git a/mods/skinsdb/textures/character_2002.png b/mods/skinsdb/textures/character.2002.png similarity index 100% rename from mods/skinsdb/textures/character_2002.png rename to mods/skinsdb/textures/character.2002.png diff --git a/mods/skinsdb/textures/character_2003.png b/mods/skinsdb/textures/character.2003.png similarity index 100% rename from mods/skinsdb/textures/character_2003.png rename to mods/skinsdb/textures/character.2003.png diff --git a/mods/skinsdb/textures/character_2004.png b/mods/skinsdb/textures/character.2004.png similarity index 100% rename from mods/skinsdb/textures/character_2004.png rename to mods/skinsdb/textures/character.2004.png diff --git a/mods/skinsdb/textures/character_2005.png b/mods/skinsdb/textures/character.2005.png similarity index 100% rename from mods/skinsdb/textures/character_2005.png rename to mods/skinsdb/textures/character.2005.png diff --git a/mods/skinsdb/textures/character_2006.png b/mods/skinsdb/textures/character.2006.png similarity index 100% rename from mods/skinsdb/textures/character_2006.png rename to mods/skinsdb/textures/character.2006.png diff --git a/mods/skinsdb/textures/character_2007.png b/mods/skinsdb/textures/character.2007.png similarity index 100% rename from mods/skinsdb/textures/character_2007.png rename to mods/skinsdb/textures/character.2007.png diff --git a/mods/skinsdb/textures/character_2008.png b/mods/skinsdb/textures/character.2008.png similarity index 100% rename from mods/skinsdb/textures/character_2008.png rename to mods/skinsdb/textures/character.2008.png diff --git a/mods/skinsdb/textures/character_2009.png b/mods/skinsdb/textures/character.2009.png similarity index 100% rename from mods/skinsdb/textures/character_2009.png rename to mods/skinsdb/textures/character.2009.png diff --git a/mods/skinsdb/textures/character_201.png b/mods/skinsdb/textures/character.201.png similarity index 100% rename from mods/skinsdb/textures/character_201.png rename to mods/skinsdb/textures/character.201.png diff --git a/mods/skinsdb/textures/character_2010.png b/mods/skinsdb/textures/character.2010.png similarity index 100% rename from mods/skinsdb/textures/character_2010.png rename to mods/skinsdb/textures/character.2010.png diff --git a/mods/skinsdb/textures/character_2011.png b/mods/skinsdb/textures/character.2011.png similarity index 100% rename from mods/skinsdb/textures/character_2011.png rename to mods/skinsdb/textures/character.2011.png diff --git a/mods/skinsdb/textures/character_2012.png b/mods/skinsdb/textures/character.2012.png similarity index 100% rename from mods/skinsdb/textures/character_2012.png rename to mods/skinsdb/textures/character.2012.png diff --git a/mods/skinsdb/textures/character_2013.png b/mods/skinsdb/textures/character.2013.png similarity index 100% rename from mods/skinsdb/textures/character_2013.png rename to mods/skinsdb/textures/character.2013.png diff --git a/mods/skinsdb/textures/character_2014.png b/mods/skinsdb/textures/character.2014.png similarity index 100% rename from mods/skinsdb/textures/character_2014.png rename to mods/skinsdb/textures/character.2014.png diff --git a/mods/skinsdb/textures/character_2015.png b/mods/skinsdb/textures/character.2015.png similarity index 100% rename from mods/skinsdb/textures/character_2015.png rename to mods/skinsdb/textures/character.2015.png diff --git a/mods/skinsdb/textures/character_2016.png b/mods/skinsdb/textures/character.2016.png similarity index 100% rename from mods/skinsdb/textures/character_2016.png rename to mods/skinsdb/textures/character.2016.png diff --git a/mods/skinsdb/textures/character_2017.png b/mods/skinsdb/textures/character.2017.png similarity index 100% rename from mods/skinsdb/textures/character_2017.png rename to mods/skinsdb/textures/character.2017.png diff --git a/mods/skinsdb/textures/character_2018.png b/mods/skinsdb/textures/character.2018.png similarity index 100% rename from mods/skinsdb/textures/character_2018.png rename to mods/skinsdb/textures/character.2018.png diff --git a/mods/skinsdb/textures/character_2019.png b/mods/skinsdb/textures/character.2019.png similarity index 100% rename from mods/skinsdb/textures/character_2019.png rename to mods/skinsdb/textures/character.2019.png diff --git a/mods/skinsdb/textures/character_2020.png b/mods/skinsdb/textures/character.2020.png similarity index 100% rename from mods/skinsdb/textures/character_2020.png rename to mods/skinsdb/textures/character.2020.png diff --git a/mods/skinsdb/textures/character_2021.png b/mods/skinsdb/textures/character.2021.png similarity index 100% rename from mods/skinsdb/textures/character_2021.png rename to mods/skinsdb/textures/character.2021.png diff --git a/mods/skinsdb/textures/character_2022.png b/mods/skinsdb/textures/character.2022.png similarity index 100% rename from mods/skinsdb/textures/character_2022.png rename to mods/skinsdb/textures/character.2022.png diff --git a/mods/skinsdb/textures/character_2023.png b/mods/skinsdb/textures/character.2023.png similarity index 100% rename from mods/skinsdb/textures/character_2023.png rename to mods/skinsdb/textures/character.2023.png diff --git a/mods/skinsdb/textures/character_2024.png b/mods/skinsdb/textures/character.2024.png similarity index 100% rename from mods/skinsdb/textures/character_2024.png rename to mods/skinsdb/textures/character.2024.png diff --git a/mods/skinsdb/textures/character_2025.png b/mods/skinsdb/textures/character.2025.png similarity index 100% rename from mods/skinsdb/textures/character_2025.png rename to mods/skinsdb/textures/character.2025.png diff --git a/mods/skinsdb/textures/character_2026.png b/mods/skinsdb/textures/character.2026.png similarity index 100% rename from mods/skinsdb/textures/character_2026.png rename to mods/skinsdb/textures/character.2026.png diff --git a/mods/skinsdb/textures/character_2027.png b/mods/skinsdb/textures/character.2027.png similarity index 100% rename from mods/skinsdb/textures/character_2027.png rename to mods/skinsdb/textures/character.2027.png diff --git a/mods/skinsdb/textures/character_2028.png b/mods/skinsdb/textures/character.2028.png similarity index 100% rename from mods/skinsdb/textures/character_2028.png rename to mods/skinsdb/textures/character.2028.png diff --git a/mods/skinsdb/textures/character_2029.png b/mods/skinsdb/textures/character.2029.png similarity index 100% rename from mods/skinsdb/textures/character_2029.png rename to mods/skinsdb/textures/character.2029.png diff --git a/mods/skinsdb/textures/character_203.png b/mods/skinsdb/textures/character.203.png similarity index 100% rename from mods/skinsdb/textures/character_203.png rename to mods/skinsdb/textures/character.203.png diff --git a/mods/skinsdb/textures/character_2030.png b/mods/skinsdb/textures/character.2030.png similarity index 100% rename from mods/skinsdb/textures/character_2030.png rename to mods/skinsdb/textures/character.2030.png diff --git a/mods/skinsdb/textures/character_2031.png b/mods/skinsdb/textures/character.2031.png similarity index 100% rename from mods/skinsdb/textures/character_2031.png rename to mods/skinsdb/textures/character.2031.png diff --git a/mods/skinsdb/textures/character_2032.png b/mods/skinsdb/textures/character.2032.png similarity index 100% rename from mods/skinsdb/textures/character_2032.png rename to mods/skinsdb/textures/character.2032.png diff --git a/mods/skinsdb/textures/character_2033.png b/mods/skinsdb/textures/character.2033.png similarity index 100% rename from mods/skinsdb/textures/character_2033.png rename to mods/skinsdb/textures/character.2033.png diff --git a/mods/skinsdb/textures/character_2034.png b/mods/skinsdb/textures/character.2034.png similarity index 100% rename from mods/skinsdb/textures/character_2034.png rename to mods/skinsdb/textures/character.2034.png diff --git a/mods/skinsdb/textures/character_2035.png b/mods/skinsdb/textures/character.2035.png similarity index 100% rename from mods/skinsdb/textures/character_2035.png rename to mods/skinsdb/textures/character.2035.png diff --git a/mods/skinsdb/textures/character_2036.png b/mods/skinsdb/textures/character.2036.png similarity index 100% rename from mods/skinsdb/textures/character_2036.png rename to mods/skinsdb/textures/character.2036.png diff --git a/mods/skinsdb/textures/character_2037.png b/mods/skinsdb/textures/character.2037.png similarity index 100% rename from mods/skinsdb/textures/character_2037.png rename to mods/skinsdb/textures/character.2037.png diff --git a/mods/skinsdb/textures/character_2038.png b/mods/skinsdb/textures/character.2038.png similarity index 100% rename from mods/skinsdb/textures/character_2038.png rename to mods/skinsdb/textures/character.2038.png diff --git a/mods/skinsdb/textures/character_2039.png b/mods/skinsdb/textures/character.2039.png similarity index 100% rename from mods/skinsdb/textures/character_2039.png rename to mods/skinsdb/textures/character.2039.png diff --git a/mods/skinsdb/textures/character_2040.png b/mods/skinsdb/textures/character.2040.png similarity index 100% rename from mods/skinsdb/textures/character_2040.png rename to mods/skinsdb/textures/character.2040.png diff --git a/mods/skinsdb/textures/character_2041.png b/mods/skinsdb/textures/character.2041.png similarity index 100% rename from mods/skinsdb/textures/character_2041.png rename to mods/skinsdb/textures/character.2041.png diff --git a/mods/skinsdb/textures/character_2042.png b/mods/skinsdb/textures/character.2042.png similarity index 100% rename from mods/skinsdb/textures/character_2042.png rename to mods/skinsdb/textures/character.2042.png diff --git a/mods/skinsdb/textures/character_2043.png b/mods/skinsdb/textures/character.2043.png similarity index 100% rename from mods/skinsdb/textures/character_2043.png rename to mods/skinsdb/textures/character.2043.png diff --git a/mods/skinsdb/textures/character_2044.png b/mods/skinsdb/textures/character.2044.png similarity index 100% rename from mods/skinsdb/textures/character_2044.png rename to mods/skinsdb/textures/character.2044.png diff --git a/mods/skinsdb/textures/character_2045.png b/mods/skinsdb/textures/character.2045.png similarity index 100% rename from mods/skinsdb/textures/character_2045.png rename to mods/skinsdb/textures/character.2045.png diff --git a/mods/skinsdb/textures/character_2046.png b/mods/skinsdb/textures/character.2046.png similarity index 100% rename from mods/skinsdb/textures/character_2046.png rename to mods/skinsdb/textures/character.2046.png diff --git a/mods/skinsdb/textures/character_2047.png b/mods/skinsdb/textures/character.2047.png similarity index 100% rename from mods/skinsdb/textures/character_2047.png rename to mods/skinsdb/textures/character.2047.png diff --git a/mods/skinsdb/textures/character_2048.png b/mods/skinsdb/textures/character.2048.png similarity index 100% rename from mods/skinsdb/textures/character_2048.png rename to mods/skinsdb/textures/character.2048.png diff --git a/mods/skinsdb/textures/character_2049.png b/mods/skinsdb/textures/character.2049.png similarity index 100% rename from mods/skinsdb/textures/character_2049.png rename to mods/skinsdb/textures/character.2049.png diff --git a/mods/skinsdb/textures/character_205.png b/mods/skinsdb/textures/character.205.png similarity index 100% rename from mods/skinsdb/textures/character_205.png rename to mods/skinsdb/textures/character.205.png diff --git a/mods/skinsdb/textures/character_2050.png b/mods/skinsdb/textures/character.2050.png similarity index 100% rename from mods/skinsdb/textures/character_2050.png rename to mods/skinsdb/textures/character.2050.png diff --git a/mods/skinsdb/textures/character_2051.png b/mods/skinsdb/textures/character.2051.png similarity index 100% rename from mods/skinsdb/textures/character_2051.png rename to mods/skinsdb/textures/character.2051.png diff --git a/mods/skinsdb/textures/character_2052.png b/mods/skinsdb/textures/character.2052.png similarity index 100% rename from mods/skinsdb/textures/character_2052.png rename to mods/skinsdb/textures/character.2052.png diff --git a/mods/skinsdb/textures/character_2053.png b/mods/skinsdb/textures/character.2053.png similarity index 100% rename from mods/skinsdb/textures/character_2053.png rename to mods/skinsdb/textures/character.2053.png diff --git a/mods/skinsdb/textures/character_2054.png b/mods/skinsdb/textures/character.2054.png similarity index 100% rename from mods/skinsdb/textures/character_2054.png rename to mods/skinsdb/textures/character.2054.png diff --git a/mods/skinsdb/textures/character_2055.png b/mods/skinsdb/textures/character.2055.png similarity index 100% rename from mods/skinsdb/textures/character_2055.png rename to mods/skinsdb/textures/character.2055.png diff --git a/mods/skinsdb/textures/character_2056.png b/mods/skinsdb/textures/character.2056.png similarity index 100% rename from mods/skinsdb/textures/character_2056.png rename to mods/skinsdb/textures/character.2056.png diff --git a/mods/skinsdb/textures/character_2057.png b/mods/skinsdb/textures/character.2057.png similarity index 100% rename from mods/skinsdb/textures/character_2057.png rename to mods/skinsdb/textures/character.2057.png diff --git a/mods/skinsdb/textures/character_2058.png b/mods/skinsdb/textures/character.2058.png similarity index 100% rename from mods/skinsdb/textures/character_2058.png rename to mods/skinsdb/textures/character.2058.png diff --git a/mods/skinsdb/textures/character_2059.png b/mods/skinsdb/textures/character.2059.png similarity index 100% rename from mods/skinsdb/textures/character_2059.png rename to mods/skinsdb/textures/character.2059.png diff --git a/mods/skinsdb/textures/character_206.png b/mods/skinsdb/textures/character.206.png similarity index 100% rename from mods/skinsdb/textures/character_206.png rename to mods/skinsdb/textures/character.206.png diff --git a/mods/skinsdb/textures/character_2060.png b/mods/skinsdb/textures/character.2060.png similarity index 100% rename from mods/skinsdb/textures/character_2060.png rename to mods/skinsdb/textures/character.2060.png diff --git a/mods/skinsdb/textures/character_2061.png b/mods/skinsdb/textures/character.2061.png similarity index 100% rename from mods/skinsdb/textures/character_2061.png rename to mods/skinsdb/textures/character.2061.png diff --git a/mods/skinsdb/textures/character_2062.png b/mods/skinsdb/textures/character.2062.png similarity index 100% rename from mods/skinsdb/textures/character_2062.png rename to mods/skinsdb/textures/character.2062.png diff --git a/mods/skinsdb/textures/character_2063.png b/mods/skinsdb/textures/character.2063.png similarity index 100% rename from mods/skinsdb/textures/character_2063.png rename to mods/skinsdb/textures/character.2063.png diff --git a/mods/skinsdb/textures/character_2064.png b/mods/skinsdb/textures/character.2064.png similarity index 100% rename from mods/skinsdb/textures/character_2064.png rename to mods/skinsdb/textures/character.2064.png diff --git a/mods/skinsdb/textures/character_2065.png b/mods/skinsdb/textures/character.2065.png similarity index 100% rename from mods/skinsdb/textures/character_2065.png rename to mods/skinsdb/textures/character.2065.png diff --git a/mods/skinsdb/textures/character_2066.png b/mods/skinsdb/textures/character.2066.png similarity index 100% rename from mods/skinsdb/textures/character_2066.png rename to mods/skinsdb/textures/character.2066.png diff --git a/mods/skinsdb/textures/character_2067.png b/mods/skinsdb/textures/character.2067.png similarity index 100% rename from mods/skinsdb/textures/character_2067.png rename to mods/skinsdb/textures/character.2067.png diff --git a/mods/skinsdb/textures/character_2068.png b/mods/skinsdb/textures/character.2068.png similarity index 100% rename from mods/skinsdb/textures/character_2068.png rename to mods/skinsdb/textures/character.2068.png diff --git a/mods/skinsdb/textures/character_2069.png b/mods/skinsdb/textures/character.2069.png similarity index 100% rename from mods/skinsdb/textures/character_2069.png rename to mods/skinsdb/textures/character.2069.png diff --git a/mods/skinsdb/textures/character_207.png b/mods/skinsdb/textures/character.207.png similarity index 100% rename from mods/skinsdb/textures/character_207.png rename to mods/skinsdb/textures/character.207.png diff --git a/mods/skinsdb/textures/character_2070.png b/mods/skinsdb/textures/character.2070.png similarity index 100% rename from mods/skinsdb/textures/character_2070.png rename to mods/skinsdb/textures/character.2070.png diff --git a/mods/skinsdb/textures/character_2071.png b/mods/skinsdb/textures/character.2071.png similarity index 100% rename from mods/skinsdb/textures/character_2071.png rename to mods/skinsdb/textures/character.2071.png diff --git a/mods/skinsdb/textures/character_2072.png b/mods/skinsdb/textures/character.2072.png similarity index 100% rename from mods/skinsdb/textures/character_2072.png rename to mods/skinsdb/textures/character.2072.png diff --git a/mods/skinsdb/textures/character_2073.png b/mods/skinsdb/textures/character.2073.png similarity index 100% rename from mods/skinsdb/textures/character_2073.png rename to mods/skinsdb/textures/character.2073.png diff --git a/mods/skinsdb/textures/character_2074.png b/mods/skinsdb/textures/character.2074.png similarity index 100% rename from mods/skinsdb/textures/character_2074.png rename to mods/skinsdb/textures/character.2074.png diff --git a/mods/skinsdb/textures/character_2075.png b/mods/skinsdb/textures/character.2075.png similarity index 100% rename from mods/skinsdb/textures/character_2075.png rename to mods/skinsdb/textures/character.2075.png diff --git a/mods/skinsdb/textures/character_2076.png b/mods/skinsdb/textures/character.2076.png similarity index 100% rename from mods/skinsdb/textures/character_2076.png rename to mods/skinsdb/textures/character.2076.png diff --git a/mods/skinsdb/textures/character_2077.png b/mods/skinsdb/textures/character.2077.png similarity index 100% rename from mods/skinsdb/textures/character_2077.png rename to mods/skinsdb/textures/character.2077.png diff --git a/mods/skinsdb/textures/character_2078.png b/mods/skinsdb/textures/character.2078.png similarity index 100% rename from mods/skinsdb/textures/character_2078.png rename to mods/skinsdb/textures/character.2078.png diff --git a/mods/skinsdb/textures/character_2079.png b/mods/skinsdb/textures/character.2079.png similarity index 100% rename from mods/skinsdb/textures/character_2079.png rename to mods/skinsdb/textures/character.2079.png diff --git a/mods/skinsdb/textures/character_208.png b/mods/skinsdb/textures/character.208.png similarity index 100% rename from mods/skinsdb/textures/character_208.png rename to mods/skinsdb/textures/character.208.png diff --git a/mods/skinsdb/textures/character_2080.png b/mods/skinsdb/textures/character.2080.png similarity index 100% rename from mods/skinsdb/textures/character_2080.png rename to mods/skinsdb/textures/character.2080.png diff --git a/mods/skinsdb/textures/character_2081.png b/mods/skinsdb/textures/character.2081.png similarity index 100% rename from mods/skinsdb/textures/character_2081.png rename to mods/skinsdb/textures/character.2081.png diff --git a/mods/skinsdb/textures/character_2082.png b/mods/skinsdb/textures/character.2082.png similarity index 100% rename from mods/skinsdb/textures/character_2082.png rename to mods/skinsdb/textures/character.2082.png diff --git a/mods/skinsdb/textures/character_2083.png b/mods/skinsdb/textures/character.2083.png similarity index 100% rename from mods/skinsdb/textures/character_2083.png rename to mods/skinsdb/textures/character.2083.png diff --git a/mods/skinsdb/textures/character_2084.png b/mods/skinsdb/textures/character.2084.png similarity index 100% rename from mods/skinsdb/textures/character_2084.png rename to mods/skinsdb/textures/character.2084.png diff --git a/mods/skinsdb/textures/character_2085.png b/mods/skinsdb/textures/character.2085.png similarity index 100% rename from mods/skinsdb/textures/character_2085.png rename to mods/skinsdb/textures/character.2085.png diff --git a/mods/skinsdb/textures/character_2086.png b/mods/skinsdb/textures/character.2086.png similarity index 100% rename from mods/skinsdb/textures/character_2086.png rename to mods/skinsdb/textures/character.2086.png diff --git a/mods/skinsdb/textures/character_2087.png b/mods/skinsdb/textures/character.2087.png similarity index 100% rename from mods/skinsdb/textures/character_2087.png rename to mods/skinsdb/textures/character.2087.png diff --git a/mods/skinsdb/textures/character_2088.png b/mods/skinsdb/textures/character.2088.png similarity index 100% rename from mods/skinsdb/textures/character_2088.png rename to mods/skinsdb/textures/character.2088.png diff --git a/mods/skinsdb/textures/character_2089.png b/mods/skinsdb/textures/character.2089.png similarity index 100% rename from mods/skinsdb/textures/character_2089.png rename to mods/skinsdb/textures/character.2089.png diff --git a/mods/skinsdb/textures/character_209.png b/mods/skinsdb/textures/character.209.png similarity index 100% rename from mods/skinsdb/textures/character_209.png rename to mods/skinsdb/textures/character.209.png diff --git a/mods/skinsdb/textures/character_2090.png b/mods/skinsdb/textures/character.2090.png similarity index 100% rename from mods/skinsdb/textures/character_2090.png rename to mods/skinsdb/textures/character.2090.png diff --git a/mods/skinsdb/textures/character_2091.png b/mods/skinsdb/textures/character.2091.png similarity index 100% rename from mods/skinsdb/textures/character_2091.png rename to mods/skinsdb/textures/character.2091.png diff --git a/mods/skinsdb/textures/character_2092.png b/mods/skinsdb/textures/character.2092.png similarity index 100% rename from mods/skinsdb/textures/character_2092.png rename to mods/skinsdb/textures/character.2092.png diff --git a/mods/skinsdb/textures/character_2093.png b/mods/skinsdb/textures/character.2093.png similarity index 100% rename from mods/skinsdb/textures/character_2093.png rename to mods/skinsdb/textures/character.2093.png diff --git a/mods/skinsdb/textures/character_2094.png b/mods/skinsdb/textures/character.2094.png similarity index 100% rename from mods/skinsdb/textures/character_2094.png rename to mods/skinsdb/textures/character.2094.png diff --git a/mods/skinsdb/textures/character_2095.png b/mods/skinsdb/textures/character.2095.png similarity index 100% rename from mods/skinsdb/textures/character_2095.png rename to mods/skinsdb/textures/character.2095.png diff --git a/mods/skinsdb/textures/character_2096.png b/mods/skinsdb/textures/character.2096.png similarity index 100% rename from mods/skinsdb/textures/character_2096.png rename to mods/skinsdb/textures/character.2096.png diff --git a/mods/skinsdb/textures/character_2097.png b/mods/skinsdb/textures/character.2097.png similarity index 100% rename from mods/skinsdb/textures/character_2097.png rename to mods/skinsdb/textures/character.2097.png diff --git a/mods/skinsdb/textures/character_2098.png b/mods/skinsdb/textures/character.2098.png similarity index 100% rename from mods/skinsdb/textures/character_2098.png rename to mods/skinsdb/textures/character.2098.png diff --git a/mods/skinsdb/textures/character_2099.png b/mods/skinsdb/textures/character.2099.png similarity index 100% rename from mods/skinsdb/textures/character_2099.png rename to mods/skinsdb/textures/character.2099.png diff --git a/mods/skinsdb/textures/character_21.png b/mods/skinsdb/textures/character.21.png similarity index 100% rename from mods/skinsdb/textures/character_21.png rename to mods/skinsdb/textures/character.21.png diff --git a/mods/skinsdb/textures/character_210.png b/mods/skinsdb/textures/character.210.png similarity index 100% rename from mods/skinsdb/textures/character_210.png rename to mods/skinsdb/textures/character.210.png diff --git a/mods/skinsdb/textures/character_2100.png b/mods/skinsdb/textures/character.2100.png similarity index 100% rename from mods/skinsdb/textures/character_2100.png rename to mods/skinsdb/textures/character.2100.png diff --git a/mods/skinsdb/textures/character_2101.png b/mods/skinsdb/textures/character.2101.png similarity index 100% rename from mods/skinsdb/textures/character_2101.png rename to mods/skinsdb/textures/character.2101.png diff --git a/mods/skinsdb/textures/character_2102.png b/mods/skinsdb/textures/character.2102.png similarity index 100% rename from mods/skinsdb/textures/character_2102.png rename to mods/skinsdb/textures/character.2102.png diff --git a/mods/skinsdb/textures/character_2103.png b/mods/skinsdb/textures/character.2103.png similarity index 100% rename from mods/skinsdb/textures/character_2103.png rename to mods/skinsdb/textures/character.2103.png diff --git a/mods/skinsdb/textures/character_2104.png b/mods/skinsdb/textures/character.2104.png similarity index 100% rename from mods/skinsdb/textures/character_2104.png rename to mods/skinsdb/textures/character.2104.png diff --git a/mods/skinsdb/textures/character_2105.png b/mods/skinsdb/textures/character.2105.png similarity index 100% rename from mods/skinsdb/textures/character_2105.png rename to mods/skinsdb/textures/character.2105.png diff --git a/mods/skinsdb/textures/character_2106.png b/mods/skinsdb/textures/character.2106.png similarity index 100% rename from mods/skinsdb/textures/character_2106.png rename to mods/skinsdb/textures/character.2106.png diff --git a/mods/skinsdb/textures/character_2107.png b/mods/skinsdb/textures/character.2107.png similarity index 100% rename from mods/skinsdb/textures/character_2107.png rename to mods/skinsdb/textures/character.2107.png diff --git a/mods/skinsdb/textures/character_2108.png b/mods/skinsdb/textures/character.2108.png similarity index 100% rename from mods/skinsdb/textures/character_2108.png rename to mods/skinsdb/textures/character.2108.png diff --git a/mods/skinsdb/textures/character_2109.png b/mods/skinsdb/textures/character.2109.png similarity index 100% rename from mods/skinsdb/textures/character_2109.png rename to mods/skinsdb/textures/character.2109.png diff --git a/mods/skinsdb/textures/character_211.png b/mods/skinsdb/textures/character.211.png similarity index 100% rename from mods/skinsdb/textures/character_211.png rename to mods/skinsdb/textures/character.211.png diff --git a/mods/skinsdb/textures/character_2110.png b/mods/skinsdb/textures/character.2110.png similarity index 100% rename from mods/skinsdb/textures/character_2110.png rename to mods/skinsdb/textures/character.2110.png diff --git a/mods/skinsdb/textures/character_2111.png b/mods/skinsdb/textures/character.2111.png similarity index 100% rename from mods/skinsdb/textures/character_2111.png rename to mods/skinsdb/textures/character.2111.png diff --git a/mods/skinsdb/textures/character_2112.png b/mods/skinsdb/textures/character.2112.png similarity index 100% rename from mods/skinsdb/textures/character_2112.png rename to mods/skinsdb/textures/character.2112.png diff --git a/mods/skinsdb/textures/character_2114.png b/mods/skinsdb/textures/character.2114.png similarity index 100% rename from mods/skinsdb/textures/character_2114.png rename to mods/skinsdb/textures/character.2114.png diff --git a/mods/skinsdb/textures/character_2115.png b/mods/skinsdb/textures/character.2115.png similarity index 100% rename from mods/skinsdb/textures/character_2115.png rename to mods/skinsdb/textures/character.2115.png diff --git a/mods/skinsdb/textures/character_2116.png b/mods/skinsdb/textures/character.2116.png similarity index 100% rename from mods/skinsdb/textures/character_2116.png rename to mods/skinsdb/textures/character.2116.png diff --git a/mods/skinsdb/textures/character_2117.png b/mods/skinsdb/textures/character.2117.png similarity index 100% rename from mods/skinsdb/textures/character_2117.png rename to mods/skinsdb/textures/character.2117.png diff --git a/mods/skinsdb/textures/character_2118.png b/mods/skinsdb/textures/character.2118.png similarity index 100% rename from mods/skinsdb/textures/character_2118.png rename to mods/skinsdb/textures/character.2118.png diff --git a/mods/skinsdb/textures/character_2119.png b/mods/skinsdb/textures/character.2119.png similarity index 100% rename from mods/skinsdb/textures/character_2119.png rename to mods/skinsdb/textures/character.2119.png diff --git a/mods/skinsdb/textures/character_212.png b/mods/skinsdb/textures/character.212.png similarity index 100% rename from mods/skinsdb/textures/character_212.png rename to mods/skinsdb/textures/character.212.png diff --git a/mods/skinsdb/textures/character_2120.png b/mods/skinsdb/textures/character.2120.png similarity index 100% rename from mods/skinsdb/textures/character_2120.png rename to mods/skinsdb/textures/character.2120.png diff --git a/mods/skinsdb/textures/character_2121.png b/mods/skinsdb/textures/character.2121.png similarity index 100% rename from mods/skinsdb/textures/character_2121.png rename to mods/skinsdb/textures/character.2121.png diff --git a/mods/skinsdb/textures/character_2122.png b/mods/skinsdb/textures/character.2122.png similarity index 100% rename from mods/skinsdb/textures/character_2122.png rename to mods/skinsdb/textures/character.2122.png diff --git a/mods/skinsdb/textures/character_2123.png b/mods/skinsdb/textures/character.2123.png similarity index 100% rename from mods/skinsdb/textures/character_2123.png rename to mods/skinsdb/textures/character.2123.png diff --git a/mods/skinsdb/textures/character_2124.png b/mods/skinsdb/textures/character.2124.png similarity index 100% rename from mods/skinsdb/textures/character_2124.png rename to mods/skinsdb/textures/character.2124.png diff --git a/mods/skinsdb/textures/character_2125.png b/mods/skinsdb/textures/character.2125.png similarity index 100% rename from mods/skinsdb/textures/character_2125.png rename to mods/skinsdb/textures/character.2125.png diff --git a/mods/skinsdb/textures/character_2126.png b/mods/skinsdb/textures/character.2126.png similarity index 100% rename from mods/skinsdb/textures/character_2126.png rename to mods/skinsdb/textures/character.2126.png diff --git a/mods/skinsdb/textures/character_2127.png b/mods/skinsdb/textures/character.2127.png similarity index 100% rename from mods/skinsdb/textures/character_2127.png rename to mods/skinsdb/textures/character.2127.png diff --git a/mods/skinsdb/textures/character_2128.png b/mods/skinsdb/textures/character.2128.png similarity index 100% rename from mods/skinsdb/textures/character_2128.png rename to mods/skinsdb/textures/character.2128.png diff --git a/mods/skinsdb/textures/character_2129.png b/mods/skinsdb/textures/character.2129.png similarity index 100% rename from mods/skinsdb/textures/character_2129.png rename to mods/skinsdb/textures/character.2129.png diff --git a/mods/skinsdb/textures/character_213.png b/mods/skinsdb/textures/character.213.png similarity index 100% rename from mods/skinsdb/textures/character_213.png rename to mods/skinsdb/textures/character.213.png diff --git a/mods/skinsdb/textures/character_2130.png b/mods/skinsdb/textures/character.2130.png similarity index 100% rename from mods/skinsdb/textures/character_2130.png rename to mods/skinsdb/textures/character.2130.png diff --git a/mods/skinsdb/textures/character_2131.png b/mods/skinsdb/textures/character.2131.png similarity index 100% rename from mods/skinsdb/textures/character_2131.png rename to mods/skinsdb/textures/character.2131.png diff --git a/mods/skinsdb/textures/character_2132.png b/mods/skinsdb/textures/character.2132.png similarity index 100% rename from mods/skinsdb/textures/character_2132.png rename to mods/skinsdb/textures/character.2132.png diff --git a/mods/skinsdb/textures/character_2133.png b/mods/skinsdb/textures/character.2133.png similarity index 100% rename from mods/skinsdb/textures/character_2133.png rename to mods/skinsdb/textures/character.2133.png diff --git a/mods/skinsdb/textures/character_2134.png b/mods/skinsdb/textures/character.2134.png similarity index 100% rename from mods/skinsdb/textures/character_2134.png rename to mods/skinsdb/textures/character.2134.png diff --git a/mods/skinsdb/textures/character_2135.png b/mods/skinsdb/textures/character.2135.png similarity index 100% rename from mods/skinsdb/textures/character_2135.png rename to mods/skinsdb/textures/character.2135.png diff --git a/mods/skinsdb/textures/character_2136.png b/mods/skinsdb/textures/character.2136.png similarity index 100% rename from mods/skinsdb/textures/character_2136.png rename to mods/skinsdb/textures/character.2136.png diff --git a/mods/skinsdb/textures/character_2137.png b/mods/skinsdb/textures/character.2137.png similarity index 100% rename from mods/skinsdb/textures/character_2137.png rename to mods/skinsdb/textures/character.2137.png diff --git a/mods/skinsdb/textures/character_2138.png b/mods/skinsdb/textures/character.2138.png similarity index 100% rename from mods/skinsdb/textures/character_2138.png rename to mods/skinsdb/textures/character.2138.png diff --git a/mods/skinsdb/textures/character_2139.png b/mods/skinsdb/textures/character.2139.png similarity index 100% rename from mods/skinsdb/textures/character_2139.png rename to mods/skinsdb/textures/character.2139.png diff --git a/mods/skinsdb/textures/character_214.png b/mods/skinsdb/textures/character.214.png similarity index 100% rename from mods/skinsdb/textures/character_214.png rename to mods/skinsdb/textures/character.214.png diff --git a/mods/skinsdb/textures/character_2140.png b/mods/skinsdb/textures/character.2140.png similarity index 100% rename from mods/skinsdb/textures/character_2140.png rename to mods/skinsdb/textures/character.2140.png diff --git a/mods/skinsdb/textures/character_2141.png b/mods/skinsdb/textures/character.2141.png similarity index 100% rename from mods/skinsdb/textures/character_2141.png rename to mods/skinsdb/textures/character.2141.png diff --git a/mods/skinsdb/textures/character_2142.png b/mods/skinsdb/textures/character.2142.png similarity index 100% rename from mods/skinsdb/textures/character_2142.png rename to mods/skinsdb/textures/character.2142.png diff --git a/mods/skinsdb/textures/character_2143.png b/mods/skinsdb/textures/character.2143.png similarity index 100% rename from mods/skinsdb/textures/character_2143.png rename to mods/skinsdb/textures/character.2143.png diff --git a/mods/skinsdb/textures/character_2144.png b/mods/skinsdb/textures/character.2144.png similarity index 100% rename from mods/skinsdb/textures/character_2144.png rename to mods/skinsdb/textures/character.2144.png diff --git a/mods/skinsdb/textures/character_2145.png b/mods/skinsdb/textures/character.2145.png similarity index 100% rename from mods/skinsdb/textures/character_2145.png rename to mods/skinsdb/textures/character.2145.png diff --git a/mods/skinsdb/textures/character_2146.png b/mods/skinsdb/textures/character.2146.png similarity index 100% rename from mods/skinsdb/textures/character_2146.png rename to mods/skinsdb/textures/character.2146.png diff --git a/mods/skinsdb/textures/character_2147.png b/mods/skinsdb/textures/character.2147.png similarity index 100% rename from mods/skinsdb/textures/character_2147.png rename to mods/skinsdb/textures/character.2147.png diff --git a/mods/skinsdb/textures/character_2148.png b/mods/skinsdb/textures/character.2148.png similarity index 100% rename from mods/skinsdb/textures/character_2148.png rename to mods/skinsdb/textures/character.2148.png diff --git a/mods/skinsdb/textures/character_2149.png b/mods/skinsdb/textures/character.2149.png similarity index 100% rename from mods/skinsdb/textures/character_2149.png rename to mods/skinsdb/textures/character.2149.png diff --git a/mods/skinsdb/textures/character_215.png b/mods/skinsdb/textures/character.215.png similarity index 100% rename from mods/skinsdb/textures/character_215.png rename to mods/skinsdb/textures/character.215.png diff --git a/mods/skinsdb/textures/character_2150.png b/mods/skinsdb/textures/character.2150.png similarity index 100% rename from mods/skinsdb/textures/character_2150.png rename to mods/skinsdb/textures/character.2150.png diff --git a/mods/skinsdb/textures/character_2151.png b/mods/skinsdb/textures/character.2151.png similarity index 100% rename from mods/skinsdb/textures/character_2151.png rename to mods/skinsdb/textures/character.2151.png diff --git a/mods/skinsdb/textures/character_2152.png b/mods/skinsdb/textures/character.2152.png similarity index 100% rename from mods/skinsdb/textures/character_2152.png rename to mods/skinsdb/textures/character.2152.png diff --git a/mods/skinsdb/textures/character_2153.png b/mods/skinsdb/textures/character.2153.png similarity index 100% rename from mods/skinsdb/textures/character_2153.png rename to mods/skinsdb/textures/character.2153.png diff --git a/mods/skinsdb/textures/character.2154.png b/mods/skinsdb/textures/character.2154.png new file mode 100644 index 00000000..3d02212a Binary files /dev/null and b/mods/skinsdb/textures/character.2154.png differ diff --git a/mods/skinsdb/textures/character.2155.png b/mods/skinsdb/textures/character.2155.png new file mode 100644 index 00000000..2c3c8580 Binary files /dev/null and b/mods/skinsdb/textures/character.2155.png differ diff --git a/mods/skinsdb/textures/character.2156.png b/mods/skinsdb/textures/character.2156.png new file mode 100644 index 00000000..bb476939 Binary files /dev/null and b/mods/skinsdb/textures/character.2156.png differ diff --git a/mods/skinsdb/textures/character.2157.png b/mods/skinsdb/textures/character.2157.png new file mode 100644 index 00000000..a881b639 Binary files /dev/null and b/mods/skinsdb/textures/character.2157.png differ diff --git a/mods/skinsdb/textures/character.2158.png b/mods/skinsdb/textures/character.2158.png new file mode 100644 index 00000000..8f55db8a Binary files /dev/null and b/mods/skinsdb/textures/character.2158.png differ diff --git a/mods/skinsdb/textures/character.2159.png b/mods/skinsdb/textures/character.2159.png new file mode 100644 index 00000000..38721359 Binary files /dev/null and b/mods/skinsdb/textures/character.2159.png differ diff --git a/mods/skinsdb/textures/character_216.png b/mods/skinsdb/textures/character.216.png similarity index 100% rename from mods/skinsdb/textures/character_216.png rename to mods/skinsdb/textures/character.216.png diff --git a/mods/skinsdb/textures/character.2160.png b/mods/skinsdb/textures/character.2160.png new file mode 100644 index 00000000..a10442d6 Binary files /dev/null and b/mods/skinsdb/textures/character.2160.png differ diff --git a/mods/skinsdb/textures/character.2161.png b/mods/skinsdb/textures/character.2161.png new file mode 100644 index 00000000..a38d4184 Binary files /dev/null and b/mods/skinsdb/textures/character.2161.png differ diff --git a/mods/skinsdb/textures/character.2162.png b/mods/skinsdb/textures/character.2162.png new file mode 100644 index 00000000..91364ed1 Binary files /dev/null and b/mods/skinsdb/textures/character.2162.png differ diff --git a/mods/skinsdb/textures/character.2163.png b/mods/skinsdb/textures/character.2163.png new file mode 100644 index 00000000..4946e583 Binary files /dev/null and b/mods/skinsdb/textures/character.2163.png differ diff --git a/mods/skinsdb/textures/character.2164.png b/mods/skinsdb/textures/character.2164.png new file mode 100644 index 00000000..4162f845 Binary files /dev/null and b/mods/skinsdb/textures/character.2164.png differ diff --git a/mods/skinsdb/textures/character.2165.png b/mods/skinsdb/textures/character.2165.png new file mode 100644 index 00000000..dccbbfbb Binary files /dev/null and b/mods/skinsdb/textures/character.2165.png differ diff --git a/mods/skinsdb/textures/character.2166.png b/mods/skinsdb/textures/character.2166.png new file mode 100644 index 00000000..efffdb11 Binary files /dev/null and b/mods/skinsdb/textures/character.2166.png differ diff --git a/mods/skinsdb/textures/character.2167.png b/mods/skinsdb/textures/character.2167.png new file mode 100644 index 00000000..918c4679 Binary files /dev/null and b/mods/skinsdb/textures/character.2167.png differ diff --git a/mods/skinsdb/textures/character.2168.png b/mods/skinsdb/textures/character.2168.png new file mode 100644 index 00000000..50bf00cf Binary files /dev/null and b/mods/skinsdb/textures/character.2168.png differ diff --git a/mods/skinsdb/textures/character.2169.png b/mods/skinsdb/textures/character.2169.png new file mode 100644 index 00000000..fed2e1e4 Binary files /dev/null and b/mods/skinsdb/textures/character.2169.png differ diff --git a/mods/skinsdb/textures/character_217.png b/mods/skinsdb/textures/character.217.png similarity index 100% rename from mods/skinsdb/textures/character_217.png rename to mods/skinsdb/textures/character.217.png diff --git a/mods/skinsdb/textures/character.2170.png b/mods/skinsdb/textures/character.2170.png new file mode 100644 index 00000000..b8c8316f Binary files /dev/null and b/mods/skinsdb/textures/character.2170.png differ diff --git a/mods/skinsdb/textures/character.2171.png b/mods/skinsdb/textures/character.2171.png new file mode 100644 index 00000000..cbd23b0e Binary files /dev/null and b/mods/skinsdb/textures/character.2171.png differ diff --git a/mods/skinsdb/textures/character.2172.png b/mods/skinsdb/textures/character.2172.png new file mode 100644 index 00000000..7107d67c Binary files /dev/null and b/mods/skinsdb/textures/character.2172.png differ diff --git a/mods/skinsdb/textures/character.2173.png b/mods/skinsdb/textures/character.2173.png new file mode 100644 index 00000000..f5985676 Binary files /dev/null and b/mods/skinsdb/textures/character.2173.png differ diff --git a/mods/skinsdb/textures/character.2174.png b/mods/skinsdb/textures/character.2174.png new file mode 100644 index 00000000..fc077aa6 Binary files /dev/null and b/mods/skinsdb/textures/character.2174.png differ diff --git a/mods/skinsdb/textures/character.2175.png b/mods/skinsdb/textures/character.2175.png new file mode 100644 index 00000000..78194a79 Binary files /dev/null and b/mods/skinsdb/textures/character.2175.png differ diff --git a/mods/skinsdb/textures/character.2176.png b/mods/skinsdb/textures/character.2176.png new file mode 100644 index 00000000..34e49d65 Binary files /dev/null and b/mods/skinsdb/textures/character.2176.png differ diff --git a/mods/skinsdb/textures/character.2177.png b/mods/skinsdb/textures/character.2177.png new file mode 100644 index 00000000..925fe860 Binary files /dev/null and b/mods/skinsdb/textures/character.2177.png differ diff --git a/mods/skinsdb/textures/character.2178.png b/mods/skinsdb/textures/character.2178.png new file mode 100644 index 00000000..296eb534 Binary files /dev/null and b/mods/skinsdb/textures/character.2178.png differ diff --git a/mods/skinsdb/textures/character.2179.png b/mods/skinsdb/textures/character.2179.png new file mode 100644 index 00000000..51a31136 Binary files /dev/null and b/mods/skinsdb/textures/character.2179.png differ diff --git a/mods/skinsdb/textures/character_218.png b/mods/skinsdb/textures/character.218.png similarity index 100% rename from mods/skinsdb/textures/character_218.png rename to mods/skinsdb/textures/character.218.png diff --git a/mods/skinsdb/textures/character.2180.png b/mods/skinsdb/textures/character.2180.png new file mode 100644 index 00000000..a351ee5f Binary files /dev/null and b/mods/skinsdb/textures/character.2180.png differ diff --git a/mods/skinsdb/textures/character.2181.png b/mods/skinsdb/textures/character.2181.png new file mode 100644 index 00000000..3aba7852 Binary files /dev/null and b/mods/skinsdb/textures/character.2181.png differ diff --git a/mods/skinsdb/textures/character.2182.png b/mods/skinsdb/textures/character.2182.png new file mode 100644 index 00000000..141ed318 Binary files /dev/null and b/mods/skinsdb/textures/character.2182.png differ diff --git a/mods/skinsdb/textures/character.2183.png b/mods/skinsdb/textures/character.2183.png new file mode 100644 index 00000000..8c9bcaf6 Binary files /dev/null and b/mods/skinsdb/textures/character.2183.png differ diff --git a/mods/skinsdb/textures/character.2184.png b/mods/skinsdb/textures/character.2184.png new file mode 100644 index 00000000..6cca0663 Binary files /dev/null and b/mods/skinsdb/textures/character.2184.png differ diff --git a/mods/skinsdb/textures/character.2185.png b/mods/skinsdb/textures/character.2185.png new file mode 100644 index 00000000..696e104d Binary files /dev/null and b/mods/skinsdb/textures/character.2185.png differ diff --git a/mods/skinsdb/textures/character.2186.png b/mods/skinsdb/textures/character.2186.png new file mode 100644 index 00000000..c9395cab Binary files /dev/null and b/mods/skinsdb/textures/character.2186.png differ diff --git a/mods/skinsdb/textures/character.2187.png b/mods/skinsdb/textures/character.2187.png new file mode 100644 index 00000000..6ed0e8bc Binary files /dev/null and b/mods/skinsdb/textures/character.2187.png differ diff --git a/mods/skinsdb/textures/character.2188.png b/mods/skinsdb/textures/character.2188.png new file mode 100644 index 00000000..a2e5c09a Binary files /dev/null and b/mods/skinsdb/textures/character.2188.png differ diff --git a/mods/skinsdb/textures/character.2189.png b/mods/skinsdb/textures/character.2189.png new file mode 100644 index 00000000..e90d7b64 Binary files /dev/null and b/mods/skinsdb/textures/character.2189.png differ diff --git a/mods/skinsdb/textures/character_219.png b/mods/skinsdb/textures/character.219.png similarity index 100% rename from mods/skinsdb/textures/character_219.png rename to mods/skinsdb/textures/character.219.png diff --git a/mods/skinsdb/textures/character.2190.png b/mods/skinsdb/textures/character.2190.png new file mode 100644 index 00000000..094afc6a Binary files /dev/null and b/mods/skinsdb/textures/character.2190.png differ diff --git a/mods/skinsdb/textures/character.2191.png b/mods/skinsdb/textures/character.2191.png new file mode 100644 index 00000000..158ffa5f Binary files /dev/null and b/mods/skinsdb/textures/character.2191.png differ diff --git a/mods/skinsdb/textures/character.2192.png b/mods/skinsdb/textures/character.2192.png new file mode 100644 index 00000000..6197c083 Binary files /dev/null and b/mods/skinsdb/textures/character.2192.png differ diff --git a/mods/skinsdb/textures/character.2193.png b/mods/skinsdb/textures/character.2193.png new file mode 100644 index 00000000..941b0ec1 Binary files /dev/null and b/mods/skinsdb/textures/character.2193.png differ diff --git a/mods/skinsdb/textures/character.2194.png b/mods/skinsdb/textures/character.2194.png new file mode 100644 index 00000000..4f95891d Binary files /dev/null and b/mods/skinsdb/textures/character.2194.png differ diff --git a/mods/skinsdb/textures/character.2195.png b/mods/skinsdb/textures/character.2195.png new file mode 100644 index 00000000..6d131ada Binary files /dev/null and b/mods/skinsdb/textures/character.2195.png differ diff --git a/mods/skinsdb/textures/character.2196.png b/mods/skinsdb/textures/character.2196.png new file mode 100644 index 00000000..8f3bf454 Binary files /dev/null and b/mods/skinsdb/textures/character.2196.png differ diff --git a/mods/skinsdb/textures/character.2197.png b/mods/skinsdb/textures/character.2197.png new file mode 100644 index 00000000..add38d01 Binary files /dev/null and b/mods/skinsdb/textures/character.2197.png differ diff --git a/mods/skinsdb/textures/character.2198.png b/mods/skinsdb/textures/character.2198.png new file mode 100644 index 00000000..bac8482d Binary files /dev/null and b/mods/skinsdb/textures/character.2198.png differ diff --git a/mods/skinsdb/textures/character.2199.png b/mods/skinsdb/textures/character.2199.png new file mode 100644 index 00000000..7a73d866 Binary files /dev/null and b/mods/skinsdb/textures/character.2199.png differ diff --git a/mods/skinsdb/textures/character_22.png b/mods/skinsdb/textures/character.22.png similarity index 100% rename from mods/skinsdb/textures/character_22.png rename to mods/skinsdb/textures/character.22.png diff --git a/mods/skinsdb/textures/character_220.png b/mods/skinsdb/textures/character.220.png similarity index 100% rename from mods/skinsdb/textures/character_220.png rename to mods/skinsdb/textures/character.220.png diff --git a/mods/skinsdb/textures/character.2200.png b/mods/skinsdb/textures/character.2200.png new file mode 100644 index 00000000..0a543e79 Binary files /dev/null and b/mods/skinsdb/textures/character.2200.png differ diff --git a/mods/skinsdb/textures/character.2201.png b/mods/skinsdb/textures/character.2201.png new file mode 100644 index 00000000..cf9d5019 Binary files /dev/null and b/mods/skinsdb/textures/character.2201.png differ diff --git a/mods/skinsdb/textures/character.2202.png b/mods/skinsdb/textures/character.2202.png new file mode 100644 index 00000000..8710ad62 Binary files /dev/null and b/mods/skinsdb/textures/character.2202.png differ diff --git a/mods/skinsdb/textures/character.2203.png b/mods/skinsdb/textures/character.2203.png new file mode 100644 index 00000000..68fa26ba Binary files /dev/null and b/mods/skinsdb/textures/character.2203.png differ diff --git a/mods/skinsdb/textures/character.2204.png b/mods/skinsdb/textures/character.2204.png new file mode 100644 index 00000000..d9db04fd Binary files /dev/null and b/mods/skinsdb/textures/character.2204.png differ diff --git a/mods/skinsdb/textures/character.2205.png b/mods/skinsdb/textures/character.2205.png new file mode 100644 index 00000000..10cacfa2 Binary files /dev/null and b/mods/skinsdb/textures/character.2205.png differ diff --git a/mods/skinsdb/textures/character.2206.png b/mods/skinsdb/textures/character.2206.png new file mode 100644 index 00000000..5492b093 Binary files /dev/null and b/mods/skinsdb/textures/character.2206.png differ diff --git a/mods/skinsdb/textures/character.2207.png b/mods/skinsdb/textures/character.2207.png new file mode 100644 index 00000000..73d2b204 Binary files /dev/null and b/mods/skinsdb/textures/character.2207.png differ diff --git a/mods/skinsdb/textures/character.2208.png b/mods/skinsdb/textures/character.2208.png new file mode 100644 index 00000000..7cf41a7f Binary files /dev/null and b/mods/skinsdb/textures/character.2208.png differ diff --git a/mods/skinsdb/textures/character.2209.png b/mods/skinsdb/textures/character.2209.png new file mode 100644 index 00000000..61bf2006 Binary files /dev/null and b/mods/skinsdb/textures/character.2209.png differ diff --git a/mods/skinsdb/textures/character_221.png b/mods/skinsdb/textures/character.221.png similarity index 100% rename from mods/skinsdb/textures/character_221.png rename to mods/skinsdb/textures/character.221.png diff --git a/mods/skinsdb/textures/character.2210.png b/mods/skinsdb/textures/character.2210.png new file mode 100644 index 00000000..7f92e3fe Binary files /dev/null and b/mods/skinsdb/textures/character.2210.png differ diff --git a/mods/skinsdb/textures/character.2211.png b/mods/skinsdb/textures/character.2211.png new file mode 100644 index 00000000..b23a91d7 Binary files /dev/null and b/mods/skinsdb/textures/character.2211.png differ diff --git a/mods/skinsdb/textures/character.2212.png b/mods/skinsdb/textures/character.2212.png new file mode 100644 index 00000000..935ee367 Binary files /dev/null and b/mods/skinsdb/textures/character.2212.png differ diff --git a/mods/skinsdb/textures/character.2213.png b/mods/skinsdb/textures/character.2213.png new file mode 100644 index 00000000..7448196d Binary files /dev/null and b/mods/skinsdb/textures/character.2213.png differ diff --git a/mods/skinsdb/textures/character.2214.png b/mods/skinsdb/textures/character.2214.png new file mode 100644 index 00000000..26e7e112 Binary files /dev/null and b/mods/skinsdb/textures/character.2214.png differ diff --git a/mods/skinsdb/textures/character.2215.png b/mods/skinsdb/textures/character.2215.png new file mode 100644 index 00000000..8d1d10da Binary files /dev/null and b/mods/skinsdb/textures/character.2215.png differ diff --git a/mods/skinsdb/textures/character.2216.png b/mods/skinsdb/textures/character.2216.png new file mode 100644 index 00000000..6f55e2a3 Binary files /dev/null and b/mods/skinsdb/textures/character.2216.png differ diff --git a/mods/skinsdb/textures/character.2217.png b/mods/skinsdb/textures/character.2217.png new file mode 100644 index 00000000..387cfe8a Binary files /dev/null and b/mods/skinsdb/textures/character.2217.png differ diff --git a/mods/skinsdb/textures/character.2218.png b/mods/skinsdb/textures/character.2218.png new file mode 100644 index 00000000..c4fe041b Binary files /dev/null and b/mods/skinsdb/textures/character.2218.png differ diff --git a/mods/skinsdb/textures/character.2219.png b/mods/skinsdb/textures/character.2219.png new file mode 100644 index 00000000..b8dbe05d Binary files /dev/null and b/mods/skinsdb/textures/character.2219.png differ diff --git a/mods/skinsdb/textures/character_222.png b/mods/skinsdb/textures/character.222.png similarity index 100% rename from mods/skinsdb/textures/character_222.png rename to mods/skinsdb/textures/character.222.png diff --git a/mods/skinsdb/textures/character.2220.png b/mods/skinsdb/textures/character.2220.png new file mode 100644 index 00000000..a711f30d Binary files /dev/null and b/mods/skinsdb/textures/character.2220.png differ diff --git a/mods/skinsdb/textures/character.2221.png b/mods/skinsdb/textures/character.2221.png new file mode 100644 index 00000000..d7c6bb0a Binary files /dev/null and b/mods/skinsdb/textures/character.2221.png differ diff --git a/mods/skinsdb/textures/character.2222.png b/mods/skinsdb/textures/character.2222.png new file mode 100644 index 00000000..c4e11578 Binary files /dev/null and b/mods/skinsdb/textures/character.2222.png differ diff --git a/mods/skinsdb/textures/character.2223.png b/mods/skinsdb/textures/character.2223.png new file mode 100644 index 00000000..99a6b8d4 Binary files /dev/null and b/mods/skinsdb/textures/character.2223.png differ diff --git a/mods/skinsdb/textures/character.2224.png b/mods/skinsdb/textures/character.2224.png new file mode 100644 index 00000000..64dc5da3 Binary files /dev/null and b/mods/skinsdb/textures/character.2224.png differ diff --git a/mods/skinsdb/textures/character.2225.png b/mods/skinsdb/textures/character.2225.png new file mode 100644 index 00000000..dfe72291 Binary files /dev/null and b/mods/skinsdb/textures/character.2225.png differ diff --git a/mods/skinsdb/textures/character.2226.png b/mods/skinsdb/textures/character.2226.png new file mode 100644 index 00000000..843c10e5 Binary files /dev/null and b/mods/skinsdb/textures/character.2226.png differ diff --git a/mods/skinsdb/textures/character.2227.png b/mods/skinsdb/textures/character.2227.png new file mode 100644 index 00000000..061ed076 Binary files /dev/null and b/mods/skinsdb/textures/character.2227.png differ diff --git a/mods/skinsdb/textures/character.2228.png b/mods/skinsdb/textures/character.2228.png new file mode 100644 index 00000000..50fae86a Binary files /dev/null and b/mods/skinsdb/textures/character.2228.png differ diff --git a/mods/skinsdb/textures/character.2229.png b/mods/skinsdb/textures/character.2229.png new file mode 100644 index 00000000..4ff7abbc Binary files /dev/null and b/mods/skinsdb/textures/character.2229.png differ diff --git a/mods/skinsdb/textures/character_223.png b/mods/skinsdb/textures/character.223.png similarity index 100% rename from mods/skinsdb/textures/character_223.png rename to mods/skinsdb/textures/character.223.png diff --git a/mods/skinsdb/textures/character.2230.png b/mods/skinsdb/textures/character.2230.png new file mode 100644 index 00000000..8b4a2628 Binary files /dev/null and b/mods/skinsdb/textures/character.2230.png differ diff --git a/mods/skinsdb/textures/character.2231.png b/mods/skinsdb/textures/character.2231.png new file mode 100644 index 00000000..d7e69af5 Binary files /dev/null and b/mods/skinsdb/textures/character.2231.png differ diff --git a/mods/skinsdb/textures/character.2232.png b/mods/skinsdb/textures/character.2232.png new file mode 100644 index 00000000..7368b283 Binary files /dev/null and b/mods/skinsdb/textures/character.2232.png differ diff --git a/mods/skinsdb/textures/character.2233.png b/mods/skinsdb/textures/character.2233.png new file mode 100644 index 00000000..6ad7bd49 Binary files /dev/null and b/mods/skinsdb/textures/character.2233.png differ diff --git a/mods/skinsdb/textures/character.2234.png b/mods/skinsdb/textures/character.2234.png new file mode 100644 index 00000000..1b6db0a9 Binary files /dev/null and b/mods/skinsdb/textures/character.2234.png differ diff --git a/mods/skinsdb/textures/character.2235.png b/mods/skinsdb/textures/character.2235.png new file mode 100644 index 00000000..a8e54ab8 Binary files /dev/null and b/mods/skinsdb/textures/character.2235.png differ diff --git a/mods/skinsdb/textures/character.2236.png b/mods/skinsdb/textures/character.2236.png new file mode 100644 index 00000000..71c1c176 Binary files /dev/null and b/mods/skinsdb/textures/character.2236.png differ diff --git a/mods/skinsdb/textures/character.2237.png b/mods/skinsdb/textures/character.2237.png new file mode 100644 index 00000000..6211469e Binary files /dev/null and b/mods/skinsdb/textures/character.2237.png differ diff --git a/mods/skinsdb/textures/character.2238.png b/mods/skinsdb/textures/character.2238.png new file mode 100644 index 00000000..d424a8f9 Binary files /dev/null and b/mods/skinsdb/textures/character.2238.png differ diff --git a/mods/skinsdb/textures/character.2239.png b/mods/skinsdb/textures/character.2239.png new file mode 100644 index 00000000..3a81280f Binary files /dev/null and b/mods/skinsdb/textures/character.2239.png differ diff --git a/mods/skinsdb/textures/character_224.png b/mods/skinsdb/textures/character.224.png similarity index 100% rename from mods/skinsdb/textures/character_224.png rename to mods/skinsdb/textures/character.224.png diff --git a/mods/skinsdb/textures/character.2240.png b/mods/skinsdb/textures/character.2240.png new file mode 100644 index 00000000..561299be Binary files /dev/null and b/mods/skinsdb/textures/character.2240.png differ diff --git a/mods/skinsdb/textures/character.2241.png b/mods/skinsdb/textures/character.2241.png new file mode 100644 index 00000000..a2b8ecc0 Binary files /dev/null and b/mods/skinsdb/textures/character.2241.png differ diff --git a/mods/skinsdb/textures/character.2242.png b/mods/skinsdb/textures/character.2242.png new file mode 100644 index 00000000..883524d6 Binary files /dev/null and b/mods/skinsdb/textures/character.2242.png differ diff --git a/mods/skinsdb/textures/character.2243.png b/mods/skinsdb/textures/character.2243.png new file mode 100644 index 00000000..905da150 Binary files /dev/null and b/mods/skinsdb/textures/character.2243.png differ diff --git a/mods/skinsdb/textures/character.2244.png b/mods/skinsdb/textures/character.2244.png new file mode 100644 index 00000000..d911d941 Binary files /dev/null and b/mods/skinsdb/textures/character.2244.png differ diff --git a/mods/skinsdb/textures/character.2245.png b/mods/skinsdb/textures/character.2245.png new file mode 100644 index 00000000..db0a4794 Binary files /dev/null and b/mods/skinsdb/textures/character.2245.png differ diff --git a/mods/skinsdb/textures/character.2246.png b/mods/skinsdb/textures/character.2246.png new file mode 100644 index 00000000..1e537460 Binary files /dev/null and b/mods/skinsdb/textures/character.2246.png differ diff --git a/mods/skinsdb/textures/character.2247.png b/mods/skinsdb/textures/character.2247.png new file mode 100644 index 00000000..9454e7e2 Binary files /dev/null and b/mods/skinsdb/textures/character.2247.png differ diff --git a/mods/skinsdb/textures/character.2248.png b/mods/skinsdb/textures/character.2248.png new file mode 100644 index 00000000..8879d24d Binary files /dev/null and b/mods/skinsdb/textures/character.2248.png differ diff --git a/mods/skinsdb/textures/character.2249.png b/mods/skinsdb/textures/character.2249.png new file mode 100644 index 00000000..7ac0c7fa Binary files /dev/null and b/mods/skinsdb/textures/character.2249.png differ diff --git a/mods/skinsdb/textures/character_225.png b/mods/skinsdb/textures/character.225.png similarity index 100% rename from mods/skinsdb/textures/character_225.png rename to mods/skinsdb/textures/character.225.png diff --git a/mods/skinsdb/textures/character.2250.png b/mods/skinsdb/textures/character.2250.png new file mode 100644 index 00000000..38fae13c Binary files /dev/null and b/mods/skinsdb/textures/character.2250.png differ diff --git a/mods/skinsdb/textures/character.2251.png b/mods/skinsdb/textures/character.2251.png new file mode 100644 index 00000000..31368f85 Binary files /dev/null and b/mods/skinsdb/textures/character.2251.png differ diff --git a/mods/skinsdb/textures/character.2252.png b/mods/skinsdb/textures/character.2252.png new file mode 100644 index 00000000..804f4b8a Binary files /dev/null and b/mods/skinsdb/textures/character.2252.png differ diff --git a/mods/skinsdb/textures/character.2253.png b/mods/skinsdb/textures/character.2253.png new file mode 100644 index 00000000..bae7fbf1 Binary files /dev/null and b/mods/skinsdb/textures/character.2253.png differ diff --git a/mods/skinsdb/textures/character.2254.png b/mods/skinsdb/textures/character.2254.png new file mode 100644 index 00000000..429d75c2 Binary files /dev/null and b/mods/skinsdb/textures/character.2254.png differ diff --git a/mods/skinsdb/textures/character.2255.png b/mods/skinsdb/textures/character.2255.png new file mode 100644 index 00000000..3df2ca89 Binary files /dev/null and b/mods/skinsdb/textures/character.2255.png differ diff --git a/mods/skinsdb/textures/character.2256.png b/mods/skinsdb/textures/character.2256.png new file mode 100644 index 00000000..1364eb0c Binary files /dev/null and b/mods/skinsdb/textures/character.2256.png differ diff --git a/mods/skinsdb/textures/character.2257.png b/mods/skinsdb/textures/character.2257.png new file mode 100644 index 00000000..84808510 Binary files /dev/null and b/mods/skinsdb/textures/character.2257.png differ diff --git a/mods/skinsdb/textures/character.2258.png b/mods/skinsdb/textures/character.2258.png new file mode 100644 index 00000000..af098422 Binary files /dev/null and b/mods/skinsdb/textures/character.2258.png differ diff --git a/mods/skinsdb/textures/character.2259.png b/mods/skinsdb/textures/character.2259.png new file mode 100644 index 00000000..9d852976 Binary files /dev/null and b/mods/skinsdb/textures/character.2259.png differ diff --git a/mods/skinsdb/textures/character.2260.png b/mods/skinsdb/textures/character.2260.png new file mode 100644 index 00000000..f26ed1ea Binary files /dev/null and b/mods/skinsdb/textures/character.2260.png differ diff --git a/mods/skinsdb/textures/character.2261.png b/mods/skinsdb/textures/character.2261.png new file mode 100644 index 00000000..e4363132 Binary files /dev/null and b/mods/skinsdb/textures/character.2261.png differ diff --git a/mods/skinsdb/textures/character.2262.png b/mods/skinsdb/textures/character.2262.png new file mode 100644 index 00000000..ea22630a Binary files /dev/null and b/mods/skinsdb/textures/character.2262.png differ diff --git a/mods/skinsdb/textures/character.2263.png b/mods/skinsdb/textures/character.2263.png new file mode 100644 index 00000000..56a49a6c Binary files /dev/null and b/mods/skinsdb/textures/character.2263.png differ diff --git a/mods/skinsdb/textures/character.2264.png b/mods/skinsdb/textures/character.2264.png new file mode 100644 index 00000000..8373a098 Binary files /dev/null and b/mods/skinsdb/textures/character.2264.png differ diff --git a/mods/skinsdb/textures/character.2277.png b/mods/skinsdb/textures/character.2277.png new file mode 100644 index 00000000..798da664 Binary files /dev/null and b/mods/skinsdb/textures/character.2277.png differ diff --git a/mods/skinsdb/textures/character.2278.png b/mods/skinsdb/textures/character.2278.png new file mode 100644 index 00000000..3d70f126 Binary files /dev/null and b/mods/skinsdb/textures/character.2278.png differ diff --git a/mods/skinsdb/textures/character.2279.png b/mods/skinsdb/textures/character.2279.png new file mode 100644 index 00000000..897224ad Binary files /dev/null and b/mods/skinsdb/textures/character.2279.png differ diff --git a/mods/skinsdb/textures/character_228.png b/mods/skinsdb/textures/character.228.png similarity index 100% rename from mods/skinsdb/textures/character_228.png rename to mods/skinsdb/textures/character.228.png diff --git a/mods/skinsdb/textures/character.2280.png b/mods/skinsdb/textures/character.2280.png new file mode 100644 index 00000000..3ffcc076 Binary files /dev/null and b/mods/skinsdb/textures/character.2280.png differ diff --git a/mods/skinsdb/textures/character.2281.png b/mods/skinsdb/textures/character.2281.png new file mode 100644 index 00000000..403a31db Binary files /dev/null and b/mods/skinsdb/textures/character.2281.png differ diff --git a/mods/skinsdb/textures/character.2282.png b/mods/skinsdb/textures/character.2282.png new file mode 100644 index 00000000..fb1a8f29 Binary files /dev/null and b/mods/skinsdb/textures/character.2282.png differ diff --git a/mods/skinsdb/textures/character.2283.png b/mods/skinsdb/textures/character.2283.png new file mode 100644 index 00000000..476f7804 Binary files /dev/null and b/mods/skinsdb/textures/character.2283.png differ diff --git a/mods/skinsdb/textures/character.2284.png b/mods/skinsdb/textures/character.2284.png new file mode 100644 index 00000000..da78c854 Binary files /dev/null and b/mods/skinsdb/textures/character.2284.png differ diff --git a/mods/skinsdb/textures/character.2285.png b/mods/skinsdb/textures/character.2285.png new file mode 100644 index 00000000..b7a4340c Binary files /dev/null and b/mods/skinsdb/textures/character.2285.png differ diff --git a/mods/skinsdb/textures/character.2286.png b/mods/skinsdb/textures/character.2286.png new file mode 100644 index 00000000..bf50d24b Binary files /dev/null and b/mods/skinsdb/textures/character.2286.png differ diff --git a/mods/skinsdb/textures/character.2287.png b/mods/skinsdb/textures/character.2287.png new file mode 100644 index 00000000..9a80f008 Binary files /dev/null and b/mods/skinsdb/textures/character.2287.png differ diff --git a/mods/skinsdb/textures/character.2288.png b/mods/skinsdb/textures/character.2288.png new file mode 100644 index 00000000..6e85e294 Binary files /dev/null and b/mods/skinsdb/textures/character.2288.png differ diff --git a/mods/skinsdb/textures/character.2289.png b/mods/skinsdb/textures/character.2289.png new file mode 100644 index 00000000..80e6be13 Binary files /dev/null and b/mods/skinsdb/textures/character.2289.png differ diff --git a/mods/skinsdb/textures/character_229.png b/mods/skinsdb/textures/character.229.png similarity index 100% rename from mods/skinsdb/textures/character_229.png rename to mods/skinsdb/textures/character.229.png diff --git a/mods/skinsdb/textures/character.2290.png b/mods/skinsdb/textures/character.2290.png new file mode 100644 index 00000000..37b7053b Binary files /dev/null and b/mods/skinsdb/textures/character.2290.png differ diff --git a/mods/skinsdb/textures/character.2291.png b/mods/skinsdb/textures/character.2291.png new file mode 100644 index 00000000..0c518c70 Binary files /dev/null and b/mods/skinsdb/textures/character.2291.png differ diff --git a/mods/skinsdb/textures/character.2292.png b/mods/skinsdb/textures/character.2292.png new file mode 100644 index 00000000..de96c326 Binary files /dev/null and b/mods/skinsdb/textures/character.2292.png differ diff --git a/mods/skinsdb/textures/character.2293.png b/mods/skinsdb/textures/character.2293.png new file mode 100644 index 00000000..17950ba1 Binary files /dev/null and b/mods/skinsdb/textures/character.2293.png differ diff --git a/mods/skinsdb/textures/character.2294.png b/mods/skinsdb/textures/character.2294.png new file mode 100644 index 00000000..097c89f9 Binary files /dev/null and b/mods/skinsdb/textures/character.2294.png differ diff --git a/mods/skinsdb/textures/character.2295.png b/mods/skinsdb/textures/character.2295.png new file mode 100644 index 00000000..377f9b56 Binary files /dev/null and b/mods/skinsdb/textures/character.2295.png differ diff --git a/mods/skinsdb/textures/character.2296.png b/mods/skinsdb/textures/character.2296.png new file mode 100644 index 00000000..3246e42a Binary files /dev/null and b/mods/skinsdb/textures/character.2296.png differ diff --git a/mods/skinsdb/textures/character.2297.png b/mods/skinsdb/textures/character.2297.png new file mode 100644 index 00000000..e26c86b5 Binary files /dev/null and b/mods/skinsdb/textures/character.2297.png differ diff --git a/mods/skinsdb/textures/character.2298.png b/mods/skinsdb/textures/character.2298.png new file mode 100644 index 00000000..17fea1f8 Binary files /dev/null and b/mods/skinsdb/textures/character.2298.png differ diff --git a/mods/skinsdb/textures/character.2299.png b/mods/skinsdb/textures/character.2299.png new file mode 100644 index 00000000..e12e3042 Binary files /dev/null and b/mods/skinsdb/textures/character.2299.png differ diff --git a/mods/skinsdb/textures/character_230.png b/mods/skinsdb/textures/character.230.png similarity index 100% rename from mods/skinsdb/textures/character_230.png rename to mods/skinsdb/textures/character.230.png diff --git a/mods/skinsdb/textures/character.2300.png b/mods/skinsdb/textures/character.2300.png new file mode 100644 index 00000000..397d006b Binary files /dev/null and b/mods/skinsdb/textures/character.2300.png differ diff --git a/mods/skinsdb/textures/character.2301.png b/mods/skinsdb/textures/character.2301.png new file mode 100644 index 00000000..8665f823 Binary files /dev/null and b/mods/skinsdb/textures/character.2301.png differ diff --git a/mods/skinsdb/textures/character.2302.png b/mods/skinsdb/textures/character.2302.png new file mode 100644 index 00000000..41ee6f43 Binary files /dev/null and b/mods/skinsdb/textures/character.2302.png differ diff --git a/mods/skinsdb/textures/character.2303.png b/mods/skinsdb/textures/character.2303.png new file mode 100644 index 00000000..93b980ec Binary files /dev/null and b/mods/skinsdb/textures/character.2303.png differ diff --git a/mods/skinsdb/textures/character.2304.png b/mods/skinsdb/textures/character.2304.png new file mode 100644 index 00000000..683e1912 Binary files /dev/null and b/mods/skinsdb/textures/character.2304.png differ diff --git a/mods/skinsdb/textures/character.2305.png b/mods/skinsdb/textures/character.2305.png new file mode 100644 index 00000000..1b73064e Binary files /dev/null and b/mods/skinsdb/textures/character.2305.png differ diff --git a/mods/skinsdb/textures/character.2306.png b/mods/skinsdb/textures/character.2306.png new file mode 100644 index 00000000..596ccac7 Binary files /dev/null and b/mods/skinsdb/textures/character.2306.png differ diff --git a/mods/skinsdb/textures/character.2307.png b/mods/skinsdb/textures/character.2307.png new file mode 100644 index 00000000..94312ed8 Binary files /dev/null and b/mods/skinsdb/textures/character.2307.png differ diff --git a/mods/skinsdb/textures/character.2308.png b/mods/skinsdb/textures/character.2308.png new file mode 100644 index 00000000..8f3f8201 Binary files /dev/null and b/mods/skinsdb/textures/character.2308.png differ diff --git a/mods/skinsdb/textures/character.2309.png b/mods/skinsdb/textures/character.2309.png new file mode 100644 index 00000000..b2ccf5cf Binary files /dev/null and b/mods/skinsdb/textures/character.2309.png differ diff --git a/mods/skinsdb/textures/character_231.png b/mods/skinsdb/textures/character.231.png similarity index 100% rename from mods/skinsdb/textures/character_231.png rename to mods/skinsdb/textures/character.231.png diff --git a/mods/skinsdb/textures/character.2310.png b/mods/skinsdb/textures/character.2310.png new file mode 100644 index 00000000..2a7b1066 Binary files /dev/null and b/mods/skinsdb/textures/character.2310.png differ diff --git a/mods/skinsdb/textures/character.2311.png b/mods/skinsdb/textures/character.2311.png new file mode 100644 index 00000000..fccaad1d Binary files /dev/null and b/mods/skinsdb/textures/character.2311.png differ diff --git a/mods/skinsdb/textures/character.2312.png b/mods/skinsdb/textures/character.2312.png new file mode 100644 index 00000000..e59aa3ac Binary files /dev/null and b/mods/skinsdb/textures/character.2312.png differ diff --git a/mods/skinsdb/textures/character.2313.png b/mods/skinsdb/textures/character.2313.png new file mode 100644 index 00000000..2b2d0866 Binary files /dev/null and b/mods/skinsdb/textures/character.2313.png differ diff --git a/mods/skinsdb/textures/character.2314.png b/mods/skinsdb/textures/character.2314.png new file mode 100644 index 00000000..771b9fb3 Binary files /dev/null and b/mods/skinsdb/textures/character.2314.png differ diff --git a/mods/skinsdb/textures/character.2315.png b/mods/skinsdb/textures/character.2315.png new file mode 100644 index 00000000..c0c385d5 Binary files /dev/null and b/mods/skinsdb/textures/character.2315.png differ diff --git a/mods/skinsdb/textures/character.2316.png b/mods/skinsdb/textures/character.2316.png new file mode 100644 index 00000000..67689cd5 Binary files /dev/null and b/mods/skinsdb/textures/character.2316.png differ diff --git a/mods/skinsdb/textures/character.2317.png b/mods/skinsdb/textures/character.2317.png new file mode 100644 index 00000000..159ac903 Binary files /dev/null and b/mods/skinsdb/textures/character.2317.png differ diff --git a/mods/skinsdb/textures/character.2318.png b/mods/skinsdb/textures/character.2318.png new file mode 100644 index 00000000..065f6f13 Binary files /dev/null and b/mods/skinsdb/textures/character.2318.png differ diff --git a/mods/skinsdb/textures/character.2319.png b/mods/skinsdb/textures/character.2319.png new file mode 100644 index 00000000..46932c7d Binary files /dev/null and b/mods/skinsdb/textures/character.2319.png differ diff --git a/mods/skinsdb/textures/character_232.png b/mods/skinsdb/textures/character.232.png similarity index 100% rename from mods/skinsdb/textures/character_232.png rename to mods/skinsdb/textures/character.232.png diff --git a/mods/skinsdb/textures/character.2320.png b/mods/skinsdb/textures/character.2320.png new file mode 100644 index 00000000..cf2160fd Binary files /dev/null and b/mods/skinsdb/textures/character.2320.png differ diff --git a/mods/skinsdb/textures/character.2321.png b/mods/skinsdb/textures/character.2321.png new file mode 100644 index 00000000..1fc28cc2 Binary files /dev/null and b/mods/skinsdb/textures/character.2321.png differ diff --git a/mods/skinsdb/textures/character.2322.png b/mods/skinsdb/textures/character.2322.png new file mode 100644 index 00000000..af9e16da Binary files /dev/null and b/mods/skinsdb/textures/character.2322.png differ diff --git a/mods/skinsdb/textures/character.2323.png b/mods/skinsdb/textures/character.2323.png new file mode 100644 index 00000000..24e1ca0f Binary files /dev/null and b/mods/skinsdb/textures/character.2323.png differ diff --git a/mods/skinsdb/textures/character.2324.png b/mods/skinsdb/textures/character.2324.png new file mode 100644 index 00000000..66351b6c Binary files /dev/null and b/mods/skinsdb/textures/character.2324.png differ diff --git a/mods/skinsdb/textures/character.2325.png b/mods/skinsdb/textures/character.2325.png new file mode 100644 index 00000000..3bd762db Binary files /dev/null and b/mods/skinsdb/textures/character.2325.png differ diff --git a/mods/skinsdb/textures/character.2326.png b/mods/skinsdb/textures/character.2326.png new file mode 100644 index 00000000..844df95b Binary files /dev/null and b/mods/skinsdb/textures/character.2326.png differ diff --git a/mods/skinsdb/textures/character.2327.png b/mods/skinsdb/textures/character.2327.png new file mode 100644 index 00000000..cf9fe876 Binary files /dev/null and b/mods/skinsdb/textures/character.2327.png differ diff --git a/mods/skinsdb/textures/character.2328.png b/mods/skinsdb/textures/character.2328.png new file mode 100644 index 00000000..14282271 Binary files /dev/null and b/mods/skinsdb/textures/character.2328.png differ diff --git a/mods/skinsdb/textures/character.2329.png b/mods/skinsdb/textures/character.2329.png new file mode 100644 index 00000000..adaff2bf Binary files /dev/null and b/mods/skinsdb/textures/character.2329.png differ diff --git a/mods/skinsdb/textures/character_233.png b/mods/skinsdb/textures/character.233.png similarity index 100% rename from mods/skinsdb/textures/character_233.png rename to mods/skinsdb/textures/character.233.png diff --git a/mods/skinsdb/textures/character.2330.png b/mods/skinsdb/textures/character.2330.png new file mode 100644 index 00000000..d979d0d1 Binary files /dev/null and b/mods/skinsdb/textures/character.2330.png differ diff --git a/mods/skinsdb/textures/character.2331.png b/mods/skinsdb/textures/character.2331.png new file mode 100644 index 00000000..9ff74319 Binary files /dev/null and b/mods/skinsdb/textures/character.2331.png differ diff --git a/mods/skinsdb/textures/character.2332.png b/mods/skinsdb/textures/character.2332.png new file mode 100644 index 00000000..77a146c0 Binary files /dev/null and b/mods/skinsdb/textures/character.2332.png differ diff --git a/mods/skinsdb/textures/character.2333.png b/mods/skinsdb/textures/character.2333.png new file mode 100644 index 00000000..f4b3aff5 Binary files /dev/null and b/mods/skinsdb/textures/character.2333.png differ diff --git a/mods/skinsdb/textures/character.2334.png b/mods/skinsdb/textures/character.2334.png new file mode 100644 index 00000000..5272e2de Binary files /dev/null and b/mods/skinsdb/textures/character.2334.png differ diff --git a/mods/skinsdb/textures/character.2335.png b/mods/skinsdb/textures/character.2335.png new file mode 100644 index 00000000..96af6881 Binary files /dev/null and b/mods/skinsdb/textures/character.2335.png differ diff --git a/mods/skinsdb/textures/character.2336.png b/mods/skinsdb/textures/character.2336.png new file mode 100644 index 00000000..dfa49f9a Binary files /dev/null and b/mods/skinsdb/textures/character.2336.png differ diff --git a/mods/skinsdb/textures/character.2337.png b/mods/skinsdb/textures/character.2337.png new file mode 100644 index 00000000..5914a7df Binary files /dev/null and b/mods/skinsdb/textures/character.2337.png differ diff --git a/mods/skinsdb/textures/character.2338.png b/mods/skinsdb/textures/character.2338.png new file mode 100644 index 00000000..8985397c Binary files /dev/null and b/mods/skinsdb/textures/character.2338.png differ diff --git a/mods/skinsdb/textures/character.2339.png b/mods/skinsdb/textures/character.2339.png new file mode 100644 index 00000000..05bcb334 Binary files /dev/null and b/mods/skinsdb/textures/character.2339.png differ diff --git a/mods/skinsdb/textures/character_234.png b/mods/skinsdb/textures/character.234.png similarity index 100% rename from mods/skinsdb/textures/character_234.png rename to mods/skinsdb/textures/character.234.png diff --git a/mods/skinsdb/textures/character.2340.png b/mods/skinsdb/textures/character.2340.png new file mode 100644 index 00000000..0e966cc6 Binary files /dev/null and b/mods/skinsdb/textures/character.2340.png differ diff --git a/mods/skinsdb/textures/character.2341.png b/mods/skinsdb/textures/character.2341.png new file mode 100644 index 00000000..879d7a66 Binary files /dev/null and b/mods/skinsdb/textures/character.2341.png differ diff --git a/mods/skinsdb/textures/character.2342.png b/mods/skinsdb/textures/character.2342.png new file mode 100644 index 00000000..f373581c Binary files /dev/null and b/mods/skinsdb/textures/character.2342.png differ diff --git a/mods/skinsdb/textures/character.2343.png b/mods/skinsdb/textures/character.2343.png new file mode 100644 index 00000000..97c57e60 Binary files /dev/null and b/mods/skinsdb/textures/character.2343.png differ diff --git a/mods/skinsdb/textures/character.2344.png b/mods/skinsdb/textures/character.2344.png new file mode 100644 index 00000000..301e79d9 Binary files /dev/null and b/mods/skinsdb/textures/character.2344.png differ diff --git a/mods/skinsdb/textures/character.2345.png b/mods/skinsdb/textures/character.2345.png new file mode 100644 index 00000000..b4e002ab Binary files /dev/null and b/mods/skinsdb/textures/character.2345.png differ diff --git a/mods/skinsdb/textures/character.2346.png b/mods/skinsdb/textures/character.2346.png new file mode 100644 index 00000000..7341fcca Binary files /dev/null and b/mods/skinsdb/textures/character.2346.png differ diff --git a/mods/skinsdb/textures/character.2347.png b/mods/skinsdb/textures/character.2347.png new file mode 100644 index 00000000..588ab23f Binary files /dev/null and b/mods/skinsdb/textures/character.2347.png differ diff --git a/mods/skinsdb/textures/character.2348.png b/mods/skinsdb/textures/character.2348.png new file mode 100644 index 00000000..be16ef2f Binary files /dev/null and b/mods/skinsdb/textures/character.2348.png differ diff --git a/mods/skinsdb/textures/character.2349.png b/mods/skinsdb/textures/character.2349.png new file mode 100644 index 00000000..99973310 Binary files /dev/null and b/mods/skinsdb/textures/character.2349.png differ diff --git a/mods/skinsdb/textures/character_235.png b/mods/skinsdb/textures/character.235.png similarity index 100% rename from mods/skinsdb/textures/character_235.png rename to mods/skinsdb/textures/character.235.png diff --git a/mods/skinsdb/textures/character.2350.png b/mods/skinsdb/textures/character.2350.png new file mode 100644 index 00000000..2436982c Binary files /dev/null and b/mods/skinsdb/textures/character.2350.png differ diff --git a/mods/skinsdb/textures/character.2351.png b/mods/skinsdb/textures/character.2351.png new file mode 100644 index 00000000..787a67dd Binary files /dev/null and b/mods/skinsdb/textures/character.2351.png differ diff --git a/mods/skinsdb/textures/character_237.png b/mods/skinsdb/textures/character.237.png similarity index 100% rename from mods/skinsdb/textures/character_237.png rename to mods/skinsdb/textures/character.237.png diff --git a/mods/skinsdb/textures/character_239.png b/mods/skinsdb/textures/character.239.png similarity index 100% rename from mods/skinsdb/textures/character_239.png rename to mods/skinsdb/textures/character.239.png diff --git a/mods/skinsdb/textures/character_24.png b/mods/skinsdb/textures/character.24.png similarity index 100% rename from mods/skinsdb/textures/character_24.png rename to mods/skinsdb/textures/character.24.png diff --git a/mods/skinsdb/textures/character_241.png b/mods/skinsdb/textures/character.241.png similarity index 100% rename from mods/skinsdb/textures/character_241.png rename to mods/skinsdb/textures/character.241.png diff --git a/mods/skinsdb/textures/character_242.png b/mods/skinsdb/textures/character.242.png similarity index 100% rename from mods/skinsdb/textures/character_242.png rename to mods/skinsdb/textures/character.242.png diff --git a/mods/skinsdb/textures/character_243.png b/mods/skinsdb/textures/character.243.png similarity index 100% rename from mods/skinsdb/textures/character_243.png rename to mods/skinsdb/textures/character.243.png diff --git a/mods/skinsdb/textures/character_244.png b/mods/skinsdb/textures/character.244.png similarity index 100% rename from mods/skinsdb/textures/character_244.png rename to mods/skinsdb/textures/character.244.png diff --git a/mods/skinsdb/textures/character_245.png b/mods/skinsdb/textures/character.245.png similarity index 100% rename from mods/skinsdb/textures/character_245.png rename to mods/skinsdb/textures/character.245.png diff --git a/mods/skinsdb/textures/character_246.png b/mods/skinsdb/textures/character.246.png similarity index 100% rename from mods/skinsdb/textures/character_246.png rename to mods/skinsdb/textures/character.246.png diff --git a/mods/skinsdb/textures/character_247.png b/mods/skinsdb/textures/character.247.png similarity index 100% rename from mods/skinsdb/textures/character_247.png rename to mods/skinsdb/textures/character.247.png diff --git a/mods/skinsdb/textures/character_248.png b/mods/skinsdb/textures/character.248.png similarity index 100% rename from mods/skinsdb/textures/character_248.png rename to mods/skinsdb/textures/character.248.png diff --git a/mods/skinsdb/textures/character_249.png b/mods/skinsdb/textures/character.249.png similarity index 100% rename from mods/skinsdb/textures/character_249.png rename to mods/skinsdb/textures/character.249.png diff --git a/mods/skinsdb/textures/character_25.png b/mods/skinsdb/textures/character.25.png similarity index 100% rename from mods/skinsdb/textures/character_25.png rename to mods/skinsdb/textures/character.25.png diff --git a/mods/skinsdb/textures/character_250.png b/mods/skinsdb/textures/character.250.png similarity index 100% rename from mods/skinsdb/textures/character_250.png rename to mods/skinsdb/textures/character.250.png diff --git a/mods/skinsdb/textures/character_251.png b/mods/skinsdb/textures/character.251.png similarity index 100% rename from mods/skinsdb/textures/character_251.png rename to mods/skinsdb/textures/character.251.png diff --git a/mods/skinsdb/textures/character_252.png b/mods/skinsdb/textures/character.252.png similarity index 100% rename from mods/skinsdb/textures/character_252.png rename to mods/skinsdb/textures/character.252.png diff --git a/mods/skinsdb/textures/character_253.png b/mods/skinsdb/textures/character.253.png similarity index 100% rename from mods/skinsdb/textures/character_253.png rename to mods/skinsdb/textures/character.253.png diff --git a/mods/skinsdb/textures/character_254.png b/mods/skinsdb/textures/character.254.png similarity index 100% rename from mods/skinsdb/textures/character_254.png rename to mods/skinsdb/textures/character.254.png diff --git a/mods/skinsdb/textures/character_255.png b/mods/skinsdb/textures/character.255.png similarity index 100% rename from mods/skinsdb/textures/character_255.png rename to mods/skinsdb/textures/character.255.png diff --git a/mods/skinsdb/textures/character_256.png b/mods/skinsdb/textures/character.256.png similarity index 100% rename from mods/skinsdb/textures/character_256.png rename to mods/skinsdb/textures/character.256.png diff --git a/mods/skinsdb/textures/character_257.png b/mods/skinsdb/textures/character.257.png similarity index 100% rename from mods/skinsdb/textures/character_257.png rename to mods/skinsdb/textures/character.257.png diff --git a/mods/skinsdb/textures/character_258.png b/mods/skinsdb/textures/character.258.png similarity index 100% rename from mods/skinsdb/textures/character_258.png rename to mods/skinsdb/textures/character.258.png diff --git a/mods/skinsdb/textures/character_259.png b/mods/skinsdb/textures/character.259.png similarity index 100% rename from mods/skinsdb/textures/character_259.png rename to mods/skinsdb/textures/character.259.png diff --git a/mods/skinsdb/textures/character_26.png b/mods/skinsdb/textures/character.26.png similarity index 100% rename from mods/skinsdb/textures/character_26.png rename to mods/skinsdb/textures/character.26.png diff --git a/mods/skinsdb/textures/character_260.png b/mods/skinsdb/textures/character.260.png similarity index 100% rename from mods/skinsdb/textures/character_260.png rename to mods/skinsdb/textures/character.260.png diff --git a/mods/skinsdb/textures/character_261.png b/mods/skinsdb/textures/character.261.png similarity index 100% rename from mods/skinsdb/textures/character_261.png rename to mods/skinsdb/textures/character.261.png diff --git a/mods/skinsdb/textures/character_262.png b/mods/skinsdb/textures/character.262.png similarity index 100% rename from mods/skinsdb/textures/character_262.png rename to mods/skinsdb/textures/character.262.png diff --git a/mods/skinsdb/textures/character_263.png b/mods/skinsdb/textures/character.263.png similarity index 100% rename from mods/skinsdb/textures/character_263.png rename to mods/skinsdb/textures/character.263.png diff --git a/mods/skinsdb/textures/character_264.png b/mods/skinsdb/textures/character.264.png similarity index 100% rename from mods/skinsdb/textures/character_264.png rename to mods/skinsdb/textures/character.264.png diff --git a/mods/skinsdb/textures/character_265.png b/mods/skinsdb/textures/character.265.png similarity index 100% rename from mods/skinsdb/textures/character_265.png rename to mods/skinsdb/textures/character.265.png diff --git a/mods/skinsdb/textures/character_266.png b/mods/skinsdb/textures/character.266.png similarity index 100% rename from mods/skinsdb/textures/character_266.png rename to mods/skinsdb/textures/character.266.png diff --git a/mods/skinsdb/textures/character_267.png b/mods/skinsdb/textures/character.267.png similarity index 100% rename from mods/skinsdb/textures/character_267.png rename to mods/skinsdb/textures/character.267.png diff --git a/mods/skinsdb/textures/character_268.png b/mods/skinsdb/textures/character.268.png similarity index 100% rename from mods/skinsdb/textures/character_268.png rename to mods/skinsdb/textures/character.268.png diff --git a/mods/skinsdb/textures/character_269.png b/mods/skinsdb/textures/character.269.png similarity index 100% rename from mods/skinsdb/textures/character_269.png rename to mods/skinsdb/textures/character.269.png diff --git a/mods/skinsdb/textures/character_27.png b/mods/skinsdb/textures/character.27.png similarity index 100% rename from mods/skinsdb/textures/character_27.png rename to mods/skinsdb/textures/character.27.png diff --git a/mods/skinsdb/textures/character_270.png b/mods/skinsdb/textures/character.270.png similarity index 100% rename from mods/skinsdb/textures/character_270.png rename to mods/skinsdb/textures/character.270.png diff --git a/mods/skinsdb/textures/character_271.png b/mods/skinsdb/textures/character.271.png similarity index 100% rename from mods/skinsdb/textures/character_271.png rename to mods/skinsdb/textures/character.271.png diff --git a/mods/skinsdb/textures/character_272.png b/mods/skinsdb/textures/character.272.png similarity index 100% rename from mods/skinsdb/textures/character_272.png rename to mods/skinsdb/textures/character.272.png diff --git a/mods/skinsdb/textures/character_273.png b/mods/skinsdb/textures/character.273.png similarity index 100% rename from mods/skinsdb/textures/character_273.png rename to mods/skinsdb/textures/character.273.png diff --git a/mods/skinsdb/textures/character_274.png b/mods/skinsdb/textures/character.274.png similarity index 100% rename from mods/skinsdb/textures/character_274.png rename to mods/skinsdb/textures/character.274.png diff --git a/mods/skinsdb/textures/character_275.png b/mods/skinsdb/textures/character.275.png similarity index 100% rename from mods/skinsdb/textures/character_275.png rename to mods/skinsdb/textures/character.275.png diff --git a/mods/skinsdb/textures/character_276.png b/mods/skinsdb/textures/character.276.png similarity index 100% rename from mods/skinsdb/textures/character_276.png rename to mods/skinsdb/textures/character.276.png diff --git a/mods/skinsdb/textures/character_277.png b/mods/skinsdb/textures/character.277.png similarity index 100% rename from mods/skinsdb/textures/character_277.png rename to mods/skinsdb/textures/character.277.png diff --git a/mods/skinsdb/textures/character_278.png b/mods/skinsdb/textures/character.278.png similarity index 100% rename from mods/skinsdb/textures/character_278.png rename to mods/skinsdb/textures/character.278.png diff --git a/mods/skinsdb/textures/character_279.png b/mods/skinsdb/textures/character.279.png similarity index 100% rename from mods/skinsdb/textures/character_279.png rename to mods/skinsdb/textures/character.279.png diff --git a/mods/skinsdb/textures/character_28.png b/mods/skinsdb/textures/character.28.png similarity index 100% rename from mods/skinsdb/textures/character_28.png rename to mods/skinsdb/textures/character.28.png diff --git a/mods/skinsdb/textures/character_280.png b/mods/skinsdb/textures/character.280.png similarity index 100% rename from mods/skinsdb/textures/character_280.png rename to mods/skinsdb/textures/character.280.png diff --git a/mods/skinsdb/textures/character_281.png b/mods/skinsdb/textures/character.281.png similarity index 100% rename from mods/skinsdb/textures/character_281.png rename to mods/skinsdb/textures/character.281.png diff --git a/mods/skinsdb/textures/character_282.png b/mods/skinsdb/textures/character.282.png similarity index 100% rename from mods/skinsdb/textures/character_282.png rename to mods/skinsdb/textures/character.282.png diff --git a/mods/skinsdb/textures/character_283.png b/mods/skinsdb/textures/character.283.png similarity index 100% rename from mods/skinsdb/textures/character_283.png rename to mods/skinsdb/textures/character.283.png diff --git a/mods/skinsdb/textures/character_284.png b/mods/skinsdb/textures/character.284.png similarity index 100% rename from mods/skinsdb/textures/character_284.png rename to mods/skinsdb/textures/character.284.png diff --git a/mods/skinsdb/textures/character_285.png b/mods/skinsdb/textures/character.285.png similarity index 100% rename from mods/skinsdb/textures/character_285.png rename to mods/skinsdb/textures/character.285.png diff --git a/mods/skinsdb/textures/character_286.png b/mods/skinsdb/textures/character.286.png similarity index 100% rename from mods/skinsdb/textures/character_286.png rename to mods/skinsdb/textures/character.286.png diff --git a/mods/skinsdb/textures/character_287.png b/mods/skinsdb/textures/character.287.png similarity index 100% rename from mods/skinsdb/textures/character_287.png rename to mods/skinsdb/textures/character.287.png diff --git a/mods/skinsdb/textures/character_288.png b/mods/skinsdb/textures/character.288.png similarity index 100% rename from mods/skinsdb/textures/character_288.png rename to mods/skinsdb/textures/character.288.png diff --git a/mods/skinsdb/textures/character_289.png b/mods/skinsdb/textures/character.289.png similarity index 100% rename from mods/skinsdb/textures/character_289.png rename to mods/skinsdb/textures/character.289.png diff --git a/mods/skinsdb/textures/character_29.png b/mods/skinsdb/textures/character.29.png similarity index 100% rename from mods/skinsdb/textures/character_29.png rename to mods/skinsdb/textures/character.29.png diff --git a/mods/skinsdb/textures/character_290.png b/mods/skinsdb/textures/character.290.png similarity index 100% rename from mods/skinsdb/textures/character_290.png rename to mods/skinsdb/textures/character.290.png diff --git a/mods/skinsdb/textures/character_291.png b/mods/skinsdb/textures/character.291.png similarity index 100% rename from mods/skinsdb/textures/character_291.png rename to mods/skinsdb/textures/character.291.png diff --git a/mods/skinsdb/textures/character_292.png b/mods/skinsdb/textures/character.292.png similarity index 100% rename from mods/skinsdb/textures/character_292.png rename to mods/skinsdb/textures/character.292.png diff --git a/mods/skinsdb/textures/character_295.png b/mods/skinsdb/textures/character.295.png similarity index 100% rename from mods/skinsdb/textures/character_295.png rename to mods/skinsdb/textures/character.295.png diff --git a/mods/skinsdb/textures/character_297.png b/mods/skinsdb/textures/character.297.png similarity index 100% rename from mods/skinsdb/textures/character_297.png rename to mods/skinsdb/textures/character.297.png diff --git a/mods/skinsdb/textures/character_299.png b/mods/skinsdb/textures/character.299.png similarity index 100% rename from mods/skinsdb/textures/character_299.png rename to mods/skinsdb/textures/character.299.png diff --git a/mods/skinsdb/textures/character_3.png b/mods/skinsdb/textures/character.3.png similarity index 100% rename from mods/skinsdb/textures/character_3.png rename to mods/skinsdb/textures/character.3.png diff --git a/mods/skinsdb/textures/character_30.png b/mods/skinsdb/textures/character.30.png similarity index 100% rename from mods/skinsdb/textures/character_30.png rename to mods/skinsdb/textures/character.30.png diff --git a/mods/skinsdb/textures/character_300.png b/mods/skinsdb/textures/character.300.png similarity index 100% rename from mods/skinsdb/textures/character_300.png rename to mods/skinsdb/textures/character.300.png diff --git a/mods/skinsdb/textures/character_301.png b/mods/skinsdb/textures/character.301.png similarity index 100% rename from mods/skinsdb/textures/character_301.png rename to mods/skinsdb/textures/character.301.png diff --git a/mods/skinsdb/textures/character_302.png b/mods/skinsdb/textures/character.302.png similarity index 100% rename from mods/skinsdb/textures/character_302.png rename to mods/skinsdb/textures/character.302.png diff --git a/mods/skinsdb/textures/character_303.png b/mods/skinsdb/textures/character.303.png similarity index 100% rename from mods/skinsdb/textures/character_303.png rename to mods/skinsdb/textures/character.303.png diff --git a/mods/skinsdb/textures/character_304.png b/mods/skinsdb/textures/character.304.png similarity index 100% rename from mods/skinsdb/textures/character_304.png rename to mods/skinsdb/textures/character.304.png diff --git a/mods/skinsdb/textures/character_305.png b/mods/skinsdb/textures/character.305.png similarity index 100% rename from mods/skinsdb/textures/character_305.png rename to mods/skinsdb/textures/character.305.png diff --git a/mods/skinsdb/textures/character_306.png b/mods/skinsdb/textures/character.306.png similarity index 100% rename from mods/skinsdb/textures/character_306.png rename to mods/skinsdb/textures/character.306.png diff --git a/mods/skinsdb/textures/character_307.png b/mods/skinsdb/textures/character.307.png similarity index 100% rename from mods/skinsdb/textures/character_307.png rename to mods/skinsdb/textures/character.307.png diff --git a/mods/skinsdb/textures/character_308.png b/mods/skinsdb/textures/character.308.png similarity index 100% rename from mods/skinsdb/textures/character_308.png rename to mods/skinsdb/textures/character.308.png diff --git a/mods/skinsdb/textures/character_309.png b/mods/skinsdb/textures/character.309.png similarity index 100% rename from mods/skinsdb/textures/character_309.png rename to mods/skinsdb/textures/character.309.png diff --git a/mods/skinsdb/textures/character_31.png b/mods/skinsdb/textures/character.31.png similarity index 100% rename from mods/skinsdb/textures/character_31.png rename to mods/skinsdb/textures/character.31.png diff --git a/mods/skinsdb/textures/character_310.png b/mods/skinsdb/textures/character.310.png similarity index 100% rename from mods/skinsdb/textures/character_310.png rename to mods/skinsdb/textures/character.310.png diff --git a/mods/skinsdb/textures/character_311.png b/mods/skinsdb/textures/character.311.png similarity index 100% rename from mods/skinsdb/textures/character_311.png rename to mods/skinsdb/textures/character.311.png diff --git a/mods/skinsdb/textures/character_312.png b/mods/skinsdb/textures/character.312.png similarity index 100% rename from mods/skinsdb/textures/character_312.png rename to mods/skinsdb/textures/character.312.png diff --git a/mods/skinsdb/textures/character_313.png b/mods/skinsdb/textures/character.313.png similarity index 100% rename from mods/skinsdb/textures/character_313.png rename to mods/skinsdb/textures/character.313.png diff --git a/mods/skinsdb/textures/character_314.png b/mods/skinsdb/textures/character.314.png similarity index 100% rename from mods/skinsdb/textures/character_314.png rename to mods/skinsdb/textures/character.314.png diff --git a/mods/skinsdb/textures/character_315.png b/mods/skinsdb/textures/character.315.png similarity index 100% rename from mods/skinsdb/textures/character_315.png rename to mods/skinsdb/textures/character.315.png diff --git a/mods/skinsdb/textures/character_316.png b/mods/skinsdb/textures/character.316.png similarity index 100% rename from mods/skinsdb/textures/character_316.png rename to mods/skinsdb/textures/character.316.png diff --git a/mods/skinsdb/textures/character_317.png b/mods/skinsdb/textures/character.317.png similarity index 100% rename from mods/skinsdb/textures/character_317.png rename to mods/skinsdb/textures/character.317.png diff --git a/mods/skinsdb/textures/character_318.png b/mods/skinsdb/textures/character.318.png similarity index 100% rename from mods/skinsdb/textures/character_318.png rename to mods/skinsdb/textures/character.318.png diff --git a/mods/skinsdb/textures/character_319.png b/mods/skinsdb/textures/character.319.png similarity index 100% rename from mods/skinsdb/textures/character_319.png rename to mods/skinsdb/textures/character.319.png diff --git a/mods/skinsdb/textures/character_320.png b/mods/skinsdb/textures/character.320.png similarity index 100% rename from mods/skinsdb/textures/character_320.png rename to mods/skinsdb/textures/character.320.png diff --git a/mods/skinsdb/textures/character_321.png b/mods/skinsdb/textures/character.321.png similarity index 100% rename from mods/skinsdb/textures/character_321.png rename to mods/skinsdb/textures/character.321.png diff --git a/mods/skinsdb/textures/character_322.png b/mods/skinsdb/textures/character.322.png similarity index 100% rename from mods/skinsdb/textures/character_322.png rename to mods/skinsdb/textures/character.322.png diff --git a/mods/skinsdb/textures/character_323.png b/mods/skinsdb/textures/character.323.png similarity index 100% rename from mods/skinsdb/textures/character_323.png rename to mods/skinsdb/textures/character.323.png diff --git a/mods/skinsdb/textures/character_324.png b/mods/skinsdb/textures/character.324.png similarity index 100% rename from mods/skinsdb/textures/character_324.png rename to mods/skinsdb/textures/character.324.png diff --git a/mods/skinsdb/textures/character_325.png b/mods/skinsdb/textures/character.325.png similarity index 100% rename from mods/skinsdb/textures/character_325.png rename to mods/skinsdb/textures/character.325.png diff --git a/mods/skinsdb/textures/character_326.png b/mods/skinsdb/textures/character.326.png similarity index 100% rename from mods/skinsdb/textures/character_326.png rename to mods/skinsdb/textures/character.326.png diff --git a/mods/skinsdb/textures/character_327.png b/mods/skinsdb/textures/character.327.png similarity index 100% rename from mods/skinsdb/textures/character_327.png rename to mods/skinsdb/textures/character.327.png diff --git a/mods/skinsdb/textures/character_328.png b/mods/skinsdb/textures/character.328.png similarity index 100% rename from mods/skinsdb/textures/character_328.png rename to mods/skinsdb/textures/character.328.png diff --git a/mods/skinsdb/textures/character_329.png b/mods/skinsdb/textures/character.329.png similarity index 100% rename from mods/skinsdb/textures/character_329.png rename to mods/skinsdb/textures/character.329.png diff --git a/mods/skinsdb/textures/character_330.png b/mods/skinsdb/textures/character.330.png similarity index 100% rename from mods/skinsdb/textures/character_330.png rename to mods/skinsdb/textures/character.330.png diff --git a/mods/skinsdb/textures/character_331.png b/mods/skinsdb/textures/character.331.png similarity index 100% rename from mods/skinsdb/textures/character_331.png rename to mods/skinsdb/textures/character.331.png diff --git a/mods/skinsdb/textures/character_332.png b/mods/skinsdb/textures/character.332.png similarity index 100% rename from mods/skinsdb/textures/character_332.png rename to mods/skinsdb/textures/character.332.png diff --git a/mods/skinsdb/textures/character_333.png b/mods/skinsdb/textures/character.333.png similarity index 100% rename from mods/skinsdb/textures/character_333.png rename to mods/skinsdb/textures/character.333.png diff --git a/mods/skinsdb/textures/character_334.png b/mods/skinsdb/textures/character.334.png similarity index 100% rename from mods/skinsdb/textures/character_334.png rename to mods/skinsdb/textures/character.334.png diff --git a/mods/skinsdb/textures/character_335.png b/mods/skinsdb/textures/character.335.png similarity index 100% rename from mods/skinsdb/textures/character_335.png rename to mods/skinsdb/textures/character.335.png diff --git a/mods/skinsdb/textures/character_336.png b/mods/skinsdb/textures/character.336.png similarity index 100% rename from mods/skinsdb/textures/character_336.png rename to mods/skinsdb/textures/character.336.png diff --git a/mods/skinsdb/textures/character_337.png b/mods/skinsdb/textures/character.337.png similarity index 100% rename from mods/skinsdb/textures/character_337.png rename to mods/skinsdb/textures/character.337.png diff --git a/mods/skinsdb/textures/character_338.png b/mods/skinsdb/textures/character.338.png similarity index 100% rename from mods/skinsdb/textures/character_338.png rename to mods/skinsdb/textures/character.338.png diff --git a/mods/skinsdb/textures/character_339.png b/mods/skinsdb/textures/character.339.png similarity index 100% rename from mods/skinsdb/textures/character_339.png rename to mods/skinsdb/textures/character.339.png diff --git a/mods/skinsdb/textures/character_34.png b/mods/skinsdb/textures/character.34.png similarity index 100% rename from mods/skinsdb/textures/character_34.png rename to mods/skinsdb/textures/character.34.png diff --git a/mods/skinsdb/textures/character_340.png b/mods/skinsdb/textures/character.340.png similarity index 100% rename from mods/skinsdb/textures/character_340.png rename to mods/skinsdb/textures/character.340.png diff --git a/mods/skinsdb/textures/character_341.png b/mods/skinsdb/textures/character.341.png similarity index 100% rename from mods/skinsdb/textures/character_341.png rename to mods/skinsdb/textures/character.341.png diff --git a/mods/skinsdb/textures/character_342.png b/mods/skinsdb/textures/character.342.png similarity index 100% rename from mods/skinsdb/textures/character_342.png rename to mods/skinsdb/textures/character.342.png diff --git a/mods/skinsdb/textures/character_344.png b/mods/skinsdb/textures/character.344.png similarity index 100% rename from mods/skinsdb/textures/character_344.png rename to mods/skinsdb/textures/character.344.png diff --git a/mods/skinsdb/textures/character_349.png b/mods/skinsdb/textures/character.349.png similarity index 100% rename from mods/skinsdb/textures/character_349.png rename to mods/skinsdb/textures/character.349.png diff --git a/mods/skinsdb/textures/character_35.png b/mods/skinsdb/textures/character.35.png similarity index 100% rename from mods/skinsdb/textures/character_35.png rename to mods/skinsdb/textures/character.35.png diff --git a/mods/skinsdb/textures/character_352.png b/mods/skinsdb/textures/character.352.png similarity index 100% rename from mods/skinsdb/textures/character_352.png rename to mods/skinsdb/textures/character.352.png diff --git a/mods/skinsdb/textures/character_353.png b/mods/skinsdb/textures/character.353.png similarity index 100% rename from mods/skinsdb/textures/character_353.png rename to mods/skinsdb/textures/character.353.png diff --git a/mods/skinsdb/textures/character_356.png b/mods/skinsdb/textures/character.356.png similarity index 100% rename from mods/skinsdb/textures/character_356.png rename to mods/skinsdb/textures/character.356.png diff --git a/mods/skinsdb/textures/character_357.png b/mods/skinsdb/textures/character.357.png similarity index 100% rename from mods/skinsdb/textures/character_357.png rename to mods/skinsdb/textures/character.357.png diff --git a/mods/skinsdb/textures/character_359.png b/mods/skinsdb/textures/character.359.png similarity index 100% rename from mods/skinsdb/textures/character_359.png rename to mods/skinsdb/textures/character.359.png diff --git a/mods/skinsdb/textures/character_36.png b/mods/skinsdb/textures/character.36.png similarity index 100% rename from mods/skinsdb/textures/character_36.png rename to mods/skinsdb/textures/character.36.png diff --git a/mods/skinsdb/textures/character_361.png b/mods/skinsdb/textures/character.361.png similarity index 100% rename from mods/skinsdb/textures/character_361.png rename to mods/skinsdb/textures/character.361.png diff --git a/mods/skinsdb/textures/character_362.png b/mods/skinsdb/textures/character.362.png similarity index 100% rename from mods/skinsdb/textures/character_362.png rename to mods/skinsdb/textures/character.362.png diff --git a/mods/skinsdb/textures/character_363.png b/mods/skinsdb/textures/character.363.png similarity index 100% rename from mods/skinsdb/textures/character_363.png rename to mods/skinsdb/textures/character.363.png diff --git a/mods/skinsdb/textures/character_364.png b/mods/skinsdb/textures/character.364.png similarity index 100% rename from mods/skinsdb/textures/character_364.png rename to mods/skinsdb/textures/character.364.png diff --git a/mods/skinsdb/textures/character_365.png b/mods/skinsdb/textures/character.365.png similarity index 100% rename from mods/skinsdb/textures/character_365.png rename to mods/skinsdb/textures/character.365.png diff --git a/mods/skinsdb/textures/character_366.png b/mods/skinsdb/textures/character.366.png similarity index 100% rename from mods/skinsdb/textures/character_366.png rename to mods/skinsdb/textures/character.366.png diff --git a/mods/skinsdb/textures/character_367.png b/mods/skinsdb/textures/character.367.png similarity index 100% rename from mods/skinsdb/textures/character_367.png rename to mods/skinsdb/textures/character.367.png diff --git a/mods/skinsdb/textures/character_368.png b/mods/skinsdb/textures/character.368.png similarity index 100% rename from mods/skinsdb/textures/character_368.png rename to mods/skinsdb/textures/character.368.png diff --git a/mods/skinsdb/textures/character_369.png b/mods/skinsdb/textures/character.369.png similarity index 100% rename from mods/skinsdb/textures/character_369.png rename to mods/skinsdb/textures/character.369.png diff --git a/mods/skinsdb/textures/character_37.png b/mods/skinsdb/textures/character.37.png similarity index 100% rename from mods/skinsdb/textures/character_37.png rename to mods/skinsdb/textures/character.37.png diff --git a/mods/skinsdb/textures/character_370.png b/mods/skinsdb/textures/character.370.png similarity index 100% rename from mods/skinsdb/textures/character_370.png rename to mods/skinsdb/textures/character.370.png diff --git a/mods/skinsdb/textures/character_371.png b/mods/skinsdb/textures/character.371.png similarity index 100% rename from mods/skinsdb/textures/character_371.png rename to mods/skinsdb/textures/character.371.png diff --git a/mods/skinsdb/textures/character_372.png b/mods/skinsdb/textures/character.372.png similarity index 100% rename from mods/skinsdb/textures/character_372.png rename to mods/skinsdb/textures/character.372.png diff --git a/mods/skinsdb/textures/character_373.png b/mods/skinsdb/textures/character.373.png similarity index 100% rename from mods/skinsdb/textures/character_373.png rename to mods/skinsdb/textures/character.373.png diff --git a/mods/skinsdb/textures/character_374.png b/mods/skinsdb/textures/character.374.png similarity index 100% rename from mods/skinsdb/textures/character_374.png rename to mods/skinsdb/textures/character.374.png diff --git a/mods/skinsdb/textures/character_375.png b/mods/skinsdb/textures/character.375.png similarity index 100% rename from mods/skinsdb/textures/character_375.png rename to mods/skinsdb/textures/character.375.png diff --git a/mods/skinsdb/textures/character_376.png b/mods/skinsdb/textures/character.376.png similarity index 100% rename from mods/skinsdb/textures/character_376.png rename to mods/skinsdb/textures/character.376.png diff --git a/mods/skinsdb/textures/character_377.png b/mods/skinsdb/textures/character.377.png similarity index 100% rename from mods/skinsdb/textures/character_377.png rename to mods/skinsdb/textures/character.377.png diff --git a/mods/skinsdb/textures/character_378.png b/mods/skinsdb/textures/character.378.png similarity index 100% rename from mods/skinsdb/textures/character_378.png rename to mods/skinsdb/textures/character.378.png diff --git a/mods/skinsdb/textures/character_379.png b/mods/skinsdb/textures/character.379.png similarity index 100% rename from mods/skinsdb/textures/character_379.png rename to mods/skinsdb/textures/character.379.png diff --git a/mods/skinsdb/textures/character_380.png b/mods/skinsdb/textures/character.380.png similarity index 100% rename from mods/skinsdb/textures/character_380.png rename to mods/skinsdb/textures/character.380.png diff --git a/mods/skinsdb/textures/character_381.png b/mods/skinsdb/textures/character.381.png similarity index 100% rename from mods/skinsdb/textures/character_381.png rename to mods/skinsdb/textures/character.381.png diff --git a/mods/skinsdb/textures/character_382.png b/mods/skinsdb/textures/character.382.png similarity index 100% rename from mods/skinsdb/textures/character_382.png rename to mods/skinsdb/textures/character.382.png diff --git a/mods/skinsdb/textures/character_383.png b/mods/skinsdb/textures/character.383.png similarity index 100% rename from mods/skinsdb/textures/character_383.png rename to mods/skinsdb/textures/character.383.png diff --git a/mods/skinsdb/textures/character_384.png b/mods/skinsdb/textures/character.384.png similarity index 100% rename from mods/skinsdb/textures/character_384.png rename to mods/skinsdb/textures/character.384.png diff --git a/mods/skinsdb/textures/character_385.png b/mods/skinsdb/textures/character.385.png similarity index 100% rename from mods/skinsdb/textures/character_385.png rename to mods/skinsdb/textures/character.385.png diff --git a/mods/skinsdb/textures/character_387.png b/mods/skinsdb/textures/character.387.png similarity index 100% rename from mods/skinsdb/textures/character_387.png rename to mods/skinsdb/textures/character.387.png diff --git a/mods/skinsdb/textures/character_389.png b/mods/skinsdb/textures/character.389.png similarity index 100% rename from mods/skinsdb/textures/character_389.png rename to mods/skinsdb/textures/character.389.png diff --git a/mods/skinsdb/textures/character_390.png b/mods/skinsdb/textures/character.390.png similarity index 100% rename from mods/skinsdb/textures/character_390.png rename to mods/skinsdb/textures/character.390.png diff --git a/mods/skinsdb/textures/character_392.png b/mods/skinsdb/textures/character.392.png similarity index 100% rename from mods/skinsdb/textures/character_392.png rename to mods/skinsdb/textures/character.392.png diff --git a/mods/skinsdb/textures/character_393.png b/mods/skinsdb/textures/character.393.png similarity index 100% rename from mods/skinsdb/textures/character_393.png rename to mods/skinsdb/textures/character.393.png diff --git a/mods/skinsdb/textures/character_396.png b/mods/skinsdb/textures/character.396.png similarity index 100% rename from mods/skinsdb/textures/character_396.png rename to mods/skinsdb/textures/character.396.png diff --git a/mods/skinsdb/textures/character_399.png b/mods/skinsdb/textures/character.399.png similarity index 100% rename from mods/skinsdb/textures/character_399.png rename to mods/skinsdb/textures/character.399.png diff --git a/mods/skinsdb/textures/character_4.png b/mods/skinsdb/textures/character.4.png similarity index 100% rename from mods/skinsdb/textures/character_4.png rename to mods/skinsdb/textures/character.4.png diff --git a/mods/skinsdb/textures/character_400.png b/mods/skinsdb/textures/character.400.png similarity index 100% rename from mods/skinsdb/textures/character_400.png rename to mods/skinsdb/textures/character.400.png diff --git a/mods/skinsdb/textures/character_401.png b/mods/skinsdb/textures/character.401.png similarity index 100% rename from mods/skinsdb/textures/character_401.png rename to mods/skinsdb/textures/character.401.png diff --git a/mods/skinsdb/textures/character_402.png b/mods/skinsdb/textures/character.402.png similarity index 100% rename from mods/skinsdb/textures/character_402.png rename to mods/skinsdb/textures/character.402.png diff --git a/mods/skinsdb/textures/character_403.png b/mods/skinsdb/textures/character.403.png similarity index 100% rename from mods/skinsdb/textures/character_403.png rename to mods/skinsdb/textures/character.403.png diff --git a/mods/skinsdb/textures/character_404.png b/mods/skinsdb/textures/character.404.png similarity index 100% rename from mods/skinsdb/textures/character_404.png rename to mods/skinsdb/textures/character.404.png diff --git a/mods/skinsdb/textures/character_405.png b/mods/skinsdb/textures/character.405.png similarity index 100% rename from mods/skinsdb/textures/character_405.png rename to mods/skinsdb/textures/character.405.png diff --git a/mods/skinsdb/textures/character_406.png b/mods/skinsdb/textures/character.406.png similarity index 100% rename from mods/skinsdb/textures/character_406.png rename to mods/skinsdb/textures/character.406.png diff --git a/mods/skinsdb/textures/character_407.png b/mods/skinsdb/textures/character.407.png similarity index 100% rename from mods/skinsdb/textures/character_407.png rename to mods/skinsdb/textures/character.407.png diff --git a/mods/skinsdb/textures/character_408.png b/mods/skinsdb/textures/character.408.png similarity index 100% rename from mods/skinsdb/textures/character_408.png rename to mods/skinsdb/textures/character.408.png diff --git a/mods/skinsdb/textures/character_409.png b/mods/skinsdb/textures/character.409.png similarity index 100% rename from mods/skinsdb/textures/character_409.png rename to mods/skinsdb/textures/character.409.png diff --git a/mods/skinsdb/textures/character_410.png b/mods/skinsdb/textures/character.410.png similarity index 100% rename from mods/skinsdb/textures/character_410.png rename to mods/skinsdb/textures/character.410.png diff --git a/mods/skinsdb/textures/character_411.png b/mods/skinsdb/textures/character.411.png similarity index 100% rename from mods/skinsdb/textures/character_411.png rename to mods/skinsdb/textures/character.411.png diff --git a/mods/skinsdb/textures/character_412.png b/mods/skinsdb/textures/character.412.png similarity index 100% rename from mods/skinsdb/textures/character_412.png rename to mods/skinsdb/textures/character.412.png diff --git a/mods/skinsdb/textures/character_413.png b/mods/skinsdb/textures/character.413.png similarity index 100% rename from mods/skinsdb/textures/character_413.png rename to mods/skinsdb/textures/character.413.png diff --git a/mods/skinsdb/textures/character_414.png b/mods/skinsdb/textures/character.414.png similarity index 100% rename from mods/skinsdb/textures/character_414.png rename to mods/skinsdb/textures/character.414.png diff --git a/mods/skinsdb/textures/character_415.png b/mods/skinsdb/textures/character.415.png similarity index 100% rename from mods/skinsdb/textures/character_415.png rename to mods/skinsdb/textures/character.415.png diff --git a/mods/skinsdb/textures/character_416.png b/mods/skinsdb/textures/character.416.png similarity index 100% rename from mods/skinsdb/textures/character_416.png rename to mods/skinsdb/textures/character.416.png diff --git a/mods/skinsdb/textures/character_417.png b/mods/skinsdb/textures/character.417.png similarity index 100% rename from mods/skinsdb/textures/character_417.png rename to mods/skinsdb/textures/character.417.png diff --git a/mods/skinsdb/textures/character_418.png b/mods/skinsdb/textures/character.418.png similarity index 100% rename from mods/skinsdb/textures/character_418.png rename to mods/skinsdb/textures/character.418.png diff --git a/mods/skinsdb/textures/character_419.png b/mods/skinsdb/textures/character.419.png similarity index 100% rename from mods/skinsdb/textures/character_419.png rename to mods/skinsdb/textures/character.419.png diff --git a/mods/skinsdb/textures/character_420.png b/mods/skinsdb/textures/character.420.png similarity index 100% rename from mods/skinsdb/textures/character_420.png rename to mods/skinsdb/textures/character.420.png diff --git a/mods/skinsdb/textures/character_421.png b/mods/skinsdb/textures/character.421.png similarity index 100% rename from mods/skinsdb/textures/character_421.png rename to mods/skinsdb/textures/character.421.png diff --git a/mods/skinsdb/textures/character_428.png b/mods/skinsdb/textures/character.428.png similarity index 100% rename from mods/skinsdb/textures/character_428.png rename to mods/skinsdb/textures/character.428.png diff --git a/mods/skinsdb/textures/character_429.png b/mods/skinsdb/textures/character.429.png similarity index 100% rename from mods/skinsdb/textures/character_429.png rename to mods/skinsdb/textures/character.429.png diff --git a/mods/skinsdb/textures/character_430.png b/mods/skinsdb/textures/character.430.png similarity index 100% rename from mods/skinsdb/textures/character_430.png rename to mods/skinsdb/textures/character.430.png diff --git a/mods/skinsdb/textures/character_431.png b/mods/skinsdb/textures/character.431.png similarity index 100% rename from mods/skinsdb/textures/character_431.png rename to mods/skinsdb/textures/character.431.png diff --git a/mods/skinsdb/textures/character_432.png b/mods/skinsdb/textures/character.432.png similarity index 100% rename from mods/skinsdb/textures/character_432.png rename to mods/skinsdb/textures/character.432.png diff --git a/mods/skinsdb/textures/character_433.png b/mods/skinsdb/textures/character.433.png similarity index 100% rename from mods/skinsdb/textures/character_433.png rename to mods/skinsdb/textures/character.433.png diff --git a/mods/skinsdb/textures/character_434.png b/mods/skinsdb/textures/character.434.png similarity index 100% rename from mods/skinsdb/textures/character_434.png rename to mods/skinsdb/textures/character.434.png diff --git a/mods/skinsdb/textures/character_435.png b/mods/skinsdb/textures/character.435.png similarity index 100% rename from mods/skinsdb/textures/character_435.png rename to mods/skinsdb/textures/character.435.png diff --git a/mods/skinsdb/textures/character_436.png b/mods/skinsdb/textures/character.436.png similarity index 100% rename from mods/skinsdb/textures/character_436.png rename to mods/skinsdb/textures/character.436.png diff --git a/mods/skinsdb/textures/character_437.png b/mods/skinsdb/textures/character.437.png similarity index 100% rename from mods/skinsdb/textures/character_437.png rename to mods/skinsdb/textures/character.437.png diff --git a/mods/skinsdb/textures/character_438.png b/mods/skinsdb/textures/character.438.png similarity index 100% rename from mods/skinsdb/textures/character_438.png rename to mods/skinsdb/textures/character.438.png diff --git a/mods/skinsdb/textures/character_439.png b/mods/skinsdb/textures/character.439.png similarity index 100% rename from mods/skinsdb/textures/character_439.png rename to mods/skinsdb/textures/character.439.png diff --git a/mods/skinsdb/textures/character_440.png b/mods/skinsdb/textures/character.440.png similarity index 100% rename from mods/skinsdb/textures/character_440.png rename to mods/skinsdb/textures/character.440.png diff --git a/mods/skinsdb/textures/character_441.png b/mods/skinsdb/textures/character.441.png similarity index 100% rename from mods/skinsdb/textures/character_441.png rename to mods/skinsdb/textures/character.441.png diff --git a/mods/skinsdb/textures/character_442.png b/mods/skinsdb/textures/character.442.png similarity index 100% rename from mods/skinsdb/textures/character_442.png rename to mods/skinsdb/textures/character.442.png diff --git a/mods/skinsdb/textures/character_443.png b/mods/skinsdb/textures/character.443.png similarity index 100% rename from mods/skinsdb/textures/character_443.png rename to mods/skinsdb/textures/character.443.png diff --git a/mods/skinsdb/textures/character_444.png b/mods/skinsdb/textures/character.444.png similarity index 100% rename from mods/skinsdb/textures/character_444.png rename to mods/skinsdb/textures/character.444.png diff --git a/mods/skinsdb/textures/character_445.png b/mods/skinsdb/textures/character.445.png similarity index 100% rename from mods/skinsdb/textures/character_445.png rename to mods/skinsdb/textures/character.445.png diff --git a/mods/skinsdb/textures/character_446.png b/mods/skinsdb/textures/character.446.png similarity index 100% rename from mods/skinsdb/textures/character_446.png rename to mods/skinsdb/textures/character.446.png diff --git a/mods/skinsdb/textures/character_447.png b/mods/skinsdb/textures/character.447.png similarity index 100% rename from mods/skinsdb/textures/character_447.png rename to mods/skinsdb/textures/character.447.png diff --git a/mods/skinsdb/textures/character_448.png b/mods/skinsdb/textures/character.448.png similarity index 100% rename from mods/skinsdb/textures/character_448.png rename to mods/skinsdb/textures/character.448.png diff --git a/mods/skinsdb/textures/character_449.png b/mods/skinsdb/textures/character.449.png similarity index 100% rename from mods/skinsdb/textures/character_449.png rename to mods/skinsdb/textures/character.449.png diff --git a/mods/skinsdb/textures/character_450.png b/mods/skinsdb/textures/character.450.png similarity index 100% rename from mods/skinsdb/textures/character_450.png rename to mods/skinsdb/textures/character.450.png diff --git a/mods/skinsdb/textures/character_451.png b/mods/skinsdb/textures/character.451.png similarity index 100% rename from mods/skinsdb/textures/character_451.png rename to mods/skinsdb/textures/character.451.png diff --git a/mods/skinsdb/textures/character_452.png b/mods/skinsdb/textures/character.452.png similarity index 100% rename from mods/skinsdb/textures/character_452.png rename to mods/skinsdb/textures/character.452.png diff --git a/mods/skinsdb/textures/character_453.png b/mods/skinsdb/textures/character.453.png similarity index 100% rename from mods/skinsdb/textures/character_453.png rename to mods/skinsdb/textures/character.453.png diff --git a/mods/skinsdb/textures/character_454.png b/mods/skinsdb/textures/character.454.png similarity index 100% rename from mods/skinsdb/textures/character_454.png rename to mods/skinsdb/textures/character.454.png diff --git a/mods/skinsdb/textures/character_456.png b/mods/skinsdb/textures/character.456.png similarity index 100% rename from mods/skinsdb/textures/character_456.png rename to mods/skinsdb/textures/character.456.png diff --git a/mods/skinsdb/textures/character_457.png b/mods/skinsdb/textures/character.457.png similarity index 100% rename from mods/skinsdb/textures/character_457.png rename to mods/skinsdb/textures/character.457.png diff --git a/mods/skinsdb/textures/character_458.png b/mods/skinsdb/textures/character.458.png similarity index 100% rename from mods/skinsdb/textures/character_458.png rename to mods/skinsdb/textures/character.458.png diff --git a/mods/skinsdb/textures/character_459.png b/mods/skinsdb/textures/character.459.png similarity index 100% rename from mods/skinsdb/textures/character_459.png rename to mods/skinsdb/textures/character.459.png diff --git a/mods/skinsdb/textures/character_460.png b/mods/skinsdb/textures/character.460.png similarity index 100% rename from mods/skinsdb/textures/character_460.png rename to mods/skinsdb/textures/character.460.png diff --git a/mods/skinsdb/textures/character_461.png b/mods/skinsdb/textures/character.461.png similarity index 100% rename from mods/skinsdb/textures/character_461.png rename to mods/skinsdb/textures/character.461.png diff --git a/mods/skinsdb/textures/character_462.png b/mods/skinsdb/textures/character.462.png similarity index 100% rename from mods/skinsdb/textures/character_462.png rename to mods/skinsdb/textures/character.462.png diff --git a/mods/skinsdb/textures/character_463.png b/mods/skinsdb/textures/character.463.png similarity index 100% rename from mods/skinsdb/textures/character_463.png rename to mods/skinsdb/textures/character.463.png diff --git a/mods/skinsdb/textures/character_464.png b/mods/skinsdb/textures/character.464.png similarity index 100% rename from mods/skinsdb/textures/character_464.png rename to mods/skinsdb/textures/character.464.png diff --git a/mods/skinsdb/textures/character_465.png b/mods/skinsdb/textures/character.465.png similarity index 100% rename from mods/skinsdb/textures/character_465.png rename to mods/skinsdb/textures/character.465.png diff --git a/mods/skinsdb/textures/character_466.png b/mods/skinsdb/textures/character.466.png similarity index 100% rename from mods/skinsdb/textures/character_466.png rename to mods/skinsdb/textures/character.466.png diff --git a/mods/skinsdb/textures/character_467.png b/mods/skinsdb/textures/character.467.png similarity index 100% rename from mods/skinsdb/textures/character_467.png rename to mods/skinsdb/textures/character.467.png diff --git a/mods/skinsdb/textures/character_468.png b/mods/skinsdb/textures/character.468.png similarity index 100% rename from mods/skinsdb/textures/character_468.png rename to mods/skinsdb/textures/character.468.png diff --git a/mods/skinsdb/textures/character_469.png b/mods/skinsdb/textures/character.469.png similarity index 100% rename from mods/skinsdb/textures/character_469.png rename to mods/skinsdb/textures/character.469.png diff --git a/mods/skinsdb/textures/character_470.png b/mods/skinsdb/textures/character.470.png similarity index 100% rename from mods/skinsdb/textures/character_470.png rename to mods/skinsdb/textures/character.470.png diff --git a/mods/skinsdb/textures/character_471.png b/mods/skinsdb/textures/character.471.png similarity index 100% rename from mods/skinsdb/textures/character_471.png rename to mods/skinsdb/textures/character.471.png diff --git a/mods/skinsdb/textures/character_473.png b/mods/skinsdb/textures/character.473.png similarity index 100% rename from mods/skinsdb/textures/character_473.png rename to mods/skinsdb/textures/character.473.png diff --git a/mods/skinsdb/textures/character_474.png b/mods/skinsdb/textures/character.474.png similarity index 100% rename from mods/skinsdb/textures/character_474.png rename to mods/skinsdb/textures/character.474.png diff --git a/mods/skinsdb/textures/character_475.png b/mods/skinsdb/textures/character.475.png similarity index 100% rename from mods/skinsdb/textures/character_475.png rename to mods/skinsdb/textures/character.475.png diff --git a/mods/skinsdb/textures/character_476.png b/mods/skinsdb/textures/character.476.png similarity index 100% rename from mods/skinsdb/textures/character_476.png rename to mods/skinsdb/textures/character.476.png diff --git a/mods/skinsdb/textures/character_477.png b/mods/skinsdb/textures/character.477.png similarity index 100% rename from mods/skinsdb/textures/character_477.png rename to mods/skinsdb/textures/character.477.png diff --git a/mods/skinsdb/textures/character_478.png b/mods/skinsdb/textures/character.478.png similarity index 100% rename from mods/skinsdb/textures/character_478.png rename to mods/skinsdb/textures/character.478.png diff --git a/mods/skinsdb/textures/character_479.png b/mods/skinsdb/textures/character.479.png similarity index 100% rename from mods/skinsdb/textures/character_479.png rename to mods/skinsdb/textures/character.479.png diff --git a/mods/skinsdb/textures/character_480.png b/mods/skinsdb/textures/character.480.png similarity index 100% rename from mods/skinsdb/textures/character_480.png rename to mods/skinsdb/textures/character.480.png diff --git a/mods/skinsdb/textures/character_482.png b/mods/skinsdb/textures/character.482.png similarity index 100% rename from mods/skinsdb/textures/character_482.png rename to mods/skinsdb/textures/character.482.png diff --git a/mods/skinsdb/textures/character_483.png b/mods/skinsdb/textures/character.483.png similarity index 100% rename from mods/skinsdb/textures/character_483.png rename to mods/skinsdb/textures/character.483.png diff --git a/mods/skinsdb/textures/character_484.png b/mods/skinsdb/textures/character.484.png similarity index 100% rename from mods/skinsdb/textures/character_484.png rename to mods/skinsdb/textures/character.484.png diff --git a/mods/skinsdb/textures/character_485.png b/mods/skinsdb/textures/character.485.png similarity index 100% rename from mods/skinsdb/textures/character_485.png rename to mods/skinsdb/textures/character.485.png diff --git a/mods/skinsdb/textures/character_486.png b/mods/skinsdb/textures/character.486.png similarity index 100% rename from mods/skinsdb/textures/character_486.png rename to mods/skinsdb/textures/character.486.png diff --git a/mods/skinsdb/textures/character_487.png b/mods/skinsdb/textures/character.487.png similarity index 100% rename from mods/skinsdb/textures/character_487.png rename to mods/skinsdb/textures/character.487.png diff --git a/mods/skinsdb/textures/character_488.png b/mods/skinsdb/textures/character.488.png similarity index 100% rename from mods/skinsdb/textures/character_488.png rename to mods/skinsdb/textures/character.488.png diff --git a/mods/skinsdb/textures/character_489.png b/mods/skinsdb/textures/character.489.png similarity index 100% rename from mods/skinsdb/textures/character_489.png rename to mods/skinsdb/textures/character.489.png diff --git a/mods/skinsdb/textures/character_490.png b/mods/skinsdb/textures/character.490.png similarity index 100% rename from mods/skinsdb/textures/character_490.png rename to mods/skinsdb/textures/character.490.png diff --git a/mods/skinsdb/textures/character_491.png b/mods/skinsdb/textures/character.491.png similarity index 100% rename from mods/skinsdb/textures/character_491.png rename to mods/skinsdb/textures/character.491.png diff --git a/mods/skinsdb/textures/character_492.png b/mods/skinsdb/textures/character.492.png similarity index 100% rename from mods/skinsdb/textures/character_492.png rename to mods/skinsdb/textures/character.492.png diff --git a/mods/skinsdb/textures/character_493.png b/mods/skinsdb/textures/character.493.png similarity index 100% rename from mods/skinsdb/textures/character_493.png rename to mods/skinsdb/textures/character.493.png diff --git a/mods/skinsdb/textures/character_494.png b/mods/skinsdb/textures/character.494.png similarity index 100% rename from mods/skinsdb/textures/character_494.png rename to mods/skinsdb/textures/character.494.png diff --git a/mods/skinsdb/textures/character_495.png b/mods/skinsdb/textures/character.495.png similarity index 100% rename from mods/skinsdb/textures/character_495.png rename to mods/skinsdb/textures/character.495.png diff --git a/mods/skinsdb/textures/character_496.png b/mods/skinsdb/textures/character.496.png similarity index 100% rename from mods/skinsdb/textures/character_496.png rename to mods/skinsdb/textures/character.496.png diff --git a/mods/skinsdb/textures/character_497.png b/mods/skinsdb/textures/character.497.png similarity index 100% rename from mods/skinsdb/textures/character_497.png rename to mods/skinsdb/textures/character.497.png diff --git a/mods/skinsdb/textures/character_498.png b/mods/skinsdb/textures/character.498.png similarity index 100% rename from mods/skinsdb/textures/character_498.png rename to mods/skinsdb/textures/character.498.png diff --git a/mods/skinsdb/textures/character_5.png b/mods/skinsdb/textures/character.5.png similarity index 100% rename from mods/skinsdb/textures/character_5.png rename to mods/skinsdb/textures/character.5.png diff --git a/mods/skinsdb/textures/character_50.png b/mods/skinsdb/textures/character.50.png similarity index 100% rename from mods/skinsdb/textures/character_50.png rename to mods/skinsdb/textures/character.50.png diff --git a/mods/skinsdb/textures/character_500.png b/mods/skinsdb/textures/character.500.png similarity index 100% rename from mods/skinsdb/textures/character_500.png rename to mods/skinsdb/textures/character.500.png diff --git a/mods/skinsdb/textures/character_501.png b/mods/skinsdb/textures/character.501.png similarity index 100% rename from mods/skinsdb/textures/character_501.png rename to mods/skinsdb/textures/character.501.png diff --git a/mods/skinsdb/textures/character_502.png b/mods/skinsdb/textures/character.502.png similarity index 100% rename from mods/skinsdb/textures/character_502.png rename to mods/skinsdb/textures/character.502.png diff --git a/mods/skinsdb/textures/character_503.png b/mods/skinsdb/textures/character.503.png similarity index 100% rename from mods/skinsdb/textures/character_503.png rename to mods/skinsdb/textures/character.503.png diff --git a/mods/skinsdb/textures/character_504.png b/mods/skinsdb/textures/character.504.png similarity index 100% rename from mods/skinsdb/textures/character_504.png rename to mods/skinsdb/textures/character.504.png diff --git a/mods/skinsdb/textures/character_505.png b/mods/skinsdb/textures/character.505.png similarity index 100% rename from mods/skinsdb/textures/character_505.png rename to mods/skinsdb/textures/character.505.png diff --git a/mods/skinsdb/textures/character_507.png b/mods/skinsdb/textures/character.507.png similarity index 100% rename from mods/skinsdb/textures/character_507.png rename to mods/skinsdb/textures/character.507.png diff --git a/mods/skinsdb/textures/character_510.png b/mods/skinsdb/textures/character.510.png similarity index 100% rename from mods/skinsdb/textures/character_510.png rename to mods/skinsdb/textures/character.510.png diff --git a/mods/skinsdb/textures/character_511.png b/mods/skinsdb/textures/character.511.png similarity index 100% rename from mods/skinsdb/textures/character_511.png rename to mods/skinsdb/textures/character.511.png diff --git a/mods/skinsdb/textures/character_512.png b/mods/skinsdb/textures/character.512.png similarity index 100% rename from mods/skinsdb/textures/character_512.png rename to mods/skinsdb/textures/character.512.png diff --git a/mods/skinsdb/textures/character_513.png b/mods/skinsdb/textures/character.513.png similarity index 100% rename from mods/skinsdb/textures/character_513.png rename to mods/skinsdb/textures/character.513.png diff --git a/mods/skinsdb/textures/character_514.png b/mods/skinsdb/textures/character.514.png similarity index 100% rename from mods/skinsdb/textures/character_514.png rename to mods/skinsdb/textures/character.514.png diff --git a/mods/skinsdb/textures/character_515.png b/mods/skinsdb/textures/character.515.png similarity index 100% rename from mods/skinsdb/textures/character_515.png rename to mods/skinsdb/textures/character.515.png diff --git a/mods/skinsdb/textures/character_516.png b/mods/skinsdb/textures/character.516.png similarity index 100% rename from mods/skinsdb/textures/character_516.png rename to mods/skinsdb/textures/character.516.png diff --git a/mods/skinsdb/textures/character_517.png b/mods/skinsdb/textures/character.517.png similarity index 100% rename from mods/skinsdb/textures/character_517.png rename to mods/skinsdb/textures/character.517.png diff --git a/mods/skinsdb/textures/character_518.png b/mods/skinsdb/textures/character.518.png similarity index 100% rename from mods/skinsdb/textures/character_518.png rename to mods/skinsdb/textures/character.518.png diff --git a/mods/skinsdb/textures/character_519.png b/mods/skinsdb/textures/character.519.png similarity index 100% rename from mods/skinsdb/textures/character_519.png rename to mods/skinsdb/textures/character.519.png diff --git a/mods/skinsdb/textures/character_52.png b/mods/skinsdb/textures/character.52.png similarity index 100% rename from mods/skinsdb/textures/character_52.png rename to mods/skinsdb/textures/character.52.png diff --git a/mods/skinsdb/textures/character_520.png b/mods/skinsdb/textures/character.520.png similarity index 100% rename from mods/skinsdb/textures/character_520.png rename to mods/skinsdb/textures/character.520.png diff --git a/mods/skinsdb/textures/character_521.png b/mods/skinsdb/textures/character.521.png similarity index 100% rename from mods/skinsdb/textures/character_521.png rename to mods/skinsdb/textures/character.521.png diff --git a/mods/skinsdb/textures/character_522.png b/mods/skinsdb/textures/character.522.png similarity index 100% rename from mods/skinsdb/textures/character_522.png rename to mods/skinsdb/textures/character.522.png diff --git a/mods/skinsdb/textures/character_523.png b/mods/skinsdb/textures/character.523.png similarity index 100% rename from mods/skinsdb/textures/character_523.png rename to mods/skinsdb/textures/character.523.png diff --git a/mods/skinsdb/textures/character_524.png b/mods/skinsdb/textures/character.524.png similarity index 100% rename from mods/skinsdb/textures/character_524.png rename to mods/skinsdb/textures/character.524.png diff --git a/mods/skinsdb/textures/character_525.png b/mods/skinsdb/textures/character.525.png similarity index 100% rename from mods/skinsdb/textures/character_525.png rename to mods/skinsdb/textures/character.525.png diff --git a/mods/skinsdb/textures/character_526.png b/mods/skinsdb/textures/character.526.png similarity index 100% rename from mods/skinsdb/textures/character_526.png rename to mods/skinsdb/textures/character.526.png diff --git a/mods/skinsdb/textures/character_527.png b/mods/skinsdb/textures/character.527.png similarity index 100% rename from mods/skinsdb/textures/character_527.png rename to mods/skinsdb/textures/character.527.png diff --git a/mods/skinsdb/textures/character_528.png b/mods/skinsdb/textures/character.528.png similarity index 100% rename from mods/skinsdb/textures/character_528.png rename to mods/skinsdb/textures/character.528.png diff --git a/mods/skinsdb/textures/character_529.png b/mods/skinsdb/textures/character.529.png similarity index 100% rename from mods/skinsdb/textures/character_529.png rename to mods/skinsdb/textures/character.529.png diff --git a/mods/skinsdb/textures/character_530.png b/mods/skinsdb/textures/character.530.png similarity index 100% rename from mods/skinsdb/textures/character_530.png rename to mods/skinsdb/textures/character.530.png diff --git a/mods/skinsdb/textures/character_531.png b/mods/skinsdb/textures/character.531.png similarity index 100% rename from mods/skinsdb/textures/character_531.png rename to mods/skinsdb/textures/character.531.png diff --git a/mods/skinsdb/textures/character_532.png b/mods/skinsdb/textures/character.532.png similarity index 100% rename from mods/skinsdb/textures/character_532.png rename to mods/skinsdb/textures/character.532.png diff --git a/mods/skinsdb/textures/character_533.png b/mods/skinsdb/textures/character.533.png similarity index 100% rename from mods/skinsdb/textures/character_533.png rename to mods/skinsdb/textures/character.533.png diff --git a/mods/skinsdb/textures/character_534.png b/mods/skinsdb/textures/character.534.png similarity index 100% rename from mods/skinsdb/textures/character_534.png rename to mods/skinsdb/textures/character.534.png diff --git a/mods/skinsdb/textures/character_535.png b/mods/skinsdb/textures/character.535.png similarity index 100% rename from mods/skinsdb/textures/character_535.png rename to mods/skinsdb/textures/character.535.png diff --git a/mods/skinsdb/textures/character_536.png b/mods/skinsdb/textures/character.536.png similarity index 100% rename from mods/skinsdb/textures/character_536.png rename to mods/skinsdb/textures/character.536.png diff --git a/mods/skinsdb/textures/character_537.png b/mods/skinsdb/textures/character.537.png similarity index 100% rename from mods/skinsdb/textures/character_537.png rename to mods/skinsdb/textures/character.537.png diff --git a/mods/skinsdb/textures/character_539.png b/mods/skinsdb/textures/character.539.png similarity index 100% rename from mods/skinsdb/textures/character_539.png rename to mods/skinsdb/textures/character.539.png diff --git a/mods/skinsdb/textures/character_54.png b/mods/skinsdb/textures/character.54.png similarity index 100% rename from mods/skinsdb/textures/character_54.png rename to mods/skinsdb/textures/character.54.png diff --git a/mods/skinsdb/textures/character_540.png b/mods/skinsdb/textures/character.540.png similarity index 100% rename from mods/skinsdb/textures/character_540.png rename to mods/skinsdb/textures/character.540.png diff --git a/mods/skinsdb/textures/character_541.png b/mods/skinsdb/textures/character.541.png similarity index 100% rename from mods/skinsdb/textures/character_541.png rename to mods/skinsdb/textures/character.541.png diff --git a/mods/skinsdb/textures/character_542.png b/mods/skinsdb/textures/character.542.png similarity index 100% rename from mods/skinsdb/textures/character_542.png rename to mods/skinsdb/textures/character.542.png diff --git a/mods/skinsdb/textures/character_543.png b/mods/skinsdb/textures/character.543.png similarity index 100% rename from mods/skinsdb/textures/character_543.png rename to mods/skinsdb/textures/character.543.png diff --git a/mods/skinsdb/textures/character_544.png b/mods/skinsdb/textures/character.544.png similarity index 100% rename from mods/skinsdb/textures/character_544.png rename to mods/skinsdb/textures/character.544.png diff --git a/mods/skinsdb/textures/character_545.png b/mods/skinsdb/textures/character.545.png similarity index 100% rename from mods/skinsdb/textures/character_545.png rename to mods/skinsdb/textures/character.545.png diff --git a/mods/skinsdb/textures/character_546.png b/mods/skinsdb/textures/character.546.png similarity index 100% rename from mods/skinsdb/textures/character_546.png rename to mods/skinsdb/textures/character.546.png diff --git a/mods/skinsdb/textures/character_547.png b/mods/skinsdb/textures/character.547.png similarity index 100% rename from mods/skinsdb/textures/character_547.png rename to mods/skinsdb/textures/character.547.png diff --git a/mods/skinsdb/textures/character_548.png b/mods/skinsdb/textures/character.548.png similarity index 100% rename from mods/skinsdb/textures/character_548.png rename to mods/skinsdb/textures/character.548.png diff --git a/mods/skinsdb/textures/character_549.png b/mods/skinsdb/textures/character.549.png similarity index 100% rename from mods/skinsdb/textures/character_549.png rename to mods/skinsdb/textures/character.549.png diff --git a/mods/skinsdb/textures/character_55.png b/mods/skinsdb/textures/character.55.png similarity index 100% rename from mods/skinsdb/textures/character_55.png rename to mods/skinsdb/textures/character.55.png diff --git a/mods/skinsdb/textures/character_550.png b/mods/skinsdb/textures/character.550.png similarity index 100% rename from mods/skinsdb/textures/character_550.png rename to mods/skinsdb/textures/character.550.png diff --git a/mods/skinsdb/textures/character_551.png b/mods/skinsdb/textures/character.551.png similarity index 100% rename from mods/skinsdb/textures/character_551.png rename to mods/skinsdb/textures/character.551.png diff --git a/mods/skinsdb/textures/character_552.png b/mods/skinsdb/textures/character.552.png similarity index 100% rename from mods/skinsdb/textures/character_552.png rename to mods/skinsdb/textures/character.552.png diff --git a/mods/skinsdb/textures/character_553.png b/mods/skinsdb/textures/character.553.png similarity index 100% rename from mods/skinsdb/textures/character_553.png rename to mods/skinsdb/textures/character.553.png diff --git a/mods/skinsdb/textures/character_554.png b/mods/skinsdb/textures/character.554.png similarity index 100% rename from mods/skinsdb/textures/character_554.png rename to mods/skinsdb/textures/character.554.png diff --git a/mods/skinsdb/textures/character_555.png b/mods/skinsdb/textures/character.555.png similarity index 100% rename from mods/skinsdb/textures/character_555.png rename to mods/skinsdb/textures/character.555.png diff --git a/mods/skinsdb/textures/character_556.png b/mods/skinsdb/textures/character.556.png similarity index 100% rename from mods/skinsdb/textures/character_556.png rename to mods/skinsdb/textures/character.556.png diff --git a/mods/skinsdb/textures/character_558.png b/mods/skinsdb/textures/character.558.png similarity index 100% rename from mods/skinsdb/textures/character_558.png rename to mods/skinsdb/textures/character.558.png diff --git a/mods/skinsdb/textures/character_559.png b/mods/skinsdb/textures/character.559.png similarity index 100% rename from mods/skinsdb/textures/character_559.png rename to mods/skinsdb/textures/character.559.png diff --git a/mods/skinsdb/textures/character_560.png b/mods/skinsdb/textures/character.560.png similarity index 100% rename from mods/skinsdb/textures/character_560.png rename to mods/skinsdb/textures/character.560.png diff --git a/mods/skinsdb/textures/character_561.png b/mods/skinsdb/textures/character.561.png similarity index 100% rename from mods/skinsdb/textures/character_561.png rename to mods/skinsdb/textures/character.561.png diff --git a/mods/skinsdb/textures/character_562.png b/mods/skinsdb/textures/character.562.png similarity index 100% rename from mods/skinsdb/textures/character_562.png rename to mods/skinsdb/textures/character.562.png diff --git a/mods/skinsdb/textures/character_563.png b/mods/skinsdb/textures/character.563.png similarity index 100% rename from mods/skinsdb/textures/character_563.png rename to mods/skinsdb/textures/character.563.png diff --git a/mods/skinsdb/textures/character_564.png b/mods/skinsdb/textures/character.564.png similarity index 100% rename from mods/skinsdb/textures/character_564.png rename to mods/skinsdb/textures/character.564.png diff --git a/mods/skinsdb/textures/character_565.png b/mods/skinsdb/textures/character.565.png similarity index 100% rename from mods/skinsdb/textures/character_565.png rename to mods/skinsdb/textures/character.565.png diff --git a/mods/skinsdb/textures/character_567.png b/mods/skinsdb/textures/character.567.png similarity index 100% rename from mods/skinsdb/textures/character_567.png rename to mods/skinsdb/textures/character.567.png diff --git a/mods/skinsdb/textures/character_57.png b/mods/skinsdb/textures/character.57.png similarity index 100% rename from mods/skinsdb/textures/character_57.png rename to mods/skinsdb/textures/character.57.png diff --git a/mods/skinsdb/textures/character_570.png b/mods/skinsdb/textures/character.570.png similarity index 100% rename from mods/skinsdb/textures/character_570.png rename to mods/skinsdb/textures/character.570.png diff --git a/mods/skinsdb/textures/character_571.png b/mods/skinsdb/textures/character.571.png similarity index 100% rename from mods/skinsdb/textures/character_571.png rename to mods/skinsdb/textures/character.571.png diff --git a/mods/skinsdb/textures/character_572.png b/mods/skinsdb/textures/character.572.png similarity index 100% rename from mods/skinsdb/textures/character_572.png rename to mods/skinsdb/textures/character.572.png diff --git a/mods/skinsdb/textures/character_573.png b/mods/skinsdb/textures/character.573.png similarity index 100% rename from mods/skinsdb/textures/character_573.png rename to mods/skinsdb/textures/character.573.png diff --git a/mods/skinsdb/textures/character_575.png b/mods/skinsdb/textures/character.575.png similarity index 100% rename from mods/skinsdb/textures/character_575.png rename to mods/skinsdb/textures/character.575.png diff --git a/mods/skinsdb/textures/character_576.png b/mods/skinsdb/textures/character.576.png similarity index 100% rename from mods/skinsdb/textures/character_576.png rename to mods/skinsdb/textures/character.576.png diff --git a/mods/skinsdb/textures/character_577.png b/mods/skinsdb/textures/character.577.png similarity index 100% rename from mods/skinsdb/textures/character_577.png rename to mods/skinsdb/textures/character.577.png diff --git a/mods/skinsdb/textures/character_578.png b/mods/skinsdb/textures/character.578.png similarity index 100% rename from mods/skinsdb/textures/character_578.png rename to mods/skinsdb/textures/character.578.png diff --git a/mods/skinsdb/textures/character_579.png b/mods/skinsdb/textures/character.579.png similarity index 100% rename from mods/skinsdb/textures/character_579.png rename to mods/skinsdb/textures/character.579.png diff --git a/mods/skinsdb/textures/character_580.png b/mods/skinsdb/textures/character.580.png similarity index 100% rename from mods/skinsdb/textures/character_580.png rename to mods/skinsdb/textures/character.580.png diff --git a/mods/skinsdb/textures/character_581.png b/mods/skinsdb/textures/character.581.png similarity index 100% rename from mods/skinsdb/textures/character_581.png rename to mods/skinsdb/textures/character.581.png diff --git a/mods/skinsdb/textures/character_582.png b/mods/skinsdb/textures/character.582.png similarity index 100% rename from mods/skinsdb/textures/character_582.png rename to mods/skinsdb/textures/character.582.png diff --git a/mods/skinsdb/textures/character_583.png b/mods/skinsdb/textures/character.583.png similarity index 100% rename from mods/skinsdb/textures/character_583.png rename to mods/skinsdb/textures/character.583.png diff --git a/mods/skinsdb/textures/character_584.png b/mods/skinsdb/textures/character.584.png similarity index 100% rename from mods/skinsdb/textures/character_584.png rename to mods/skinsdb/textures/character.584.png diff --git a/mods/skinsdb/textures/character_585.png b/mods/skinsdb/textures/character.585.png similarity index 100% rename from mods/skinsdb/textures/character_585.png rename to mods/skinsdb/textures/character.585.png diff --git a/mods/skinsdb/textures/character_586.png b/mods/skinsdb/textures/character.586.png similarity index 100% rename from mods/skinsdb/textures/character_586.png rename to mods/skinsdb/textures/character.586.png diff --git a/mods/skinsdb/textures/character_587.png b/mods/skinsdb/textures/character.587.png similarity index 100% rename from mods/skinsdb/textures/character_587.png rename to mods/skinsdb/textures/character.587.png diff --git a/mods/skinsdb/textures/character_588.png b/mods/skinsdb/textures/character.588.png similarity index 100% rename from mods/skinsdb/textures/character_588.png rename to mods/skinsdb/textures/character.588.png diff --git a/mods/skinsdb/textures/character_589.png b/mods/skinsdb/textures/character.589.png similarity index 100% rename from mods/skinsdb/textures/character_589.png rename to mods/skinsdb/textures/character.589.png diff --git a/mods/skinsdb/textures/character_590.png b/mods/skinsdb/textures/character.590.png similarity index 100% rename from mods/skinsdb/textures/character_590.png rename to mods/skinsdb/textures/character.590.png diff --git a/mods/skinsdb/textures/character_591.png b/mods/skinsdb/textures/character.591.png similarity index 100% rename from mods/skinsdb/textures/character_591.png rename to mods/skinsdb/textures/character.591.png diff --git a/mods/skinsdb/textures/character_592.png b/mods/skinsdb/textures/character.592.png similarity index 100% rename from mods/skinsdb/textures/character_592.png rename to mods/skinsdb/textures/character.592.png diff --git a/mods/skinsdb/textures/character_593.png b/mods/skinsdb/textures/character.593.png similarity index 100% rename from mods/skinsdb/textures/character_593.png rename to mods/skinsdb/textures/character.593.png diff --git a/mods/skinsdb/textures/character_594.png b/mods/skinsdb/textures/character.594.png similarity index 100% rename from mods/skinsdb/textures/character_594.png rename to mods/skinsdb/textures/character.594.png diff --git a/mods/skinsdb/textures/character_595.png b/mods/skinsdb/textures/character.595.png similarity index 100% rename from mods/skinsdb/textures/character_595.png rename to mods/skinsdb/textures/character.595.png diff --git a/mods/skinsdb/textures/character_596.png b/mods/skinsdb/textures/character.596.png similarity index 100% rename from mods/skinsdb/textures/character_596.png rename to mods/skinsdb/textures/character.596.png diff --git a/mods/skinsdb/textures/character_597.png b/mods/skinsdb/textures/character.597.png similarity index 100% rename from mods/skinsdb/textures/character_597.png rename to mods/skinsdb/textures/character.597.png diff --git a/mods/skinsdb/textures/character_598.png b/mods/skinsdb/textures/character.598.png similarity index 100% rename from mods/skinsdb/textures/character_598.png rename to mods/skinsdb/textures/character.598.png diff --git a/mods/skinsdb/textures/character_599.png b/mods/skinsdb/textures/character.599.png similarity index 100% rename from mods/skinsdb/textures/character_599.png rename to mods/skinsdb/textures/character.599.png diff --git a/mods/skinsdb/textures/character_6.png b/mods/skinsdb/textures/character.6.png similarity index 100% rename from mods/skinsdb/textures/character_6.png rename to mods/skinsdb/textures/character.6.png diff --git a/mods/skinsdb/textures/character_600.png b/mods/skinsdb/textures/character.600.png similarity index 100% rename from mods/skinsdb/textures/character_600.png rename to mods/skinsdb/textures/character.600.png diff --git a/mods/skinsdb/textures/character_601.png b/mods/skinsdb/textures/character.601.png similarity index 100% rename from mods/skinsdb/textures/character_601.png rename to mods/skinsdb/textures/character.601.png diff --git a/mods/skinsdb/textures/character_602.png b/mods/skinsdb/textures/character.602.png similarity index 100% rename from mods/skinsdb/textures/character_602.png rename to mods/skinsdb/textures/character.602.png diff --git a/mods/skinsdb/textures/character_603.png b/mods/skinsdb/textures/character.603.png similarity index 100% rename from mods/skinsdb/textures/character_603.png rename to mods/skinsdb/textures/character.603.png diff --git a/mods/skinsdb/textures/character_604.png b/mods/skinsdb/textures/character.604.png similarity index 100% rename from mods/skinsdb/textures/character_604.png rename to mods/skinsdb/textures/character.604.png diff --git a/mods/skinsdb/textures/character_605.png b/mods/skinsdb/textures/character.605.png similarity index 100% rename from mods/skinsdb/textures/character_605.png rename to mods/skinsdb/textures/character.605.png diff --git a/mods/skinsdb/textures/character_606.png b/mods/skinsdb/textures/character.606.png similarity index 100% rename from mods/skinsdb/textures/character_606.png rename to mods/skinsdb/textures/character.606.png diff --git a/mods/skinsdb/textures/character_607.png b/mods/skinsdb/textures/character.607.png similarity index 100% rename from mods/skinsdb/textures/character_607.png rename to mods/skinsdb/textures/character.607.png diff --git a/mods/skinsdb/textures/character_608.png b/mods/skinsdb/textures/character.608.png similarity index 100% rename from mods/skinsdb/textures/character_608.png rename to mods/skinsdb/textures/character.608.png diff --git a/mods/skinsdb/textures/character_609.png b/mods/skinsdb/textures/character.609.png similarity index 100% rename from mods/skinsdb/textures/character_609.png rename to mods/skinsdb/textures/character.609.png diff --git a/mods/skinsdb/textures/character_61.png b/mods/skinsdb/textures/character.61.png similarity index 100% rename from mods/skinsdb/textures/character_61.png rename to mods/skinsdb/textures/character.61.png diff --git a/mods/skinsdb/textures/character_610.png b/mods/skinsdb/textures/character.610.png similarity index 100% rename from mods/skinsdb/textures/character_610.png rename to mods/skinsdb/textures/character.610.png diff --git a/mods/skinsdb/textures/character_611.png b/mods/skinsdb/textures/character.611.png similarity index 100% rename from mods/skinsdb/textures/character_611.png rename to mods/skinsdb/textures/character.611.png diff --git a/mods/skinsdb/textures/character_612.png b/mods/skinsdb/textures/character.612.png similarity index 100% rename from mods/skinsdb/textures/character_612.png rename to mods/skinsdb/textures/character.612.png diff --git a/mods/skinsdb/textures/character_613.png b/mods/skinsdb/textures/character.613.png similarity index 100% rename from mods/skinsdb/textures/character_613.png rename to mods/skinsdb/textures/character.613.png diff --git a/mods/skinsdb/textures/character_614.png b/mods/skinsdb/textures/character.614.png similarity index 100% rename from mods/skinsdb/textures/character_614.png rename to mods/skinsdb/textures/character.614.png diff --git a/mods/skinsdb/textures/character_615.png b/mods/skinsdb/textures/character.615.png similarity index 100% rename from mods/skinsdb/textures/character_615.png rename to mods/skinsdb/textures/character.615.png diff --git a/mods/skinsdb/textures/character_616.png b/mods/skinsdb/textures/character.616.png similarity index 100% rename from mods/skinsdb/textures/character_616.png rename to mods/skinsdb/textures/character.616.png diff --git a/mods/skinsdb/textures/character_618.png b/mods/skinsdb/textures/character.618.png similarity index 100% rename from mods/skinsdb/textures/character_618.png rename to mods/skinsdb/textures/character.618.png diff --git a/mods/skinsdb/textures/character_619.png b/mods/skinsdb/textures/character.619.png similarity index 100% rename from mods/skinsdb/textures/character_619.png rename to mods/skinsdb/textures/character.619.png diff --git a/mods/skinsdb/textures/character_620.png b/mods/skinsdb/textures/character.620.png similarity index 100% rename from mods/skinsdb/textures/character_620.png rename to mods/skinsdb/textures/character.620.png diff --git a/mods/skinsdb/textures/character_621.png b/mods/skinsdb/textures/character.621.png similarity index 100% rename from mods/skinsdb/textures/character_621.png rename to mods/skinsdb/textures/character.621.png diff --git a/mods/skinsdb/textures/character_622.png b/mods/skinsdb/textures/character.622.png similarity index 100% rename from mods/skinsdb/textures/character_622.png rename to mods/skinsdb/textures/character.622.png diff --git a/mods/skinsdb/textures/character_623.png b/mods/skinsdb/textures/character.623.png similarity index 100% rename from mods/skinsdb/textures/character_623.png rename to mods/skinsdb/textures/character.623.png diff --git a/mods/skinsdb/textures/character_624.png b/mods/skinsdb/textures/character.624.png similarity index 100% rename from mods/skinsdb/textures/character_624.png rename to mods/skinsdb/textures/character.624.png diff --git a/mods/skinsdb/textures/character_625.png b/mods/skinsdb/textures/character.625.png similarity index 100% rename from mods/skinsdb/textures/character_625.png rename to mods/skinsdb/textures/character.625.png diff --git a/mods/skinsdb/textures/character_626.png b/mods/skinsdb/textures/character.626.png similarity index 100% rename from mods/skinsdb/textures/character_626.png rename to mods/skinsdb/textures/character.626.png diff --git a/mods/skinsdb/textures/character_627.png b/mods/skinsdb/textures/character.627.png similarity index 100% rename from mods/skinsdb/textures/character_627.png rename to mods/skinsdb/textures/character.627.png diff --git a/mods/skinsdb/textures/character_628.png b/mods/skinsdb/textures/character.628.png similarity index 100% rename from mods/skinsdb/textures/character_628.png rename to mods/skinsdb/textures/character.628.png diff --git a/mods/skinsdb/textures/character_629.png b/mods/skinsdb/textures/character.629.png similarity index 100% rename from mods/skinsdb/textures/character_629.png rename to mods/skinsdb/textures/character.629.png diff --git a/mods/skinsdb/textures/character_630.png b/mods/skinsdb/textures/character.630.png similarity index 100% rename from mods/skinsdb/textures/character_630.png rename to mods/skinsdb/textures/character.630.png diff --git a/mods/skinsdb/textures/character_631.png b/mods/skinsdb/textures/character.631.png similarity index 100% rename from mods/skinsdb/textures/character_631.png rename to mods/skinsdb/textures/character.631.png diff --git a/mods/skinsdb/textures/character_632.png b/mods/skinsdb/textures/character.632.png similarity index 100% rename from mods/skinsdb/textures/character_632.png rename to mods/skinsdb/textures/character.632.png diff --git a/mods/skinsdb/textures/character_633.png b/mods/skinsdb/textures/character.633.png similarity index 100% rename from mods/skinsdb/textures/character_633.png rename to mods/skinsdb/textures/character.633.png diff --git a/mods/skinsdb/textures/character_634.png b/mods/skinsdb/textures/character.634.png similarity index 100% rename from mods/skinsdb/textures/character_634.png rename to mods/skinsdb/textures/character.634.png diff --git a/mods/skinsdb/textures/character_635.png b/mods/skinsdb/textures/character.635.png similarity index 100% rename from mods/skinsdb/textures/character_635.png rename to mods/skinsdb/textures/character.635.png diff --git a/mods/skinsdb/textures/character_636.png b/mods/skinsdb/textures/character.636.png similarity index 100% rename from mods/skinsdb/textures/character_636.png rename to mods/skinsdb/textures/character.636.png diff --git a/mods/skinsdb/textures/character_637.png b/mods/skinsdb/textures/character.637.png similarity index 100% rename from mods/skinsdb/textures/character_637.png rename to mods/skinsdb/textures/character.637.png diff --git a/mods/skinsdb/textures/character_638.png b/mods/skinsdb/textures/character.638.png similarity index 100% rename from mods/skinsdb/textures/character_638.png rename to mods/skinsdb/textures/character.638.png diff --git a/mods/skinsdb/textures/character_639.png b/mods/skinsdb/textures/character.639.png similarity index 100% rename from mods/skinsdb/textures/character_639.png rename to mods/skinsdb/textures/character.639.png diff --git a/mods/skinsdb/textures/character_640.png b/mods/skinsdb/textures/character.640.png similarity index 100% rename from mods/skinsdb/textures/character_640.png rename to mods/skinsdb/textures/character.640.png diff --git a/mods/skinsdb/textures/character_641.png b/mods/skinsdb/textures/character.641.png similarity index 100% rename from mods/skinsdb/textures/character_641.png rename to mods/skinsdb/textures/character.641.png diff --git a/mods/skinsdb/textures/character_642.png b/mods/skinsdb/textures/character.642.png similarity index 100% rename from mods/skinsdb/textures/character_642.png rename to mods/skinsdb/textures/character.642.png diff --git a/mods/skinsdb/textures/character_643.png b/mods/skinsdb/textures/character.643.png similarity index 100% rename from mods/skinsdb/textures/character_643.png rename to mods/skinsdb/textures/character.643.png diff --git a/mods/skinsdb/textures/character_644.png b/mods/skinsdb/textures/character.644.png similarity index 100% rename from mods/skinsdb/textures/character_644.png rename to mods/skinsdb/textures/character.644.png diff --git a/mods/skinsdb/textures/character_645.png b/mods/skinsdb/textures/character.645.png similarity index 100% rename from mods/skinsdb/textures/character_645.png rename to mods/skinsdb/textures/character.645.png diff --git a/mods/skinsdb/textures/character_646.png b/mods/skinsdb/textures/character.646.png similarity index 100% rename from mods/skinsdb/textures/character_646.png rename to mods/skinsdb/textures/character.646.png diff --git a/mods/skinsdb/textures/character_647.png b/mods/skinsdb/textures/character.647.png similarity index 100% rename from mods/skinsdb/textures/character_647.png rename to mods/skinsdb/textures/character.647.png diff --git a/mods/skinsdb/textures/character_648.png b/mods/skinsdb/textures/character.648.png similarity index 100% rename from mods/skinsdb/textures/character_648.png rename to mods/skinsdb/textures/character.648.png diff --git a/mods/skinsdb/textures/character_649.png b/mods/skinsdb/textures/character.649.png similarity index 100% rename from mods/skinsdb/textures/character_649.png rename to mods/skinsdb/textures/character.649.png diff --git a/mods/skinsdb/textures/character_650.png b/mods/skinsdb/textures/character.650.png similarity index 100% rename from mods/skinsdb/textures/character_650.png rename to mods/skinsdb/textures/character.650.png diff --git a/mods/skinsdb/textures/character_651.png b/mods/skinsdb/textures/character.651.png similarity index 100% rename from mods/skinsdb/textures/character_651.png rename to mods/skinsdb/textures/character.651.png diff --git a/mods/skinsdb/textures/character_652.png b/mods/skinsdb/textures/character.652.png similarity index 100% rename from mods/skinsdb/textures/character_652.png rename to mods/skinsdb/textures/character.652.png diff --git a/mods/skinsdb/textures/character_656.png b/mods/skinsdb/textures/character.656.png similarity index 100% rename from mods/skinsdb/textures/character_656.png rename to mods/skinsdb/textures/character.656.png diff --git a/mods/skinsdb/textures/character_657.png b/mods/skinsdb/textures/character.657.png similarity index 100% rename from mods/skinsdb/textures/character_657.png rename to mods/skinsdb/textures/character.657.png diff --git a/mods/skinsdb/textures/character_658.png b/mods/skinsdb/textures/character.658.png similarity index 100% rename from mods/skinsdb/textures/character_658.png rename to mods/skinsdb/textures/character.658.png diff --git a/mods/skinsdb/textures/character_659.png b/mods/skinsdb/textures/character.659.png similarity index 100% rename from mods/skinsdb/textures/character_659.png rename to mods/skinsdb/textures/character.659.png diff --git a/mods/skinsdb/textures/character_660.png b/mods/skinsdb/textures/character.660.png similarity index 100% rename from mods/skinsdb/textures/character_660.png rename to mods/skinsdb/textures/character.660.png diff --git a/mods/skinsdb/textures/character_661.png b/mods/skinsdb/textures/character.661.png similarity index 100% rename from mods/skinsdb/textures/character_661.png rename to mods/skinsdb/textures/character.661.png diff --git a/mods/skinsdb/textures/character_662.png b/mods/skinsdb/textures/character.662.png similarity index 100% rename from mods/skinsdb/textures/character_662.png rename to mods/skinsdb/textures/character.662.png diff --git a/mods/skinsdb/textures/character_663.png b/mods/skinsdb/textures/character.663.png similarity index 100% rename from mods/skinsdb/textures/character_663.png rename to mods/skinsdb/textures/character.663.png diff --git a/mods/skinsdb/textures/character_664.png b/mods/skinsdb/textures/character.664.png similarity index 100% rename from mods/skinsdb/textures/character_664.png rename to mods/skinsdb/textures/character.664.png diff --git a/mods/skinsdb/textures/character_666.png b/mods/skinsdb/textures/character.666.png similarity index 100% rename from mods/skinsdb/textures/character_666.png rename to mods/skinsdb/textures/character.666.png diff --git a/mods/skinsdb/textures/character_667.png b/mods/skinsdb/textures/character.667.png similarity index 100% rename from mods/skinsdb/textures/character_667.png rename to mods/skinsdb/textures/character.667.png diff --git a/mods/skinsdb/textures/character_668.png b/mods/skinsdb/textures/character.668.png similarity index 100% rename from mods/skinsdb/textures/character_668.png rename to mods/skinsdb/textures/character.668.png diff --git a/mods/skinsdb/textures/character_669.png b/mods/skinsdb/textures/character.669.png similarity index 100% rename from mods/skinsdb/textures/character_669.png rename to mods/skinsdb/textures/character.669.png diff --git a/mods/skinsdb/textures/character_670.png b/mods/skinsdb/textures/character.670.png similarity index 100% rename from mods/skinsdb/textures/character_670.png rename to mods/skinsdb/textures/character.670.png diff --git a/mods/skinsdb/textures/character_671.png b/mods/skinsdb/textures/character.671.png similarity index 100% rename from mods/skinsdb/textures/character_671.png rename to mods/skinsdb/textures/character.671.png diff --git a/mods/skinsdb/textures/character_672.png b/mods/skinsdb/textures/character.672.png similarity index 100% rename from mods/skinsdb/textures/character_672.png rename to mods/skinsdb/textures/character.672.png diff --git a/mods/skinsdb/textures/character_673.png b/mods/skinsdb/textures/character.673.png similarity index 100% rename from mods/skinsdb/textures/character_673.png rename to mods/skinsdb/textures/character.673.png diff --git a/mods/skinsdb/textures/character_674.png b/mods/skinsdb/textures/character.674.png similarity index 100% rename from mods/skinsdb/textures/character_674.png rename to mods/skinsdb/textures/character.674.png diff --git a/mods/skinsdb/textures/character_675.png b/mods/skinsdb/textures/character.675.png similarity index 100% rename from mods/skinsdb/textures/character_675.png rename to mods/skinsdb/textures/character.675.png diff --git a/mods/skinsdb/textures/character_676.png b/mods/skinsdb/textures/character.676.png similarity index 100% rename from mods/skinsdb/textures/character_676.png rename to mods/skinsdb/textures/character.676.png diff --git a/mods/skinsdb/textures/character_677.png b/mods/skinsdb/textures/character.677.png similarity index 100% rename from mods/skinsdb/textures/character_677.png rename to mods/skinsdb/textures/character.677.png diff --git a/mods/skinsdb/textures/character_678.png b/mods/skinsdb/textures/character.678.png similarity index 100% rename from mods/skinsdb/textures/character_678.png rename to mods/skinsdb/textures/character.678.png diff --git a/mods/skinsdb/textures/character_679.png b/mods/skinsdb/textures/character.679.png similarity index 100% rename from mods/skinsdb/textures/character_679.png rename to mods/skinsdb/textures/character.679.png diff --git a/mods/skinsdb/textures/character_680.png b/mods/skinsdb/textures/character.680.png similarity index 100% rename from mods/skinsdb/textures/character_680.png rename to mods/skinsdb/textures/character.680.png diff --git a/mods/skinsdb/textures/character_681.png b/mods/skinsdb/textures/character.681.png similarity index 100% rename from mods/skinsdb/textures/character_681.png rename to mods/skinsdb/textures/character.681.png diff --git a/mods/skinsdb/textures/character_682.png b/mods/skinsdb/textures/character.682.png similarity index 100% rename from mods/skinsdb/textures/character_682.png rename to mods/skinsdb/textures/character.682.png diff --git a/mods/skinsdb/textures/character_683.png b/mods/skinsdb/textures/character.683.png similarity index 100% rename from mods/skinsdb/textures/character_683.png rename to mods/skinsdb/textures/character.683.png diff --git a/mods/skinsdb/textures/character_684.png b/mods/skinsdb/textures/character.684.png similarity index 100% rename from mods/skinsdb/textures/character_684.png rename to mods/skinsdb/textures/character.684.png diff --git a/mods/skinsdb/textures/character_685.png b/mods/skinsdb/textures/character.685.png similarity index 100% rename from mods/skinsdb/textures/character_685.png rename to mods/skinsdb/textures/character.685.png diff --git a/mods/skinsdb/textures/character_686.png b/mods/skinsdb/textures/character.686.png similarity index 100% rename from mods/skinsdb/textures/character_686.png rename to mods/skinsdb/textures/character.686.png diff --git a/mods/skinsdb/textures/character_687.png b/mods/skinsdb/textures/character.687.png similarity index 100% rename from mods/skinsdb/textures/character_687.png rename to mods/skinsdb/textures/character.687.png diff --git a/mods/skinsdb/textures/character_688.png b/mods/skinsdb/textures/character.688.png similarity index 100% rename from mods/skinsdb/textures/character_688.png rename to mods/skinsdb/textures/character.688.png diff --git a/mods/skinsdb/textures/character_689.png b/mods/skinsdb/textures/character.689.png similarity index 100% rename from mods/skinsdb/textures/character_689.png rename to mods/skinsdb/textures/character.689.png diff --git a/mods/skinsdb/textures/character_69.png b/mods/skinsdb/textures/character.69.png similarity index 100% rename from mods/skinsdb/textures/character_69.png rename to mods/skinsdb/textures/character.69.png diff --git a/mods/skinsdb/textures/character_690.png b/mods/skinsdb/textures/character.690.png similarity index 100% rename from mods/skinsdb/textures/character_690.png rename to mods/skinsdb/textures/character.690.png diff --git a/mods/skinsdb/textures/character_691.png b/mods/skinsdb/textures/character.691.png similarity index 100% rename from mods/skinsdb/textures/character_691.png rename to mods/skinsdb/textures/character.691.png diff --git a/mods/skinsdb/textures/character_692.png b/mods/skinsdb/textures/character.692.png similarity index 100% rename from mods/skinsdb/textures/character_692.png rename to mods/skinsdb/textures/character.692.png diff --git a/mods/skinsdb/textures/character_693.png b/mods/skinsdb/textures/character.693.png similarity index 100% rename from mods/skinsdb/textures/character_693.png rename to mods/skinsdb/textures/character.693.png diff --git a/mods/skinsdb/textures/character_694.png b/mods/skinsdb/textures/character.694.png similarity index 100% rename from mods/skinsdb/textures/character_694.png rename to mods/skinsdb/textures/character.694.png diff --git a/mods/skinsdb/textures/character_695.png b/mods/skinsdb/textures/character.695.png similarity index 100% rename from mods/skinsdb/textures/character_695.png rename to mods/skinsdb/textures/character.695.png diff --git a/mods/skinsdb/textures/character_696.png b/mods/skinsdb/textures/character.696.png similarity index 100% rename from mods/skinsdb/textures/character_696.png rename to mods/skinsdb/textures/character.696.png diff --git a/mods/skinsdb/textures/character_697.png b/mods/skinsdb/textures/character.697.png similarity index 100% rename from mods/skinsdb/textures/character_697.png rename to mods/skinsdb/textures/character.697.png diff --git a/mods/skinsdb/textures/character_698.png b/mods/skinsdb/textures/character.698.png similarity index 100% rename from mods/skinsdb/textures/character_698.png rename to mods/skinsdb/textures/character.698.png diff --git a/mods/skinsdb/textures/character_699.png b/mods/skinsdb/textures/character.699.png similarity index 100% rename from mods/skinsdb/textures/character_699.png rename to mods/skinsdb/textures/character.699.png diff --git a/mods/skinsdb/textures/character_7.png b/mods/skinsdb/textures/character.7.png similarity index 100% rename from mods/skinsdb/textures/character_7.png rename to mods/skinsdb/textures/character.7.png diff --git a/mods/skinsdb/textures/character_70.png b/mods/skinsdb/textures/character.70.png similarity index 100% rename from mods/skinsdb/textures/character_70.png rename to mods/skinsdb/textures/character.70.png diff --git a/mods/skinsdb/textures/character_700.png b/mods/skinsdb/textures/character.700.png similarity index 100% rename from mods/skinsdb/textures/character_700.png rename to mods/skinsdb/textures/character.700.png diff --git a/mods/skinsdb/textures/character_701.png b/mods/skinsdb/textures/character.701.png similarity index 100% rename from mods/skinsdb/textures/character_701.png rename to mods/skinsdb/textures/character.701.png diff --git a/mods/skinsdb/textures/character_702.png b/mods/skinsdb/textures/character.702.png similarity index 100% rename from mods/skinsdb/textures/character_702.png rename to mods/skinsdb/textures/character.702.png diff --git a/mods/skinsdb/textures/character_703.png b/mods/skinsdb/textures/character.703.png similarity index 100% rename from mods/skinsdb/textures/character_703.png rename to mods/skinsdb/textures/character.703.png diff --git a/mods/skinsdb/textures/character_704.png b/mods/skinsdb/textures/character.704.png similarity index 100% rename from mods/skinsdb/textures/character_704.png rename to mods/skinsdb/textures/character.704.png diff --git a/mods/skinsdb/textures/character_705.png b/mods/skinsdb/textures/character.705.png similarity index 100% rename from mods/skinsdb/textures/character_705.png rename to mods/skinsdb/textures/character.705.png diff --git a/mods/skinsdb/textures/character_706.png b/mods/skinsdb/textures/character.706.png similarity index 100% rename from mods/skinsdb/textures/character_706.png rename to mods/skinsdb/textures/character.706.png diff --git a/mods/skinsdb/textures/character_707.png b/mods/skinsdb/textures/character.707.png similarity index 100% rename from mods/skinsdb/textures/character_707.png rename to mods/skinsdb/textures/character.707.png diff --git a/mods/skinsdb/textures/character_708.png b/mods/skinsdb/textures/character.708.png similarity index 100% rename from mods/skinsdb/textures/character_708.png rename to mods/skinsdb/textures/character.708.png diff --git a/mods/skinsdb/textures/character_709.png b/mods/skinsdb/textures/character.709.png similarity index 100% rename from mods/skinsdb/textures/character_709.png rename to mods/skinsdb/textures/character.709.png diff --git a/mods/skinsdb/textures/character_71.png b/mods/skinsdb/textures/character.71.png similarity index 100% rename from mods/skinsdb/textures/character_71.png rename to mods/skinsdb/textures/character.71.png diff --git a/mods/skinsdb/textures/character_710.png b/mods/skinsdb/textures/character.710.png similarity index 100% rename from mods/skinsdb/textures/character_710.png rename to mods/skinsdb/textures/character.710.png diff --git a/mods/skinsdb/textures/character_711.png b/mods/skinsdb/textures/character.711.png similarity index 100% rename from mods/skinsdb/textures/character_711.png rename to mods/skinsdb/textures/character.711.png diff --git a/mods/skinsdb/textures/character_712.png b/mods/skinsdb/textures/character.712.png similarity index 100% rename from mods/skinsdb/textures/character_712.png rename to mods/skinsdb/textures/character.712.png diff --git a/mods/skinsdb/textures/character_713.png b/mods/skinsdb/textures/character.713.png similarity index 100% rename from mods/skinsdb/textures/character_713.png rename to mods/skinsdb/textures/character.713.png diff --git a/mods/skinsdb/textures/character_714.png b/mods/skinsdb/textures/character.714.png similarity index 100% rename from mods/skinsdb/textures/character_714.png rename to mods/skinsdb/textures/character.714.png diff --git a/mods/skinsdb/textures/character_715.png b/mods/skinsdb/textures/character.715.png similarity index 100% rename from mods/skinsdb/textures/character_715.png rename to mods/skinsdb/textures/character.715.png diff --git a/mods/skinsdb/textures/character_716.png b/mods/skinsdb/textures/character.716.png similarity index 100% rename from mods/skinsdb/textures/character_716.png rename to mods/skinsdb/textures/character.716.png diff --git a/mods/skinsdb/textures/character_717.png b/mods/skinsdb/textures/character.717.png similarity index 100% rename from mods/skinsdb/textures/character_717.png rename to mods/skinsdb/textures/character.717.png diff --git a/mods/skinsdb/textures/character_718.png b/mods/skinsdb/textures/character.718.png similarity index 100% rename from mods/skinsdb/textures/character_718.png rename to mods/skinsdb/textures/character.718.png diff --git a/mods/skinsdb/textures/character_72.png b/mods/skinsdb/textures/character.72.png similarity index 100% rename from mods/skinsdb/textures/character_72.png rename to mods/skinsdb/textures/character.72.png diff --git a/mods/skinsdb/textures/character_720.png b/mods/skinsdb/textures/character.720.png similarity index 100% rename from mods/skinsdb/textures/character_720.png rename to mods/skinsdb/textures/character.720.png diff --git a/mods/skinsdb/textures/character_721.png b/mods/skinsdb/textures/character.721.png similarity index 100% rename from mods/skinsdb/textures/character_721.png rename to mods/skinsdb/textures/character.721.png diff --git a/mods/skinsdb/textures/character_723.png b/mods/skinsdb/textures/character.723.png similarity index 100% rename from mods/skinsdb/textures/character_723.png rename to mods/skinsdb/textures/character.723.png diff --git a/mods/skinsdb/textures/character_724.png b/mods/skinsdb/textures/character.724.png similarity index 100% rename from mods/skinsdb/textures/character_724.png rename to mods/skinsdb/textures/character.724.png diff --git a/mods/skinsdb/textures/character_725.png b/mods/skinsdb/textures/character.725.png similarity index 100% rename from mods/skinsdb/textures/character_725.png rename to mods/skinsdb/textures/character.725.png diff --git a/mods/skinsdb/textures/character_726.png b/mods/skinsdb/textures/character.726.png similarity index 100% rename from mods/skinsdb/textures/character_726.png rename to mods/skinsdb/textures/character.726.png diff --git a/mods/skinsdb/textures/character_727.png b/mods/skinsdb/textures/character.727.png similarity index 100% rename from mods/skinsdb/textures/character_727.png rename to mods/skinsdb/textures/character.727.png diff --git a/mods/skinsdb/textures/character_728.png b/mods/skinsdb/textures/character.728.png similarity index 100% rename from mods/skinsdb/textures/character_728.png rename to mods/skinsdb/textures/character.728.png diff --git a/mods/skinsdb/textures/character_729.png b/mods/skinsdb/textures/character.729.png similarity index 100% rename from mods/skinsdb/textures/character_729.png rename to mods/skinsdb/textures/character.729.png diff --git a/mods/skinsdb/textures/character_73.png b/mods/skinsdb/textures/character.73.png similarity index 100% rename from mods/skinsdb/textures/character_73.png rename to mods/skinsdb/textures/character.73.png diff --git a/mods/skinsdb/textures/character_730.png b/mods/skinsdb/textures/character.730.png similarity index 100% rename from mods/skinsdb/textures/character_730.png rename to mods/skinsdb/textures/character.730.png diff --git a/mods/skinsdb/textures/character_731.png b/mods/skinsdb/textures/character.731.png similarity index 100% rename from mods/skinsdb/textures/character_731.png rename to mods/skinsdb/textures/character.731.png diff --git a/mods/skinsdb/textures/character_732.png b/mods/skinsdb/textures/character.732.png similarity index 100% rename from mods/skinsdb/textures/character_732.png rename to mods/skinsdb/textures/character.732.png diff --git a/mods/skinsdb/textures/character_734.png b/mods/skinsdb/textures/character.734.png similarity index 100% rename from mods/skinsdb/textures/character_734.png rename to mods/skinsdb/textures/character.734.png diff --git a/mods/skinsdb/textures/character_735.png b/mods/skinsdb/textures/character.735.png similarity index 100% rename from mods/skinsdb/textures/character_735.png rename to mods/skinsdb/textures/character.735.png diff --git a/mods/skinsdb/textures/character_736.png b/mods/skinsdb/textures/character.736.png similarity index 100% rename from mods/skinsdb/textures/character_736.png rename to mods/skinsdb/textures/character.736.png diff --git a/mods/skinsdb/textures/character_737.png b/mods/skinsdb/textures/character.737.png similarity index 100% rename from mods/skinsdb/textures/character_737.png rename to mods/skinsdb/textures/character.737.png diff --git a/mods/skinsdb/textures/character_738.png b/mods/skinsdb/textures/character.738.png similarity index 100% rename from mods/skinsdb/textures/character_738.png rename to mods/skinsdb/textures/character.738.png diff --git a/mods/skinsdb/textures/character_739.png b/mods/skinsdb/textures/character.739.png similarity index 100% rename from mods/skinsdb/textures/character_739.png rename to mods/skinsdb/textures/character.739.png diff --git a/mods/skinsdb/textures/character_74.png b/mods/skinsdb/textures/character.74.png similarity index 100% rename from mods/skinsdb/textures/character_74.png rename to mods/skinsdb/textures/character.74.png diff --git a/mods/skinsdb/textures/character_740.png b/mods/skinsdb/textures/character.740.png similarity index 100% rename from mods/skinsdb/textures/character_740.png rename to mods/skinsdb/textures/character.740.png diff --git a/mods/skinsdb/textures/character_741.png b/mods/skinsdb/textures/character.741.png similarity index 100% rename from mods/skinsdb/textures/character_741.png rename to mods/skinsdb/textures/character.741.png diff --git a/mods/skinsdb/textures/character_742.png b/mods/skinsdb/textures/character.742.png similarity index 100% rename from mods/skinsdb/textures/character_742.png rename to mods/skinsdb/textures/character.742.png diff --git a/mods/skinsdb/textures/character_743.png b/mods/skinsdb/textures/character.743.png similarity index 100% rename from mods/skinsdb/textures/character_743.png rename to mods/skinsdb/textures/character.743.png diff --git a/mods/skinsdb/textures/character_744.png b/mods/skinsdb/textures/character.744.png similarity index 100% rename from mods/skinsdb/textures/character_744.png rename to mods/skinsdb/textures/character.744.png diff --git a/mods/skinsdb/textures/character_745.png b/mods/skinsdb/textures/character.745.png similarity index 100% rename from mods/skinsdb/textures/character_745.png rename to mods/skinsdb/textures/character.745.png diff --git a/mods/skinsdb/textures/character_746.png b/mods/skinsdb/textures/character.746.png similarity index 100% rename from mods/skinsdb/textures/character_746.png rename to mods/skinsdb/textures/character.746.png diff --git a/mods/skinsdb/textures/character_747.png b/mods/skinsdb/textures/character.747.png similarity index 100% rename from mods/skinsdb/textures/character_747.png rename to mods/skinsdb/textures/character.747.png diff --git a/mods/skinsdb/textures/character_748.png b/mods/skinsdb/textures/character.748.png similarity index 100% rename from mods/skinsdb/textures/character_748.png rename to mods/skinsdb/textures/character.748.png diff --git a/mods/skinsdb/textures/character_749.png b/mods/skinsdb/textures/character.749.png similarity index 100% rename from mods/skinsdb/textures/character_749.png rename to mods/skinsdb/textures/character.749.png diff --git a/mods/skinsdb/textures/character_75.png b/mods/skinsdb/textures/character.75.png similarity index 100% rename from mods/skinsdb/textures/character_75.png rename to mods/skinsdb/textures/character.75.png diff --git a/mods/skinsdb/textures/character_750.png b/mods/skinsdb/textures/character.750.png similarity index 100% rename from mods/skinsdb/textures/character_750.png rename to mods/skinsdb/textures/character.750.png diff --git a/mods/skinsdb/textures/character_751.png b/mods/skinsdb/textures/character.751.png similarity index 100% rename from mods/skinsdb/textures/character_751.png rename to mods/skinsdb/textures/character.751.png diff --git a/mods/skinsdb/textures/character_752.png b/mods/skinsdb/textures/character.752.png similarity index 100% rename from mods/skinsdb/textures/character_752.png rename to mods/skinsdb/textures/character.752.png diff --git a/mods/skinsdb/textures/character_753.png b/mods/skinsdb/textures/character.753.png similarity index 100% rename from mods/skinsdb/textures/character_753.png rename to mods/skinsdb/textures/character.753.png diff --git a/mods/skinsdb/textures/character_754.png b/mods/skinsdb/textures/character.754.png similarity index 100% rename from mods/skinsdb/textures/character_754.png rename to mods/skinsdb/textures/character.754.png diff --git a/mods/skinsdb/textures/character_755.png b/mods/skinsdb/textures/character.755.png similarity index 100% rename from mods/skinsdb/textures/character_755.png rename to mods/skinsdb/textures/character.755.png diff --git a/mods/skinsdb/textures/character_756.png b/mods/skinsdb/textures/character.756.png similarity index 100% rename from mods/skinsdb/textures/character_756.png rename to mods/skinsdb/textures/character.756.png diff --git a/mods/skinsdb/textures/character_757.png b/mods/skinsdb/textures/character.757.png similarity index 100% rename from mods/skinsdb/textures/character_757.png rename to mods/skinsdb/textures/character.757.png diff --git a/mods/skinsdb/textures/character_758.png b/mods/skinsdb/textures/character.758.png similarity index 100% rename from mods/skinsdb/textures/character_758.png rename to mods/skinsdb/textures/character.758.png diff --git a/mods/skinsdb/textures/character_759.png b/mods/skinsdb/textures/character.759.png similarity index 100% rename from mods/skinsdb/textures/character_759.png rename to mods/skinsdb/textures/character.759.png diff --git a/mods/skinsdb/textures/character_76.png b/mods/skinsdb/textures/character.76.png similarity index 100% rename from mods/skinsdb/textures/character_76.png rename to mods/skinsdb/textures/character.76.png diff --git a/mods/skinsdb/textures/character_760.png b/mods/skinsdb/textures/character.760.png similarity index 100% rename from mods/skinsdb/textures/character_760.png rename to mods/skinsdb/textures/character.760.png diff --git a/mods/skinsdb/textures/character_761.png b/mods/skinsdb/textures/character.761.png similarity index 100% rename from mods/skinsdb/textures/character_761.png rename to mods/skinsdb/textures/character.761.png diff --git a/mods/skinsdb/textures/character_762.png b/mods/skinsdb/textures/character.762.png similarity index 100% rename from mods/skinsdb/textures/character_762.png rename to mods/skinsdb/textures/character.762.png diff --git a/mods/skinsdb/textures/character_763.png b/mods/skinsdb/textures/character.763.png similarity index 100% rename from mods/skinsdb/textures/character_763.png rename to mods/skinsdb/textures/character.763.png diff --git a/mods/skinsdb/textures/character_764.png b/mods/skinsdb/textures/character.764.png similarity index 100% rename from mods/skinsdb/textures/character_764.png rename to mods/skinsdb/textures/character.764.png diff --git a/mods/skinsdb/textures/character_765.png b/mods/skinsdb/textures/character.765.png similarity index 100% rename from mods/skinsdb/textures/character_765.png rename to mods/skinsdb/textures/character.765.png diff --git a/mods/skinsdb/textures/character_766.png b/mods/skinsdb/textures/character.766.png similarity index 100% rename from mods/skinsdb/textures/character_766.png rename to mods/skinsdb/textures/character.766.png diff --git a/mods/skinsdb/textures/character_767.png b/mods/skinsdb/textures/character.767.png similarity index 100% rename from mods/skinsdb/textures/character_767.png rename to mods/skinsdb/textures/character.767.png diff --git a/mods/skinsdb/textures/character_768.png b/mods/skinsdb/textures/character.768.png similarity index 100% rename from mods/skinsdb/textures/character_768.png rename to mods/skinsdb/textures/character.768.png diff --git a/mods/skinsdb/textures/character_769.png b/mods/skinsdb/textures/character.769.png similarity index 100% rename from mods/skinsdb/textures/character_769.png rename to mods/skinsdb/textures/character.769.png diff --git a/mods/skinsdb/textures/character_77.png b/mods/skinsdb/textures/character.77.png similarity index 100% rename from mods/skinsdb/textures/character_77.png rename to mods/skinsdb/textures/character.77.png diff --git a/mods/skinsdb/textures/character_770.png b/mods/skinsdb/textures/character.770.png similarity index 100% rename from mods/skinsdb/textures/character_770.png rename to mods/skinsdb/textures/character.770.png diff --git a/mods/skinsdb/textures/character_771.png b/mods/skinsdb/textures/character.771.png similarity index 100% rename from mods/skinsdb/textures/character_771.png rename to mods/skinsdb/textures/character.771.png diff --git a/mods/skinsdb/textures/character_772.png b/mods/skinsdb/textures/character.772.png similarity index 100% rename from mods/skinsdb/textures/character_772.png rename to mods/skinsdb/textures/character.772.png diff --git a/mods/skinsdb/textures/character_773.png b/mods/skinsdb/textures/character.773.png similarity index 100% rename from mods/skinsdb/textures/character_773.png rename to mods/skinsdb/textures/character.773.png diff --git a/mods/skinsdb/textures/character_774.png b/mods/skinsdb/textures/character.774.png similarity index 100% rename from mods/skinsdb/textures/character_774.png rename to mods/skinsdb/textures/character.774.png diff --git a/mods/skinsdb/textures/character_775.png b/mods/skinsdb/textures/character.775.png similarity index 100% rename from mods/skinsdb/textures/character_775.png rename to mods/skinsdb/textures/character.775.png diff --git a/mods/skinsdb/textures/character_776.png b/mods/skinsdb/textures/character.776.png similarity index 100% rename from mods/skinsdb/textures/character_776.png rename to mods/skinsdb/textures/character.776.png diff --git a/mods/skinsdb/textures/character_777.png b/mods/skinsdb/textures/character.777.png similarity index 100% rename from mods/skinsdb/textures/character_777.png rename to mods/skinsdb/textures/character.777.png diff --git a/mods/skinsdb/textures/character_778.png b/mods/skinsdb/textures/character.778.png similarity index 100% rename from mods/skinsdb/textures/character_778.png rename to mods/skinsdb/textures/character.778.png diff --git a/mods/skinsdb/textures/character_779.png b/mods/skinsdb/textures/character.779.png similarity index 100% rename from mods/skinsdb/textures/character_779.png rename to mods/skinsdb/textures/character.779.png diff --git a/mods/skinsdb/textures/character_78.png b/mods/skinsdb/textures/character.78.png similarity index 100% rename from mods/skinsdb/textures/character_78.png rename to mods/skinsdb/textures/character.78.png diff --git a/mods/skinsdb/textures/character_780.png b/mods/skinsdb/textures/character.780.png similarity index 100% rename from mods/skinsdb/textures/character_780.png rename to mods/skinsdb/textures/character.780.png diff --git a/mods/skinsdb/textures/character_781.png b/mods/skinsdb/textures/character.781.png similarity index 100% rename from mods/skinsdb/textures/character_781.png rename to mods/skinsdb/textures/character.781.png diff --git a/mods/skinsdb/textures/character_782.png b/mods/skinsdb/textures/character.782.png similarity index 100% rename from mods/skinsdb/textures/character_782.png rename to mods/skinsdb/textures/character.782.png diff --git a/mods/skinsdb/textures/character_783.png b/mods/skinsdb/textures/character.783.png similarity index 100% rename from mods/skinsdb/textures/character_783.png rename to mods/skinsdb/textures/character.783.png diff --git a/mods/skinsdb/textures/character_784.png b/mods/skinsdb/textures/character.784.png similarity index 100% rename from mods/skinsdb/textures/character_784.png rename to mods/skinsdb/textures/character.784.png diff --git a/mods/skinsdb/textures/character_785.png b/mods/skinsdb/textures/character.785.png similarity index 100% rename from mods/skinsdb/textures/character_785.png rename to mods/skinsdb/textures/character.785.png diff --git a/mods/skinsdb/textures/character_786.png b/mods/skinsdb/textures/character.786.png similarity index 100% rename from mods/skinsdb/textures/character_786.png rename to mods/skinsdb/textures/character.786.png diff --git a/mods/skinsdb/textures/character_787.png b/mods/skinsdb/textures/character.787.png similarity index 100% rename from mods/skinsdb/textures/character_787.png rename to mods/skinsdb/textures/character.787.png diff --git a/mods/skinsdb/textures/character_788.png b/mods/skinsdb/textures/character.788.png similarity index 100% rename from mods/skinsdb/textures/character_788.png rename to mods/skinsdb/textures/character.788.png diff --git a/mods/skinsdb/textures/character_789.png b/mods/skinsdb/textures/character.789.png similarity index 100% rename from mods/skinsdb/textures/character_789.png rename to mods/skinsdb/textures/character.789.png diff --git a/mods/skinsdb/textures/character_790.png b/mods/skinsdb/textures/character.790.png similarity index 100% rename from mods/skinsdb/textures/character_790.png rename to mods/skinsdb/textures/character.790.png diff --git a/mods/skinsdb/textures/character_791.png b/mods/skinsdb/textures/character.791.png similarity index 100% rename from mods/skinsdb/textures/character_791.png rename to mods/skinsdb/textures/character.791.png diff --git a/mods/skinsdb/textures/character_792.png b/mods/skinsdb/textures/character.792.png similarity index 100% rename from mods/skinsdb/textures/character_792.png rename to mods/skinsdb/textures/character.792.png diff --git a/mods/skinsdb/textures/character_793.png b/mods/skinsdb/textures/character.793.png similarity index 100% rename from mods/skinsdb/textures/character_793.png rename to mods/skinsdb/textures/character.793.png diff --git a/mods/skinsdb/textures/character_794.png b/mods/skinsdb/textures/character.794.png similarity index 100% rename from mods/skinsdb/textures/character_794.png rename to mods/skinsdb/textures/character.794.png diff --git a/mods/skinsdb/textures/character_795.png b/mods/skinsdb/textures/character.795.png similarity index 100% rename from mods/skinsdb/textures/character_795.png rename to mods/skinsdb/textures/character.795.png diff --git a/mods/skinsdb/textures/character_796.png b/mods/skinsdb/textures/character.796.png similarity index 100% rename from mods/skinsdb/textures/character_796.png rename to mods/skinsdb/textures/character.796.png diff --git a/mods/skinsdb/textures/character_797.png b/mods/skinsdb/textures/character.797.png similarity index 100% rename from mods/skinsdb/textures/character_797.png rename to mods/skinsdb/textures/character.797.png diff --git a/mods/skinsdb/textures/character_798.png b/mods/skinsdb/textures/character.798.png similarity index 100% rename from mods/skinsdb/textures/character_798.png rename to mods/skinsdb/textures/character.798.png diff --git a/mods/skinsdb/textures/character_799.png b/mods/skinsdb/textures/character.799.png similarity index 100% rename from mods/skinsdb/textures/character_799.png rename to mods/skinsdb/textures/character.799.png diff --git a/mods/skinsdb/textures/character_8.png b/mods/skinsdb/textures/character.8.png similarity index 100% rename from mods/skinsdb/textures/character_8.png rename to mods/skinsdb/textures/character.8.png diff --git a/mods/skinsdb/textures/character_80.png b/mods/skinsdb/textures/character.80.png similarity index 100% rename from mods/skinsdb/textures/character_80.png rename to mods/skinsdb/textures/character.80.png diff --git a/mods/skinsdb/textures/character_800.png b/mods/skinsdb/textures/character.800.png similarity index 100% rename from mods/skinsdb/textures/character_800.png rename to mods/skinsdb/textures/character.800.png diff --git a/mods/skinsdb/textures/character_801.png b/mods/skinsdb/textures/character.801.png similarity index 100% rename from mods/skinsdb/textures/character_801.png rename to mods/skinsdb/textures/character.801.png diff --git a/mods/skinsdb/textures/character_802.png b/mods/skinsdb/textures/character.802.png similarity index 100% rename from mods/skinsdb/textures/character_802.png rename to mods/skinsdb/textures/character.802.png diff --git a/mods/skinsdb/textures/character_803.png b/mods/skinsdb/textures/character.803.png similarity index 100% rename from mods/skinsdb/textures/character_803.png rename to mods/skinsdb/textures/character.803.png diff --git a/mods/skinsdb/textures/character_804.png b/mods/skinsdb/textures/character.804.png similarity index 100% rename from mods/skinsdb/textures/character_804.png rename to mods/skinsdb/textures/character.804.png diff --git a/mods/skinsdb/textures/character_805.png b/mods/skinsdb/textures/character.805.png similarity index 100% rename from mods/skinsdb/textures/character_805.png rename to mods/skinsdb/textures/character.805.png diff --git a/mods/skinsdb/textures/character_806.png b/mods/skinsdb/textures/character.806.png similarity index 100% rename from mods/skinsdb/textures/character_806.png rename to mods/skinsdb/textures/character.806.png diff --git a/mods/skinsdb/textures/character_807.png b/mods/skinsdb/textures/character.807.png similarity index 100% rename from mods/skinsdb/textures/character_807.png rename to mods/skinsdb/textures/character.807.png diff --git a/mods/skinsdb/textures/character_808.png b/mods/skinsdb/textures/character.808.png similarity index 100% rename from mods/skinsdb/textures/character_808.png rename to mods/skinsdb/textures/character.808.png diff --git a/mods/skinsdb/textures/character_809.png b/mods/skinsdb/textures/character.809.png similarity index 100% rename from mods/skinsdb/textures/character_809.png rename to mods/skinsdb/textures/character.809.png diff --git a/mods/skinsdb/textures/character_81.png b/mods/skinsdb/textures/character.81.png similarity index 100% rename from mods/skinsdb/textures/character_81.png rename to mods/skinsdb/textures/character.81.png diff --git a/mods/skinsdb/textures/character_810.png b/mods/skinsdb/textures/character.810.png similarity index 100% rename from mods/skinsdb/textures/character_810.png rename to mods/skinsdb/textures/character.810.png diff --git a/mods/skinsdb/textures/character_811.png b/mods/skinsdb/textures/character.811.png similarity index 100% rename from mods/skinsdb/textures/character_811.png rename to mods/skinsdb/textures/character.811.png diff --git a/mods/skinsdb/textures/character_812.png b/mods/skinsdb/textures/character.812.png similarity index 100% rename from mods/skinsdb/textures/character_812.png rename to mods/skinsdb/textures/character.812.png diff --git a/mods/skinsdb/textures/character_813.png b/mods/skinsdb/textures/character.813.png similarity index 100% rename from mods/skinsdb/textures/character_813.png rename to mods/skinsdb/textures/character.813.png diff --git a/mods/skinsdb/textures/character_814.png b/mods/skinsdb/textures/character.814.png similarity index 100% rename from mods/skinsdb/textures/character_814.png rename to mods/skinsdb/textures/character.814.png diff --git a/mods/skinsdb/textures/character_815.png b/mods/skinsdb/textures/character.815.png similarity index 100% rename from mods/skinsdb/textures/character_815.png rename to mods/skinsdb/textures/character.815.png diff --git a/mods/skinsdb/textures/character_816.png b/mods/skinsdb/textures/character.816.png similarity index 100% rename from mods/skinsdb/textures/character_816.png rename to mods/skinsdb/textures/character.816.png diff --git a/mods/skinsdb/textures/character_817.png b/mods/skinsdb/textures/character.817.png similarity index 100% rename from mods/skinsdb/textures/character_817.png rename to mods/skinsdb/textures/character.817.png diff --git a/mods/skinsdb/textures/character_818.png b/mods/skinsdb/textures/character.818.png similarity index 100% rename from mods/skinsdb/textures/character_818.png rename to mods/skinsdb/textures/character.818.png diff --git a/mods/skinsdb/textures/character_819.png b/mods/skinsdb/textures/character.819.png similarity index 100% rename from mods/skinsdb/textures/character_819.png rename to mods/skinsdb/textures/character.819.png diff --git a/mods/skinsdb/textures/character_82.png b/mods/skinsdb/textures/character.82.png similarity index 100% rename from mods/skinsdb/textures/character_82.png rename to mods/skinsdb/textures/character.82.png diff --git a/mods/skinsdb/textures/character_821.png b/mods/skinsdb/textures/character.821.png similarity index 100% rename from mods/skinsdb/textures/character_821.png rename to mods/skinsdb/textures/character.821.png diff --git a/mods/skinsdb/textures/character_822.png b/mods/skinsdb/textures/character.822.png similarity index 100% rename from mods/skinsdb/textures/character_822.png rename to mods/skinsdb/textures/character.822.png diff --git a/mods/skinsdb/textures/character_823.png b/mods/skinsdb/textures/character.823.png similarity index 100% rename from mods/skinsdb/textures/character_823.png rename to mods/skinsdb/textures/character.823.png diff --git a/mods/skinsdb/textures/character_824.png b/mods/skinsdb/textures/character.824.png similarity index 100% rename from mods/skinsdb/textures/character_824.png rename to mods/skinsdb/textures/character.824.png diff --git a/mods/skinsdb/textures/character_827.png b/mods/skinsdb/textures/character.827.png similarity index 100% rename from mods/skinsdb/textures/character_827.png rename to mods/skinsdb/textures/character.827.png diff --git a/mods/skinsdb/textures/character_828.png b/mods/skinsdb/textures/character.828.png similarity index 100% rename from mods/skinsdb/textures/character_828.png rename to mods/skinsdb/textures/character.828.png diff --git a/mods/skinsdb/textures/character_829.png b/mods/skinsdb/textures/character.829.png similarity index 100% rename from mods/skinsdb/textures/character_829.png rename to mods/skinsdb/textures/character.829.png diff --git a/mods/skinsdb/textures/character_83.png b/mods/skinsdb/textures/character.83.png similarity index 100% rename from mods/skinsdb/textures/character_83.png rename to mods/skinsdb/textures/character.83.png diff --git a/mods/skinsdb/textures/character_830.png b/mods/skinsdb/textures/character.830.png similarity index 100% rename from mods/skinsdb/textures/character_830.png rename to mods/skinsdb/textures/character.830.png diff --git a/mods/skinsdb/textures/character_831.png b/mods/skinsdb/textures/character.831.png similarity index 100% rename from mods/skinsdb/textures/character_831.png rename to mods/skinsdb/textures/character.831.png diff --git a/mods/skinsdb/textures/character_832.png b/mods/skinsdb/textures/character.832.png similarity index 100% rename from mods/skinsdb/textures/character_832.png rename to mods/skinsdb/textures/character.832.png diff --git a/mods/skinsdb/textures/character_833.png b/mods/skinsdb/textures/character.833.png similarity index 100% rename from mods/skinsdb/textures/character_833.png rename to mods/skinsdb/textures/character.833.png diff --git a/mods/skinsdb/textures/character_834.png b/mods/skinsdb/textures/character.834.png similarity index 100% rename from mods/skinsdb/textures/character_834.png rename to mods/skinsdb/textures/character.834.png diff --git a/mods/skinsdb/textures/character_835.png b/mods/skinsdb/textures/character.835.png similarity index 100% rename from mods/skinsdb/textures/character_835.png rename to mods/skinsdb/textures/character.835.png diff --git a/mods/skinsdb/textures/character_836.png b/mods/skinsdb/textures/character.836.png similarity index 100% rename from mods/skinsdb/textures/character_836.png rename to mods/skinsdb/textures/character.836.png diff --git a/mods/skinsdb/textures/character_837.png b/mods/skinsdb/textures/character.837.png similarity index 100% rename from mods/skinsdb/textures/character_837.png rename to mods/skinsdb/textures/character.837.png diff --git a/mods/skinsdb/textures/character_838.png b/mods/skinsdb/textures/character.838.png similarity index 100% rename from mods/skinsdb/textures/character_838.png rename to mods/skinsdb/textures/character.838.png diff --git a/mods/skinsdb/textures/character_839.png b/mods/skinsdb/textures/character.839.png similarity index 100% rename from mods/skinsdb/textures/character_839.png rename to mods/skinsdb/textures/character.839.png diff --git a/mods/skinsdb/textures/character_84.png b/mods/skinsdb/textures/character.84.png similarity index 100% rename from mods/skinsdb/textures/character_84.png rename to mods/skinsdb/textures/character.84.png diff --git a/mods/skinsdb/textures/character_841.png b/mods/skinsdb/textures/character.841.png similarity index 100% rename from mods/skinsdb/textures/character_841.png rename to mods/skinsdb/textures/character.841.png diff --git a/mods/skinsdb/textures/character_843.png b/mods/skinsdb/textures/character.843.png similarity index 100% rename from mods/skinsdb/textures/character_843.png rename to mods/skinsdb/textures/character.843.png diff --git a/mods/skinsdb/textures/character_844.png b/mods/skinsdb/textures/character.844.png similarity index 100% rename from mods/skinsdb/textures/character_844.png rename to mods/skinsdb/textures/character.844.png diff --git a/mods/skinsdb/textures/character_845.png b/mods/skinsdb/textures/character.845.png similarity index 100% rename from mods/skinsdb/textures/character_845.png rename to mods/skinsdb/textures/character.845.png diff --git a/mods/skinsdb/textures/character_846.png b/mods/skinsdb/textures/character.846.png similarity index 100% rename from mods/skinsdb/textures/character_846.png rename to mods/skinsdb/textures/character.846.png diff --git a/mods/skinsdb/textures/character_847.png b/mods/skinsdb/textures/character.847.png similarity index 100% rename from mods/skinsdb/textures/character_847.png rename to mods/skinsdb/textures/character.847.png diff --git a/mods/skinsdb/textures/character_848.png b/mods/skinsdb/textures/character.848.png similarity index 100% rename from mods/skinsdb/textures/character_848.png rename to mods/skinsdb/textures/character.848.png diff --git a/mods/skinsdb/textures/character_85.png b/mods/skinsdb/textures/character.85.png similarity index 100% rename from mods/skinsdb/textures/character_85.png rename to mods/skinsdb/textures/character.85.png diff --git a/mods/skinsdb/textures/character_850.png b/mods/skinsdb/textures/character.850.png similarity index 100% rename from mods/skinsdb/textures/character_850.png rename to mods/skinsdb/textures/character.850.png diff --git a/mods/skinsdb/textures/character_851.png b/mods/skinsdb/textures/character.851.png similarity index 100% rename from mods/skinsdb/textures/character_851.png rename to mods/skinsdb/textures/character.851.png diff --git a/mods/skinsdb/textures/character_852.png b/mods/skinsdb/textures/character.852.png similarity index 100% rename from mods/skinsdb/textures/character_852.png rename to mods/skinsdb/textures/character.852.png diff --git a/mods/skinsdb/textures/character_853.png b/mods/skinsdb/textures/character.853.png similarity index 100% rename from mods/skinsdb/textures/character_853.png rename to mods/skinsdb/textures/character.853.png diff --git a/mods/skinsdb/textures/character_855.png b/mods/skinsdb/textures/character.855.png similarity index 100% rename from mods/skinsdb/textures/character_855.png rename to mods/skinsdb/textures/character.855.png diff --git a/mods/skinsdb/textures/character_856.png b/mods/skinsdb/textures/character.856.png similarity index 100% rename from mods/skinsdb/textures/character_856.png rename to mods/skinsdb/textures/character.856.png diff --git a/mods/skinsdb/textures/character_857.png b/mods/skinsdb/textures/character.857.png similarity index 100% rename from mods/skinsdb/textures/character_857.png rename to mods/skinsdb/textures/character.857.png diff --git a/mods/skinsdb/textures/character_859.png b/mods/skinsdb/textures/character.859.png similarity index 100% rename from mods/skinsdb/textures/character_859.png rename to mods/skinsdb/textures/character.859.png diff --git a/mods/skinsdb/textures/character_860.png b/mods/skinsdb/textures/character.860.png similarity index 100% rename from mods/skinsdb/textures/character_860.png rename to mods/skinsdb/textures/character.860.png diff --git a/mods/skinsdb/textures/character_861.png b/mods/skinsdb/textures/character.861.png similarity index 100% rename from mods/skinsdb/textures/character_861.png rename to mods/skinsdb/textures/character.861.png diff --git a/mods/skinsdb/textures/character_862.png b/mods/skinsdb/textures/character.862.png similarity index 100% rename from mods/skinsdb/textures/character_862.png rename to mods/skinsdb/textures/character.862.png diff --git a/mods/skinsdb/textures/character_863.png b/mods/skinsdb/textures/character.863.png similarity index 100% rename from mods/skinsdb/textures/character_863.png rename to mods/skinsdb/textures/character.863.png diff --git a/mods/skinsdb/textures/character_864.png b/mods/skinsdb/textures/character.864.png similarity index 100% rename from mods/skinsdb/textures/character_864.png rename to mods/skinsdb/textures/character.864.png diff --git a/mods/skinsdb/textures/character_865.png b/mods/skinsdb/textures/character.865.png similarity index 100% rename from mods/skinsdb/textures/character_865.png rename to mods/skinsdb/textures/character.865.png diff --git a/mods/skinsdb/textures/character_866.png b/mods/skinsdb/textures/character.866.png similarity index 100% rename from mods/skinsdb/textures/character_866.png rename to mods/skinsdb/textures/character.866.png diff --git a/mods/skinsdb/textures/character_869.png b/mods/skinsdb/textures/character.869.png similarity index 100% rename from mods/skinsdb/textures/character_869.png rename to mods/skinsdb/textures/character.869.png diff --git a/mods/skinsdb/textures/character_87.png b/mods/skinsdb/textures/character.87.png similarity index 100% rename from mods/skinsdb/textures/character_87.png rename to mods/skinsdb/textures/character.87.png diff --git a/mods/skinsdb/textures/character_870.png b/mods/skinsdb/textures/character.870.png similarity index 100% rename from mods/skinsdb/textures/character_870.png rename to mods/skinsdb/textures/character.870.png diff --git a/mods/skinsdb/textures/character_871.png b/mods/skinsdb/textures/character.871.png similarity index 100% rename from mods/skinsdb/textures/character_871.png rename to mods/skinsdb/textures/character.871.png diff --git a/mods/skinsdb/textures/character_874.png b/mods/skinsdb/textures/character.874.png similarity index 100% rename from mods/skinsdb/textures/character_874.png rename to mods/skinsdb/textures/character.874.png diff --git a/mods/skinsdb/textures/character_877.png b/mods/skinsdb/textures/character.877.png similarity index 100% rename from mods/skinsdb/textures/character_877.png rename to mods/skinsdb/textures/character.877.png diff --git a/mods/skinsdb/textures/character_878.png b/mods/skinsdb/textures/character.878.png similarity index 100% rename from mods/skinsdb/textures/character_878.png rename to mods/skinsdb/textures/character.878.png diff --git a/mods/skinsdb/textures/character_879.png b/mods/skinsdb/textures/character.879.png similarity index 100% rename from mods/skinsdb/textures/character_879.png rename to mods/skinsdb/textures/character.879.png diff --git a/mods/skinsdb/textures/character_88.png b/mods/skinsdb/textures/character.88.png similarity index 100% rename from mods/skinsdb/textures/character_88.png rename to mods/skinsdb/textures/character.88.png diff --git a/mods/skinsdb/textures/character_880.png b/mods/skinsdb/textures/character.880.png similarity index 100% rename from mods/skinsdb/textures/character_880.png rename to mods/skinsdb/textures/character.880.png diff --git a/mods/skinsdb/textures/character_881.png b/mods/skinsdb/textures/character.881.png similarity index 100% rename from mods/skinsdb/textures/character_881.png rename to mods/skinsdb/textures/character.881.png diff --git a/mods/skinsdb/textures/character_882.png b/mods/skinsdb/textures/character.882.png similarity index 100% rename from mods/skinsdb/textures/character_882.png rename to mods/skinsdb/textures/character.882.png diff --git a/mods/skinsdb/textures/character_883.png b/mods/skinsdb/textures/character.883.png similarity index 100% rename from mods/skinsdb/textures/character_883.png rename to mods/skinsdb/textures/character.883.png diff --git a/mods/skinsdb/textures/character_884.png b/mods/skinsdb/textures/character.884.png similarity index 100% rename from mods/skinsdb/textures/character_884.png rename to mods/skinsdb/textures/character.884.png diff --git a/mods/skinsdb/textures/character_885.png b/mods/skinsdb/textures/character.885.png similarity index 100% rename from mods/skinsdb/textures/character_885.png rename to mods/skinsdb/textures/character.885.png diff --git a/mods/skinsdb/textures/character_886.png b/mods/skinsdb/textures/character.886.png similarity index 100% rename from mods/skinsdb/textures/character_886.png rename to mods/skinsdb/textures/character.886.png diff --git a/mods/skinsdb/textures/character_887.png b/mods/skinsdb/textures/character.887.png similarity index 100% rename from mods/skinsdb/textures/character_887.png rename to mods/skinsdb/textures/character.887.png diff --git a/mods/skinsdb/textures/character_888.png b/mods/skinsdb/textures/character.888.png similarity index 100% rename from mods/skinsdb/textures/character_888.png rename to mods/skinsdb/textures/character.888.png diff --git a/mods/skinsdb/textures/character_889.png b/mods/skinsdb/textures/character.889.png similarity index 100% rename from mods/skinsdb/textures/character_889.png rename to mods/skinsdb/textures/character.889.png diff --git a/mods/skinsdb/textures/character_89.png b/mods/skinsdb/textures/character.89.png similarity index 100% rename from mods/skinsdb/textures/character_89.png rename to mods/skinsdb/textures/character.89.png diff --git a/mods/skinsdb/textures/character_890.png b/mods/skinsdb/textures/character.890.png similarity index 100% rename from mods/skinsdb/textures/character_890.png rename to mods/skinsdb/textures/character.890.png diff --git a/mods/skinsdb/textures/character_891.png b/mods/skinsdb/textures/character.891.png similarity index 100% rename from mods/skinsdb/textures/character_891.png rename to mods/skinsdb/textures/character.891.png diff --git a/mods/skinsdb/textures/character_893.png b/mods/skinsdb/textures/character.893.png similarity index 100% rename from mods/skinsdb/textures/character_893.png rename to mods/skinsdb/textures/character.893.png diff --git a/mods/skinsdb/textures/character_894.png b/mods/skinsdb/textures/character.894.png similarity index 100% rename from mods/skinsdb/textures/character_894.png rename to mods/skinsdb/textures/character.894.png diff --git a/mods/skinsdb/textures/character_895.png b/mods/skinsdb/textures/character.895.png similarity index 100% rename from mods/skinsdb/textures/character_895.png rename to mods/skinsdb/textures/character.895.png diff --git a/mods/skinsdb/textures/character_896.png b/mods/skinsdb/textures/character.896.png similarity index 100% rename from mods/skinsdb/textures/character_896.png rename to mods/skinsdb/textures/character.896.png diff --git a/mods/skinsdb/textures/character_897.png b/mods/skinsdb/textures/character.897.png similarity index 100% rename from mods/skinsdb/textures/character_897.png rename to mods/skinsdb/textures/character.897.png diff --git a/mods/skinsdb/textures/character_898.png b/mods/skinsdb/textures/character.898.png similarity index 100% rename from mods/skinsdb/textures/character_898.png rename to mods/skinsdb/textures/character.898.png diff --git a/mods/skinsdb/textures/character_899.png b/mods/skinsdb/textures/character.899.png similarity index 100% rename from mods/skinsdb/textures/character_899.png rename to mods/skinsdb/textures/character.899.png diff --git a/mods/skinsdb/textures/character_9.png b/mods/skinsdb/textures/character.9.png similarity index 100% rename from mods/skinsdb/textures/character_9.png rename to mods/skinsdb/textures/character.9.png diff --git a/mods/skinsdb/textures/character_900.png b/mods/skinsdb/textures/character.900.png similarity index 100% rename from mods/skinsdb/textures/character_900.png rename to mods/skinsdb/textures/character.900.png diff --git a/mods/skinsdb/textures/character_901.png b/mods/skinsdb/textures/character.901.png similarity index 100% rename from mods/skinsdb/textures/character_901.png rename to mods/skinsdb/textures/character.901.png diff --git a/mods/skinsdb/textures/character_902.png b/mods/skinsdb/textures/character.902.png similarity index 100% rename from mods/skinsdb/textures/character_902.png rename to mods/skinsdb/textures/character.902.png diff --git a/mods/skinsdb/textures/character_903.png b/mods/skinsdb/textures/character.903.png similarity index 100% rename from mods/skinsdb/textures/character_903.png rename to mods/skinsdb/textures/character.903.png diff --git a/mods/skinsdb/textures/character_904.png b/mods/skinsdb/textures/character.904.png similarity index 100% rename from mods/skinsdb/textures/character_904.png rename to mods/skinsdb/textures/character.904.png diff --git a/mods/skinsdb/textures/character_905.png b/mods/skinsdb/textures/character.905.png similarity index 100% rename from mods/skinsdb/textures/character_905.png rename to mods/skinsdb/textures/character.905.png diff --git a/mods/skinsdb/textures/character_906.png b/mods/skinsdb/textures/character.906.png similarity index 100% rename from mods/skinsdb/textures/character_906.png rename to mods/skinsdb/textures/character.906.png diff --git a/mods/skinsdb/textures/character_907.png b/mods/skinsdb/textures/character.907.png similarity index 100% rename from mods/skinsdb/textures/character_907.png rename to mods/skinsdb/textures/character.907.png diff --git a/mods/skinsdb/textures/character_908.png b/mods/skinsdb/textures/character.908.png similarity index 100% rename from mods/skinsdb/textures/character_908.png rename to mods/skinsdb/textures/character.908.png diff --git a/mods/skinsdb/textures/character_909.png b/mods/skinsdb/textures/character.909.png similarity index 100% rename from mods/skinsdb/textures/character_909.png rename to mods/skinsdb/textures/character.909.png diff --git a/mods/skinsdb/textures/character_910.png b/mods/skinsdb/textures/character.910.png similarity index 100% rename from mods/skinsdb/textures/character_910.png rename to mods/skinsdb/textures/character.910.png diff --git a/mods/skinsdb/textures/character_911.png b/mods/skinsdb/textures/character.911.png similarity index 100% rename from mods/skinsdb/textures/character_911.png rename to mods/skinsdb/textures/character.911.png diff --git a/mods/skinsdb/textures/character_912.png b/mods/skinsdb/textures/character.912.png similarity index 100% rename from mods/skinsdb/textures/character_912.png rename to mods/skinsdb/textures/character.912.png diff --git a/mods/skinsdb/textures/character_913.png b/mods/skinsdb/textures/character.913.png similarity index 100% rename from mods/skinsdb/textures/character_913.png rename to mods/skinsdb/textures/character.913.png diff --git a/mods/skinsdb/textures/character_914.png b/mods/skinsdb/textures/character.914.png similarity index 100% rename from mods/skinsdb/textures/character_914.png rename to mods/skinsdb/textures/character.914.png diff --git a/mods/skinsdb/textures/character_915.png b/mods/skinsdb/textures/character.915.png similarity index 100% rename from mods/skinsdb/textures/character_915.png rename to mods/skinsdb/textures/character.915.png diff --git a/mods/skinsdb/textures/character_916.png b/mods/skinsdb/textures/character.916.png similarity index 100% rename from mods/skinsdb/textures/character_916.png rename to mods/skinsdb/textures/character.916.png diff --git a/mods/skinsdb/textures/character_917.png b/mods/skinsdb/textures/character.917.png similarity index 100% rename from mods/skinsdb/textures/character_917.png rename to mods/skinsdb/textures/character.917.png diff --git a/mods/skinsdb/textures/character_918.png b/mods/skinsdb/textures/character.918.png similarity index 100% rename from mods/skinsdb/textures/character_918.png rename to mods/skinsdb/textures/character.918.png diff --git a/mods/skinsdb/textures/character_919.png b/mods/skinsdb/textures/character.919.png similarity index 100% rename from mods/skinsdb/textures/character_919.png rename to mods/skinsdb/textures/character.919.png diff --git a/mods/skinsdb/textures/character_92.png b/mods/skinsdb/textures/character.92.png similarity index 100% rename from mods/skinsdb/textures/character_92.png rename to mods/skinsdb/textures/character.92.png diff --git a/mods/skinsdb/textures/character_920.png b/mods/skinsdb/textures/character.920.png similarity index 100% rename from mods/skinsdb/textures/character_920.png rename to mods/skinsdb/textures/character.920.png diff --git a/mods/skinsdb/textures/character_921.png b/mods/skinsdb/textures/character.921.png similarity index 100% rename from mods/skinsdb/textures/character_921.png rename to mods/skinsdb/textures/character.921.png diff --git a/mods/skinsdb/textures/character_922.png b/mods/skinsdb/textures/character.922.png similarity index 100% rename from mods/skinsdb/textures/character_922.png rename to mods/skinsdb/textures/character.922.png diff --git a/mods/skinsdb/textures/character_923.png b/mods/skinsdb/textures/character.923.png similarity index 100% rename from mods/skinsdb/textures/character_923.png rename to mods/skinsdb/textures/character.923.png diff --git a/mods/skinsdb/textures/character_924.png b/mods/skinsdb/textures/character.924.png similarity index 100% rename from mods/skinsdb/textures/character_924.png rename to mods/skinsdb/textures/character.924.png diff --git a/mods/skinsdb/textures/character_925.png b/mods/skinsdb/textures/character.925.png similarity index 100% rename from mods/skinsdb/textures/character_925.png rename to mods/skinsdb/textures/character.925.png diff --git a/mods/skinsdb/textures/character_926.png b/mods/skinsdb/textures/character.926.png similarity index 100% rename from mods/skinsdb/textures/character_926.png rename to mods/skinsdb/textures/character.926.png diff --git a/mods/skinsdb/textures/character_927.png b/mods/skinsdb/textures/character.927.png similarity index 100% rename from mods/skinsdb/textures/character_927.png rename to mods/skinsdb/textures/character.927.png diff --git a/mods/skinsdb/textures/character_928.png b/mods/skinsdb/textures/character.928.png similarity index 100% rename from mods/skinsdb/textures/character_928.png rename to mods/skinsdb/textures/character.928.png diff --git a/mods/skinsdb/textures/character_929.png b/mods/skinsdb/textures/character.929.png similarity index 100% rename from mods/skinsdb/textures/character_929.png rename to mods/skinsdb/textures/character.929.png diff --git a/mods/skinsdb/textures/character_93.png b/mods/skinsdb/textures/character.93.png similarity index 100% rename from mods/skinsdb/textures/character_93.png rename to mods/skinsdb/textures/character.93.png diff --git a/mods/skinsdb/textures/character_930.png b/mods/skinsdb/textures/character.930.png similarity index 100% rename from mods/skinsdb/textures/character_930.png rename to mods/skinsdb/textures/character.930.png diff --git a/mods/skinsdb/textures/character_931.png b/mods/skinsdb/textures/character.931.png similarity index 100% rename from mods/skinsdb/textures/character_931.png rename to mods/skinsdb/textures/character.931.png diff --git a/mods/skinsdb/textures/character_932.png b/mods/skinsdb/textures/character.932.png similarity index 100% rename from mods/skinsdb/textures/character_932.png rename to mods/skinsdb/textures/character.932.png diff --git a/mods/skinsdb/textures/character_933.png b/mods/skinsdb/textures/character.933.png similarity index 100% rename from mods/skinsdb/textures/character_933.png rename to mods/skinsdb/textures/character.933.png diff --git a/mods/skinsdb/textures/character_934.png b/mods/skinsdb/textures/character.934.png similarity index 100% rename from mods/skinsdb/textures/character_934.png rename to mods/skinsdb/textures/character.934.png diff --git a/mods/skinsdb/textures/character_935.png b/mods/skinsdb/textures/character.935.png similarity index 100% rename from mods/skinsdb/textures/character_935.png rename to mods/skinsdb/textures/character.935.png diff --git a/mods/skinsdb/textures/character_936.png b/mods/skinsdb/textures/character.936.png similarity index 100% rename from mods/skinsdb/textures/character_936.png rename to mods/skinsdb/textures/character.936.png diff --git a/mods/skinsdb/textures/character_937.png b/mods/skinsdb/textures/character.937.png similarity index 100% rename from mods/skinsdb/textures/character_937.png rename to mods/skinsdb/textures/character.937.png diff --git a/mods/skinsdb/textures/character_938.png b/mods/skinsdb/textures/character.938.png similarity index 100% rename from mods/skinsdb/textures/character_938.png rename to mods/skinsdb/textures/character.938.png diff --git a/mods/skinsdb/textures/character_939.png b/mods/skinsdb/textures/character.939.png similarity index 100% rename from mods/skinsdb/textures/character_939.png rename to mods/skinsdb/textures/character.939.png diff --git a/mods/skinsdb/textures/character_940.png b/mods/skinsdb/textures/character.940.png similarity index 100% rename from mods/skinsdb/textures/character_940.png rename to mods/skinsdb/textures/character.940.png diff --git a/mods/skinsdb/textures/character_941.png b/mods/skinsdb/textures/character.941.png similarity index 100% rename from mods/skinsdb/textures/character_941.png rename to mods/skinsdb/textures/character.941.png diff --git a/mods/skinsdb/textures/character_942.png b/mods/skinsdb/textures/character.942.png similarity index 100% rename from mods/skinsdb/textures/character_942.png rename to mods/skinsdb/textures/character.942.png diff --git a/mods/skinsdb/textures/character_943.png b/mods/skinsdb/textures/character.943.png similarity index 100% rename from mods/skinsdb/textures/character_943.png rename to mods/skinsdb/textures/character.943.png diff --git a/mods/skinsdb/textures/character_944.png b/mods/skinsdb/textures/character.944.png similarity index 100% rename from mods/skinsdb/textures/character_944.png rename to mods/skinsdb/textures/character.944.png diff --git a/mods/skinsdb/textures/character_945.png b/mods/skinsdb/textures/character.945.png similarity index 100% rename from mods/skinsdb/textures/character_945.png rename to mods/skinsdb/textures/character.945.png diff --git a/mods/skinsdb/textures/character_946.png b/mods/skinsdb/textures/character.946.png similarity index 100% rename from mods/skinsdb/textures/character_946.png rename to mods/skinsdb/textures/character.946.png diff --git a/mods/skinsdb/textures/character_947.png b/mods/skinsdb/textures/character.947.png similarity index 100% rename from mods/skinsdb/textures/character_947.png rename to mods/skinsdb/textures/character.947.png diff --git a/mods/skinsdb/textures/character_948.png b/mods/skinsdb/textures/character.948.png similarity index 100% rename from mods/skinsdb/textures/character_948.png rename to mods/skinsdb/textures/character.948.png diff --git a/mods/skinsdb/textures/character_949.png b/mods/skinsdb/textures/character.949.png similarity index 100% rename from mods/skinsdb/textures/character_949.png rename to mods/skinsdb/textures/character.949.png diff --git a/mods/skinsdb/textures/character_95.png b/mods/skinsdb/textures/character.95.png similarity index 100% rename from mods/skinsdb/textures/character_95.png rename to mods/skinsdb/textures/character.95.png diff --git a/mods/skinsdb/textures/character_950.png b/mods/skinsdb/textures/character.950.png similarity index 100% rename from mods/skinsdb/textures/character_950.png rename to mods/skinsdb/textures/character.950.png diff --git a/mods/skinsdb/textures/character_951.png b/mods/skinsdb/textures/character.951.png similarity index 100% rename from mods/skinsdb/textures/character_951.png rename to mods/skinsdb/textures/character.951.png diff --git a/mods/skinsdb/textures/character_952.png b/mods/skinsdb/textures/character.952.png similarity index 100% rename from mods/skinsdb/textures/character_952.png rename to mods/skinsdb/textures/character.952.png diff --git a/mods/skinsdb/textures/character_953.png b/mods/skinsdb/textures/character.953.png similarity index 100% rename from mods/skinsdb/textures/character_953.png rename to mods/skinsdb/textures/character.953.png diff --git a/mods/skinsdb/textures/character_954.png b/mods/skinsdb/textures/character.954.png similarity index 100% rename from mods/skinsdb/textures/character_954.png rename to mods/skinsdb/textures/character.954.png diff --git a/mods/skinsdb/textures/character_955.png b/mods/skinsdb/textures/character.955.png similarity index 100% rename from mods/skinsdb/textures/character_955.png rename to mods/skinsdb/textures/character.955.png diff --git a/mods/skinsdb/textures/character_956.png b/mods/skinsdb/textures/character.956.png similarity index 100% rename from mods/skinsdb/textures/character_956.png rename to mods/skinsdb/textures/character.956.png diff --git a/mods/skinsdb/textures/character_957.png b/mods/skinsdb/textures/character.957.png similarity index 100% rename from mods/skinsdb/textures/character_957.png rename to mods/skinsdb/textures/character.957.png diff --git a/mods/skinsdb/textures/character_958.png b/mods/skinsdb/textures/character.958.png similarity index 100% rename from mods/skinsdb/textures/character_958.png rename to mods/skinsdb/textures/character.958.png diff --git a/mods/skinsdb/textures/character_959.png b/mods/skinsdb/textures/character.959.png similarity index 100% rename from mods/skinsdb/textures/character_959.png rename to mods/skinsdb/textures/character.959.png diff --git a/mods/skinsdb/textures/character_96.png b/mods/skinsdb/textures/character.96.png similarity index 100% rename from mods/skinsdb/textures/character_96.png rename to mods/skinsdb/textures/character.96.png diff --git a/mods/skinsdb/textures/character_960.png b/mods/skinsdb/textures/character.960.png similarity index 100% rename from mods/skinsdb/textures/character_960.png rename to mods/skinsdb/textures/character.960.png diff --git a/mods/skinsdb/textures/character_961.png b/mods/skinsdb/textures/character.961.png similarity index 100% rename from mods/skinsdb/textures/character_961.png rename to mods/skinsdb/textures/character.961.png diff --git a/mods/skinsdb/textures/character_962.png b/mods/skinsdb/textures/character.962.png similarity index 100% rename from mods/skinsdb/textures/character_962.png rename to mods/skinsdb/textures/character.962.png diff --git a/mods/skinsdb/textures/character_963.png b/mods/skinsdb/textures/character.963.png similarity index 100% rename from mods/skinsdb/textures/character_963.png rename to mods/skinsdb/textures/character.963.png diff --git a/mods/skinsdb/textures/character_964.png b/mods/skinsdb/textures/character.964.png similarity index 100% rename from mods/skinsdb/textures/character_964.png rename to mods/skinsdb/textures/character.964.png diff --git a/mods/skinsdb/textures/character_965.png b/mods/skinsdb/textures/character.965.png similarity index 100% rename from mods/skinsdb/textures/character_965.png rename to mods/skinsdb/textures/character.965.png diff --git a/mods/skinsdb/textures/character_966.png b/mods/skinsdb/textures/character.966.png similarity index 100% rename from mods/skinsdb/textures/character_966.png rename to mods/skinsdb/textures/character.966.png diff --git a/mods/skinsdb/textures/character_967.png b/mods/skinsdb/textures/character.967.png similarity index 100% rename from mods/skinsdb/textures/character_967.png rename to mods/skinsdb/textures/character.967.png diff --git a/mods/skinsdb/textures/character_968.png b/mods/skinsdb/textures/character.968.png similarity index 100% rename from mods/skinsdb/textures/character_968.png rename to mods/skinsdb/textures/character.968.png diff --git a/mods/skinsdb/textures/character_969.png b/mods/skinsdb/textures/character.969.png similarity index 100% rename from mods/skinsdb/textures/character_969.png rename to mods/skinsdb/textures/character.969.png diff --git a/mods/skinsdb/textures/character_970.png b/mods/skinsdb/textures/character.970.png similarity index 100% rename from mods/skinsdb/textures/character_970.png rename to mods/skinsdb/textures/character.970.png diff --git a/mods/skinsdb/textures/character_971.png b/mods/skinsdb/textures/character.971.png similarity index 100% rename from mods/skinsdb/textures/character_971.png rename to mods/skinsdb/textures/character.971.png diff --git a/mods/skinsdb/textures/character_972.png b/mods/skinsdb/textures/character.972.png similarity index 100% rename from mods/skinsdb/textures/character_972.png rename to mods/skinsdb/textures/character.972.png diff --git a/mods/skinsdb/textures/character_973.png b/mods/skinsdb/textures/character.973.png similarity index 100% rename from mods/skinsdb/textures/character_973.png rename to mods/skinsdb/textures/character.973.png diff --git a/mods/skinsdb/textures/character_974.png b/mods/skinsdb/textures/character.974.png similarity index 100% rename from mods/skinsdb/textures/character_974.png rename to mods/skinsdb/textures/character.974.png diff --git a/mods/skinsdb/textures/character_975.png b/mods/skinsdb/textures/character.975.png similarity index 100% rename from mods/skinsdb/textures/character_975.png rename to mods/skinsdb/textures/character.975.png diff --git a/mods/skinsdb/textures/character_976.png b/mods/skinsdb/textures/character.976.png similarity index 100% rename from mods/skinsdb/textures/character_976.png rename to mods/skinsdb/textures/character.976.png diff --git a/mods/skinsdb/textures/character_977.png b/mods/skinsdb/textures/character.977.png similarity index 100% rename from mods/skinsdb/textures/character_977.png rename to mods/skinsdb/textures/character.977.png diff --git a/mods/skinsdb/textures/character_978.png b/mods/skinsdb/textures/character.978.png similarity index 100% rename from mods/skinsdb/textures/character_978.png rename to mods/skinsdb/textures/character.978.png diff --git a/mods/skinsdb/textures/character_979.png b/mods/skinsdb/textures/character.979.png similarity index 100% rename from mods/skinsdb/textures/character_979.png rename to mods/skinsdb/textures/character.979.png diff --git a/mods/skinsdb/textures/character_98.png b/mods/skinsdb/textures/character.98.png similarity index 100% rename from mods/skinsdb/textures/character_98.png rename to mods/skinsdb/textures/character.98.png diff --git a/mods/skinsdb/textures/character_980.png b/mods/skinsdb/textures/character.980.png similarity index 100% rename from mods/skinsdb/textures/character_980.png rename to mods/skinsdb/textures/character.980.png diff --git a/mods/skinsdb/textures/character_981.png b/mods/skinsdb/textures/character.981.png similarity index 100% rename from mods/skinsdb/textures/character_981.png rename to mods/skinsdb/textures/character.981.png diff --git a/mods/skinsdb/textures/character_982.png b/mods/skinsdb/textures/character.982.png similarity index 100% rename from mods/skinsdb/textures/character_982.png rename to mods/skinsdb/textures/character.982.png diff --git a/mods/skinsdb/textures/character_983.png b/mods/skinsdb/textures/character.983.png similarity index 100% rename from mods/skinsdb/textures/character_983.png rename to mods/skinsdb/textures/character.983.png diff --git a/mods/skinsdb/textures/character_984.png b/mods/skinsdb/textures/character.984.png similarity index 100% rename from mods/skinsdb/textures/character_984.png rename to mods/skinsdb/textures/character.984.png diff --git a/mods/skinsdb/textures/character_985.png b/mods/skinsdb/textures/character.985.png similarity index 100% rename from mods/skinsdb/textures/character_985.png rename to mods/skinsdb/textures/character.985.png diff --git a/mods/skinsdb/textures/character_986.png b/mods/skinsdb/textures/character.986.png similarity index 100% rename from mods/skinsdb/textures/character_986.png rename to mods/skinsdb/textures/character.986.png diff --git a/mods/skinsdb/textures/character_987.png b/mods/skinsdb/textures/character.987.png similarity index 100% rename from mods/skinsdb/textures/character_987.png rename to mods/skinsdb/textures/character.987.png diff --git a/mods/skinsdb/textures/character_988.png b/mods/skinsdb/textures/character.988.png similarity index 100% rename from mods/skinsdb/textures/character_988.png rename to mods/skinsdb/textures/character.988.png diff --git a/mods/skinsdb/textures/character_989.png b/mods/skinsdb/textures/character.989.png similarity index 100% rename from mods/skinsdb/textures/character_989.png rename to mods/skinsdb/textures/character.989.png diff --git a/mods/skinsdb/textures/character_99.png b/mods/skinsdb/textures/character.99.png similarity index 100% rename from mods/skinsdb/textures/character_99.png rename to mods/skinsdb/textures/character.99.png diff --git a/mods/skinsdb/textures/character_990.png b/mods/skinsdb/textures/character.990.png similarity index 100% rename from mods/skinsdb/textures/character_990.png rename to mods/skinsdb/textures/character.990.png diff --git a/mods/skinsdb/textures/character_991.png b/mods/skinsdb/textures/character.991.png similarity index 100% rename from mods/skinsdb/textures/character_991.png rename to mods/skinsdb/textures/character.991.png diff --git a/mods/skinsdb/textures/character_992.png b/mods/skinsdb/textures/character.992.png similarity index 100% rename from mods/skinsdb/textures/character_992.png rename to mods/skinsdb/textures/character.992.png diff --git a/mods/skinsdb/textures/character_993.png b/mods/skinsdb/textures/character.993.png similarity index 100% rename from mods/skinsdb/textures/character_993.png rename to mods/skinsdb/textures/character.993.png diff --git a/mods/skinsdb/textures/character_994.png b/mods/skinsdb/textures/character.994.png similarity index 100% rename from mods/skinsdb/textures/character_994.png rename to mods/skinsdb/textures/character.994.png diff --git a/mods/skinsdb/textures/character_995.png b/mods/skinsdb/textures/character.995.png similarity index 100% rename from mods/skinsdb/textures/character_995.png rename to mods/skinsdb/textures/character.995.png diff --git a/mods/skinsdb/textures/character_996.png b/mods/skinsdb/textures/character.996.png similarity index 100% rename from mods/skinsdb/textures/character_996.png rename to mods/skinsdb/textures/character.996.png diff --git a/mods/skinsdb/textures/character_997.png b/mods/skinsdb/textures/character.997.png similarity index 100% rename from mods/skinsdb/textures/character_997.png rename to mods/skinsdb/textures/character.997.png diff --git a/mods/skinsdb/textures/character_998.png b/mods/skinsdb/textures/character.998.png similarity index 100% rename from mods/skinsdb/textures/character_998.png rename to mods/skinsdb/textures/character.998.png diff --git a/mods/skinsdb/textures/character_999.png b/mods/skinsdb/textures/character.999.png similarity index 100% rename from mods/skinsdb/textures/character_999.png rename to mods/skinsdb/textures/character.999.png diff --git a/mods/skinsdb/textures/readme.txt b/mods/skinsdb/textures/readme.txt index 9d0b4501..73885f13 100644 --- a/mods/skinsdb/textures/readme.txt +++ b/mods/skinsdb/textures/readme.txt @@ -1,13 +1,33 @@ -In this folder the skin files could be placed according the following file naming convention. +This location is where you can put your custom skins. + + +List of accepted texture names +------------------------------ Public skin available for all users: - character_[number-or-name].png + character.[number or name].png + ^ The allowed characters in "[number or name]" are "[A-z0-9_.-]+". -One or multiple private skins for player "nick": - player_[nick].png or - player_[nick]_[number-or-name].png +One or multiple private skins for player "[nick]": + player.[nick].png + player.[nick].[number or name].png -Preview files for public and private skins. -Optional, overrides the generated preview - character_*_preview.png or - player_*_*_preview.png +Skin previews for public and private skins: + character.[number or name].preview.png + player.[nick].preview.png + player.[nick].[number or name].preview.png + + Note: This is optional and overrides automatically generated preciewws. + + +Legacy texture names +-------------------- + +The character `_` is accepted in player names, thus it is not recommended to +use such file names. For compatibility reasons, they are still recognized. + + character_[number or name].png + player_[nick].png + player_[nick]_[number or name].png + +... and corresponding previews that end in `_preview.png`. diff --git a/mods/skinsdb/unittest.lua b/mods/skinsdb/unittest.lua new file mode 100644 index 00000000..bf476d2b --- /dev/null +++ b/mods/skinsdb/unittest.lua @@ -0,0 +1,51 @@ +local function get_skin(skin_name) + local skin = skins.get(skin_name) + or skins.__fuzzy_match_skin_name("(unittest)", skin_name, true) + return skin and skin:get_key() or nil +end + +local function run_unittest() + local PATH = ":UNITTEST:" + + -- ----- + -- `.`: Simple register + retrieve operations + assert(skins.register_skin(PATH, "player.DotSep.png")) + assert(skins.register_skin(PATH, "player._DotSep_666_.1.png")) + assert(skins.register_skin(PATH, "character._DotSep_With-Dash-.png")) + + assert(get_skin("player.DotSep")) + assert(get_skin("player._DotSep_666_.1")) + assert(get_skin("player.DotSep.1") == nil) + assert(get_skin("character._DotSep_With-Dash-")) + + -- ----- + -- Ambiguous skin names (filenames without extension). Register + retrieve + skins.new("player_AmbSki") + skins.new("player_AmbSki_1") + skins.new("player_AmbSki_666_1") + + assert(get_skin("player_AmbSki")) + assert(get_skin("player_AmbSki_") == nil) + assert(get_skin("player_AmbSki_1")) + assert(get_skin("player_AmbSki_666_1")) + -- There are no `__` patterns as they were silently removed by string.split + + + -- ----- + -- Mod Storage backwards compatibility + -- Match the old `_` notation to `.`-separated skins + skins.register_skin(PATH, "player.ComPat42.png") + skins.register_skin(PATH, "player.ComPat42.5.png") + skins.register_skin(PATH, "player._Com_Pat_42.png") + skins.register_skin(PATH, "player._Com_Pat_42.1.png") + + assert(get_skin("player_ComPat42") == "player.ComPat42") + assert(get_skin("player_ComPat42_5") == "player.ComPat42.5") + assert(get_skin("player_Com_Pat_42") == "player._Com_Pat_42") + assert(get_skin("player_Com_Pat_42_1") == "player._Com_Pat_42.1") + + error("Unittest passed! Please disable them now.") +end + +run_unittest() + diff --git a/mods/skinsdb/updater/update_skins.py b/mods/skinsdb/updater/update_skins.py index 8b760b71..4c1c533a 100644 --- a/mods/skinsdb/updater/update_skins.py +++ b/mods/skinsdb/updater/update_skins.py @@ -1,11 +1,9 @@ -import sys, requests, base64 - -download_preview = ( len (sys.argv) > 1 and sys.argv[1] == "with_preview" ) +import os.path, sys, requests, base64 -print("Downloading skins from minetest.fensta.bplaced.net ...") +print("Downloading skins from skinsdb.terraqueststudio.net ...") # Requesting all skins and their raw texture using the API -r = requests.get('http://minetest.fensta.bplaced.net/api/v2/get.json.php?getlist&page=1&per_page=999999999') +r = requests.get('http://skinsdb.terraqueststudios.net/api/v1/content?client=script&page=1&per_page=10000') if r.status_code != 200: sys.exit("Request failed!") @@ -13,42 +11,33 @@ if r.status_code != 200: data = r.json() count = 0 -if download_preview: - print("Writing to file and downloading previews ...") -else: - print("Writing skins") +print("Writing skins") for json in data["skins"]: id = str(json["id"]) + name = "character." + id + if True: + legacy_name = "character_" + id + if os.path.exists("../textures/" + legacy_name + ".png"): + name = legacy_name + + # Texture file raw_data = base64.b64decode(json["img"]) - file = open("../textures/character_" + id + ".png", "wb") + file = open("../textures/" + name + ".png", "wb") file.write(bytearray(raw_data)) file.close() # Meta file - name = str(json["name"]) - author = str(json["author"]) - license = str(json["license"]) - file = open("../meta/character_" + id + ".txt", "w") - file.write(name + "\n" + author + "\n" + license + "\n") + meta_name = str(json["name"]) + meta_author = str(json["author"]) + meta_license = str(json["license"]) + file = open("../meta/" + name + ".txt", "w") + file.write(meta_name + "\n" + meta_author + "\n" + meta_license + "\n") file.close() - print("Added #%s Name: %s Author: %s License: %s" % (id, name, author, license)) + print("Added #%s Name: %s Author: %s License: %s" % (id, meta_name, meta_author, meta_license)) count += 1 - if download_preview: - # Downloading the preview of the skin - r2 = requests.get('http://minetest.fensta.bplaced.net/skins/1/' + id + ".png") - if r2.status_code == 200: - # Preview file - preview = r2.content - file = open("../textures/character_" + id + "_preview.png", "wb") - file.write(bytearray(preview)) - file.close() - else: - print("Failed to download skin preview #" + id) - - print("Fetched " + str(count) + " skins!") diff --git a/mods/smartshop/depends.txt b/mods/smartshop/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/smartshop/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/smartshop/description.txt b/mods/smartshop/description.txt deleted file mode 100644 index a120377b..00000000 --- a/mods/smartshop/description.txt +++ /dev/null @@ -1 +0,0 @@ -Smart and easy shop \ No newline at end of file diff --git a/mods/smartshop/mod.conf b/mods/smartshop/mod.conf new file mode 100644 index 00000000..88ddaa61 --- /dev/null +++ b/mods/smartshop/mod.conf @@ -0,0 +1,3 @@ +name = smartshop +description = Smart and easy shop +depends = default diff --git a/mods/spectator_mode/.luacheckrc b/mods/spectator_mode/.luacheckrc index 8143a8c0..2486b97c 100644 --- a/mods/spectator_mode/.luacheckrc +++ b/mods/spectator_mode/.luacheckrc @@ -1,12 +1,20 @@ -unused_args = false -allow_defined_top = true - -read_globals = { - "minetest", - "vector", +-- Exclude regression tests / unit tests +exclude_files = { + "**/spec/**", } globals = { - "default", - "player_api", + player_api = { fields = { "player_attached" } }, + "spectator_mode", +} + +read_globals = { + -- Stdlib + string = { fields = { "split" } }, + table = { fields = { "copy", "insert" } }, + + -- Minetest + "minetest", + vector = { fields = { "copy", "new", "round" } }, + beerchat = { fields = { "has_player_muted_player" } } } diff --git a/mods/spectator_mode/LICENSE b/mods/spectator_mode/LICENSE index 5a8e3325..541c140f 100644 --- a/mods/spectator_mode/LICENSE +++ b/mods/spectator_mode/LICENSE @@ -1,14 +1,56 @@ - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 +-- +-- MIT License for spectator_mode code. +-- Applies to everything that is not covered with additional copyright notes. +-- +-- Notes: +-- See notes below MIT license, notes in source code and copyright notes for Minetest. +-- - Copyright (C) 2004 Sam Hocevar +MIT License - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. +Copyright (c) 2015 Jean-Patrick Guerrero - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 0. You just DO WHAT THE FUCK YOU WANT TO. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-- +-- Minetest LGPLv2.1 license contents +-- + +Minetest +Copyright (C) 2010-2018 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +-- +-- Additional licenses apply, see source files and subdirectories for more information. +-- diff --git a/mods/spectator_mode/README.md b/mods/spectator_mode/README.md index 6f9f21ea..768254ec 100644 --- a/mods/spectator_mode/README.md +++ b/mods/spectator_mode/README.md @@ -1,4 +1,8 @@ # Spectator Mode +[![luacheck](https://github.com/minetest-mods/spectator_mode/workflows/luacheck/badge.svg)](https://github.com/minetest-mods/spectator_mode/actions) +[![mineunit](https://github.com/minetest-mods/spectator_mode/workflows/mineunit/badge.svg)](https://github.com/minetest-mods/spectator_mode/actions) +[![License](https://img.shields.io/badge/License-MIT%20and%20CC--BY--SA--3.0-green.svg)](LICENSE) +[![Minetest](https://img.shields.io/badge/Minetest-5.0+-blue.svg)](https://www.minetest.net) A mod for Minetest allowing you to watch other players in their 3rd person view. You're invisible and undetectable for the players when you're in this mode. @@ -6,10 +10,11 @@ You're invisible and undetectable for the players when you're in this mode. Can be useful for admins or moderators in their task of monitoring. Requires the privilege `watch`. +Normal players can also invite others to observe them. + ## Dependencies - `player_api` (included in [`minetest_game`](https://github.com/minetest/minetest_game)) -- `default` (included in [`minetest_game`](https://github.com/minetest/minetest_game)) ## Requirements @@ -17,5 +22,46 @@ This mod requires MT 5.0.0 and above. ## Commands -`/watch `
-`/unwatch` (get back to your initial position) +All the commands can be modified in settings, here they are listed with their default names.
+ +`/watch ` silently attach to player
+`/unwatch` (get back to your initial position)
+`/watchme [, +`/smn` reject an invitation
+`/smy` accept an invitation
+ +## Settings + +All settings can be set in minetest.conf or accessed via mod with the global field of same name.
+[See settingtypes.txt](settingtypes.txt) + +## Privileges + +Both privileges are registered if no other mod has already done so. + +## Compatibility + +Before sending invites, beerchat's player meta entry is checked to make sure muted players can't invite.
+Other mods can override `spectator_mode.is_permited_to_invite(name_target, name_watcher)` to add own +conditions of when who can invite whom. + +Moderators are kept breathing when observing via '/watch' command. Other mods can override this to +add more functionality: `spectator_mode.keep_alive(name_watcher)`. + +`spectator_mode.on_respawnplayer(watcher)` can be overidden to adjust what happens when an attached player +dies and respawns. Without change, the observer is detached for a split second then re-attached. + +While attaching a player, his hud flags are mostly turned off. Other mods can override the behaviour +with their own implementation of
+`function spectator_mode.turn_off_hud_hook(player, flags, new_hud_flags)` +- **player** The PlayerObjectRef of player that is to be attached. +- **flags** The player's HUD-flags prior to attaching. +- **new_hud_flags** The table that can be manipulated and will be set as new flags. + +## Copyright + +Original mod DWTFYW Copyright (C) 2015 Jean-Patrick Guerrero +Since 20220217 MIT and CC-BY-SA-3.0[see LICENSE](LICENSE) +The MIT applies to all code in this project that is not otherwise protected. [see LICENSE](LICENSE) +The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code. + diff --git a/mods/spectator_mode/init.lua b/mods/spectator_mode/init.lua index 308d9e46..653a79f8 100644 --- a/mods/spectator_mode/init.lua +++ b/mods/spectator_mode/init.lua @@ -1,106 +1,570 @@ -local original_pos = {} +-- NOTE: in the output texts, the names are always in double quotes because some players have +-- names that can be confusing without the quotes. +-- IDEA: technically it would be possible to chain observe. Would have to climb the parent tree +-- making sure there is nothing circular happening. Including checking all the children. +-- A lot can go wrong with that, so it has been left out for now. +-- Another complication to this is that there are many combinations of client<->server +-- software versions to consider. +-- IDEA: might be nice to have a /send_home (|all) command for invitie to detach +-- invited guests again. +-- Currently player can force detachment by logging off. +spectator_mode = { + version = 20220214, + command_accept = minetest.settings:get('spectator_mode.command_accept') or 'smy', + command_deny = minetest.settings:get('spectator_mode.command_deny') or 'smn', + command_detach = minetest.settings:get('spectator_mode.command_detach') or 'unwatch', + command_invite = minetest.settings:get('spectator_mode.command_invite') or 'watchme', + command_attach = minetest.settings:get('spectator_mode.command_attach') or 'watch', + invitation_timeout = tonumber(minetest.settings:get( + 'spectator_mode.invitation_timeout') or 1 * 60), -minetest.register_privilege("watch", { - description = "Player can watch other players", - give_to_singleplayer = false, - give_to_admin = true, -}) + keep_all_observers_alive = minetest.settings:get_bool( + 'spectator_mode.keep_all_observers_alive', false), -local function toggle_hud_flags(player, bool) + priv_invite = minetest.settings:get('spectator_mode.priv_invite') or 'interact', + priv_watch = minetest.settings:get('spectator_mode.priv_watch') or 'watch', +} +local sm = spectator_mode +do + local temp = minetest.settings:get('spectator_mode.extra_observe_privs') or '' + sm.extra_observe_privs, sm.extra_observe_privs_moderator = {}, nil + for _, priv in ipairs(temp:split(',')) do + sm.extra_observe_privs[priv] = true + end + temp = minetest.settings:get('spectator_mode.extra_observe_privs_moderator') or '' + if temp == '' then + -- if no extra settings for moderators are set, then the table for observers + -- is linked and both use the same table reference. + sm.extra_observe_privs_moderator = sm.extra_observe_privs + -- if you prefer to keep the lists separate, uncomment next line + --sm.extra_observe_privs_moderator = table.copy(sm.extra_observe_privs) + else + sm.extra_observe_privs_moderator = {} + for _, priv in ipairs(temp:split(',')) do + sm.extra_observe_privs_moderator[priv] = true + end + end +end +if minetest.global_exists('beerchat') then + if 'function' == type(beerchat.has_player_muted_player) then + sm.beerchat_has_muted = beerchat.has_player_muted_player + end +end + +-- cache of saved states indexed by player name +-- original_state['watcher'] = state +local original_state = {} + +-- hash-table of pending invites +-- invites['invited_player'] = 'inviting_player' +local invites = {} + +-- hash-table for accepted invites. +-- Used to determine whether watched gets notifiction when watcher detaches +-- invited['invited_player'] = 'inviting_player' +local invited = {} + + +-- register privs after all mods have loaded as user may want to reuse other privs +minetest.register_on_mods_loaded(function() + if not minetest.registered_privileges[sm.priv_watch] then + minetest.register_privilege(sm.priv_watch, { + description = 'Player can watch other players.', + give_to_singleplayer = false, + give_to_admin = true, + }) + end + + if not minetest.registered_privileges[sm.priv_invite] then + minetest.register_privilege(sm.priv_invite, { + description = 'Player can invite other players to watch them.', + give_to_singleplayer = false, + give_to_admin = true, + }) + end +end) + + +-- TODO: consider making this public +local function original_state_get(player) + if not player or not player:is_player() then return end + + -- check cache + local state = original_state[player:get_player_name()] + if state then return state end + + -- fallback to player's meta + return minetest.deserialize(player:get_meta():get_string('spectator_mode:state')) +end -- original_state_get + + +local function original_state_set(player, state) + if not player or not player:is_player() then return end + + -- save to cache + original_state[player:get_player_name()] = state + + -- backup to player's meta + player:get_meta():set_string('spectator_mode:state', minetest.serialize(state)) +end -- original_state_set + + +local function original_state_delete(player) + if not player or not player:is_player() then return end + -- remove from cache + original_state[player:get_player_name()] = nil + -- remove backup + player:get_meta():set_string('spectator_mode:state', '') +end -- original_state_delete + + +-- keep moderators alive when they used '/watch' command +-- overridable as servers may want to change this +function spectator_mode.keep_alive(name_watcher) + local watcher = minetest.get_player_by_name(name_watcher) + if not watcher then return end -- logged off + + -- still attached? + if not original_state[name_watcher] then return end + + -- has enough air? (avoid showing bubbles when not needed) + if 8 > watcher:get_breath() then + watcher:set_breath(9) + end + minetest.after(5, sm.keep_alive, name_watcher) +end -- keep_alive + + +-- can be overriden to manipulate new_hud_flags +-- flags are the current hud_flags of player +-- luacheck: no unused args +function spectator_mode.turn_off_hud_hook(player, flags, new_hud_flags) + new_hud_flags.breathbar = flags.breathbar + new_hud_flags.healthbar = flags.healthbar +end -- turn_off_hud_hook +-- luacheck: unused args + + +-- this doesn't hide /postool hud, hunger bar and similar +local function turn_off_hud_flags(player) local flags = player:hud_get_flags() local new_hud_flags = {} - for flag in pairs(flags) do - new_hud_flags[flag] = bool + new_hud_flags[flag] = false end - + sm.turn_off_hud_hook(player, flags, new_hud_flags) player:hud_set_flags(new_hud_flags) -end +end -- turn_off_hud_flags -local function unwatching(name) - local watcher = minetest.get_player_by_name(name) - local privs = minetest.get_player_privs(name) - if watcher and default.player_attached[name] == true then - watcher:set_detach() - player_api.player_attached[name] = false - watcher:set_eye_offset(vector.new(), vector.new()) - watcher:set_nametag_attributes({color = {a = 255, r = 255, g = 255, b = 255}}) +-- called by the detach command '/unwatch' +-- called on logout if player is attached at that time +-- called before attaching to another player +local function detach(name_watcher) + -- nothing to do + if not player_api.player_attached[name_watcher] then return end - toggle_hud_flags(watcher, true) + local watcher = minetest.get_player_by_name(name_watcher) + if not watcher then return end -- shouldn't ever happen - watcher:set_properties({ - visual_size = {x = 1, y = 1}, - makes_footstep_sound = true, - collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3} - }) + watcher:set_detach() + player_api.player_attached[name_watcher] = false + watcher:set_eye_offset() - if not privs.interact and privs.watch == true then - privs.interact = true - minetest.set_player_privs(name, privs) + local state = original_state_get(watcher) + -- nothing else to do + if not state then return end + + -- NOTE: older versions of MT/MC may not have this + watcher:set_nametag_attributes({ + color = state.nametag.color, + bgcolor = state.nametag.bgcolor + }) + watcher:hud_set_flags(state.hud_flags) + watcher:set_properties({ + visual_size = state.visual_size, + makes_footstep_sound = state.makes_footstep_sound, + collisionbox = state.collisionbox, + show_on_minimap = state.show_on_minimap or true, -- or minetest default for players + }) + + -- restore privs + local privs = minetest.get_player_privs(name_watcher) + privs.interact = state.priv_interact + local privs_extra = invited[name_watcher] and sm.extra_observe_privs + or sm.extra_observe_privs_moderator + + for key, _ in pairs(privs_extra) do + privs[key] = state.privs_extra[key] + end + minetest.set_player_privs(name_watcher, privs) + + -- set_pos seems to be very unreliable + -- this workaround helps though + minetest.after(0.1, function() + watcher:set_pos(state.pos) + -- delete state only after actually moved. + -- this helps re-attach after log-off/server crash + original_state_delete(watcher) + end) + + -- if watcher was invited, notify invitee that watcher has detached + if invited[name_watcher] then + invited[name_watcher] = nil + minetest.chat_send_player(state.target, + '"' .. name_watcher .. '" has stopped looking over your shoulder.') + + end + minetest.log('action', '[spectator_mode] "' .. name_watcher + .. '" detached from "' .. state.target .. '"') + +end -- detach + + +-- both players are online and all checks have been done when this +-- method is called +local function attach(name_watcher, name_target) + + -- detach from cart, horse, bike etc. + detach(name_watcher) + + local watcher = minetest.get_player_by_name(name_watcher) + local privs_watcher = minetest.get_player_privs(name_watcher) + -- back up some attributes + local properties = watcher:get_properties() + local state = { + collisionbox = properties.collisionbox, + hud_flags = watcher:hud_get_flags(), + makes_footstep_sound = properties.makes_footstep_sound, + nametag = watcher:get_nametag_attributes(), + show_on_minimap = properties.show_on_minimap, + pos = watcher:get_pos(), + priv_interact = privs_watcher.interact, + privs_extra = {}, + target = name_target, + visual_size = properties.visual_size, + } + local privs_extra + if invites[name_watcher] then + privs_extra = sm.extra_observe_privs + else + -- wasn't invited -> '/watch' used by moderator + privs_extra = sm.extra_observe_privs_moderator + end + + for key, _ in pairs(privs_extra) do + state.privs_extra[key] = privs_watcher[key] + privs_watcher[key] = true + end + original_state_set(watcher, state) + + -- set some attributes + turn_off_hud_flags(watcher) + watcher:set_properties({ + visual_size = { x = 0, y = 0 }, + makes_footstep_sound = false, + collisionbox = { 0 }, -- TODO: is this the proper/best way? + show_on_minimap = false, + }) + watcher:set_nametag_attributes({ color = { a = 0 }, bgcolor = { a = 0 } }) + local eye_pos = vector.new(0, -5, -20) + watcher:set_eye_offset(eye_pos) + -- make sure watcher can't interact + privs_watcher.interact = nil + minetest.set_player_privs(name_watcher, privs_watcher) + -- and attach + player_api.player_attached[name_watcher] = true + local target = minetest.get_player_by_name(name_target) + watcher:set_attach(target, '', eye_pos) + minetest.log('action', '[spectator_mode] "' .. name_watcher + .. '" attached to "' .. name_target .. '"') + + if sm.keep_all_observers_alive or (not invites[name_watcher]) then + -- server keeps all observers alive + -- or moderator used '/watch' to sneak up without invite + minetest.after(3, sm.keep_alive, name_watcher) + end +end -- attach + + +-- called by '/watch' command +local function watch(name_watcher, name_target) + if original_state[name_watcher] then + return true, 'You are currently watching "' + .. original_state[name_watcher].target + .. '". Say /' .. sm.command_detach .. ' first.' + + end + if name_watcher == name_target then + return true, 'You may not watch yourself.' + end + + local target = minetest.get_player_by_name(name_target) + if not target then + return true, 'Invalid target name "' .. name_target .. '"' + end + + -- avoid infinite loops + if original_state[name_target] then + return true, '"' .. name_target .. '" is watching "' + .. original_state[name_target].target .. '". You may not watch a watcher.' + end + + attach(name_watcher, name_target) + return true, 'Watching "' .. name_target .. '" at ' + .. minetest.pos_to_string(vector.round(target:get_pos())) + +end -- watch + + +local function invite_timed_out(name_watcher) + -- did the watcher already accept/decline? + if not invites[name_watcher] then return end + + minetest.chat_send_player(invites[name_watcher], + 'Invitation to "' .. name_watcher .. '" timed-out.') + + minetest.chat_send_player(name_watcher, + 'Invitation from "' .. invites[name_watcher] .. '" timed-out.') + + invites[name_watcher] = nil +end -- invite_timed_out + + +-- called by '/watchme' command +local function watchme(name_target, param) + if original_state[name_target] then + return true, 'You are watching "' .. original_state[name_target].target + .. '", no chain watching is allowed.' + end + + if '' == param then + return true, 'Please provide at least one player name.' + end + + local messages = {} + local count_invites = 0 + local invitation_timeout_string = tostring(sm.invitation_timeout) + local invitation_postfix = '" has invited you to observe them. ' + .. 'Accept with /' .. sm.command_accept + .. ', deny with /' .. sm.command_deny .. '.\n' + .. 'The invite expires in ' .. invitation_timeout_string .. ' seconds.' + + -- checks whether watcher may be invited by target and returns error message if not + -- if permitted, invites watcher and returns success message + local function invite(name_watcher) + if name_watcher == name_target then + return 'You may not watch yourself.' end - local pos = original_pos[watcher] - if pos then - -- set_pos seems to be very unreliable - -- this workaround helps though - minetest.after(0.1, function() - watcher:set_pos(pos) - end) - original_pos[watcher] = nil + if original_state[name_watcher] then + return '"' .. name_watcher .. '" is busy watching another player.' + end + + if invites[name_watcher] then + return '"' .. name_watcher .. '" has a pending invite, try again later.' + end + + if not minetest.get_player_by_name(name_watcher) then + return '"' .. name_watcher .. '" is not online.' + end + + if not sm.is_permited_to_invite(name_target, name_watcher) then + return 'You may not invite "' .. name_watcher .. '".' + end + + count_invites = count_invites + 1 + invites[name_watcher] = name_target + minetest.after(sm.invitation_timeout, invite_timed_out, name_watcher) + -- notify invited + minetest.chat_send_player(name_watcher, '"' .. name_target .. invitation_postfix) + + -- notify invitee + return 'You have invited "' .. name_watcher .. '".' + end -- invite() + + for name_watcher in string.gmatch(param, '[^%s,]+') do + table.insert(messages, invite(name_watcher)) + end + -- notify invitee + local text = table.concat(messages, '\n') + if 0 < count_invites then + text = text .. '\nThe invitations expire in ' + .. invitation_timeout_string .. ' seconds.' + end + return true, text +end -- watchme + + +-- this function only checks privs etc. Mechanics are already checked in watchme() +-- other mods can override and extend these checks +function spectator_mode.is_permited_to_invite(name_target, name_watcher) + if minetest.get_player_privs(name_target)[sm.priv_watch] then + return true + end + + if not minetest.get_player_privs(name_target)[sm.priv_invite] then + return false + end + + -- check for beerchat mute/ignore + if sm.beerchat_has_muted and sm.beerchat_has_muted(name_watcher, name_target) then + return false + end + + return true +end -- is_permited_to_invite + + +-- called by the accept command '/smy' +local function accept_invite(name_watcher) + local name_target = invites[name_watcher] + if not name_target then + return true, 'There is no invite for you. Maybe it timed-out.' + end + + attach(name_watcher, name_target) + invites[name_watcher] = nil + invited[name_watcher] = name_target + minetest.chat_send_player(name_target, + '"' .. name_watcher .. '" is now attached to you.') + + return true, 'OK, you have been attached to "' .. name_target .. '". To disable type /' + .. sm.command_detach + +end -- accept_invite + + +-- called by the deny command '/smn' +local function decline_invite(name_watcher) + if not invites[name_watcher] then + return true, 'There is no invite for you. Maybe it timed-out.' + end + + minetest.chat_send_player(invites[name_watcher], + '"' .. name_watcher .. '" declined the invite.') + + invites[name_watcher] = nil + return true, 'OK, declined invite.' +end -- decline_invite + + +local function unwatch(name_watcher) + -- nothing to do + if not player_api.player_attached[name_watcher] then + return true, 'You are not observing anybody.' + end + + detach(name_watcher) + return true -- no message as that has been sent by detach() +end -- unwatch + + +local function on_joinplayer(watcher) + local state = original_state_get(watcher) + if not state then return end + + -- attempt to move to original state after log-off + -- during attach or server crash + local name_watcher = watcher:get_player_name() + original_state[name_watcher] = state + player_api.player_attached[name_watcher] = true + detach(name_watcher) +end -- on_joinplayer + + +local function on_leaveplayer(watcher) + local name_watcher = watcher:get_player_name() + if invites[name_watcher] then + -- invitation exists for leaving player + minetest.chat_send_player(invites[name_watcher], + 'Invitation to "' .. name_watcher .. '" invalidated because of logout.') + + invites[name_watcher] = nil + end + -- detach before leaving + detach(name_watcher) + -- detach any that are watching this user + local attached = {} + for name, state in pairs(original_state) do + if name_watcher == state.target then + table.insert(attached, name) end end -end - -minetest.register_chatcommand("watch", { - params = "", - description = "Watch a given player", - privs = {watch = true}, - func = function(name, param) - local watcher = minetest.get_player_by_name(name) - local target = minetest.get_player_by_name(param) - local privs = minetest.get_player_privs(name) - - if target and watcher ~= target then - if player_api.player_attached[name] == true then - unwatching(param) - else - original_pos[watcher] = watcher:get_pos() - end - - player_api.player_attached[name] = true - watcher:set_attach(target, "", vector.new(0, -5, -20), vector.new()) - watcher:set_eye_offset(vector.new(0, -5, -20), vector.new()) - watcher:set_nametag_attributes({color = {a = 0}}) - - toggle_hud_flags(watcher, true) - - watcher:set_properties({ - visual_size = {x = 0, y = 0}, - makes_footstep_sound = false, - collisionbox = {0} - }) - - privs.interact = nil - minetest.set_player_privs(name, privs) - - return true, "Watching '" .. param .. "' at ".. - minetest.pos_to_string(vector.round(target:get_pos())) - end - - return false, "Invalid parameter ('" .. param .. "')." + -- we use separate loop to avoid editing a + -- hash while it's being looped + for _, name in ipairs(attached) do + detach(name) end +end -- on_leaveplayer + + +-- different servers may want different behaviour, they can +-- override this function +function spectator_mode.on_respawnplayer(watcher) +-- * Called when player is to be respawned +-- * Called _before_ repositioning of player occurs +-- * return true in func to disable regular player placement + local state = original_state_get(watcher) + if not state then return end + + local name_target = state.target + local name_watcher = watcher:get_player_name() + player_api.player_attached[name_watcher] = true + -- detach destroys invited entry, we need to restore that + if invited[name_watcher] then + detach(name_watcher) + -- mark as invited so players get info in chat on detach. + invited[name_watcher] = name_target + else + -- was a moderator using '/watch' -> conceal the spy. + detach(name_watcher) + end + minetest.after(.4, attach, name_watcher, name_target) + return true +end -- on_respawnplayer + + +minetest.register_chatcommand(sm.command_attach, { + params = '', + description = 'Watch a given player', + privs = { [sm.priv_watch] = true }, + func = watch, }) -minetest.register_chatcommand("unwatch", { - description = "Unwatch a player", - privs = {watch=true}, - func = function(name, param) - unwatching(name) - end + +minetest.register_chatcommand(sm.command_detach, { + description = 'Unwatch a player', + privs = { }, + func = unwatch, }) -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - unwatching(name) -end) + +minetest.register_chatcommand(sm.command_invite, { + description = 'Invite player(s) to watch you', + params = '[,[ ]' .. ']', + privs = { [sm.priv_invite] = true }, + func = watchme, +}) + + +minetest.register_chatcommand(sm.command_accept, { + description = 'Accept an invitation to watch another player', + params = '', + privs = { }, + func = accept_invite, +}) + + +minetest.register_chatcommand(sm.command_deny, { + description = 'Deny an invitation to watch another player', + params = '', + privs = { }, + func = decline_invite, +}) + + +minetest.register_on_joinplayer(on_joinplayer) +minetest.register_on_leaveplayer(on_leaveplayer) +minetest.register_on_respawnplayer(spectator_mode.on_respawnplayer) + diff --git a/mods/spectator_mode/mod.conf b/mods/spectator_mode/mod.conf index 707ce838..e7180cdd 100644 --- a/mods/spectator_mode/mod.conf +++ b/mods/spectator_mode/mod.conf @@ -1,6 +1,9 @@ name = spectator_mode -depends = default, player_api +depends = player_api +optional_depends = beerchat description = """ -A mod for Minetest allowing you to watch other players in their 3rd person view. -You're invisible and undetectable for the players when you're in this mode. +A mod for Minetest allowing players to watch other players in their 3rd person view. +Observers are invisible and can be kept alive. +Privileged players can observe others without invites. They can give away their presence +by dropping items or death creating bones and visible dead player. """ diff --git a/mods/spectator_mode/settingtypes.txt b/mods/spectator_mode/settingtypes.txt new file mode 100644 index 00000000..9da0aadf --- /dev/null +++ b/mods/spectator_mode/settingtypes.txt @@ -0,0 +1,36 @@ +# After an invite has successfully been sent, the watcher needs to accept with this command. +spectator_mode.command_accept (Chatcommand to accept an invitation) string smy + +# After an invite has successfully been sent, the watcher may decline it with this command. +spectator_mode.command_deny (Chatcommand to deny an invitation) string smn + +# To stop observing another player, issue this command +spectator_mode.command_detach (Chatcommand to stop observing a player) string unwatch + +# Additional privs granted to observers. e.g. noclip,never_hungry +spectator_mode.extra_observe_privs (Extra privs for observers) string + +# Additional privs granted to observers that used '/watch' command. e.g. jail,kick,teleport +# If left empty will use spectator_mode.extra_observe_privs (same table reference). +spectator_mode.extra_observe_privs_moderator (Extra privs for observing moderators) string + +# To invite another player to observe player that issued this command +spectator_mode.command_invite (Chatcommand to invite other player) string watchme + +# To start observing another player, issue this command +spectator_mode.command_attach (Chatcommand to start observing a player) string watch + +# Invitations invalidate after this many seconds if they haven't been accepted or denied +spectator_mode.invitation_timeout (Duration invites are valid for in seconds) int 60 + +# Not only moderators are kept oxygenated, but all observers when this is set to true. +# For auto-feeding the spectator_mode.keep_alive() function needs to be overridden by +# another mod. +spectator_mode.keep_all_observers_alive (Keep all observers alive) bool false + +# The priv needed to send observation invites. +spectator_mode.priv_invite (Player priv to invite others to observe) string interact + +# The priv needed to silently observe any player that isn't currently watching another one +spectator_mode.priv_watch (Moderator priv to watch any player) string watch + diff --git a/mods/spectator_mode/spec/fixtures/beerchat.lua b/mods/spectator_mode/spec/fixtures/beerchat.lua new file mode 100644 index 00000000..0efedf9b --- /dev/null +++ b/mods/spectator_mode/spec/fixtures/beerchat.lua @@ -0,0 +1,17 @@ +-- emulating the only part of [beerchat] that this mod uses +-- https://github.com/minetest-beerchat/beerchat/blob/69400d640c5f6972ab3c69b955b012aecba53ad5/common.lua#L56 + +mineunit:set_modpath("beerchat", "../beerchat") + +_G.beerchat = { has_player_muted_player = function(name, other_name) + local player = minetest.get_player_by_name(name) + -- check jic method is used incorrectly + if not player then + return true + end + + local key = "beerchat:muted:" .. other_name + local meta = player:get_meta() + return "true" == meta:get_string(key) +end } + diff --git a/mods/spectator_mode/spec/fixtures/mineunit_extensions.lua b/mods/spectator_mode/spec/fixtures/mineunit_extensions.lua new file mode 100644 index 00000000..3c611128 --- /dev/null +++ b/mods/spectator_mode/spec/fixtures/mineunit_extensions.lua @@ -0,0 +1,115 @@ +-- methods that mineunit has not yet implemented or will never implement but +-- are needed by the unit tests. + +-- not needed with core 5.5.0 (possibly earlier) +function vector.copy(v) return { x = v.x or 0, y = v.y or 0, z = v.z or 0 } end + +-- not needed with core 5.5.0 (possibly earlier) +function vector.zero() return { x = 0, y = 0, z = 0 } end + +function Player:hud_get_flags() + return self._hud_flags or { hotbar = true, healthbar = true, crosshair = true, + wielditem = true, breathbar = true, minimap = false, minimap_radar = false } +end +function Player:hud_set_flags(new_flags) + if not self._hud_flags then self._hud_flags = self:hud_get_flags() end + for flag, value in pairs(new_flags) do if nil ~= self._hud_flags[flag] then self._hud_flags[flag] = not not value end end +end + +function ObjectRef:get_nametag_attributes() + if not self._nametag_attributes then self._nametag_attributes = { + text = self._nametag_text or '', + color = self._nametag_color or { a = 255, r = 255, g = 255, b = 255 }, + bgcolor = self._nametag_bgcolor or { a = 0, r = 0, g = 0, b = 0 }, + } + end + return self._nametag_attributes +end + +function Player:set_eye_offset(firstperson, thirdperson) + self._eye_offset_first = + firstperson and vector.copy(firstperson) or vector.zero() + + thirdperson = thirdperson and vector.copy(thirdperson) or vector.zero() + thirdperson.x = math.max(-10, math.min(10, thirdperson.x)) + thirdperson.y = math.max(-10, math.min(15, thirdperson.y)) + thirdperson.z = math.max(-5, math.min(5, thirdperson.z)) + self._eye_offset_third = thirdperson +end + +function Player:get_breath() return self._breath or 10 end +function Player:set_breath(value) self._breath = tonumber(value) or self._breath end + +function ObjectRef:set_nametag_attributes(new_attributes) + if not self._nametag_attributes then self:get_nametag_attributes() end + for key, value in pairs(new_attributes) do + if nil ~= self._nametag_attributes[key] then + if 'name' == key then + self._nametag_attributes.name = tostring(value) + else + for subkey, subvalue in pairs(new_attributes[key]) do + if nil ~= self._nametag_attributes[key][subkey] then + self._nametag_attributes[key][subkey] = tonumber(subvalue) + end + end + end + end + end +end + +function ObjectRef:set_pos(value) + self._pos = vector.copy(value) + for _, child in ipairs(self:get_children()) do + child:set_pos(vector.add(self._pos, child._attach.position)) + end +end +function ObjectRef:set_attach(parent, bone, position, rotation, forced_visible) + if not parent then return end + if self._attach and self._attach.parent == parent then + mineunit:info('Attempt to attach to parent that object is already attached to.') + return + end + -- detach if attached + self:set_detach() + local obj = parent + while true do + if not obj._attach then break end + if obj._attach.parent == self then + mineunit:warning('Mod bug: Attempted to attach object to an object that ' + .. 'is directly or indirectly attached to the first object. -> ' + .. 'circular attachment chain.') + return + end + obj = obj._attach.parent + end + if 'table' ~= type(parent._children) then parent._children = {} end + table.insert(parent._children, self) + self._attach = { + parent = parent, + bone = bone or '', + position = position or vector.zero(), + rotation = rotation or vector.zero(), + forced_visible = not not forced_visible, + } + self._pitch = self._attach.position.x + self._roll = self._attach.position.z + self._yaw = self._attach.position.y + self:set_pos(vector.add(parent:get_pos(), self._attach.position)) + -- TODO: bones depending on object type +end +function ObjectRef:get_attach() + return self._attach +end +function ObjectRef:get_children() + return self._children or {} +end +function ObjectRef:set_detach() + if not self._attach then return end + local new_children = {} + for _, child in ipairs(self._attach.parent._children) do + if child ~= self then table.insert(new_children, child) end + end + self._attach.parent._children = new_children + self._attach = nil +end + diff --git a/mods/spectator_mode/spec/fixtures/player_api.lua b/mods/spectator_mode/spec/fixtures/player_api.lua new file mode 100644 index 00000000..7904ef89 --- /dev/null +++ b/mods/spectator_mode/spec/fixtures/player_api.lua @@ -0,0 +1,6 @@ +-- emulating the only part of [player_api] that this mod uses + +mineunit:set_modpath("player_api", "../player_api") + +_G.player_api = { player_attached = {} } + diff --git a/mods/spectator_mode/spec/init_spec.lua b/mods/spectator_mode/spec/init_spec.lua new file mode 100644 index 00000000..a7476fa7 --- /dev/null +++ b/mods/spectator_mode/spec/init_spec.lua @@ -0,0 +1,305 @@ +-- main unit testing file that mineunit picks up +-- https://github.com/S-S-X/mineunit + +require("mineunit") + +mineunit("core") +mineunit("player") +mineunit("server") +mineunit('common/after') + +-- mimic player_api.player_attached +fixture('player_api') +-- add some not yet included functions +fixture('mineunit_extensions') +-- mimic beerchat.has_player_muted_player +fixture('beerchat') + +local function pd1(m) print(dump(m)) end +local function pd(...) for _, m in ipairs({...}) do pd1(m) end end + +-- override chat_send_player to inspect what was sent +local chatlog = {} +local core_chat_send_player = core.chat_send_player +function core.chat_send_player(to_name, message) + table.insert(chatlog, { to = to_name, message = message }) + return core_chat_send_player(to_name, message) +end +local function reset_chatlog() chatlog = {} end + +describe("Mod initialization", function() + + it("Wont crash", function() + sourcefile("init") + end) + +end) + +describe('Watching:', function() + + -- create some players + local players = { + SX = Player("SX", { interact = 1 }), + boss = Player("boss", { interact = 1, watch = 1 }), + dude1 = Player("dude1", { interact = 1, }), + dude2 = Player("dude2", { interact = 1, }), + dude3 = Player("dude3", { interact = false, }), + } + local start_positions = {} + local boss = players.boss + local dude1 = players.dude1 + local dude2 = players.dude2 + local dude3 = players.dude3 + + setup(function() + -- make sure the privs are registered + mineunit:mods_loaded() + -- log on all players and move them to unique positions + local i, pos = 1 + for name, player in pairs(players) do + mineunit:execute_on_joinplayer(player) + pos = vector.new(10 * i, 20 * i, 30 * i) + start_positions[name] = pos + player:set_pos(pos) + i = i + 1 + end + end) + + teardown(function() + mineunit:info('shutting down server') + for _, player in pairs(players) do + mineunit:execute_on_leaveplayer(player) + end + mineunit:execute_globalstep(100) + end) + + it("boss attaches to dude1", function() + reset_chatlog() + boss:send_chat_message("/watch dude1") + assert.equals(1, #chatlog, 'unexpected amount of messages, ' + .. 'was dude1 notified by accident') + assert.equals('boss', chatlog[1].to) + assert.equals(1, chatlog[1].message:find('^Watching "dude1" at %(')) + local pos = boss:get_pos() + assert.equals(start_positions.dude1.x, pos.x) + assert.equals(start_positions.dude1.y - 5, pos.y) + assert.equals(start_positions.dude1.z - 20, pos.z) + end) + + it('boss returns to start position and nobody is notified about it', function() + -- let's make sure boss is still attached, jic we change previous test + assert.is_false(vector.equals(start_positions.boss, boss:get_pos()), + 'boss is still at starting position: unit setup error') + reset_chatlog() + boss:send_chat_message('/unwatch') + mineunit:execute_globalstep(1) + assert.equals(0, #chatlog, 'there was an error message sent to ?') + assert.is_true(vector.equals(start_positions.boss, boss:get_pos()), + 'boss did not move back to starting position') + end) + + it('boss tries to unwatch when not watching', function() + reset_chatlog() + boss:send_chat_message('/unwatch') + mineunit:execute_globalstep(1) + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.is_not_nil(chatlog[1].message:find('not observing'), + 'unexpected chat response') + end) + + it('player receives message when issuing /unwatch while not attached', function() + reset_chatlog() + dude1:send_chat_message('/unwatch') + mineunit:execute_globalstep(1) + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.is_not_nil(chatlog[1].message:find('not observing'), + 'unexpected chat response') + end) + + it('invitations are sent and expire', function() + reset_chatlog() + -- we also test multiple invites with space separation + dude2:send_chat_message('/watchme dude1 SX') + assert.equals('dude1', chatlog[1].to, 'dude1 did not get invited') + assert.equals('SX', chatlog[2].to, 'SX did not get invited') + assert.equals('dude2', chatlog[3].to, 'dude2 did not get message') + local message = chatlog[3].message + assert.is_true(message:find('"dude1"') and message:find('"SX"') and true, + 'response message does not contain invities') + assert.is_not_nil(message:find('60 seconds'), + 'response message does not contain expire info') + reset_chatlog() + mineunit:execute_globalstep(60) + assert.equals(4, #chatlog, 'unexpected chatlog count') + reset_chatlog() + players.SX:send_chat_message('/smy') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('SX', chatlog[1].to, 'message was not sent to SX but ' .. chatlog[1].to) + message = chatlog[1].message + assert.is_not_nil(message:find('timed%-out%.$'), + 'time out message does not end with "timed-out."') + local pos = players.SX:get_pos() + assert.is_true(vector.equals(start_positions.SX, pos), + 'Invitation did not expire, SX was moved.') + end) + + it('watching by normal player not possible', function() + local pos = dude2:get_pos() + reset_chatlog() + dude2:send_chat_message('/watch dude1') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('dude2', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('to run this command'), + 'unexpected error message') + assert.is_true(vector.equals(pos, dude2:get_pos())) + end) + + it('inviting is not possible when not having invite priv', function() + local last_priv = spectator_mode.priv_invite + -- set needed priv to avoid using dude3, this allows us to test + -- minetest.conf settings + spectator_mode.priv_invite = 'testPrivThatDoesNotExist' + reset_chatlog() + -- we also test comma list + dude2:send_chat_message('/watchme dude1,SX') + assert.equals(1, #chatlog, 'unexpected chatlog count') + local message = chatlog[1].message + assert.is_not_nil(message:find('"dude1"'), 'did not parse player list correctly') + assert.is_not_nil(message:find('"SX"'), 'did not parse player list correctly') + assert.is_not_nil(message:find('^You may not invite'), 'did not revoke inivting') + assert.is_nil(message:find('60 seconds'), 'time out message was wrongfully added') + -- restore priv setting + spectator_mode.priv_invite = last_priv + end) + + it('player can not invite himself', function() + reset_chatlog() + dude1:send_chat_message('/watchme dude1') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('may not watch yourself'), + 'unexpected chat response') + end) + + it('moderator can not invite himself', function() + reset_chatlog() + boss:send_chat_message('/watchme boss') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('boss', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('may not watch yourself'), + 'unexpected chat response') + end) + + it('moderator can not attach to an observing player and gets name of observed player', function() + dude1:send_chat_message('/watchme dude2') + dude2:send_chat_message('/smy') + mineunit:execute_globalstep(1) + reset_chatlog() + boss:send_chat_message('/watch dude2') + mineunit:execute_globalstep(1) + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('boss', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2" is watching "dude1"'), + 'unexpected chat response') + end) + it('player can not invite an observing player', function() + reset_chatlog() + players.SX:send_chat_message('/watchme dude2') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('SX', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2".*watching another player%.$'), + 'unexpected chat response') + + end) + -- TODO: check if this can't be exploited to make circular attaching + it('player can invite an observed player', function() + reset_chatlog() + players.SX:send_chat_message('/watchme dude1') + assert.equals(2, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.equals('SX', chatlog[2].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"SX".* seconds%.$'), + 'unexpected chat response') + end) + it('player can deny an invite', function() + reset_chatlog() + dude1:send_chat_message('/smn') + assert.equals(2, #chatlog, 'unexpected chatlog count') + assert.equals('SX', chatlog[1].to, 'unexpected recipient.') + assert.equals('dude1', chatlog[2].to, 'unexpected recipient.') + end) + it('player can detach and returns to original position', function() + reset_chatlog() + dude2:send_chat_message('/unwatch') + mineunit:execute_globalstep(1) + assert.is_true(vector.equals(start_positions.dude2, dude2:get_pos()), + 'dude2 did not move back to starting position') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2" has stopped loo'), + 'unexpected chat response') + end) + it('can not invite a player with pending invitation', function() + dude1:send_chat_message('/watchme dude2') + reset_chatlog() + players.SX:send_chat_message('/watchme dude2') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('SX', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2" has a pen'), + 'unexpected chat response') + end) + it('boss can attach to an unwatched player with pending invitation', function() + reset_chatlog() + boss:send_chat_message('/watch dude2') + mineunit:execute_globalstep(1) + assert.is_true(vector.equals(boss:get_pos(), vector.add( + dude2:get_pos(), vector.new(0, -5, -20))), 'boss not with dude2') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('boss', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^Watching "dude2"'), + 'unexpected chat response') + end) + it('can accept invitation after a moderator also attached', function() + reset_chatlog() + dude2:send_chat_message('/smy') + mineunit:execute_globalstep(1) + assert.equals(2, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.equals('dude2', chatlog[2].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2" is now attached'), + 'unexpected chat response') + assert.is_not_nil(chatlog[2].message:find('^OK, you have been atta'), + 'unexpected chat response') + end) + it('dude2 is detached when dude1 logs off', function() + reset_chatlog() + mineunit:execute_on_leaveplayer(dude1) + mineunit:execute_globalstep(1) + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.is_not_nil(chatlog[1].message:find('^"dude2" has stopped loo'), + 'unexpected chat response') + end) + it('dude3 ignores dude1 and can not be invited by dude1', function() + reset_chatlog() + dude3:get_meta():set_string('beerchat:muted:dude1', 'true') + dude1:send_chat_message('/watchme dude3') + assert.equals(1, #chatlog, 'unexpected chatlog count') + assert.equals('dude1', chatlog[1].to, 'unexpected recipient.') + assert.equals(chatlog[1].message, 'You may not invite "dude3".') + end) + it('boss is detached when he logs on after logging off while attached', function() + reset_chatlog() + assert.is_true(vector.equals(boss:get_pos(), vector.add( + dude2:get_pos(), vector.new(0, -5, -20))), 'boss not with dude2') + mineunit:execute_on_leaveplayer(boss) + mineunit:execute_globalstep(1) + assert.equals(0, #chatlog, 'unexpected chatlog count') + mineunit:execute_on_joinplayer(boss) + mineunit:execute_globalstep(1) + assert.is_false(vector.equals(boss:get_pos(), + vector.add(dude2:get_pos(), vector.new(0, -5, -20))), + 'boss with dude2') + end) +end) + diff --git a/mods/spectator_mode/spec/mineunit.conf b/mods/spectator_mode/spec/mineunit.conf new file mode 100644 index 00000000..dc41b292 --- /dev/null +++ b/mods/spectator_mode/spec/mineunit.conf @@ -0,0 +1,7 @@ +fixture_paths = { + "spec/fixtures", +} +exclude = { +} +verbose = 3 + diff --git a/mods/stained_glass/init.lua b/mods/stained_glass/init.lua index b3ffd4ec..413910d9 100644 --- a/mods/stained_glass/init.lua +++ b/mods/stained_glass/init.lua @@ -54,7 +54,7 @@ minetest.register_node("stained_glass:stained_glass", { sunlight_propagates = true, use_texture_alpha = "blend", light_source = myglow, - is_ground_content = true, + is_ground_content = false, walkable = true, groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, not_in_creative_inventory=1, ud_param2_colorable = 1}, sounds = default.node_sound_glass_defaults(), @@ -80,7 +80,7 @@ minetest.register_node("stained_glass:stained_trap_glass", { sunlight_propagates = true, use_texture_alpha = "blend", light_source = myglow, - is_ground_content = true, + is_ground_content = false, walkable = false, groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, not_in_creative_inventory=1, ud_param2_colorable = 1}, sounds = default.node_sound_glass_defaults(), diff --git a/mods/stairs/README.md b/mods/stairs/README.md new file mode 100644 index 00000000..d8b3782f --- /dev/null +++ b/mods/stairs/README.md @@ -0,0 +1,44 @@ +minetest mod Stairs +========================= + +Featured stairs with transparent and glowing stairs, slopes, fuel feature, etc + +Information +----------- + +This mod is named `stairs` and its a featured replacement of default one; +this mod has been amended to add new features like transparent and glowing +stairs, slopes, recipes to return stairs / slopes back into blocks and also for +stairs to be used as fuel for furnaces, also alternative placement functions +that use on_rotate and sneak key. + +![screenshot.png](screenshot.png) + +Tech information +---------------- + +This mod replaces the default stairs mod and is fully api compatible. + +#### Dependencies + +* default + +### Settings + +'stairs.show_sides' True by default it uses separate side textures for + glass and obsidian glass stairs to look more solid. + +License +------- + +### Authors of source code + +Originally by Kahrl (LGPLv2.1+) and +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) +http://www.gnu.org/licenses/lgpl-2.1.html + +### License of media (textures and sounds) + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt deleted file mode 100644 index db6e28de..00000000 --- a/mods/stairs/README.txt +++ /dev/null @@ -1,20 +0,0 @@ -Based on Minetest Game mod: stairs -================================== - -Authors of source code ----------------------- -Originally by Kahrl (LGPLv2.1+) and -celeron55, Perttu Ahola (LGPLv2.1+) -Various Minetest developers and contributors (LGPLv2.1+) - -http://www.gnu.org/licenses/lgpl-2.1.html - -License of media (textures and sounds) --------------------------------------- -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -http://creativecommons.org/licenses/by-sa/3.0/ - -Note: This mod has been amended to add new features like transparent and glowing -stairs, slopes, recipes to return stairs / slopes back into blocks and also for -stairs to be used as fuel for furnaces, also alternative placement functions -that use on_rotate and sneak key. diff --git a/mods/stairs/api.txt b/mods/stairs/api.txt index 3dc50aad..fe8ac6a3 100644 --- a/mods/stairs/api.txt +++ b/mods/stairs/api.txt @@ -62,6 +62,10 @@ The stairs API lets you register stairs and slabs and ensures that they are regi * `sounds`: See [#Default sounds] * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] +`stairs.register_slope_outer(subname, recipeitem, groups, images, description, sounds, worldaligntex)` + +`stairs.register_slope_inner(subname, recipeitem, groups, images, description, sounds, worldaligntex)` + `stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, worldaligntex)` @@ -76,3 +80,6 @@ The stairs API lets you register stairs and slabs and ensures that they are regi * A wrapper for stairs.register_stair, stairs.register_slab, stairs.register_stair_inner, stairs.register_stair_outer, stairs.register_slope * Uses almost the same arguments as stairs.register_stair * `description`: Description for stair nodes. 'stair' 'slab' 'stair_inner' 'stair_outer' 'Slope' will be prefixed + + +Note: if sounds set to nil then node sounds will be used. Texture alpha, sunglight propagates and light source will be taken from node for each stair registered. diff --git a/mods/stairs/depends.txt b/mods/stairs/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/stairs/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/stairs/description.txt b/mods/stairs/description.txt deleted file mode 100644 index 828523b8..00000000 --- a/mods/stairs/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds stairs, slabs, inner and outer corners and slopes for blocks. diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 4459d07d..0247f279 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -1,36 +1,10 @@ - --- wool sounds -function default.node_sound_wool_defaults(table) - - table = table or {} - - table.footstep = table.footstep or - {name = "wool_coat_movement", gain = 1.0} - table.dug = table.dug or - {name = "wool_coat_movement", gain = 0.25} - table.place = table.place or - {name = "default_place_node", gain = 1.0} - - return table -end - - -stairs = { - mod = "redo", - wood = default.node_sound_wood_defaults(), - dirt = default.node_sound_dirt_defaults(), - stone = default.node_sound_stone_defaults(), - glass = default.node_sound_glass_defaults(), - leaves = default.node_sound_leaves_defaults(), - metal = default.node_sound_metal_defaults(), - wool = default.node_sound_wool_defaults() -} +stairs = {mod = "redo"} -- cache creative local creative = minetest.settings:get_bool("creative_mode") -function is_creative_enabled_for(name) +local function is_creative_enabled_for(name) if creative or minetest.check_player_privs(name, {creative = true}) then return true @@ -45,28 +19,17 @@ local set_textures = function(images, worldaligntex) local stair_images = {} + for i, image in ipairs(images) do - if type(image) == "string" then + stair_images[i] = type(image) == "string" and {name = image} or table.copy(image) - stair_images[i] = { - name = image, - backface_culling = true - } + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end - if worldaligntex then - stair_images[i].align_style = "world" - end - else - stair_images[i] = table.copy(image) - - if stair_images[i].backface_culling == nil then - stair_images[i].backface_culling = true - end - - if worldaligntex and stair_images[i].align_style == nil then - stair_images[i].align_style = "world" - end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" end end @@ -85,8 +48,7 @@ local stair_place = function(itemstack, placer, pointed_thing, stair_node) local node_a = minetest.get_node(pos_a) local def_a = minetest.registered_nodes[node_a.name] - if not def_a.buildable_to - or minetest.is_protected(pos_a, name) then + if not def_a.buildable_to or minetest.is_protected(pos_a, name) then return itemstack end @@ -117,20 +79,7 @@ local stair_place = function(itemstack, placer, pointed_thing, stair_node) end --- get node settings to use for stairs -local function get_node_vars(nodename) - - local def = minetest.registered_nodes[nodename] - - if def then - return def.light_source, def.use_texture_alpha, def.sunlight_propagates - end - - return nil, nil, nil -end - - --- if recipeitem can be burned then stair can be as well +-- if recipeitem can be burned then stair can also local function set_burn(recipeitem, stair_name, v) local burntime = minetest.get_craft_result({ @@ -156,7 +105,7 @@ function stairs.register_stair( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:stair_" .. subname, { description = description, @@ -165,11 +114,11 @@ function stairs.register_stair( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, node_box = { type = "fixed", fixed = { @@ -179,9 +128,8 @@ function stairs.register_stair( }, on_place = function(itemstack, placer, pointed_thing) - - return stair_place(itemstack, placer, pointed_thing, - "stairs:stair_" .. subname) + return stair_place( + itemstack, placer, pointed_thing, "stairs:stair_" .. subname) end }) @@ -231,7 +179,7 @@ function stairs.register_slab( new_groups.slab = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:slab_" .. subname, { description = description, @@ -240,11 +188,11 @@ function stairs.register_slab( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, node_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5} @@ -252,8 +200,8 @@ function stairs.register_slab( on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:slab_" .. subname) + return stair_place( + itemstack, placer, pointed_thing, "stairs:slab_" .. subname) end }) @@ -292,7 +240,7 @@ function stairs.register_stair_outer( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:stair_outer_" .. subname, { description = fdesc or "Outer " .. description, @@ -301,11 +249,11 @@ function stairs.register_stair_outer( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, node_box = { type = "fixed", fixed = { @@ -316,8 +264,8 @@ function stairs.register_stair_outer( on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:stair_outer_" .. subname) + return stair_place( + itemstack, placer, pointed_thing, "stairs:stair_outer_" .. subname) end }) @@ -344,10 +292,8 @@ function stairs.register_stair_outer( minetest.register_craft({ output = recipeitem .. " 2", recipe = { - {"stairs:stair_outer_" .. subname, - "stairs:stair_outer_" .. subname}, - {"stairs:stair_outer_" .. subname, - "stairs:stair_outer_" .. subname} + {"stairs:stair_outer_" .. subname, "stairs:stair_outer_" .. subname}, + {"stairs:stair_outer_" .. subname, "stairs:stair_outer_" .. subname} } }) @@ -364,7 +310,7 @@ function stairs.register_stair_inner( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:stair_inner_" .. subname, { description = fdesc or "Inner " .. description, @@ -373,11 +319,11 @@ function stairs.register_stair_inner( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, node_box = { type = "fixed", fixed = { @@ -389,8 +335,8 @@ function stairs.register_stair_inner( on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:stair_inner_" .. subname) + return stair_place( + itemstack, placer, pointed_thing, "stairs:stair_inner_" .. subname) end, }) @@ -417,10 +363,8 @@ function stairs.register_stair_inner( minetest.register_craft({ output = recipeitem .. " 3", recipe = { - {"stairs:stair_inner_" .. subname, - "stairs:stair_inner_" .. subname}, - {"stairs:stair_inner_" .. subname, - "stairs:stair_inner_" .. subname} + {"stairs:stair_inner_" .. subname, "stairs:stair_inner_" .. subname}, + {"stairs:stair_inner_" .. subname, "stairs:stair_inner_" .. subname} } }) @@ -437,7 +381,7 @@ function stairs.register_slope( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:slope_" .. subname, { description = description, @@ -447,11 +391,11 @@ function stairs.register_slope( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, selection_box = { type = "fixed", fixed = { @@ -468,8 +412,9 @@ function stairs.register_slope( }, on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:slope_" .. subname) + + return stair_place( + itemstack, placer, pointed_thing, "stairs:slope_" .. subname) end }) @@ -503,7 +448,7 @@ function stairs.register_slope_inner( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:slope_inner_" .. subname, { description = description, @@ -513,11 +458,11 @@ function stairs.register_slope_inner( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, selection_box = { type = "fixed", fixed = { @@ -536,8 +481,9 @@ function stairs.register_slope_inner( }, on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:slope_inner_" .. subname) + + return stair_place( + itemstack, placer, pointed_thing, "stairs:slope_inner_" .. subname) end }) @@ -571,7 +517,7 @@ function stairs.register_slope_outer( new_groups.stair = 1 - local light, alpha, propa = get_node_vars(recipeitem) + local def = minetest.registered_nodes[recipeitem] or {} minetest.register_node(":stairs:slope_outer_" .. subname, { description = description, @@ -581,11 +527,11 @@ function stairs.register_slope_outer( paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - use_texture_alpha = alpha, - light_source = light, - sunlight_propagates = propa, + use_texture_alpha = def.use_texture_alpha, + light_source = def.light_source, + sunlight_propagates = def.sunlight_propagates, groups = new_groups, - sounds = snds, + sounds = snds or def.sounds, selection_box = { type = "fixed", fixed = { @@ -602,8 +548,9 @@ function stairs.register_slope_outer( }, on_place = function(itemstack, placer, pointed_thing) - return stair_place(itemstack, placer, pointed_thing, - "stairs:slope_outer_" .. subname) + + return stair_place( + itemstack, placer, pointed_thing, "stairs:slope_outer_" .. subname) end }) @@ -691,8 +638,10 @@ function stairs.register_corner( end --- Register stairs -dofile(minetest.get_modpath("stairs") .. "/stairs.lua") +-- Register stairs after mods loaded +minetest.register_on_mods_loaded(function() + dofile(minetest.get_modpath("stairs") .. "/stairs.lua") +end) print ("[MOD] Stairs Redo loaded") diff --git a/mods/stairs/license.txt b/mods/stairs/license.txt new file mode 100644 index 00000000..19ed680b --- /dev/null +++ b/mods/stairs/license.txt @@ -0,0 +1,31 @@ +The MIT License (MIT) + +Copyright (c) 2022 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Textures +-------- + + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_quarter.png + + Derived from a texture by celeron55 (CC BY-SA 3.0): + stairs_glass_quarter.png diff --git a/mods/stairs/locale/stairs.de.tr b/mods/stairs/locale/stairs.de.tr new file mode 100644 index 00000000..beb45798 --- /dev/null +++ b/mods/stairs/locale/stairs.de.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastreppe +Glass Slab=Glasplatte +Inner Glass Stair=Innere Glastreppe +Outer Glass Stair=Äußere Glastreppe +Obsidian Glass Stair=Obsidianglastreppe +Obsidian Glass Slab=Obsidianglasplatte +Inner Obsidian Glass Stair=Innere Obsidianglastreppe +Outer Obsidian Glass Stair=Äußere Obsidianglastreppe +Wooden Stair=Holztreppe +Inner Wooden Stair=Innere Holztreppe +Outer Wooden Stair=Äußere Holztreppe +Wooden Slab=Holzplatte +Jungle Wood Stair=Dschungelholztreppe +Inner Jungle Wood Stair=Innere Dschungelholztreppe +Outer Jungle Wood Stair=Äußere Dschungelholztreppe +Jungle Wood Slab=Dschungelholzplatte +Pine Wood Stair=Kiefernholztreppe +Inner Pine Wood Stair=Innere Kiefernholztreppe +Outer Pine Wood Stair=Äußere Kiefernholztreppe +Pine Wood Slab=Kiefernholzplatte +Acacia Wood Stair=Akazienholztreppe +Inner Acacia Wood Stair=Innere Akazienholztreppe +Outer Acacia Wood Stair=Äußere Akazienholztreppe +Acacia Wood Slab=Akazienholzplatte +Aspen Wood Stair=Espenholztreppe +Inner Aspen Wood Stair=Innere Espenholztreppe +Outer Aspen Wood Stair=Äußere Espenholztreppe +Aspen Wood Slab=Espenholzplatte +Stone Stair=Steintreppe +Inner Stone Stair=Innere Steintreppe +Outer Stone Stair=Äußere Steintreppe +Stone Slab=Steinplatte +Cobblestone Stair=Kopfsteinpflastertreppe +Inner Cobblestone Stair=Innere Kopfsteinpflastertreppe +Outer Cobblestone Stair=Äußere Kopfsteinpflastertreppe +Cobblestone Slab=Kopfsteinpflasterplatte +Mossy Cobblestone Stair=Moosige Kopfsteinpflastertreppe +Inner Mossy Cobblestone Stair=Innere moosige Kopfsteinpflastertreppe +Outer Mossy Cobblestone Stair=Äußere moosige Kopfsteinpflastertreppe +Mossy Cobblestone Slab=Moosige Kopfsteinpflasterplatte +Stone Brick Stair=Steinziegeltreppe +Inner Stone Brick Stair=Innere Steinziegeltreppe +Outer Stone Brick Stair=Äußere Steinziegeltreppe +Stone Brick Slab=Steinziegelplatte +Stone Block Stair=Steinblocktreppe +Inner Stone Block Stair=Innere Steinblocktreppe +Outer Stone Block Stair=Äußere Steinblocktreppe +Stone Block Slab=Steinblockplatte +Desert Stone Stair=Wüstensteintreppe +Inner Desert Stone Stair=Innere Wüstensteintreppe +Outer Desert Stone Stair=Äußere Wüstensteintreppe +Desert Stone Slab=Wüstensteinplatte +Desert Cobblestone Stair=Wüstenkopfsteinpflastertreppe +Inner Desert Cobblestone Stair=Innere Wüstenkopfsteinpflastertreppe +Outer Desert Cobblestone Stair=Äußere Wüstenkopfsteinpflastertreppe +Desert Cobblestone Slab=Wüstenkopfsteinpflasterplatte +Desert Stone Brick Stair=Wüstensteinziegeltreppe +Inner Desert Stone Brick Stair=Innere Wüstensteinziegeltreppe +Outer Desert Stone Brick Stair=Äußere Wüstensteinziegeltreppe +Desert Stone Brick Slab=Wüstensteinziegelplatte +Desert Stone Block Stair=Wüstensteinblocktreppe +Inner Desert Stone Block Stair=Innere Wüstensteinblocktreppe +Outer Desert Stone Block Stair=Äußere Wüstensteinblocktreppe +Desert Stone Block Slab=Wüstensteinblockplatte +Sandstone Stair=Sandsteintreppe +Inner Sandstone Stair=Innere Sandsteintreppe +Outer Sandstone Stair=Äußere Sandsteintreppe +Sandstone Slab=Sandsteinplatte +Sandstone Brick Stair=Sandsteinziegeltreppe +Inner Sandstone Brick Stair=Innere Sandsteinziegeltreppe +Outer Sandstone Brick Stair=Äußere Sandsteinziegeltreppe +Sandstone Brick Slab=Sandsteinziegelplatte +Sandstone Block Stair=Sandsteinblocktreppe +Inner Sandstone Block Stair=Innere Sandsteinblocktreppe +Outer Sandstone Block Stair=Äußere Sandsteinblocktreppe +Sandstone Block Slab=Sandsteinblockplatte +Desert Sandstone Stair=Wüstensandsteintreppe +Inner Desert Sandstone Stair=Innere Wüstensandsteintreppe +Outer Desert Sandstone Stair=Äußere Wüstensandsteintreppe +Desert Sandstone Slab=Wüstensandsteinplatte +Desert Sandstone Brick Stair=Wüstensandsteinziegeltreppe +Inner Desert Sandstone Brick Stair=Innere Wüstensandsteinziegeltreppe +Outer Desert Sandstone Brick Stair=Äußere Wüstensandsteinziegeltreppe +Desert Sandstone Brick Slab=Wüstensandsteinziegelplatte +Desert Sandstone Block Stair=Wüstensandsteinblocktreppe +Inner Desert Sandstone Block Stair=Innere Wüstensandsteinblocktreppe +Outer Desert Sandstone Block Stair=Äußere Wüstensandsteinblocktreppe +Desert Sandstone Block Slab=Wüstensandsteinblockplatte +Silver Sandstone Stair=Silbersandsteintreppe +Inner Silver Sandstone Stair=Innere Silbersandsteintreppe +Outer Silver Sandstone Stair=Äußere Silbersandsteintreppe +Silver Sandstone Slab=Silbersandsteinplatte +Silver Sandstone Brick Stair=Silbersandsteinziegeltreppe +Inner Silver Sandstone Brick Stair=Innere Silbersandsteinziegeltreppe +Outer Silver Sandstone Brick Stair=Äußere Silbersandsteinziegeltreppe +Silver Sandstone Brick Slab=Silbersandsteinziegelplatte +Silver Sandstone Block Stair=Silbersandsteinblocktreppe +Inner Silver Sandstone Block Stair=Innere Silbersandsteinblocktreppe +Outer Silver Sandstone Block Stair=Äußere Silbersandsteinblocktreppe +Silver Sandstone Block Slab=Silbersandsteinblockplatte +Obsidian Stair=Obsidiantreppe +Inner Obsidian Stair=Innere Obsidiantreppe +Outer Obsidian Stair=Äußere Obsidiantreppe +Obsidian Slab=Obsidianplatte +Obsidian Brick Stair=Obsidianziegeltreppe +Inner Obsidian Brick Stair=Innere Obsidianziegeltreppe +Outer Obsidian Brick Stair=Äußere Obsidianziegeltreppe +Obsidian Brick Slab=Obsidianziegelplatte +Obsidian Block Stair=Obsidianblocktreppe +Inner Obsidian Block Stair=Innere Obsidianblocktreppe +Outer Obsidian Block Stair=Äußere Obsidianblocktreppe +Obsidian Block Slab=Obsidianblockplatte +Brick Stair=Ziegeltreppe +Inner Brick Stair=Innere Ziegeltreppe +Outer Brick Stair=Äußere Ziegeltreppe +Brick Slab=Ziegelplatte +Steel Block Stair=Stahlblocktreppe +Inner Steel Block Stair=Innere Stahlblocktreppe +Outer Steel Block Stair=Äußere Stahlblocktreppe +Steel Block Slab=Stahlblockplatte +Tin Block Stair=Zinnblocktreppe +Inner Tin Block Stair=Innere Zinnblocktreppe +Outer Tin Block Stair=Äußere Zinnblocktreppe +Tin Block Slab=Zinnblockplatte +Copper Block Stair=Kupferblocktreppe +Inner Copper Block Stair=Innere Kupferblocktreppe +Outer Copper Block Stair=Äußere Kupferblocktreppe +Copper Block Slab=Kupferblockplatte +Bronze Block Stair=Bronzeblocktreppe +Inner Bronze Block Stair=Innere Bronzeblocktreppe +Outer Bronze Block Stair=Äußere Bronzeblocktreppe +Bronze Block Slab=Bronzeblockplatte +Gold Block Stair=Goldblocktreppe +Inner Gold Block Stair=Innere Goldblocktreppe +Outer Gold Block Stair=Äußere Goldblocktreppe +Gold Block Slab=Goldblockplatte +Ice Stair=Eistreppe +Inner Ice Stair=Innere Eistreppe +Outer Ice Stair=Äußere Eistreppe +Ice Slab=Eisplatte +Snow Block Stair=Schneeblocktreppe +Inner Snow Block Stair=Innere Schneeblocktreppe +Outer Snow Block Stair=Äußere Schneeblocktreppe +Snow Block Slab=Schneeblockplatte diff --git a/mods/stairs/locale/stairs.eo.tr b/mods/stairs/locale/stairs.eo.tr new file mode 100644 index 00000000..078cc9cc --- /dev/null +++ b/mods/stairs/locale/stairs.eo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Vitra Ŝtupo +Glass Slab=Vitra Plato +Inner Glass Stair=Interna Vitra Ŝtupo +Outer Glass Stair=Ekstera Vitra Ŝtupo +Obsidian Glass Stair=Obsidiana Vitra Ŝtupo +Obsidian Glass Slab=Obsidiana Vitra Plato +Inner Obsidian Glass Stair=Interna Obsidiana Vitra Ŝtupo +Outer Obsidian Glass Stair=Ekstera Obsidiana Vitra Ŝtupo +Wooden Stair=Ligna Ŝtupo +Inner Wooden Stair=Interna Ligna Ŝtupo +Outer Wooden Stair=Ekstera Ligna Ŝtupo +Wooden Slab=Ligna Plato +Jungle Wood Stair=Ĝangala Ligna Ŝtupo +Inner Jungle Wood Stair=Interna Ĝangala Ligna Ŝtupo +Outer Jungle Wood Stair=Ekstera Ĝangala Ligna Ŝtupo +Jungle Wood Slab=Ĝangala Ligna Plato +Pine Wood Stair=Pina Ligna Ŝtupo +Inner Pine Wood Stair=Interna Pina Ligna Ŝtupo +Outer Pine Wood Stair=Ekstera Pina Ligna Ŝtupo +Pine Wood Slab=Pina Ligna Plato +Acacia Wood Stair=Akacia Ligna Ŝtupo +Inner Acacia Wood Stair=Interna Akacia Ligna Ŝtupo +Outer Acacia Wood Stair=Ekstera Akacia Ligna Ŝtupo +Acacia Wood Slab=Akacia Ligna Plato +Aspen Wood Stair=Tremola Ligna Ŝtupo +Inner Aspen Wood Stair=Interna Tremola Ligna Ŝtupo +Outer Aspen Wood Stair=Ekstera Tremola Ligna Ŝtupo +Aspen Wood Slab=Tremola Ligna Plato +Stone Stair=Ŝtona Ŝtupo +Inner Stone Stair=Interna Ŝtona Ŝtupo +Outer Stone Stair=Ekstera Ŝtona Ŝtupo +Stone Slab=Ŝtona Plato +Cobblestone Stair=Pavimŝtona Ŝtupo +Inner Cobblestone Stair=Interna Pavimŝtona Ŝtupo +Outer Cobblestone Stair=Ekstera Pavimŝtona Ŝtupo +Cobblestone Slab=Pavimŝtona Plato +Mossy Cobblestone Stair=Muska Pavimŝtona Ŝtupo +Inner Mossy Cobblestone Stair=Interna Muska Pavimŝtona Ŝtupo +Outer Mossy Cobblestone Stair=Ekstera Muska Pavimŝtona Ŝtupo +Mossy Cobblestone Slab=Muska Pavimŝtona Plato +Stone Brick Stair=Ŝtona Brika Ŝtupo +Inner Stone Brick Stair=Interna Ŝtona Brika Ŝtupo +Outer Stone Brick Stair=Ekstera Ŝtona Brika Ŝtupo +Stone Brick Slab=Ŝtona Brika Plato +Stone Block Stair=Ŝtona Ŝtipa Ŝtupo +Inner Stone Block Stair=Interna Ŝtona Ŝtipa Ŝtupo +Outer Stone Block Stair=Ekstera Ŝtona Ŝtipa Ŝtupo +Stone Block Slab=Ŝtona Ŝtipa Plato +Desert Stone Stair=Dezerta Ŝtona Ŝtupo +Inner Desert Stone Stair=Interna Dezerta Ŝtona Ŝtupo +Outer Desert Stone Stair=Ekstera Dezerta Ŝtona Ŝtupo +Desert Stone Slab=Dezerta Ŝtona Plato +Desert Cobblestone Stair=Dezerta Pavimŝtona Ŝtupo +Inner Desert Cobblestone Stair=Interna Dezerta Pavimŝtona Ŝtupo +Outer Desert Cobblestone Stair=Ekstera Dezerta Pavimŝtona Ŝtupo +Desert Cobblestone Slab=Dezerta Pavimŝtona Plato +Desert Stone Brick Stair=Dezerta Ŝtona Brika Ŝtupo +Inner Desert Stone Brick Stair=Interna Dezerta Ŝtona Brika Ŝtupo +Outer Desert Stone Brick Stair=Ekstera Dezerta Ŝtona Brika Ŝtupo +Desert Stone Brick Slab=Dezerta Ŝtona Brika Plato +Desert Stone Block Stair=Dezerta Ŝtona Bloko Ŝtupo +Inner Desert Stone Block Stair=Interna Dezerta Ŝtona Bloko Stupo +Outer Desert Stone Block Stair=Ekstera Dezerta Ŝtona Bloko Ŝtupo +Desert Stone Block Slab=Dezerta Ŝtona Bloko Plato +Sandstone Stair=Sablŝtona Ŝtupo +Inner Sandstone Stair=Interna Ŝablŝtona Ŝtupo +Outer Sandstone Stair=Ekstera Ŝablŝtona Ŝtupo +Sandstone Slab=Ŝablŝtona Plato +Sandstone Brick Stair=Ŝablŝtona Brika Ŝtupo +Inner Sandstone Brick Stair=Interna Ŝablŝtona Brika Ŝtupo +Outer Sandstone Brick Stair=Ekstera Ŝablŝtona Brika Ŝtupo +Sandstone Brick Slab=Ŝablŝtona Brika Plato +Sandstone Block Stair=Ŝablŝtona Ŝtipa Ŝtupo +Inner Sandstone Block Stair=Interna Ŝablŝtona Ŝtipa Ŝtupo +Outer Sandstone Block Stair=Ekstera Ŝablŝtona Ŝtipa Ŝtupo +Sandstone Block Slab=Ŝablŝtona Ŝtipa Plato +Desert Sandstone Stair=Dezerta Ŝablŝtona Ŝtupo +Inner Desert Sandstone Stair=Interna Dezerta Ŝablŝtona Ŝtupo +Outer Desert Sandstone Stair=Ekstera Dezerta Ŝablŝtona Ŝtupo +Desert Sandstone Slab=Dezerta Ŝablŝtona Plato +Desert Sandstone Brick Stair=Dezerta Ŝablŝtona Brika Ŝtupo +Inner Desert Sandstone Brick Stair=Interna Dezerta Ŝablŝtona Brika Ŝtupo +Outer Desert Sandstone Brick Stair=Ekstera Dezerta Ŝablŝtona Brika Ŝtupo +Desert Sandstone Brick Slab=Dezerta Ŝablŝtona Brika Plato +Desert Sandstone Block Stair=Dezerta Ŝablŝtona Ŝtipa Ŝtupo +Inner Desert Sandstone Block Stair=Interna Dezerta Ŝablŝtona Brika Ŝtupo +Outer Desert Sandstone Block Stair=Ekstera Dezerta Ŝablŝtona Brika Ŝtupo +Desert Sandstone Block Slab=Dezerta Ŝablŝtona Ŝtipa Plato +Silver Sandstone Stair=Arĝenta Ŝablŝtona Ŝtupo +Inner Silver Sandstone Stair=Interna Arĝenta Ŝablŝtona Ŝtupo +Outer Silver Sandstone Stair=Ekstera Arĝenta Ŝablŝtona Ŝtupo +Silver Sandstone Slab=Arĝenta Ŝablŝtona Plato +Silver Sandstone Brick Stair=Arĝenta Ŝablŝtona Brika Ŝtupo +Inner Silver Sandstone Brick Stair=Interna Arĝenta Ŝablŝtona Brika Ŝtupo +Outer Silver Sandstone Brick Stair=Ekstera Arĝenta Ŝablŝtona Brika Ŝtupo +Silver Sandstone Brick Slab=Arĝenta Ŝablŝtona Brika Plato +Silver Sandstone Block Stair=Arĝenta Ŝablŝtona Ŝtipa Ŝtupo +Inner Silver Sandstone Block Stair=Interna Arĝenta Ŝablŝtona Ŝtipa Ŝtupo +Outer Silver Sandstone Block Stair=Ekstera Arĝenta Ŝablŝtona Ŝtipa Ŝtupo +Silver Sandstone Block Slab=Arĝenta Ŝablŝtona Ŝtipa Plato +Obsidian Stair=Obsidiana Ŝtupo +Inner Obsidian Stair=Interna Obsidiana Ŝtupo +Outer Obsidian Stair=Ekstera Obsidiana Ŝtupo +Obsidian Slab=Obsidiana Plato +Obsidian Brick Stair=Obsidiana Brika Ŝtupo +Inner Obsidian Brick Stair=Interna Obsidiana Brika Ŝtupo +Outer Obsidian Brick Stair=Ekstera Obsidiana Brika Ŝtupo +Obsidian Brick Slab=Obsidiana Brika Plato +Obsidian Block Stair=Obsidiana Ŝtipa Ŝtupo +Inner Obsidian Block Stair=Interna Obsidiana Ŝtipa Ŝtupo +Outer Obsidian Block Stair=Ekstera Obsidiana Ŝtipa Ŝtupo +Obsidian Block Slab=Obsidiana Ŝtipa Plato +Brick Stair=Brika Ŝtupo +Inner Brick Stair=Interna Brika Ŝtupo +Outer Brick Stair=Ekstera Brika Ŝtupo +Brick Slab=Brika Plato +Steel Block Stair=Ŝtala Ŝtipa Ŝtupo +Inner Steel Block Stair=Interna Ŝtala Ŝtipa Ŝtupo +Outer Steel Block Stair=Ekstera Ŝtala Ŝtipa Ŝtupo +Steel Block Slab=Ŝtala Ŝtipa Plato +Tin Block Stair=Stana Ŝtipa Ŝtupo +Inner Tin Block Stair=Interna Stana Ŝtipa Ŝtupo +Outer Tin Block Stair=Ekstera Stana Ŝtipa Ŝtupo +Tin Block Slab=Stana Ŝtipa Plato +Copper Block Stair=Kupra Ŝtipa Ŝtupo +Inner Copper Block Stair=Interna Kupra Ŝtipa Ŝtupo +Outer Copper Block Stair=Ekstera Kupra Ŝtipa Ŝtupo +Copper Block Slab=Kupra Ŝtipa Plato +Bronze Block Stair=Bronza Ŝtipa Ŝtupo +Inner Bronze Block Stair=Interna Bronza Ŝtipa Ŝtupo +Outer Bronze Block Stair=Ekstera Bronza Ŝtipa Ŝtupo +Bronze Block Slab=Bronza Ŝtipa Plato +Gold Block Stair=Ora Ŝtipa Ŝtupo +Inner Gold Block Stair=Interna Ora Ŝtipa Ŝtupo +Outer Gold Block Stair=Ekstera Ora Ŝtipa Ŝtupo +Gold Block Slab=Ora Ŝtipa Plato +Ice Stair=Glacia Ŝtupo +Inner Ice Stair=Interna Glacia Ŝtupo +Outer Ice Stair=Ekstera Glacia Ŝtupo +Ice Slab=Glacia Plato +Snow Block Stair=Neĝa Ŝtipa Ŝtupo +Inner Snow Block Stair=Interna Neĝa Ŝtipa Ŝtupo +Outer Snow Block Stair=Ekstera Neĝa Ŝtipa Ŝtupo +Snow Block Slab=Neĝa Ŝtipa Plato diff --git a/mods/stairs/locale/stairs.es.tr b/mods/stairs/locale/stairs.es.tr new file mode 100644 index 00000000..374540c7 --- /dev/null +++ b/mods/stairs/locale/stairs.es.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalera de vidrio +Glass Slab=Losa de vidrio +Inner Glass Stair=Escalera interior de vidrio +Outer Glass Stair=Escalera exterior de vidrio +Obsidian Glass Stair=Escalera de vidrio de obsidiana +Obsidian Glass Slab=Losa de vidrio de obsidiana +Inner Obsidian Glass Stair=Escalera interior de vidrio de obsidiana +Outer Obsidian Glass Stair=Escalera exterior de vidrio de obsidiana +Wooden Stair=Escalera de madera +Inner Wooden Stair=Escalera interior de madera +Outer Wooden Stair=Escalera exterior de madera +Wooden Slab=Losa de madera +Jungle Wood Stair=Escalera de madera tropical +Inner Jungle Wood Stair=Escalera interior de madera tropical +Outer Jungle Wood Stair=Escalera exterior de madera tropical +Jungle Wood Slab=Losa de madera tropical +Pine Wood Stair=Escalera de pino +Inner Pine Wood Stair=Escalera interior de pino +Outer Pine Wood Stair=Escalera exterior de pino +Pine Wood Slab=Losa de pino +Acacia Wood Stair=Escalera de acacia +Inner Acacia Wood Stair=Escalera interior de acacia +Outer Acacia Wood Stair=Escalera exterior de acacia +Acacia Wood Slab=Losa de acacia +Aspen Wood Stair=Escalera de álamo +Inner Aspen Wood Stair=Escalera interior de álamo +Outer Aspen Wood Stair=Escalera exterior de álamo +Aspen Wood Slab=Losa de álamo +Stone Stair=Escalera de piedra +Inner Stone Stair=Escalera interior de piedra +Outer Stone Stair=Escalera exterior de piedra +Stone Slab=Losa de piedra +Cobblestone Stair=Escalera de adoquines +Inner Cobblestone Stair=Escalera interior de adoquines +Outer Cobblestone Stair=Escalera exterior de adoquines +Cobblestone Slab=Losa de adoquines +Mossy Cobblestone Stair=Escalera de adoquines musgosos +Inner Mossy Cobblestone Stair=Escalera interior de adoquines musgosos +Outer Mossy Cobblestone Stair=Escalera exterior de adoquines musgosos +Mossy Cobblestone Slab=Losa de adoquines musgosos +Stone Brick Stair=Escalera de ladrillos de piedra +Inner Stone Brick Stair=Escalera interior de ladrillos de piedra +Outer Stone Brick Stair=Escalera exterior de ladrillos de piedra +Stone Brick Slab=Losa de ladrillos de piedra +Stone Block Stair=Escalera de bloques de piedra +Inner Stone Block Stair=Escalera interior de bloques de piedra +Outer Stone Block Stair=Escalera exterior de bloques de piedra +Stone Block Slab=Losa de bloques de piedra +Desert Stone Stair=Escalera de piedra desértica +Inner Desert Stone Stair=Escalera interior de piedra desértica +Outer Desert Stone Stair=Escalera exterior de piedra desértica +Desert Stone Slab=Losa de piedra desértica +Desert Cobblestone Stair=Escalera de adoquines desérticos +Inner Desert Cobblestone Stair=Escalera interior de adoquines desérticos +Outer Desert Cobblestone Stair=Escalera exterior de adoquines desérticos +Desert Cobblestone Slab=Losa de adoquines desérticos +Desert Stone Brick Stair=Escalera de ladrillos desérticos +Inner Desert Stone Brick Stair=Escalera interior de ladrillos desérticos +Outer Desert Stone Brick Stair=Escalera exterior de ladrillos desérticos +Desert Stone Brick Slab=Losa de ladrillos desérticos +Desert Stone Block Stair=Escalera de bloques de piedra desértica +Inner Desert Stone Block Stair=Escalera interior de bloques de piedra desértica +Outer Desert Stone Block Stair=Escalera exterior de bloques de piedra desértica +Desert Stone Block Slab=Losa de bloques de piedra desértica +Sandstone Stair=Escalera de arenisca +Inner Sandstone Stair=Escalera interior de arenisca +Outer Sandstone Stair=Escalera exterior de arenisca +Sandstone Slab=Losa de arenisca +Sandstone Brick Stair=Escalera de ladrillos de arenisca +Inner Sandstone Brick Stair=Escalera interior de ladrillos de arenisca +Outer Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca +Sandstone Brick Slab=Losa de ladrillos de arenisca +Sandstone Block Stair=Escalera de bloques de arenisca +Inner Sandstone Block Stair=Escalera interior de bloques de arenisca +Outer Sandstone Block Stair=Escalera exterior de bloques de arenisca +Sandstone Block Slab=Losa de bloques de arenisca +Desert Sandstone Stair=Escalera de arenisca desértica +Inner Desert Sandstone Stair=Escalera interior de arenisca desértica +Outer Desert Sandstone Stair=Escalera exterior de arenisca desértica +Desert Sandstone Slab=Losa de arenisca desértica +Desert Sandstone Brick Stair=Escalera de ladrillos de arenisca desértica +Inner Desert Sandstone Brick Stair=Escalera interior de ladrillos de arenisca desértica +Outer Desert Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca desértica +Desert Sandstone Brick Slab=Losa de ladrillos de arenisca desértica +Desert Sandstone Block Stair=Escalera de bloques de arenisca desértica +Inner Desert Sandstone Block Stair=Escalera interior de bloques de arenisca desértica +Outer Desert Sandstone Block Stair=Escalera exterior de bloques de arenisca desértica +Desert Sandstone Block Slab=Losa de bloques de arenisca desértica +Silver Sandstone Stair=Escalera de arenisca plateada +Inner Silver Sandstone Stair=Escalera interior de arenisca plateada +Outer Silver Sandstone Stair=Escalera exterior de arenisca plateada +Silver Sandstone Slab=Losa de arenisca plateada +Silver Sandstone Brick Stair=Escalera de ladrillos de arenisca plateada +Inner Silver Sandstone Brick Stair=Escalera interior de ladrillos de arenisca plateada +Outer Silver Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca plateada +Silver Sandstone Brick Slab=Losa de ladrillos de arenisca plateada +Silver Sandstone Block Stair=Escalera de bloques de arenisca plateada +Inner Silver Sandstone Block Stair=Escalera interior de bloques de arenisca plateada +Outer Silver Sandstone Block Stair=Escalera exterior de bloques de arenisca plateada +Silver Sandstone Block Slab=Losa de bloques de arenisca plateada +Obsidian Stair=Escalera de obsidiana +Inner Obsidian Stair=Escalera interior de obsidiana +Outer Obsidian Stair=Escalera exterior de obsidiana +Obsidian Slab=Losa de obsidiana +Obsidian Brick Stair=Escalera de ladrillos de obsidiana +Inner Obsidian Brick Stair=Escalera interior de ladrillos de obsidiana +Outer Obsidian Brick Stair=Escalera exterior de ladrillos de obsidiana +Obsidian Brick Slab=Losa de ladrillos de obsidiana +Obsidian Block Stair=Escalera de bloques de obsidiana +Inner Obsidian Block Stair=Escalera interior de bloques de obsidiana +Outer Obsidian Block Stair=Escalera exterior de bloques de obsidiana +Obsidian Block Slab=Losa de bloques de obsidiana +Brick Stair=Escalera de ladrillos +Inner Brick Stair=Escalera interior de ladrillos +Outer Brick Stair=Escalera exterior de ladrillos +Brick Slab=Losa de ladrillos +Steel Block Stair=Escalera de acero +Inner Steel Block Stair=Escalera interior de acero +Outer Steel Block Stair=Escalera exterior de acero +Steel Block Slab=Losa de acero +Tin Block Stair=Escalera de estaño +Inner Tin Block Stair=Escalera interior de estaño +Outer Tin Block Stair=Escalera exterior de estaño +Tin Block Slab=Losa de estaño +Copper Block Stair=Escalera de cobre +Inner Copper Block Stair=Escalera interior de cobre +Outer Copper Block Stair=Escalera exterior de cobre +Copper Block Slab=Losa de cobre +Bronze Block Stair=Escalera de bronce +Inner Bronze Block Stair=Escalera interior de bronce +Outer Bronze Block Stair=Escalera exterior de bronce +Bronze Block Slab=Losa de bronce +Gold Block Stair=Escalera de oro +Inner Gold Block Stair=Escalera interior de oro +Outer Gold Block Stair=Escalera exterior de oro +Gold Block Slab=Losa de oro +Ice Stair=Escalera de hielo +Inner Ice Stair=Escalera interior de hielo +Outer Ice Stair=Escalera exterior de hielo +Ice Slab=Losa de hielo +Snow Block Stair=Escalera de nieve +Inner Snow Block Stair=Escalera interior de nieve +Outer Snow Block Stair=Escalera exterior de nieve +Snow Block Slab=Losa de nieve diff --git a/mods/stairs/locale/stairs.fr.tr b/mods/stairs/locale/stairs.fr.tr new file mode 100644 index 00000000..81b575e6 --- /dev/null +++ b/mods/stairs/locale/stairs.fr.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalier de verre +Glass Slab=Dalle de verre +Inner Glass Stair=Escalier intérieur de verre +Outer Glass Stair=Escalier extérieur de verre +Obsidian Glass Stair=Escalier de verre d'obsidienne +Obsidian Glass Slab=Dalle de verre d'obsidienne +Inner Obsidian Glass Stair=Escalier intérieur de verre d'obsidienne +Outer Obsidian Glass Stair=Escalier extérieur de verre d'obsidienne +Wooden Stair=Escalier en bois +Inner Wooden Stair=Escalier intérieur en bois +Outer Wooden Stair=Escalier extérieur en bois +Wooden Slab=Dalle de bois +Jungle Wood Stair=Escalier en bois de la jungle +Inner Jungle Wood Stair=Escalier intérieur en bois de la jungle +Outer Jungle Wood Stair=Escalier extérieur en bois de la jungle +Jungle Wood Slab=Dalle en bois de la jungle +Pine Wood Stair=Escalier en pin +Inner Pine Wood Stair=Escalier intérieur en pin +Outer Pine Wood Stair=Escalier extérieur en pin +Pine Wood Slab=Dalle en pin +Acacia Wood Stair=Escalier en acacia +Inner Acacia Wood Stair=Escalier intérieur en acacia +Outer Acacia Wood Stair=Escalier extérieur en acacia +Acacia Wood Slab=Dalle en acacia +Aspen Wood Stair=Escalier en tremble +Inner Aspen Wood Stair=Escalier intérieur en tremble +Outer Aspen Wood Stair=Escalier extérieur en tremble +Aspen Wood Slab=Dalle en tremble +Stone Stair=Escalier de pierre +Inner Stone Stair=Escalier intérieur de pierre +Outer Stone Stair=Escalier extérieur de pierre +Stone Slab=Dalle de pierre +Cobblestone Stair=Escalier en pavé +Inner Cobblestone Stair=Escalier intérieur en pavé +Outer Cobblestone Stair=Escalier extérieur en pavé +Cobblestone Slab=Dalle en pavé +Mossy Cobblestone Stair=Escalier en pavé moussu +Inner Mossy Cobblestone Stair=Escalier intérieur en pavé moussu +Outer Mossy Cobblestone Stair=Escalier extérieur en pavé moussu +Mossy Cobblestone Slab=Dalle en pavé moussu +Stone Brick Stair=Escalier en brique de pierre +Inner Stone Brick Stair=Escalier intérieur en brique de pierre +Outer Stone Brick Stair=Escalier extérieur en brique de pierre +Stone Brick Slab=Dalle en brique de pierre +Stone Block Stair=Escalier en bloc de pierre +Inner Stone Block Stair=Escalier intérieur en bloc de pierre +Outer Stone Block Stair=Escalier extérieur en bloc de pierre +Stone Block Slab=Dalle en bloc de pierre +Desert Stone Stair=Escalier en pierre du désert +Inner Desert Stone Stair=Escalier intérieur en pierre du désert +Outer Desert Stone Stair=Escalier extérieur en pierre du désert +Desert Stone Slab=Dalle en pierre du désert +Desert Cobblestone Stair=Escalier en pavé du désert +Inner Desert Cobblestone Stair=Escalier intérieur en pavé du désert +Outer Desert Cobblestone Stair=Escalier extérieur en pavé du désert +Desert Cobblestone Slab=Dalle en pavé du désert +Desert Stone Brick Stair=Escalier en brique de pierre du désert +Inner Desert Stone Brick Stair=Escalier intérieur en brique de pierre du désert +Outer Desert Stone Brick Stair=Escalier extérieur en brique de pierre du désert +Desert Stone Brick Slab=Dalle en brique de pierre du désert +Desert Stone Block Stair=Escalier en bloc de pierre du désert +Inner Desert Stone Block Stair=Escalier intérieur en bloc de pierre du désert +Outer Desert Stone Block Stair=Escalier extérieur en bloc de pierre du désert +Desert Stone Block Slab=Dalle en bloc de pierre du désert +Sandstone Stair=Escalier en grès +Inner Sandstone Stair=Escalier intérieur en grès +Outer Sandstone Stair=Escalier extérieur en grès +Sandstone Slab=Dalle en grès +Sandstone Brick Stair=Escalier en brique de grès +Inner Sandstone Brick Stair=Escalier intérieur en brique de grès +Outer Sandstone Brick Stair=Escalier extérieur en brique de grès +Sandstone Brick Slab=Dalle en brique de grès +Sandstone Block Stair=Escalier en bloc de grès +Inner Sandstone Block Stair=Escalier intérieur en bloc de grès +Outer Sandstone Block Stair=Escalier extérieur en bloc de grès +Sandstone Block Slab=Dalle en bloc de grès +Desert Sandstone Stair=Escalier en grès du désert +Inner Desert Sandstone Stair=Escalier intérieur en grès du désert +Outer Desert Sandstone Stair=Escalier extérieur en grès du désert +Desert Sandstone Slab=Dalle en grès du désert +Desert Sandstone Brick Stair=Escalier en brique de grès du désert +Inner Desert Sandstone Brick Stair=Escalier intérieur en brique de grès du désert +Outer Desert Sandstone Brick Stair=Escalier extérieur en brique de grès du désert +Desert Sandstone Brick Slab=Dalle en brique de grès du désert +Desert Sandstone Block Stair=Escalier en bloc de grès du désert +Inner Desert Sandstone Block Stair=Escalier intérieur en bloc de grès du désert +Outer Desert Sandstone Block Stair=Escalier extérieur en bloc de grès du désert +Desert Sandstone Block Slab=Dalle en bloc de grès du désert +Silver Sandstone Stair=Escalier en grès argenté +Inner Silver Sandstone Stair=Escalier intérieur en grès argenté +Outer Silver Sandstone Stair=Escalier extérieur en grès argenté +Silver Sandstone Slab=Dalle en grès argenté +Silver Sandstone Brick Stair=Escalier en brique de grès argenté +Inner Silver Sandstone Brick Stair=Escalier intérieur en brique de grès argenté +Outer Silver Sandstone Brick Stair=Escalier extérieur en brique de grès argenté +Silver Sandstone Brick Slab=Dalle en brique de grès argenté +Silver Sandstone Block Stair=Escalier en bloc de grès argenté +Inner Silver Sandstone Block Stair=Escalier intérieur en bloc de grès argenté +Outer Silver Sandstone Block Stair=Escalier extérieur en bloc de grès argenté +Silver Sandstone Block Slab=Dalle en bloc de grès argenté +Obsidian Stair=Escalier en obsidienne +Inner Obsidian Stair=Escalier intérieur en obsidienne +Outer Obsidian Stair=Escalier extérieur en obsidienne +Obsidian Slab=Dalle en obsidienne +Obsidian Brick Stair=Escalier en brique d'obsidienne +Inner Obsidian Brick Stair=Escalier intérieur en brique d'obsidienne +Outer Obsidian Brick Stair=Escalier extérieur en brique d'obsidienne +Obsidian Brick Slab=Dalle en brique d'obsidienne +Obsidian Block Stair=Escalier en bloc d'obsidienne +Inner Obsidian Block Stair=Escalier intérieur en bloc d'obsidienne +Outer Obsidian Block Stair=Escalier extérieur en bloc d'obsidienne +Obsidian Block Slab=Dalle en bloc d'obsidienne +Brick Stair=Escalier en brique +Inner Brick Stair=Escalier intérieur en brique +Outer Brick Stair=Escalier extérieur en brique +Brick Slab=Dalle en brique +Steel Block Stair=Escalier en acier +Inner Steel Block Stair=Escalier intérieur en acier +Outer Steel Block Stair=Escalier extérieur en acier +Steel Block Slab=Dalle en acier +Tin Block Stair=Escalier en bloc d'étain +Inner Tin Block Stair=Escalier intérieur en bloc d'étain +Outer Tin Block Stair=Escalier extérieur en bloc d'étain +Tin Block Slab=Dalle en bloc d'étain +Copper Block Stair=Escalier en bloc de cuivre +Inner Copper Block Stair=Escalier intérieur en bloc de cuivre +Outer Copper Block Stair=Escalier extérieur en bloc de cuivre +Copper Block Slab=Dalle en bloc de cuivre +Bronze Block Stair=Escalier en bronze +Inner Bronze Block Stair=Escalier intérieur en bronze +Outer Bronze Block Stair=Escalier extérieur en bronze +Bronze Block Slab=Dalle en bronze +Gold Block Stair=Escalier en bloc d'or +Inner Gold Block Stair=Escalier intérieur en bloc d'or +Outer Gold Block Stair=Escalier extérieur en bloc d'or +Gold Block Slab=Dalle en bloc d'or +Ice Stair=Escalier de glace +Inner Ice Stair=Escalier intérieur de glace +Outer Ice Stair=Escalier extérieur de glace +Ice Slab=Dalle de glace +Snow Block Stair=Escalier en bloc de neige +Inner Snow Block Stair=Escalier intérieur en bloc de neige +Outer Snow Block Stair=Escalier extérieur en bloc de neige +Snow Block Slab=Dalle en bloc de neige diff --git a/mods/stairs/locale/stairs.id.tr b/mods/stairs/locale/stairs.id.tr new file mode 100644 index 00000000..dbdfaa0f --- /dev/null +++ b/mods/stairs/locale/stairs.id.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Lempengan Kaca +Inner Glass Stair=Tangga Kaca Dalam +Outer Glass Stair=Tangga Kaca Luar +Obsidian Glass Stair=Tangga Kaca Obsidian +Obsidian Glass Slab=Lempengan Kaca Obsidian +Inner Obsidian Glass Stair=Tangga Kaca Obsidian Dalam +Outer Obsidian Glass Stair=Tangga Kaca Obsidian Luar +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalam +Outer Wooden Stair=Tangga Kayu Luar +Wooden Slab=Lempengan Kayu +Jungle Wood Stair=Tangga Kayu Rimba +Inner Jungle Wood Stair=Tangga Kayu Rimba Dalam +Outer Jungle Wood Stair=Tangga Kayu Rimba Luar +Jungle Wood Slab=Lempengan Kayu Rimba +Pine Wood Stair=Tangga Kayu Pinus +Inner Pine Wood Stair=Tangga Kayu Pinus Dalam +Outer Pine Wood Stair=Tangga Kayu Pinus Luar +Pine Wood Slab=Lempengan Kayu Pinus +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalam +Outer Acacia Wood Stair=Tangga Kayu Akasia Luar +Acacia Wood Slab=Lempengan Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalam +Outer Aspen Wood Stair=Tangga Kayu Aspen Luar +Aspen Wood Slab=Lempengan Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalam +Outer Stone Stair=Tangga Batu Luar +Stone Slab=Lempengan Batu +Cobblestone Stair=Tangga Bongkahan Batu +Inner Cobblestone Stair=Tangga Bongkahan Batu Dalam +Outer Cobblestone Stair=Tangga Bongkahan Batu Luar +Cobblestone Slab=Lempengan Bongkahan Batu +Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut +Inner Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Luar +Mossy Cobblestone Slab=Lempengan Bongkahan Batu Berlumut +Stone Brick Stair=Tangga Tembok Batu +Inner Stone Brick Stair=Tangga Tembok Batu Dalam +Outer Stone Brick Stair=Tangga Tembok Batu Luar +Stone Brick Slab=Lempengan Tembok Batu +Stone Block Stair=Tangga Balok Batu +Inner Stone Block Stair=Tangga Balok Batu Dalam +Outer Stone Block Stair=Tangga Balok Batu Luar +Stone Block Slab=Lempengan Balok Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalam +Outer Desert Stone Stair=Tangga Batu Gurun Luar +Desert Stone Slab=Lempengan Batu Gurun +Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun +Inner Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Dalam +Outer Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Luar +Desert Cobblestone Slab=Lempengan Bongkahan Batu Gurun +Desert Stone Brick Stair=Tangga Tembok Batu Gurun +Inner Desert Stone Brick Stair=Tangga Tembok Batu Gurun Dalam +Outer Desert Stone Brick Stair=Tangga Tembok Batu Gurun Luar +Desert Stone Brick Slab=Lempengan Tembok Batu Gurun +Desert Stone Block Stair=Tangga Balok Batu Gurun +Inner Desert Stone Block Stair=Tangga Balok Batu Gurun Dalam +Outer Desert Stone Block Stair=Tangga Balok Batu Gurun Luar +Desert Stone Block Slab=Lempengan Balok Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalam +Outer Sandstone Stair=Tangga Batu Pasir Luar +Sandstone Slab=Lempengan Batu Pasir +Sandstone Brick Stair=Tangga Tembok Batu Pasir +Inner Sandstone Brick Stair=Tangga Tembok Batu Pasir Dalam +Outer Sandstone Brick Stair=Tangga Tembok Batu Pasir Luar +Sandstone Brick Slab=Lempengan Tembok Batu Pasir +Sandstone Block Stair=Tangga Balok Batu Pasir +Inner Sandstone Block Stair=Tangga Balok Batu Pasir Dalam +Outer Sandstone Block Stair=Tangga Balok Batu Pasir Luar +Sandstone Block Slab=Lempengan Balok Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalam +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luar +Desert Sandstone Slab=Lempengan Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Dalam +Outer Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Luar +Desert Sandstone Brick Slab=Lempengan Tembok Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Dalam +Outer Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Luar +Desert Sandstone Block Slab=Lempengan Balok Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalam +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luar +Silver Sandstone Slab=Lempengan Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Dalam +Outer Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Luar +Silver Sandstone Brick Slab=Lempengan Tembok Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Dalam +Outer Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Luar +Silver Sandstone Block Slab=Lempengan Balok Batu Pasir Perak +Obsidian Stair=Tangga Obsidian +Inner Obsidian Stair=Tangga Obsidian Dalam +Outer Obsidian Stair=Tangga Obsidian Luar +Obsidian Slab=Lempengan Obsidian +Obsidian Brick Stair=Tangga Tembok Obsidian +Inner Obsidian Brick Stair=Tangga Tembok Obsidian Dalam +Outer Obsidian Brick Stair=Tangga Tembok Obsidian Luar +Obsidian Brick Slab=Lempengan Tembok Obsidian +Obsidian Block Stair=Tangga Balok Obsidian +Inner Obsidian Block Stair=Tangga Balok Obsidian Dalam +Outer Obsidian Block Stair=Tangga Balok Obsidian Luar +Obsidian Block Slab=Lempengan Balok Obsidian +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalam +Outer Brick Stair=Tangga Bata Luar +Brick Slab=Lempengan Bata +Steel Block Stair=Tangga Balok Baja +Inner Steel Block Stair=Tangga Balok Baja Dalam +Outer Steel Block Stair=Tangga Balok Baja Luar +Steel Block Slab=Lempengan Balok Baja +Tin Block Stair=Tangga Balok Timah +Inner Tin Block Stair=Tangga Balok Timah Dalam +Outer Tin Block Stair=Tangga Balok Timah Luar +Tin Block Slab=Lempengan Balok Timah +Copper Block Stair=Tangga Balok Tembaga +Inner Copper Block Stair=Tangga Balok Tembaga Dalam +Outer Copper Block Stair=Tangga Balok Tembaga Luar +Copper Block Slab=Lempengan Balok Tembaga +Bronze Block Stair=Tangga Balok Perunggu +Inner Bronze Block Stair=Tangga Balok Perunggu Dalam +Outer Bronze Block Stair=Tangga Balok Perunggu Luar +Bronze Block Slab=Lempengan Balok Perunggu +Gold Block Stair=Tangga Balok Emas +Inner Gold Block Stair=Tangga Balok Emas Dalam +Outer Gold Block Stair=Tangga Balok Emas Luar +Gold Block Slab=Lempengan Balok Emas +Ice Stair=Tangga Es +Inner Ice Stair=Tangga Es Dalam +Outer Ice Stair=Tangga Es Luar +Ice Slab=Lempengan Es +Snow Block Stair=Tangga Balok Salju +Inner Snow Block Stair=Tangga Balok Salju Dalam +Outer Snow Block Stair=Tangga Balok Salju Luar +Snow Block Slab=Lempengan Balok Salju diff --git a/mods/stairs/locale/stairs.it.tr b/mods/stairs/locale/stairs.it.tr new file mode 100644 index 00000000..16945ec6 --- /dev/null +++ b/mods/stairs/locale/stairs.it.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Scala di vetro +Glass Slab=Lastra di vetro +Inner Glass Stair=Scala di vetro interna +Outer Glass Stair=Scala di vetro esterna +Obsidian Glass Stair=Scala di vetro d'ossidiana +Obsidian Glass Slab=Lastra di vetro d'ossidiana +Inner Obsidian Glass Stair=Scala di vetro d'ossidiana interna +Outer Obsidian Glass Stair=Scala di vetro d'ossidiana esterna +Wooden Stair=Scala di legno +Inner Wooden Stair=Scala di legno interna +Outer Wooden Stair=Scala di legno esterna +Wooden Slab=Lastra di legno +Jungle Wood Stair=Scala di legno della giungla +Inner Jungle Wood Stair=Scala di legno della giungla interna +Outer Jungle Wood Stair=Scala di legno della giungla esterna +Jungle Wood Slab=Lastra di legno della giungla +Pine Wood Stair=Scala di legno di pino +Inner Pine Wood Stair=Scala di legno di pino interna +Outer Pine Wood Stair=Scala di legno di pino esterna +Pine Wood Slab=Lastra di legno di pino +Acacia Wood Stair=Scala di legno d'acacia +Inner Acacia Wood Stair=Scala di legno d'acacia interna +Outer Acacia Wood Stair=Scala di legno d'acacia esterna +Acacia Wood Slab=Lastra di legno d'acacia +Aspen Wood Stair=Scala di legno di pioppo +Inner Aspen Wood Stair=Scala di legno di pioppo interna +Outer Aspen Wood Stair=Scala di legno di pioppo esterna +Aspen Wood Slab=Lastra di legno di pioppo +Stone Stair=Scala di pietra +Inner Stone Stair=Scala di pietra interna +Outer Stone Stair=Scala di pietra esterna +Stone Slab=Lastra di pietra +Cobblestone Stair=Scala di ciottoli +Inner Cobblestone Stair=Scala di ciottoli interna +Outer Cobblestone Stair=Scala di ciottoli esterna +Cobblestone Slab=Lastra di ciottoli +Mossy Cobblestone Stair=Scala di ciottoli muschiosi +Inner Mossy Cobblestone Stair=Scala di ciottoli muschiosi interna +Outer Mossy Cobblestone Stair=Scala di ciottoli muschiosi esterna +Mossy Cobblestone Slab=Lastra di ciottoli muschiosi +Stone Brick Stair=Scala di mattone di pietra +Inner Stone Brick Stair=Scala di mattone di pietra interna +Outer Stone Brick Stair=Scala di mattone di pietra esterna +Stone Brick Slab=Lastra di mattone di pietra +Stone Block Stair=Scala di blocco di pietra +Inner Stone Block Stair=Scala di blocco di pietra interna +Outer Stone Block Stair=Scala di blocco di pietra esterna +Stone Block Slab=Lastra di blocco di pietra +Desert Stone Stair=Scala di pietra del deserto +Inner Desert Stone Stair=Scala di pietra del deserto interna +Outer Desert Stone Stair=Scala di pietra del deserto esterna +Desert Stone Slab=Lastra di pietra del deserto +Desert Cobblestone Stair=Scala di ciottoli del deserto +Inner Desert Cobblestone Stair=Scala di ciottoli del deserto interna +Outer Desert Cobblestone Stair=Scala di ciottoli del deserto esterna +Desert Cobblestone Slab=Lastra di ciottoli del deserto +Desert Stone Brick Stair=Scala di mattone di pietra del deserto +Inner Desert Stone Brick Stair=Scala di mattone di pietra del deserto interna +Outer Desert Stone Brick Stair=Scala di mattone di pietra del deserto esterna +Desert Stone Brick Slab=Lastra di mattone di pietra del deserto +Desert Stone Block Stair=Scala di blocco di pietra del deserto +Inner Desert Stone Block Stair=Scala di blocco di pietra del deserto interna +Outer Desert Stone Block Stair=Scala di blocco di pietra del deserto esterna +Desert Stone Block Slab=Lastra di blocco di pietra del deserto +Sandstone Stair=Scala d'arenaria +Inner Sandstone Stair=Scala d'arenaria interna +Outer Sandstone Stair=Scala d'arenaria esterna +Sandstone Slab=Lastra d'arenaria +Sandstone Brick Stair=Scala di mattone d'arenaria +Inner Sandstone Brick Stair=Scala di mattone d'arenaria interna +Outer Sandstone Brick Stair=Scala di mattone d'arenaria esterna +Sandstone Brick Slab=Lastra di mattone d'arenaria +Sandstone Block Stair=Scala di blocco d'arenaria +Inner Sandstone Block Stair=Scala di blocco d'arenaria interna +Outer Sandstone Block Stair=Scala di blocco d'arenaria esterna +Sandstone Block Slab=Lastra di blocco d'arenaria +Desert Sandstone Stair=Scala d'arenaria del deserto +Inner Desert Sandstone Stair=Scala d'arenaria del deserto interna +Outer Desert Sandstone Stair=Scala d'arenaria del deserto esterna +Desert Sandstone Slab=Lastra d'arenaria del deserto +Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto +Inner Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto interna +Outer Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto esterna +Desert Sandstone Brick Slab=Lastra di mattone d'arenaria del deserto +Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto +Inner Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto interna +Outer Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto esterna +Desert Sandstone Block Slab=Lastra di blocco d'arenaria del deserto +Silver Sandstone Stair=Scala d'arenaria argentata +Inner Silver Sandstone Stair=Scala d'arenaria argentata interna +Outer Silver Sandstone Stair=Scala d'arenaria argentata esterna +Silver Sandstone Slab=Lastra d'arenaria argentata +Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata +Inner Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata interna +Outer Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata esterna +Silver Sandstone Brick Slab=Lastra di mattone d'arenaria argentata +Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata +Inner Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata interna +Outer Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata esterna +Silver Sandstone Block Slab=Lastra di blocco d'arenaria argentata +Obsidian Stair=Scala d'ossidiana +Inner Obsidian Stair=Scala d'ossidiana interna +Outer Obsidian Stair=Scala d'ossidiana esterna +Obsidian Slab=Lastra d'ossidiana +Obsidian Brick Stair=Scala di mattone d'ossidiana +Inner Obsidian Brick Stair=Scala di mattone d'ossidiana interna +Outer Obsidian Brick Stair=Scala di mattone d'ossidiana esterna +Obsidian Brick Slab=Lastra di mattone d'ossidiana +Obsidian Block Stair=Scala di blocco d'ossidiana +Inner Obsidian Block Stair=Scala di blocco d'ossidiana interna +Outer Obsidian Block Stair=Scala di blocco d'ossidiana esterna +Obsidian Block Slab=Lastra di blocco d'ossidiana +Brick Stair=Scala di mattone +Inner Brick Stair=Scala di mattone interna +Outer Brick Stair=Scala di mattone esterna +Brick Slab=Lastra di mattone +Steel Block Stair=Scala di blocco d'acciaio +Inner Steel Block Stair=Scala di blocco d'acciaio interna +Outer Steel Block Stair=Scala di blocco d'acciaio esterna +Steel Block Slab=Lastra di blocco d'acciaio +Tin Block Stair=Scala di blocco di stagno +Inner Tin Block Stair=Scala di blocco di stagno interna +Outer Tin Block Stair=Scala di blocco di stagno esterna +Tin Block Slab=Lastra di blocco di stagno +Copper Block Stair=Scala di blocco di rame +Inner Copper Block Stair=Scala di blocco di rame interna +Outer Copper Block Stair=Scala di blocco di rame esterna +Copper Block Slab=Lastra di blocco di rame +Bronze Block Stair=Scala di blocco di bronzo +Inner Bronze Block Stair=Scala di blocco di bronzo interna +Outer Bronze Block Stair=Scala di blocco di bronzo esterna +Bronze Block Slab=Lastra di blocco di bronzo +Gold Block Stair=Scala di blocco d'oro +Inner Gold Block Stair=Scala di blocco d'oro interna +Outer Gold Block Stair=Scala di blocco d'oro esterna +Gold Block Slab=Lastra di blocco d'oro +Ice Stair=Scala di ghiaccio +Inner Ice Stair=Scala di ghiaccio interna +Outer Ice Stair=Scala di ghiaccio esterna +Ice Slab=Lastra di ghiaccio +Snow Block Stair=Scala di blocco di neve +Inner Snow Block Stair=Scala di blocco di neve interna +Outer Snow Block Stair=Scala di blocco di neve esterna +Snow Block Slab=Lastra di blocco di neve diff --git a/mods/stairs/locale/stairs.ja.tr b/mods/stairs/locale/stairs.ja.tr new file mode 100644 index 00000000..02576cd6 --- /dev/null +++ b/mods/stairs/locale/stairs.ja.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=ガラスの階段 +Glass Slab=ガラスの厚板 +Inner Glass Stair=ガラスの凹階段 +Outer Glass Stair=ガラスの凸階段 +Obsidian Glass Stair=黒曜石ガラスの階段 +Obsidian Glass Slab=黒曜石ガラスの厚板 +Inner Obsidian Glass Stair=黒曜石ガラスの凹階段 +Outer Obsidian Glass Stair=黒曜石ガラスの凸階段 +Wooden Stair=木製の階段 +Inner Wooden Stair=木製の凹階段 +Outer Wooden Stair=木製の凸階段 +Wooden Slab=木製の厚板 +Jungle Wood Stair=ジャングル材の階段 +Inner Jungle Wood Stair=ジャングル材の凹階段 +Outer Jungle Wood Stair=ジャングル材の凸階段 +Jungle Wood Slab=ジャングル材の厚板 +Pine Wood Stair=マツ材の階段 +Inner Pine Wood Stair=マツ材の凹階段 +Outer Pine Wood Stair=マツ材の凸階段 +Pine Wood Slab=マツ材の厚板 +Acacia Wood Stair=アカシア材の階段 +Inner Acacia Wood Stair=アカシア材の凹階段 +Outer Acacia Wood Stair=アカシア材の凸階段 +Acacia Wood Slab=アカシア材の厚板 +Aspen Wood Stair=ポプラ材の階段 +Inner Aspen Wood Stair=ポプラ材の凹階段 +Outer Aspen Wood Stair=ポプラ材の凸階段 +Aspen Wood Slab=ポプラ材の厚板 +Stone Stair=石の階段 +Inner Stone Stair=石の凹階段 +Outer Stone Stair=石の凸階段 +Stone Slab=石の厚板 +Cobblestone Stair=丸石の階段 +Inner Cobblestone Stair=丸石の凹階段 +Outer Cobblestone Stair=丸石の凸階段 +Cobblestone Slab=丸石の厚板 +Mossy Cobblestone Stair=苔むした丸石の階段 +Inner Mossy Cobblestone Stair=苔むした丸石の凹階段 +Outer Mossy Cobblestone Stair=苔むした丸石の凸階段 +Mossy Cobblestone Slab=苔むした丸石の厚板 +Stone Brick Stair=石レンガの階段 +Inner Stone Brick Stair=石レンガの凹階段 +Outer Stone Brick Stair=石レンガの凸階段 +Stone Brick Slab=石レンガの厚板 +Stone Block Stair=石ブロックの階段 +Inner Stone Block Stair=石ブロックの凹階段 +Outer Stone Block Stair=石ブロックの凸階段 +Stone Block Slab=石ブロックの厚板 +Desert Stone Stair=砂漠の石の階段 +Inner Desert Stone Stair=砂漠の石の凹階段 +Outer Desert Stone Stair=砂漠の石の凸階段 +Desert Stone Slab=砂漠の石の厚板 +Desert Cobblestone Stair=砂漠の丸石の階段 +Inner Desert Cobblestone Stair=砂漠の丸石の凹階段 +Outer Desert Cobblestone Stair=砂漠の丸石の凸階段 +Desert Cobblestone Slab=砂漠の丸石の厚板 +Desert Stone Brick Stair=砂漠の石レンガの階段 +Inner Desert Stone Brick Stair=砂漠の石レンガの凹階段 +Outer Desert Stone Brick Stair=砂漠の石レンガの凸階段 +Desert Stone Brick Slab=砂漠の石レンガの厚板 +Desert Stone Block Stair=砂漠の石ブロックの階段 +Inner Desert Stone Block Stair=砂漠の石ブロックの凹階段 +Outer Desert Stone Block Stair=砂漠の石ブロックの凸階段 +Desert Stone Block Slab=砂漠の石ブロックの厚板 +Sandstone Stair=砂岩の階段 +Inner Sandstone Stair=砂岩の凹階段 +Outer Sandstone Stair=砂岩の凸階段 +Sandstone Slab=砂岩の厚板 +Sandstone Brick Stair=砂岩レンガの階段 +Inner Sandstone Brick Stair=砂岩レンガの凹階段 +Outer Sandstone Brick Stair=砂岩レンガの凸階段 +Sandstone Brick Slab=砂岩レンガの厚板 +Sandstone Block Stair=砂岩ブロックの階段 +Inner Sandstone Block Stair=砂岩ブロックの凹階段 +Outer Sandstone Block Stair=砂岩ブロックの凸階段 +Sandstone Block Slab=砂岩ブロックの厚板 +Desert Sandstone Stair=砂漠の砂岩の階段 +Inner Desert Sandstone Stair=砂漠の砂岩の凹階段 +Outer Desert Sandstone Stair=砂漠の砂岩の凸階段 +Desert Sandstone Slab=砂漠の砂岩の厚板 +Desert Sandstone Brick Stair=砂漠の砂岩レンガの階段 +Inner Desert Sandstone Brick Stair=砂漠の砂岩レンガの凹階段 +Outer Desert Sandstone Brick Stair=砂漠の砂岩レンガの凸階段 +Desert Sandstone Brick Slab=砂漠の砂岩レンガの厚板 +Desert Sandstone Block Stair=砂漠の砂岩ブロックの階段 +Inner Desert Sandstone Block Stair=砂漠の砂岩ブロックの凹階段 +Outer Desert Sandstone Block Stair=砂漠の砂岩ブロックの凸階段 +Desert Sandstone Block Slab=砂漠の砂岩ブロックの厚板 +Silver Sandstone Stair=銀色の砂岩の階段 +Inner Silver Sandstone Stair=銀色の砂岩の凹階段 +Outer Silver Sandstone Stair=銀色の砂岩の凸階段 +Silver Sandstone Slab=銀色の砂岩の厚板 +Silver Sandstone Brick Stair=銀色の砂岩レンガの階段 +Inner Silver Sandstone Brick Stair=銀色の砂岩レンガの凹階段 +Outer Silver Sandstone Brick Stair=銀色の砂岩レンガの凸階段 +Silver Sandstone Brick Slab=銀色の砂岩レンガの厚板 +Silver Sandstone Block Stair=銀色の砂岩ブロックの階段 +Inner Silver Sandstone Block Stair=銀色の砂岩ブロックの凹階段 +Outer Silver Sandstone Block Stair=銀色の砂岩ブロックの凸階段 +Silver Sandstone Block Slab=銀色の砂岩ブロックの厚板 +Obsidian Stair=黒曜石の階段 +Inner Obsidian Stair=黒曜石の凹階段 +Outer Obsidian Stair=黒曜石の凸階段 +Obsidian Slab=黒曜石の厚板 +Obsidian Brick Stair=黒曜石レンガの階段 +Inner Obsidian Brick Stair=黒曜石レンガの凹階段 +Outer Obsidian Brick Stair=黒曜石レンガの凸階段 +Obsidian Brick Slab=黒曜石レンガの厚板 +Obsidian Block Stair=黒曜石ブロックの階段 +Inner Obsidian Block Stair=黒曜石ブロックの凹階段 +Outer Obsidian Block Stair=黒曜石ブロックの凸階段 +Obsidian Block Slab=黒曜石ブロックの厚板 +Brick Stair=レンガの階段 +Inner Brick Stair=レンガの凹階段 +Outer Brick Stair=レンガの凸階段 +Brick Slab=レンガの厚板 +Steel Block Stair=鉄ブロックの階段 +Inner Steel Block Stair=鉄ブロックの凹階段 +Outer Steel Block Stair=鉄ブロックの凸階段 +Steel Block Slab=鉄ブロックの厚板 +Tin Block Stair=スズの階段 +Inner Tin Block Stair=スズの凹階段 +Outer Tin Block Stair=スズの凸階段 +Tin Block Slab=スズの厚板 +Copper Block Stair=銅ブロックの階段 +Inner Copper Block Stair=銅ブロックの凹階段 +Outer Copper Block Stair=銅ブロックの凸階段 +Copper Block Slab=銅ブロックの厚板 +Bronze Block Stair=青銅ブロックの階段 +Inner Bronze Block Stair=青銅ブロックの凹階段 +Outer Bronze Block Stair=青銅ブロックの凸階段 +Bronze Block Slab=青銅ブロックの厚板 +Gold Block Stair=金ブロックの階段 +Inner Gold Block Stair=金ブロックの凹階段 +Outer Gold Block Stair=金ブロックの凸階段 +Gold Block Slab=金ブロックの厚板 +Ice Stair=氷の階段 +Inner Ice Stair=氷の凹階段 +Outer Ice Stair=氷の凸階段 +Ice Slab=氷の厚板 +Snow Block Stair=雪の階段 +Inner Snow Block Stair=雪の凹階段 +Outer Snow Block Stair=雪の凸階段 +Snow Block Slab=雪の厚板 diff --git a/mods/stairs/locale/stairs.jbo.tr b/mods/stairs/locale/stairs.jbo.tr new file mode 100644 index 00000000..91d28060 --- /dev/null +++ b/mods/stairs/locale/stairs.jbo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=lo blaci serti +Glass Slab=lo blaci xadba bliku +Inner Glass Stair=lo zo'i blaci serti +Outer Glass Stair=lo ze'o blaci serti +Obsidian Glass Stair=lo je'erma'ablaci blaci serti +Obsidian Glass Slab=lo je'erma'ablaci blaci ke xadba bliku +Inner Obsidian Glass Stair=lo zo'i je'erma'ablaci blaci serti +Outer Obsidian Glass Stair=lo ze'o je'erma'ablaci blaci serti +Wooden Stair=lo mudri serti +Inner Wooden Stair=lo zo'i mudri serti +Outer Wooden Stair=lo ze'o mudri serti +Wooden Slab=lo mudri ke xadba bliku +Jungle Wood Stair=lo glatimdemricfoi mudri serti +Inner Jungle Wood Stair=lo zo'i glatimdemricfoi mudri serti +Outer Jungle Wood Stair=lo ze'o glatimdemricfoi mudri serti +Jungle Wood Slab=lo glatimdemricfoi mudri ke xadba bliku +Pine Wood Stair=lo ku'urmudri serti +Inner Pine Wood Stair=lo zo'i ku'urmudri serti +Outer Pine Wood Stair=lo ze'o ku'urmudri serti +Pine Wood Slab=lo ku'urmudri ke xadba bliku +Acacia Wood Stair=lo atkaci,ia mudri serti +Inner Acacia Wood Stair=lo zo'i atkaci,ia mudri serti +Outer Acacia Wood Stair=lo ze'o atkaci,ia mudri serti +Acacia Wood Slab=lo atkaci,ia mudri ke xadba bliku +Aspen Wood Stair=lo mudrpopulu serti +Inner Aspen Wood Stair=lo zo'i mudrpopulu serti +Outer Aspen Wood Stair=lo ze'o mudrpopulu serti +Aspen Wood Slab=lo mudrpopulu ke xadba bliku +Stone Stair=lo rokci serti +Inner Stone Stair=lo zo'i rokci serti +Outer Stone Stair=lo ze'o rokci serti +Stone Slab=lo rokci ke xadba bliku +Cobblestone Stair=lo lolro'iboi serti +Inner Cobblestone Stair=lo zo'i lolro'iboi serti +Outer Cobblestone Stair=lo ze'o lolro'iboi serti +Cobblestone Slab=lo lolro'iboi xadba bliku +Mossy Cobblestone Stair=lo clika lolro'iboi serti +Inner Mossy Cobblestone Stair=lo zo'i clika lolro'iboi serti +Outer Mossy Cobblestone Stair=lo ze'o clika lolro'iboi serti +Mossy Cobblestone Slab=lo clika lolro'iboi ke xadba bliku +Stone Brick Stair=lo morna rokci serti +Inner Stone Brick Stair=lo zo'i morna rokci serti +Outer Stone Brick Stair=lo ze'o morna rokci serti +Stone Brick Slab=lo morna rokci ke xadba bliku +Stone Block Stair=lo rokci bliku serti +Inner Stone Block Stair=lo zo'i rokci bliku serti +Outer Stone Block Stair=lo ze'o rokci bliku serti +Stone Block Slab=lo rokci bliku ke xadba bliku +Desert Stone Stair=lo cantu'a rokci serti +Inner Desert Stone Stair=lo zo'i cantu'a rokci serti +Outer Desert Stone Stair=lo ze'o cantu'a rokci serti +Desert Stone Slab=lo cantu'a rokci ke xadba bliku +Desert Cobblestone Stair=lo cantu'a lolro'iboi serti +Inner Desert Cobblestone Stair=lo zo'i cantu'a lolro'iboi serti +Outer Desert Cobblestone Stair=lo ze'o cantu'a lolro'iboi serti +Desert Cobblestone Slab=lo cantu'a lolro'iboi ke xadba bliku +Desert Stone Brick Stair=lo morna ke cantu'a rokci serti +Inner Desert Stone Brick Stair=lo zo'i morna ke cantu'a rokci serti +Outer Desert Stone Brick Stair=lo ze'o morna ke cantu'a rokci serti +Desert Stone Brick Slab=lo morna ke cantu'a rokci ke xadba bliku +Desert Stone Block Stair=lo cantu'a rokci bliku serti +Inner Desert Stone Block Stair=lo zo'i cantu'a rokci bliku serti +Outer Desert Stone Block Stair=lo ze'o cantu'a rokci bliku serti +Desert Stone Block Slab=lo cantu'a rokci bliku ke xadba bliku +Sandstone Stair=lo canro'i serti +Inner Sandstone Stair=lo zo'i canro'i serti +Outer Sandstone Stair=lo ze'o canro'i serti +Sandstone Slab=lo canro'i ke xadba bliku +Sandstone Brick Stair=lo morna ke canro'i serti +Inner Sandstone Brick Stair=lo zo'i morna ke canro'i serti +Outer Sandstone Brick Stair=lo ze'o morna ke canro'i serti +Sandstone Brick Slab=lo morna canro'i ke xadba bliku +Sandstone Block Stair=lo canro'i bliku serti +Inner Sandstone Block Stair=lo zo'i canro'i bliku serti +Outer Sandstone Block Stair=lo ze'o canro'i bliku serti +Sandstone Block Slab=lo canro'i bliku ke xadba bliku +Desert Sandstone Stair=lo cantu'a canro'i serti +Inner Desert Sandstone Stair=lo zo'i cantu'a canro'i serti +Outer Desert Sandstone Stair=lo ze'o cantu'a canro'i serti +Desert Sandstone Slab=lo cantu'a canro'i ke xadba bliku +Desert Sandstone Brick Stair=lo morna ke cantu'a canro'i serti +Inner Desert Sandstone Brick Stair=lo zo'i morna ke cantu'a canro'i serti +Outer Desert Sandstone Brick Stair=lo ze'o morna ke cantu'a canro'i serti +Desert Sandstone Brick Slab=lo morna ke cantu'a canro'i ke xadba bliku +Desert Sandstone Block Stair=lo cantu'a canro'i bliku serti +Inner Desert Sandstone Block Stair=lo zo'i cantu'a canro'i bliku serti +Outer Desert Sandstone Block Stair=lo ze'o cantu'a canro'i bliku serti +Desert Sandstone Block Slab=lo cantu'a canro'i ke xadba bliku +Silver Sandstone Stair=lo rijyska canro'i serti +Inner Silver Sandstone Stair=lo zo'i rijyska canro'i serti +Outer Silver Sandstone Stair=lo ze'o rijyska canro'i serti +Silver Sandstone Slab=lo rijyska canro'i ke xadba bliku +Silver Sandstone Brick Stair=lo morna ke rijyska canro'i serti +Inner Silver Sandstone Brick Stair=lo zo'i morna ke rijyska canro'i serti +Outer Silver Sandstone Brick Stair=lo ze'o morna ke rijyska canro'i serti +Silver Sandstone Brick Slab=lo morna ke rijyska canro'i ke xadba bliku +Silver Sandstone Block Stair=lo rijyska canro'i bliku serti +Inner Silver Sandstone Block Stair=lo zo'i rijyska canro'i bliku serti +Outer Silver Sandstone Block Stair=lo ze'o rijyska canro'i bliku serti +Silver Sandstone Block Slab=lo rijyska canro'i bliku ke xadba bliku +Obsidian Stair=lo je'erma'ablaci serti +Inner Obsidian Stair=lo zo'i je'erma'ablaci serti +Outer Obsidian Stair=lo ze'o je'erma'ablaci serti +Obsidian Slab=lo je'erma'ablaci ke xadba bliku +Obsidian Brick Stair=lo morna ke je'erma'ablaci serti +Inner Obsidian Brick Stair=lo zo'i morna ke je'erma'ablaci serti +Outer Obsidian Brick Stair=lo ze'o morna ke je'erma'ablaci serti +Obsidian Brick Slab=lo morna je'erma'ablaci ke xadba bliku +Obsidian Block Stair=lo je'erma'ablaci bliku serti +Inner Obsidian Block Stair=lo zo'i je'erma'ablaci bliku serti +Outer Obsidian Block Stair=lo ze'o je'erma'ablaci bliku serti +Obsidian Block Slab=lo je'erma'ablaci bliku ke xadba bliku +Brick Stair=lo kitybli serti +Inner Brick Stair=lo zo'i kitybli serti +Outer Brick Stair=lo ze'o kitybli serti +Brick Slab=lo kitybli xadba bliku +Steel Block Stair=lo gasta bliku serti +Inner Steel Block Stair=lo zo'i gasta bliku serti +Outer Steel Block Stair=lo ze'o gasta bliku serti +Steel Block Slab=lo gasta bliku ke xadba bliku +Tin Block Stair=lo tinci bliku serti +Inner Tin Block Stair=lo zo'i tinci bliku serti +Outer Tin Block Stair=lo ze'o tinci bliku serti +Tin Block Slab=lo tinci bliku ke xadba bliku +Copper Block Stair=lo tunka bliku serti +Inner Copper Block Stair=lo zo'i tunka bliku serti +Outer Copper Block Stair=lo ze'o tunka bliku serti +Copper Block Slab=lo tunka xadba bliku +Bronze Block Stair=lo ransu bliku serti +Inner Bronze Block Stair=lo zo'i ransu bliku serti +Outer Bronze Block Stair=lo ze'o ransu bliku serti +Bronze Block Slab=lo ransu xadba bliku +Gold Block Stair=lo solji bliku serti +Inner Gold Block Stair=lo zo'i solji bliku serti +Outer Gold Block Stair=lo ze'o solji bliku serti +Gold Block Slab=lo solji bliku ke xadba bliku +Ice Stair=lo bisli serti +Inner Ice Stair=lo zo'i bisli serti +Outer Ice Stair=lo ze'o bisli serti +Ice Slab=lo bisli ke xadba bliku +Snow Block Stair=lo snime bliku serti +Inner Snow Block Stair=lo zo'i snime bliku serti +Outer Snow Block Stair=lo ze'o snime bliku serti +Snow Block Slab=lo snime bliku ke xadba bliku diff --git a/mods/stairs/locale/stairs.ms.tr b/mods/stairs/locale/stairs.ms.tr new file mode 100644 index 00000000..a39c7f63 --- /dev/null +++ b/mods/stairs/locale/stairs.ms.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Papak Kaca +Inner Glass Stair=Tangga Kaca Dalaman +Outer Glass Stair=Tangga Kaca Luaran +Obsidian Glass Stair=Tangga Obsidia +Obsidian Glass Slab=Papak Obsidia +Inner Obsidian Glass Stair=Tangga Obsidia Dalaman +Outer Obsidian Glass Stair=Tangga Obsidia Luaran +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalaman +Outer Wooden Stair=Tangga Kayu Luaran +Wooden Slab=Papak Kayu +Jungle Wood Stair=Tangga Kayu Hutan +Inner Jungle Wood Stair=Tangga Kayu Hutan Dalaman +Outer Jungle Wood Stair=Tangga Kayu Hutan Luaran +Jungle Wood Slab=Papak Kayu Hutan +Pine Wood Stair=Tangga Kayu Pain +Inner Pine Wood Stair=Tangga Kayu Pain Dalaman +Outer Pine Wood Stair=Tangga Kayu Pain Luaran +Pine Wood Slab=Papak Kayu Pain +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalaman +Outer Acacia Wood Stair=Tangga Kayu Akasia Luaran +Acacia Wood Slab=Papak Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalaman +Outer Aspen Wood Stair=Tangga Kayu Aspen Luaran +Aspen Wood Slab=Papak Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalaman +Outer Stone Stair=Tangga Batu Luaran +Stone Slab=Papak Batu +Cobblestone Stair=Tangga Batu Buntar +Inner Cobblestone Stair=Tangga Batu Buntar Dalaman +Outer Cobblestone Stair=Tangga Batu Buntar Luaran +Cobblestone Slab=Papak Batu Buntar +Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut +Inner Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Dalaman +Outer Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Luaran +Mossy Cobblestone Slab=Papak Batu Buntar Berlumut +Stone Brick Stair=Tangga Bata Batu +Inner Stone Brick Stair=Tangga Bata Batu Dalaman +Outer Stone Brick Stair=Tangga Bata Batu Luaran +Stone Brick Slab=Papak Bata Batu +Stone Block Stair=Tangga Bongkah Batu +Inner Stone Block Stair=Tangga Bongkah Batu Dalaman +Outer Stone Block Stair=Tangga Bongkah Batu Luaran +Stone Block Slab=Papak Bongkah Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalaman +Outer Desert Stone Stair=Tangga Batu Gurun Luaran +Desert Stone Slab=Papak Batu Gurun +Desert Cobblestone Stair=Tangga Batu Buntar Gurun +Inner Desert Cobblestone Stair=Tangga Batu Buntar Gurun Dalaman +Outer Desert Cobblestone Stair=Tangga Batu Buntar Gurun Luaran +Desert Cobblestone Slab=Papak Batu Buntar Gurun +Desert Stone Brick Stair=Tangga Bata Batu Gurun +Inner Desert Stone Brick Stair=Tangga Bata Batu Gurun Dalaman +Outer Desert Stone Brick Stair=Tangga Bata Batu Gurun Luaran +Desert Stone Brick Slab=Papak Bata Batu Gurun +Desert Stone Block Stair=Tangga Bongkah Batu Gurun +Inner Desert Stone Block Stair=Tangga Bongkah Batu Gurun Dalaman +Outer Desert Stone Block Stair=Tangga Bongkah Batu Gurun Luaran +Desert Stone Block Slab=Papak Bongkah Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalaman +Outer Sandstone Stair=Tangga Batu Pasir Luaran +Sandstone Slab=Papak Batu Pasir +Sandstone Brick Stair=Tangga Bata Batu Pasir +Inner Sandstone Brick Stair=Tangga Bata Batu Pasir Dalaman +Outer Sandstone Brick Stair=Tangga Bata Batu Pasir Luaran +Sandstone Brick Slab=Papak Bata Batu Pasir +Sandstone Block Stair=Tangga Bongkah Batu Pasir +Inner Sandstone Block Stair=Tangga Bongkah Batu Pasir Dalaman +Outer Sandstone Block Stair=Tangga Bongkah Batu Pasir Luaran +Sandstone Block Slab=Papak Bongkah Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalaman +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luaran +Desert Sandstone Slab=Papak Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Dalaman +Outer Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Luaran +Desert Sandstone Brick Slab=Papak Bata Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Dalaman +Outer Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Luaran +Desert Sandstone Block Slab=Papak Bongkah Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalaman +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luaran +Silver Sandstone Slab=Papak Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Dalaman +Outer Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Luaran +Silver Sandstone Brick Slab=Papak Bata Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Dalaman +Outer Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Luaran +Silver Sandstone Block Slab=Papak Bongkah Batu Pasir Perak +Obsidian Stair=Tangga Obsidia +Inner Obsidian Stair=Tangga Obsidia Dalaman +Outer Obsidian Stair=Tangga Obsidia Luaran +Obsidian Slab=Papak Obsidia +Obsidian Brick Stair=Tangga Bata Obsidia +Inner Obsidian Brick Stair=Tangga Bata Obsidia Dalaman +Outer Obsidian Brick Stair=Tangga Bata Obsidia Luaran +Obsidian Brick Slab=Papak Bata Obsidia +Obsidian Block Stair=Tangga Bongkah Obsidia +Inner Obsidian Block Stair=Tangga Bongkah Obsidia Dalaman +Outer Obsidian Block Stair=Tangga Bongkah Obsidia Luaran +Obsidian Block Slab=Papak Bongkah Obsidia +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalaman +Outer Brick Stair=Tangga Bata Luaran +Brick Slab=Papak Bata +Steel Block Stair=Tangga Bongkah Keluli +Inner Steel Block Stair=Tangga Bongkah Keluli Dalaman +Outer Steel Block Stair=Tangga Bongkah Keluli Luaran +Steel Block Slab=Papak Bongkah Keluli +Tin Block Stair=Tangga Bongkah Timah +Inner Tin Block Stair=Tangga Bongkah Timah Dalaman +Outer Tin Block Stair=Tangga Bongkah Timah Luaran +Tin Block Slab=Papak Bongkah Timah +Copper Block Stair=Tangga Bongkah Tembaga +Inner Copper Block Stair=Tangga Bongkah Tembaga Dalaman +Outer Copper Block Stair=Tangga Bongkah Tembaga Luaran +Copper Block Slab=Papak Bongkah Tembaga +Bronze Block Stair=Tangga Bongkah Gangsa +Inner Bronze Block Stair=Tangga Bongkah Gangsa Dalaman +Outer Bronze Block Stair=Tangga Bongkah Gangsa Luaran +Bronze Block Slab=Papak Bongkah Gangsa +Gold Block Stair=Tangga Bongkah Emas +Inner Gold Block Stair=Tangga Bongkah Emas Dalaman +Outer Gold Block Stair=Tangga Bongkah Emas Luaran +Gold Block Slab=Papak Bongkah Emas +Ice Stair=Tangga Ais +Inner Ice Stair=Tangga Ais Dalaman +Outer Ice Stair=Tangga Ais Luaran +Ice Slab=Papak Ais +Snow Block Stair=Tangga Bongkah Salji +Inner Snow Block Stair=Tangga Bongkah Salji Dalaman +Outer Snow Block Stair=Tangga Bongkah Salji Luaran +Snow Block Slab=Papak Bongkah Salji diff --git a/mods/stairs/locale/stairs.pl.tr b/mods/stairs/locale/stairs.pl.tr new file mode 100644 index 00000000..14eed7b9 --- /dev/null +++ b/mods/stairs/locale/stairs.pl.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Schody ze szkła +Glass Slab=Półblok ze szkła +Inner Glass Stair=Wewnętrzne schody ze szkła +Outer Glass Stair=Zewnętrzne schody ze szkła +Obsidian Glass Stair=Schody z obsydianowego szkła +Obsidian Glass Slab=Półblok z obsydianowego szkła +Inner Obsidian Glass Stair=Wewnętrzne schody z obsydianowego szkła +Outer Obsidian Glass Stair=Zewnętrzne schody z obsydianowego szkła +Wooden Stair=Schody z drewna +Inner Wooden Stair=Wewnętrzne schody z drewna +Outer Wooden Stair=Zewnętrzne schody z drewna +Wooden Slab=Półblok z drewna +Jungle Wood Stair=Schody z dżunglowego drewna +Inner Jungle Wood Stair=Wewnętrzne schody z dżunglowego drewna +Outer Jungle Wood Stair=Zewnętrzne schody z dżunglowego drewna +Jungle Wood Slab=Półblok z dżunglowego drewna +Pine Wood Stair=Schody z sosnowego drzewa +Inner Pine Wood Stair=Wewnętrzne schody z sosnowego drewna +Outer Pine Wood Stair=Zewnętrzne schody z sosnowego drewna +Pine Wood Slab=Półblok z sosnowego drewna +Acacia Wood Stair=Schody z akacjowego drewna +Inner Acacia Wood Stair=Wewnętrzne schody z akacjowego drewna +Outer Acacia Wood Stair=Zewnętrzne schody z akacjowego drewna +Acacia Wood Slab=Półblok z akacjowego drewna +Aspen Wood Stair=Schody z brzozowego drewna +Inner Aspen Wood Stair=Wewnętrzne schody z brzozowego drewna +Outer Aspen Wood Stair=Zewnętrzne schody z brzozowego drewna +Aspen Wood Slab=Półblok z brzozowego drewna +Stone Stair=Schody z kamienia +Inner Stone Stair=Wewnętrzne schody z kamienia +Outer Stone Stair=Zewnętrzne schody z kamienia +Stone Slab=Półblok z kamienia +Cobblestone Stair=Schody z bruku +Inner Cobblestone Stair=Wewnętrzne schody z bruku +Outer Cobblestone Stair=Zewnętrzne schody z bruku +Cobblestone Slab=Półblok z bruku +Mossy Cobblestone Stair=Schody z bruku z mchem +Inner Mossy Cobblestone Stair=Wewnętrzne schody z bruku z mchem +Outer Mossy Cobblestone Stair=Zewnętrzne schody z bruku z mchem +Mossy Cobblestone Slab=Półblok z bruku z mchem +Stone Brick Stair=Schody z kamiennych cegieł +Inner Stone Brick Stair=Wewnętrzne schody z kamiennych cegieł +Outer Stone Brick Stair=Zewnętrzne schody z kamiennych cegieł +Stone Brick Slab=Półblok z kamiennych cegieł +Stone Block Stair=Schody z kamiennego bloku +Inner Stone Block Stair=Wewnętrzne schody z kamiennego bloku +Outer Stone Block Stair=Zewnętrzne schody z kamiennego bloku +Stone Block Slab=Półblok z kamiennego bloku +Desert Stone Stair=Schody z pustynnego kamienia +Inner Desert Stone Stair=Wewnętrzne schody z pustynnego kamienia +Outer Desert Stone Stair=Zewnętrzne schody z pustynnego kamienia +Desert Stone Slab=Półblok z pustynnego kamienia +Desert Cobblestone Stair=Schody z pustynnego bruku +Inner Desert Cobblestone Stair=Wewnętrzne schody z pustynnego bruku +Outer Desert Cobblestone Stair=Zewnętrzne schody z pustynnego bruku +Desert Cobblestone Slab=Półblok z pustynnego bruku +Desert Stone Brick Stair=Schody z pustynnych kamiennych cegieł +Inner Desert Stone Brick Stair=Wewnętrzne schody z pustynnych kamiennych cegieł +Outer Desert Stone Brick Stair=Zewnętrzne schody z pustynnych kamiennych cegieł +Desert Stone Brick Slab=Półblok z pustynnych kamiennych cegieł +Desert Stone Block Stair=Schody z pustynnego kamiennego bloku +Inner Desert Stone Block Stair=Wewnętrzne schody z pustynnego kamiennego bloku +Outer Desert Stone Block Stair=Zewnętrzne schody z pustynnego kamiennego bloku +Desert Stone Block Slab=Półblok z pustynnego kamiennego bloku +Sandstone Stair=Schody z piaskowca +Inner Sandstone Stair=Wewnętrzne schody z piaskowca +Outer Sandstone Stair=Zewnętrzne schody z piaskowca +Sandstone Slab=Półblok z piaskowca +Sandstone Brick Stair=Schody z piaskowcowych cegieł +Inner Sandstone Brick Stair=Wewnętrzne schody z piaskowcowych cegieł +Outer Sandstone Brick Stair=Zewnętrzne schody z piaskowcowych cegieł +Sandstone Brick Slab=Półblok z piaskowcowych cegieł +Sandstone Block Stair=Schody z piaskowcowego bloku +Inner Sandstone Block Stair=Wewnętrzne schody z piaskowcowego bloku +Outer Sandstone Block Stair=Zewnętrzne schody z piaskowcowego bloku +Sandstone Block Slab=Półblok z piaskowcowego bloku +Desert Sandstone Stair=Schody z pustynnego piaskowca +Inner Desert Sandstone Stair=Wewnętrzne schody z pustynnego piaskowca +Outer Desert Sandstone Stair=Zewnętrzne schody z pustynnego piaskowca +Desert Sandstone Slab=Półblok z pustynnego piaskowca +Desert Sandstone Brick Stair=Schody z pustynnych piaskowcowych cegieł +Inner Desert Sandstone Brick Stair=Wewnętrzne schody z pustynnych piaskowcowych cegieł +Outer Desert Sandstone Brick Stair=Zewnętrzne schody z pustynnych piaskowcowych cegieł +Desert Sandstone Brick Slab=Półblok z pustynnych piaskowcowych cegieł +Desert Sandstone Block Stair=Schody z pustynnego piaskowcowego bloku +Inner Desert Sandstone Block Stair=Wewnętrzne schody z pustynnego piaskowcowego bloku +Outer Desert Sandstone Block Stair=Zewnętrzne schody z pustynnego piaskowcowego bloku +Desert Sandstone Block Slab=Półblok z pustynnego piaskowcowego bloku +Silver Sandstone Stair=Schody z srebrnego piaskowca +Inner Silver Sandstone Stair=Wewnętrzne schody z srebrnego piaskowca +Outer Silver Sandstone Stair=Zewnętrzne schody z srebrnego piaskowca +Silver Sandstone Slab=Półblok z srebrnego piaskowca +Silver Sandstone Brick Stair=Schody z srebrnych piaskowcowych cegieł +Inner Silver Sandstone Brick Stair=Wewnętrzne schody z srebrnych piaskowcowych cegieł +Outer Silver Sandstone Brick Stair=Zewnętrzne schody z srebrnych piaskowcowych cegieł +Silver Sandstone Brick Slab=Półblok z srebrnych piaskowcowych cegieł +Silver Sandstone Block Stair=Schody z srebrnego piaskowcowego bloku +Inner Silver Sandstone Block Stair=Wewnętrzne schody z srebrnego piaskowcowego bloku +Outer Silver Sandstone Block Stair=Zewnętrzne schody z srebrnego piaskowcowego bloku +Silver Sandstone Block Slab=Półblok z srebrnego piaskowcowego bloku +Obsidian Stair=Schody z obsydianu +Inner Obsidian Stair=Wewnętrzne schody z obsydianu +Outer Obsidian Stair=Zewnętrzne schody z obsydianu +Obsidian Slab=Półblok z obsydianu +Obsidian Brick Stair=Schody z obsydianowych cegieł +Inner Obsidian Brick Stair=Wewnętrzne schody z obsydianowych cegieł +Outer Obsidian Brick Stair=Zewnętrzne schody z obsydianowych cegieł +Obsidian Brick Slab=Półblok z obsydianowych cegieł +Obsidian Block Stair=Schody z obsydianowego bloku +Inner Obsidian Block Stair=Wewnętrzne schody z obsydianowego bloku +Outer Obsidian Block Stair=Zewnętrzne schody z obsydianowego bloku +Obsidian Block Slab=Półblok z obsydianowego bloku +Brick Stair=Schody z cegieł +Inner Brick Stair=Wewnętrzne schody z cegieł +Outer Brick Stair=Zewnętrzne schody z cegieł +Brick Slab=Półblok z cegieł +Steel Block Stair=Schody z bloku stali +Inner Steel Block Stair=Wewnętrzne schody z bloku stali +Outer Steel Block Stair=Zewnętrzne schody z bloku stali +Steel Block Slab=Półblok z bloku stali +Tin Block Stair=Schody z bloku cyny +Inner Tin Block Stair=Wewnętrzne schody z bloku cyny +Outer Tin Block Stair=Zewnętrzne schody z bloku cyny +Tin Block Slab=Półblok z bloku cyny +Copper Block Stair=Schody z bloku miedzi +Inner Copper Block Stair=Wewnętrzne schody z bloku miedzi +Outer Copper Block Stair=Zewnętrzne schody z bloku miedzi +Copper Block Slab=Półblok z bloku miedzi +Bronze Block Stair=Schody z bloku brązu +Inner Bronze Block Stair=Wewnętrnze schody z bloku brązu +Outer Bronze Block Stair=Zewnętrzne schody z bloku brązu +Bronze Block Slab=Półblok z bloku brązu +Gold Block Stair=Schody z bloku złota +Inner Gold Block Stair=Wewnętrzne schody z block złota +Outer Gold Block Stair=Zewnętrzne schody z bloku złota +Gold Block Slab=Półblok z bloku złota +Ice Stair=Schody z lodu +Inner Ice Stair=Wewnętrzne schody z lodu +Outer Ice Stair=Zewnętrzne schody z lodu +Ice Slab=Półblok z lodu +Snow Block Stair=Schody ze śniegu +Inner Snow Block Stair=Wewnętrzne schody ze śniegu +Outer Snow Block Stair=Zewnętrzne schody ze śniegu +Snow Block Slab=Półblok ze śniegu diff --git a/mods/stairs/locale/stairs.pt_BR.tr b/mods/stairs/locale/stairs.pt_BR.tr new file mode 100644 index 00000000..41777a81 --- /dev/null +++ b/mods/stairs/locale/stairs.pt_BR.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escada de vidro +Glass Slab=Placa de vidro +Inner Glass Stair=Escada interior de vidro +Outer Glass Stair=Escada exterior de vidro +Obsidian Glass Stair=Escada de vidro de obsidiana +Obsidian Glass Slab=Placa de vidro de obsidiana +Inner Obsidian Glass Stair=Escada interior de vidro de obsidiana +Outer Obsidian Glass Stair=Escada exterior de vidro de obsidiana +Wooden Stair=Escada de madeira +Inner Wooden Stair=Escada interior de madeira +Outer Wooden Stair=Escada exterior de madeira +Wooden Slab=Laje de madeira +Jungle Wood Stair=Escada de madeira da selva +Inner Jungle Wood Stair=Escada interior de madeira da selva +Outer Jungle Wood Stair=Escada exterior de madeira da selva +Jungle Wood Slab=Laje de madeira da selva +Pine Wood Stair=Escada de madeira de pinho +Inner Pine Wood Stair=Escada interior de madeira de pinho +Outer Pine Wood Stair=Escada exterior de madeira de pinho +Pine Wood Slab=Laje de madeira de pinho +Acacia Wood Stair=Escada de madeira de acácia +Inner Acacia Wood Stair=Escada interior de madeira de acácia +Outer Acacia Wood Stair=Escada exterior de madeira de acácia +Acacia Wood Slab=Placa de madeira de acácia +Aspen Wood Stair=Escada de Álamo +Inner Aspen Wood Stair=Escada interior de Álamo +Outer Aspen Wood Stair=Escada exterior de Álamo +Aspen Wood Slab=Laje de Álamo +Stone Stair=Escada de Pedra +Inner Stone Stair=Escada interior de Pedra +Outer Stone Stair=Escada exterior de Pedra +Stone Slab=Laje de pedra +Cobblestone Stair=Escada de paralelepípedo +Inner Cobblestone Stair=Escada interior de paralelepípedo +Outer Cobblestone Stair=Escada exterior de paralelepípedo +Cobblestone Slab=Laje de paralelepípedo +Mossy Cobblestone Stair=Escada de paralelepípedo com musgo +Inner Mossy Cobblestone Stair=Escada interior de paralelepípedo com musgo +Outer Mossy Cobblestone Stair=Escada exterior de paralelepípedo com musgo +Mossy Cobblestone Slab=Laje de paralelepípedo com musgo +Stone Brick Stair=Escada de tijolo de pedra +Inner Stone Brick Stair=Escada interior de tijolo de pedra +Outer Stone Brick Stair=Escada exterior de tijolo de pedra +Stone Brick Slab=Laje de tijolo de pedra +Stone Block Stair=Escada Bloco de Pedra +Inner Stone Block Stair=Escada Interna de Bloco de Pedra +Outer Stone Block Stair=Escada Externa de Bloco de Pedra +Stone Block Slab=Laje de bloco de pedra +Desert Stone Stair=Escada de Pedra do Deserto +Inner Desert Stone Stair=Escada Interior de Pedra do Deserto +Outer Desert Stone Stair=Escada Exterior de Pedra do Deserto +Desert Stone Slab=Laje de pedra do deserto +Desert Cobblestone Stair=Escada de paralelepípedo do deserto +Inner Desert Cobblestone Stair=Escada interior de paralelepípedo do deserto +Outer Desert Cobblestone Stair=Escada exterior de paralelepípedo do deserto +Desert Cobblestone Slab=Laje de paralelepípedo do deserto +Desert Stone Brick Stair=Escada de tijolo de pedra do deserto +Inner Desert Stone Brick Stair=Escada interior de tijolos de pedra do deserto +Outer Desert Stone Brick Stair=Escada exterior de tijolos de pedra do deserto +Desert Stone Brick Slab=Laje de tijolo de pedra do deserto +Desert Stone Block Stair=Escada de Bloco de Pedra do Deserto +Inner Desert Stone Block Stair=Escada interior de bloco de pedra do deserto +Outer Desert Stone Block Stair=Escada exterior de Bloco de Pedra do Deserto +Desert Stone Block Slab=Laje do bloco de pedra do deserto +Sandstone Stair=Escada de arenito +Inner Sandstone Stair=Escada interior de arenito +Outer Sandstone Stair=Escada Exterior de Arenito +Sandstone Slab=Laje de arenito +Sandstone Brick Stair=Escada de tijolo de arenito +Inner Sandstone Brick Stair=Escada interior de tijolos de arenito +Outer Sandstone Brick Stair=Escada Exterior de Tijolo de Arenito +Sandstone Brick Slab=Laje de tijolo de arenito +Sandstone Block Stair=Escada do Bloco de Arenito +Inner Sandstone Block Stair=Escada interior de bloco de arenito +Outer Sandstone Block Stair=Escada exterior de bloco de arenito +Sandstone Block Slab=Laje de bloco de arenito +Desert Sandstone Stair=Escada de arenito do deserto +Inner Desert Sandstone Stair=Escada interior de arenito do deserto +Outer Desert Sandstone Stair=Escada exterior de arenito do deserto +Desert Sandstone Slab=Laje de arenito do deserto +Desert Sandstone Brick Stair=Escada de tijolos de arenito do deserto +Inner Desert Sandstone Brick Stair=Escada interior de tijolos de arenito do deserto +Outer Desert Sandstone Brick Stair=Escada exterior de tijolos de arenito do deserto +Desert Sandstone Brick Slab=Laje de tijolo de arenito do deserto +Desert Sandstone Block Stair=Escada do bloco de arenito do deserto +Inner Desert Sandstone Block Stair=Escada interior do bloco de arenito do deserto +Outer Desert Sandstone Block Stair=Escada exterior de bloco de arenito do deserto +Desert Sandstone Block Slab=Laje de bloco de arenito do deserto +Silver Sandstone Stair=Escada de arenito prateado +Inner Silver Sandstone Stair=Escada interior de Arenito Prateado +Outer Silver Sandstone Stair=Escada exterior de Arenito Prateado +Silver Sandstone Slab=Laje de arenito prateado +Silver Sandstone Brick Stair=Escada de tijolos de arenito prateado +Inner Silver Sandstone Brick Stair=Escada interior de tijolos de arenito prateado +Outer Silver Sandstone Brick Stair=Escada exterior de tijolos de arenito prateado +Silver Sandstone Brick Slab=Laje de tijolo de arenito prateado +Silver Sandstone Block Stair=Escada de blocos de arenito prateado +Inner Silver Sandstone Block Stair=Escada interior de bloco de arenito prateado +Outer Silver Sandstone Block Stair=Escada exterior de bloco de arenito prateado +Silver Sandstone Block Slab=Laje de bloco de arenito prateado +Obsidian Stair=Escada de Obsidiana +Inner Obsidian Stair=Escada interior de Obsidiana +Outer Obsidian Stair=Escada exterior de Obsidiana +Obsidian Slab=Laje de Obsidiana +Obsidian Brick Stair=Escada de Tijolos de Obsidiana +Inner Obsidian Brick Stair=Escada interna de Tijolos de Obsidiana +Outer Obsidian Brick Stair=Escada externa de Tijolos de Obsidiana +Obsidian Brick Slab=Laje de tijolos de obsidiana +Obsidian Block Stair=Escada de Bloco de Obsidiana +Inner Obsidian Block Stair=Escada interior de Bloco de obsidiana +Outer Obsidian Block Stair=Escada exterior de Bloco de obsidiana +Obsidian Block Slab=Laje de bloco de obsidiana +Brick Stair=Escada de Tijolos +Inner Brick Stair=Escada interior de Tijolos +Outer Brick Stair=Escada exterior de Tijolos +Brick Slab=Laje de tijolos +Steel Block Stair=Escada de bloco de aço +Inner Steel Block Stair=Escada interior de bloco de aço +Outer Steel Block Stair=Escada exterior de bloco de aço +Steel Block Slab=Laje de bloco de aço +Tin Block Stair=Escada de bloco de estanho +Inner Tin Block Stair=Escada interior de bloco de estanho +Outer Tin Block Stair=Escada exterior de bloco de lata +Tin Block Slab=Laje de bloco de estanho +Copper Block Stair=Escada de bloco de cobre +Inner Copper Block Stair=Escada interior de Bloco de Cobre +Outer Copper Block Stair=Escada exterior do Bloco de Cobre +Copper Block Slab=Laje de bloco de cobre +Bronze Block Stair=Escada Bloco de Bronze +Inner Bronze Block Stair=Escada interior de bloco de bronze +Outer Bronze Block Stair=Escada exterior de Bloco de Bronze +Bronze Block Slab=Laje de bloco de bronze +Gold Block Stair=Escada Bloco de Ouro +Inner Gold Block Stair=Escada interior de Bloco de Ouro +Outer Gold Block Stair=Escada exterior de Bloco de Ouro +Gold Block Slab=Laje de Bloco de Ouro +Ice Stair=Escada de gelo +Inner Ice Stair=Escada de gelo interior +Outer Ice Stair=Escada de gelo exterior +Ice Slab=Laje de gelo +Snow Block Stair=Escada Bloco de Neve +Inner Snow Block Stair=Escada de bloco de neve interior +Outer Snow Block Stair=Escada de bloco de neve exterior +Snow Block Slab=Laje de bloco de neve diff --git a/mods/stairs/locale/stairs.ru.tr b/mods/stairs/locale/stairs.ru.tr new file mode 100644 index 00000000..2d5850ea --- /dev/null +++ b/mods/stairs/locale/stairs.ru.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Стеклянная Ступень +Glass Slab=Стеклянная Плита +Inner Glass Stair=Угловая Стеклянная Ступень (Внутренний Угол) +Outer Glass Stair=Угловая Стеклянная Ступень (Внешний Угол) +Obsidian Glass Stair=Стеклянная Ступень Из Обсидиана +Obsidian Glass Slab=Стеклянная Плита Из Обсидиана +Inner Obsidian Glass Stair=Угловая Стеклянная Ступень Из Обсидиана (Внутренний Угол) +Outer Obsidian Glass Stair=Угловая Стеклянная Ступень Из Обсидиана (Внешний Угол) +Wooden Stair=Яблоневая Деревянная Ступень +Inner Wooden Stair=Угловая Яблоневая Деревянная Ступень (Внутренний Угол) +Outer Wooden Stair=Угловая Яблоневая Деревянная Ступень (Внешний Угол) +Wooden Slab=Яблоневая Деревянная Плита +Jungle Wood Stair=Тропическая Деревянная Ступень +Inner Jungle Wood Stair=Угловая Тропическая Деревянная Ступень (Внутренний Угол) +Outer Jungle Wood Stair=Угловая Тропическая Деревянная Ступень (Внешний Угол) +Jungle Wood Slab=Тропическая Деревянная Плита +Pine Wood Stair=Сосновая Деревянная Ступень +Inner Pine Wood Stair=Угловая Сосновая Деревянная Ступень (Внутренний Угол) +Outer Pine Wood Stair=Угловая Сосновая Деревянная Ступень (Внешний Угол) +Pine Wood Slab=Сосновая Деревянная Плита +Acacia Wood Stair=Деревянная Ступень Из Акации +Inner Acacia Wood Stair=Угловая Деревянная Ступень Из Акации (Внутренний Угол) +Outer Acacia Wood Stair=Угловая Деревянная Ступень Из Акации (Внешний Угол) +Acacia Wood Slab=Деревянная Плита Из Акации +Aspen Wood Stair=Осиновая Деревянная Ступень +Inner Aspen Wood Stair=Угловая Осиновая Деревянная Ступень (Внутренний Угол) +Outer Aspen Wood Stair=Угловая осиновая Деревянная Ступень (Внешний Угол) +Aspen Wood Slab=Осиновая Деревянная Плита +Stone Stair=Каменная Ступень +Inner Stone Stair=Угловая Каменная Ступень (Внутренний Угол) +Outer Stone Stair=Угловая Каменная Ступень (Внешний Угол) +Stone Slab=Каменная Плита +Cobblestone Stair=Булыжниковая Ступень +Inner Cobblestone Stair=Угловая Булыжниковая Ступень (Внутренний Угол) +Outer Cobblestone Stair=Угловая Булыжниковая Ступень (Внешний Угол) +Cobblestone Slab=Булыжниковая Плита +Mossy Cobblestone Stair=Мшистая Булыжниковая Ступень +Inner Mossy Cobblestone Stair=Угловая Мшистая Булыжниковая Ступень (Внутренний Угол) +Outer Mossy Cobblestone Stair=Угловая Мшистая Булыжниковая Ступень (Внешний Угол) +Mossy Cobblestone Slab=Мшистая Булыжниковая Плита +Stone Brick Stair=Cтупень Из Каменных Кирпичей +Inner Stone Brick Stair=Угловая Ступень Из Каменных Кирпичей (Внутренний Угол) +Outer Stone Brick Stair=Угловая Ступень Из Каменных Кирпичей (Внешний Угол) +Stone Brick Slab=Плита Из Каменных Кирпичей +Stone Block Stair=Ступень Из Каменного Блока +Inner Stone Block Stair=Угловая Ступень Из Каменного Блока (Внутренний Угол) +Outer Stone Block Stair=Угловая Ступень Из Каменного Блока (Внешний Угол) +Stone Block Slab=Плита Из Каменного Блока +Desert Stone Stair=Ступень Из Пустынного Камня +Inner Desert Stone Stair=Угловая Ступень Из Пустынного Камня (Внутренний Угол) +Outer Desert Stone Stair=Угловая Ступень Из Пустынного Камня (Внешний Угол) +Desert Stone Slab=Плита Из Пустынного Камня +Desert Cobblestone Stair=Ступень Из Пустынного Булыжника +Inner Desert Cobblestone Stair=Угловая Ступень Из Пустынного Булыжника (Внутренний Угол) +Outer Desert Cobblestone Stair=Угловая Ступень Из Пустынного Булыжника (Внешний Угол) +Desert Cobblestone Slab=Плита Из Пустынного Камня +Desert Stone Brick Stair=Ступень Из Кирпичей Пустынного Камня +Inner Desert Stone Brick Stair=Угловая Ступень Из Кирпичей Пустынного Камня (Внутренний Угол) +Outer Desert Stone Brick Stair=Угловая Ступень Из Кирпичей Пустынного Камня (Внешний Угол) +Desert Stone Brick Slab=Плита Из Кирпичей Пустынного Камня +Desert Stone Block Stair=Ступень Из Пустынного Каменного Блока +Inner Desert Stone Block Stair=Угловая Ступень Из Пустынного Каменного Блока (Внутренний Угол) +Outer Desert Stone Block Stair=Угловая Ступень Из Пустынного Каменного Блока (Внешний Угол) +Desert Stone Block Slab=Плита Из Пустынного Каменного Блока +Sandstone Stair=Песчаниковая Ступень +Inner Sandstone Stair=Угловая Песчаниковая Ступень (Внутренний Угол) +Outer Sandstone Stair=Угловая Песчаниковая Ступень (Внешний Угол) +Sandstone Slab=Песчаниковая Плита +Sandstone Brick Stair=Ступень Из Песчаниковых Кирпичей +Inner Sandstone Brick Stair=Угловая Ступень Из Песчаниковых Кирпичей (Внутренний Угол) +Outer Sandstone Brick Stair=Угловая Ступень Из Песчаниковых Кирпичей (Внешний Угол) +Sandstone Brick Slab=Плита Из Песчаниковых Кирпичей +Sandstone Block Stair=Ступень Из Песчаникового Блока +Inner Sandstone Block Stair=Угловая Ступень Из Песчаникового Блока (Внутренний Угол) +Outer Sandstone Block Stair=Угловая Ступень Из Песчаникового Блока (Внешний Угол) +Sandstone Block Slab=Плита Из Песчаникового Блока +Desert Sandstone Stair=Ступень Из Пустынного Песчаника +Inner Desert Sandstone Stair=Угловая Ступень Из Пустынного Песчаника (Внутренний Угол) +Outer Desert Sandstone Stair=Угловая Ступень Из Пустынного Песчаника (Внешний Угол) +Desert Sandstone Slab=Плита Из Пустынного Песчаника +Desert Sandstone Brick Stair=Ступень Из Кирпичей Пустынного Песчаника +Inner Desert Sandstone Brick Stair=Угловая Ступень Из Кирпичей Пустынного Песчаника (Внутренний Угол) +Outer Desert Sandstone Brick Stair=Угловая Ступень Из Кирпичей Пустынного Песчаника (Внешний Угол) +Desert Sandstone Brick Slab=Плита Из Кирпичей Пустынного Песчаника +Desert Sandstone Block Stair=Ступень Из Пустынного Песчаникового Блока +Inner Desert Sandstone Block Stair=Угловая Ступень Из Пустынного Песчаникового Блока (Внутренний Угол) +Outer Desert Sandstone Block Stair=Угловая Ступень Из Пустынного Песчаникового Блока (Внешний Угол) +Desert Sandstone Block Slab=Плита Из Пустынного Песчаникового Блока +Silver Sandstone Stair=Ступень Из Серебрянного Песчаника +Inner Silver Sandstone Stair=Угловая Ступень Из Серебряного Песчаника (Внутренний Угол) +Outer Silver Sandstone Stair=Угловая Ступень Из Серебряного Песчаника (Внешний Угол) +Silver Sandstone Slab=Плита Из Серебряного Песчаника +Silver Sandstone Brick Stair=Ступень Из Кирпичей Серебряного Песчаника +Inner Silver Sandstone Brick Stair=Угловая Ступень Из Кирпичей Серебряного Песчаника (Внутренний Угол) +Outer Silver Sandstone Brick Stair=Угловая Ступень Из Кирпичей Серебряного Песчаника (Внешний Угол) +Silver Sandstone Brick Slab=Плита Из Кирпичей Серебряного Песчаника +Silver Sandstone Block Stair=Ступень Из Серебряного Песчаникового Блока +Inner Silver Sandstone Block Stair=Угловая Ступень Из Серебряного Песчаникового Блока (Внутренний Угол) +Outer Silver Sandstone Block Stair=Угловая Ступень Из Серебряного Песчаникового Блока (Внешний Угол) +Silver Sandstone Block Slab=Плита Из Серебряного Песчаникового Блока +Obsidian Stair=Обсидиановая Ступень +Inner Obsidian Stair=Угловая Обсидиановая Ступень (Внутренний Угол) +Outer Obsidian Stair=Угловая Обсидиановая Ступень (Внешний Угол) +Obsidian Slab=Обсидиановая Плита +Obsidian Brick Stair=Ступень Из Обсидиановых Кирпичей +Inner Obsidian Brick Stair=Угловая Ступень Из Обсидиановых Кирпичей (Внутренний Угол) +Outer Obsidian Brick Stair=Угловая Ступень Из Обсидиановых Кирпичей (Внешний Угол) +Obsidian Brick Slab=Плита Из Обсидиановых Кирпичей +Obsidian Block Stair=Ступень Из Обсидианового Блока +Inner Obsidian Block Stair=Угловая Ступень Из Обсидианового Блока (Внутренний Угол) +Outer Obsidian Block Stair=Угловая Ступень Из Обсидианового Блока (Внешний Угол) +Obsidian Block Slab=Плита Из Обсидианового Блока +Brick Stair=Ступень Из Кирпичей +Inner Brick Stair=Угловая Ступень Из Кирпичей (Внутренний Угол) +Outer Brick Stair=Угловая Ступень Из Кирпичей (Внешний Угол) +Brick Slab=Плита Из Кирпичей +Steel Block Stair=Ступень Из Стального Блока +Inner Steel Block Stair=Угловая Ступень Из Стального Блока (Внутренний Угол) +Outer Steel Block Stair=Угловая Ступень Из Стального Блока (Внешний Угол) +Steel Block Slab=Плита Из Стального Блока +Tin Block Stair=Ступень Из Оловянного Блока +Inner Tin Block Stair=Угловая Ступень Из Оловянного Блока (Внутренний Угол) +Outer Tin Block Stair=Угловая Ступень Из Оловянного Блока (Внешний Угол) +Tin Block Slab=Плита Из Оловянного Блока +Copper Block Stair=Ступень Из Медного Блока +Inner Copper Block Stair=Угловая Ступень Из Медного Блока (Внутренний Угол) +Outer Copper Block Stair=Угловая Ступень Из Медного Блока (Внешний Угол) +Copper Block Slab=Плита Из Медного Блока +Bronze Block Stair=Ступень Из Бронзового Блока +Inner Bronze Block Stair=Угловая Ступень Из Бронзового Блока (Внутренний Угол) +Outer Bronze Block Stair=Угловая Ступень Из Бронзового Блока (Внешний Угол) +Bronze Block Slab=Плита Из Бронзового Блока +Gold Block Stair=Ступень Из Золотого Блока +Inner Gold Block Stair=Угловая Ступень Из Золотого Блока (Внутренний Угол) +Outer Gold Block Stair=Угловая Ступень Из Золотого Блока (Внешний Угол) +Gold Block Slab=Плита Из Золотого Блока +Ice Stair=Ледяная Ступень +Inner Ice Stair=Угловая Ледяная Ступень (Внутренний Угол) +Outer Ice Stair=Угловая Ледяная Ступень (Внешний Угол) +Ice Slab=Ледяная Плита +Snow Block Stair=Ступень Из Снежного Блока +Inner Snow Block Stair=Угловая Ступень Из Снежного Блока (Внутренний Угол) +Outer Snow Block Stair=Угловая Ступень Из Снежного Блока (Внешний Угол) +Snow Block Slab=Плита Из Снежного Блока diff --git a/mods/stairs/locale/stairs.sk.tr b/mods/stairs/locale/stairs.sk.tr new file mode 100644 index 00000000..b006fdb5 --- /dev/null +++ b/mods/stairs/locale/stairs.sk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Sklenené schod +Glass Slab=Sklenený stupienok +Inner Glass Stair=Vnútorný sklenené schod +Outer Glass Stair=Vonkajší sklenené schod +Obsidian Glass Stair=Obsidiánové sklenené schod +Obsidian Glass Slab=Obsidiánový sklenený stupienok +Inner Obsidian Glass Stair=Vnútorný obsidiánové sklenené schod +Outer Obsidian Glass Stair=Vonkajší obsidiánové sklenené schod +Wooden Stair=Drevené schod +Inner Wooden Stair=Vnútorný drevené schod +Outer Wooden Stair=Vonkajší drevené schod +Wooden Slab=Drevený stupienok +Jungle Wood Stair=Drevené schod z džungľového dreva +Inner Jungle Wood Stair=Vnútorný drevené schod z džungľového dreva +Outer Jungle Wood Stair=Vonkajší drevené schod z džungľového dreva +Jungle Wood Slab=Stupienok z džungľového dreva +Pine Wood Stair=Drevené schod z borovicového dreva +Inner Pine Wood Stair=Vnútorný drevené schod z borovicového dreva +Outer Pine Wood Stair=Vonkajší drevené schod z borovicového dreva +Pine Wood Slab=Stupienok z borovicového dreva +Acacia Wood Stair=Drevené schod z akáciového dreva +Inner Acacia Wood Stair=Vnútorný drevené schod z akáciového dreva +Outer Acacia Wood Stair=Vonkajší drevené schod z akáciového dreva +Acacia Wood Slab=Stupienok z akáciového dreva +Aspen Wood Stair=Drevené schod z osiky +Inner Aspen Wood Stair=Vnútorný drevené schod z osiky +Outer Aspen Wood Stair=Vonkajší drevené schod z osiky +Aspen Wood Slab=Stupienok z osiky +Stone Stair=Kamenné schod +Inner Stone Stair=Vnútorný kamenné schod +Outer Stone Stair=Vonkajší kamenné schod +Stone Slab=Kamenný stupienok +Cobblestone Stair=Schod z dlažbového kameňa +Inner Cobblestone Stair=Vnútorný schod z dlažbového kameňa +Outer Cobblestone Stair=Vonkajší schod z dlažbového kameňa +Cobblestone Slab=Stupienok z dlažbového kameňa +Mossy Cobblestone Stair=Schod dlažbového kameňa obrastené machom +Inner Mossy Cobblestone Stair=Vnútorný schod dlažbového kameňa obrastené machom +Outer Mossy Cobblestone Stair=Vonkajší schod dlažbového kameňa obrastené machom +Mossy Cobblestone Slab=Stupienok z dlažbového kameňa obrastený machom +Stone Brick Stair=Schod z kamenných tehál +Inner Stone Brick Stair=Vnútorný schod z kamenných tehál +Outer Stone Brick Stair=Vonkajší schod z kamenných tehál +Stone Brick Slab=Stupienok z kamenných tehál +Stone Block Stair=Schod z kameňa +Inner Stone Block Stair=Vnútorný schod z kameňa +Outer Stone Block Stair=Vonkajší schod z kameňa +Stone Block Slab=Stupienok z kameňa +Desert Stone Stair=Schod z púštneho kameňa +Inner Desert Stone Stair=Vnútorný schod z púštneho kameňa +Outer Desert Stone Stair=Vonkajší schod z púštneho kameňa +Desert Stone Slab=Stupienok z púštneho kameňa +Desert Cobblestone Stair=Schod z púštneho dlažbového kameňa +Inner Desert Cobblestone Stair=Vnútorný schod z púštneho dlažbového kameňa +Outer Desert Cobblestone Stair=Vonkajší schod z púštneho dlažbového kameňa +Desert Cobblestone Slab=Stupienok z púštneho dlažbového kameňa +Desert Stone Brick Stair=Schod z tehiel z púštneho kameňa +Inner Desert Stone Brick Stair=Vnútorný schod z tehiel z púštneho kameňa +Outer Desert Stone Brick Stair=Vonkajší schod z tehiel z púštneho kameňa +Desert Stone Brick Slab=Stupienok z tehiel z púštneho kameňa +Desert Stone Block Stair=Schod z blokov púštneho kameňa +Inner Desert Stone Block Stair=Vnútorný schod z blokov púštneho kameňa +Outer Desert Stone Block Stair=Vonkajší schod z blokov púštneho kameňa +Desert Stone Block Slab=Stupienok z blokov púštneho kameňa +Sandstone Stair=Schod z pieskovca +Inner Sandstone Stair=Vnútorný schod z pieskovca +Outer Sandstone Stair=Vonkajší schod z pieskovca +Sandstone Slab=Stupienok z pieskovca +Sandstone Brick Stair=Schod z tehál pieskovca +Inner Sandstone Brick Stair=Vnútorný schod z tehál pieskovca +Outer Sandstone Brick Stair=Vonkajší schod z tehál pieskovca +Sandstone Brick Slab=Stupienok z tehál pieskovca +Sandstone Block Stair=Schod z blokov pieskovca +Inner Sandstone Block Stair=Vnútorný schod z blokov pieskovca +Outer Sandstone Block Stair=Vonkajší schod z blokov pieskovca +Sandstone Block Slab=Stupienok z blokov pieskovca +Desert Sandstone Stair=Schod z púštneho pieskovca +Inner Desert Sandstone Stair=Vnútorný schod z púštneho pieskovca +Outer Desert Sandstone Stair=Vonkajší schod z púštneho pieskovca +Desert Sandstone Slab=Stupienok z púštneho pieskovca +Desert Sandstone Brick Stair=Schod z tehál z púštneho pieskovca +Inner Desert Sandstone Brick Stair=Vnútorný schod z tehál z púštneho pieskovca +Outer Desert Sandstone Brick Stair=Vonkajší schod z tehál z púštneho pieskovca +Desert Sandstone Brick Slab=Stupienok z tehál z púštneho pieskovca +Desert Sandstone Block Stair=Schod z blokov púštneho pieskovca +Inner Desert Sandstone Block Stair=Vnútorný schod z blokov púštneho pieskovca +Outer Desert Sandstone Block Stair=Vonkajší schod z blokov púštneho pieskovca +Desert Sandstone Block Slab=Stupienok z blokov púštneho pieskovca +Silver Sandstone Stair=Schod zo strieborného pieskovca +Inner Silver Sandstone Stair=Vnútorný schod zo strieborného pieskovca +Outer Silver Sandstone Stair=Vonkajší schod zo strieborného pieskovca +Silver Sandstone Slab=Stupienok zo strieborného pieskovca +Silver Sandstone Brick Stair=Schod z tehál zo strieborného pieskovca +Inner Silver Sandstone Brick Stair=Vnútorný schod z tehál zo strieborného pieskovca +Outer Silver Sandstone Brick Stair=Vonkajší schod z tehál zo strieborného pieskovca +Silver Sandstone Brick Slab=Stupienok z tehál zo strieborného pieskovca +Silver Sandstone Block Stair=Schod z blokov strieborného pieskovca +Inner Silver Sandstone Block Stair=Vnútorný schod z blokov strieborného pieskovca +Outer Silver Sandstone Block Stair=Vonkajší schod z blokov strieborného pieskovca +Silver Sandstone Block Slab=Stupienok z blokov strieborného pieskovca +Obsidian Stair=Schod z obsidiánu +Inner Obsidian Stair=Vnútorný schod z obsidiánu +Outer Obsidian Stair=Vonkajší schod z obsidiánu +Obsidian Slab=Stupienok z obsidiánu +Obsidian Brick Stair=Schod z tehál obsidiánu +Inner Obsidian Brick Stair=Vnútorný schod z tehál obsidiánu +Outer Obsidian Brick Stair=Vonkajší schod z tehál obsidiánu +Obsidian Brick Slab=Stupienok z tehál obsidiánu +Obsidian Block Stair=Schod z bloku obsidiánu +Inner Obsidian Block Stair=Vnútorný schod z bloku obsidiánu +Outer Obsidian Block Stair=Vonkajší schod z bloku obsidiánu +Obsidian Block Slab=Stupienok z bloku obsidiánu +Brick Stair=Schod z tehál +Inner Brick Stair=Vnútorný schod z tehál +Outer Brick Stair=Vonkajší schod z tehál +Brick Slab=Stupienok z tehál +Steel Block Stair=Oceľový schod +Inner Steel Block Stair=Vnútorný oceľový schod +Outer Steel Block Stair=Vonkajší oceľový schod +Steel Block Slab=Oceľový stupienok +Tin Block Stair=Cínový schod +Inner Tin Block Stair=Vnútorný cínový schod +Outer Tin Block Stair=Vonkajší cínový schod +Tin Block Slab=Cínový stupienok +Copper Block Stair=Medený schod +Inner Copper Block Stair=Vnútorný medený schod +Outer Copper Block Stair=Vonkajší medený schod +Copper Block Slab=Medený stupienok +Bronze Block Stair=Bronzový schod +Inner Bronze Block Stair=Vnútorný bronzový schod +Outer Bronze Block Stair=Vonkajší bronzový schod +Bronze Block Slab=Bronzový stupienok +Gold Block Stair=Zlatý schod +Inner Gold Block Stair=Vnútorný zlatý schod +Outer Gold Block Stair=Vonkajší zlatý schod +Gold Block Slab=Zlatý stupienok +Ice Stair=Ľadový schod +Inner Ice Stair=Vnútorný ľadový schod +Outer Ice Stair=Vonkajší ľadový schod +Ice Slab=Ľadový stupienok +Snow Block Stair=Snehový schod +Inner Snow Block Stair=Vnútorný snehový schod +Outer Snow Block Stair=Vonkajší snehový schod +Snow Block Slab=Snehový stupienok diff --git a/mods/stairs/locale/stairs.sv.tr b/mods/stairs/locale/stairs.sv.tr new file mode 100644 index 00000000..8044af81 --- /dev/null +++ b/mods/stairs/locale/stairs.sv.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastrappa +Glass Slab=Glasplatta +Inner Glass Stair=Inre glasstrappa +Outer Glass Stair=Yttre glasstrappa +Obsidian Glass Stair=Obsidianglasstrappa +Obsidian Glass Slab=Obsidianglasplatta +Inner Obsidian Glass Stair=Inre obsidianglastrappa +Outer Obsidian Glass Stair=Yttre obsidianglastrappa +Wooden Stair=Trätrappa +Inner Wooden Stair=Inre trätrappa +Outer Wooden Stair=Yttre trätrappa +Wooden Slab=Träplatta +Jungle Wood Stair=Djungelträtrappa +Inner Jungle Wood Stair=Inre djungelträtrappa +Outer Jungle Wood Stair=Ytter djungelträtrappa +Jungle Wood Slab=Djungelträplatta +Pine Wood Stair=Tallträplatta +Inner Pine Wood Stair=Inre tallträplatta +Outer Pine Wood Stair=Ytter tallträplatta +Pine Wood Slab=Tallskiva +Acacia Wood Stair=Acaciatrappa +Inner Acacia Wood Stair=Inre acaciatrappa +Outer Acacia Wood Stair=Yttre acaciatrappa +Acacia Wood Slab=Acaciaplatta +Aspen Wood Stair=Aspträtrappa +Inner Aspen Wood Stair=Inre aspträtrappa +Outer Aspen Wood Stair=Yttre aspträtrappa +Aspen Wood Slab=Aspträplatta +Stone Stair=Stentrappa +Inner Stone Stair=Inre stentrappa +Outer Stone Stair=Yttre stentrappa +Stone Slab=Stenplatta +Cobblestone Stair=Kullerstenstrappa +Inner Cobblestone Stair=Inre kullerstenstrappa +Outer Cobblestone Stair=Yttre kullerstenstrappa +Cobblestone Slab=Kullerstenplatta +Mossy Cobblestone Stair=Mossig kullerstenstrappa +Inner Mossy Cobblestone Stair=Inre mossig kullerstenstrappa +Outer Mossy Cobblestone Stair=Yttre mossig kullerstenstrappa +Mossy Cobblestone Slab=Mossig kullerstenplatta +Stone Brick Stair=Stentegeltrappa +Inner Stone Brick Stair=Inre stentegeltrappa +Outer Stone Brick Stair=Yttre stentegeltrappa +Stone Brick Slab=Stentegelplatta +Stone Block Stair=Stenblockstrappa +Inner Stone Block Stair=Inre stenblockstrappa +Outer Stone Block Stair=Yttre stenblockstrappa +Stone Block Slab=Stenblocksplatta +Desert Stone Stair=Ökenstentrappa +Inner Desert Stone Stair=Inre ökenstentrappa +Outer Desert Stone Stair=Yttre ökenstentrappa +Desert Stone Slab=Ökenstenplatta +Desert Cobblestone Stair=Ökenkullerstenstrappa +Inner Desert Cobblestone Stair=Inre ökenkullerstenstrappa +Outer Desert Cobblestone Stair=Yttre ökenkullerstenstrappa +Desert Cobblestone Slab=Ökenkullerstensplatta +Desert Stone Brick Stair=Ökentegelstenstrappa +Inner Desert Stone Brick Stair=Inre Ökentegelstenstrappa +Outer Desert Stone Brick Stair=Yttre Ökentegelstenstrappa +Desert Stone Brick Slab=Ökentegelstensplatta +Desert Stone Block Stair=Ökenstenblockstrappa +Inner Desert Stone Block Stair=Inre ökenstenblockstrappa +Outer Desert Stone Block Stair=Yttre ökenstenblockstrappa +Desert Stone Block Slab=Ökenstenblocksplatta +Sandstone Stair=Sandstenstrappa +Inner Sandstone Stair=Inre Sandstenstrappa +Outer Sandstone Stair=Yttre Sandstenstrappa +Sandstone Slab=Sandstenplatta +Sandstone Brick Stair=Sandstentegeltrappa +Inner Sandstone Brick Stair=Inre Sandstentegeltrappa +Outer Sandstone Brick Stair=Yttre Sandstentegeltrappa +Sandstone Brick Slab=Sandstentegelplatta +Sandstone Block Stair=Sandstenblockstrappa +Inner Sandstone Block Stair=Inre Sandstenblockstrappa +Outer Sandstone Block Stair=Yttre Sandstenblockstrappa +Sandstone Block Slab=Sandstenblocksplatta +Desert Sandstone Stair=Ökensandstenstrappa +Inner Desert Sandstone Stair=Inre ökensandstenstrappa +Outer Desert Sandstone Stair=Yttre ökensandstenstrappa +Desert Sandstone Slab=Ökensandstensplatta +Desert Sandstone Brick Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Brick Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Brick Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Brick Slab=Ökensandstentegelplatta +Desert Sandstone Block Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Block Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Block Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Block Slab=Ökensandstentegelplatta +Silver Sandstone Stair=Silversandstenstrappa +Inner Silver Sandstone Stair=Inre silversandstenstrappa +Outer Silver Sandstone Stair=Yttre silversandstenstrappa +Silver Sandstone Slab=Silversandstenstrappa +Silver Sandstone Brick Stair=Silversandstenstegeltrappa +Inner Silver Sandstone Brick Stair=Inre silversandstenstegeltrappa +Outer Silver Sandstone Brick Stair=Yttre silversandstenstegeltrappa +Silver Sandstone Brick Slab=Silversandstenstegelplatta +Silver Sandstone Block Stair=Silversandstenblockstrappa +Inner Silver Sandstone Block Stair=Inre silversandstenblockstrappa +Outer Silver Sandstone Block Stair=Yttre silversandstenblockstrappa +Silver Sandstone Block Slab=Silversandstenblocksplatta +Obsidian Stair=Obsidiantrappa +Inner Obsidian Stair=Inre obsidiantrappa +Outer Obsidian Stair=Yttre obsidiantrappa +Obsidian Slab=Obsidianplatta +Obsidian Brick Stair=Obsidiantegeltrappa +Inner Obsidian Brick Stair=Inre obsidiantegeltrappa +Outer Obsidian Brick Stair=Yttre obsidiantegeltrappa +Obsidian Brick Slab=Obsidiantegelplatta +Obsidian Block Stair=Obsidianblocktrappa +Inner Obsidian Block Stair=Inre Obsidianblocktrappa +Outer Obsidian Block Stair=Yttre Obsidianblocktrappa +Obsidian Block Slab=Obsidianblockplatta +Brick Stair=Tegeltrappa +Inner Brick Stair=Inre tegeltrappa +Outer Brick Stair=Yttre tegeltrappa +Brick Slab=Tegelplatta +Steel Block Stair=Ståltrappa +Inner Steel Block Stair=Inre ståltrappa +Outer Steel Block Stair=Yttre ståltrappa +Steel Block Slab=Stålplatta +Tin Block Stair=Tenntrappa +Inner Tin Block Stair=Inre tenntrappa +Outer Tin Block Stair=Yttre tenntrappa +Tin Block Slab=Tennplatta +Copper Block Stair=Koppartrappa +Inner Copper Block Stair=Inre koppartrappa +Outer Copper Block Stair=Yttre koppartrappa +Copper Block Slab=Kopparplatta +Bronze Block Stair=Bronstrappa +Inner Bronze Block Stair=Inre bronstrappa +Outer Bronze Block Stair=Yttre bronstrappa +Bronze Block Slab=Bronsplatta +Gold Block Stair=Guldtrappa +Inner Gold Block Stair=Inre guldtrappa +Outer Gold Block Stair=Yttre guldtrappa +Gold Block Slab=Guldplatta +Ice Stair=Istrappa +Inner Ice Stair=Inre istrappa +Outer Ice Stair=Yttre istrappa +Ice Slab=Isplatta +Snow Block Stair=Snöblockstrappa +Inner Snow Block Stair=Inre snöblockstrappa +Outer Snow Block Stair=Yttre snöblockstrappa +Snow Block Slab=Snöblocksplatta diff --git a/mods/stairs/locale/stairs.uk.tr b/mods/stairs/locale/stairs.uk.tr new file mode 100644 index 00000000..f501b5eb --- /dev/null +++ b/mods/stairs/locale/stairs.uk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Скляна Сходинка +Glass Slab=Скляна Плита +Inner Glass Stair=Кутова Скляна Сходинка (Внутрішній Кут) +Outer Glass Stair=Кутова Скляна Сходинка (Зовнішній Кут) +Obsidian Glass Stair=Скляна Сходинка З Обсидіану +Obsidian Glass Slab=Скляна Плита З Обсидіану +Inner Obsidian Glass Stair=Кутова Скляна Сходинка З Обсидіану (Внутрішній Кут) +Outer Obsidian Glass Stair=Кутова Скляна Сходинка З Обсидіану (Зовнішній Кут) +Wooden Stair=Яблунева Дерев'яна Сходинка +Inner Wooden Stair=Кутова Яблунева Дерев'яна Сходинка (Внутрішній Кут) +Outer Wooden Stair=Кутова Яблунева Дерев'яна Сходинка (Внутрішній Кут) +Wooden Slab=Яблунева Дерев'яна Плита +Jungle Wood Stair=Дерев'яна Сходинка З Тропічного Дерева +Inner Jungle Wood Stair=Кутова Дерев'яна Сходинка З Тропічного Дерева (Внутрішній Кут) +Outer Jungle Wood Stair=Кутова Дерев'яна Сходинка З Тропічного Дерева (Зовнішній Кут) +Jungle Wood Slab=Дерев'яна Плита З Тропічного Дерева +Pine Wood Stair=Дерев'яна Сходинка З Сосни +Inner Pine Wood Stair=Кутова Дерев'яна Сходинка З Сосни (Внутрішній Кут) +Outer Pine Wood Stair=Кутова Дерев'яна Сходинка З Сосни (Зовнішній Кут) +Pine Wood Slab=Дерев'яна Плита З Сосни +Acacia Wood Stair=Дерев'яна Сходинка З Акації +Inner Acacia Wood Stair=Кутова Дерев'яна Сходинка З Акації (Внутрішній Кут) +Outer Acacia Wood Stair=Кутова Дерев'яна Сходинка З Акації (Зовнішній Кут) +Acacia Wood Slab=Дерев'яна Плита З Акації +Aspen Wood Stair=Дерев'яна Сходинка З Осики +Inner Aspen Wood Stair=Кутова Дерев'яна Сходинка З Осики (Внутрішній Кут) +Outer Aspen Wood Stair=Кутова Дерев'яна Сходинка З Осики (Зовнішній Кут) +Aspen Wood Slab=Дерев'яна Плита З Осики +Stone Stair=Кам'яна Сходинка +Inner Stone Stair=Кутова Кам'яна Сходинка (Внутрішній Кут) +Outer Stone Stair=Кутова Кам'яна Сходинка (Зовнішній Кут) +Stone Slab=Кам'яна Плита +Cobblestone Stair=Сходинка З Кругляку +Inner Cobblestone Stair=Кутова Сходинка З Кругляку (Внутрішній Кут) +Outer Cobblestone Stair=Кутова Сходинка З Кругляку (Зовнішній Кут) +Cobblestone Slab=Плита З Кругляку +Mossy Cobblestone Stair=Мохова Сходинка З Кругляку +Inner Mossy Cobblestone Stair=Кутова Мохова Сходинка З Кругляку (Внутрішній Кут) +Outer Mossy Cobblestone Stair=Кутова Мохова Сходинка З Кругляку (Зовнішній Кут) +Mossy Cobblestone Slab=Мохова Плита З Кругляку +Stone Brick Stair=Сходинка З Кам'яної Цегли +Inner Stone Brick Stair=Кутова Сходинка З Кам'яної Цегли (Внутрішній Кут) +Outer Stone Brick Stair=Кутова Сходинка З Кам'яної Цегли (Зовнішній Кут) +Stone Brick Slab=Плита З Кам'яної Цегли +Stone Block Stair=Сходинка З Кам'яного Блоку +Inner Stone Block Stair=Кутова Сходинка З Кам'яного Блоку (Внутрішній Кут) +Outer Stone Block Stair=Кутова Сходинка З Кам'яного Блоку (Зовнішній Кут) +Stone Block Slab=Плита З Кам'яного Блоку +Desert Stone Stair=Сходинка З Пустельного Каменю +Inner Desert Stone Stair=Кутова Сходинка З Пустельного Каменю (Внутрішній Кут) +Outer Desert Stone Stair=Кутова Сходинка З Пустельного Каменю (Зовнішній Кут) +Desert Stone Slab=Плита З Пустельного Каменю +Desert Cobblestone Stair=Сходинка З Пустельного Кругляку +Inner Desert Cobblestone Stair=Кутова Сходинка З Пустельного Кругляку (Внутрішній Кут) +Outer Desert Cobblestone Stair=Кутова Сходинка З Пустельного Кругляку (Зовнішній Кут) +Desert Cobblestone Slab=Плита З Пустельного Каменю +Desert Stone Brick Stair=Сходинка З Цегли Із Пустельного Каменю +Inner Desert Stone Brick Stair=Кутова Сходинка З Цегли Із Пустельного Каменю (Внутрішній Кут) +Outer Desert Stone Brick Stair=Кутова Сходинка З Цегли Із Пустельного Каменю (Зовнішній Кут) +Desert Stone Brick Slab=Плита З Цегли Із Пустельного Каменю +Desert Stone Block Stair=Сходинка З Пустельного Кам'яного Блоку +Inner Desert Stone Block Stair=Кутова Сходинка З Пустельного Кам'яного Блоку (Внутрішній Кут) +Outer Desert Stone Block Stair=Кутова Сходинка З Пустельного Кам'яного Блоку (Зовнішній Кут) +Desert Stone Block Slab=Плита З Пустельного Кам'яного Блоку +Sandstone Stair=Сходинка З Піщанику +Inner Sandstone Stair=Кутова Сходинка З Піщанику (Внутрішній Кут) +Outer Sandstone Stair=Кутова Сходинка З Піщанику (Зовнішній Кут) +Sandstone Slab=Плита З Піщанику +Sandstone Brick Stair=Сходинка З Цегли Із Піщанику +Inner Sandstone Brick Stair=Кутова Сходинка З Цегли Із Піщанику (Внутрішній Кут) +Outer Sandstone Brick Stair=Кутова Сходинка З Цегли Із Піщанику (Зовнішній Кут) +Sandstone Brick Slab=Плита З Цегли Із Піщанику +Sandstone Block Stair=Сходинка З Блоку Із Піщанику +Inner Sandstone Block Stair=Кутова Сходинка З Блоку Із Піщанику (Внутрішній Кут) +Outer Sandstone Block Stair=Кутова Сходинка З Блоку Із Піщанику (Зовнішній Кут) +Sandstone Block Slab=Плита З Блоку Із Піщанику +Desert Sandstone Stair=Сходинка З Пустельного Піщанику +Inner Desert Sandstone Stair=Кутова Сходинка З Пустельного Піщанику (Внутрішній Кут) +Outer Desert Sandstone Stair=Кутова Сходинка З Пустельного Піщанику (Зовнішній Кут) +Desert Sandstone Slab=Плита З Пустельного Піщанику +Desert Sandstone Brick Stair=Сходинка З Цегли Із Пустельного Піщанику +Inner Desert Sandstone Brick Stair=Кутова Сходинка З Цегли Із Пустельного Піщанику (Внутрішній Кут) +Outer Desert Sandstone Brick Stair=Кутова Сходинка З Цегли Із Пустельного Піщанику (Зовнішній Кут) +Desert Sandstone Brick Slab=Плита З Цегли Із Пустельного Піщанику +Desert Sandstone Block Stair=Сходинка З Блоку Із Пустельного Піщанику +Inner Desert Sandstone Block Stair=Кутова Сходинка З Блоку Із Пустельного Піщанику (Внутрішній Кут) +Outer Desert Sandstone Block Stair=Кутова Сходинка З Блоку Із Пустельного Піщанику (Зовнішній Кут) +Desert Sandstone Block Slab=Плита З Блоку Із Пустельного Піщанику +Silver Sandstone Stair=Сходинка З Срібного Піщанику +Inner Silver Sandstone Stair=Кутова Сходинка З Срібного Піщанику (Внутрішній Кут) +Outer Silver Sandstone Stair=Кутова Сходинка З Срібного Піщанику (Зовнішній Кут) +Silver Sandstone Slab=Плита З Срібного Піщанику +Silver Sandstone Brick Stair=Сходинка З Цегли Із Срібного Піщанику +Inner Silver Sandstone Brick Stair=Кутова Сходинка З Цегли Із Срібного Піщанику (Внутрішній Кут) +Outer Silver Sandstone Brick Stair=Кутова Сходинка З Цегли Із Срібного Піщанику (Зовнішній Кут) +Silver Sandstone Brick Slab=Плита З Цегли Із Срібного Піщанику +Silver Sandstone Block Stair=Сходинка З Блоку Із Срібного Піщанику +Inner Silver Sandstone Block Stair=Кутова Сходинка З Блоку Із Срібного Піщанику (Внутрішній Кут) +Outer Silver Sandstone Block Stair=Кутова Сходинка З Блоку Із Срібного Піщанику (Зовнішній Кут) +Silver Sandstone Block Slab=Плита З Блоку Із Срібного Піщанику +Obsidian Stair=Обсидіанова Сходинка +Inner Obsidian Stair=Кутова Обсидіанова Сходинка (Внутрішній Кут) +Outer Obsidian Stair=Кутова Обсидіанова Сходинка (Зовнішній Кут) +Obsidian Slab=Обсидіанова Плита +Obsidian Brick Stair=Сходинка З Обсидіанової Цегли +Inner Obsidian Brick Stair=Кутова Сходинка З Обсидіанової Цегли (Внутрішній Кут) +Outer Obsidian Brick Stair=Кутова Сходинка З Обсидіанової Цегли (Зовнішній Кут) +Obsidian Brick Slab=Плита З Обсидіанової Цегли +Obsidian Block Stair=Сходинка З Обсидіанового Блоку +Inner Obsidian Block Stair=Кутова Сходинка З Обсидіанового Блоку (Внутрішній Кут) +Outer Obsidian Block Stair=Кутова Сходинка З Обсидіанового Блоку (Зовнішній Кут) +Obsidian Block Slab=Плита З Обсидіанового Блоку +Brick Stair=Сходинка З Цегли +Inner Brick Stair=Кутова Сходинка З Цегли (Внутрішній Кут) +Outer Brick Stair=Кутова Сходинка З Цегли (Зовнішній Кут) +Brick Slab=Плита З Цегли +Steel Block Stair=Сходинка Із Сталевого Блоку +Inner Steel Block Stair=Кутова Сходинка Із Сталевого Блоку (Внутрішній Кут) +Outer Steel Block Stair=Кутова Сходинка Із Сталевого Блоку (Зовнішній Кут) +Steel Block Slab=Плита Із Сталевого Блоку +Tin Block Stair=Сходинка З Олов'яного Блоку +Inner Tin Block Stair=Кутова Сходинка З Олов'яного Блоку (Внутрішній Кут) +Outer Tin Block Stair=Кутова Сходинка З Олов'яного Блоку (Зовнішній Кут) +Tin Block Slab=Плита З Олов'яного Блоку +Copper Block Stair=Сходинка З Мідного Блоку +Inner Copper Block Stair=Кутова Сходинка З Мідного Блоку (Внутрішній Кут) +Outer Copper Block Stair=Кутова Сходинка З Мідного Блоку (Зовнішній Кут) +Copper Block Slab=Плита З Мідного Блоку +Bronze Block Stair=Сходинка З Бронзового Блоку +Inner Bronze Block Stair=Кутова Сходинка З Бронзового Блоку (Внутрішній Кут) +Outer Bronze Block Stair=Кутова Сходинка З Бронзового Блоку (Зовнішній Кут) +Bronze Block Slab=Плита З Бронзового Блоку +Gold Block Stair=Сходинка З Золотого Блоку +Inner Gold Block Stair=Сходинка З Золотого Блоку (Внутрішній Кут) +Outer Gold Block Stair=Сходинка З Золотого Блоку (Зовнішній Кут) +Gold Block Slab=Плита З Золотого Блоку +Ice Stair=Крижана Сходинка +Inner Ice Stair=Кутова Крижана Сходинка (Внутрішній Кут) +Outer Ice Stair=Кутова Крижана Сходинка (Зовнішній Кут) +Ice Slab=Крижана Плита +Snow Block Stair=Ступінь З Крижаного Блоку +Inner Snow Block Stair=Кутова Ступінь З Крижаного Блоку (Внутрішній Кут) +Outer Snow Block Stair=Кутова Ступінь З Крижаного Блоку (Зовнішній Кут) +Snow Block Slab=Плита З Крижаного Блоку diff --git a/mods/stairs/locale/stairs.zh_CN.tr b/mods/stairs/locale/stairs.zh_CN.tr new file mode 100644 index 00000000..e37ebcbb --- /dev/null +++ b/mods/stairs/locale/stairs.zh_CN.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃楼梯 +Glass Slab=玻璃台阶 +Inner Glass Stair=玻璃楼梯(内) +Outer Glass Stair=玻璃楼梯(外) +Obsidian Glass Stair=黑曜石玻璃楼梯 +Obsidian Glass Slab=黑曜石玻璃台阶 +Inner Obsidian Glass Stair=黑曜石玻璃楼梯(内) +Outer Obsidian Glass Stair=黑曜石玻璃楼梯(外) +Wooden Stair=木楼梯 +Inner Wooden Stair=木楼梯(内) +Outer Wooden Stair=木楼梯(外) +Wooden Slab=木台阶 +Jungle Wood Stair=丛林木楼梯 +Inner Jungle Wood Stair=丛林木楼梯(内) +Outer Jungle Wood Stair=丛林木楼梯(外) +Jungle Wood Slab=丛林木台阶 +Pine Wood Stair=松木楼梯 +Inner Pine Wood Stair=松木楼梯(内) +Outer Pine Wood Stair=松木楼梯(外) +Pine Wood Slab=松木台阶 +Acacia Wood Stair=金合欢木楼梯 +Inner Acacia Wood Stair=金合欢木楼梯(内) +Outer Acacia Wood Stair=金合欢木楼梯(外) +Acacia Wood Slab=金合欢木台阶 +Aspen Wood Stair=白杨木楼梯 +Inner Aspen Wood Stair=白杨木楼梯(内) +Outer Aspen Wood Stair=白杨木楼梯(外) +Aspen Wood Slab=白杨木台阶 +Stone Stair=石楼梯 +Inner Stone Stair=石楼梯(内) +Outer Stone Stair=石楼梯(外) +Stone Slab=石台阶 +Cobblestone Stair=鹅卵石楼梯 +Inner Cobblestone Stair=鹅卵石楼梯(内) +Outer Cobblestone Stair=鹅卵石楼梯(外) +Cobblestone Slab=鹅卵石台阶 +Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯 +Inner Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯(内) +Outer Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯(外) +Mossy Cobblestone Slab=苔藓覆盖的鹅卵石台阶 +Stone Brick Stair=石砖楼梯 +Inner Stone Brick Stair=石砖楼梯(内) +Outer Stone Brick Stair=石砖楼梯(外) +Stone Brick Slab=石砖台阶 +Stone Block Stair=石块楼梯 +Inner Stone Block Stair=石块楼梯(内) +Outer Stone Block Stair=石块楼梯(外) +Stone Block Slab=石块台阶 +Desert Stone Stair=沙漠石楼梯 +Inner Desert Stone Stair=沙漠石楼梯(内) +Outer Desert Stone Stair=沙漠石楼梯(外) +Desert Stone Slab=沙漠石台阶 +Desert Cobblestone Stair=沙漠鹅卵石楼梯 +Inner Desert Cobblestone Stair=沙漠鹅卵石楼梯(内) +Outer Desert Cobblestone Stair=沙漠鹅卵石楼梯(外) +Desert Cobblestone Slab=沙漠鹅卵石台阶 +Desert Stone Brick Stair=沙漠石砖楼梯 +Inner Desert Stone Brick Stair=沙漠石砖楼梯(内) +Outer Desert Stone Brick Stair=沙漠石砖楼梯(外) +Desert Stone Brick Slab=沙漠石砖台阶 +Desert Stone Block Stair=沙漠石块楼梯 +Inner Desert Stone Block Stair=沙漠石块楼梯(内) +Outer Desert Stone Block Stair=沙漠石块楼梯(外) +Desert Stone Block Slab=沙漠石块台阶 +Sandstone Stair=沙石楼梯 +Inner Sandstone Stair=沙石楼梯(内) +Outer Sandstone Stair=沙石楼梯(外) +Sandstone Slab=沙石台阶 +Sandstone Brick Stair=沙石砖楼梯 +Inner Sandstone Brick Stair=沙石砖楼梯(内) +Outer Sandstone Brick Stair=沙石砖楼梯(外) +Sandstone Brick Slab=沙石砖台阶 +Sandstone Block Stair=沙石块楼梯 +Inner Sandstone Block Stair=沙石块楼梯(内) +Outer Sandstone Block Stair=沙石块楼梯(外) +Sandstone Block Slab=沙石块台阶 +Desert Sandstone Stair=沙漠沙石楼梯 +Inner Desert Sandstone Stair=沙漠沙石楼梯(内) +Outer Desert Sandstone Stair=沙漠沙石楼梯(外) +Desert Sandstone Slab=沙漠沙石台阶 +Desert Sandstone Brick Stair=沙漠沙石砖楼梯 +Inner Desert Sandstone Brick Stair=沙漠沙石砖楼梯(内) +Outer Desert Sandstone Brick Stair=沙漠沙石砖楼梯(外) +Desert Sandstone Brick Slab=沙漠沙石砖台阶 +Desert Sandstone Block Stair=沙漠沙石块楼梯 +Inner Desert Sandstone Block Stair=沙漠沙石块楼梯(内) +Outer Desert Sandstone Block Stair=沙漠沙石块楼梯(外) +Desert Sandstone Block Slab=沙漠沙石块台阶 +Silver Sandstone Stair=银沙石楼梯 +Inner Silver Sandstone Stair=银沙石楼梯(内) +Outer Silver Sandstone Stair=银沙石楼梯(外) +Silver Sandstone Slab=银沙石台阶 +Silver Sandstone Brick Stair=银沙石砖楼梯 +Inner Silver Sandstone Brick Stair=银沙石砖楼梯(内) +Outer Silver Sandstone Brick Stair=银沙石砖楼梯(外) +Silver Sandstone Brick Slab=银沙石砖台阶 +Silver Sandstone Block Stair=银沙石块楼梯 +Inner Silver Sandstone Block Stair=银沙石块楼梯(内) +Outer Silver Sandstone Block Stair=银沙石块楼梯(外) +Silver Sandstone Block Slab=银沙石块台阶 +Obsidian Stair=黑曜石楼梯 +Inner Obsidian Stair=黑曜石楼梯(内) +Outer Obsidian Stair=黑曜石楼梯(外) +Obsidian Slab=黑曜石台阶 +Obsidian Brick Stair=黑曜石砖楼梯 +Inner Obsidian Brick Stair=黑曜石砖楼梯(内) +Outer Obsidian Brick Stair=黑曜石砖楼梯(外) +Obsidian Brick Slab=黑曜石砖台阶 +Obsidian Block Stair=黑曜石块楼梯 +Inner Obsidian Block Stair=黑曜石块楼梯(内) +Outer Obsidian Block Stair=黑曜石块楼梯(外) +Obsidian Block Slab=黑曜石块台阶 +Brick Stair=砖楼梯 +Inner Brick Stair=砖楼梯(内) +Outer Brick Stair=砖楼梯(外) +Brick Slab=砖台阶 +Steel Block Stair=铁块楼梯 +Inner Steel Block Stair=铁块楼梯(内) +Outer Steel Block Stair=铁块楼梯(外) +Steel Block Slab=铁块台阶 +Tin Block Stair=锡块楼梯 +Inner Tin Block Stair=锡块楼梯(内) +Outer Tin Block Stair=锡块楼梯(外) +Tin Block Slab=锡块台阶 +Copper Block Stair=铜块楼梯 +Inner Copper Block Stair=铜块楼梯(内) +Outer Copper Block Stair=铜块楼梯(外) +Copper Block Slab=铜块台阶 +Bronze Block Stair=青铜块楼梯 +Inner Bronze Block Stair=青铜块楼梯(内) +Outer Bronze Block Stair=青铜块楼梯(外) +Bronze Block Slab=青铜块台阶 +Gold Block Stair=金块楼梯 +Inner Gold Block Stair=金块楼梯(内) +Outer Gold Block Stair=金块楼梯(外) +Gold Block Slab=金块台阶 +Ice Stair=冰楼梯 +Inner Ice Stair=冰块楼梯(内) +Outer Ice Stair=冰块楼梯(外) +Ice Slab=冰台阶 +Snow Block Stair=雪块楼梯 +Inner Snow Block Stair=雪块楼梯(内) +Outer Snow Block Stair=雪块楼梯(外) +Snow Block Slab=雪块台阶 + + +##### not used anymore ##### + +Blue Stained Stair=蓝木楼梯 +Inner Blue Stained Stair=蓝木楼梯(内) +Outer Blue Stained Stair=蓝木楼梯(外) +Blue Stained Slab=蓝木台阶 diff --git a/mods/stairs/locale/stairs.zh_TW.tr b/mods/stairs/locale/stairs.zh_TW.tr new file mode 100644 index 00000000..eaed61f9 --- /dev/null +++ b/mods/stairs/locale/stairs.zh_TW.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃樓梯 +Glass Slab=玻璃臺階 +Inner Glass Stair=玻璃樓梯(內) +Outer Glass Stair=玻璃樓梯(外) +Obsidian Glass Stair=黑曜石玻璃樓梯 +Obsidian Glass Slab=黑曜石玻璃臺階 +Inner Obsidian Glass Stair=黑曜石玻璃樓梯(內) +Outer Obsidian Glass Stair=黑曜石玻璃樓梯(外) +Wooden Stair=木製樓梯 +Inner Wooden Stair=木樓梯(內) +Outer Wooden Stair=木樓梯(外) +Wooden Slab=木製臺階 +Jungle Wood Stair=叢林木樓梯 +Inner Jungle Wood Stair=叢林木樓梯(內) +Outer Jungle Wood Stair=叢林木樓梯(外) +Jungle Wood Slab=叢林木臺階 +Pine Wood Stair=松木樓梯 +Inner Pine Wood Stair=松木樓梯(內) +Outer Pine Wood Stair=松木樓梯(外) +Pine Wood Slab=松木臺階 +Acacia Wood Stair=金合歡木樓梯 +Inner Acacia Wood Stair=金合歡木樓梯(內) +Outer Acacia Wood Stair=金合歡木樓梯(外) +Acacia Wood Slab=金合歡木臺階 +Aspen Wood Stair=白楊木樓梯 +Inner Aspen Wood Stair=白楊木樓梯(內) +Outer Aspen Wood Stair=白楊木樓梯(外) +Aspen Wood Slab=白楊木臺階 +Stone Stair=石樓梯 +Inner Stone Stair=石樓梯(內) +Outer Stone Stair=石樓梯(外) +Stone Slab=石臺階 +Cobblestone Stair=圓石樓梯 +Inner Cobblestone Stair=圓石樓梯(內) +Outer Cobblestone Stair=圓石樓梯(外) +Cobblestone Slab=圓石臺階 +Mossy Cobblestone Stair=苔石樓梯 +Inner Mossy Cobblestone Stair=苔石樓梯(內) +Outer Mossy Cobblestone Stair=苔石樓梯(外) +Mossy Cobblestone Slab=苔石臺階 +Stone Brick Stair=石磚樓梯 +Inner Stone Brick Stair=石磚樓梯(內) +Outer Stone Brick Stair=石磚樓梯(外) +Stone Brick Slab=石磚臺階 +Stone Block Stair=石塊樓梯 +Inner Stone Block Stair=石塊樓梯(內) +Outer Stone Block Stair=石塊樓梯(外) +Stone Block Slab=石塊臺階 +Desert Stone Stair=沙漠石樓梯 +Inner Desert Stone Stair=沙漠石樓梯(內) +Outer Desert Stone Stair=沙漠石樓梯(外) +Desert Stone Slab=沙漠石臺階 +Desert Cobblestone Stair=沙漠圓石樓梯 +Inner Desert Cobblestone Stair=沙漠圓石樓梯(內) +Outer Desert Cobblestone Stair=沙漠圓石樓梯(外) +Desert Cobblestone Slab=沙漠圓石臺階 +Desert Stone Brick Stair=沙漠石磚樓梯 +Inner Desert Stone Brick Stair=沙漠石磚樓梯(內) +Outer Desert Stone Brick Stair=沙漠石磚樓梯(外) +Desert Stone Brick Slab=沙漠石磚臺階 +Desert Stone Block Stair=沙漠石塊樓梯 +Inner Desert Stone Block Stair=沙漠石塊樓梯(內) +Outer Desert Stone Block Stair=沙漠石塊樓梯(外) +Desert Stone Block Slab=沙漠石塊臺階 +Sandstone Stair=沙石樓梯 +Inner Sandstone Stair=沙石樓梯(內) +Outer Sandstone Stair=沙石樓梯(外) +Sandstone Slab=沙石臺階 +Sandstone Brick Stair=沙石磚樓梯 +Inner Sandstone Brick Stair=沙石磚樓梯(內) +Outer Sandstone Brick Stair=沙石磚樓梯(外) +Sandstone Brick Slab=沙石磚臺階 +Sandstone Block Stair=沙石塊樓梯 +Inner Sandstone Block Stair=沙石塊樓梯(內) +Outer Sandstone Block Stair=沙石塊樓梯(外) +Sandstone Block Slab=沙石塊臺階 +Desert Sandstone Stair=沙漠沙石樓梯 +Inner Desert Sandstone Stair=沙漠沙石樓梯(內) +Outer Desert Sandstone Stair=沙漠沙石樓梯(外) +Desert Sandstone Slab=沙漠沙石臺階 +Desert Sandstone Brick Stair=沙漠沙石磚樓梯 +Inner Desert Sandstone Brick Stair=沙漠沙石磚樓梯(內) +Outer Desert Sandstone Brick Stair=沙漠沙石磚樓梯(外) +Desert Sandstone Brick Slab=沙漠沙石磚臺階 +Desert Sandstone Block Stair=沙漠沙石塊樓梯 +Inner Desert Sandstone Block Stair=沙漠沙石塊樓梯(內) +Outer Desert Sandstone Block Stair=沙漠沙石塊樓梯(外) +Desert Sandstone Block Slab=沙漠沙石塊臺階 +Silver Sandstone Stair=銀沙石樓梯 +Inner Silver Sandstone Stair=銀沙石樓梯(內) +Outer Silver Sandstone Stair=銀沙石樓梯(外) +Silver Sandstone Slab=銀沙石臺階 +Silver Sandstone Brick Stair=銀沙石磚樓梯 +Inner Silver Sandstone Brick Stair=銀沙石磚樓梯(內) +Outer Silver Sandstone Brick Stair=銀沙石磚樓梯(外) +Silver Sandstone Brick Slab=銀沙石磚臺階 +Silver Sandstone Block Stair=銀沙石塊樓梯 +Inner Silver Sandstone Block Stair=銀沙石塊樓梯(內) +Outer Silver Sandstone Block Stair=銀沙石塊樓梯(外) +Silver Sandstone Block Slab=銀沙石塊臺階 +Obsidian Stair=黑曜石樓梯 +Inner Obsidian Stair=黑曜石樓梯(內) +Outer Obsidian Stair=黑曜石樓梯(外) +Obsidian Slab=黑曜石臺階 +Obsidian Brick Stair=黑曜石磚樓梯 +Inner Obsidian Brick Stair=黑曜石磚樓梯(內) +Outer Obsidian Brick Stair=黑曜石磚樓梯(外) +Obsidian Brick Slab=黑曜石磚臺階 +Obsidian Block Stair=黑曜石塊樓梯 +Inner Obsidian Block Stair=黑曜石塊樓梯(內) +Outer Obsidian Block Stair=黑曜石塊樓梯(外) +Obsidian Block Slab=黑曜石塊臺階 +Brick Stair=磚樓梯 +Inner Brick Stair=磚樓梯(內) +Outer Brick Stair=磚樓梯(外) +Brick Slab=磚制臺階 +Steel Block Stair=鐵塊樓梯 +Inner Steel Block Stair=鐵塊樓梯(內) +Outer Steel Block Stair=鐵塊樓梯(外) +Steel Block Slab=鐵塊臺階 +Tin Block Stair=錫塊樓梯 +Inner Tin Block Stair=錫塊樓梯(內) +Outer Tin Block Stair=錫塊樓梯(外) +Tin Block Slab=錫塊臺階 +Copper Block Stair=銅塊樓梯 +Inner Copper Block Stair=銅塊樓梯(內) +Outer Copper Block Stair=銅塊樓梯(外) +Copper Block Slab=銅塊臺階 +Bronze Block Stair=青銅塊樓梯 +Inner Bronze Block Stair=青銅塊樓梯(內) +Outer Bronze Block Stair=青銅塊樓梯(外) +Bronze Block Slab=青銅塊臺階 +Gold Block Stair=金塊樓梯 +Inner Gold Block Stair=金塊樓梯(內) +Outer Gold Block Stair=金塊樓梯(外) +Gold Block Slab=金塊臺階 +Ice Stair=冰階梯 +Inner Ice Stair=冰塊樓梯(內) +Outer Ice Stair=冰塊樓梯(外) +Ice Slab=冰臺階 +Snow Block Stair=雪塊樓梯 +Inner Snow Block Stair=雪塊樓梯(內) +Outer Snow Block Stair=雪塊樓梯(外) +Snow Block Slab=雪塊臺階 + + +##### not used anymore ##### + +Blue Stained Stair=藍木樓梯 +Inner Blue Stained Stair=藍木樓梯(內) +Outer Blue Stained Stair=藍木樓梯(外) +Blue Stained Slab=藍木臺階 diff --git a/mods/stairs/locale/template.txt b/mods/stairs/locale/template.txt new file mode 100644 index 00000000..ca2c8657 --- /dev/null +++ b/mods/stairs/locale/template.txt @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair= +Glass Slab= +Inner Glass Stair= +Outer Glass Stair= +Obsidian Glass Stair= +Obsidian Glass Slab= +Inner Obsidian Glass Stair= +Outer Obsidian Glass Stair= +Wooden Stair= +Inner Wooden Stair= +Outer Wooden Stair= +Wooden Slab= +Jungle Wood Stair= +Inner Jungle Wood Stair= +Outer Jungle Wood Stair= +Jungle Wood Slab= +Pine Wood Stair= +Inner Pine Wood Stair= +Outer Pine Wood Stair= +Pine Wood Slab= +Acacia Wood Stair= +Inner Acacia Wood Stair= +Outer Acacia Wood Stair= +Acacia Wood Slab= +Aspen Wood Stair= +Inner Aspen Wood Stair= +Outer Aspen Wood Stair= +Aspen Wood Slab= +Stone Stair= +Inner Stone Stair= +Outer Stone Stair= +Stone Slab= +Cobblestone Stair= +Inner Cobblestone Stair= +Outer Cobblestone Stair= +Cobblestone Slab= +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Stone Brick Stair= +Inner Stone Brick Stair= +Outer Stone Brick Stair= +Stone Brick Slab= +Stone Block Stair= +Inner Stone Block Stair= +Outer Stone Block Stair= +Stone Block Slab= +Desert Stone Stair= +Inner Desert Stone Stair= +Outer Desert Stone Stair= +Desert Stone Slab= +Desert Cobblestone Stair= +Inner Desert Cobblestone Stair= +Outer Desert Cobblestone Stair= +Desert Cobblestone Slab= +Desert Stone Brick Stair= +Inner Desert Stone Brick Stair= +Outer Desert Stone Brick Stair= +Desert Stone Brick Slab= +Desert Stone Block Stair= +Inner Desert Stone Block Stair= +Outer Desert Stone Block Stair= +Desert Stone Block Slab= +Sandstone Stair= +Inner Sandstone Stair= +Outer Sandstone Stair= +Sandstone Slab= +Sandstone Brick Stair= +Inner Sandstone Brick Stair= +Outer Sandstone Brick Stair= +Sandstone Brick Slab= +Sandstone Block Stair= +Inner Sandstone Block Stair= +Outer Sandstone Block Stair= +Sandstone Block Slab= +Desert Sandstone Stair= +Inner Desert Sandstone Stair= +Outer Desert Sandstone Stair= +Desert Sandstone Slab= +Desert Sandstone Brick Stair= +Inner Desert Sandstone Brick Stair= +Outer Desert Sandstone Brick Stair= +Desert Sandstone Brick Slab= +Desert Sandstone Block Stair= +Inner Desert Sandstone Block Stair= +Outer Desert Sandstone Block Stair= +Desert Sandstone Block Slab= +Silver Sandstone Stair= +Inner Silver Sandstone Stair= +Outer Silver Sandstone Stair= +Silver Sandstone Slab= +Silver Sandstone Brick Stair= +Inner Silver Sandstone Brick Stair= +Outer Silver Sandstone Brick Stair= +Silver Sandstone Brick Slab= +Silver Sandstone Block Stair= +Inner Silver Sandstone Block Stair= +Outer Silver Sandstone Block Stair= +Silver Sandstone Block Slab= +Obsidian Stair= +Inner Obsidian Stair= +Outer Obsidian Stair= +Obsidian Slab= +Obsidian Brick Stair= +Inner Obsidian Brick Stair= +Outer Obsidian Brick Stair= +Obsidian Brick Slab= +Obsidian Block Stair= +Inner Obsidian Block Stair= +Outer Obsidian Block Stair= +Obsidian Block Slab= +Brick Stair= +Inner Brick Stair= +Outer Brick Stair= +Brick Slab= +Steel Block Stair= +Inner Steel Block Stair= +Outer Steel Block Stair= +Steel Block Slab= +Tin Block Stair= +Inner Tin Block Stair= +Outer Tin Block Stair= +Tin Block Slab= +Copper Block Stair= +Inner Copper Block Stair= +Outer Copper Block Stair= +Copper Block Slab= +Bronze Block Stair= +Inner Bronze Block Stair= +Outer Bronze Block Stair= +Bronze Block Slab= +Gold Block Stair= +Inner Gold Block Stair= +Outer Gold Block Stair= +Gold Block Slab= +Ice Stair= +Inner Ice Stair= +Outer Ice Stair= +Ice Slab= +Snow Block Stair= +Inner Snow Block Stair= +Outer Snow Block Stair= +Snow Block Slab= diff --git a/mods/stairs/mod.conf b/mods/stairs/mod.conf index 97d7cb48..d1e587de 100644 --- a/mods/stairs/mod.conf +++ b/mods/stairs/mod.conf @@ -1,3 +1,4 @@ name = stairs -depends = default description = Adds stairs, slabs, inner and outer corners and slopes. +optional_depends = default +min_minetest_version = 5.0 diff --git a/mods/stairs/settingtypes.txt b/mods/stairs/settingtypes.txt new file mode 100644 index 00000000..12c5ba7c --- /dev/null +++ b/mods/stairs/settingtypes.txt @@ -0,0 +1 @@ +stairs.glass_sides (Show glass stair side texture) bool true diff --git a/mods/stairs/sounds/wool_coat_movement.ogg b/mods/stairs/sounds/wool_coat_movement.ogg deleted file mode 100644 index 89df47f4..00000000 Binary files a/mods/stairs/sounds/wool_coat_movement.ogg and /dev/null differ diff --git a/mods/stairs/stairs.lua b/mods/stairs/stairs.lua index 6be63e7c..8d0a9c15 100644 --- a/mods/stairs/stairs.lua +++ b/mods/stairs/stairs.lua @@ -1,584 +1,564 @@ -local grp = {} -- Helper +-- Translation support + +local S = minetest.get_translator("stairs") + +-- Local functions so we can apply translations + +local function my_register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex) + + stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair), + sounds, worldaligntex) + + stairs.register_stair_inner(subname, recipeitem, groups, images, "", + sounds, worldaligntex, S("Inner " .. desc_stair)) + + stairs.register_stair_outer(subname, recipeitem, groups, images, "", + sounds, worldaligntex, S("Outer " .. desc_stair)) + + stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab), + sounds, worldaligntex) +end + +local function my_register_all(subname, recipeitem, groups, images, desc, + sounds, worldaligntex) + + my_register_stair_and_slab(subname, recipeitem, groups, images, desc .. " Stair", + desc .. " Slab", sounds, worldaligntex) + + stairs.register_slope(subname, recipeitem, groups, images, S(desc .. " Slope"), + sounds, worldaligntex) + + stairs.register_slope_inner(subname, recipeitem, groups, images, + S("Inner " .. desc .. " Slope"), sounds, worldaligntex) + + stairs.register_slope_outer(subname, recipeitem, groups, images, + S("Outer " .. desc .. " Slope"), sounds, worldaligntex) +end --= Default Minetest --- Wood types +if minetest.get_modpath("default") then -stairs.register_all("wood", "default:wood", - {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - {"default_wood.png"}, - "Wooden", - stairs.wood, false) + -- Wood -stairs.register_all("junglewood", "default:junglewood", - {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - {"default_junglewood.png"}, - "Jungle Wood", - stairs.wood, false) + my_register_all("wood", "default:wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_wood.png"}, + "Wooden", + nil, true) -stairs.register_all("pine_wood", "default:pinewood", - {choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, - {"default_pine_wood.png"}, - "Pine Wood", - stairs.wood, false) + my_register_all("junglewood", "default:junglewood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_junglewood.png"}, + "Jungle Wood", + nil, true) --- Register aliases for new pine node names -minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") -minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") + my_register_all("pine_wood", "default:pinewood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood", + nil, true) -stairs.register_all("acacia_wood", "default:acacia_wood", - {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, - {"default_acacia_wood.png"}, - "Acacia Wood", - stairs.wood, false) + -- Register aliases for new pine node names + minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") + minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") -stairs.register_all("aspen_wood", "default:aspen_wood", - {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, - {"default_aspen_wood.png"}, - "Aspen Wood", - stairs.wood, false) + my_register_all("acacia_wood", "default:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_acacia_wood.png"}, + "Acacia Wood", + nil, true) --- Stone types + my_register_all("aspen_wood", "default:aspen_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood", + nil, true) -stairs.register_all("stone", "default:stone", - {cracky = 3}, - {"default_stone.png"}, - "Stone", - stairs.stone, true) + -- Stone -stairs.register_all("stonebrick", "default:stonebrick", - {cracky = 2}, - {"default_stone_brick.png"}, - "Stone Brick", - stairs.stone, false) + my_register_all("stone", "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone", + nil, true) -stairs.register_all("stone_block", "default:stone_block", - {cracky = 2}, - {"default_stone_block.png"}, - "Stone Block", - stairs.stone, true) + my_register_all("stonebrick", "default:stonebrick", + {cracky = 2}, + {"default_stone_brick.png"}, + "Stone Brick", + nil, true) -stairs.register_all("cobble", "default:cobble", - {cracky = 3}, - {"default_cobble.png"}, - "Cobble", - stairs.stone, true) + my_register_all("stone_block", "default:stone_block", + {cracky = 2}, + {"default_stone_block.png"}, + "Stone Block", + nil, true) -stairs.register_all("mossycobble", "default:mossycobble", - {cracky = 3}, - {"default_mossycobble.png"}, - "Mossy Cobble", - stairs.stone, true) + my_register_all("cobble", "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobble", + nil, true) -stairs.register_all("desert_stone", "default:desert_stone", - {cracky = 3}, - {"default_desert_stone.png"}, - "Desert Stone", - stairs.stone, true) + my_register_all("mossycobble", "default:mossycobble", + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobble", + nil, true) -stairs.register_all("desert_stonebrick", "default:desert_stonebrick", - {cracky = 2}, - {"default_desert_stone_brick.png"}, - "Desert Stone Brick", - stairs.stone, false) + my_register_all("desert_stone", "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desert Stone", + nil, true) -stairs.register_all("desert_stone_block", "default:desert_stone_block", - {cracky = 2}, - {"default_desert_stone_block.png"}, - "Desert Stone Block", - stairs.stone, true) + my_register_all("desert_stonebrick", "default:desert_stonebrick", + {cracky = 2}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick", + nil, false) -stairs.register_all("desert_cobble", "default:desert_cobble", - {cracky = 3}, - {"default_desert_cobble.png"}, - "Desert Cobble", - stairs.stone, true) + my_register_all("desert_stone_block", "default:desert_stone_block", + {cracky = 2}, + {"default_desert_stone_block.png"}, + "Desert Stone Block", + nil, true) --- Sandstone types + my_register_all("desert_cobble", "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobble", + nil, true) -stairs.register_all("sandstone", "default:sandstone", - {crumbly = 1, cracky = 3}, - {"default_sandstone.png"}, - "Sandstone", - stairs.stone, true) + -- Sandstone -stairs.register_all("sandstonebrick", "default:sandstonebrick", - {cracky = 2}, - {"default_sandstone_brick.png"}, - "Sandstone Brick", - stairs.stone, false) + my_register_all("sandstone", "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone", + nil, true) -stairs.register_all("sandstone_block", "default:sandstone_block", - {cracky = 2}, - {"default_sandstone_block.png"}, - "Sandstone Block", - stairs.stone, true) + my_register_all("sandstonebrick", "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick", + nil, false) -stairs.register_all("desert_sandstone", "default:desert_sandstone", - {crumbly = 1, cracky = 3}, - {"default_desert_sandstone.png"}, - "Desert Sandstone", - stairs.stone, true) + my_register_all("sandstone_block", "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block", + nil, true) -stairs.register_all("desert_sandstone_brick", "default:desert_sandstone_brick", - {cracky = 2}, - {"default_desert_sandstone_brick.png"}, - "Desert Sandstone Brick", - stairs.stone, false) + my_register_all("desert_sandstone", "default:desert_sandstone", + {crumbly = 1, cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone", + nil, true) -stairs.register_all("desert_sandstone_block", "default:desert_sandstone_block", - {cracky = 2}, - {"default_desert_sandstone_block.png"}, - "Desert Sandstone Block", - stairs.stone, true) + my_register_all("desert_sandstone_brick", "default:desert_sandstone_brick", + {cracky = 2}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick", + nil, false) -stairs.register_all("silver_sandstone", "default:silver_sandstone", - {crumbly = 1, cracky = 3}, - {"default_silver_sandstone.png"}, - "Silver Sandstone", - stairs.stone, true) + my_register_all("desert_sandstone_block", "default:desert_sandstone_block", + {cracky = 2}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block", + nil, true) -stairs.register_all("silver_sandstone_brick", "default:silver_sandstone_brick", - {cracky = 2}, - {"default_silver_sandstone_brick.png"}, - "Silver Sandstone Brick", - stairs.stone, false) + my_register_all("silver_sandstone", "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone", + nil, true) -stairs.register_all("silver_sandstone_block", "default:silver_sandstone_block", - {cracky = 2}, - {"default_silver_sandstone_block.png"}, - "Silver Sandstone Block", - stairs.stone, true) + my_register_all("silver_sandstone_brick", "default:silver_sandstone_brick", + {cracky = 2}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick", + nil, false) --- Obsidian + my_register_all("silver_sandstone_block", "default:silver_sandstone_block", + {cracky = 2}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block", + nil, true) -stairs.register_all("obsidian", "default:obsidian", - {cracky = 1, level = 2}, - {"default_obsidian.png"}, - "Obsidian", - stairs.stone, true) + -- Obsidian -stairs.register_all("obsidianbrick", "default:obsidianbrick", - {cracky = 1, level = 2}, - {"default_obsidian_brick.png"}, - "Obsidian Brick", - stairs.stone, false) + my_register_all("obsidian", "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian", + nil, true) -stairs.register_all("obsidian_block", "default:obsidian_block", - {cracky = 1, level = 2}, - {"default_obsidian_block.png"}, - "Obsidian block", - stairs.stone, true) + my_register_all("obsidianbrick", "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick", + nil, false) --- Cloud (with overrides) + my_register_all("obsidian_block", "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block", + nil, true) -stairs.register_stair("cloud", "default:cloud", - {unbreakable = 1, not_in_creative_inventory = 1}, - {"default_cloud.png"}, - "Cloud Stair", - stairs.wool) + -- Cloud (with overrides) -minetest.override_item("stairs:stair_cloud", { - on_blast = function() end, - on_drop = function(itemstack, dropper, pos) end, - drop = {}, -}) + stairs.register_stair("cloud", "default:cloud", + {unbreakable = 1, not_in_creative_inventory = 1}, + {"default_cloud.png"}, + S("Cloud Stair"), + nil) -stairs.register_slab("cloud", "default:cloud", - {unbreakable = 1, not_in_creative_inventory = 1}, - {"default_cloud.png"}, - "Cloud Slab", - stairs.wool) + minetest.override_item("stairs:stair_cloud", { + on_blast = function() end, + on_drop = function(itemstack, dropper, pos) end, + drop = {}, + }) -minetest.override_item("stairs:slab_cloud", { - on_blast = function() end, - on_drop = function(itemstack, dropper, pos) end, - drop = {}, -}) + stairs.register_slab("cloud", "default:cloud", + {unbreakable = 1, not_in_creative_inventory = 1}, + {"default_cloud.png"}, + S("Cloud Slab"), + nil) --- Ores + minetest.override_item("stairs:slab_cloud", { + on_blast = function() end, + on_drop = function(itemstack, dropper, pos) end, + drop = {}, + }) -stairs.register_all("coal", "default:coalblock", - {cracky = 3}, - {"default_coal_block.png"}, - "Coal", - stairs.stone, true) + -- Ores -stairs.register_all("steelblock", "default:steelblock", - {cracky = 1, level = 2}, - {"default_steel_block.png"}, - "Steel", - stairs.metal, true) + my_register_all("coal", "default:coalblock", + {cracky = 3}, + {"default_coal_block.png"}, + "Coal", + nil, true) -stairs.register_all("copperblock", "default:copperblock", - {cracky = 1, level = 2}, - {"default_copper_block.png"}, - "Copper", - stairs.metal, true) + my_register_all("steelblock", "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel", + nil, true) -stairs.register_all("bronzeblock", "default:bronzeblock", - {cracky = 1, level = 2}, - {"default_bronze_block.png"}, - "Bronze", - stairs.metal, true) + my_register_all("copperblock", "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper", + nil, true) -stairs.register_all("tinblock", "default:tinblock", - {cracky = 1, level = 2}, - {"default_tin_block.png"}, - "Tin", - stairs.metal, true) + my_register_all("bronzeblock", "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze", + nil, true) -stairs.register_all("mese", "default:mese", - {cracky = 1, level = 2}, - {"default_mese_block.png"}, - "Mese", - stairs.stone) + my_register_all("tinblock", "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin", + nil, true) -stairs.register_all("goldblock", "default:goldblock", - {cracky = 1}, - {"default_gold_block.png"}, - "Gold", - stairs.metal) + my_register_all("mese", "default:mese", + {cracky = 1, level = 2}, + {"default_mese_block.png"}, + "Mese", + nil) -stairs.register_all("diamondblock", "default:diamondblock", - {cracky = 1, level = 3}, - {"default_diamond_block.png"}, - "Diamond", - stairs.stone) + my_register_all("goldblock", "default:goldblock", + {cracky = 1}, + {"default_gold_block.png"}, + "Gold", + nil) --- Glass types + my_register_all("diamondblock", "default:diamondblock", + {cracky = 1, level = 3}, + {"default_diamond_block.png"}, + "Diamond", + nil) -stairs.register_all("glass", "default:glass", - {cracky = 3, oddly_breakable_by_hand = 3}, - {"default_glass.png"}, - "Glass", - stairs.glass) + -- Setting to show glass stair sides + local gsides = minetest.settings:get_bool("stairs.glass_sides") ~= false -stairs.register_all("obsidian_glass", "default:obsidian_glass", - {cracky = 2}, - {"default_obsidian_glass.png"}, - "Obsidian Glass", - stairs.glass) + -- Old glass stairs +-- my_register_all("glass", "default:glass", +-- {cracky = 3, oddly_breakable_by_hand = 3}, +-- {"default_glass.png"}, +-- "Glass", +-- stairs.glass) --- Brick, Snow and Ice + -- Glass (stairs registered seperately to use special texture) -stairs.register_all("brick", "default:brick", - {cracky = 3}, - {"default_brick.png"}, - "Brick", - stairs.stone, false) + local face_tex = "default_glass.png" + local side_tex = gsides and "stairs_glass_quarter.png" or face_tex -stairs.register_all("snowblock", "default:snowblock", - {crumbly = 3, cools_lava = 1, snowy = 1}, - {"default_snow.png"}, - "Snow Block", - default.node_sound_snow_defaults(), true) + stairs.register_stair( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {side_tex, face_tex, side_tex, side_tex, face_tex, side_tex}, + S("Glass Stair"), + nil, + false) -stairs.register_all("ice", "default:ice", - {cracky = 3, cools_lava = 1}, - {"default_ice.png"}, - "Ice", - default.node_sound_glass_defaults(), true) + stairs.register_slab( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {face_tex, face_tex, side_tex}, + S("Glass Slab"), + nil, + false) ---= More Ores Mod + stairs.register_stair_inner( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {side_tex, face_tex, side_tex, face_tex, face_tex, side_tex}, + "", + nil, + false, + S("Inner Glass Stair")) + + stairs.register_stair_outer( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {side_tex, face_tex, side_tex, side_tex, side_tex, side_tex}, + "", + nil, + false, + S("Outer Glass Stair")) + + stairs.register_slope( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {face_tex}, + S("Glass Slope"), + nil) + + stairs.register_slope_inner( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {face_tex}, + S("Glass Inner Slope"), + nil) + + stairs.register_slope_outer( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {face_tex}, + S("Glass Outer Slope"), + nil) + + -- Old obsidian glass stairs +-- my_register_all("obsidian_glass", "default:obsidian_glass", +-- {cracky = 2}, +-- {"default_obsidian_glass.png"}, +-- "Obsidian Glass", +-- stairs.glass) + + -- Obsidian Glass (stairs registered seperately to use special texture) + + face_tex = "default_obsidian_glass.png" + side_tex = gsides and "stairs_obsidian_glass_quarter.png" or face_tex + + stairs.register_stair( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {side_tex, face_tex, side_tex, side_tex, face_tex, side_tex}, + S("Obsidian Glass Stair"), + nil, + false) + + stairs.register_slab( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {face_tex, face_tex, side_tex}, + S("Obsidian Glass Slab"), + nil, + false) + + stairs.register_stair_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {side_tex, face_tex, side_tex, face_tex, face_tex, side_tex}, + "", + nil, + false, + S("Inner Obsidian Glass Stair")) + + stairs.register_stair_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {side_tex, face_tex, side_tex, side_tex, side_tex, side_tex}, + "", + nil, + false, + S("Outer Obsidian Glass Stair")) + + stairs.register_slope( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {face_tex}, + S("Obsidian Glass Slope"), + nil) + + stairs.register_slope_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {face_tex}, + S("Obsidian Glass Inner Slope"), + nil) + + stairs.register_slope_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 2}, + {face_tex}, + S("Obsidian Glass Outer Slope"), + nil) + + -- Brick, Snow and Ice + + my_register_all("brick", "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick", + nil, false) + + my_register_all("snowblock", "default:snowblock", + {crumbly = 3, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block", + nil, true) + + my_register_all("ice", "default:ice", + {cracky = 3, cools_lava = 1, slippery = 3}, + {"default_ice.png"}, + "Ice", + nil, true) +end + +-- More Ores mod if minetest.get_modpath("moreores") then -grp = {cracky = 1, level = 2} - -stairs.register_all("silver_block", "moreores:silver_block", - grp, - {"moreores_silver_block.png"}, - "Silver", - stairs.metal, true) - -stairs.register_all("mithril_block", "moreores:mithril_block", - grp, - {"moreores_mithril_block.png"}, - "Mithril", - stairs.metal, true) + my_register_all("silver_block", "moreores:silver_block", + {cracky = 1, level = 2}, + {"moreores_silver_block.png"}, + "Silver", + nil, true) + my_register_all("mithril_block", "moreores:mithril_block", + {cracky = 1, level = 2}, + {"moreores_mithril_block.png"}, + "Mithril", + nil, true) end ---= Mobs Mod +-- Mobs mod -if minetest.registered_nodes["mobs:cheeseblock"] then +if minetest.get_modpath("mobs_animal") then -grp = {crumbly = 3, flammable = 2} - -stairs.register_all("cheeseblock", "mobs:cheeseblock", - grp, - {"mobs_cheeseblock.png"}, - "Cheese Block", - stairs.dirt) - -stairs.register_all("honey_block", "mobs:honey_block", - grp, - {"mobs_honey_block.png"}, - "Honey Block", - stairs.dirt) + my_register_all("cheeseblock", "mobs:cheeseblock", + {crumbly = 3, flammable = 2}, + {"mobs_cheeseblock.png"}, + "Cheese Block", + nil, true) + my_register_all("honey_block", "mobs:honey_block", + {crumbly = 3, flammable = 2}, + {"mobs_honey_block.png"}, + "Honey Block", + nil, true) end ---= Lapis Mod +-- Homedecor mod -if minetest.get_modpath("lapis") then +if minetest.get_modpath("homedecor_roofing") then -grp = {cracky = 3} + my_register_all("shingles_asphalt", "homedecor:shingles_asphalt", + {snappy = 3}, + {"homedecor_shingles_asphalt.png"}, + "Asphalt Shingle", + nil, true) -stairs.register_all("lapis_block", "lapis:lapis_block", - grp, - {"lapis_block_side.png"}, - "Lapis", - stairs.stone) - -stairs.register_all("lapis_brick", "lapis:lapis_brick", - grp, - {"lapis_brick.png"}, - "Lapis Brick", - stairs.stone) - -stairs.register_all("lapis_cobble", "lapis:lapis_cobble", - grp, - {"lapis_cobble.png"}, - "Lapis Cobble", - stairs.stone) + my_register_all("shingles_terracotta", "homedecor:shingles_terracotta", + {snappy = 3}, + {"homedecor_shingles_terracotta.png"}, + "Terracotta Shingle", + nil, true) + my_register_all("shingles_wood", "homedecor:shingles_wood", + {snappy = 3}, + {"homedecor_shingles_wood.png"}, + "Wooden Shingle", + nil, true) end ---= Homedecor Mod +-- Castle mod -if minetest.get_modpath("homedecor") then +if minetest.get_modpath("castle_masonry") then -local grp = {snappy = 3} - -stairs.register_all("shingles_asphalt", "homedecor:shingles_asphalt", - grp, - {"homedecor_shingles_asphalt.png"}, - "Asphalt Shingle", - stairs.leaves) - -stairs.register_all("shingles_terracotta", "homedecor:roof_tile_terracotta", - grp, - {"homedecor_shingles_terracotta.png"}, - "Terracotta Shingle", - stairs.leaves) - -stairs.register_all("shingles_wood", "homedecor:shingles_wood", - grp, - {"homedecor_shingles_wood.png"}, - "Wooden Shingle", - stairs.leaves) + my_register_all("dungeon_stone", "castle:dungeon_stone", + {cracky = 2}, + {"castle_dungeon_stone.png"}, + "Dungeon", + nil) + my_register_all("stonewall", "castle:stonewall", + {cracky = 2}, + {"castle_stonewall.png"}, + "Castle Wall", + nil, true) end ---= Xanadu Mod - -if minetest.get_modpath("xanadu") then - -grp = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3} - -stairs.register_all("stained_wood_white", "xanadu:stained_wood_white", - grp, - {"stained_wood_white.png"}, - "White Wooden", - stairs.wood, false) - -stairs.register_all("stained_wood_red", "xanadu:stained_wood_red", - grp, - {"stained_wood_red.png"}, - "Red Wooden", - stairs.wood, false) - --- Decorative blocks - -grp = {cracky = 3} - -stairs.register_all("stone1", "xanadu:stone1", - grp, - {"stone1.png"}, - "Decorative Stone 1", - stairs.stone) - -stairs.register_all("stone2", "xanadu:stone2", - grp, - {"stone2.png"}, - "Decorative Stone 2", - stairs.stone) - -stairs.register_all("stone3", "xanadu:stone3", - grp, - {"stone3.png"}, - "Decorative Stone 3", - stairs.stone) - -stairs.register_all("stone4", "xanadu:stone4", - grp, - {"stone4.png"}, - "Decorative Stone 4", - stairs.stone) - -stairs.register_all("stone5", "xanadu:stone5", - grp, - {"stone5.png"}, - "Decorative Stone 5", - stairs.stone) - -stairs.register_all("stone6", "xanadu:stone6", - grp, - {"stone6.png"}, - "Decorative Stone 6", - stairs.stone) - -stairs.register_all("sandstonebrick1", "xanadu:sandstonebrick1", - grp, - {"sandstonebrick1.png"}, - "Decorative Sandstone 1", - stairs.stone) - -stairs.register_all("sandstonebrick4", "xanadu:sandstonebrick4", - grp, - {"sandstonebrick4.png"}, - "Decorative Sandstone 4", - stairs.stone) - -stairs.register_slab("desert_cobble1", "xanadu:desert_cobble1", - grp, - {"desert_cobble1.png"}, - "Decorative desert cobble 1 slab", - stairs.stone) - -stairs.register_slab("desert_cobble5", "xanadu:desert_cobble5", - grp, - {"desert_cobble5.png"}, - "Decorative desert cobble 5 slab", - stairs.stone) - -stairs.register_slab("desert_stone1", "xanadu:desert_stone1", - grp, - {"desert_stone1.png"}, - "Decorative desert stone 1 slab", - stairs.stone) - -stairs.register_slab("desert_stone3", "xanadu:desert_stone3", - grp, - {"desert_stone3.png"}, - "Decorative desert stone 3 slab", - stairs.stone) - -stairs.register_slab("desert_stone4", "xanadu:desert_stone4", - grp, - {"desert_stone4.png"}, - "Decorative desert stone 4 slab", - stairs.stone) - -stairs.register_stair("desert_stone4", "xanadu:desert_stone4", - grp, - {"desert_stone4.png"}, - "Decorative desert stone 4 stair", - stairs.stone) - -stairs.register_slab("desert_stone5", "xanadu:desert_stone5", - grp, - {"desert_stone5.png"}, - "Decorative desert stone 5 slab", - stairs.stone) - -stairs.register_slab("red1", "xanadu:red1", - grp, - {"baked_clay_red1.png"}, - "Decorative baked red clay 1 slab", - stairs.stone) - -stairs.register_all("bred2", "xanadu:red2", - grp, - {"baked_clay_red2.png"}, - "Decorative baked red clay 2", - stairs.stone) - -stairs.register_all("compressed_cobble", "xanadu:compressed_cobble", - {cracky = 3, level = 2}, - {"compressed_cobble.png"}, - "Compressed Cobble", - stairs.stone) - -stairs.register_all("compressed_dirt", "xanadu:compressed_dirt", - {crumbly = 2}, - {"compressed_dirt.png"}, - "Compressed Dirt", - stairs.stone) - -stairs.register_slope("steelblock1", "xanadu:steelblock1", - {cracky = 1, level = 2}, - {"steel_block1.png"}, - "Decorative Steelblock 1", - stairs.steel) - -stairs.register_slab("steelblock3", "xanadu:steelblock3", - {cracky = 1, level = 2}, - {"steel_block3.png"}, - "Decorative Steelblock 3", - stairs.steel) - -stairs.register_slope("steelblock5", "xanadu:steelblock5", - {cracky = 1, level = 2}, - {"steel_block5.png"}, - "Decorative Steelblock 5", - stairs.steel) -end - - ---= Castle Mod - -if minetest.get_modpath("castle") then - -grp = {cracky = 2} - -stairs.register_all("dungeon_stone", "castle:dungeon_stone", - grp, - {"castle_dungeon_stone.png"}, - "Dungeon", - stairs.stone) - -stairs.register_all("stonewall", "castle:stonewall", - grp, - {"castle_stonewall.png"}, - "Castle Wall", - stairs.stone) - -end - ---= Wool Mod +-- Wool mod if minetest.get_modpath("wool") then -local colours = { - {"black", "Black", "#000000b0"}, - {"blue", "Blue", "#015dbb70"}, - {"brown", "Brown", "#a78c4570"}, - {"cyan", "Cyan", "#01ffd870"}, - {"dark_green", "Dark Green", "#005b0770"}, - {"dark_grey", "Dark Grey", "#303030b0"}, - {"green", "Green", "#61ff0170"}, - {"grey", "Grey", "#5b5b5bb0"}, - {"magenta", "Magenta", "#ff05bb70"}, - {"orange", "Orange", "#ff840170"}, - {"pink", "Pink", "#ff65b570"}, - {"red", "Red", "#ff000070"}, - {"violet", "Violet", "#2000c970"}, - {"white", "White", "#abababc0"}, - {"yellow", "Yellow", "#e3ff0070"}, -} + local colours = { + {"black", "Black"}, + {"blue", "Blue"}, + {"brown", "Brown"}, + {"cyan", "Cyan"}, + {"dark_green", "Dark Green"}, + {"dark_grey", "Dark Grey"}, + {"green", "Green"}, + {"grey", "Grey"}, + {"magenta", "Magenta"}, + {"orange", "Orange"}, + {"pink", "Pink"}, + {"red", "Red"}, + {"violet", "Violet"}, + {"white", "White"}, + {"yellow", "Yellow"}, + } -for i = 1, #colours, 1 do - -stairs.register_all("wool_" .. colours[i][1], "wool:" .. colours[i][1], - {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, flammable = 3}, - {"wool_" .. colours[i][1] .. ".png"}, - colours[i][2] .. " Wool", - stairs.wool) - -end -- END for + for i = 1, #colours, 1 do + my_register_all("wool_" .. colours[i][1], "wool:" .. colours[i][1], + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, flammable = 3}, + {"wool_" .. colours[i][1] .. ".png"}, + colours[i][2] .. " Wool", + nil) -- nil to use node's own sounds + end end diff --git a/mods/stairs/textures/stairs_glass_quarter.png b/mods/stairs/textures/stairs_glass_quarter.png new file mode 100644 index 00000000..2c6b9e8d Binary files /dev/null and b/mods/stairs/textures/stairs_glass_quarter.png differ diff --git a/mods/stairs/textures/stairs_obsidian_glass_quarter.png b/mods/stairs/textures/stairs_obsidian_glass_quarter.png new file mode 100644 index 00000000..6e43396b Binary files /dev/null and b/mods/stairs/textures/stairs_obsidian_glass_quarter.png differ diff --git a/mods/stamina/README.txt b/mods/stamina/README.txt index 5a453089..8d3dde5e 100644 --- a/mods/stamina/README.txt +++ b/mods/stamina/README.txt @@ -55,18 +55,6 @@ TenPlus1 Additions: - Added Pipeworks checks for fake players - Added 60 second drunk effect when foods have {alcohol=1} group (eat 4 or more) - Moved exhaustion and hud_id to player table instead of player attributes + - Added 4 lucky block effects + - Ability to drink milk from mobs or soy milk from farming to counteract poison/drunk - -License: --------- -Code: -- all code LGPL-2.1+ -Textures: -- stamina_hud_poison.png - BlockMen (CC-BY 3.0) -- stamina_hud_fg.png - PilzAdam (WTFPL), modified by BlockMen -- stamina_hud_bg.png - PilzAdam (WTFPL), modified by BlockMen -Sounds: -- stamina_eat.*.ogg - http://www.freesound.org/people/sonictechtonic/sounds/242215/ CC-BY-3.0 - -stamina_burp.ogg - https://www.freesfx.co.uk/sfx/burp (small burp) -stamina_sip.ogg - https://elements.envato.com/sip-16081-C7V5YLG diff --git a/mods/stamina/depends.txt b/mods/stamina/depends.txt deleted file mode 100644 index 7c7fa76b..00000000 --- a/mods/stamina/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -3d_armor? -player_monoids? -pova? diff --git a/mods/stamina/description.txt b/mods/stamina/description.txt deleted file mode 100644 index 46395a10..00000000 --- a/mods/stamina/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds stamina, hunger and drunk effects. diff --git a/mods/stamina/init.lua b/mods/stamina/init.lua index ee39c090..2720c4f8 100644 --- a/mods/stamina/init.lua +++ b/mods/stamina/init.lua @@ -1,38 +1,86 @@ -stamina = {players = {}, mod = "redo"} +-- global -STAMINA_TICK = tonumber(minetest.settings:get("stamina_tick")) or 800 - -- time in seconds after that 1 stamina point is taken -STAMINA_TICK_MIN = 4 -- stamina ticks won't reduce stamina below this level -STAMINA_HEALTH_TICK = 4 -- time in seconds after player gets healed/damaged -STAMINA_MOVE_TICK = 0.5 -- time in seconds after the movement is checked -STAMINA_POISON_TICK = 1.25 -- time in seconds after player is poisoned +stamina = { + players = {}, mod = "redo", + -- time in seconds after that 1 stamina point is taken + TICK = tonumber(minetest.settings:get("stamina_tick")) or 800, + -- stamina ticks won't reduce stamina below this level + TICK_MIN = 4, + -- time in seconds after player gets healed/damaged + HEALTH_TICK = 4, + -- time in seconds after the movement is checked + MOVE_TICK = 0.5, + -- time in seconds after player is poisoned + POISON_TICK = 1.25, + -- exhaustion increased this value after digged node + EXHAUST_DIG = 2, + -- .. after digging node + EXHAUST_PLACE = 1, + -- .. if player movement detected + EXHAUST_MOVE = 1.5, + -- .. if jumping + EXHAUST_JUMP = 5, + -- .. if player crafts + EXHAUST_CRAFT = 2, + -- .. if player punches another player + EXHAUST_PUNCH = 40, + -- at what exhaustion player saturation gets lowered + EXHAUST_LVL = 160, + -- number of HP player gets healed after stamina.HEALTH_TICK + HEAL = 1, + -- lower level of saturation needed to get healed + HEAL_LVL = 5, + -- number of HP player gets damaged by stamina after stamina.HEALTH_TICK + STARVE = 1, + -- level of staturation that causes starving + STARVE_LVL = 3, + -- hud bar extends only to 20 + VISUAL_MAX = 20 +} -STAMINA_EXHAUST_DIG = 2 -- exhaustion increased this value after digged node -STAMINA_EXHAUST_PLACE = 1 -- .. after digging node -STAMINA_EXHAUST_MOVE = 1.5 -- .. if player movement detected -STAMINA_EXHAUST_JUMP = 5 -- .. if jumping -STAMINA_EXHAUST_CRAFT = 2 -- .. if player crafts -STAMINA_EXHAUST_PUNCH = 40 -- .. if player punches another player -STAMINA_EXHAUST_LVL = 160 -- at what exhaustion player saturation gets lowered +-- Translation support & localize math functions -STAMINA_HEAL = 1 -- number of HP player gets healed after STAMINA_HEALTH_TICK -STAMINA_HEAL_LVL = 5 -- lower level of saturation needed to get healed -STAMINA_STARVE = 1 -- number of HP player gets damaged by stamina after - -- STAMINA_HEALTH_TICK -STAMINA_STARVE_LVL = 3 -- level of staturation that causes starving +local S = minetest.get_translator("stamina") +local math_max, math_min = math.max, math.min +local math_floor, math_random = math.floor, math.random -STAMINA_VISUAL_MAX = 20 -- hud bar extends only to 20 +-- clamp values helper -SPRINT_SPEED = 0.3 -- how much faster player can run if satiated -SPRINT_JUMP = 0.1 -- how much higher player can jump if satiated -SPRINT_DRAIN = 0.35 -- how fast to drain satation while sprinting (0-1) +local function clamp(val, minval, maxval) + return math_max(math_min(val, maxval), minval) +end +-- how much faster players can run if satiated. + +local SPRINT_SPEED = clamp(tonumber( + minetest.settings:get("stamina_sprint_speed")) or 0.5, 0.0, 1.0) + +-- how much higher player can jump if satiated + +local SPRINT_JUMP = clamp(tonumber( + minetest.settings:get("stamina_sprint_jump")) or 0.1, 0.0, 1.0) + +-- how fast to drain satation while sprinting (0-1) + +local SPRINT_DRAIN = clamp(tonumber( + minetest.settings:get("stamina_sprint_drain")) or 0.35, 0.0, 1.0) + +-- are we a real player ? + +local function is_player(player) + + if player and type(player) == "userdata" and minetest.is_player(player) then + return true + end +end + +-- grab stamina level local function get_int_attribute(player) -- pipeworks fake player check - if not player or not player.get_attribute then + if not is_player(player) then return nil end @@ -46,26 +94,24 @@ local function get_int_attribute(player) return nil end +-- is player stamina & damage enabled local stamina_enabled = minetest.settings:get_bool("enable_stamina") ~= false +local damage_enabled = minetest.settings:get_bool("enable_damage") + +-- update stamina level local function stamina_update_level(player, level) -- pipeworks fake player check - if not player.get_attribute or not stamina_enabled then - return nil - end + if not is_player(player) then return nil end local old = get_int_attribute(player) - if level == old then -- To suppress HUD update - return - end + if level == old then return end -- To suppress HUD update -- players without interact priv cannot eat - if not minetest.check_player_privs(player, {interact = true}) then - return - end + if not minetest.check_player_privs(player, {interact = true}) then return end local meta = player and player:get_meta() ; if not meta then return end @@ -74,74 +120,63 @@ local function stamina_update_level(player, level) player:hud_change( stamina.players[player:get_player_name()].hud_id, "number", - math.min(STAMINA_VISUAL_MAX, level) + math_min(stamina.VISUAL_MAX, level) ) end - -- global function for mods to amend stamina level -stamina.change = function(player, change) + +function stamina.change(player, change) local name = player:get_player_name() - if not name or not change or change == 0 then + if not damage_enabled or not name or not change or change == 0 then return false end local level = get_int_attribute(player) + change - if level < 0 then level = 0 end - - if level > STAMINA_VISUAL_MAX then level = STAMINA_VISUAL_MAX end + level = clamp(level, 0, stamina.VISUAL_MAX) stamina_update_level(player, level) return true end +-- reduce stamina level local function exhaust_player(player, v) - if not player - or not player.is_player - or not player:is_player() - or not player.set_attribute then - return - end + if not is_player(player) or not player.set_attribute then return end - local name = player:get_player_name() - - if not name then - return - end + local name = player:get_player_name() ; if not name then return end local exhaustion = stamina.players[name].exhaustion + v - if exhaustion > STAMINA_EXHAUST_LVL then + if exhaustion > stamina.EXHAUST_LVL then exhaustion = 0 local h = get_int_attribute(player) - if h > 0 then - stamina_update_level(player, h - 1) - end + if h > 0 then stamina_update_level(player, h - 1) end end stamina.players[name].exhaustion = exhaustion end +-- Sprint settings --- Sprint settings and function local enable_sprint = minetest.settings:get_bool("sprint") ~= false local enable_sprint_particles = minetest.settings:get_bool("sprint_particles") ~= false local monoids = minetest.get_modpath("player_monoids") local pova_mod = minetest.get_modpath("pova") +-- turn sprint on/off local function set_sprinting(name, sprinting) - local player = minetest.get_player_by_name(name) + local player = minetest.get_player_by_name(name) ; if not player then return end -- get player physics local def = player:get_physics_override() @@ -150,22 +185,21 @@ local function set_sprinting(name, sprinting) if sprinting == true and not stamina.players[name].sprint then - if monoids then + if pova_mod then + + pova.add_override(name, "sprint", {speed = SPRINT_SPEED, jump = SPRINT_JUMP}) + + pova.do_override(player) + + stamina.players[name].sprint = true + + elseif monoids then stamina.players[name].sprint = player_monoids.speed:add_change( player, def.speed + SPRINT_SPEED) stamina.players[name].jump = player_monoids.jump:add_change( player, def.jump + SPRINT_JUMP) - - elseif pova_mod then - - pova.add_override(name, "sprint", - {speed = SPRINT_SPEED, jump = SPRINT_JUMP}) - - pova.do_override(player) - - stamina.players[name].sprint = true else player:set_physics_override({ speed = def.speed + SPRINT_SPEED, @@ -176,23 +210,23 @@ local function set_sprinting(name, sprinting) end elseif sprinting == false - and stamina.players[name] - and stamina.players[name].sprint then + and stamina.players[name] and stamina.players[name].sprint then - if monoids then - - player_monoids.speed:del_change(player, stamina.players[name].speed) - player_monoids.jump:del_change(player, stamina.players[name].jump) - - stamina.players[name].sprint = nil - stamina.players[name].jump = nil - - elseif pova_mod then + if pova_mod then pova.del_override(name, "sprint") pova.do_override(player) stamina.players[name].sprint = nil + + elseif monoids then + + player_monoids.speed:del_change(player, stamina.players[name].sprint) + player_monoids.jump:del_change(player, stamina.players[name].jump) + + stamina.players[name].sprint = nil + stamina.players[name].jump = nil + else player:set_physics_override({ speed = def.speed - SPRINT_SPEED, @@ -204,14 +238,14 @@ local function set_sprinting(name, sprinting) end end +-- particle effect when eating local function head_particle(player, texture) - local prop = player:get_properties() - local pos = player:get_pos() ; pos.y = pos.y + prop.eye_height -- mouth level + local prop = player and player:get_properties() ; if not prop then return end + local pos = player:get_pos() ; pos.y = pos.y + (prop.eye_height or 1.23) -- mouth level local dir = player:get_look_dir() - minetest.add_particlespawner({ amount = 5, time = 0.1, @@ -229,20 +263,20 @@ local function head_particle(player, texture) }) end +-- drunk check + local function drunk_tick() - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() + local name = player and player:get_player_name() - if name - and stamina.players[name] - and stamina.players[name].drunk then + if name and stamina.players[name] and stamina.players[name].drunk then -- play burp sound every 20 seconds when drunk local num = stamina.players[name].drunk - if num and num > 0 and math.floor(num / 20) == num / 20 then + if num and num > 0 and math_floor(num / 20) == num / 20 then head_particle(player, "bubble.png") @@ -267,7 +301,7 @@ local function drunk_tick() -- effect only works when not riding boat/cart/horse etc. if not player:get_attach() then - local yaw = player:get_look_horizontal() + math.random(-0.5, 0.5) + local yaw = player:get_look_horizontal() + math_random(-0.5, 0.5) player:set_look_horizontal(yaw) end @@ -275,32 +309,30 @@ local function drunk_tick() end end +-- health check local function health_tick() - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do - local air = player:get_breath() or 0 - local hp = player:get_hp() - local h = get_int_attribute(player) - local name = player:get_player_name() + local name = player and player:get_player_name() if name then + local air = player:get_breath() or 0 + local hp = player:get_hp() + local h = get_int_attribute(player) + -- damage player by 1 hp if saturation is < 2 - if h and h < STAMINA_STARVE_LVL - and hp > 0 then - player:set_hp(hp - STAMINA_STARVE, {hunger = true}) + if h and h < stamina.STARVE_LVL and hp > 0 then + player:set_hp(hp - stamina.STARVE, {hunger = true}) end -- don't heal if drowning or dead or poisoned - if h and h >= STAMINA_HEAL_LVL - and h >= hp - and hp > 0 - and air > 0 + if h and h >= stamina.HEAL_LVL and h >= hp and hp > 0 and air > 0 and not stamina.players[name].poisoned then - player:set_hp(hp + STAMINA_HEAL) + player:set_hp(hp + stamina.HEAL) stamina_update_level(player, h - 1) end @@ -308,10 +340,11 @@ local function health_tick() end end +-- movement check local function action_tick() - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do local controls = player and player:get_player_control() @@ -319,20 +352,17 @@ local function action_tick() if controls then if controls.jump then - exhaust_player(player, STAMINA_EXHAUST_JUMP) + exhaust_player(player, stamina.EXHAUST_JUMP) - elseif controls.up - or controls.down - or controls.left - or controls.right then - exhaust_player(player, STAMINA_EXHAUST_MOVE) + elseif controls.up or controls.down or controls.left or controls.right then + exhaust_player(player, stamina.EXHAUST_MOVE) end end --- START sprint if enable_sprint then - local name = player and player:get_player_name() + local name = is_player(player) and player:get_player_name() -- check if player can sprint (stamina must be over 6 points) if name @@ -359,22 +389,22 @@ local function action_tick() minetest.add_particlespawner({ amount = 5, - time = 0.01, - minpos = {x = pos.x - 0.25, y = pos.y + 0.1, z = pos.z - 0.25}, - maxpos = {x = pos.x + 0.25, y = pos.y + 0.1, z = pos.z + 0.25}, - minvel = {x = -0.5, y = 1, z = -0.5}, - maxvel = {x = 0.5, y = 2, z = 0.5}, - minacc = {x = 0, y = -5, z = 0}, - maxacc = {x = 0, y = -12, z = 0}, - minexptime = 0.25, - maxexptime = 0.5, + time = 0.5, + minpos = {x = -0.5, y = 0.1, z = -0.5}, + maxpos = {x = 0.5, y = 0.1, z = 0.5}, + minvel = {x = 0, y = 5, z = 0}, + maxvel = {x = 0, y = 5, z = 0}, + minacc = {x = 0, y = -13, z = 0}, + maxacc = {x = 0, y = -13, z = 0}, + minexptime = 0.1, + maxexptime = 1, minsize = 0.5, - maxsize = 1.0, + maxsize = 1.5, vertical = false, collisiondetection = false, + attached = player, texture = "default_dirt.png" }) - end end @@ -382,7 +412,7 @@ local function action_tick() local level = get_int_attribute(player) stamina_update_level(player, - level - (SPRINT_DRAIN * STAMINA_MOVE_TICK)) + level - (SPRINT_DRAIN * stamina.MOVE_TICK)) elseif name then set_sprinting(name, false) @@ -392,10 +422,11 @@ local function action_tick() end end +-- poisoned check local function poison_tick() - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do local name = player and player:get_player_name() @@ -404,8 +435,7 @@ local function poison_tick() and stamina.players[name].poisoned and stamina.players[name].poisoned > 0 then - stamina.players[name].poisoned = - stamina.players[name].poisoned - 1 + stamina.players[name].poisoned = stamina.players[name].poisoned - 1 local hp = player:get_hp() - 1 @@ -415,9 +445,7 @@ local function poison_tick() player:set_hp(hp, {poison = true}) end - elseif name - and stamina.players[name] - and stamina.players[name].poisoned then + elseif name and stamina.players[name] and stamina.players[name].poisoned then if not stamina.players[name].drunk then @@ -430,21 +458,22 @@ local function poison_tick() end end +-- stamina check local function stamina_tick() - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do - local h = get_int_attribute(player) + local h = player and get_int_attribute(player) - if h and h > STAMINA_TICK_MIN then + if h and h > stamina.TICK_MIN then stamina_update_level(player, h - 1) end end end - -- Time based stamina functions + local stamina_timer, health_timer, action_timer, poison_timer, drunk_timer = 0,0,0,0,0 local function stamina_globaltimer(dtime) @@ -456,178 +485,160 @@ local function stamina_globaltimer(dtime) drunk_timer = drunk_timer + dtime -- simulate drunk walking (thanks LumberJ) - if drunk_timer > 1.0 then - drunk_tick() ; drunk_timer = 0 - end + if drunk_timer > 1.0 then drunk_tick() ; drunk_timer = 0 end -- hurt player when poisoned - if poison_timer > STAMINA_POISON_TICK then - poison_tick() ; poison_timer = 0 - end + if poison_timer > stamina.POISON_TICK then poison_tick() ; poison_timer = 0 end -- sprint control and particle animation - if action_timer > STAMINA_MOVE_TICK then - action_tick() ; action_timer = 0 - end + if action_timer > stamina.MOVE_TICK then action_tick() ; action_timer = 0 end - -- lower saturation by 1 point after STAMINA_TICK - if stamina_timer > STAMINA_TICK then - stamina_tick() ; stamina_timer = 0 - end + -- lower saturation by 1 point after stamina.TICK + if stamina_timer > stamina.TICK then stamina_tick() ; stamina_timer = 0 end -- heal or damage player, depending on saturation - if health_timer > STAMINA_HEALTH_TICK then - health_tick() ; health_timer = 0 - end + if health_timer > stamina.HEALTH_TICK then health_tick() ; health_timer = 0 end end +-- stamina and eating functions disabled if damage is disabled --- override core.do_item_eat() so we can redirect hp_change to stamina -core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) +if damage_enabled and minetest.settings:get_bool("enable_stamina") ~= false then - if user.is_fake_player then - return -- abort if called by fake player (eg. pipeworks-wielder) - end + -- override core.do_item_eat() so we can redirect hp_change to stamina + core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) - local old_itemstack = itemstack + if not is_player(user) then return end -- abort if called by fake player - itemstack = stamina.eat( - hp_change, replace_with_item, itemstack, user, pointed_thing) + local old_itemstack = itemstack - for _, callback in pairs(core.registered_on_item_eats) do + itemstack = stamina.eat( + hp_change, replace_with_item, itemstack, user, pointed_thing) - local result = callback(hp_change, replace_with_item, itemstack, user, - pointed_thing, old_itemstack) + for _, callback in pairs(core.registered_on_item_eats) do - if result then - return result + local result = callback(hp_change, replace_with_item, itemstack, user, + pointed_thing, old_itemstack) + + if result then return result end end - end - return itemstack -end - - --- not local since it's called from within core context -function stamina.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) - - if not itemstack or not user then return itemstack end - local level = get_int_attribute(user) or 0 + -- not local since it's called from within core context + function stamina.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) - if level >= STAMINA_VISUAL_MAX then - return itemstack - end + if not itemstack or not user then return itemstack end - local name = user:get_player_name() + local level = get_int_attribute(user) or 0 - if hp_change > 0 then + if level >= stamina.VISUAL_MAX then return itemstack end - stamina_update_level(user, level + hp_change) + local name = user:get_player_name() - elseif hp_change < 0 then + if hp_change > 0 then - -- assume hp_change < 0 - user:hud_change(stamina.players[name].hud_id, "text", "stamina_hud_poison.png") + stamina_update_level(user, level + hp_change) - stamina.players[name].poisoned = -hp_change - end + elseif hp_change < 0 then - -- if {drink=1} group set then use sip sound instead of default eat - local snd = "stamina_eat" - local itemname = itemstack:get_name() - local def = minetest.registered_items[itemname] + -- assume hp_change < 0 + user:hud_change(stamina.players[name].hud_id, "text", "stamina_hud_poison.png") - if def and def.groups and def.groups.drink then - snd = "stamina_sip" - end + stamina.players[name].poisoned = -hp_change + end - minetest.sound_play(snd, {to_player = name, gain = 0.7}, true) + -- if {drink=1} group set then use sip sound instead of default eat + local snd, gain = "stamina_eat", 0.7 + local itemname = itemstack:get_name() + local def = minetest.registered_items[itemname] - -- particle effect when eating - local texture = minetest.registered_items[itemname].inventory_image + if def and def.groups and def.groups.drink then + snd = "stamina_sip" ; gain = 1.0 + end - head_particle(user, texture) + minetest.sound_play(snd, {to_player = name, gain = gain}, true) - -- if player drinks milk then stop poison and being drunk - local item_name = itemstack:get_name() or "" - if item_name == "mobs:bucket_milk" - or item_name == "mobs:glass_milk" - or item_name == "farming:soy_milk" then + -- particle effect when eating + local texture = minetest.registered_items[itemname].inventory_image - stamina.players[name].poisoned = 0 - stamina.players[name].drunk = 0 - end + texture = texture or minetest.registered_items[itemname].wield_image - itemstack:take_item() + head_particle(user, texture) - if replace_with_item then + -- if player drinks milk then stop poison and being drunk + local item_name = itemstack:get_name() or "" - if itemstack:is_empty() then - itemstack:add_item(replace_with_item) - else - local inv = user:get_inventory() + if item_name == "mobs:bucket_milk" + or item_name == "mobs:glass_milk" + or item_name == "farming:soy_milk" then - if inv:room_for_item("main", {name = replace_with_item}) then - inv:add_item("main", replace_with_item) + stamina.players[name].poisoned = 0 + stamina.players[name].drunk = 0 + end + + itemstack:take_item() + + if replace_with_item then + + if itemstack:is_empty() then + itemstack:add_item(replace_with_item) else - local pos = user:get_pos() + local inv = user:get_inventory() - if pos then core.add_item(pos, replace_with_item) end + if inv:room_for_item("main", {name = replace_with_item}) then + inv:add_item("main", replace_with_item) + else + local pos = user:get_pos() + + if pos then core.add_item(pos, replace_with_item) end + end end end - end - -- check for alcohol - local units = minetest.registered_items[itemname].groups - and minetest.registered_items[itemname].groups.alcohol or 0 + -- check for alcohol + local units = minetest.registered_items[itemname].groups + and minetest.registered_items[itemname].groups.alcohol or 0 - if units > 0 then + if units > 0 then - stamina.players[name].units = (stamina.players[name].units or 0) + 1 + stamina.players[name].units = (stamina.players[name].units or 0) + 1 - if stamina.players[name].units > 3 then + if stamina.players[name].units > 3 then - stamina.players[name].drunk = 60 - stamina.players[name].units = 0 + stamina.players[name].drunk = 60 + stamina.players[name].units = 0 - user:hud_change(stamina.players[name].hud_id, "text", - "stamina_hud_poison.png") + user:hud_change(stamina.players[name].hud_id, "text", + "stamina_hud_poison.png") - minetest.chat_send_player(name, - minetest.get_color_escape_sequence("#1eff00") - .. "You suddenly feel tipsy!") + minetest.chat_send_player(name, + minetest.get_color_escape_sequence("#1eff00") + .. S("You suddenly feel tipsy!")) + end end + + return itemstack end - return itemstack -end - - --- stamina is disabled if damage is disabled -if minetest.settings:get_bool("enable_damage") -and minetest.settings:get_bool("enable_stamina") ~= false then - minetest.register_on_joinplayer(function(player) - local level = STAMINA_VISUAL_MAX -- TODO + if not player then return end + + local level = stamina.VISUAL_MAX -- TODO if get_int_attribute(player) then - - level = math.min(get_int_attribute(player), STAMINA_VISUAL_MAX) - else - local meta = player:get_meta() - - meta:set_string("stamina:level", level) + level = math_min(get_int_attribute(player), stamina.VISUAL_MAX) end - local name = player:get_player_name() + local meta = player:get_meta() - local id = player:hud_add({ + if meta then meta:set_string("stamina:level", level) end + + local name = player:get_player_name() + local hud_style = minetest.has_feature("hud_def_type_field") + local hud_tab = { name = "stamina", - hud_elem_type = "statbar", position = {x = 0.5, y = 1}, size = {x = 24, y = 24}, text = "stamina_hud_fg.png", @@ -635,7 +646,15 @@ and minetest.settings:get_bool("enable_stamina") ~= false then alignment = {x = -1, y = -1}, offset = {x = -266, y = -110}, max = 0 - }) + } + + if hud_style then + hud_tab["type"] = "statbar" + else + hud_tab["hud_elem_type"] = "statbar" + end + + local id = player:hud_add(hud_tab) stamina.players[name] = { hud_id = id, @@ -648,7 +667,7 @@ and minetest.settings:get_bool("enable_stamina") ~= false then minetest.register_on_respawnplayer(function(player) - local name = player:get_player_name() + local name = player and player:get_player_name() ; if not name then return end if stamina.players[name].poisoned or stamina.players[name].drunk then @@ -660,78 +679,56 @@ and minetest.settings:get_bool("enable_stamina") ~= false then stamina.players[name].drunk = nil stamina.players[name].sprint = nil - stamina_update_level(player, STAMINA_VISUAL_MAX) + stamina_update_level(player, stamina.VISUAL_MAX) end) minetest.register_globalstep(stamina_globaltimer) minetest.register_on_placenode(function(pos, oldnode, player, ext) - exhaust_player(player, STAMINA_EXHAUST_PLACE) + exhaust_player(player, stamina.EXHAUST_PLACE) end) minetest.register_on_dignode(function(pos, oldnode, player, ext) - exhaust_player(player, STAMINA_EXHAUST_DIG) + exhaust_player(player, stamina.EXHAUST_DIG) end) minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - exhaust_player(player, STAMINA_EXHAUST_CRAFT) + exhaust_player(player, stamina.EXHAUST_CRAFT) end) minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - exhaust_player(hitter, STAMINA_EXHAUST_PUNCH) + exhaust_player(hitter, stamina.EXHAUST_PUNCH) end) -else - - -- create player table on join +else -- create player table on join minetest.register_on_joinplayer(function(player) - stamina.players[player:get_player_name()] = { - poisoned = nil, sprint = nil, drunk = nil, exhaustion = 0} + + if player then + stamina.players[player:get_player_name()] = { + poisoned = nil, sprint = nil, drunk = nil, exhaustion = 0} + end end) end -- clear when player leaves + minetest.register_on_leaveplayer(function(player) - stamina.players[player:get_player_name()] = nil + + if player then + stamina.players[player:get_player_name()] = nil + end end) +-- add lucky blocks (if damage and stamina active) ---lucky blocks (if damage and stamina active) if minetest.get_modpath("lucky_block") and minetest.settings:get_bool("enable_damage") and minetest.settings:get_bool("enable_stamina") ~= false then - local effect_me = function(pos, player, def) + local MP = minetest.get_modpath(minetest.get_current_modname()) - local green = minetest.get_color_escape_sequence("#bada55") - local name = player:get_player_name() - - if def.poison or def.drunk then - - player:hud_change(stamina.players[name].hud_id, - "text", "stamina_hud_poison.png") - end - - if def.poison and def.poison > 0 then - - stamina.players[name].poisoned = def.poison - - minetest.chat_send_player(name, - green .. "Seems you have been poisoned!") - - elseif def.drunk and def.drunk > 0 then - - stamina.players[name].drunk = def.drunk - - minetest.chat_send_player(name, - green .. "You seem a little tipsy!") - end - end - - lucky_block:add_blocks({ - {"cus", effect_me, {poison = 5} }, - {"cus", effect_me, {poison = 10} }, - {"cus", effect_me, {drunk = 30} }, - }) + dofile(MP .. "/lucky_block.lua") end + +print("[MOD] Stamina loaded") diff --git a/mods/stamina/license.txt b/mods/stamina/license.txt new file mode 100644 index 00000000..05060c74 --- /dev/null +++ b/mods/stamina/license.txt @@ -0,0 +1,31 @@ +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + +Code: +- all code LGPL-2.1+ + +Textures: +- stamina_hud_poison.png - BlockMen (CC-BY 3.0) +- stamina_hud_fg.png - PilzAdam (WTFPL), modified by BlockMen +- stamina_hud_bg.png - PilzAdam (WTFPL), modified by BlockMen + +Sounds (CC-BY-3.0): +- stamina_eat.*.ogg - http://www.freesound.org/people/sonictechtonic/sounds/242215/ +- stamina_burp.ogg - https://www.freesfx.co.uk/sfx/burp (small burp) + +Sounds (Attribution 3.0): +- stamina_sip.1.ogg - https://freesound.org/people/Stevious42/sounds/259640/ + +Sound (Creative Commons 0): +- stamina_sip.2.ogg - https://freesound.org/people/SeanPorio/sounds/519268/ diff --git a/mods/stamina/lucky_block.lua b/mods/stamina/lucky_block.lua new file mode 100644 index 00000000..7ab03301 --- /dev/null +++ b/mods/stamina/lucky_block.lua @@ -0,0 +1,50 @@ + +-- colour helpers + +local green = minetest.get_color_escape_sequence("#bada55") +local green2 = minetest.get_color_escape_sequence("#33ff55") + +-- poison and drunk effects function + +local effect_me = function(pos, player, def) + + local name = player:get_player_name() ; if not name then return end + + if def.poison or def.drunk then + + player:hud_change(stamina.players[name].hud_id, "text", "stamina_hud_poison.png") + end + + if def.poison and def.poison > 0 then + + stamina.players[name].poisoned = def.poison + + minetest.chat_send_player(name, green .. "Seems you have been poisoned!") + + elseif def.drunk and def.drunk > 0 then + + stamina.players[name].drunk = def.drunk + + minetest.chat_send_player(name, green .. "You seem a little tipsy!") + end +end + +-- restore stamina function + +local full_stamina = function(pos, player, def) + + local name = player:get_player_name() ; if not name then return end + + stamina.change(player, 100) -- set to 100 incase of default stamina increase + + minetest.chat_send_player(name, green2 .. "You suddenly feel full!") +end + +-- add lucky blocks + +lucky_block:add_blocks({ + {"cus", effect_me, {poison = 5}}, + {"cus", effect_me, {poison = 10}}, + {"cus", effect_me, {drunk = 30}}, + {"cus", full_stamina} +}) diff --git a/mods/stamina/mod.conf b/mods/stamina/mod.conf index 0f96b0a2..f92f49f2 100644 --- a/mods/stamina/mod.conf +++ b/mods/stamina/mod.conf @@ -1,4 +1,5 @@ name = stamina +description = Adds stamina, hunger and drunk effects. depends = default optional_depends = 3d_armor, player_monoids, pova, lucky_block -description = Adds stamina, hunger and drunk effects. +min_minetest_version = 5.0 diff --git a/mods/stamina/settingtypes.txt b/mods/stamina/settingtypes.txt index 47383321..467b8a1f 100644 --- a/mods/stamina/settingtypes.txt +++ b/mods/stamina/settingtypes.txt @@ -5,3 +5,9 @@ sprint_particles (Enable sprint particles) bool true enable_stamina (Enable stamina/hunger) bool true stamina_tick (Time in seconds after which 1 saturation point is taken) float 800 + +stamina_sprint_speed (Extra sprint speed - 0.0 to 1.0) float 0.3 + +stamina_sprint_jump (Extra sprint jump height - 0.0 to 1.0) float 0.1 + +stamina_sprint_drain (Sprint stamina drain - 0.0 to 1.0) float 0.35 diff --git a/mods/stamina/sounds/stamina_sip.1.ogg b/mods/stamina/sounds/stamina_sip.1.ogg new file mode 100644 index 00000000..8c00dc41 Binary files /dev/null and b/mods/stamina/sounds/stamina_sip.1.ogg differ diff --git a/mods/stamina/sounds/stamina_sip.2.ogg b/mods/stamina/sounds/stamina_sip.2.ogg new file mode 100644 index 00000000..c1dab557 Binary files /dev/null and b/mods/stamina/sounds/stamina_sip.2.ogg differ diff --git a/mods/stamina/sounds/stamina_sip.ogg b/mods/stamina/sounds/stamina_sip.ogg deleted file mode 100644 index 5d7e49ca..00000000 Binary files a/mods/stamina/sounds/stamina_sip.ogg and /dev/null differ diff --git a/mods/stamina/textures/stamina_hud_poison.png b/mods/stamina/textures/stamina_hud_poison.png index 0f80ad26..b2fd698a 100644 Binary files a/mods/stamina/textures/stamina_hud_poison.png and b/mods/stamina/textures/stamina_hud_poison.png differ diff --git a/mods/techpack/gravelsieve/depends.txt b/mods/techpack/gravelsieve/depends.txt deleted file mode 100644 index f18b1c53..00000000 --- a/mods/techpack/gravelsieve/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -default -moreblocks? -tubelib? -hopper? -pipeworks? - diff --git a/mods/techpack/gravelsieve/description.txt b/mods/techpack/gravelsieve/description.txt deleted file mode 100644 index 530c902e..00000000 --- a/mods/techpack/gravelsieve/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod includes a hammer to produce gravel from Cobblestone and a sieve to sift gravel to find ores. \ No newline at end of file diff --git a/mods/techpack/gravelsieve/init.lua b/mods/techpack/gravelsieve/init.lua index 1ae7edcc..e1a96df3 100644 --- a/mods/techpack/gravelsieve/init.lua +++ b/mods/techpack/gravelsieve/init.lua @@ -48,21 +48,15 @@ local S = gravelsieve.S dofile(minetest.get_modpath("gravelsieve") .. "/hammer.lua") -local settings_get -if minetest.setting_get then - settings_get = minetest.setting_get -else - settings_get = function(...) return minetest.settings:get(...) end -end -gravelsieve.ore_rarity = tonumber(settings_get("gravelsieve_ore_rarity")) or 1.16 -gravelsieve.ore_max_elevation = tonumber(settings_get("gravelsieve_ore_max_elevation")) or 0 -gravelsieve.ore_min_elevation = tonumber(settings_get("gravelsieve_ore_min_elevation")) or -30912 +gravelsieve.ore_rarity = tonumber(minetest.settings:get("gravelsieve_ore_rarity")) or 1.16 +gravelsieve.ore_max_elevation = tonumber(minetest.settings:get("gravelsieve_ore_max_elevation")) or 0 +gravelsieve.ore_min_elevation = tonumber(minetest.settings:get("gravelsieve_ore_min_elevation")) or -30912 local y_spread = math.max(1 + gravelsieve.ore_max_elevation - gravelsieve.ore_min_elevation, 1) -- Increase the probability over the natural occurrence -local PROBABILITY_FACTOR = tonumber(settings_get("gravelsieve_probability_factor")) or 3 +local PROBABILITY_FACTOR = tonumber(minetest.settings:get("gravelsieve_probability_factor")) or 3 -local STEP_DELAY = tonumber(settings_get("gravelsieve_step_delay")) or 1.0 +local STEP_DELAY = tonumber(minetest.settings:get("gravelsieve_step_delay")) or 1.0 -- tubelib aging feature local AGING_LEVEL1 = nil @@ -471,6 +465,7 @@ for idx = 0,4 do minetest.register_node(node_name..idx, { description = description, tiles = tiles_data, + use_texture_alpha = "clip", drawtype = "nodebox", drop = node_name, @@ -571,6 +566,7 @@ for idx = 0,4 do is_ground_content = false, groups = {choppy=2, cracky=1, not_in_creative_inventory=not_in_creative_inventory, tubedevice = 1, tubedevice_receiver = 1}, drop = node_name.."3", + on_blast = function() end, }) end end @@ -637,6 +633,7 @@ if minetest.global_exists("tubelib") then sunlight_propagates = true, is_ground_content = false, groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, + on_blast = function() end, }) tubelib.register_node("gravelsieve:auto_sieve3", @@ -758,5 +755,3 @@ if minetest.get_modpath("moreblocks") then sounds = default.node_sound_stone_defaults(), }) end - - diff --git a/mods/techpack/gravelsieve/locale/gravelsieve.de.tr b/mods/techpack/gravelsieve/locale/gravelsieve.de.tr index 71d7ee2a..76970ed7 100644 --- a/mods/techpack/gravelsieve/locale/gravelsieve.de.tr +++ b/mods/techpack/gravelsieve/locale/gravelsieve.de.tr @@ -1,14 +1,6 @@ # textdomain: gravelsieve - - - -### hammer.lua ### - Hammer converts Cobblestone into Gravel=Hammer, Zertrümmert Pflasterstein in Kies - -### init.lua ### - -Automatic Gravel Sieve=Automatisches Kiessieb -Compressed Gravel=Komprimiertes Kies Gravel Sieve=Kiessieb +Automatic Gravel Sieve=Automatisches Kiessieb Sieved Gravel=Gesiebtes Kies +Compressed Gravel=Komprimiertes Kies diff --git a/mods/techpack/gravelsieve/locale/gravelsieve.zh_CN.tr b/mods/techpack/gravelsieve/locale/gravelsieve.zh_CN.tr new file mode 100644 index 00000000..f5bcad90 --- /dev/null +++ b/mods/techpack/gravelsieve/locale/gravelsieve.zh_CN.tr @@ -0,0 +1,6 @@ +# textdomain: gravelsieve +Hammer converts Cobblestone into Gravel=锤子将鹅卵石转化为砾石 +Gravel Sieve=砾石筛 +Automatic Gravel Sieve=自动砾石筛 +Sieved Gravel=已经筛过的砾石 +Compressed Gravel=压缩砾石 diff --git a/mods/techpack/gravelsieve/locale/gravelsieve.zh_TW.tr b/mods/techpack/gravelsieve/locale/gravelsieve.zh_TW.tr new file mode 100644 index 00000000..e60b4a4d --- /dev/null +++ b/mods/techpack/gravelsieve/locale/gravelsieve.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: gravelsieve +Hammer converts Cobblestone into Gravel=錘子將鵝卵石轉化為礫石 +Gravel Sieve=礫石篩 +Automatic Gravel Sieve=自動礫石篩 +Sieved Gravel=已經篩過的礫石 +Compressed Gravel=壓縮礫石 diff --git a/mods/techpack/gravelsieve/locale/template.txt b/mods/techpack/gravelsieve/locale/template.txt index bc128d53..75e68ed6 100644 --- a/mods/techpack/gravelsieve/locale/template.txt +++ b/mods/techpack/gravelsieve/locale/template.txt @@ -1,14 +1,6 @@ # textdomain: gravelsieve - - - -### hammer.lua ### - Hammer converts Cobblestone into Gravel= - -### init.lua ### - -Automatic Gravel Sieve= -Compressed Gravel= Gravel Sieve= +Automatic Gravel Sieve= Sieved Gravel= +Compressed Gravel= diff --git a/mods/techpack/gravelsieve/mod.conf b/mods/techpack/gravelsieve/mod.conf index 3280ed69..ff403b1b 100644 --- a/mods/techpack/gravelsieve/mod.conf +++ b/mods/techpack/gravelsieve/mod.conf @@ -1,4 +1,4 @@ -name=gravelsieve -description=This mod includes a hammer to produce gravel from Cobblestone and a sieve to sift gravel to find ores. -depends=default -optional_depends=moreblocks,tubelib,hopper,pipeworks +name = gravelsieve +description = This mod includes a hammer to produce gravel from Cobblestone and a sieve to sift gravel to find ores. +depends = default +optional_depends = moreblocks, tubelib, hopper, pipeworks diff --git a/mods/techpack/i18n.py b/mods/techpack/i18n.py index 93938d4c..5390ab96 100644 --- a/mods/techpack/i18n.py +++ b/mods/techpack/i18n.py @@ -21,20 +21,28 @@ params = {"recursive": False, "mods": False, "verbose": False, "folders": [], - "no-old-file": False + "no-old-file": False, + "break-long-lines": False, + "sort": False, + "print-source": False, + "truncate-unused": False, } # Available CLI options options = {"recursive": ['--recursive', '-r'], "help": ['--help', '-h'], - "mods": ['--installed-mods'], + "mods": ['--installed-mods', '-m'], "verbose": ['--verbose', '-v'], - "no-old-file": ['--no-old-file'] + "no-old-file": ['--no-old-file', '-O'], + "break-long-lines": ['--break-long-lines', '-b'], + "sort": ['--sort', '-s'], + "print-source": ['--print-source', '-p'], + "truncate-unused": ['--truncate-unused', '-t'], } # Strings longer than this will have extra space added between # them in the translation files to make it easier to distinguish their # beginnings and endings at a glance -doublespace_threshold = 60 +doublespace_threshold = 80 def set_params_folders(tab: list): '''Initialize params["folders"] from CLI arguments.''' @@ -69,8 +77,16 @@ DESCRIPTION run on locally installed modules {', '.join(options["no-old-file"])} do not create *.old files + {', '.join(options["sort"])} + sort output strings alphabetically + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["print-source"])} + add comments denoting the source file {', '.join(options["verbose"])} add output information + {', '.join(options["truncate-unused"])} + delete unused strings from files ''') @@ -89,8 +105,8 @@ def main(): print("recursively ", end='') # Running if params["mods"]: - print(f"on all locally installed modules in {os.path.abspath('~/.minetest/mods/')}") - run_all_subfolders("~/.minetest/mods") + print(f"on all locally installed modules in {os.path.expanduser('~/.minetest/mods/')}") + run_all_subfolders(os.path.expanduser("~/.minetest/mods")) elif len(params["folders"]) >= 2: print("on folder list:", params["folders"]) for f in params["folders"]: @@ -126,7 +142,7 @@ pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') pattern_tr_filename = re.compile(r'\.tr$') pattern_po_language_code = re.compile(r'(.*)\.po$') -#attempt to read the mod's name from the mod.conf file. Returns None on failure +#attempt to read the mod's name from the mod.conf file or folder name. Returns None on failure def get_modname(folder): try: with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: @@ -135,7 +151,15 @@ def get_modname(folder): if match: return match.group(1) except FileNotFoundError: - pass + if not os.path.isfile(os.path.join(folder, "modpack.txt")): + folder_name = os.path.basename(folder) + # Special case when run in Minetest's builtin directory + if folder_name == "builtin": + return "__builtin" + else: + return folder_name + else: + return None return None #If there are already .tr files in /locale, returns a list of their names @@ -183,7 +207,7 @@ def process_po_files(folder, modname): if code_match == None: continue language_code = code_match.group(1) - tr_name = modname + "." + language_code + ".tr" + tr_name = f'{modname}.{language_code}.tr' tr_file = os.path.join(root, tr_name) if os.path.exists(tr_file): if params["verbose"]: @@ -213,60 +237,64 @@ def mkdir_p(path): # dOld is a dictionary of existing translations and comments from # the previous version of this text def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): - lOut = [f"# textdomain: {mod_name}\n"] + lOut = [f"# textdomain: {mod_name}"] if header_comments is not None: lOut.append(header_comments) - + dGroupedBySource = {} for key in dkeyStrings: sourceList = list(dkeyStrings[key]) - sourceList.sort() + if params["sort"]: + sourceList.sort() sourceString = "\n".join(sourceList) listForSource = dGroupedBySource.get(sourceString, []) listForSource.append(key) dGroupedBySource[sourceString] = listForSource - + lSourceKeys = list(dGroupedBySource.keys()) lSourceKeys.sort() for source in lSourceKeys: localizedStrings = dGroupedBySource[source] - localizedStrings.sort() - lOut.append("") - lOut.append(source) - lOut.append("") + if params["sort"]: + localizedStrings.sort() + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) for localizedString in localizedStrings: val = dOld.get(localizedString, {}) translation = val.get("translation", "") comment = val.get("comment") - if len(localizedString) > doublespace_threshold and not lOut[-1] == "": + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": lOut.append("") - if comment != None: + if comment != None and comment != "" and not comment.startswith("# textdomain:"): lOut.append(comment) lOut.append(f"{localizedString}={translation}") - if len(localizedString) > doublespace_threshold: + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: lOut.append("") unusedExist = False - for key in dOld: - if key not in dkeyStrings: - val = dOld[key] - translation = val.get("translation") - comment = val.get("comment") - # only keep an unused translation if there was translated - # text or a comment associated with it - if translation != None and (translation != "" or comment): - if not unusedExist: - unusedExist = True - lOut.append("\n\n##### not used anymore #####\n") - if len(key) > doublespace_threshold and not lOut[-1] == "": - lOut.append("") - if comment != None: - lOut.append(comment) - lOut.append(f"{key}={translation}") - if len(key) > doublespace_threshold: - lOut.append("") + if not params["truncate-unused"]: + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") return "\n".join(lOut) + '\n' # Writes a template.txt file @@ -274,7 +302,7 @@ def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): def write_template(templ_file, dkeyStrings, mod_name): # read existing template file to preserve comments existing_template = import_tr_file(templ_file) - + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2]) mkdir_p(os.path.dirname(templ_file)) with open(templ_file, "wt", encoding='utf-8') as template_file: @@ -299,7 +327,7 @@ def read_lua_file_strings(lua_file): strings.append(s[1]) for s in pattern_lua_bracketed_fs.findall(text): strings.append(s) - + for s in strings: s = re.sub(r'"\.\.\s+"', "", s) s = re.sub("@[^@=0-9]", "@@", s) @@ -332,11 +360,11 @@ def import_tr_file(tr_file): latest_comment_block = None for line in existing_file.readlines(): line = line.rstrip('\n') - if line[:3] == "###": - if header_comment is None: + if line.startswith("###"): + if header_comment is None and not latest_comment_block is None: # Save header comments header_comment = latest_comment_block - # Stip textdomain line + # Strip textdomain line tmp_h_c = "" for l in header_comment.split('\n'): if not l.startswith("# textdomain:"): @@ -346,7 +374,7 @@ def import_tr_file(tr_file): # Reset comment block if we hit a header latest_comment_block = None continue - if line[:1] == "#": + elif line.startswith("#"): # Save the comment we're inside if not latest_comment_block: latest_comment_block = line @@ -383,7 +411,7 @@ def generate_template(folder, mod_name): sources = dOut.get(s, set()) sources.add(f"### {os.path.basename(fname)} ###") dOut[s] = sources - + if len(dOut) == 0: return None templ_file = os.path.join(folder, "locale/template.txt") @@ -414,7 +442,6 @@ def update_tr_file(dNew, mod_name, tr_file): # Updates translation files for the mod in the given folder def update_mod(folder): - print(folder) modname = get_modname(folder) if modname is not None: process_po_files(folder, modname) @@ -427,24 +454,23 @@ def update_mod(folder): update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) else: print(f"\033[31mUnable to find modname in folder {folder}.\033[0m", file=_stderr) - #exit(1) + exit(1) # Determines if the folder being pointed to is a mod or a mod pack # and then runs update_mod accordingly def update_folder(folder): is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) if is_modpack: - subfolders = [f.path for f in os.scandir(folder) if f.is_dir()] + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] for subfolder in subfolders: - update_mod(subfolder + "/") + update_mod(subfolder) else: update_mod(folder) print("Done.") def run_all_subfolders(folder): - for modfolder in [f.path for f in os.scandir(folder) if f.is_dir()]: - update_folder(modfolder + "/") + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) main() - diff --git a/mods/techpack/lcdlib/depends.txt b/mods/techpack/lcdlib/depends.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/techpack/lcdlib/mod.conf b/mods/techpack/lcdlib/mod.conf index 57e9be76..602f95ab 100644 --- a/mods/techpack/lcdlib/mod.conf +++ b/mods/techpack/lcdlib/mod.conf @@ -1 +1 @@ -name=lcdlib +name = lcdlib diff --git a/mods/techpack/safer_lua/depends.txt b/mods/techpack/safer_lua/depends.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/techpack/safer_lua/description.txt b/mods/techpack/safer_lua/description.txt deleted file mode 100644 index 97257ee7..00000000 --- a/mods/techpack/safer_lua/description.txt +++ /dev/null @@ -1,4 +0,0 @@ -SaferLua [safer_lua], a subset of the language Lua for safe and secure Lua sandboxes - - - diff --git a/mods/techpack/safer_lua/mod.conf b/mods/techpack/safer_lua/mod.conf index d319b89d..8098b790 100644 --- a/mods/techpack/safer_lua/mod.conf +++ b/mods/techpack/safer_lua/mod.conf @@ -1 +1 @@ -name=safer_lua +name = safer_lua diff --git a/mods/techpack/sl_controller/battery.lua b/mods/techpack/sl_controller/battery.lua index 1109dc81..78ef590e 100644 --- a/mods/techpack/sl_controller/battery.lua +++ b/mods/techpack/sl_controller/battery.lua @@ -9,13 +9,13 @@ See LICENSE.txt for more information battery.lua: - + REPLACED BY SMARTLINE BATTERY !!! ]]-- local function calc_percent(content) - local val = (sl_controller.battery_capacity - + local val = (sl_controller.battery_capacity - math.min(content or 0, sl_controller.battery_capacity)) return 100 - math.floor((val * 100.0 / sl_controller.battery_capacity)) end @@ -55,7 +55,7 @@ local function register_battery(ext, percent, nici) { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_int("content", sl_controller.battery_capacity * percent) @@ -65,10 +65,10 @@ local function register_battery(ext, percent, nici) on_timer(pos, 1) minetest.get_node_timer(pos):start(30) end, - + on_timer = on_timer, - - + + after_dig_node = function(pos, oldnode, oldmetadata, digger) local percent = calc_percent(tonumber(oldmetadata.fields.content)) local stack @@ -94,6 +94,7 @@ local function register_battery(ext, percent, nici) drop = "", is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) end @@ -121,12 +122,12 @@ minetest.register_node("sl_controller:battery_empty", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_int("content", 0) end, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", @@ -134,6 +135,7 @@ minetest.register_node("sl_controller:battery_empty", { drop = "", is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) diff --git a/mods/techpack/sl_controller/config.lua b/mods/techpack/sl_controller/config.lua index 407c516f..6c9558fb 100644 --- a/mods/techpack/sl_controller/config.lua +++ b/mods/techpack/sl_controller/config.lua @@ -1,2 +1,2 @@ -- Battery capacity in usec CPU time -sl_controller.battery_capacity = tonumber(minetest.setting_get("battery_capacity")) or 5000000 +sl_controller.battery_capacity = tonumber(minetest.settings:get("battery_capacity")) or 5000000 diff --git a/mods/techpack/sl_controller/controller.lua b/mods/techpack/sl_controller/controller.lua index 2ee0bacb..34ae8c70 100644 --- a/mods/techpack/sl_controller/controller.lua +++ b/mods/techpack/sl_controller/controller.lua @@ -18,15 +18,15 @@ local M = minetest.get_meta local sHELP = [[SaferLua Controller - This controller is used to control and monitor + This controller is used to control and monitor Tubelib/TechPack machines. This controller can be programmed in Lua. - + See on GitHub for more help: goo.gl/Et8D6n - The controller only runs, if a battery is + The controller only runs, if a battery is placed nearby. - + ]] local Cache = {} @@ -37,8 +37,8 @@ local tHelpTexts = {[" Overview"] = sHELP, [" Data structures"] = safer_lua.Data local sFunctionList = "" local tFunctionIndex = {} -minetest.after(2, function() - sFunctionList = table.concat(tFunctions, ",") +minetest.after(2, function() + sFunctionList = table.concat(tFunctions, ",") for idx,key in ipairs(tFunctions) do tFunctionIndex[key] = idx end @@ -268,7 +268,7 @@ local function patch_error_string(err, line_offs) else table.insert(tbl, s) end - end + end return table.concat(tbl, "\n") end @@ -296,7 +296,7 @@ local function compile(pos, meta, number) local env = table.copy(tCommands) env.meta = {pos=pos, owner=owner, number=number, error=error} local code = safer_lua.init(pos, init, func.."\n"..loop, env, error) - + if code then Cache[number] = {code=code, inputs={}, events=env.meta.events} Cache[number].inputs.term = nil -- terminal inputs @@ -314,7 +314,7 @@ local function battery(pos) return true end return false -end +end local function start_controller(pos) local meta = minetest.get_meta(pos) @@ -323,12 +323,12 @@ local function start_controller(pos) meta:set_string("formspec", formspec0(meta)) return false end - + meta:set_string("output", "") meta:set_int("cycletime", 1) meta:set_int("cyclecount", 0) meta:set_int("cpu", 0) - + if compile(pos, meta, number) then meta:set_int("state", tubelib.RUNNING) meta:set_int("running", tubelib.STATE_RUNNING) @@ -381,7 +381,7 @@ local function call_loop(pos, meta, elapsed) local cpu = meta:get_int("cpu") or 0 local code = Cache[number].code local res = safer_lua.run_loop(pos, elapsed, code, error) - if res then + if res then t = minetest.get_us_time() - t cpu = math.floor(((cpu * 20) + t) / 21) meta:set_int("cpu", cpu) @@ -419,7 +419,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local meta = minetest.get_meta(pos) - + --print(dump(fields)) if fields.cancel == nil then if fields.init then @@ -434,9 +434,9 @@ local function on_receive_fields(pos, formname, fields, player) elseif fields.notes then meta:set_string("notes", fields.notes) meta:set_string("formspec", formspec5(meta)) - end + end end - + if fields.update then meta:set_string("formspec", formspec4(meta)) elseif fields.clear then @@ -490,7 +490,7 @@ minetest.register_node("sl_controller:controller", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "sl_controller:controller") @@ -511,24 +511,25 @@ minetest.register_node("sl_controller:controller", { end, on_receive_fields = on_receive_fields, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return end - + minetest.node_dig(pos, node, puncher, pointed_thing) tubelib.remove_node(pos) end, - + on_timer = on_timer, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=1, cracky=1, crumbly=1}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -540,7 +541,7 @@ minetest.register_craft({ -- write inputs from remote nodes local function set_input(pos, number, input, val) - if input and M(pos):get_int("state") == tubelib.RUNNING then + if input and M(pos):get_int("state") == tubelib.RUNNING then if (Cache[number] or compile(pos, M(pos), number)) and Cache[number].inputs then if input == "msg" then if #Cache[number].inputs["msg"] < 10 then @@ -560,17 +561,17 @@ local function set_input(pos, number, input, val) end end end -end +end -- used by the command "input" function sl_controller.get_input(number, input) - if input then + if input then if Cache[number] and Cache[number].inputs then return Cache[number].inputs[input] or "off" end end return "off" -end +end -- used for Terminal commands function sl_controller.get_command(number) @@ -579,20 +580,20 @@ function sl_controller.get_command(number) Cache[number].inputs["term"] = nil return cmnd end -end +end -- used for queued messages function sl_controller.get_msg(number) if Cache[number] and Cache[number].inputs then return table.remove(Cache[number].inputs["msg"], 1) end -end +end tubelib.register_node("sl_controller:controller", {}, { on_recv_message = function(pos, topic, payload) local meta = minetest.get_meta(pos) local number = meta:get_string("number") - + if topic == "on" then set_input(pos, number, payload, topic) elseif topic == "off" then @@ -614,4 +615,4 @@ tubelib.register_node("sl_controller:controller", {}, { minetest.get_node_timer(pos):start(1) end end, -}) +}) diff --git a/mods/techpack/sl_controller/depends.txt b/mods/techpack/sl_controller/depends.txt deleted file mode 100644 index f87d3597..00000000 --- a/mods/techpack/sl_controller/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -doors -tubelib -safer_lua - diff --git a/mods/techpack/sl_controller/description.txt b/mods/techpack/sl_controller/description.txt deleted file mode 100644 index 062f1b30..00000000 --- a/mods/techpack/sl_controller/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -SaferLua Controller - a controller to be programmed in LUA - diff --git a/mods/techpack/sl_controller/mod.conf b/mods/techpack/sl_controller/mod.conf index b2058b69..00b2c286 100644 --- a/mods/techpack/sl_controller/mod.conf +++ b/mods/techpack/sl_controller/mod.conf @@ -1 +1,3 @@ -name=sl_controller +name = sl_controller +description = SaferLua Controller - a controller to be programmed in LUA +depends = default, doors, tubelib, safer_lua \ No newline at end of file diff --git a/mods/techpack/sl_controller/server.lua b/mods/techpack/sl_controller/server.lua index 9089af5b..c7d939ed 100644 --- a/mods/techpack/sl_controller/server.lua +++ b/mods/techpack/sl_controller/server.lua @@ -14,7 +14,7 @@ local SERVER_CAPA = 5000 local DEFAULT_MEM = { - size=0, + size=0, data={ version = 1, info = "SaferLua key/value Server", @@ -71,7 +71,7 @@ minetest.register_node("sl_controller:server", { { -3/16, -8/16, -7/16, 3/16, 6/16, 7/16}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "sl_controller:server") @@ -82,7 +82,7 @@ minetest.register_node("sl_controller:server", { on_time(pos, 0) minetest.get_node_timer(pos):start(20) end, - + on_receive_fields = function(pos, formname, fields, player) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") @@ -94,7 +94,7 @@ minetest.register_node("sl_controller:server", { end end end, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return @@ -105,15 +105,16 @@ minetest.register_node("sl_controller:server", { minetest.node_dig(pos, node, puncher, pointed_thing) tubelib.remove_node(pos) end, - + on_timer = on_time, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=1, cracky=1, crumbly=1}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -167,7 +168,7 @@ local function write_value(mem, key, item) mem.size = mem.size + calc_size(item) mem.data[key] = item end -end +end local function read_value(mem, key) local item = mem.data[key] @@ -175,7 +176,7 @@ local function read_value(mem, key) item = safer_lua.table_to_datastruct(item) end return item -end +end tubelib.register_node("sl_controller:server", {}, { on_recv_message = function(pos, topic, payload) @@ -184,11 +185,11 @@ tubelib.register_node("sl_controller:server", {}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(20) end, -}) +}) sl_controller.register_function("server_read", { - cmnd = function(self, num, key) + cmnd = function(self, num, key) if type(key) == "string" then local mem = get_memory(num, self.meta.owner) if mem then @@ -221,5 +222,3 @@ sl_controller.register_action("server_write", { " number, string, boolean, nil or data structure.\n".. ' example: $server_write("0123", "state", state)' }) - - diff --git a/mods/techpack/sl_controller/terminal.lua b/mods/techpack/sl_controller/terminal.lua index 7c9a4854..7375fc3a 100644 --- a/mods/techpack/sl_controller/terminal.lua +++ b/mods/techpack/sl_controller/terminal.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information terminal.lua: - + ]]-- local HELP = [[#### SmartLine Controller Terminal #### @@ -21,7 +21,7 @@ Controller to the Terminal. Commands can have up to 80 characters. Local commands: - clear = clear screen -- help = this message +- help = this message - pub = switch to public use - priv = switch to private use Global commands: @@ -66,7 +66,7 @@ local function command(pos, cmnd, player) local owner = meta:get_string("owner") or "" if cmnd then cmnd = cmnd:sub(1,80) - + if cmnd == "clear" then meta:set_string("output", "") meta:set_string("formspec", formspec2(meta)) @@ -104,7 +104,7 @@ local function command(pos, cmnd, player) tubelib.send_message(number, owner, nil, "term", cmnd) end end -end +end local function register_terminal(num, tiles, node_box, selection_box) minetest.register_node("sl_controller:terminal"..num, { @@ -113,7 +113,7 @@ local function register_terminal(num, tiles, node_box, selection_box) drawtype = "nodebox", node_box = node_box, selection_box = selection_box, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, minetest.get_node(pos).name) local meta = minetest.get_meta(pos) @@ -136,17 +136,18 @@ local function register_terminal(num, tiles, node_box, selection_box) command(pos, fields.cmnd, player:get_player_name()) end end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) end @@ -235,7 +236,7 @@ tubelib.register_node("sl_controller:terminal2", {}, { return true end end, -}) +}) sl_controller.register_function("get_term", { cmnd = function(self) @@ -279,4 +280,3 @@ sl_controller.register_action("send_msg", { ' Send a message to the controller with number "num".\n'.. ' example: $send_msg("0123", "test")' }) - diff --git a/mods/techpack/smartline/button.lua b/mods/techpack/smartline/button.lua index f8f837af..09b3f3c7 100644 --- a/mods/techpack/smartline/button.lua +++ b/mods/techpack/smartline/button.lua @@ -85,13 +85,13 @@ minetest.register_node("smartline:button", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local own_num = tubelib.add_node(pos, "smartline:button") meta:set_string("own_num", own_num) meta:set_string("formspec", "size[5,6]".. - "dropdown[0.2,0;3;type;"..S("switch,button 2s,button 4s,button 8s,button 16s")..";1]".. + "dropdown[0.2,0;3;type;"..S("switch,button 2s,button 4s,button 8s,button 16s")..";1]".. "field[0.5,2;3,1;numbers;"..S("Insert destination block number(s)")..";]" .. "checkbox[1,3;public;public;false]".. "button_exit[1,4;2,1;exit;"..S("Save").."]") @@ -133,7 +133,7 @@ minetest.register_node("smartline:button", { meta:set_string("formspec", nil) end end, - + on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) if meta:get_string("numbers") ~= "" and meta:get_string("numbers") ~= nil then @@ -152,6 +152,7 @@ minetest.register_node("smartline:button", { groups = {cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -174,7 +175,7 @@ minetest.register_node("smartline:button_active", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) meta:set_string("clicker_name", clicker:get_player_name()) @@ -196,8 +197,11 @@ minetest.register_node("smartline:button_active", { drop = "smartline:button", is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) +tubelib.register_node("smartline:button", {"smartline:button_active"}, {tubelib_node = true}) + minetest.register_craft({ output = "smartline:button", recipe = { diff --git a/mods/techpack/smartline/collector.lua b/mods/techpack/smartline/collector.lua index 754018d4..fba6d3ac 100644 --- a/mods/techpack/smartline/collector.lua +++ b/mods/techpack/smartline/collector.lua @@ -3,13 +3,13 @@ SmartLine ========= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information collector.lua: - + Collects states from other nodes, acting as a state concentrator. ]]-- @@ -19,16 +19,18 @@ local S = smartline.S local CYCLE_TIME = 1 -local tStates = {stopped = 0, running = 0, standby = 1, blocked = 2, fault = 3, defect = 4} -local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2 , ["3 fault"] = 3, ["4 defect"] = 4} -local lStates = {[0] = "stopped", "standby", "blocked", "fault", "defect"} +-- The numbering seems strange here, but I had to add the "running" state +-- afterwards without changing the behavior of the block. +local tStates = {stopped = 0, running = 1, standby = 2, blocked = 3, fault = 4, defect = 5} +local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2, ["3 fault"] = 3, ["4 defect"] = 4} +local lStates = {[0] = "stopped", "running", "standby", "blocked", "fault", "defect"} local function formspec(meta) local poll_numbers = meta:get_string("poll_numbers") local event_number = meta:get_string("event_number") local dropdown_pos = meta:get_int("dropdown_pos") if dropdown_pos == 0 then dropdown_pos = 1 end - + return "size[9,6]".. default.gui_bg.. default.gui_bg_img.. @@ -38,7 +40,7 @@ local function formspec(meta) "label[1.3,2.8;"..S("Send an event if state is equal or larget than:").."]".. "dropdown[1.2,3.4;7,4;severity;1 standby,2 blocked,3 fault,4 defect;"..dropdown_pos.."]".. "button_exit[3,5;2,1;exit;"..S("Save").."]" -end +end local function send_event(meta) @@ -48,7 +50,7 @@ local function send_event(meta) local severity = meta:get_int("dropdown_pos") local owner = meta:get_string("owner") local own_number = meta:get_string("own_number") - if state >= severity then + if state > severity then tubelib.send_message(event_number, owner, nil, "on", own_number) else tubelib.send_message(event_number, owner, nil, "off", own_number) @@ -74,7 +76,7 @@ local function on_timer(pos,elapsed) local meta = minetest.get_meta(pos) local poll_numbers = meta:get_string("poll_numbers") local idx = meta:get_int("index") + 1 - + if poll_numbers == "" then local own_number = meta:get_string("own_number") meta:set_string("infotext", S("SmartLine State Collector").." "..own_number..": stopped") @@ -82,15 +84,15 @@ local function on_timer(pos,elapsed) meta:set_int("stored_state", 0) return false end - + if idx > meta:get_int("num_numbers") then idx = 1 send_event(meta) end meta:set_int("index", idx) - + request_state(meta, poll_numbers, idx) - + return true end return false @@ -161,11 +163,11 @@ minetest.register_node("smartline:collector", { end meta:set_string("formspec", formspec(meta)) end - + end, - + on_timer = on_timer, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -176,6 +178,7 @@ minetest.register_node("smartline:collector", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -210,4 +213,4 @@ tubelib.register_node("smartline:collector", {}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, -}) +}) diff --git a/mods/techpack/smartline/controller.lua b/mods/techpack/smartline/controller.lua index 0e0513d5..7c03b107 100644 --- a/mods/techpack/smartline/controller.lua +++ b/mods/techpack/smartline/controller.lua @@ -17,7 +17,7 @@ local NUM_RULES = 10 local mail_exists = minetest.get_modpath("mail") and mail ~= nil - + local sHELP = [[SmartLine Controller Help Control other nodes by means of rules, according to: @@ -28,27 +28,27 @@ Examples for conditions are: - the Player Detector detects a player - a button is pressed - a node state is fault, blocked, standby,... - - a timer is expired - + - a timer is expired + Actions are: - switch on/off tubelib nodes, like lamps, door blocks, machines - send mail/chat messages to the owner - output a text message to the display - - set timer variables + - set timer variables - set/reset flag variables - -Variables and timers: - - 8 flags (set/reset) can be used to store conditions + +Variables and timers: + - 8 flags (set/reset) can be used to store conditions for later use. - Action flags (one flag for each rule, set when action is executed) The flag can be used as condition for subsequent rules. - 8 timers (resolution in seconds) can be use - for delayed actions. + for delayed actions. -The controller executes all rules once per second. +The controller executes all rules once per second. Independent how long the input condition stays 'true', the corresponding action will be triggered only once. -The condition has to become false and then true again, to +The condition has to become false and then true again, to re-trigger/execute the action again. The 'label' has no function. It is only used @@ -66,12 +66,12 @@ It has a 'update' button to update the view. ]] -local sOUTPUT = "Press 'help' for edit commands" - +local sOUTPUT = "Press 'help' for edit commands" + -- -- Helper functions -- -local function create_kv_list(elem) +local function create_kv_list(elem) local a = {} for i,v in ipairs(elem) do a[v] = i @@ -181,16 +181,16 @@ local function get_active_subm_definition(postfix, type, fs_data) return idx, fs_definition end --- Extract runtime relevant data from the given submenu +-- Extract runtime relevant data from the given submenu -- postfix: row/culum info like "11" or "a2" -- fs_definition: submenu formspec definition -- fs_data: formspec data local function get_subm_data(postfix, fs_definition, fs_data) local data = {} for idx,elem in ipairs(fs_definition.formspec) do - if elem.type == "field" then + if elem.type == "field" then data[elem.name] = fs_data["subm"..postfix.."_"..elem.name] or "?" - elseif elem.type == "textlist" then + elseif elem.type == "textlist" then local num = tonumber(fs_data["subm"..postfix.."_"..elem.name]) or 1 num = math.min(num, elem.num_choices) data[elem.name] = num @@ -209,11 +209,11 @@ end local function field2fs_data(fs_definition, fields, fs_data) for idx,elem in ipairs(fs_definition.formspec) do local key = "subm"..fields._postfix_.."_"..elem.name - if elem.type == "field" then + if elem.type == "field" then if fields[elem.name] then fs_data[key] = fields[elem.name] end - elseif elem.type == "textlist" then + elseif elem.type == "textlist" then local evt = minetest.explode_textlist_event(fields[elem.name]) if evt.type == "CHG" then fs_data[key] = evt.index @@ -278,7 +278,7 @@ local function formspec_cond(_postfix_, fs_data) default.gui_slots.. "field[0,0;0,0;_type_;;cond]".. "field[0,0;0,0;_postfix_;;".._postfix_.."]"} - + local sConditions = table.concat(aCondTitles, ",") local cond_idx, fs_definition = get_active_subm_definition(_postfix_, "cond", fs_data) tbl[#tbl+1] = "label[0,0.1;Condition type:]" @@ -291,7 +291,7 @@ end -- evaluate the row condition local function eval_formspec_cond(meta, fs_data, fields, readonly) - if readonly then return fs_data end + if readonly then return fs_data end -- determine condition type local cond = minetest.explode_textlist_event(fields.cond) if cond.type == "CHG" then @@ -303,14 +303,14 @@ local function eval_formspec_cond(meta, fs_data, fields, readonly) local data = get_subm_data(fields._postfix_, fs_definition, fs_data) -- update button for main menu fs_data["cond"..fields._postfix_] = fs_definition.button_label(data) - + if fields._exit_ == nil then -- update formspec if exit is not pressed meta:set_string("formspec", formspec_cond(fields._postfix_, fs_data)) end return fs_data end - + -- -- Action formspec @@ -322,7 +322,7 @@ local function formspec_actn(_postfix_, fs_data) default.gui_slots.. "field[0,0;0,0;_type_;;actn]".. "field[0,0;0,0;_postfix_;;".._postfix_.."]"} - + local sActions = table.concat(aActnTitles, ",") local actn_idx, fs_definition = get_active_subm_definition(_postfix_, "actn", fs_data) tbl[#tbl+1] = "label[0,0.1;Action type:]" @@ -335,7 +335,7 @@ end -- evaluate the row action local function eval_formspec_actn(meta, fs_data, fields, readonly) - if readonly then return fs_data end + if readonly then return fs_data end -- determine action type local actn = minetest.explode_textlist_event(fields.actn) if actn.type == "CHG" then @@ -347,7 +347,7 @@ local function eval_formspec_actn(meta, fs_data, fields, readonly) local data = get_subm_data(fields._postfix_, fs_definition, fs_data) -- update button for main menu fs_data["actn"..fields._postfix_] = fs_definition.button_label(data) - + if fields._exit_ == nil then -- update formspec if exit is not pressed meta:set_string("formspec", formspec_actn(fields._postfix_, fs_data)) @@ -377,7 +377,7 @@ end -- evaluate the row label local function eval_formspec_label(meta, fs_data, fields, readonly) - if readonly then return fs_data end + if readonly then return fs_data end fs_data["subml"..fields._postfix_.."_label"] = fields.label if fields._exit_ == nil then meta:set_string("formspec", formspec_label(fields._postfix_, fs_data)) @@ -406,7 +406,7 @@ end -- evaluate the row operand local function eval_formspec_oprnd(meta, fs_data, fields, readonly) - if readonly then return fs_data end + if readonly then return fs_data end local oprnd = minetest.explode_textlist_event(fields.oprnd) if oprnd.type == "CHG" then fs_data["submo"..fields._postfix_.."_oprnd"] = oprnd.index @@ -426,7 +426,7 @@ local function formspec_main(state, fs_data, output) default.gui_slots.. "field[0,0;0,0;_type_;;main]".. "label[0.8,0;label:]label[3.8,0;IF cond 1:]label[7,0;and/or]label[8.3,0;cond 2:]label[11.7,0;THEN action:]"} - + for idx = 1,NUM_RULES do local ypos = idx * 0.75 - 0.4 tbl[#tbl+1] = "label[0,"..(0.2+ypos)..";"..idx.."]" @@ -452,7 +452,7 @@ local function eval_formspec_main(meta, fs_data, fields, readonly) if not readonly then fs_data["oprnd"..idx] = fields["oprnd"..idx] or fs_data["oprnd"..idx] end - + -- eval submenu button events if fields["label"..idx] then meta:set_string("formspec", formspec_label(idx, fs_data)) @@ -465,7 +465,7 @@ local function eval_formspec_main(meta, fs_data, fields, readonly) elseif fields["actna"..idx] then meta:set_string("formspec", formspec_actn("a"..idx, fs_data)) end - end + end return fs_data end @@ -489,7 +489,7 @@ local function background(xpos, ypos, val) else return "box["..(xpos-0.1)..",".. ypos..";3.3,0.4;#202020]" end -end +end local function formspec_state(meta, fs_data) local number = meta:get_string("number") @@ -500,12 +500,12 @@ local function formspec_state(meta, fs_data) default.gui_slots.. "field[0,0;0,0;_type_;;state]".. "label[0.8,0;label:]label[3.8,0;IF cond 1:]label[7,0;and/or]label[8.3,0;cond 2:]label[11.7,0;THEN action:]"} - + if state == tubelib.RUNNING and number then - local environ = tubelib.get_data(number, "environ") + local environ = tubelib.get_data(number, "environ") local act_gate = tubelib.get_data(number, "act_gate") local conds = tubelib.get_data(number, "conds") - + if environ and act_gate and conds then for idx = 1,NUM_RULES do local ypos = idx * 0.6 + 0.2 @@ -530,13 +530,13 @@ local function formspec_state(meta, fs_data) act_gate[idx] = false end end - + tbl[#tbl+1] = "label[10,7; Seconds: "..(meta:get_int("runtime") or 1).."]" tbl[#tbl+1] = "label[0,7;"..output("Inputs", "i(", ")", environ.inputs).."]" tbl[#tbl+1] = "label[0,7.6;"..output("Timers", "t", "", environ.timers).."]" tbl[#tbl+1] = "label[0,8.2;"..output("Flags", "f", "", environ.flags).."]" - + tbl[#tbl+1] = "label[0,8.8;Hint:]" tbl[#tbl+1] = "box[1.3,8.8;6,0.4;#008000]" tbl[#tbl+1] = "label[1.4,8.8;condition true / action executed]" @@ -544,7 +544,7 @@ local function formspec_state(meta, fs_data) tbl[#tbl+1] = "label[8,8.8;condition false / action out-of-date]" end end - + tbl[#tbl+1] = "button[13.3,6.9;1.7,1;update;update]" tbl[#tbl+1] = "button[13.3,7.8;1.7,1;close;close]" return table.concat(tbl) @@ -610,8 +610,8 @@ end local function start_controller(pos, number, fs_data) -- delete old data tubelib.set_data(number, "environ", { - timers = {}, - flags = {}, + timers = {}, + flags = {}, inputs = {} }) tubelib.set_data(number, "conds", {}) @@ -628,7 +628,7 @@ local function formspec2runtime_rule(number, owner, fs_data) local num2inp = {} for idx = 1,NUM_RULES do -- valid rule? - if fs_data["subm1"..idx.."_cond"] and fs_data["subm2"..idx.."_cond"] + if fs_data["subm1"..idx.."_cond"] and fs_data["subm2"..idx.."_cond"] and fs_data["subma"..idx.."_actn"] then -- add to list of runtine rules local rule = { @@ -640,7 +640,7 @@ local function formspec2runtime_rule(number, owner, fs_data) rule.actn.owner = owner table.insert(rt_rules, rule) end - end + end tubelib.set_data(number, "rt_rules", rt_rules) end @@ -697,18 +697,18 @@ local function edit_command(fs_data, text) if cmnd and pos1 and pos2 then pos1 = math.max(1, math.min(pos1, NUM_RULES)) pos2 = math.max(1, math.min(pos2, NUM_RULES)) - - if cmnd == "x" then - exchange_rules(fs_data, pos1, pos2) + + if cmnd == "x" then + exchange_rules(fs_data, pos1, pos2) return "rows "..pos1.." and "..pos2.." exchanged" end if cmnd == "c" then - copy_rule(fs_data, pos1, pos2) + copy_rule(fs_data, pos1, pos2) return "row "..pos1.." copied to "..pos2 end elseif cmnd == "d" and pos1 then pos1 = math.max(1, math.min(pos1, NUM_RULES)) - + delete_rule(fs_data, pos1) return "row "..pos1.." deleted" end @@ -725,10 +725,10 @@ local function on_receive_fields(pos, formname, fields, player) local fs_data = minetest.deserialize(meta:get_string("fs_data")) or {} local output = "" local readonly = player:get_player_name() ~= owner - + -- FIRST: test if command entered? if fields.ok then - if not readonly then + if not readonly then output = edit_command(fs_data, fields.cmnd) smartline.stop_controller(pos, fs_data) meta:set_string("formspec", formspec_main(tubelib.STOPPED, fs_data, output)) @@ -816,12 +816,12 @@ minetest.register_node("smartline:controller", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "smartline:controller") local fs_data = {} - meta:set_string("fs_data", minetest.serialize(fs_data)) + meta:set_string("fs_data", minetest.serialize(fs_data)) meta:set_string("owner", placer:get_player_name()) meta:set_string("number", number) meta:set_int("state", tubelib.STOPPED) @@ -831,24 +831,25 @@ minetest.register_node("smartline:controller", { end, on_receive_fields = on_receive_fields, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return end - + minetest.node_dig(pos, node, puncher, pointed_thing) tubelib.remove_node(pos) end, - + on_timer = check_rules, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, drop = "smartline:controller2", }) @@ -864,7 +865,7 @@ minetest.register_craft({ local function set_input(meta, payload, val) - if payload then + if payload then local number = meta:get_string("number") local environ = tubelib.get_data(number, "environ") or {} if environ.inputs then @@ -872,7 +873,7 @@ local function set_input(meta, payload, val) tubelib.set_data(number, "environ", environ) end end -end +end tubelib.register_node("smartline:controller", {}, { on_recv_message = function(pos, topic, payload) @@ -894,11 +895,11 @@ tubelib.register_node("smartline:controller", {}, { minetest.get_node_timer(pos):start(1) end end, -}) +}) -- List of Controller actions and conditions is dependent on loaded mods. -- Therefore, the order of actions and conditions has to be re-assembled each time. --- last order from last run is stored as meta data +-- last order from last run is stored as meta data local storage = minetest.get_mod_storage() local function old_to_new(newTypes, oldTypes) @@ -922,7 +923,7 @@ local function update_node_database(meta) meta:set_string("aCondTypes", minetest.serialize(aCondTypes)) meta:set_string("aActnTypes", minetest.serialize(aActnTypes)) - + return tOld2NewCond, tOld2NewActn end @@ -931,14 +932,14 @@ local function maintain_dataset(number) if flags ~= nil then local timers = tubelib.get_data(number, "timers") or {} local inputs = tubelib.get_data(number, "inputs") or {} - + tubelib.set_data(number, "environ", { - flags = flags, - timers = timers, - inputs = inputs, + flags = flags, + timers = timers, + inputs = inputs, vars = {} }) - + tubelib.set_data(number, "inputs", nil) tubelib.set_data(number, "timers", nil) tubelib.set_data(number, "flags", nil) @@ -957,7 +958,7 @@ function smartline.update_fs_data(meta, fs_data) fs_data["subm2"..idx.."_cond"] = tOld2NewCond[fs_data["subm2"..idx.."_cond"]] fs_data["subma"..idx.."_actn"] = tOld2NewActn[fs_data["subma"..idx.."_actn"]] end - + end return fs_data end @@ -969,16 +970,15 @@ minetest.register_lbm({ run_at_every_load = true, action = function(pos, node) local meta = minetest.get_meta(pos) - + local fs_data = minetest.deserialize(meta:get_string("fs_data")) fs_data = smartline.update_fs_data(meta, fs_data) meta:set_string("fs_data", minetest.serialize(fs_data)) - + local number = meta:get_string("number") local owner = meta:get_string("owner") formspec2runtime_rule(number, owner, fs_data) - + maintain_dataset(number) end }) - diff --git a/mods/techpack/smartline/depends.txt b/mods/techpack/smartline/depends.txt deleted file mode 100644 index 32cfef97..00000000 --- a/mods/techpack/smartline/depends.txt +++ /dev/null @@ -1,7 +0,0 @@ -default -doors -tubelib -lcdlib -sl_controller -mail? - diff --git a/mods/techpack/smartline/description.txt b/mods/techpack/smartline/description.txt deleted file mode 100644 index 90f2231f..00000000 --- a/mods/techpack/smartline/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -SmartLine is a Tubelib extension with small and smart sensors, actors and controllers. - diff --git a/mods/techpack/smartline/display.lua b/mods/techpack/smartline/display.lua index 8f5b14e4..64d7b111 100644 --- a/mods/techpack/smartline/display.lua +++ b/mods/techpack/smartline/display.lua @@ -14,11 +14,11 @@ -- Load support for I18n local S = smartline.S - - + + lcdlib.register_display_entity("smartline:entity") -local function display_update(pos, objref) +local function display_update(pos, objref) local meta = minetest.get_meta(pos) local text = meta:get_string("text") or "" text = string.gsub(text, "|", " \n") @@ -54,7 +54,7 @@ minetest.register_node("smartline:display", { node_box = lcd_box, selection_box = lcd_box, light_source = 6, - + display_entities = { ["smartline:entity"] = { depth = 0.42, on_display_update = display_update}, @@ -81,6 +81,7 @@ minetest.register_node("smartline:display", { groups = {cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) @@ -118,7 +119,7 @@ local function write_row(meta, payload) local str = payload.str or "oops" if row == 0 then meta:set_string("infotext", str) - return + return end local rows if meta:get_int("startscreen") == 1 then @@ -162,5 +163,4 @@ tubelib.register_node("smartline:display", {}, { end end end, -}) - +}) diff --git a/mods/techpack/smartline/icta/battery.lua b/mods/techpack/smartline/icta/battery.lua index f50c1fd9..da468ad4 100644 --- a/mods/techpack/smartline/icta/battery.lua +++ b/mods/techpack/smartline/icta/battery.lua @@ -54,7 +54,7 @@ local function register_battery(ext, percent, nici) { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_int("content", BATTERY_CAPACITY * percent) @@ -64,10 +64,10 @@ local function register_battery(ext, percent, nici) on_timer(pos, 1) minetest.get_node_timer(pos):start(30) end, - + on_timer = on_timer, - - + + after_dig_node = function(pos, oldnode, oldmetadata, digger) local percent = calc_percent(tonumber(oldmetadata.fields.content)) local stack @@ -93,6 +93,7 @@ local function register_battery(ext, percent, nici) drop = "", is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) end @@ -120,12 +121,12 @@ minetest.register_node("smartline:battery_empty", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_int("content", 0) end, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", @@ -133,6 +134,7 @@ minetest.register_node("smartline:battery_empty", { drop = "", is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -156,8 +158,8 @@ else }) end -tubelib.register_node("smartline:battery", - {"smartline:battery25", "smartline:battery50", "smartline:battery75"}, +tubelib.register_node("smartline:battery", + {"smartline:battery25", "smartline:battery50", "smartline:battery75"}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(30) diff --git a/mods/techpack/smartline/icta/controller.lua b/mods/techpack/smartline/icta/controller.lua index 44c4825d..eda68e67 100644 --- a/mods/techpack/smartline/icta/controller.lua +++ b/mods/techpack/smartline/icta/controller.lua @@ -4,7 +4,7 @@ =============== Part of the SmartLine mod - + Copyright (C) 2017-2020 Joachim Stolberg AGPL v3 @@ -17,7 +17,7 @@ -- -- Helper functions -- -local function gen_table(size, val) +local function gen_table(size, val) local tbl = {} for idx = 1,size do if type(val) == "table" then @@ -39,14 +39,14 @@ local function integer(s, min, max) return min end -local sOUTPUT = "Edit commands (see help)" +local sOUTPUT = "Edit commands (see help)" local Cache = {} local FS_DATA = gen_table(smartline.NUM_RULES, {}) local function output(pos, text, flush_buffer) local meta = minetest.get_meta(pos) - if not flush_buffer then + if not flush_buffer then text = meta:get_string("output") .. "\n" .. (text or "") text = text:sub(-500,-1) end @@ -62,7 +62,7 @@ end -- if env.blocked[1] then -- env.timer[1] = env.ticks + -- end --- env.conditions[1] = env.blocked[1] +-- env.conditions[1] = env.blocked[1] -- else -- env.conditions[1] = false -- end @@ -77,7 +77,7 @@ end -- if env.blocked[1] then -- env.timer[1] = env.ticks + -- end --- env.conditions[1] = env.blocked[1] +-- env.conditions[1] = env.blocked[1] -- else -- env.conditions[1] = false -- end @@ -96,7 +96,7 @@ if env.blocked[#] == false and env.ticks %% %s == 0 then if env.blocked[#] then env.timer[#] = env.ticks + %s end - env.condition[#] = env.blocked[#] + env.condition[#] = env.blocked[#] else env.condition[#] = false end @@ -115,7 +115,7 @@ if env.blocked[#] == false and env.event then if env.blocked[#] then env.timer[#] = env.ticks + %s end - env.condition[#] = env.blocked[#] + env.condition[#] = env.blocked[#] else env.condition[#] = false end @@ -133,7 +133,7 @@ if env.blocked[#] == false and env.event then if env.blocked[#] then env.timer[#] = env.ticks + %s end - env.condition[#] = env.blocked[#] + env.condition[#] = env.blocked[#] else env.condition[#] = false end @@ -174,7 +174,7 @@ local function generate(pos, meta, environ) elseif cond == nil and actn ~= nil then output(pos, "Error in condition in rule "..idx) end - end + end return table.concat(tbl) end @@ -240,7 +240,7 @@ local function battery(pos) return true end return false -end +end local function start_controller(pos, meta) local number = meta:get_string("number") @@ -248,10 +248,10 @@ local function start_controller(pos, meta) meta:set_string("formspec", smartline.formspecError(meta)) return false end - + meta:set_string("output", "") meta:set_int("cpu", 0) - + if compile(pos, meta, number) then meta:set_int("state", tubelib.RUNNING) minetest.get_node_timer(pos):start(1) @@ -301,7 +301,7 @@ local function on_timer(pos, elapsed) local number = meta:get_string("number") if Cache[number] or compile(pos, meta, number) then local res = execute(pos, number, elapsed == -1) - if res then + if res then t = minetest.get_us_time() - t if not update_battery(meta, t) then no_battery(pos) @@ -323,7 +323,7 @@ local function on_receive_fields(pos, formname, fields, player) if player:get_player_name() ~= owner then return end - + --print("fields", dump(fields)) if fields.quit then -- cancel button return @@ -353,7 +353,7 @@ local function on_receive_fields(pos, formname, fields, player) end if fields._exit_ == "ok" then -- exit from sub-menu? if fields._button_ then - smartline.formspec_button_update(meta, fields) + smartline.formspec_button_update(meta, fields) end -- simulate tab selection fields.tab = "1" @@ -427,12 +427,12 @@ minetest.register_node("smartline:controller2", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "smartline:controller2") local fs_data = FS_DATA - meta:set_string("fs_data", minetest.serialize(fs_data)) + meta:set_string("fs_data", minetest.serialize(fs_data)) meta:set_string("owner", placer:get_player_name()) meta:set_string("number", number) meta:set_int("state", tubelib.STOPPED) @@ -442,24 +442,25 @@ minetest.register_node("smartline:controller2", { end, on_receive_fields = on_receive_fields, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return end - + minetest.node_dig(pos, node, puncher, pointed_thing) tubelib.remove_node(pos) end, - + on_timer = on_timer, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=1, cracky=1, crumbly=1}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -474,7 +475,7 @@ minetest.register_craft({ -- write inputs from remote nodes local function set_input(pos, own_number, rmt_number, val) - if rmt_number then + if rmt_number then if Cache[own_number] and Cache[own_number].env.input then local t = minetest.get_us_time() Cache[own_number].env.input[rmt_number] = val @@ -486,14 +487,14 @@ local function set_input(pos, own_number, rmt_number, val) end end end -end +end tubelib.register_node("smartline:controller2", {}, { on_recv_message = function(pos, topic, payload) local meta = minetest.get_meta(pos) local number = meta:get_string("number") local state = meta:get_int("state") - + if state == tubelib.RUNNING and topic == "on" then set_input(pos, number, payload, topic) elseif state == tubelib.RUNNING and topic == "off" then @@ -511,5 +512,4 @@ tubelib.register_node("smartline:controller2", {}, { minetest.get_node_timer(pos):start(1) end end, -}) - +}) diff --git a/mods/techpack/smartline/locale/smartline.de.tr b/mods/techpack/smartline/locale/smartline.de.tr index 46d50d0f..b8348459 100644 --- a/mods/techpack/smartline/locale/smartline.de.tr +++ b/mods/techpack/smartline/locale/smartline.de.tr @@ -1,85 +1,46 @@ # textdomain: smartline - - - -### button.lua ### - +SmartLine Button/Switch=SmartLine Taster/Schalter +switch,button 2s,button 4s,button 8s,button 16s=Schalter,Taster 2s,Taster 4s,Taster 8s,Taster 16s Insert destination block number(s)=Zielblocknummer(n) eingeben SmartLine Button=SmartLine Taster -SmartLine Button/Switch=SmartLine Taster/Schalter connected with block=verbunden mit Block -switch,button 2s,button 4s,button 8s,button 16s=Schalter,Taster 2s,Taster 4s,Taster 8s,Taster 16s - -### button.lua ### -### collector.lua ### -### playerdetector.lua ### -### repeater.lua ### - -Save=Speichern - -### collector.lua ### - -Node number to send the events to:=Knotennummer, an den die Events gesendet werden sollen: Node numbers to read the states from:=Knotennummers, von wo der Status gelesen werden soll: +Node number to send the events to:=Knotennummer, an den die Events gesendet werden sollen: Send an event if state is equal or larget than:=Sende einen Event, wenn der Status gleich oder größer ist als: SmartLine State Collector=SmartLine Status Sammler - -### display.lua ### - +Save=Speichern SmartLine Display=SmartLine Display - -### playerdetector.lua ### - Input the number(s) of the receiving node(s).=Gib die Nummer(n) der Empfangsblöcke ein. -Input the player name(s) separated by blanks,=Gebe sie Spielernamen getrennt durch Leerzeichen ein, -Player Detector=Spieler Detektor -Player Detector Help=Spieler Detektor Hilfe -Player name(s):=Spielername(n): -Receiver node numbers:=Empfangsblocknummer(n): Separate numbers via blanks, like '0123 0234'.=Separiere die Nummern mit Leerzeichen, wie '0123 0234'. -SmartLine Player Detector=SmartLine Spieler Detektor +Input the player name(s) separated by blanks,=Gebe sie Spielernamen getrennt durch Leerzeichen ein, or leave it blank for all players.=oder lasse es leer für alle Spieler. - -### playerdetector.lua ### -### sequencer.lua ### -### timer.lua ### - -close=schließen -help=Hilfe - -### repeater.lua ### - +Player Detector Help=Spieler Detektor Hilfe +Player Detector=Spieler Detektor +Receiver node numbers:=Empfangsblocknummer(n): +Player name(s):=Spielername(n): +SmartLine Player Detector=SmartLine Spieler Detektor Destination node numbers=Zielknotennummern SmartLine Repeater=SmartLine Wiederholer +not connected=nicht verbunden connected with=verbunden mit fault (overloaded)=Fehler (überlastet) -not connected=nicht verbunden - -### sequencer.lua ### - Offset/s=Offset/s Run endless=Laufe endlos SmartLine Sequencer=SmartLine Sequenzer +stopped=gestoppt +running=läuft +SmartLine Sequencer Help@n@nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n= +help=Hilfe +close=schließen +Number(s)=Nummer(m) +Command=Kommando +SmartLine Signal Tower=SmartLine Signalturm +Time=Zeit +SmartLine Timer=SmartLine Timer +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the@ntime every few seconds. If the block was just loaded,@nthe timer will check the last 4 hours for commands@nthat still need to be executed.= + + +##### not used anymore ##### SmartLine Sequencer Help@n @nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n=SmartLine Sequenzer Hilfe@n @nDefiniere eine Sequenz von Kommandos um andere Maschinen zu steuern.@nNummern sind Blocknummern, wo die Kommandos hingesendet werden sollen@nDas Kommando 'on'/'off' wird für Maschinen und andere Blöcke verwendet@nOffset ist die Zeit zur nächsten Zeile in Sekunden (1..999).@nWird 'endlos' angeklickt, startet der Sequenzer immer wieder neu.@nDas Kommando ' ' macht nichts, die die Zeit zu verbrauchen.@n - -running=läuft -stopped=gestoppt - -### sequencer.lua ### -### timer.lua ### - -Command=Kommando -Number(s)=Nummer(m) - -### signaltower.lua ### - -SmartLine Signal Tower=SmartLine Signalturm - -### timer.lua ### - -SmartLine Timer=SmartLine Timer - SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the @ntime every few seconds. If the block was just loaded, @nthe timer will check the last 4 hours for commands@nthat still need to be executed.=SmartLine Timer Hilfe@n@nDer Timer st zum Tageszeit abhängigem Senden von Kommandos@nDer Timer prüft die regeln alle paar Sekunden.@nFalls die Block gerade erst aktiviert wurde (Spieler kommt in die Nähe),@nwerden auch die Kommandos der letzten 4 Spielstunden@ngeprüft und ggf. ausgeführt. - -Time=Zeit diff --git a/mods/techpack/smartline/locale/smartline.zh_CN.tr b/mods/techpack/smartline/locale/smartline.zh_CN.tr new file mode 100644 index 00000000..801843cf --- /dev/null +++ b/mods/techpack/smartline/locale/smartline.zh_CN.tr @@ -0,0 +1,46 @@ +# textdomain: smartline +SmartLine Button/Switch=SmartLine 按钮/开关 +switch,button 2s,button 4s,button 8s,button 16s=开关,按钮 2秒,按钮 4秒,按钮 8秒,按钮 16秒 +Insert destination block number(s)=插入目标方块编号 +SmartLine Button=SmartLine 按钮 +connected with block=已经与方块相连 +Node numbers to read the states from:=从以下位置读取状态的节点号: +Node number to send the events to:=要将事件发送到的节点号: +Send an event if state is equal or larget than:=如果 state 等于或大于以下值,则发送事件: +SmartLine State Collector=SmartLine 状态采集器 +Save=保存 +SmartLine Display=SmartLine 显示器 +Input the number(s) of the receiving node(s).=输入接收节点的编号。 +Separate numbers via blanks, like '0123 0234'.=通过空格分隔数字,如“0123 0234”。 +Input the player name(s) separated by blanks,=输入以空格分隔的玩家名称, +or leave it blank for all players.=或者为所有玩家留空。 +Player Detector Help=玩家检测器帮助 +Player Detector=玩家检测器 +Receiver node numbers:=接收器节点号: +Player name(s):=玩家名称: +SmartLine Player Detector=SmartLine 玩家检测器 +Destination node numbers=目标节点编号 +SmartLine Repeater=SmartLine 中继器 +not connected=未连接 +connected with=连接到 +fault (overloaded)=故障(过载) +Offset/s=偏移量/秒 +Run endless=无休止运行 +SmartLine Sequencer=SmartLine 序列器 +stopped=已经停止 +running=正在运行 +SmartLine Sequencer Help@n@nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n= +help=帮助 +close=关闭 +Number(s)=编号 +Command=命令 +SmartLine Signal Tower=SmartLine 信号塔 +Time=时间 +SmartLine Timer=SmartLine 计时器 +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the@ntime every few seconds. If the block was just loaded,@nthe timer will check the last 4 hours for commands@nthat still need to be executed.= + + +##### not used anymore ##### + +SmartLine Sequencer Help@n @nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n=SmartLine 序列器 帮助@n @n定义一系列命令来控制其他机器。@nNumbers(s) 是节点编号,命令将会发送到(这个节点)。@n命令“on”和“off”用于机器和其他节点@n偏移量是到下一行的时间,以秒为单位 (1..999)。@n如果设置了 endless(无休止),序列器会一次又一次地重新启动。@n命令“ ”不执行任何操作,仅消耗偏移时间。@n +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the @ntime every few seconds. If the block was just loaded, @nthe timer will check the last 4 hours for commands@nthat still need to be executed.=SmartLine 计时器帮助@n@n计时器用于在白天发送控制命令,@n例如打开、关闭路灯。@n计时器会每隔几秒钟检查一次时间。@n如果方块刚刚加载,计时器将会@n检查最后四个小时内仍然需要执行的命令。 diff --git a/mods/techpack/smartline/locale/smartline.zh_TW.tr b/mods/techpack/smartline/locale/smartline.zh_TW.tr new file mode 100644 index 00000000..f464645f --- /dev/null +++ b/mods/techpack/smartline/locale/smartline.zh_TW.tr @@ -0,0 +1,46 @@ +# textdomain: smartline +SmartLine Button/Switch=SmartLine 按鈕/開關 +switch,button 2s,button 4s,button 8s,button 16s=開關,按鈕 2秒,按鈕 4秒,按鈕 8秒,按鈕 16秒 +Insert destination block number(s)=插入目標方塊編號 +SmartLine Button=SmartLine 按鈕 +connected with block=已經與方塊相連 +Node numbers to read the states from:=從以下位置讀取狀態的節點號: +Node number to send the events to:=要將事件發送到的節點號: +Send an event if state is equal or larget than:=如果 state 等於或大於以下值,則發送事件: +SmartLine State Collector=SmartLine 狀態採集器 +Save=保存 +SmartLine Display=SmartLine 顯示器 +Input the number(s) of the receiving node(s).=輸入接收節點的編號。 +Separate numbers via blanks, like '0123 0234'.=通過空格分隔數字,如“0123 0234”。 +Input the player name(s) separated by blanks,=輸入以空格分隔的玩家名稱, +or leave it blank for all players.=或者為所有玩家留空。 +Player Detector Help=玩家檢測器幫助 +Player Detector=玩家檢測器 +Receiver node numbers:=接收器節點號: +Player name(s):=玩家名稱: +SmartLine Player Detector=SmartLine 玩家檢測器 +Destination node numbers=目標節點編號 +SmartLine Repeater=SmartLine 中繼器 +not connected=未連接 +connected with=連接到 +fault (overloaded)=故障(過載) +Offset/s=偏移量/秒 +Run endless=無休止運行 +SmartLine Sequencer=SmartLine 序列器 +stopped=已經停止 +running=正在運行 +SmartLine Sequencer Help@n@nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n= +help=幫助 +close=關閉 +Number(s)=編號 +Command=命令 +SmartLine Signal Tower=SmartLine 信號塔 +Time=時間 +SmartLine Timer=SmartLine 計時器 +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the@ntime every few seconds. If the block was just loaded,@nthe timer will check the last 4 hours for commands@nthat still need to be executed.= + + +##### not used anymore ##### + +SmartLine Sequencer Help@n @nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n=SmartLine 序列器 幫助@n @n定義一系列命令來控制其他機器。@nNumbers(s) 是節點編號,命令將會發送到(這個節點)。@n命令“on”和“off”用於機器和其他節點@n偏移量是到下一行的時間,以秒為單位 (1..999)。@n如果設置了 endless(無休止),序列器會一次又一次地重新啟動。@n命令“ ”不執行任何操作,僅消耗偏移時間。@n +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the @ntime every few seconds. If the block was just loaded, @nthe timer will check the last 4 hours for commands@nthat still need to be executed.=SmartLine 計時器幫助@n@n計時器用於在白天發送控制命令,@n例如打開、關閉路燈。@n計時器會每隔幾秒鐘檢查一次時間。@n如果方塊剛剛加載,計時器將會@n檢查最後四個小時內仍然需要執行的命令。 diff --git a/mods/techpack/smartline/locale/template.txt b/mods/techpack/smartline/locale/template.txt index 0b729a74..8e8a3958 100644 --- a/mods/techpack/smartline/locale/template.txt +++ b/mods/techpack/smartline/locale/template.txt @@ -1,85 +1,40 @@ # textdomain: smartline - - - -### button.lua ### - +SmartLine Button/Switch= +switch,button 2s,button 4s,button 8s,button 16s= Insert destination block number(s)= SmartLine Button= -SmartLine Button/Switch= connected with block= -switch,button 2s,button 4s,button 8s,button 16s= - -### button.lua ### -### collector.lua ### -### playerdetector.lua ### -### repeater.lua ### - -Save= - -### collector.lua ### - -Node number to send the events to:= Node numbers to read the states from:= +Node number to send the events to:= Send an event if state is equal or larget than:= SmartLine State Collector= - -### display.lua ### - +Save= SmartLine Display= - -### playerdetector.lua ### - Input the number(s) of the receiving node(s).= -Input the player name(s) separated by blanks,= -Player Detector= -Player Detector Help= -Player name(s):= -Receiver node numbers:= Separate numbers via blanks, like '0123 0234'.= -SmartLine Player Detector= +Input the player name(s) separated by blanks,= or leave it blank for all players.= - -### playerdetector.lua ### -### sequencer.lua ### -### timer.lua ### - -close= -help= - -### repeater.lua ### - +Player Detector Help= +Player Detector= +Receiver node numbers:= +Player name(s):= +SmartLine Player Detector= Destination node numbers= SmartLine Repeater= +not connected= connected with= fault (overloaded)= -not connected= - -### sequencer.lua ### - Offset/s= Run endless= SmartLine Sequencer= - -SmartLine Sequencer Help@n @nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n= - -running= stopped= - -### sequencer.lua ### -### timer.lua ### - -Command= +running= +SmartLine Sequencer Help@n@nDefine a sequence of commands to control other machines.@nNumbers(s) are the node numbers, the command shall sent to.@nThe commands 'on'/'off' are used for machines and other nodes.@nOffset is the time to the next line in seconds (1..999).@nIf endless is set, the Sequencer restarts again and again.@nThe command ' ' does nothing, only consuming the offset time.@n= +help= +close= Number(s)= - -### signaltower.lua ### - +Command= SmartLine Signal Tower= - -### timer.lua ### - -SmartLine Timer= - -SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the @ntime every few seconds. If the block was just loaded, @nthe timer will check the last 4 hours for commands@nthat still need to be executed.= - Time= +SmartLine Timer= +SmartLine Timer Help@n@nThe Timer is for a daytime controlled sending of commands@ne.g. to turn street lights on/off. The timer checks the@ntime every few seconds. If the block was just loaded,@nthe timer will check the last 4 hours for commands@nthat still need to be executed.= diff --git a/mods/techpack/smartline/mod.conf b/mods/techpack/smartline/mod.conf index e6c04d4d..80334f0f 100644 --- a/mods/techpack/smartline/mod.conf +++ b/mods/techpack/smartline/mod.conf @@ -1 +1,4 @@ -name=smartline +name = smartline +description = SmartLine is a Tubelib extension with small and smart sensors, actors and controllers. +depends = default, doors, tubelib, lcdlib, sl_controller +optional_depends = mail diff --git a/mods/techpack/smartline/playerdetector.lua b/mods/techpack/smartline/playerdetector.lua index 6f646c38..2f96be5d 100644 --- a/mods/techpack/smartline/playerdetector.lua +++ b/mods/techpack/smartline/playerdetector.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information playerdetector.lua: - + ]]-- -- Load support for I18n @@ -42,14 +42,14 @@ local function scan_for_player(pos) local names = meta:get_string("names") or "" for _, object in pairs(minetest.get_objects_inside_radius(pos, 4)) do if object:is_player() then - if names == "" then + if names == "" then meta:set_string("player_name", object:get_player_name()) - return true + return true end for _,name in ipairs(string.split(names, " ")) do - if object:get_player_name() == name then + if object:get_player_name() == name then meta:set_string("player_name", name) - return true + return true end end end @@ -141,11 +141,11 @@ minetest.register_node("smartline:playerdetector", { end, on_receive_fields = on_receive_fields, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, - + on_timer = function (pos, elapsed) if tubelib.data_not_corrupted(pos) then if scan_for_player(pos) then @@ -164,6 +164,7 @@ minetest.register_node("smartline:playerdetector", { groups = {cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node("smartline:playerdetector_active", { @@ -185,9 +186,9 @@ minetest.register_node("smartline:playerdetector_active", { { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, }, }, - + on_receive_fields = on_receive_fields, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -206,7 +207,8 @@ minetest.register_node("smartline:playerdetector_active", { groups = {cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), - drop = "smartline:playerdetector" + drop = "smartline:playerdetector", + on_blast = function() end, }) minetest.register_craft({ @@ -234,5 +236,4 @@ tubelib.register_node("smartline:playerdetector", {"smartline:playerdetector_act on_node_load = function(pos) minetest.get_node_timer(pos):start(1.0) end, -}) - +}) diff --git a/mods/techpack/smartline/repeater.lua b/mods/techpack/smartline/repeater.lua index 0556f5ed..c315bd85 100644 --- a/mods/techpack/smartline/repeater.lua +++ b/mods/techpack/smartline/repeater.lua @@ -23,7 +23,7 @@ local function formspec(meta) return "size[7,5]".. "field[0.5,2;6,1;number;"..S("Destination node numbers")..";"..numbers.."]" .. "button_exit[1,3;2,1;exit;"..S("Save").."]" -end +end minetest.register_node("smartline:repeater", { description = S("SmartLine Repeater"), @@ -63,20 +63,20 @@ minetest.register_node("smartline:repeater", { if owner ~= player:get_player_name() then return end - + if tubelib.check_numbers(fields.number) then meta:set_string("numbers", fields.number) local own_number = meta:get_string("own_number") meta:set_string("infotext", S("SmartLine Repeater").." "..own_number..": "..S("connected with").." "..fields.number) meta:set_string("formspec", formspec(meta)) end - + local timer = minetest.get_node_timer(pos) if not timer:is_started() then timer:start(1) end end, - + on_timer = function(pos,elapsed) if tubelib.data_not_corrupted(pos) then local meta = minetest.get_meta(pos) @@ -85,7 +85,7 @@ minetest.register_node("smartline:repeater", { end return false end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -96,6 +96,7 @@ minetest.register_node("smartline:repeater", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -133,4 +134,4 @@ tubelib.register_node("smartline:repeater", {}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(1) end, -}) +}) diff --git a/mods/techpack/smartline/sequencer.lua b/mods/techpack/smartline/sequencer.lua index d9e7aa34..b1ad1d01 100644 --- a/mods/techpack/smartline/sequencer.lua +++ b/mods/techpack/smartline/sequencer.lua @@ -2,7 +2,7 @@ SmartLine ========= - + Copyright (C) 2017-2020 Joachim Stolberg AGPL v3 @@ -10,7 +10,7 @@ sequencer.lua: Derived from Tubelib sequencer - + ]]-- -- Load support for I18n @@ -22,7 +22,7 @@ local NUM_SLOTS = 8 local sHELP = "label[0,0;".. S([[SmartLine Sequencer Help - + Define a sequence of commands to control other machines. Numbers(s) are the node numbers, the command shall sent to. The commands 'on'/'off' are used for machines and other nodes. @@ -44,7 +44,7 @@ local function formspec(state, rules, endless) default.gui_bg_img.. default.gui_slots.. "label[0,0;"..S("Number(s)").."]label[2.1,0;"..S("Command").."]label[6.4,0;"..S("Offset/s").."]"} - + for idx, rule in ipairs(rules or {}) do tbl[#tbl+1] = "field[0.2,"..(-0.2+idx)..";2,1;num"..idx..";;"..(rule.num or "").."]" tbl[#tbl+1] = "dropdown[2,"..(-0.4+idx)..";3.9,1;act"..idx..";"..sAction..";"..(rule.act or "").."]" @@ -53,7 +53,7 @@ local function formspec(state, rules, endless) tbl[#tbl+1] = "checkbox[0,8.5;endless;"..S("Run endless")..";"..endless.."]" tbl[#tbl+1] = "button[4.5,8.5;1.5,1;help;"..S("help").."]" tbl[#tbl+1] = "image_button[6.5,8.5;1,1;".. tubelib.state_button(state) ..";button;]" - + return table.concat(tbl) end @@ -99,7 +99,7 @@ local function restart_timer(pos, time) if type(time) == "number" then timer:start(time) end -end +end local function check_rules(pos, elapsed) if tubelib.data_not_corrupted(pos) then @@ -164,14 +164,14 @@ local function on_receive_fields(pos, formname, fields, player) meta:set_string("formspec", formspec_help()) return end - + local endless = meta:get_int("endless") or 0 if fields.endless ~= nil then endless = fields.endless == "true" and 1 or 0 meta:set_int("index", 1) end meta:set_int("endless", endless) - + local rules = minetest.deserialize(meta:get_string("rules")) if fields.exit ~= nil then meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) @@ -219,7 +219,7 @@ minetest.register_node("smartline:sequencer", { "smartline.png", "smartline.png^smartline_sequencer.png", }, - + drawtype = "nodebox", node_box = { type = "fixed", @@ -245,7 +245,7 @@ minetest.register_node("smartline:sequencer", { end, on_receive_fields = on_receive_fields, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return @@ -257,15 +257,16 @@ minetest.register_node("smartline:sequencer", { tubelib.remove_node(pos) end end, - + on_timer = check_rules, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -296,4 +297,4 @@ tubelib.register_node("smartline:sequencer", {}, { minetest.get_node_timer(pos):start(1) end end, -}) +}) diff --git a/mods/techpack/smartline/signaltower.lua b/mods/techpack/smartline/signaltower.lua index b2549781..f4cf9781 100644 --- a/mods/techpack/smartline/signaltower.lua +++ b/mods/techpack/smartline/signaltower.lua @@ -20,14 +20,14 @@ local function switch_on(pos, node, color) meta:set_string("state", color) node.name = "smartline:signaltower_"..color minetest.swap_node(pos, node) -end +end local function switch_off(pos, node) local meta = minetest.get_meta(pos) meta:set_string("state", "off") node.name = "smartline:signaltower" minetest.swap_node(pos, node) -end +end minetest.register_node("smartline:signaltower", { description = S("SmartLine Signal Tower"), @@ -44,7 +44,7 @@ minetest.register_node("smartline:signaltower", { { -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}, }, }, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "smartline:signaltower") local meta = minetest.get_meta(pos) @@ -63,12 +63,13 @@ minetest.register_node("smartline:signaltower", { end, paramtype = "light", - light_source = 0, + light_source = 0, sunlight_propagates = true, paramtype2 = "facedir", groups = {cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) for _,color in ipairs({"green", "amber", "red"}) do @@ -94,13 +95,14 @@ for _,color in ipairs({"green", "amber", "red"}) do end, paramtype = "light", - light_source = 10, + light_source = 10, sunlight_propagates = true, paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), drop = "smartline:signaltower", + on_blast = function() end, }) end @@ -114,8 +116,8 @@ minetest.register_craft({ }) tubelib.register_node("smartline:signaltower", { - "smartline:signaltower_green", - "smartline:signaltower_amber", + "smartline:signaltower_green", + "smartline:signaltower_amber", "smartline:signaltower_red"}, { on_recv_message = function(pos, topic, payload) local node = minetest.get_node(pos) @@ -132,4 +134,4 @@ tubelib.register_node("smartline:signaltower", { return meta:get_string("state") end end, -}) +}) diff --git a/mods/techpack/smartline/timer.lua b/mods/techpack/smartline/timer.lua index 63e5d597..88bb2287 100644 --- a/mods/techpack/smartline/timer.lua +++ b/mods/techpack/smartline/timer.lua @@ -2,7 +2,7 @@ SmartLine ========= - + Copyright (C) 2017-2020 Joachim Stolberg AGPL v3 @@ -10,7 +10,7 @@ timer.lua: Derived from Tubelib timer - + ]]-- -- Load support for I18n @@ -22,17 +22,17 @@ local sHELP = "label[0,0;".. S([[SmartLine Timer Help The Timer is for a daytime controlled sending of commands -e.g. to turn street lights on/off. The timer checks the -time every few seconds. If the block was just loaded, +e.g. to turn street lights on/off. The timer checks the +time every few seconds. If the block was just loaded, the timer will check the last 4 hours for commands that still need to be executed.]]).. "]" local tTime = { - ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, + ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, ["06:00"] = 4, ["08:00"] = 5, ["10:00"] = 6, - ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, + ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, ["18:00"] =10, ["20:00"] =11, ["22:00"] =12, } @@ -51,32 +51,32 @@ local function formspec(events, numbers, actions) default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - + "label[0,0;"..S("Time").."]label[2.3,0;"..S("Number(s)").."]label[4.5,0;"..S("Command").."]".. - "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. + "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. "field[2.3,1.2;2,1;n1;;"..numbers[1].."]" .. - "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. - - "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. + "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. + + "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. "field[2.3,2.2;2,1;n2;;"..numbers[2].."]" .. - "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. - - "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. + "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. + + "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. "field[2.3,3.2;2,1;n3;;"..numbers[3].."]" .. - "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. - - "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. + "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. + + "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. "field[2.3,4.2;2,1;n4;;"..numbers[4].."]" .. - "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. - - "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. + "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. + + "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. "field[2.3,5.2;2,1;n5;;"..numbers[5].."]" .. - "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. - - "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. + "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. + + "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. "field[2.3,6.2;2,1;n6;;"..numbers[6].."]" .. - "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. - + "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. + "button[4.5,7;1.5,1;help;"..S("help").."]".. "button_exit[6.5,7;1.5,1;exit;"..S("close").."]" end @@ -102,7 +102,7 @@ local function check_rules(pos,elapsed) local done = minetest.deserialize(meta:get_string("done")) local placer_name = meta:get_string("placer_name") local own_num = meta:get_string("own_num") - + -- check all rules for idx,act in ipairs(actions) do if act ~= "" and numbers[idx] ~= "" then @@ -121,7 +121,7 @@ local function check_rules(pos,elapsed) end end end - + -- prepare for the next day if hour == 23 then done = {false,false,false,false,false,false} @@ -205,12 +205,12 @@ minetest.register_node("smartline:timer", { end end meta:set_string("actions", minetest.serialize(actions)) - + meta:set_string("formspec", formspec(events, numbers, actions)) local done = {false,false,false,false,false,false} meta:set_string("done", minetest.serialize(done)) end, - + on_timer = check_rules, after_dig_node = function(pos) @@ -223,6 +223,7 @@ minetest.register_node("smartline:timer", { sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, + on_blast = function() end, }) tubelib.register_node("smartline:timer", {}, { diff --git a/mods/techpack/techpack_stairway/depends.txt b/mods/techpack/techpack_stairway/depends.txt deleted file mode 100644 index 3a7daa1d..00000000 --- a/mods/techpack/techpack_stairway/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default - diff --git a/mods/techpack/techpack_stairway/description.txt b/mods/techpack/techpack_stairway/description.txt deleted file mode 100644 index 1769ea42..00000000 --- a/mods/techpack/techpack_stairway/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Simple stairways and bridges for your machines. - diff --git a/mods/techpack/techpack_stairway/locale/techpack_stairway.de.tr b/mods/techpack/techpack_stairway/locale/techpack_stairway.de.tr index 758b3b93..e56b9ee5 100644 --- a/mods/techpack/techpack_stairway/locale/techpack_stairway.de.tr +++ b/mods/techpack/techpack_stairway/locale/techpack_stairway.de.tr @@ -1,22 +1,17 @@ # textdomain: techpack_stairway - - - -### init.lua ### - -TechPack Bridge 1=TechPack Brücke 1 -TechPack Bridge 2=TechPack Brücke 2 -TechPack Bridge 3=TechPack Brücke 3 -TechPack Bridge 4=TechPack Brücke 4 TechPack Grating=TechPack Gitterrost TechPack Handrail 1=TechPack Geländer 1 TechPack Handrail 2=TechPack Geländer 2 TechPack Handrail 3=TechPack Geländer 3 TechPack Handrail 4=TechPack Geländer 4 +TechPack Bridge 1=TechPack Brücke 1 +TechPack Bridge 2=TechPack Brücke 2 +TechPack Bridge 3=TechPack Brücke 3 +TechPack Bridge 4=TechPack Brücke 4 +TechPack Stairway=TechPack Treppe TechPack Ladder 1=TechPack Leiter 1 TechPack Ladder 2=TechPack Leiter 2 TechPack Ladder 3=TechPack Leiter 3 TechPack Ladder 4=TechPack Leiter 4 TechPack Lattice=TechPack Gitterrahmen TechPack Lattice Slope=TechPack Gitterrahmenrampe -TechPack Stairway=TechPack Treppe diff --git a/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_CN.tr b/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_CN.tr new file mode 100644 index 00000000..44b00a7e --- /dev/null +++ b/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_CN.tr @@ -0,0 +1,17 @@ +# textdomain: techpack_stairway +TechPack Grating=TechPack 栅栏 +TechPack Handrail 1=TechPack 扶手1 +TechPack Handrail 2=TechPack 扶手2 +TechPack Handrail 3=TechPack 扶手3 +TechPack Handrail 4=TechPack 扶手4 +TechPack Bridge 1=TechPack 桥梁1 +TechPack Bridge 2=TechPack 桥梁2 +TechPack Bridge 3=TechPack 桥梁3 +TechPack Bridge 4=TechPack 桥梁4 +TechPack Stairway=TechPack 楼梯 +TechPack Ladder 1=TechPack 梯子1 +TechPack Ladder 2=TechPack 梯子2 +TechPack Ladder 3=TechPack 梯子3 +TechPack Ladder 4=TechPack 梯子4 +TechPack Lattice=TechPack 方格 +TechPack Lattice Slope=TechPack 斜坡 diff --git a/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_TW.tr b/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_TW.tr new file mode 100644 index 00000000..2350bf8f --- /dev/null +++ b/mods/techpack/techpack_stairway/locale/techpack_stairway.zh_TW.tr @@ -0,0 +1,17 @@ +# textdomain: techpack_stairway +TechPack Grating=TechPack 柵欄 +TechPack Handrail 1=TechPack 扶手1 +TechPack Handrail 2=TechPack 扶手2 +TechPack Handrail 3=TechPack 扶手3 +TechPack Handrail 4=TechPack 扶手4 +TechPack Bridge 1=TechPack 橋樑1 +TechPack Bridge 2=TechPack 橋樑2 +TechPack Bridge 3=TechPack 橋樑3 +TechPack Bridge 4=TechPack 橋樑4 +TechPack Stairway=TechPack 樓梯 +TechPack Ladder 1=TechPack 梯子1 +TechPack Ladder 2=TechPack 梯子2 +TechPack Ladder 3=TechPack 梯子3 +TechPack Ladder 4=TechPack 梯子4 +TechPack Lattice=TechPack 方格 +TechPack Lattice Slope=TechPack 斜坡 diff --git a/mods/techpack/techpack_stairway/locale/template.txt b/mods/techpack/techpack_stairway/locale/template.txt index 9c29e43a..ec1ee8d2 100644 --- a/mods/techpack/techpack_stairway/locale/template.txt +++ b/mods/techpack/techpack_stairway/locale/template.txt @@ -1,22 +1,17 @@ # textdomain: techpack_stairway - - - -### init.lua ### - -TechPack Bridge 1= -TechPack Bridge 2= -TechPack Bridge 3= -TechPack Bridge 4= TechPack Grating= TechPack Handrail 1= TechPack Handrail 2= TechPack Handrail 3= TechPack Handrail 4= +TechPack Bridge 1= +TechPack Bridge 2= +TechPack Bridge 3= +TechPack Bridge 4= +TechPack Stairway= TechPack Ladder 1= TechPack Ladder 2= TechPack Ladder 3= TechPack Ladder 4= TechPack Lattice= TechPack Lattice Slope= -TechPack Stairway= diff --git a/mods/techpack/techpack_stairway/mod.conf b/mods/techpack/techpack_stairway/mod.conf index 9ab75172..d14b75d8 100644 --- a/mods/techpack/techpack_stairway/mod.conf +++ b/mods/techpack/techpack_stairway/mod.conf @@ -1,3 +1,3 @@ -name=techpack_stairway -description=Simple stairways and bridges for your machines. -depends=default +name = techpack_stairway +description = Simple stairways and bridges for your machines. +depends = default diff --git a/mods/techpack/techpack_warehouse/box_copper.lua b/mods/techpack/techpack_warehouse/box_copper.lua index 83f8077e..3846e85c 100644 --- a/mods/techpack/techpack_warehouse/box_copper.lua +++ b/mods/techpack/techpack_warehouse/box_copper.lua @@ -7,7 +7,7 @@ AGPL v3 See LICENSE.txt for more information - + box_copper.lua ]]-- @@ -23,20 +23,20 @@ local wh = techpack_warehouse local NODE_NAME = "techpack_warehouse:box_copper" local DESCRIPTION = S("Warehouse Box Copper") local INV_SIZE = 1200 -local BACKGROUND_IMG = "default_copper_block.png" +local BACKGROUND_IMG = "default_copper_block.png" local Box = wh.Box:new({ - node_name = NODE_NAME, - description = DESCRIPTION, - inv_size = INV_SIZE, + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, background_img = BACKGROUND_IMG, -}) +}) minetest.register_node(NODE_NAME, { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -58,7 +58,7 @@ minetest.register_node(NODE_NAME, { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -66,12 +66,13 @@ minetest.register_node(NODE_NAME, { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_active", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_active(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -87,10 +88,10 @@ minetest.register_node(NODE_NAME.."_active", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + diggable = false, can_dig = function() return false end, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -98,12 +99,13 @@ minetest.register_node(NODE_NAME.."_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_defect", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_defect(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) wh.after_place_node(Box, pos, placer, itemstack) Box.State:defect(pos, M(pos)) @@ -120,7 +122,7 @@ minetest.register_node(NODE_NAME.."_defect", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -128,9 +130,10 @@ minetest.register_node(NODE_NAME.."_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) -tubelib.register_node(NODE_NAME, +tubelib.register_node(NODE_NAME, {NODE_NAME.."_active", NODE_NAME.."_defect"}, { on_push_item = function(pos, side, item) local meta = M(pos) @@ -175,7 +178,7 @@ tubelib.register_node(NODE_NAME, on_node_repair = function(pos) return Box.State:on_node_repair(pos) end, -}) +}) minetest.register_craft({ output = NODE_NAME, diff --git a/mods/techpack/techpack_warehouse/box_gold.lua b/mods/techpack/techpack_warehouse/box_gold.lua index 742acce7..46b42ad9 100644 --- a/mods/techpack/techpack_warehouse/box_gold.lua +++ b/mods/techpack/techpack_warehouse/box_gold.lua @@ -7,7 +7,7 @@ AGPL v3 See LICENSE.txt for more information - + box_gold.lua ]]-- @@ -23,20 +23,20 @@ local wh = techpack_warehouse local NODE_NAME = "techpack_warehouse:box_gold" local DESCRIPTION = S("Warehouse Box Gold") local INV_SIZE = 3600 -local BACKGROUND_IMG = "default_gold_block.png" +local BACKGROUND_IMG = "default_gold_block.png" local Box = wh.Box:new({ - node_name = NODE_NAME, - description = DESCRIPTION, - inv_size = INV_SIZE, + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, background_img = BACKGROUND_IMG, -}) +}) minetest.register_node(NODE_NAME, { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -58,7 +58,7 @@ minetest.register_node(NODE_NAME, { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -66,12 +66,13 @@ minetest.register_node(NODE_NAME, { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_active", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_active(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -87,10 +88,10 @@ minetest.register_node(NODE_NAME.."_active", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + diggable = false, can_dig = function() return false end, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -98,12 +99,13 @@ minetest.register_node(NODE_NAME.."_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_defect", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_defect(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) wh.after_place_node(Box, pos, placer, itemstack) Box.State:defect(pos, M(pos)) @@ -120,7 +122,7 @@ minetest.register_node(NODE_NAME.."_defect", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -128,9 +130,10 @@ minetest.register_node(NODE_NAME.."_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) -tubelib.register_node(NODE_NAME, +tubelib.register_node(NODE_NAME, {NODE_NAME.."_active", NODE_NAME.."_defect"}, { on_push_item = function(pos, side, item) local meta = M(pos) @@ -175,7 +178,7 @@ tubelib.register_node(NODE_NAME, on_node_repair = function(pos) return Box.State:on_node_repair(pos) end, -}) +}) minetest.register_craft({ output = NODE_NAME, diff --git a/mods/techpack/techpack_warehouse/box_steel.lua b/mods/techpack/techpack_warehouse/box_steel.lua index c64fda8d..6fd2b303 100644 --- a/mods/techpack/techpack_warehouse/box_steel.lua +++ b/mods/techpack/techpack_warehouse/box_steel.lua @@ -7,7 +7,7 @@ AGPL v3 See LICENSE.txt for more information - + box_steel.lua ]]-- @@ -23,20 +23,20 @@ local wh = techpack_warehouse local NODE_NAME = "techpack_warehouse:box_steel" local DESCRIPTION = S("Warehouse Box Steel") local INV_SIZE = 400 -local BACKGROUND_IMG = "default_steel_block.png" +local BACKGROUND_IMG = "default_steel_block.png" local Box = wh.Box:new({ - node_name = NODE_NAME, - description = DESCRIPTION, - inv_size = INV_SIZE, + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, background_img = BACKGROUND_IMG, -}) +}) minetest.register_node(NODE_NAME, { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -58,7 +58,7 @@ minetest.register_node(NODE_NAME, { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -66,12 +66,13 @@ minetest.register_node(NODE_NAME, { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_active", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_active(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) return wh.after_place_node(Box, pos, placer, itemstack) end, @@ -87,10 +88,10 @@ minetest.register_node(NODE_NAME.."_active", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + diggable = false, can_dig = function() return false end, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -98,12 +99,13 @@ minetest.register_node(NODE_NAME.."_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node(NODE_NAME.."_defect", { description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", tiles = wh.tiles_defect(BACKGROUND_IMG), - + after_place_node = function(pos, placer, itemstack) wh.after_place_node(Box, pos, placer, itemstack) Box.State:defect(pos, M(pos)) @@ -120,7 +122,7 @@ minetest.register_node(NODE_NAME.."_defect", { on_metadata_inventory_put = wh.on_metadata_inventory_put, allow_metadata_inventory_take = wh.allow_metadata_inventory_take, allow_metadata_inventory_move = wh.allow_metadata_inventory_move, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -128,9 +130,10 @@ minetest.register_node(NODE_NAME.."_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) -tubelib.register_node(NODE_NAME, +tubelib.register_node(NODE_NAME, {NODE_NAME.."_active", NODE_NAME.."_defect"}, { on_push_item = function(pos, side, item) local meta = M(pos) @@ -175,7 +178,7 @@ tubelib.register_node(NODE_NAME, on_node_repair = function(pos) return Box.State:on_node_repair(pos) end, -}) +}) minetest.register_craft({ output = NODE_NAME, diff --git a/mods/techpack/techpack_warehouse/depends.txt b/mods/techpack/techpack_warehouse/depends.txt deleted file mode 100644 index ea2f0c22..00000000 --- a/mods/techpack/techpack_warehouse/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -tubelib -tubelib_addons1 - diff --git a/mods/techpack/techpack_warehouse/description.txt b/mods/techpack/techpack_warehouse/description.txt deleted file mode 100644 index 8c2eaac1..00000000 --- a/mods/techpack/techpack_warehouse/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Warehouse boxes - diff --git a/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_CN.tr b/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_CN.tr new file mode 100644 index 00000000..0083ed04 --- /dev/null +++ b/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: techpack_warehouse +Warehouse Box Copper=铜仓库箱 +Warehouse Box Gold=金仓库箱 +Warehouse Box Steel=铁仓库箱 +Pass-through storage for unconfigured items (turn on/off)=未配置项目的直通存储(打开/关闭) +Filter: To configure the 8 storages=过滤器:配置8个存储 +Storage: All items will be stored here=存储:所有物品都将存放在这里 +Input: Put items will be moved to the storage, if configured=输入:如果已配置,放置项目将被移动到存储 diff --git a/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_TW.tr b/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_TW.tr new file mode 100644 index 00000000..0052998a --- /dev/null +++ b/mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: techpack_warehouse +Warehouse Box Copper=銅倉庫箱 +Warehouse Box Gold=金倉庫箱 +Warehouse Box Steel=鐵倉庫箱 +Pass-through storage for unconfigured items (turn on/off)=未配置項目的直通存儲(打開/關閉) +Filter: To configure the 8 storages=過濾器:配置8個存儲 +Storage: All items will be stored here=存儲:所有物品都將存放在這裡 +Input: Put items will be moved to the storage, if configured=輸入:如果已配置,放置項目將被移動到存儲 diff --git a/mods/techpack/techpack_warehouse/locale/template.txt b/mods/techpack/techpack_warehouse/locale/template.txt index b068cd04..217b4846 100644 --- a/mods/techpack/techpack_warehouse/locale/template.txt +++ b/mods/techpack/techpack_warehouse/locale/template.txt @@ -1,22 +1,8 @@ # textdomain: techpack_warehouse - - - -### box_copper.lua ### - Warehouse Box Copper= - -### box_gold.lua ### - Warehouse Box Gold= - -### box_steel.lua ### - Warehouse Box Steel= - -### common.lua ### - -Filter: To configure the 8 storages= -Input: Put items will be moved to the storage, if configured= Pass-through storage for unconfigured items (turn on/off)= +Filter: To configure the 8 storages= Storage: All items will be stored here= +Input: Put items will be moved to the storage, if configured= diff --git a/mods/techpack/techpack_warehouse/mod.conf b/mods/techpack/techpack_warehouse/mod.conf index 66b5b1ae..2bb4736d 100644 --- a/mods/techpack/techpack_warehouse/mod.conf +++ b/mods/techpack/techpack_warehouse/mod.conf @@ -1,3 +1,3 @@ -name=techpack_warehouse -description=Warehouse boxes -depends=tubelib,tubelib_addons1 +name = techpack_warehouse +description = Warehouse boxes +depends = tubelib,tubelib_addons1 diff --git a/mods/techpack/tubelib/blackhole.lua b/mods/techpack/tubelib/blackhole.lua index 70966f70..ccec2c1f 100644 --- a/mods/techpack/tubelib/blackhole.lua +++ b/mods/techpack/tubelib/blackhole.lua @@ -9,17 +9,17 @@ See LICENSE.txt for more information blackhole.lua: - + Simple node which lets all items disappear. The blackhole supports the following message: - - topic = "status", payload = nil, + - topic = "status", payload = nil, response is the number of disappeared items (0..n) ]]-- -- +--------+ -- / /| -- +--------+ | --- IN (L) -->| BLACK | | +-- IN (L) -->| BLACK | | -- | HOLE | + -- | |/ -- +--------+ @@ -58,6 +58,7 @@ minetest.register_node("tubelib:blackhole", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -75,7 +76,7 @@ minetest.register_craft({ tubelib.register_node("tubelib:blackhole", {}, { on_pull_item = nil, -- not needed on_unpull_item = nil, -- not needed - + valid_sides = {"L"}, on_push_item = function(pos, side, item) local meta = minetest.get_meta(pos) @@ -84,7 +85,7 @@ tubelib.register_node("tubelib:blackhole", {}, { meta:set_string("infotext", disappeared.." "..S("items disappeared")) return true end, - + on_recv_message = function(pos, topic, payload) local node = minetest.get_node(pos) if topic == "state" then @@ -94,5 +95,5 @@ tubelib.register_node("tubelib:blackhole", {}, { return "not supported" end end, -}) +}) --------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/button.lua b/mods/techpack/tubelib/button.lua index 551e225c..4bd3ad6c 100644 --- a/mods/techpack/tubelib/button.lua +++ b/mods/techpack/tubelib/button.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information button.lua: - + Example of a simple communication node, only sending messages to other nodes. ]]-- @@ -83,7 +83,7 @@ minetest.register_node("tubelib:button", { local own_num = tubelib.add_node(pos, "tubelib:button") meta:set_string("own_num", own_num) meta:set_string("formspec", "size[7.5,6]".. - "dropdown[0.2,0;3;type;"..S("switch,button 2s,button 4s,button 8s,button 16s")..";1]".. + "dropdown[0.2,0;3;type;"..S("switch,button 2s,button 4s,button 8s,button 16s")..";1]".. "field[0.5,2;7,1;numbers;"..S("Insert destination node number(s)")..";]" .. "checkbox[1,3;public;"..S("public")..";false]".. "button_exit[2,4;3,1;exit;"..S("Save").."]") @@ -124,7 +124,7 @@ minetest.register_node("tubelib:button", { meta:set_string("formspec", nil) end end, - + on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) if meta:get_string("numbers") ~= "" and meta:get_string("numbers") ~= nil then @@ -140,6 +140,7 @@ minetest.register_node("tubelib:button", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -173,8 +174,11 @@ minetest.register_node("tubelib:button_active", { is_ground_content = false, sounds = default.node_sound_wood_defaults(), drop = "tubelib:button", + on_blast = function() end, }) +tubelib.register_node("tubelib:button", {"tubelib:button_active"}, {tubelib_node = true}) + minetest.register_craft({ output = "tubelib:button", recipe = { @@ -183,4 +187,3 @@ minetest.register_craft({ {"", "group:wood", ""}, }, }) - diff --git a/mods/techpack/tubelib/command.lua b/mods/techpack/tubelib/command.lua index 884568e5..d1b8cf84 100644 --- a/mods/techpack/tubelib/command.lua +++ b/mods/techpack/tubelib/command.lua @@ -23,7 +23,9 @@ local function deserialize(s) local tbl = {} for line in s:gmatch("[^;]+") do local num, spos = unpack(string.split(line, "=")) - tbl[num] = {pos = minetest.string_to_pos(spos)} + if num ~= nil and num ~= "" and spos ~= nil and spos ~= "" then + tbl[num] = {pos = minetest.string_to_pos(spos)} + end end return tbl end @@ -31,7 +33,9 @@ end local function serialize(data) local tbl = {} for k,v in pairs(data) do - tbl[#tbl+1] = k.."="..minetest.pos_to_string(v.pos) + if k ~= nil and k ~= "" and v ~= nil and v.pos ~= nil then + tbl[#tbl+1] = k.."="..minetest.pos_to_string(v.pos) + end end return table.concat(tbl, ";") end @@ -640,6 +644,9 @@ local function get_node_number(pos) num = meta:get_string("own_number") if num and num ~= "" then return num end + num = meta:get_string("own_num") + if num and num ~= "" then return num end + num = parse_number(meta:get_string("infotext")) if num and num ~= "" then return num end diff --git a/mods/techpack/tubelib/defect.lua b/mods/techpack/tubelib/defect.lua index 178bf780..b7131d22 100644 --- a/mods/techpack/tubelib/defect.lua +++ b/mods/techpack/tubelib/defect.lua @@ -13,6 +13,7 @@ minetest.register_node("tubelib:defect_dummy", { }, groups = {cracky=3, crumbly=3, choppy=3, not_in_creative_inventory=1}, is_ground_content = false, + on_blast = function() end, }) local reported_machines = {} @@ -25,7 +26,7 @@ local function already_reported(pos) end -function tubelib.data_not_corrupted(pos, has_no_info) +function tubelib.data_not_corrupted(pos, has_no_info) if minetest.pos_to_string(pos) ~= minetest.get_meta(pos):get_string("my_pos") then -- node number corrupt? local meta = minetest.get_meta(pos) @@ -45,13 +46,13 @@ function tubelib.data_not_corrupted(pos, has_no_info) report(pos) end end - + -- button like odes - if has_no_info then + if has_no_info then minetest.get_meta(pos):get_string("my_pos", minetest.pos_to_string(pos)) - return true + return true end - + -- node moved? local info = tubelib.get_node_info(number) if not info or not vector.equals(info.pos, pos) then diff --git a/mods/techpack/tubelib/depends.txt b/mods/techpack/tubelib/depends.txt deleted file mode 100644 index 6bd43252..00000000 --- a/mods/techpack/tubelib/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -tubelib2 -basic_materials - diff --git a/mods/techpack/tubelib/description.txt b/mods/techpack/tubelib/description.txt deleted file mode 100644 index 3dee6994..00000000 --- a/mods/techpack/tubelib/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Tubes Mod with message communication interface as basis for further technique Mods. - diff --git a/mods/techpack/tubelib/distributor.lua b/mods/techpack/tubelib/distributor.lua index de6223fb..98b98002 100644 --- a/mods/techpack/tubelib/distributor.lua +++ b/mods/techpack/tubelib/distributor.lua @@ -9,13 +9,13 @@ See LICENSE.txt for more information distributor.lua: - + A more complex node acting as server and client. This node claims a position number and registers its message and items interface. The Distributor is based on the class NodeStates and supports the following messages: - topic = "on", payload = nil - topic = "off" , payload = nil - - topic = "state", payload = nil, + - topic = "state", payload = nil, response is "running", "stopped", "standby", "defect", or "not supported" ]]-- @@ -108,20 +108,20 @@ end local function AddToTbl(kvTbl, new_items) - for _, l in ipairs(new_items) do - kvTbl[l[1]] = true + for _, l in ipairs(new_items) do + kvTbl[l[1]] = true end return kvTbl end local function countItemOccurrenceInFilters(kvTbl, new_items) - for _, l in ipairs(new_items) do + for _, l in ipairs(new_items) do local name = l[1] if kvTbl[name] == nil then kvTbl[name] = 1 else kvTbl[name] = kvTbl[name] + 1 - end + end end return kvTbl end @@ -152,7 +152,7 @@ local function filter_settings(pos) local kvFilterItemNames = {} -- { = true,...} local kvSide2ItemNames = {} -- {"F" = {,...},...} local kvNumOccur = {} - + -- collect all filter settings for idx,slot in ipairs(SlotColors) do local side = Num2Ascii[idx] @@ -164,9 +164,9 @@ local function filter_settings(pos) countItemOccurrenceInFilters(kvNumOccur, filter) end end - + FilterCache[hash] = { - kvFilterItemNames = kvFilterItemNames, + kvFilterItemNames = kvFilterItemNames, kvSide2ItemNames = kvSide2ItemNames, kvRejectedItemNames = {}, kvNumOccur = kvNumOccur, @@ -177,24 +177,24 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 end - + local meta = M(pos) local inv = meta:get_inventory() local list = inv:get_list(listname) local stack_count = stack:get_count() - + if listname == "src" then if State:get_state(M(pos)) == tubelib.STANDBY then State:start(pos, meta) end return stack_count end - + local space_left = MAX_NUM_PER_CYC - invlist_num_entries(list) if space_left <= 0 then -- < 0 case is possible if distributor is already misconfigured return 0 end - + filter_settings(pos) return math.min(stack_count, space_left) end @@ -203,7 +203,7 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player if minetest.is_protected(pos, player:get_player_name()) then return 0 end - + if listname ~= "src" then filter_settings(pos) end @@ -227,16 +227,16 @@ local function distributing(pos, meta) local inv = meta:get_inventory() local list = inv:get_list("src") local kvSrc = invlist_content_as_kvlist(list) - local counter = minetest.deserialize(meta:get_string("item_counter")) or + local counter = minetest.deserialize(meta:get_string("item_counter")) or {red=0, green=0, blue=0, yellow=0} - + -- calculate the filter settings only once local hash = minetest.hash_node_position(pos) if FilterCache[hash] == nil then filter_settings(pos) end - - -- read data from Cache + + -- read data from Cache -- all filter items as key/value { = true,...} local kvFilterItemNames = FilterCache[hash].kvFilterItemNames -- filter items of one slot as list {{, },...} @@ -244,9 +244,9 @@ local function distributing(pos, meta) local kvNumOccur = FilterCache[hash].kvNumOccur -- rejected items from other filter slots local rejected = FilterCache[hash].kvRejectedItemNames - + if items == nil then return end - + local moved_items_total = 0 if next(items) then for _,item in ipairs(items) do @@ -265,7 +265,7 @@ local function distributing(pos, meta) end end end - + -- move additional items from unconfigured filters to the output if next(items) == nil then local moved_items = 0 @@ -327,9 +327,9 @@ local function on_receive_fields(pos, formname, fields, player) filter[4] = fields.filter4 == "true" end meta:set_string("filter", minetest.serialize(filter)) - + filter_settings(pos) - + if fields.state_button ~= nil then State:state_button_event(pos, fields) else @@ -347,9 +347,9 @@ local function change_filter_settings(pos, slot, val) filter[num] = val == "on" end meta:set_string("filter", minetest.serialize(filter)) - + filter_settings(pos) - + meta:set_string("formspec", formspec(State, pos, meta)) return true end @@ -397,20 +397,21 @@ minetest.register_node("tubelib:distributor", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, on_timer = keep_running, on_rotate = screwdriver.disallow, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -436,7 +437,7 @@ minetest.register_node("tubelib:distributor_active", { }, on_receive_fields = on_receive_fields, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -453,6 +454,7 @@ minetest.register_node("tubelib:distributor_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib:distributor_defect", { @@ -498,7 +500,7 @@ minetest.register_node("tubelib:distributor_defect", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) -- <<=== tubelib end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -511,6 +513,7 @@ minetest.register_node("tubelib:distributor_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -525,7 +528,7 @@ minetest.register_craft({ --------------------------------------------------------------- tubelib -tubelib.register_node("tubelib:distributor", +tubelib.register_node("tubelib:distributor", {"tubelib:distributor_active", "tubelib:distributor_defect"}, { on_pull_item = function(pos, side) return tubelib.get_item(M(pos), "src") @@ -541,12 +544,12 @@ tubelib.register_node("tubelib:distributor", return change_filter_settings(pos, payload.slot, payload.val) elseif topic == "counter" then local meta = minetest.get_meta(pos) - return minetest.deserialize(meta:get_string("item_counter")) or + return minetest.deserialize(meta:get_string("item_counter")) or {red=0, green=0, blue=0, yellow=0} elseif topic == "clear_counter" then local meta = minetest.get_meta(pos) meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) - else + else local resp = State:on_receive_message(pos, topic, payload) if resp then return resp @@ -555,12 +558,12 @@ tubelib.register_node("tubelib:distributor", end end end, - + on_node_load = function(pos) State:on_node_load(pos) end, on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) --------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/forceload.lua b/mods/techpack/tubelib/forceload.lua index da639481..c1217646 100644 --- a/mods/techpack/tubelib/forceload.lua +++ b/mods/techpack/tubelib/forceload.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information forceload.lua: - + ]]-- -- Load support for I18n @@ -41,7 +41,7 @@ end local function remove_list_elem(list, x) local n = nil for idx, v in ipairs(list) do - if vector.equals(v, x) then + if vector.equals(v, x) then n = idx break end @@ -75,32 +75,37 @@ local function get_node_lvm(pos) end local function add_pos(pos, player) - local lPos = minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} + local meta = player:get_meta() + local lPos = minetest.deserialize(meta:get_string("tubelib_forceload_blocks")) or {} if not in_list(lPos, pos) and #lPos < tubelib.max_num_forceload_blocks then lPos[#lPos+1] = pos - player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) + meta:set_string("tubelib_forceload_blocks", minetest.serialize(lPos)) return true end return false end - + local function del_pos(pos, player) - local lPos = minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} + local meta = player:get_meta() + local lPos = minetest.deserialize(meta:get_string("tubelib_forceload_blocks")) or {} lPos = remove_list_elem(lPos, pos) - player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) + meta:set_string("tubelib_forceload_blocks", minetest.serialize(lPos)) end local function get_pos_list(player) - return minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} + local meta = player:get_meta() + return minetest.deserialize(meta:get_string("tubelib_forceload_blocks")) or {} end local function set_pos_list(player, lPos) - player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) + local meta = player:get_meta() + meta:set_string("tubelib_forceload_blocks", minetest.serialize(lPos)) end local function get_data(pos, player) local pos1, pos2 = calc_area(pos) - local num = #minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or 0 + local meta = player:get_meta() + local num = #minetest.deserialize(meta:get_string("tubelib_forceload_blocks")) or 0 local max = tubelib.max_num_forceload_blocks return pos1, pos2, num, max end @@ -108,21 +113,25 @@ end local function formspec(player) local lPos = get_pos_list(player) local tRes = {} - tRes[1] = "size[7,9]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[0,0;"..S("List of your Forceload Blocks")..":]" - + tRes[#tRes+1] = "#" + tRes[#tRes+1] = S("Block at pos") + tRes[#tRes+1] = S("Area from") + tRes[#tRes+1] = S("Area to") + for idx,pos in ipairs(lPos) do local pos1, pos2 = calc_area(pos) - local ypos = 0.2 + idx * 0.4 - tRes[#tRes+1] = "label[0,"..ypos..";"..idx.."]" - tRes[#tRes+1] = "label[0.8,"..ypos..";"..P2S(pos1).."]" - tRes[#tRes+1] = "label[3.2,"..ypos..";"..S("to").."]" - tRes[#tRes+1] = "label[4,"..ypos..";"..P2S(pos2).."]" + tRes[#tRes+1] = idx + tRes[#tRes+1] = minetest.formspec_escape(P2S(pos)) + tRes[#tRes+1] = minetest.formspec_escape(P2S(pos1)) + tRes[#tRes+1] = minetest.formspec_escape(P2S(pos2)) end - return table.concat(tRes) + return "size[9,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;"..S("List of your Forceload Blocks").."]".. + "tablecolumns[text,width=1.8;text,width=12;text,width=12;text,width=12]".. + "table[0,0.6;8.8,8.4;output;"..table.concat(tRes, ",")..";1]" end @@ -168,7 +177,7 @@ minetest.register_node("tubelib:forceload", { minetest.forceload_free_block(pos, true) tubelib.unmark_region(oldmetadata.fields.owner) end, - + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) if M(pos):get_string("owner") == clicker:get_player_name() or minetest.check_player_privs(clicker:get_player_name(), "server") then @@ -176,7 +185,7 @@ minetest.register_node("tubelib:forceload", { minetest.show_formspec(clicker:get_player_name(), "tubelib:forceload", s) end end, - + on_punch = function(pos, node, puncher, pointed_thing) local pos1, pos2 = calc_area(pos) tubelib.switch_region(puncher:get_player_name(), pos1, pos2) @@ -184,10 +193,11 @@ minetest.register_node("tubelib:forceload", { paramtype = "light", sunlight_propagates = true, - groups = {choppy=2, cracky=2, crumbly=2, + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = tubelib.max_num_forceload_blocks == 0 and 1 or 0}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) diff --git a/mods/techpack/tubelib/init.lua b/mods/techpack/tubelib/init.lua index 8c874149..079c8bdf 100644 --- a/mods/techpack/tubelib/init.lua +++ b/mods/techpack/tubelib/init.lua @@ -40,9 +40,9 @@ local S = tubelib.S tubelib.version = 2.00 -tubelib.max_num_forceload_blocks = tonumber(minetest.setting_get("tubelib_max_num_forceload_blocks")) or 10 -tubelib.basalt_stone_enabled = minetest.setting_get("tubelib_basalt_stone_enabled") == "true" -tubelib.machine_aging_value = tonumber(minetest.setting_get("tubelib_machine_aging_value")) or 100 +tubelib.max_num_forceload_blocks = tonumber(minetest.settings:get("tubelib_max_num_forceload_blocks")) or 10 +tubelib.basalt_stone_enabled = minetest.settings:get("tubelib_basalt_stone_enabled") == "true" +tubelib.machine_aging_value = tonumber(minetest.settings:get("tubelib_machine_aging_value")) or 100 --------------------------- conversion to v0.04 diff --git a/mods/techpack/tubelib/lamp.lua b/mods/techpack/tubelib/lamp.lua index acd21061..e4e2b048 100644 --- a/mods/techpack/tubelib/lamp.lua +++ b/mods/techpack/tubelib/lamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information lamp.lua: - + Example of a simple communication node, only receiving messages from others. This node claims a position number and registers its message interface. The Lamp supports the following messages: @@ -24,12 +24,12 @@ local S = tubelib.S local function switch_on(pos, node) node.name = "tubelib:lamp_on" minetest.swap_node(pos, node) -end +end local function switch_off(pos, node) node.name = "tubelib:lamp" minetest.swap_node(pos, node) -end +end minetest.register_node("tubelib:lamp", { description = S("Tubelib Lamp"), @@ -40,6 +40,7 @@ minetest.register_node("tubelib:lamp", { after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib:lamp") -- <<=== tubelib local meta = minetest.get_meta(pos) + meta:set_string("number", number) meta:set_string("infotext", S("Tubelib Lamp").." "..number) end, @@ -54,12 +55,13 @@ minetest.register_node("tubelib:lamp", { end, paramtype = "light", - light_source = 0, + light_source = 0, sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib:lamp_on", { @@ -75,12 +77,13 @@ minetest.register_node("tubelib:lamp_on", { end, paramtype = "light", - light_source = minetest.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sunlight_propagates = true, paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -105,5 +108,5 @@ tubelib.register_node("tubelib:lamp", {"tubelib:lamp_on"}, { switch_off(pos, node) end end, -}) +}) --------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/locale/template.txt b/mods/techpack/tubelib/locale/template.txt index 2a70dbf1..3750a29e 100644 --- a/mods/techpack/tubelib/locale/template.txt +++ b/mods/techpack/tubelib/locale/template.txt @@ -1,69 +1,35 @@ # textdomain: tubelib - - - -### basalt.lua ### - Basalt Stone= -Basalt Stone Block= Basalt Stone Brick= - -### blackhole.lua ### - +Basalt Stone Block= Tubelib Black Hole= items disappeared= - -### button.lua ### - +Tubelib Button/Switch= +switch,button 2s,button 4s,button 8s,button 16s= Insert destination node number(s)= +public= Save= Tubelib Button= -Tubelib Button/Switch= connected with block= -public= -switch,button 2s,button 4s,button 8s,button 16s= - -### defect.lua ### - Corrupted Tubelib Node= - -### distributor.lua ### - Tubelib Distributor= - -### forceload.lua ### - -Area= - -Area already loaded or max. number of Forceload Blocks reached!= - -List of your Forceload Blocks= -Punch the block to make the area visible.= +Block at pos= +Area from= +Area to= +List of your Forceload Blocks:= Tubelib Forceload Block= -loaded!= +Area= to= - -### init.lua ### - +loaded!= +Punch the block to make the area visible.= +Area already loaded or max. number of Forceload Blocks reached!= Tubelib WLAN Chip= - -### lamp.lua ### - Tubelib Lamp= - -### pusher.lua ### - Tubelib Pusher= - -### repairkit.lua ### - -Tubelib End Wrench (use @= read status, place @= destroy)= -Tubelib Repair Kit= [Tubelib] Node repaired= [Tubelib] state= -aging= counter= - -### tubes.lua ### - +aging= +Tubelib Repair Kit= +Tubelib End Wrench (use @= read status, place @= destroy)= Tubelib Tube= diff --git a/mods/techpack/tubelib/locale/tubelib.de.tr b/mods/techpack/tubelib/locale/tubelib.de.tr index a1d37a4d..9fa66de9 100644 --- a/mods/techpack/tubelib/locale/tubelib.de.tr +++ b/mods/techpack/tubelib/locale/tubelib.de.tr @@ -1,69 +1,39 @@ # textdomain: tubelib - - - -### basalt.lua ### - Basalt Stone=Basaltstein -Basalt Stone Block=Basaltsteinblock Basalt Stone Brick=Basaltsteinziegel - -### blackhole.lua ### - +Basalt Stone Block=Basaltsteinblock Tubelib Black Hole=Tubelib Schwarzes Loch items disappeared=Gegenstände verschwunden - -### button.lua ### - +Tubelib Button/Switch=Tubelib Taster/Schalter +switch,button 2s,button 4s,button 8s,button 16s=Schalter,Taster 2s,Taster 4s,Taster 8s,Taster 16s Insert destination node number(s)=Zielblocknummer(n) eingeben +public=öffentlich Save=Speichern Tubelib Button=Tubelib Taster -Tubelib Button/Switch=Tubelib Taster/Schalter connected with block=verbunden mit Block -public=öffentlich -switch,button 2s,button 4s,button 8s,button 16s=Schalter,Taster 2s,Taster 4s,Taster 8s,Taster 16s - -### defect.lua ### - Corrupted Tubelib Node=beschädigter Tubelib Block - -### distributor.lua ### - Tubelib Distributor=Tubelib Verteiler - -### forceload.lua ### - -Area=Bereich - -Area already loaded or max. number of Forceload Blocks reached!=Bereich bereits geladen oder max. Anzahl von Forceload Blöcken erreicht! - +Block at pos=Block an Pos +Area from=Bereich von +Area to=Bereich bis List of your Forceload Blocks=Liste deiner Forceload Blöcke -Punch the block to make the area visible.=Schlage den Block um den Bereich anzuzeigen Tubelib Forceload Block=Tubelib Forceload Block -loaded!=geladen! +Area=Bereich to=bis - -### init.lua ### - +loaded!=geladen! +Punch the block to make the area visible.=Schlage den Block um den Bereich anzuzeigen +Area already loaded or max. number of Forceload Blocks reached!=Bereich bereits geladen oder max. Anzahl von Forceload Blöcken erreicht! Tubelib WLAN Chip=Tubelib WLAN Chip - -### lamp.lua ### - Tubelib Lamp=Tubelib Lampe - -### pusher.lua ### - Tubelib Pusher=Tubelib Schieber - -### repairkit.lua ### - -Tubelib End Wrench (use @= read status, place @= destroy)=Tubelib Gabelschlüssel (benutzen @= Status lesen, platzieren @= zerstören) -Tubelib Repair Kit=Tubelib Reparatur Kit [Tubelib] Node repaired=[Tubelib] Block repariert [Tubelib] state=Tubelib Zustand -aging=altern counter=Zähler - -### tubes.lua ### - +aging=altern +Tubelib Repair Kit=Tubelib Reparatur Kit +Tubelib End Wrench (use @= read status, place @= destroy)=Tubelib Gabelschlüssel (benutzen @= Status lesen, platzieren @= zerstören) Tubelib Tube=Tubelib Röhre + + +##### not used anymore ##### + diff --git a/mods/techpack/tubelib/locale/tubelib.zh_CN.tr b/mods/techpack/tubelib/locale/tubelib.zh_CN.tr new file mode 100644 index 00000000..81c23b84 --- /dev/null +++ b/mods/techpack/tubelib/locale/tubelib.zh_CN.tr @@ -0,0 +1,40 @@ +# textdomain: tubelib +Basalt Stone=玄武岩石材 +Basalt Stone Brick=玄武岩砖 +Basalt Stone Block=玄武岩方块 +Tubelib Black Hole=Tubelib 黑洞 +items disappeared=物品消失了 +Tubelib Button/Switch=Tubelib 按钮/开关 +switch,button 2s,button 4s,button 8s,button 16s=开关,按钮 2秒,按钮 4秒,按钮8秒,按钮16秒 +Insert destination node number(s)=插入目标节点号 +public=公共 +Save=保存 +Tubelib Button=Tubelib 按钮 +connected with block=已经与方块连接 +Corrupted Tubelib Node=已经损坏的 Tubelib 节点 +Tubelib Distributor=Tubelib 分配器 +Block at pos= +Area from= +Area to= +List of your Forceload Blocks:= +Tubelib Forceload Block=Tubelib Forceload 方块 +Area=区域 +to=至 +loaded!=已加载! +Punch the block to make the area visible.=在方块上打孔以使该区域可见。 +Area already loaded or max. number of Forceload Blocks reached!=区域已经加载或达到最大值。已达到 Forceload 方块的数量! +Tubelib WLAN Chip=Tubelib 无线局域网芯片 +Tubelib Lamp=Tubelib 灯 +Tubelib Pusher=Tubelib 推送器 +[Tubelib] Node repaired=[Tubelib] 节点已经修复 +[Tubelib] state=Tubelib 状态 +counter=计数器 +aging=时效 +Tubelib Repair Kit=Tubelib 维修套件 +Tubelib End Wrench (use @= read status, place @= destroy)=Tubelib 端部扳手 (使用 @= 读取状态,放置 @= 销毁) +Tubelib Tube=Tubelib 管道 + + +##### not used anymore ##### + +List of your Forceload Blocks=你的 Forceload 方块列表 diff --git a/mods/techpack/tubelib/locale/tubelib.zh_TW.tr b/mods/techpack/tubelib/locale/tubelib.zh_TW.tr new file mode 100644 index 00000000..5b3abb52 --- /dev/null +++ b/mods/techpack/tubelib/locale/tubelib.zh_TW.tr @@ -0,0 +1,40 @@ +# textdomain: tubelib +Basalt Stone=玄武岩石材 +Basalt Stone Brick=玄武岩磚 +Basalt Stone Block=玄武岩方塊 +Tubelib Black Hole=Tubelib 黑洞 +items disappeared=物品消失了 +Tubelib Button/Switch=Tubelib 按鈕/開關 +switch,button 2s,button 4s,button 8s,button 16s=開關,按鈕 2秒,按鈕 4秒,按鈕8秒,按鈕16秒 +Insert destination node number(s)=插入目標節點號 +public=公共 +Save=保存 +Tubelib Button=Tubelib 按鈕 +connected with block=已經與方塊連接 +Corrupted Tubelib Node=已經損壞的 Tubelib 節點 +Tubelib Distributor=Tubelib 分配器 +Block at pos= +Area from= +Area to= +List of your Forceload Blocks:= +Tubelib Forceload Block=Tubelib Forceload 方塊 +Area=區域 +to=至 +loaded!=已加載! +Punch the block to make the area visible.=在方塊上打孔以使該區域可見。 +Area already loaded or max. number of Forceload Blocks reached!=區域已經加載或達到最大值。已達到 Forceload 方塊的數量! +Tubelib WLAN Chip=Tubelib 無線局域網芯片 +Tubelib Lamp=Tubelib 燈 +Tubelib Pusher=Tubelib 推送器 +[Tubelib] Node repaired=[Tubelib] 節點已經修復 +[Tubelib] state=Tubelib 狀態 +counter=計數器 +aging=時效 +Tubelib Repair Kit=Tubelib 維修套件 +Tubelib End Wrench (use @= read status, place @= destroy)=Tubelib 端部扳手 (使用 @= 讀取狀態,放置 @= 銷燬) +Tubelib Tube=Tubelib 管道 + + +##### not used anymore ##### + +List of your Forceload Blocks=你的 Forceload 方塊列表 diff --git a/mods/techpack/tubelib/migrate.lua b/mods/techpack/tubelib/migrate.lua index 1c918917..4adc3d78 100644 --- a/mods/techpack/tubelib/migrate.lua +++ b/mods/techpack/tubelib/migrate.lua @@ -89,7 +89,7 @@ minetest.register_node("tubelib:tube1", { "tubelib_hole.png", "tubelib_hole.png", }, - + after_place_node = function(pos, placer, itemstack, pointed_thing) if not Tube:after_place_tube(pos, placer, pointed_thing) then minetest.remove_node(pos) @@ -97,11 +97,11 @@ minetest.register_node("tubelib:tube1", { end return false end, - + after_dig_node = function(pos, oldnode, oldmetadata, digger) Tube:after_dig_tube(pos, oldnode, oldmetadata) end, - + paramtype2 = "facedir", drawtype = "nodebox", node_box = { @@ -124,6 +124,7 @@ minetest.register_node("tubelib:tube1", { is_ground_content = false, groups = {choppy=2, cracky=3, stone=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ diff --git a/mods/techpack/tubelib/mod.conf b/mods/techpack/tubelib/mod.conf index 75fca445..7bc63522 100644 --- a/mods/techpack/tubelib/mod.conf +++ b/mods/techpack/tubelib/mod.conf @@ -1,3 +1,3 @@ -name=tubelib -description=Tubes Mod with message communication interface as basis for further technique Mods. -depends=default,tubelib2,basic_materials +name = tubelib +description = Tubes Mod with message communication interface as basis for further technique Mods. +depends = default, tubelib2, basic_materials diff --git a/mods/techpack/tubelib/pusher.lua b/mods/techpack/tubelib/pusher.lua index fb26b790..514a5466 100644 --- a/mods/techpack/tubelib/pusher.lua +++ b/mods/techpack/tubelib/pusher.lua @@ -9,14 +9,14 @@ See LICENSE.txt for more information pusher.lua: - + Simple node for push/pull operation of StackItems from chests or other inventory/server nodes to tubes or other inventory/server nodes. - + The Pusher is based on the class NodeStates and supports the following messages: - topic = "on", payload = nil - topic = "off", payload = nil - - topic = "state", payload = nil, + - topic = "state", payload = nil, response is "running", "stopped", "standby", "blocked", or "not supported" ]]-- @@ -78,7 +78,7 @@ local function keep_running(pos, elapsed) return State:is_active(meta) end return false -end +end minetest.register_node("tubelib:pusher", { description = S("Tubelib Pusher"), @@ -109,7 +109,7 @@ minetest.register_node("tubelib:pusher", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -119,6 +119,7 @@ minetest.register_node("tubelib:pusher", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -175,7 +176,7 @@ minetest.register_node("tubelib:pusher_active", { State:stop(pos, M(pos)) end end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -188,6 +189,7 @@ minetest.register_node("tubelib:pusher_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib:pusher_defect", { @@ -213,7 +215,7 @@ minetest.register_node("tubelib:pusher_defect", { after_dig_node = function(pos) tubelib.remove_node(pos) -- <<=== tubelib end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -223,6 +225,7 @@ minetest.register_node("tubelib:pusher_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -236,7 +239,7 @@ minetest.register_craft({ }) --------------------------------------------------------------- tubelib -tubelib.register_node("tubelib:pusher", +tubelib.register_node("tubelib:pusher", {"tubelib:pusher_active", "tubelib:pusher_defect"}, { on_pull_item = nil, -- pusher has no inventory on_push_item = nil, -- pusher has no inventory @@ -257,5 +260,5 @@ tubelib.register_node("tubelib:pusher", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) --------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib_addons1/autocrafter.lua b/mods/techpack/tubelib_addons1/autocrafter.lua index 91a3fabc..9d6557d2 100644 --- a/mods/techpack/tubelib_addons1/autocrafter.lua +++ b/mods/techpack/tubelib_addons1/autocrafter.lua @@ -8,11 +8,11 @@ AGPL v3 See LICENSE.txt for more information - The autocrafter is derived from pipeworks: + The autocrafter is derived from pipeworks: Copyright (C) 2004 Sam Hocevar WTFPL autocrafter.lua: - + ]]-- -- Load support for I18n @@ -77,7 +77,7 @@ local function count_index(invlist) end -- caches some recipe data -local autocrafterCache = {} +local autocrafterCache = {} local function get_craft(pos, inventory, hash) hash = hash or minetest.hash_node_position(pos) @@ -86,7 +86,7 @@ local function get_craft(pos, inventory, hash) local recipe = inventory:get_list("recipe") local output, decremented_input = minetest.get_craft_result( {method = "normal", width = 3, items = recipe}) - craft = {recipe = recipe, consumption=count_index(recipe), + craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input} autocrafterCache[hash] = craft end @@ -98,7 +98,7 @@ local function autocraft(pos, meta, inventory, craft) local output_item = craft.output.item -- check if we have enough room in dst - if not inventory:room_for_item("dst", output_item) then + if not inventory:room_for_item("dst", output_item) then State:blocked(pos, meta) return end @@ -106,9 +106,9 @@ local function autocraft(pos, meta, inventory, craft) local inv_index = count_index(inventory:get_list("src")) -- check if we have enough material available for itemname, number in pairs(consumption) do - if (not inv_index[itemname]) or inv_index[itemname] < number then + if (not inv_index[itemname]) or inv_index[itemname] < number then State:idle(pos, meta) - return + return end end -- consume material @@ -123,7 +123,7 @@ local function autocraft(pos, meta, inventory, craft) for i = 1, 9 do inventory:add_item("dst", craft.decremented_input.items[i]) end - + State:keep_running(pos, meta, COUNTDOWN_TICKS, output_item:get_count()) end @@ -292,10 +292,10 @@ minetest.register_node("tubelib_addons1:autocrafter", { description = S("Tubelib Autocrafter"), drawtype = "normal", tiles = { - 'tubelib_front.png', - 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png', 'tubelib_addons1_autocrafter.png'}, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") State:node_init(pos, number) @@ -305,7 +305,7 @@ minetest.register_node("tubelib_addons1:autocrafter", { inv:set_size("dst", 3*3) inv:set_size("output", 1) end, - + can_dig = function(pos, player) if minetest.is_protected(pos, player:get_player_name()) then return false @@ -319,11 +319,11 @@ minetest.register_node("tubelib_addons1:autocrafter", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_rotate = screwdriver.disallow, on_timer = keep_running, on_receive_fields = on_receive_fields, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -334,14 +334,15 @@ minetest.register_node("tubelib_addons1:autocrafter", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:autocrafter_active", { description = S("Tubelib Autocrafter"), drawtype = "normal", tiles = { - 'tubelib_front.png', - 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png', { image = 'tubelib_addons1_autocrafter_active.png', backface_culling = false, @@ -356,7 +357,7 @@ minetest.register_node("tubelib_addons1:autocrafter_active", { diggable = false, can_dig = function() return false end, - + on_rotate = screwdriver.disallow, on_timer = keep_running, on_receive_fields = on_receive_fields, @@ -370,17 +371,18 @@ minetest.register_node("tubelib_addons1:autocrafter_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:autocrafter_defect", { description = S("Tubelib Autocrafter"), drawtype = "normal", tiles = { - 'tubelib_front.png', + 'tubelib_front.png', 'tubelib_front.png', 'tubelib_addons1_autocrafter.png^tubelib_defect.png' }, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") State:node_init(pos, number) @@ -392,7 +394,7 @@ minetest.register_node("tubelib_addons1:autocrafter_defect", { inv:set_size("output", 1) State:defect(pos, meta) end, - + can_dig = function(pos, player) if minetest.is_protected(pos, player:get_player_name()) then return false @@ -416,6 +418,7 @@ minetest.register_node("tubelib_addons1:autocrafter_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -428,7 +431,7 @@ minetest.register_craft({ }) -tubelib.register_node("tubelib_addons1:autocrafter", +tubelib.register_node("tubelib_addons1:autocrafter", {"tubelib_addons1:autocrafter_active", "tubelib_addons1:autocrafter_defect"}, { on_pull_stack = function(pos, side) return tubelib.get_stack(M(pos), "dst") @@ -456,4 +459,4 @@ tubelib.register_node("tubelib_addons1:autocrafter", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) diff --git a/mods/techpack/tubelib_addons1/chest.lua b/mods/techpack/tubelib_addons1/chest.lua index 363eae36..df990107 100644 --- a/mods/techpack/tubelib_addons1/chest.lua +++ b/mods/techpack/tubelib_addons1/chest.lua @@ -7,7 +7,7 @@ AGPL v3 See LICENSE.txt for more information - + chest.lua ]]-- @@ -25,7 +25,7 @@ local function store_action(pos, player, action, stack) local number = meta:get_string("number") local item = stack:get_name().." "..stack:get_count() PlayerActions[number] = {name, action, item} -end +end local function send_off_command(pos) local meta = minetest.get_meta(pos) @@ -93,7 +93,7 @@ minetest.register_node("tubelib_addons1:chest", { local inv = meta:get_inventory() inv:set_size('main', 32) end, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "tubelib_addons1:chest") @@ -114,7 +114,7 @@ minetest.register_node("tubelib_addons1:chest", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, @@ -124,6 +124,7 @@ minetest.register_node("tubelib_addons1:chest", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -146,7 +147,7 @@ tubelib.register_node("tubelib_addons1:chest", {}, { local meta = minetest.get_meta(pos) return tubelib.put_item(meta, "main", item) end, - + on_recv_message = function(pos, topic, payload) if topic == "state" then local meta = minetest.get_meta(pos) @@ -167,4 +168,4 @@ tubelib.register_node("tubelib_addons1:chest", {}, { return "unsupported" end end, -}) +}) diff --git a/mods/techpack/tubelib_addons1/depends.txt b/mods/techpack/tubelib_addons1/depends.txt deleted file mode 100644 index c1ea2c71..00000000 --- a/mods/techpack/tubelib_addons1/depends.txt +++ /dev/null @@ -1,10 +0,0 @@ -tubelib -default -bucket -ethereal? -farming? -moreores? -moretrees? -skytest? -stairs? -unified_inventory? diff --git a/mods/techpack/tubelib_addons1/description.txt b/mods/techpack/tubelib_addons1/description.txt deleted file mode 100644 index 8307dcb5..00000000 --- a/mods/techpack/tubelib_addons1/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Tubelib Extension with Mining, Farming, and Crafting nodes - diff --git a/mods/techpack/tubelib_addons1/detector.lua b/mods/techpack/tubelib_addons1/detector.lua index 2bcce35f..69752259 100644 --- a/mods/techpack/tubelib_addons1/detector.lua +++ b/mods/techpack/tubelib_addons1/detector.lua @@ -18,14 +18,16 @@ local S = tubelib_addons1.S local function switch_on(pos) if tubelib.data_not_corrupted(pos) then local node = minetest.get_node(pos) - node.name = "tubelib_addons1:detector_active" - minetest.swap_node(pos, node) - minetest.get_node_timer(pos):start(1) - local meta = minetest.get_meta(pos) - local own_num = meta:get_string("own_num") - local numbers = meta:get_string("numbers") - local placer_name = meta:get_string("placer_name") - tubelib.send_message(numbers, placer_name, nil, "on", own_num) + if node.name == "tubelib_addons1:detector" then + node.name = "tubelib_addons1:detector_active" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(1) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(numbers, placer_name, nil, "on", own_num) + end end end @@ -63,7 +65,7 @@ minetest.register_node("tubelib_addons1:detector", { "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";]" .. "button_exit[2,2;3,1;exit;"..S("Save").."]") meta:set_string("placer_name", placer:get_player_name()) - meta:set_string("infotext", S("Tubelib Detector, unconfigured")) + meta:set_string("infotext", S("Tubelib Detector @1", own_num)) end, on_receive_fields = function(pos, formname, fields, player) @@ -71,7 +73,7 @@ minetest.register_node("tubelib_addons1:detector", { if tubelib.check_numbers(fields.numbers) then meta:set_string("numbers", fields.numbers) local own_num = meta:get_string("own_num") - meta:set_string("infotext", S("Tubelib Detector, connected")) + meta:set_string("infotext", S("Tubelib Detector @1: connected", own_num)) meta:set_string("formspec", "size[7.5,3]".. "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..fields.numbers.."]" .. "button_exit[2,2;3,1;exit;"..S("Save").."]") @@ -89,6 +91,7 @@ minetest.register_node("tubelib_addons1:detector", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -119,6 +122,7 @@ minetest.register_node("tubelib_addons1:detector_active", { is_ground_content = false, sounds = default.node_sound_wood_defaults(), drop = "tubelib_addons1:detector", + on_blast = function() end, }) minetest.register_craft({ @@ -144,4 +148,3 @@ tubelib.register_node("tubelib_addons1:detector", {"tubelib_addons1:detector_act end, is_pusher = true, -- is a pulling/pushing node }) - diff --git a/mods/techpack/tubelib_addons1/fermenter.lua b/mods/techpack/tubelib_addons1/fermenter.lua index 27f849ba..88b1be66 100644 --- a/mods/techpack/tubelib_addons1/fermenter.lua +++ b/mods/techpack/tubelib_addons1/fermenter.lua @@ -230,6 +230,7 @@ minetest.register_node("tubelib_addons1:fermenter", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:fermenter_defect", { @@ -302,6 +303,7 @@ minetest.register_node("tubelib_addons1:fermenter_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:fermenter_top", { @@ -322,6 +324,7 @@ minetest.register_node("tubelib_addons1:fermenter_top", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, pointable = false, + on_blast = function() end, }) minetest.register_craftitem("tubelib_addons1:biogas", { diff --git a/mods/techpack/tubelib_addons1/funnel.lua b/mods/techpack/tubelib_addons1/funnel.lua index 4d17bab8..4684e671 100644 --- a/mods/techpack/tubelib_addons1/funnel.lua +++ b/mods/techpack/tubelib_addons1/funnel.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + funnel.lua - + ]]-- -- Load support for I18n @@ -56,7 +56,7 @@ local function scan_for_objects(pos, elapsed) object:remove() end end - + end end return true @@ -92,7 +92,7 @@ minetest.register_node("tubelib_addons1:funnel", { local inv = meta:get_inventory() inv:set_size('main', 16) end, - + after_place_node = function(pos, placer) tubelib.add_node(pos, "tubelib_addons1:funnel") local meta = minetest.get_meta(pos) @@ -102,7 +102,7 @@ minetest.register_node("tubelib_addons1:funnel", { on_timer = scan_for_objects, on_rotate = screwdriver.disallow, - + can_dig = function(pos, player) if minetest.is_protected(pos, player:get_player_name()) then return false @@ -115,7 +115,7 @@ minetest.register_node("tubelib_addons1:funnel", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, @@ -125,6 +125,7 @@ minetest.register_node("tubelib_addons1:funnel", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -148,7 +149,7 @@ tubelib.register_node("tubelib_addons1:funnel", {}, { local meta = minetest.get_meta(pos) return tubelib.put_item(meta, "main", item) end, - + on_recv_message = function(pos, topic, payload) if topic == "state" then local meta = minetest.get_meta(pos) @@ -161,6 +162,4 @@ tubelib.register_node("tubelib_addons1:funnel", {}, { minetest.get_node_timer(pos):start(1) end, -}) - - +}) diff --git a/mods/techpack/tubelib_addons1/grinder.lua b/mods/techpack/tubelib_addons1/grinder.lua index e3bc265e..bf1b2af5 100644 --- a/mods/techpack/tubelib_addons1/grinder.lua +++ b/mods/techpack/tubelib_addons1/grinder.lua @@ -9,9 +9,9 @@ See LICENSE.txt for more information grinder.lua - + Grinding Cobble to Gravel - + ]]-- -- Load support for I18n @@ -153,8 +153,8 @@ minetest.register_node("tubelib_addons1:grinder", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - - + + on_rotate = screwdriver.disallow, on_timer = keep_running, on_receive_fields = on_receive_fields, @@ -168,6 +168,7 @@ minetest.register_node("tubelib_addons1:grinder", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -185,7 +186,7 @@ minetest.register_node("tubelib_addons1:grinder_active", { length = 1.0, }, }, - + 'tubelib_front.png', "tubelib_front.png", "tubelib_front.png", @@ -209,6 +210,7 @@ minetest.register_node("tubelib_addons1:grinder_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:grinder_defect", { @@ -244,7 +246,7 @@ minetest.register_node("tubelib_addons1:grinder_defect", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) end, - + on_rotate = screwdriver.disallow, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -256,6 +258,7 @@ minetest.register_node("tubelib_addons1:grinder_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -268,7 +271,7 @@ minetest.register_craft({ }) -tubelib.register_node("tubelib_addons1:grinder", +tubelib.register_node("tubelib_addons1:grinder", {"tubelib_addons1:grinder_active", "tubelib_addons1:grinder_defect"}, { on_pull_stack = function(pos, side) return tubelib.get_stack(M(pos), "dst") @@ -296,7 +299,7 @@ tubelib.register_node("tubelib_addons1:grinder", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) if minetest.global_exists("unified_inventory") then @@ -472,5 +475,3 @@ for _,v in pairs({ end if minetest.get_modpath("jacaranda") then tubelib.add_grinder_recipe({input="jacaranda:trunk", output = "jacaranda:blossom_leaves 8"}) end - - diff --git a/mods/techpack/tubelib_addons1/harvester.lua b/mods/techpack/tubelib_addons1/harvester.lua index 9e0dffc8..0d660918 100644 --- a/mods/techpack/tubelib_addons1/harvester.lua +++ b/mods/techpack/tubelib_addons1/harvester.lua @@ -7,11 +7,11 @@ AGPL v3 See LICENSE.txt for more information - + harvester.lua - + Harvester machine to chop wood, leaves and harvest farming crops and flowers. - + The machine is able to harvest an square area of up to 33x33 blocks (radius = 16). The base node has to be placed in the middle of the harvesting area. The Harvester processes one node every 6 seconds. @@ -54,14 +54,14 @@ local function formspec(self, pos, meta) end local radius = Radius2Idx[this.radius] or 2 local altitude = Altitude2Idx[this.altitude or START_HEIGHT] or 11 - + return "size[9,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "dropdown[0,0;1.5;radius;4,6,8,10,12,14,16;"..radius.."]".. + "dropdown[0,0;1.5;radius;4,6,8,10,12,14,16;"..radius.."]".. "label[1.6,0.2;"..S("Area radius").."]".. - "dropdown[0,1;1.5;altitude;-2,-1,0,1,2,4,6,8,10,14,18;"..altitude.."]".. + "dropdown[0,1;1.5;altitude;-2,-1,0,1,2,4,6,8,10,14,18;"..altitude.."]".. "label[1.6,1.2;"..S("Altitude ").."]".. "checkbox[0,2;endless;"..S("Run endless")..";"..endless.."]".. "list[context;main;5,0;4,4;]".. @@ -111,7 +111,7 @@ local function gen_working_steps() end end return t -end +end local WorkingSteps = gen_working_steps() @@ -167,7 +167,7 @@ end local function remove_or_replace_node(this, pos, inv, node, order) local next_pos = table.copy(pos) next_pos.y = next_pos.y - 1 - + -- Not enough space in the inventory if not inv:room_for_item("main", ItemStack(node.name)) then return false @@ -179,7 +179,7 @@ local function remove_or_replace_node(this, pos, inv, node, order) this.num_items = this.num_items + 1 if is_plantable_ground(next_node) and order.plant then -- hit the ground? minetest.set_node(pos, {name=order.plant, paramtype2 = "wallmounted", param2=1}) - if order.t1 ~= nil then + if order.t1 ~= nil then -- We have to simulate "on_place" and start the timer by hand -- because the after_place_node function checks player rights and can't therefore -- be used. @@ -189,7 +189,7 @@ local function remove_or_replace_node(this, pos, inv, node, order) end end return true -end +end -- check the fuel level and return false if empty local function check_fuel(pos, this, meta) @@ -244,7 +244,7 @@ local function harvest_field(this, meta) if not minetest.is_protected(pos, this.owner) and not remove_or_replace_node(this, pos, inv, node, order) then return false end - else + else return true -- hit the ground end end @@ -261,20 +261,20 @@ local function not_blocked(pos, this, meta) end return true end - + -- move the "harvesting copter" to the next pos and harvest the field below local function keep_running(pos, elapsed) if tubelib.data_not_corrupted(pos) then local meta = M(pos) local this = minetest.deserialize(meta:get_string("this")) this.num_items = 0 - + if not_blocked(pos, this, meta) then if check_fuel(pos, this, meta) then if calc_new_pos(pos, this, meta) then if harvest_field(this, meta) then meta:set_string("this", minetest.serialize(this)) - meta:set_string("infotext", + meta:set_string("infotext", S("Tubelib Harvester").." "..this.number.. S(": running (")..this.idx.."/"..this.max..")") State:keep_running(pos, meta, COUNTDOWN_TICKS, this.num_items) @@ -291,8 +291,8 @@ local function keep_running(pos, elapsed) return State:is_active(meta) end return false -end - +end + local function on_receive_fields(pos, formname, fields, player) if minetest.is_protected(pos, player:get_player_name()) then @@ -302,7 +302,7 @@ local function on_receive_fields(pos, formname, fields, player) local this = minetest.deserialize(meta:get_string("this")) local radius = this.radius local altitude = this.altitude or START_HEIGHT - + if fields.radius ~= nil then radius = tonumber(fields.radius) end @@ -321,12 +321,12 @@ local function on_receive_fields(pos, formname, fields, player) meta:set_string("this", minetest.serialize(this)) State:stop(pos, meta) end - + if fields.endless ~= nil then this.endless = fields.endless == "true" and 1 or 0 end meta:set_string("this", minetest.serialize(this)) - + State:state_button_event(pos, fields) end @@ -371,7 +371,7 @@ minetest.register_node("tubelib_addons1:harvester_base", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_rotate = screwdriver.disallow, on_receive_fields = on_receive_fields, on_timer = keep_running, @@ -384,6 +384,7 @@ minetest.register_node("tubelib_addons1:harvester_base", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:harvester_defect", { @@ -400,7 +401,7 @@ minetest.register_node("tubelib_addons1:harvester_defect", { inv:set_size('main', 16) inv:set_size('fuel', 1) end, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons1:harvester_base") local this = { @@ -441,6 +442,7 @@ minetest.register_node("tubelib_addons1:harvester_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -474,7 +476,7 @@ tubelib.register_node("tubelib_addons1:harvester_base", {"tubelib_addons1:harves if topic == "fuel" then return tubelib.fuelstate(M(pos), "fuel") end - + local resp = State:on_receive_message(pos, topic, payload) if resp then return resp @@ -488,7 +490,7 @@ tubelib.register_node("tubelib_addons1:harvester_base", {"tubelib_addons1:harves on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) -- update to v0.08 @@ -506,4 +508,3 @@ minetest.register_lbm({ end end }) - diff --git a/mods/techpack/tubelib_addons1/liquidsampler.lua b/mods/techpack/tubelib_addons1/liquidsampler.lua index 133d33f5..a4b10a37 100644 --- a/mods/techpack/tubelib_addons1/liquidsampler.lua +++ b/mods/techpack/tubelib_addons1/liquidsampler.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + liquidsampler.lua - + ]]-- -- Load support for I18n @@ -59,12 +59,12 @@ local function get_pos(pos, facedir, side) facedir = (facedir + offs[side]) % 4 local dir = minetest.facedir_to_dir(facedir) return vector.add(dst_pos, dir) -end +end local function test_liquid(node) local liquiddef = bucket.liquids[node.name] - if liquiddef ~= nil and liquiddef.itemname ~= nil and + if liquiddef ~= nil and liquiddef.itemname ~= nil and node.name == liquiddef.source then return liquiddef.itemname end @@ -165,7 +165,7 @@ minetest.register_node("tubelib_addons1:liquidsampler", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_rotate = screwdriver.disallow, on_timer = keep_running, on_receive_fields = on_receive_fields, @@ -179,6 +179,7 @@ minetest.register_node("tubelib_addons1:liquidsampler", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:liquidsampler_active", { @@ -218,6 +219,7 @@ minetest.register_node("tubelib_addons1:liquidsampler_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:liquidsampler_defect", { @@ -268,6 +270,7 @@ minetest.register_node("tubelib_addons1:liquidsampler_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -279,7 +282,7 @@ minetest.register_craft({ }, }) -tubelib.register_node("tubelib_addons1:liquidsampler", +tubelib.register_node("tubelib_addons1:liquidsampler", {"tubelib_addons1:liquidsampler_active", "tubelib_addons1:liquidsampler_defect"}, { invalid_sides = {"L"}, on_pull_item = function(pos, side) @@ -305,4 +308,4 @@ tubelib.register_node("tubelib_addons1:liquidsampler", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) diff --git a/mods/techpack/tubelib_addons1/locale/template.txt b/mods/techpack/tubelib_addons1/locale/template.txt index 92a216de..6d698da4 100644 --- a/mods/techpack/tubelib_addons1/locale/template.txt +++ b/mods/techpack/tubelib_addons1/locale/template.txt @@ -1,76 +1,37 @@ # textdomain: tubelib_addons1 - - - -### autocrafter.lua ### - Tubelib Autocrafter= - -### chest.lua ### - Tubelib Protected Chest= connected with= - -### detector.lua ### - +Tubelib Detector= Insert destination node number(s)= Save= -Tubelib Detector= -Tubelib Detector, connected= -Tubelib Detector, unconfigured= - -### fermenter.lua ### - +Tubelib Detector @1= +Tubelib Detector @1: connected= +Tubelib Fermenter= +Fermenter will not fit there= +Tubelib Fermenter defect= +Tubelib Fermenter Top= Bio Gas= Fermenter= -Fermenter will not fit there= Reformer= -Tubelib Fermenter= -Tubelib Fermenter Top= -Tubelib Fermenter defect= - -### funnel.lua ### - Tubelib Funnel= - -### grinder.lua ### - -Grinding= Tubelib Grinder= - -### harvester.lua ### - -: running (= -Altitude = +Grinding= Area radius= +Altitude = Tubelib Harvester= +: running (= Tubelib Harvester Base= - -### harvester.lua ### -### quarry.lua ### - -Run endless= - -### liquidsampler.lua ### - Liquid Sampler= - -### pusher_fast.lua ### - Fast Pusher= - -### quarry.lua ### - -Digging depth= Start level= +Digging depth= Tubelib Quarry= [Tubelib Quarry] Area is protected!= running= - -### reformer.lua ### - -Bio Fuel= -Reformer will not fit there= +Run endless= Tubelib Reformer= -Tubelib Reformer Top= +Reformer will not fit there= Tubelib Reformer defect= +Tubelib Reformer Top= +Bio Fuel= diff --git a/mods/techpack/tubelib_addons1/locale/tubelib_addons1.de.tr b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.de.tr index 69f795e6..3ed85e76 100644 --- a/mods/techpack/tubelib_addons1/locale/tubelib_addons1.de.tr +++ b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.de.tr @@ -1,76 +1,37 @@ # textdomain: tubelib_addons1 - - - -### autocrafter.lua ### - Tubelib Autocrafter=Tubelib Autocrafter - -### chest.lua ### - Tubelib Protected Chest=Tubelib geschützte Kiste connected with=verbunden mit - -### detector.lua ### - +Tubelib Detector=Tubelib Detektor Insert destination node number(s)=Geben Sie die Zielknotennummer(n) ein. Save=Speichern -Tubelib Detector=Tubelib Detektor -Tubelib Detector, connected=Tubelib Detektor, verbunden -Tubelib Detector, unconfigured=Tubelib Detektor, nicht konfiguriert - -### fermenter.lua ### - +Tubelib Detector @1=Tubelib Detektor @1 +Tubelib Detector @1: connected=Tubelib Detektor @1: verbunden +Tubelib Fermenter=Tubelib Fermenter +Fermenter will not fit there=Fermenter wird dort nicht passen +Tubelib Fermenter defect=Tubelib Fermenter defekt +Tubelib Fermenter Top=Tubelib Fermenter Oberteil Bio Gas=Biogas Fermenter=Fermenter -Fermenter will not fit there=Fermenter wird dort nicht passen Reformer=Reformer -Tubelib Fermenter=Tubelib Fermenter -Tubelib Fermenter Top=Tubelib Fermenter Oberteil -Tubelib Fermenter defect=Tubelib Fermenter defekt - -### funnel.lua ### - Tubelib Funnel=Tubelib Trichter - -### grinder.lua ### - -Grinding=Mahlen Tubelib Grinder=Tubelib Mühle - -### harvester.lua ### - -: running (=: läuft ( -Altitude = Flughöhe +Grinding=Mahlen Area radius=Flächenradius +Altitude = Flughöhe Tubelib Harvester=Tubelib Ernter +: running (=: läuft ( Tubelib Harvester Base=Tubelib Ernter Basis - -### harvester.lua ### -### quarry.lua ### - -Run endless=endlos laufen - -### liquidsampler.lua ### - Liquid Sampler=Flüssigkeitsaufnehmer - -### pusher_fast.lua ### - Fast Pusher=Schneller Schieber - -### quarry.lua ### - -Digging depth=Grabetiefe Start level=Startebene +Digging depth=Grabetiefe Tubelib Quarry=Tubelib Steinbrecher [Tubelib Quarry] Area is protected!=[Tubelib Steinbrecher] Gebiet ist geschützt! running=läuft - -### reformer.lua ### - -Bio Fuel=Biotreibstoff -Reformer will not fit there=Reformer wird dort nicht passen +Run endless=endlos laufen Tubelib Reformer=Tubelib Reformer -Tubelib Reformer Top=Tubelib Reformer Oberteil +Reformer will not fit there=Reformer wird dort nicht passen Tubelib Reformer defect=Tubelib Reformer defekt +Tubelib Reformer Top=Tubelib Reformer Oberteil +Bio Fuel=Biotreibstoff diff --git a/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_CN.tr b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_CN.tr new file mode 100644 index 00000000..403f9c40 --- /dev/null +++ b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_CN.tr @@ -0,0 +1,37 @@ +# textdomain: tubelib_addons1 +Tubelib Autocrafter=Tubelib 自动合成器 +Tubelib Protected Chest=Tubelib 保护箱 +connected with=已连接到 +Tubelib Detector=Tubelib 探测器 +Insert destination node number(s)=插入目标节点号 +Save=保存 +Tubelib Detector @1=Tubelib 探测器 @1 +Tubelib Detector @1: connected=Tubelib 探测器 @1:已连接 +Tubelib Fermenter=Tubelib 发酵罐 +Fermenter will not fit there=发酵罐不适合那里 +Tubelib Fermenter defect=Tubelib 发酵罐缺陷 +Tubelib Fermenter Top=Tubelib 发酵罐顶部 +Bio Gas=沼气 +Fermenter=发酵罐 +Reformer=重整器 +Tubelib Funnel=Tubelib 漏斗 +Tubelib Grinder=Tubelib 研磨机 +Grinding=研磨 +Area radius=面积半径 +Altitude =海拔高度 +Tubelib Harvester=Tubelib 收割机 +: running (=:运行中( +Tubelib Harvester Base=Tubelib 收割机底座 +Liquid Sampler=液体采样仪 +Fast Pusher=快速推进器 +Start level=启动级别 +Digging depth=挖掘深度 +Tubelib Quarry=Tubelib 采石场 +[Tubelib Quarry] Area is protected!=[Tubelib 采石场] 区域已被保护! +running=正在运行 +Run endless=无休止运行 +Tubelib Reformer=Tubelib 重整器 +Reformer will not fit there=转化炉不适合那里 +Tubelib Reformer defect=Tubelib 重整器缺陷 +Tubelib Reformer Top=Tubelib 顶部 +Bio Fuel=生物燃料 diff --git a/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_TW.tr b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_TW.tr new file mode 100644 index 00000000..42662ace --- /dev/null +++ b/mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_TW.tr @@ -0,0 +1,37 @@ +# textdomain: tubelib_addons1 +Tubelib Autocrafter=Tubelib 自動合成器 +Tubelib Protected Chest=Tubelib 保護箱 +connected with=已連接到 +Tubelib Detector=Tubelib 探測器 +Insert destination node number(s)=插入目標節點號 +Save=保存 +Tubelib Detector @1=Tubelib 探測器 @1 +Tubelib Detector @1: connected=Tubelib 探測器 @1:已連接 +Tubelib Fermenter=Tubelib 發酵罐 +Fermenter will not fit there=發酵罐不適合那裡 +Tubelib Fermenter defect=Tubelib 發酵罐缺陷 +Tubelib Fermenter Top=Tubelib 發酵罐頂部 +Bio Gas=沼氣 +Fermenter=發酵罐 +Reformer=重整器 +Tubelib Funnel=Tubelib 漏斗 +Tubelib Grinder=Tubelib 研磨機 +Grinding=研磨 +Area radius=面積半徑 +Altitude =海拔高度 +Tubelib Harvester=Tubelib 收割機 +: running (=:運行中( +Tubelib Harvester Base=Tubelib 收割機底座 +Liquid Sampler=液體採樣儀 +Fast Pusher=快速推進器 +Start level=啟動級別 +Digging depth=挖掘深度 +Tubelib Quarry=Tubelib 採石場 +[Tubelib Quarry] Area is protected!=[Tubelib 採石場] 區域已被保護! +running=正在運行 +Run endless=無休止運行 +Tubelib Reformer=Tubelib 重整器 +Reformer will not fit there=轉化爐不適合那裡 +Tubelib Reformer defect=Tubelib 重整器缺陷 +Tubelib Reformer Top=Tubelib 頂部 +Bio Fuel=生物燃料 diff --git a/mods/techpack/tubelib_addons1/mod.conf b/mods/techpack/tubelib_addons1/mod.conf index cdcb991e..db75ed0f 100644 --- a/mods/techpack/tubelib_addons1/mod.conf +++ b/mods/techpack/tubelib_addons1/mod.conf @@ -1,4 +1,4 @@ -name=tubelib_addons1 -description=Tubelib Extension with Mining, Farming, and Crafting nodes -depends=tubelib,default,bucket -optional_depends=ethereal,farming,moreores,moretrees,skytest,stairs,unified_inventory +name = tubelib_addons1 +description = Tubelib Extension with Mining, Farming, and Crafting nodes +depends = tubelib, default,bucket +optional_depends = ethereal, farming, moreores, moretrees, skytest, stairs, unified_inventory diff --git a/mods/techpack/tubelib_addons1/nodes.lua b/mods/techpack/tubelib_addons1/nodes.lua index 4eadfc07..77c8ccf3 100644 --- a/mods/techpack/tubelib_addons1/nodes.lua +++ b/mods/techpack/tubelib_addons1/nodes.lua @@ -189,6 +189,10 @@ gn("default:permafrost") gn("default:permafrost_with_moss") gn("default:permafrost_with_stones") +if minetest.get_modpath("lava_n_water") then + gn("lava_n_water:lava_water_aftermath_stone", "default:cobble") +end + gn("default:stone", "default:cobble") gn("default:desert_stone", "default:desert_cobble") gn("default:sandstone", "default:sandstone") diff --git a/mods/techpack/tubelib_addons1/pusher_fast.lua b/mods/techpack/tubelib_addons1/pusher_fast.lua index c3794440..dd36da2c 100644 --- a/mods/techpack/tubelib_addons1/pusher_fast.lua +++ b/mods/techpack/tubelib_addons1/pusher_fast.lua @@ -9,14 +9,14 @@ See LICENSE.txt for more information pusher_fast.lua: - + Fast pusher for push/pull operation of StackItems from chests or other inventory/server nodes to tubes or other inventory/server nodes. - + The Pusher is based on the class NodeStates and supports the following messages: - topic = "on", payload = nil - topic = "off", payload = nil - - topic = "state", payload = nil, + - topic = "state", payload = nil, response is "running", "stopped", "standby", "blocked", or "not supported" ]]-- @@ -78,7 +78,7 @@ local function keep_running(pos, elapsed) return State:is_active(meta) end return false -end +end minetest.register_node("tubelib_addons1:pusher_fast", { description = S("Fast Pusher"), @@ -109,7 +109,7 @@ minetest.register_node("tubelib_addons1:pusher_fast", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -119,6 +119,7 @@ minetest.register_node("tubelib_addons1:pusher_fast", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -175,19 +176,20 @@ minetest.register_node("tubelib_addons1:pusher_fast_active", { State:stop(pos, M(pos)) end end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, diggable = false, can_dig = function() return false end, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:pusher_fast_defect", { @@ -213,7 +215,7 @@ minetest.register_node("tubelib_addons1:pusher_fast_defect", { after_dig_node = function(pos) tubelib.remove_node(pos) end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -223,6 +225,7 @@ minetest.register_node("tubelib_addons1:pusher_fast_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -235,14 +238,14 @@ minetest.register_craft({ }, }) -tubelib.register_node("tubelib_addons1:pusher_fast", +tubelib.register_node("tubelib_addons1:pusher_fast", {"tubelib_addons1:pusher_fast_active", "tubelib_addons1:pusher_fast_defect"}, { on_pull_item = nil, -- pusher has no inventory on_push_item = nil, -- pusher has no inventory on_unpull_item = nil, -- pusher has no inventory is_pusher = true, -- is a pulling/pushing node valid_sides = {"R","L"}, - + on_recv_message = function(pos, topic, payload) local resp = State:on_receive_message(pos, topic, payload) if resp then @@ -257,4 +260,4 @@ tubelib.register_node("tubelib_addons1:pusher_fast", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) diff --git a/mods/techpack/tubelib_addons1/quarry.lua b/mods/techpack/tubelib_addons1/quarry.lua index e2585406..e336fd2e 100644 --- a/mods/techpack/tubelib_addons1/quarry.lua +++ b/mods/techpack/tubelib_addons1/quarry.lua @@ -7,11 +7,11 @@ AGPL v3 See LICENSE.txt for more information - + quarry.lua - + Quarry machine to dig stones and other ground blocks. - + The Quarry digs a hole 5x5 blocks large and up to 100 blocks deep. It starts at the given level (0 is same level as the quarry block, 1 is one level higher and so on)) and goes down to the given depth number. @@ -35,7 +35,7 @@ local COUNTDOWN_TICKS = 5 local Side2Facedir = {F=0, R=1, B=2, L=3, D=4, U=5} local Depth2Idx = {[1]=1 ,[2]=2, [3]=3, [5]=4, [10]=5, [15]=6, [20]=7, [25]=8, [50]=9, [100]=10} -local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6, +local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6, [-5]=7, [-10]=8, [-15]=9, [-20]=10} local function formspec(self, pos, meta) @@ -52,14 +52,14 @@ local function formspec(self, pos, meta) else fuel = 0 end - + return "size[9,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "dropdown[0,0;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..Level2Idx[start_level].."]".. + "dropdown[0,0;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..Level2Idx[start_level].."]".. "label[1.6,0.2;"..S("Start level").."]".. - "dropdown[0,1;1.5;depth;1,2,3,5,10,15,20,25,50,100;"..Depth2Idx[depth].."]".. + "dropdown[0,1;1.5;depth;1,2,3,5,10,15,20,25,50,100;"..Depth2Idx[depth].."]".. "label[1.6,1.2;"..S("Digging depth").."]".. "checkbox[0,2;endless;"..S("Run endless")..";"..endless.."]".. "list[context;main;5,0;4,4;]".. @@ -95,7 +95,7 @@ local function get_pos(pos, facedir, side, steps) facedir = (facedir + Side2Facedir[side]) % 4 local dir = vector.multiply(minetest.facedir_to_dir(facedir), steps or 1) return vector.add(pos, dir) -end +end local function get_node_lvm(pos) local node = minetest.get_node_or_nil(pos) @@ -144,7 +144,7 @@ local function get_next_pos(pos, facedir, dir) return vector.add(pos, core.facedir_to_dir(facedir)) end -local function skip_the_air(pos, curr_level, facedir) +local function skip_the_air(pos, curr_level, facedir) local pos1, pos2, lPos pos1 = get_pos(pos, facedir, "F", 2) pos2 = get_pos(pos, facedir, "B", 2) @@ -157,9 +157,9 @@ local function skip_the_air(pos, curr_level, facedir) pos1.y = pos1.y - 1 pos2.y = pos2.y - 1 end - return pos2.y + return pos2.y end - + local function quarry_next_node(pos, meta) -- check fuel local fuel = meta:get_int("fuel") or 0 @@ -178,8 +178,8 @@ local function quarry_next_node(pos, meta) else fuel = fuel - 1 end - meta:set_int("fuel", fuel) - + meta:set_int("fuel", fuel) + local idx = meta:get_int("idx") if idx == 0 then idx = 1 end local facedir = minetest.get_node(pos).param2 @@ -188,10 +188,10 @@ local function quarry_next_node(pos, meta) local start_y = pos.y + meta:get_int("start_level") local stop_y = pos.y + meta:get_int("start_level") - meta:get_int("max_levels") + 1 local quarry_pos = P(meta:get_string("quarry_pos")) - + if quarry_pos == nil then -- start at the beginning? quarry_pos = get_pos(pos, facedir, "L") - local y = skip_the_air(quarry_pos, start_y, facedir) + local y = skip_the_air(quarry_pos, start_y, facedir) if y < stop_y then -- below the base line? meta:set_int("idx", 1) meta:set_string("quarry_pos", nil) @@ -263,7 +263,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local meta = M(pos) - + local max_levels = meta:get_int("max_levels") if fields.depth then max_levels = tonumber(fields.depth) @@ -273,7 +273,7 @@ local function on_receive_fields(pos, formname, fields, player) meta:set_int("max_levels", max_levels) State:stop(pos, meta) end - + local start_level = meta:get_int("start_level") or 0 if fields.level ~= nil then start_level = tonumber(fields.level) @@ -283,13 +283,13 @@ local function on_receive_fields(pos, formname, fields, player) meta:set_int("start_level", start_level) State:stop(pos, meta) end - + local endless = meta:get_int("endless") or 0 if fields.endless ~= nil then endless = fields.endless == "true" and 1 or 0 end meta:set_int("endless", endless) - + State:state_button_event(pos, fields) end @@ -330,7 +330,7 @@ minetest.register_node("tubelib_addons1:quarry", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_rotate = screwdriver.disallow, on_receive_fields = on_receive_fields, on_timer = keep_running, @@ -343,6 +343,7 @@ minetest.register_node("tubelib_addons1:quarry", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:quarry_active", { @@ -377,13 +378,14 @@ minetest.register_node("tubelib_addons1:quarry_active", { allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:quarry_defect", { @@ -434,6 +436,7 @@ minetest.register_node("tubelib_addons1:quarry_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -446,7 +449,7 @@ minetest.register_craft({ }) -tubelib.register_node("tubelib_addons1:quarry", +tubelib.register_node("tubelib_addons1:quarry", {"tubelib_addons1:quarry_active", "tubelib_addons1:quarry_defect"}, { invalid_sides = {"L"}, on_pull_item = function(pos, side) @@ -465,7 +468,7 @@ tubelib.register_node("tubelib_addons1:quarry", if topic == "fuel" then return tubelib.fuelstate(M(pos), "fuel") end - + local resp = State:on_receive_message(pos, topic, payload) if resp then return resp @@ -482,5 +485,4 @@ tubelib.register_node("tubelib_addons1:quarry", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) - +}) diff --git a/mods/techpack/tubelib_addons1/reformer.lua b/mods/techpack/tubelib_addons1/reformer.lua index 90e37711..88541024 100644 --- a/mods/techpack/tubelib_addons1/reformer.lua +++ b/mods/techpack/tubelib_addons1/reformer.lua @@ -226,6 +226,7 @@ minetest.register_node("tubelib_addons1:reformer", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons1:reformer_defect", { @@ -298,6 +299,7 @@ minetest.register_node("tubelib_addons1:reformer_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) @@ -319,6 +321,7 @@ minetest.register_node("tubelib_addons1:reformer_top", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, pointable = false, + on_blast = function() end, }) minetest.register_craftitem("tubelib_addons1:biofuel", { diff --git a/mods/techpack/tubelib_addons2/accesscontrol.lua b/mods/techpack/tubelib_addons2/accesscontrol.lua index b7d206dc..ea85bd95 100644 --- a/mods/techpack/tubelib_addons2/accesscontrol.lua +++ b/mods/techpack/tubelib_addons2/accesscontrol.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information accesscontrol.lua: - + ]]-- -- Load support for I18n @@ -129,19 +129,20 @@ minetest.register_node("tubelib_addons2:accesscontrol", { end end end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, - + on_timer = switch_off, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + on_blast = function() end, }) @@ -161,4 +162,4 @@ tubelib.register_node("tubelib_addons2:accesscontrol", {}, { return true end end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/ceilinglamp.lua b/mods/techpack/tubelib_addons2/ceilinglamp.lua index 2e3bd296..64776cf7 100644 --- a/mods/techpack/tubelib_addons2/ceilinglamp.lua +++ b/mods/techpack/tubelib_addons2/ceilinglamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information ceilinglamp.lua: - + ]]-- -- Load support for I18n @@ -18,7 +18,7 @@ local S = tubelib_addons2.S local function switch_on(pos, node) node.name = "tubelib_addons2:ceilinglamp_on" minetest.swap_node(pos, node) -end +end local function switch_off(pos, node) node.name = "tubelib_addons2:ceilinglamp" @@ -26,7 +26,7 @@ local function switch_off(pos, node) local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} minetest.fix_light(pos1, pos2) -end +end minetest.register_node("tubelib_addons2:ceilinglamp", { description = S("Tubelib Ceiling Lamp"), @@ -69,12 +69,13 @@ minetest.register_node("tubelib_addons2:ceilinglamp", { end, paramtype = "light", - light_source = 0, + light_source = 0, sunlight_propagates = true, paramtype2 = "wallmounted", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons2:ceilinglamp_on", { @@ -100,7 +101,7 @@ minetest.register_node("tubelib_addons2:ceilinglamp_on", { wall_bottom = {-5/16, -8/16, -5/16, 5/16, -5/16, 5/16}, wall_side = {-8/16, -5/16, -5/16, -5/16, 5/16, 5/16} }, - + on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then switch_off(pos, node) @@ -108,12 +109,13 @@ minetest.register_node("tubelib_addons2:ceilinglamp_on", { end, paramtype = "light", - light_source = 12, + light_source = 12, sunlight_propagates = true, paramtype2 = "wallmounted", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -131,4 +133,4 @@ tubelib.register_node("tubelib_addons2:ceilinglamp", {"tubelib_addons2:ceilingla switch_off(pos, node) end end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/colorlamp.lua b/mods/techpack/tubelib_addons2/colorlamp.lua index 8d594f16..268ba106 100644 --- a/mods/techpack/tubelib_addons2/colorlamp.lua +++ b/mods/techpack/tubelib_addons2/colorlamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information colorlamp.lua: - + ]]-- -- Load support for I18n @@ -32,7 +32,7 @@ local function switch_node(pos, num, player) meta:set_int("color", num) end end -end +end minetest.register_node("tubelib_addons2:lamp", { description = S("Tubelib Color Lamp"), @@ -41,11 +41,11 @@ minetest.register_node("tubelib_addons2:lamp", { after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons2:lamp") local meta = minetest.get_meta(pos) - meta:set_int("number", number) + meta:set_string("number", number) switch_node(pos, "", placer) meta:set_string("formspec", "size[3,2]".. "label[0,0;Select color]".. - "dropdown[0,0.5;3;type;"..sColor..";1]".. + "dropdown[0,0.5;3;type;"..sColor..";1]".. "button_exit[0.5,1.5;2,1;exit;"..S("Save").."]") meta:set_int("color", 1) end, @@ -59,7 +59,7 @@ minetest.register_node("tubelib_addons2:lamp", { meta:set_string("formspec", nil, player) end end, - + on_rightclick = function(pos, node, clicker) local meta = minetest.get_meta(pos) switch_node(pos, meta:get_int("color"), clicker) @@ -74,20 +74,9 @@ minetest.register_node("tubelib_addons2:lamp", { sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1}, is_ground_content = false, + on_blast = function() end, }) -tubelib.register_node("tubelib_addons2:lamp", {}, { - on_recv_message = function(pos, topic, payload) - if topic == "on" then - local meta = minetest.get_meta(pos) - switch_node(pos, meta:get_int("color") or "", nil) - elseif topic == "off" then - switch_node(pos, "", nil) - end - end, -}) - - minetest.register_craft({ output = "tubelib_addons2:lamp 2", recipe = { @@ -97,7 +86,9 @@ minetest.register_craft({ }, }) +local NodeNames = {} for idx,color in ipairs(tColors) do + NodeNames[idx] = "tubelib_addons2:lamp"..idx minetest.register_node("tubelib_addons2:lamp"..idx, { description = S("Tubelib Color Lamp"), tiles = { @@ -113,7 +104,7 @@ for idx,color in ipairs(tColors) do meta:set_string("formspec", nil) end end, - + on_rightclick = function(pos, node, clicker) switch_node(pos, "", clicker) end, @@ -123,10 +114,22 @@ for idx,color in ipairs(tColors) do end, paramtype = 'light', - light_source = minetest.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, is_ground_content = false, - drop = "tubelib_addons2:lamp" + drop = "tubelib_addons2:lamp", + on_blast = function() end, }) end + +tubelib.register_node("tubelib_addons2:lamp", NodeNames, { + on_recv_message = function(pos, topic, payload) + if topic == "on" then + local meta = minetest.get_meta(pos) + switch_node(pos, meta:get_int("color") or "", nil) + elseif topic == "off" then + switch_node(pos, "", nil) + end + end, +}) diff --git a/mods/techpack/tubelib_addons2/colorlamp_ud.lua b/mods/techpack/tubelib_addons2/colorlamp_ud.lua index 0d2cc35a..fa12a3c5 100644 --- a/mods/techpack/tubelib_addons2/colorlamp_ud.lua +++ b/mods/techpack/tubelib_addons2/colorlamp_ud.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information colorlamp_ud.lua which requires the mod unifieddyes: - + ]]-- -- Load support for I18n @@ -20,14 +20,14 @@ local function switch_on(pos, node, player) node.name = "tubelib_addons2:lamp_on" minetest.swap_node(pos, node) end -end +end local function switch_off(pos, node, player) if player == nil or not minetest.is_protected(pos, player:get_player_name()) then node.name = "tubelib_addons2:lamp_off" minetest.swap_node(pos, node) end -end +end minetest.register_node("tubelib_addons2:lamp_off", { description = S("Tubelib Color Lamp"), @@ -49,7 +49,7 @@ minetest.register_node("tubelib_addons2:lamp_off", { on_construct = unifieddyes.on_construct, on_dig = unifieddyes.on_dig, - + paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", @@ -58,7 +58,8 @@ minetest.register_node("tubelib_addons2:lamp_off", { sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1, ud_param2_colorable = 1}, is_ground_content = false, - drop = "tubelib_addons2:lamp_off" + drop = "tubelib_addons2:lamp_off", + on_blast = function() end, }) @@ -73,19 +74,20 @@ minetest.register_node("tubelib_addons2:lamp_on", { palette = "unifieddyes_palette_extended.png", sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1, not_in_creative_inventory=1, ud_param2_colorable = 1}, - + on_construct = unifieddyes.on_construct, after_place_node = unifieddyes.recolor_on_place, - + after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) end, - + on_dig = unifieddyes.on_dig, - light_source = minetest.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, is_ground_content = false, - drop = "tubelib_addons2:lamp_off" + drop = "tubelib_addons2:lamp_off", + on_blast = function() end, }) tubelib.register_node("tubelib_addons2:lamp_off", {"tubelib_addons2:lamp_on"}, { @@ -98,7 +100,7 @@ tubelib.register_node("tubelib_addons2:lamp_off", {"tubelib_addons2:lamp_on"}, { switch_off(pos, node, nil) end end, -}) +}) minetest.register_craft({ type = "shapeless", @@ -117,7 +119,8 @@ for idx=1,12 do paramtype = 'light', groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, is_ground_content = false, - drop = "tubelib_addons2:lamp_off" + drop = "tubelib_addons2:lamp_off", + on_blast = function() end, }) end @@ -127,10 +130,10 @@ minetest.register_lbm({ name = "tubelib_addons2:update", nodenames = { "tubelib_addons2:lamp", - "tubelib_addons2:lamp1", "tubelib_addons2:lamp2", "tubelib_addons2:lamp3", - "tubelib_addons2:lamp4", "tubelib_addons2:lamp5", "tubelib_addons2:lamp6", - "tubelib_addons2:lamp7", "tubelib_addons2:lamp8", "tubelib_addons2:lamp9", - "tubelib_addons2:lamp10", "tubelib_addons2:lamp11", "tubelib_addons2:lamp12", + "tubelib_addons2:lamp1", "tubelib_addons2:lamp2", "tubelib_addons2:lamp3", + "tubelib_addons2:lamp4", "tubelib_addons2:lamp5", "tubelib_addons2:lamp6", + "tubelib_addons2:lamp7", "tubelib_addons2:lamp8", "tubelib_addons2:lamp9", + "tubelib_addons2:lamp10", "tubelib_addons2:lamp11", "tubelib_addons2:lamp12", }, run_at_every_load = true, action = function(pos, node) @@ -150,4 +153,3 @@ minetest.register_lbm({ meta:set_string("infotext", S("Tubelib Color Lamp").." "..number) end }) - diff --git a/mods/techpack/tubelib_addons2/depends.txt b/mods/techpack/tubelib_addons2/depends.txt deleted file mode 100644 index b9433b2a..00000000 --- a/mods/techpack/tubelib_addons2/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -tubelib -basic_materials -mesecons? -unifieddyes? \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/description.txt b/mods/techpack/tubelib_addons2/description.txt deleted file mode 100644 index bc6f9e1b..00000000 --- a/mods/techpack/tubelib_addons2/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Tubelib Extension for switching/controlling tasks - diff --git a/mods/techpack/tubelib_addons2/doorblock.lua b/mods/techpack/tubelib_addons2/doorblock.lua index ae66413a..78b7ae2d 100644 --- a/mods/techpack/tubelib_addons2/doorblock.lua +++ b/mods/techpack/tubelib_addons2/doorblock.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information doorblock.lua: - + ]]-- -- Load support for I18n @@ -18,7 +18,7 @@ local S = tubelib_addons2.S local sTextures = "Gate Wood,Aspen Wood,Jungle Wood,Pine Wood,".. "Cobblestone,Sandstone,Stone,Desert Sandstone,".. "Copper,Steel,Tin,Coral,".. - "Glas,Obsidian Glas" + "Glas,Obsidian Glas" local tTextures = { ["Gate Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, @@ -26,7 +26,7 @@ local tTextures = { ["Copper"]=9, ["Steel"]=10, ["Tin"]=11, ["Coral"]=12, ["Glas"]=13, ["Obsidian Glas"]=14, } - + local tPgns = {"tubelib_addon2_door.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", "default_copper_block.png", "default_steel_block.png", "default_tin_block.png", "default_coral_skeleton.png", @@ -60,7 +60,7 @@ for idx,pgn in ipairs(tPgns) do meta:set_string("infotext", S("Tubelib Door Block").." "..number) meta:set_string("formspec", "size[3,2]".. "label[0,0;"..S("Select texture").."]".. - "dropdown[0,0.5;3;type;"..sTextures..";1]".. + "dropdown[0,0.5;3;type;"..sTextures..";1]".. "button_exit[0.5,1.5;2,1;exit;"..S("Save").."]") end, @@ -76,7 +76,7 @@ for idx,pgn in ipairs(tPgns) do meta:set_string("formspec", nil) end end, - + after_dig_node = function(pos, oldnode, oldmetadata) tubelib.remove_node(pos) end, @@ -89,10 +89,11 @@ for idx,pgn in ipairs(tPgns) do groups = {cracky=2, choppy=2, crumbly=2, not_in_creative_inventory=not_in_inventory}, is_ground_content = false, drop = "tubelib_addons2:doorblock1", + on_blast = function() end, }) not_in_inventory = 1 - + tubelib.register_node("tubelib_addons2:doorblock"..idx, {}, { on_recv_message = function(pos, topic, payload) local node = minetest.get_node(pos) @@ -110,7 +111,7 @@ for idx,pgn in ipairs(tPgns) do end end end, - }) + }) end minetest.register_craft({ diff --git a/mods/techpack/tubelib_addons2/gateblock.lua b/mods/techpack/tubelib_addons2/gateblock.lua index eb4c3e86..2b080ea4 100644 --- a/mods/techpack/tubelib_addons2/gateblock.lua +++ b/mods/techpack/tubelib_addons2/gateblock.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information gateblock.lua: - + ]]-- -- Load support for I18n @@ -19,9 +19,9 @@ local NUM_TEXTURES = 20 local sTextures = "Wood,Aspen Wood,Jungle Wood,Pine Wood,".. "Cobblestone,Sandstone,Stone,Desert Sandstone,".. - "Desert Stone,Silver Sandstone,Mossy Cobble,Desert Cobble,".. + "Desert Stone,Silver Sandstone,Mossy Cobble,Desert Cobble,".. "Copper,Steel,Tin,Coral,".. - "Glas,Obsidian Glas,Ice,Gate Wood" + "Glas,Obsidian Glas,Ice,Gate Wood" local tTextures = { ["Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, @@ -30,7 +30,7 @@ local tTextures = { ["Copper"]=13, ["Steel"]=14, ["Tin"]=15, ["Coral"]=16, ["Glas"]=17, ["Obsidian Glas"]=18, ["Ice"]=19, ["Gate Wood"]=20, } - + local tPgns = {"default_wood.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", "default_desert_stone_block.png", "default_silver_sandstone.png", "default_mossycobble.png", "default_desert_cobble.png", @@ -49,7 +49,7 @@ for idx,pgn in ipairs(tPgns) do meta:set_string("infotext", S("Tubelib Gate Block").." "..number) meta:set_string("formspec", "size[3,2]".. "label[0,0;Select texture]".. - "dropdown[0,0.5;3;type;"..sTextures..";"..NUM_TEXTURES.."]".. + "dropdown[0,0.5;3;type;"..sTextures..";"..NUM_TEXTURES.."]".. "button_exit[0.5,1.5;2,1;exit;"..S("Save").."]") end, @@ -65,7 +65,7 @@ for idx,pgn in ipairs(tPgns) do meta:set_string("formspec", nil) end end, - + after_dig_node = function(pos, oldnode, oldmetadata) tubelib.remove_node(pos) end, @@ -78,6 +78,7 @@ for idx,pgn in ipairs(tPgns) do groups = {cracky=2, choppy=2, crumbly=2, not_in_creative_inventory = idx == NUM_TEXTURES and 0 or 1}, is_ground_content = false, drop = "tubelib_addons2:gateblock1", + on_blast = function() end, }) tubelib.register_node("tubelib_addons2:gateblock"..idx, {}, { @@ -97,7 +98,7 @@ for idx,pgn in ipairs(tPgns) do end end end, - }) + }) end minetest.register_craft({ diff --git a/mods/techpack/tubelib_addons2/industriallamp.lua b/mods/techpack/tubelib_addons2/industriallamp.lua index 777151b2..7c782548 100644 --- a/mods/techpack/tubelib_addons2/industriallamp.lua +++ b/mods/techpack/tubelib_addons2/industriallamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information industriallamp.lua: - + ]]-- -- Load support for I18n @@ -20,7 +20,7 @@ local function switch_on(pos, node) node.name = node.name.."_on" minetest.swap_node(pos, node) end -end +end local function switch_off(pos, node) if string.sub(node.name, -3) == "_on" then @@ -30,7 +30,7 @@ local function switch_off(pos, node) local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} minetest.fix_light(pos1, pos2) end -end +end local function register_lamp(tbl) local num, tiles, tiles_on, node_box, size = tbl.num, tbl.tiles, tbl.tiles_on, tbl.node_box, tbl.size @@ -40,14 +40,14 @@ local function register_lamp(tbl) drawtype = "nodebox", node_box = node_box, inventory_image = 'tubelib_addons2_industriallamp_inv'..num..'.png', - + selection_box = { type = "wallmounted", wall_top = {-size.x, 0.5 - size.y, -size.z, size.x, 0.5, size.z}, wall_bottom = {-size.x, -0.5, -size.z, size.x, -0.5 + size.y, size.z}, wall_side = {-0.5, -size.z, size.x, -0.5 + size.y, size.z, -size.x}, }, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons2:industriallamp"..num) local meta = minetest.get_meta(pos) @@ -66,12 +66,13 @@ local function register_lamp(tbl) end, paramtype = "light", - light_source = 0, + light_source = 0, sunlight_propagates = true, paramtype2 = "wallmounted", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons2:industriallamp"..num.."_on", { @@ -79,20 +80,20 @@ local function register_lamp(tbl) tiles = tiles_on, drawtype = "nodebox", node_box = node_box, - + selection_box = { type = "wallmounted", wall_top = {-size.x, 0.5 - size.y, -size.z, size.x, 0.5, size.z}, wall_bottom = {-size.x, -0.5, -size.z, size.x, -0.5 + size.y, size.z}, wall_side = {-0.5, -size.z, size.x, -0.5 + size.y, size.z, -size.x}, }, - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons2:industriallamp"..num) local meta = minetest.get_meta(pos) meta:set_string("infotext", S("Tubelib Industrial Lamp").." "..num..": "..number) end, - + on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then node.name = "tubelib_addons2:industriallamp"..num @@ -108,13 +109,14 @@ local function register_lamp(tbl) end, paramtype = "light", - light_source = minetest.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sunlight_propagates = true, paramtype2 = "wallmounted", groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, drop = "tubelib_addons2:industriallamp"..num, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) tubelib.register_node("tubelib_addons2:industriallamp"..num, {"tubelib_addons2:industriallamp"..num.."_on"}, { @@ -149,7 +151,7 @@ minetest.register_craft({ register_lamp({ - num = 1, + num = 1, tiles = { -- up, down, right, left, back, front 'tubelib_addons2_industriallamp1.png', @@ -178,9 +180,9 @@ register_lamp({ }, size = {x = 8/16, y = 7/32, z = 3/32} }) - + register_lamp({ - num = 2, + num = 2, tiles = { -- up, down, right, left, back, front 'tubelib_addons2_industriallamp2.png', @@ -209,4 +211,3 @@ register_lamp({ }, size = {x = 8/32, y = 8/32, z = 5/32} }) - \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/invisiblelamp.lua b/mods/techpack/tubelib_addons2/invisiblelamp.lua index 7d2721e1..3757aa8d 100644 --- a/mods/techpack/tubelib_addons2/invisiblelamp.lua +++ b/mods/techpack/tubelib_addons2/invisiblelamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information invisiblelamp.lua: - + ]]-- -- Load support for I18n @@ -18,7 +18,7 @@ local S = tubelib_addons2.S local function switch_on(pos, node) node.name = "tubelib_addons2:invisiblelamp_on" minetest.swap_node(pos, node) -end +end local function switch_off(pos, node) node.name = "tubelib_addons2:invisiblelamp" @@ -26,14 +26,14 @@ local function switch_off(pos, node) local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} minetest.fix_light(pos1, pos2) -end +end minetest.register_node("tubelib_addons2:invisiblelamp", { description = S("Tubelib Invisible Lamp"), drawtype = "glasslike_framed_optional", tiles = {"tubelib_addons2_invisiblelamp.png"}, inventory_image = 'tubelib_addons2_invisiblelamp_inventory.png', - + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons2:invisiblelamp") local meta = minetest.get_meta(pos) @@ -57,13 +57,14 @@ minetest.register_node("tubelib_addons2:invisiblelamp", { is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons2:invisiblelamp_on", { description = S("Tubelib Invisible Lamp"), drawtype = "glasslike_framed_optional", tiles = {"tubelib_addons2_invisiblelamp.png"}, - + on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then switch_off(pos, node) @@ -73,7 +74,7 @@ minetest.register_node("tubelib_addons2:invisiblelamp_on", { after_dig_node = function(pos) tubelib.remove_node(pos) end, - + paramtype = "light", light_source = minetest.LIGHT_MAX, sunlight_propagates = true, @@ -82,6 +83,7 @@ minetest.register_node("tubelib_addons2:invisiblelamp_on", { drop = "tubelib_addons2:invisiblelamp", groups = {cracky = 3, oddly_breakable_by_hand = 3, not_in_creative_inventory=1}, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -102,4 +104,4 @@ tubelib.register_node("tubelib_addons2:invisiblelamp", {"tubelib_addons2:invisib switch_off(pos, node) end end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/locale/template.txt b/mods/techpack/tubelib_addons2/locale/template.txt index 1eecfc2d..4e35e2c1 100644 --- a/mods/techpack/tubelib_addons2/locale/template.txt +++ b/mods/techpack/tubelib_addons2/locale/template.txt @@ -1,116 +1,46 @@ # textdomain: tubelib_addons2 - - - -### accesscontrol.lua ### - -Access code (4 digits):= Door block numbers:= +Access code (4 digits):= Enter access code= OK= Tubelib Access Lock= Tubelib Access Lock, Enter access code= - -### accesscontrol.lua ### -### colorlamp.lua ### -### doorblock.lua ### -### gateblock.lua ### -### logic_not.lua ### -### mesecons_converter.lua ### -### repeater.lua ### - Save= - -### ceilinglamp.lua ### - Tubelib Ceiling Lamp= - -### colorlamp.lua ### -### colorlamp_ud.lua ### - Tubelib Color Lamp= - -### doorblock.lua ### - -Select texture= Tubelib Door Block= - -### gateblock.lua ### - +Select texture= Tubelib Gate Block= - -### industriallamp.lua ### - Tubelib Industrial Lamp= - -### invisiblelamp.lua ### - Tubelib Invisible Lamp= - -### logic_not.lua ### - Tubelib Logic Not= - -### logic_not.lua ### -### mesecons_converter.lua ### -### repeater.lua ### - -: connected with= -: not connected= -Destination node numbers= - -### mesecons_converter.lua ### - Tubelib Mesecons Converter= - -### mesecons_converter.lua ### -### repeater.lua ### - : fault (overloaded)= - -### programmer.lua ### - -Tubelib Programmer= -[Tubelib Programmer] Error: programmer not supported!= +Destination node numbers= +: not connected= +: connected with= +[Tubelib Programmer] programmer reset= +[Tubelib Programmer] number= +read= [Tubelib Programmer] Unknown node on= [Tubelib Programmer] foreign or unknown node!= [Tubelib Programmer] node programmed!= -[Tubelib Programmer] number= -[Tubelib Programmer] programmer reset= -read= - -### repeater.lua ### - +[Tubelib Programmer] Error: programmer not supported!= +Tubelib Programmer= Tubelib Repeater= - -### sequencer.lua ### - -Define a sequence of commands@nto control other machines.= -If endless is set, the Sequencer@nrestarts again and again.= -Numbers(s) are the node numbers,@nthe command shall sent to.= -Offset is the time to the@nnext line in seconds (1..999).= Run endless= -Sequencer Help= - -The command ' ' does nothing,@nonly consuming the offset time.= - -The commands 'on'/'off' are used@n for machines and other nodes.= - -Tubelib Sequencer= -exit= help= - -### sequencer.lua ### -### timer.lua ### - +Sequencer Help= +Define a sequence of commands@nto control other machines.= +Numbers(s) are the node numbers,@nthe command shall sent to.= +The commands 'on'/'off' are used@n for machines and other nodes.= +Offset is the time to the@nnext line in seconds (1..999).= +If endless is set, the Sequencer@nrestarts again and again.= +The command ' ' does nothing,@nonly consuming the offset time.= +exit= +Tubelib Sequencer= Command= - -### streetlamp.lua ### - Tubelib Street Lamp= - -### timer.lua ### - -Number(s)= Time= +Number(s)= Tubelib Timer= diff --git a/mods/techpack/tubelib_addons2/locale/tubelib_addons2.de.tr b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.de.tr index 92c42d95..08d13fd9 100644 --- a/mods/techpack/tubelib_addons2/locale/tubelib_addons2.de.tr +++ b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.de.tr @@ -1,118 +1,48 @@ # textdomain: tubelib_addons2 - - - -### accesscontrol.lua ### - -Access code (4 digits):=Zugangscode (4 Zahlen): Door block numbers:=Türblocknummern: +Access code (4 digits):=Zugangscode (4 Zahlen): Enter access code=Zugangscode eingeben OK=OK Tubelib Access Lock=Tubelib Zugangsschloss Tubelib Access Lock, Enter access code=Tubelib Zugangsschloss, Zugangscode eingeben - -### accesscontrol.lua ### -### colorlamp.lua ### -### doorblock.lua ### -### gateblock.lua ### -### logic_not.lua ### -### mesecons_converter.lua ### -### repeater.lua ### - Save=Speichern - -### ceilinglamp.lua ### - Tubelib Ceiling Lamp=Tubelib Deckenleuchte - -### colorlamp.lua ### -### colorlamp_ud.lua ### - Tubelib Color Lamp=Tubelib Farblampe - -### doorblock.lua ### - -Select texture=Wähle Textur Tubelib Door Block=Tubelib Türblock - -### gateblock.lua ### - +Select texture=Wähle Textur Tubelib Gate Block=Tubelib Torblock - -### industriallamp.lua ### - Tubelib Industrial Lamp=Tubelib Industrielampe - -### invisiblelamp.lua ### - Tubelib Invisible Lamp=Tubelib Unsichtbare Lampe - -### logic_not.lua ### - #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Tubelib Logic Not=Tubelib Logisches NOT - -### logic_not.lua ### -### mesecons_converter.lua ### -### repeater.lua ### - -: connected with=: verbunden mit -: not connected=: nicht verbunden -Destination node numbers=Zielknotennummern - -### mesecons_converter.lua ### - Tubelib Mesecons Converter=Tubelib Mesecons Konverter - -### mesecons_converter.lua ### -### repeater.lua ### - : fault (overloaded)=: Fehler (überlastet) - -### programmer.lua ### - -Tubelib Programmer=Tubelib Programmer -[Tubelib Programmer] Error: programmer not supported!=[Tubelib Programmer] Fehler: Programmer wird nicht unterstützt! +Destination node numbers=Zielknotennummern +: not connected=: nicht verbunden +: connected with=: verbunden mit +[Tubelib Programmer] programmer reset=[Tubelib Programmer] Programmer zurückgesetzt +[Tubelib Programmer] number=[Tubelib Programmer] Nummer +read=lesen [Tubelib Programmer] Unknown node on=[Tubelib Programmer] Unbekannter Knoten an [Tubelib Programmer] foreign or unknown node!=[Tubelib Programmer] fremder oder unbekannter Knoten! [Tubelib Programmer] node programmed!=[Tubelib Programmer] Knoten programmiert! -[Tubelib Programmer] number=[Tubelib Programmer] Nummer -[Tubelib Programmer] programmer reset=[Tubelib Programmer] Programmer zurückgesetzt -read=lesen - -### repeater.lua ### - +[Tubelib Programmer] Error: programmer not supported!=[Tubelib Programmer] Fehler: Programmer wird nicht unterstützt! +Tubelib Programmer=Tubelib Programmer #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Tubelib Repeater=Tubelib Repeater - -### sequencer.lua ### - -Define a sequence of commands@nto control other machines.=Definieren Sie eine Folge von Befehlen@nandere Maschinen zu steuern. -If endless is set, the Sequencer@nrestarts again and again.=Wenn endlos eingestellt ist, wird der Sequenzer@nimmer wieder neu gestartet. -Numbers(s) are the node numbers,@nthe command shall sent to.=Zahlen sind die Knotennummern,@nzu denen der Befehl gesendet werden soll. -Offset is the time to the@nnext line in seconds (1..999).=Offset ist die Zeit bis zur@nnächste Zeile in Sekunden (1..999). Run endless=Laufe endlos -Sequencer Help=Sequenzer-Hilfe - -The command ' ' does nothing,@nonly consuming the offset time.=Der Befehl '' macht nichts,@nverbraucht nur die Wartezeit. - -The commands 'on'/'off' are used@n for machines and other nodes.=Die Befehle 'ein'/'aus' werden@nfür Maschinen und andere Knoten verwendet. - -Tubelib Sequencer=Tubelib Sequenzer -exit=raus help=Hilfe - -### sequencer.lua ### -### timer.lua ### - +Sequencer Help=Sequenzer-Hilfe +Define a sequence of commands@nto control other machines.=Definieren Sie eine Folge von Befehlen@nandere Maschinen zu steuern. +Numbers(s) are the node numbers,@nthe command shall sent to.=Zahlen sind die Knotennummern,@nzu denen der Befehl gesendet werden soll. +The commands 'on'/'off' are used@n for machines and other nodes.=Die Befehle 'ein'/'aus' werden@nfür Maschinen und andere Knoten verwendet. +Offset is the time to the@nnext line in seconds (1..999).=Offset ist die Zeit bis zur@nnächste Zeile in Sekunden (1..999). +If endless is set, the Sequencer@nrestarts again and again.=Wenn endlos eingestellt ist, wird der Sequenzer@nimmer wieder neu gestartet. +The command ' ' does nothing,@nonly consuming the offset time.=Der Befehl '' macht nichts,@nverbraucht nur die Wartezeit. +exit=raus +Tubelib Sequencer=Tubelib Sequenzer Command=Befehl - -### streetlamp.lua ### - Tubelib Street Lamp=Tubelib Straßenlaterne - -### timer.lua ### - -Number(s)=Nummer(n) Time=Zeit +Number(s)=Nummer(n) Tubelib Timer=Tubelib Timer diff --git a/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_CN.tr b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_CN.tr new file mode 100644 index 00000000..0ed02ecb --- /dev/null +++ b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_CN.tr @@ -0,0 +1,46 @@ +# textdomain: tubelib_addons2 +Door block numbers:=门挡块编号: +Access code (4 digits):=访问密码(4 位): +Enter access code=输入访问密码 +OK=确定 +Tubelib Access Lock=Tubelib 门禁锁 +Tubelib Access Lock, Enter access code=Tubelib 门禁锁,输入访问密码 +Save=保存 +Tubelib Ceiling Lamp=Tubelib 吸顶灯 +Tubelib Color Lamp=Tubelib 彩色灯 +Tubelib Door Block=Tubelib 门挡块 +Select texture=选择材质 +Tubelib Gate Block=Tubelib 门座 +Tubelib Industrial Lamp=Tubelib 工业灯 +Tubelib Invisible Lamp=Tubelib 隐形灯 +Tubelib Logic Not=Tubelib 逻辑非门 +Tubelib Mesecons Converter=Tubelib Mesecons 转换器 +: fault (overloaded)=:故障(过载) +Destination node numbers=目标节点编号 +: not connected=:未连接 +: connected with=:已连接到 +[Tubelib Programmer] programmer reset=[Tubelib 编程器] 编程器重置 +[Tubelib Programmer] number=[Tubelib Programmer] 编号 +read=读取 +[Tubelib Programmer] Unknown node on=[Tubelib 编程器]未知节点 +[Tubelib Programmer] foreign or unknown node!=[Tubelib 编程器]外来或未知节点! +[Tubelib Programmer] node programmed!=[Tubelib 编程器]节点已编程 +[Tubelib Programmer] Error: programmer not supported!=[Tubelib 编程器]错误:编程器不支持! +Tubelib Programmer=Tubelib 编程器 +Tubelib Repeater=Tubelib 中继器 +Run endless=无休止运行 +help=帮助 +Sequencer Help=序列器 帮助 +Define a sequence of commands@nto control other machines.=定义序列命令@n来控制其他机器 +Numbers(s) are the node numbers,@nthe command shall sent to.=数字是节点号,@n命令应该发送到这里 +The commands 'on'/'off' are used@n for machines and other nodes.=命令 'on'/'off'@n用于机器和其他节点。 +Offset is the time to the@nnext line in seconds (1..999).=偏移量是到下一行的时间,@n以秒为单位。 +If endless is set, the Sequencer@nrestarts again and again.=如果设置了无休止,@n序列器会一遍又一遍地重新启动。 +The command ' ' does nothing,@nonly consuming the offset time.=命令 ' '什么都不做,只消耗偏移量时间。 +exit=退出 +Tubelib Sequencer=Tubelib 序列器 +Command=命令 +Tubelib Street Lamp=Tubelib 路灯 +Time=时间 +Number(s)=数字 +Tubelib Timer=Tubelib 计时器 diff --git a/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_TW.tr b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_TW.tr new file mode 100644 index 00000000..624d4db7 --- /dev/null +++ b/mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_TW.tr @@ -0,0 +1,46 @@ +# textdomain: tubelib_addons2 +Door block numbers:=門擋塊編號: +Access code (4 digits):=訪問密碼(4 位): +Enter access code=輸入訪問密碼 +OK=確定 +Tubelib Access Lock=Tubelib 門禁鎖 +Tubelib Access Lock, Enter access code=Tubelib 門禁鎖,輸入訪問密碼 +Save=保存 +Tubelib Ceiling Lamp=Tubelib 吸頂燈 +Tubelib Color Lamp=Tubelib 彩色燈 +Tubelib Door Block=Tubelib 門擋塊 +Select texture=選擇材質 +Tubelib Gate Block=Tubelib 門座 +Tubelib Industrial Lamp=Tubelib 工業燈 +Tubelib Invisible Lamp=Tubelib 隱形燈 +Tubelib Logic Not=Tubelib 邏輯非門 +Tubelib Mesecons Converter=Tubelib Mesecons 轉換器 +: fault (overloaded)=:故障(過載) +Destination node numbers=目標節點編號 +: not connected=:未連接 +: connected with=:已連接到 +[Tubelib Programmer] programmer reset=[Tubelib 編程器] 編程器重置 +[Tubelib Programmer] number=[Tubelib Programmer] 編號 +read=讀取 +[Tubelib Programmer] Unknown node on=[Tubelib 編程器]未知節點 +[Tubelib Programmer] foreign or unknown node!=[Tubelib 編程器]外來或未知節點! +[Tubelib Programmer] node programmed!=[Tubelib 編程器]節點已編程 +[Tubelib Programmer] Error: programmer not supported!=[Tubelib 編程器]錯誤:編程器不支持! +Tubelib Programmer=Tubelib 編程器 +Tubelib Repeater=Tubelib 中繼器 +Run endless=無休止運行 +help=幫助 +Sequencer Help=序列器 幫助 +Define a sequence of commands@nto control other machines.=定義序列命令@n來控制其他機器 +Numbers(s) are the node numbers,@nthe command shall sent to.=數字是節點號,@n命令應該發送到這裡 +The commands 'on'/'off' are used@n for machines and other nodes.=命令 'on'/'off'@n用於機器和其他節點。 +Offset is the time to the@nnext line in seconds (1..999).=偏移量是到下一行的時間,@n以秒為單位。 +If endless is set, the Sequencer@nrestarts again and again.=如果設置了無休止,@n序列器會一遍又一遍地重新啟動。 +The command ' ' does nothing,@nonly consuming the offset time.=命令 ' '什麼都不做,只消耗偏移量時間。 +exit=退出 +Tubelib Sequencer=Tubelib 序列器 +Command=命令 +Tubelib Street Lamp=Tubelib 路燈 +Time=時間 +Number(s)=數字 +Tubelib Timer=Tubelib 計時器 diff --git a/mods/techpack/tubelib_addons2/logic_not.lua b/mods/techpack/tubelib_addons2/logic_not.lua index bcb69a09..c057d049 100644 --- a/mods/techpack/tubelib_addons2/logic_not.lua +++ b/mods/techpack/tubelib_addons2/logic_not.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information logic_not.lua: - + ]]-- -- Load support for I18n @@ -20,7 +20,7 @@ local function formspec(meta) return "size[7,5]".. "field[0.5,2;6,1;number;"..S("Destination node numbers")..";"..numbers.."]" .. "button_exit[1,3;2,1;exit;"..S("Save").."]" -end +end minetest.register_node("tubelib_addons2:logic_not", { description = S("Tubelib Logic Not"), @@ -46,7 +46,7 @@ minetest.register_node("tubelib_addons2:logic_not", { if owner ~= player:get_player_name() then return end - + if tubelib.check_numbers(fields.number) then meta:set_string("numbers", fields.number) local own_number = meta:get_string("own_number") @@ -54,7 +54,7 @@ minetest.register_node("tubelib_addons2:logic_not", { meta:set_string("formspec", formspec(meta)) end end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -65,6 +65,7 @@ minetest.register_node("tubelib_addons2:logic_not", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -96,4 +97,4 @@ tubelib.register_node("tubelib_addons2:logic_not", {}, { end end end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/mesecons_converter.lua b/mods/techpack/tubelib_addons2/mesecons_converter.lua index 283536cc..c99d2d7d 100644 --- a/mods/techpack/tubelib_addons2/mesecons_converter.lua +++ b/mods/techpack/tubelib_addons2/mesecons_converter.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information mesecons_converter.lua: - + ]]-- -- Load support for I18n @@ -22,7 +22,7 @@ local function formspec(meta) return "size[7,5]".. "field[0.5,2;6,1;number;"..S("Destination node numbers")..";"..numbers.."]" .. "button_exit[1,3;2,1;exit;"..S("Save").."]" -end +end local function send_message(pos, topic, payload) local meta = minetest.get_meta(pos) @@ -71,20 +71,20 @@ minetest.register_node("tubelib_addons2:mesecons_converter", { if owner ~= player:get_player_name() then return end - + if tubelib.check_numbers(fields.number) then meta:set_string("numbers", fields.number) local own_number = meta:get_string("own_number") meta:set_string("infotext", S("Tubelib Mesecons Converter").." "..own_number..S(": connected with").." "..fields.number) meta:set_string("formspec", formspec(meta)) end - + local timer = minetest.get_node_timer(pos) if not timer:is_started() then timer:start(1) end end, - + mesecons = { receptor = { state = mesecon.state.off, @@ -109,7 +109,7 @@ minetest.register_node("tubelib_addons2:mesecons_converter", { end, } }, - + on_timer = function(pos,elapsed) if tubelib.data_not_corrupted(pos) then local meta = minetest.get_meta(pos) @@ -118,7 +118,7 @@ minetest.register_node("tubelib_addons2:mesecons_converter", { end return false end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -129,6 +129,7 @@ minetest.register_node("tubelib_addons2:mesecons_converter", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -154,4 +155,4 @@ tubelib.register_node("tubelib_addons2:mesecons_converter", {}, { return true end end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/mod.conf b/mods/techpack/tubelib_addons2/mod.conf index 476f8c74..ea8434c9 100644 --- a/mods/techpack/tubelib_addons2/mod.conf +++ b/mods/techpack/tubelib_addons2/mod.conf @@ -1,4 +1,4 @@ -name=tubelib_addons2 -description=Tubelib Extension for switching/controlling tasks -depends=default,tubelib,basic_materials -optional_depends=mesecons,unifieddyes +name = tubelib_addons2 +description = Tubelib Extension for switching/controlling tasks +depends = default, tubelib, basic_materials +optional_depends = mesecons, unifieddyes diff --git a/mods/techpack/tubelib_addons2/programmer.lua b/mods/techpack/tubelib_addons2/programmer.lua index 8e0aecc3..2c79e9bb 100644 --- a/mods/techpack/tubelib_addons2/programmer.lua +++ b/mods/techpack/tubelib_addons2/programmer.lua @@ -25,19 +25,21 @@ local function join_to_string(tbl) end local function reset_programmer(itemstack, user, pointed_thing) - user:set_attribute("tubelib_prog_numbers", nil) + local meta = user:get_meta() + meta:set_string("tubelib_prog_numbers", nil) minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] programmer reset")) return itemstack end local function read_number(itemstack, user, pointed_thing) local pos = pointed_thing.under + local meta = user:get_meta() if pos then local number = tubelib.get_node_number(pos) if number then - local numbers = minetest.deserialize(user:get_attribute("tubelib_prog_numbers")) or {} + local numbers = minetest.deserialize(meta:get_string("tubelib_prog_numbers")) or {} numbers[number] = true - user:set_attribute("tubelib_prog_numbers", minetest.serialize(numbers)) + meta:set_string("tubelib_prog_numbers", minetest.serialize(numbers)) minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] number").." "..number.." "..S("read")) else minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] Unknown node on").." "..minetest.pos_to_string(pos)) @@ -50,11 +52,12 @@ end local function program_numbers(itemstack, placer, pointed_thing) local pos = pointed_thing.under + local pmeta = placer:get_meta() if pos then local meta = minetest.get_meta(pos) local node_number = tubelib.get_node_number(pos) - local numbers = minetest.deserialize(placer:get_attribute("tubelib_prog_numbers")) or {} - placer:set_attribute("tubelib_prog_numbers", nil) + local numbers = minetest.deserialize(pmeta:get_string("tubelib_prog_numbers")) or {} + pmeta:set_string("tubelib_prog_numbers", nil) local text = join_to_string(numbers) local player_name = placer:get_player_name() if meta and meta:get_string("owner") ~= player_name then diff --git a/mods/techpack/tubelib_addons2/repeater.lua b/mods/techpack/tubelib_addons2/repeater.lua index a423180e..92775717 100644 --- a/mods/techpack/tubelib_addons2/repeater.lua +++ b/mods/techpack/tubelib_addons2/repeater.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information repeater.lua: - + ]]-- -- Load support for I18n @@ -22,7 +22,7 @@ local function formspec(meta) return "size[7,5]".. "field[0.5,2;6,1;number;"..S("Destination node numbers")..";"..numbers.."]" .. "button_exit[1,3;2,1;exit;"..S("Save").."]" -end +end minetest.register_node("tubelib_addons2:repeater", { description = S("Tubelib Repeater"), @@ -50,20 +50,20 @@ minetest.register_node("tubelib_addons2:repeater", { if owner ~= player:get_player_name() then return end - + if tubelib.check_numbers(fields.number) then meta:set_string("numbers", fields.number) local own_number = meta:get_string("own_number") meta:set_string("infotext", S("Tubelib Repeater").." "..own_number..S(": connected with").." "..fields.number) meta:set_string("formspec", formspec(meta)) end - + local timer = minetest.get_node_timer(pos) if not timer:is_started() then timer:start(1) end end, - + on_timer = function(pos,elapsed) if tubelib.data_not_corrupted(pos) then local meta = minetest.get_meta(pos) @@ -72,7 +72,7 @@ minetest.register_node("tubelib_addons2:repeater", { end return false end, - + after_dig_node = function(pos) tubelib.remove_node(pos) end, @@ -83,6 +83,7 @@ minetest.register_node("tubelib_addons2:repeater", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -120,4 +121,4 @@ tubelib.register_node("tubelib_addons2:repeater", {}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(1) end, -}) +}) diff --git a/mods/techpack/tubelib_addons2/sequencer.lua b/mods/techpack/tubelib_addons2/sequencer.lua index 6cdf8e3d..e1effa7b 100644 --- a/mods/techpack/tubelib_addons2/sequencer.lua +++ b/mods/techpack/tubelib_addons2/sequencer.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information sequencer.lua: - + ]]-- -- Load support for I18n @@ -30,7 +30,7 @@ local function formspec(state, rules, endless) default.gui_bg_img.. default.gui_slots.. "label[0,0;Number(s)]label[2.1,0;"..S("Command").."]label[6.4,0;Offset/s]"} - + for idx, rule in ipairs(rules or {}) do tbl[#tbl+1] = "field[0.2,"..(-0.2+idx)..";2,1;num"..idx..";;"..(rule.num or "").."]" tbl[#tbl+1] = "dropdown[2,"..(-0.4+idx)..";3.9,1;act"..idx..";"..sAction..";"..(rule.act or "").."]" @@ -39,7 +39,7 @@ local function formspec(state, rules, endless) tbl[#tbl+1] = "checkbox[0,8.5;endless;"..S("Run endless")..";"..endless.."]" tbl[#tbl+1] = "image_button[5,8.5;1,1;".. tubelib.state_button(state) ..";button;]" tbl[#tbl+1] = "button[6.2,8.5;1.5,1;"..S("help")..";help]" - + return table.concat(tbl) end @@ -89,7 +89,7 @@ local function restart_timer(pos, time) if type(time) == "number" then timer:start(time) end -end +end local function check_rules(pos, elapsed) if tubelib.data_not_corrupted(pos) then @@ -151,19 +151,19 @@ local function on_receive_fields(pos, formname, fields, player) if minetest.is_protected(pos, player:get_player_name()) then return end - + if fields.help ~= nil then meta:set_string("formspec", formspec_help()) return end - + local endless = meta:get_int("endless") or 0 if fields.endless ~= nil then endless = fields.endless == "true" and 1 or 0 meta:set_int("index", 1) end meta:set_int("endless", endless) - + local rules = minetest.deserialize(meta:get_string("rules")) if fields.exit ~= nil then meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) @@ -206,7 +206,7 @@ minetest.register_node("tubelib_addons2:sequencer", { 'tubelib_front.png', 'tubelib_front.png^tubelib_addons2_sequencer.png', }, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "tubelib_addons2:sequencer") @@ -225,7 +225,7 @@ minetest.register_node("tubelib_addons2:sequencer", { end, on_receive_fields = on_receive_fields, - + on_dig = function(pos, node, puncher, pointed_thing) if minetest.is_protected(pos, puncher:get_player_name()) then return @@ -237,15 +237,16 @@ minetest.register_node("tubelib_addons2:sequencer", { tubelib.remove_node(pos) end end, - + on_timer = check_rules, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), + on_blast = function() end, }) @@ -276,4 +277,4 @@ tubelib.register_node("tubelib_addons2:sequencer", {}, { minetest.get_node_timer(pos):start(1) end end, -}) \ No newline at end of file +}) diff --git a/mods/techpack/tubelib_addons2/streetlamp.lua b/mods/techpack/tubelib_addons2/streetlamp.lua index 7d5bc3fd..ad9166e5 100644 --- a/mods/techpack/tubelib_addons2/streetlamp.lua +++ b/mods/techpack/tubelib_addons2/streetlamp.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information streetlamp.lua: - + ]]-- -- Load support for I18n @@ -18,12 +18,12 @@ local S = tubelib_addons2.S local function switch_on(pos, node) node.name = "tubelib_addons2:streetlamp_on" minetest.swap_node(pos, node) -end +end local function switch_off(pos, node) node.name = "tubelib_addons2:streetlamp" minetest.swap_node(pos, node) -end +end minetest.register_node("tubelib_addons2:streetlamp", { description = S("Tubelib Street Lamp"), @@ -66,12 +66,13 @@ minetest.register_node("tubelib_addons2:streetlamp", { end, paramtype = "light", - light_source = 0, + light_source = 0, sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons2:streetlamp_on", { @@ -95,7 +96,7 @@ minetest.register_node("tubelib_addons2:streetlamp_on", { type = "fixed", fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, }, - + on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then switch_off(pos, node) @@ -103,12 +104,13 @@ minetest.register_node("tubelib_addons2:streetlamp_on", { end, paramtype = "light", - light_source = minetest.LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sunlight_propagates = true, paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_craft({ @@ -127,5 +129,5 @@ tubelib.register_node("tubelib_addons2:streetlamp", {"tubelib_addons2:streetlamp switch_off(pos, node) end end, -}) ---------------------------------------------------------------- tubelib. \ No newline at end of file +}) +--------------------------------------------------------------- tubelib. diff --git a/mods/techpack/tubelib_addons2/timer.lua b/mods/techpack/tubelib_addons2/timer.lua index fd21d509..77dc1463 100644 --- a/mods/techpack/tubelib_addons2/timer.lua +++ b/mods/techpack/tubelib_addons2/timer.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information timer.lua: - + ]]-- -- Load support for I18n @@ -18,9 +18,9 @@ local S = tubelib_addons2.S local CYCLE_TIME = 8 local tTime = { - ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, + ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, ["06:00"] = 4, ["08:00"] = 5, ["10:00"] = 6, - ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, + ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, ["18:00"] =10, ["20:00"] =11, ["22:00"] =12, } @@ -39,32 +39,32 @@ local function formspec(events, numbers, actions) default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - + "label[0,0;"..S("Time").."]label[2.3,0;"..S("Number(s)").."]label[4.5,0;"..S("Command").."]".. - "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. + "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. "field[2.3,1.2;2,1;n1;;"..numbers[1].."]" .. - "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. - - "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. + "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. + + "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. "field[2.3,2.2;2,1;n2;;"..numbers[2].."]" .. - "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. - - "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. + "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. + + "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. "field[2.3,3.2;2,1;n3;;"..numbers[3].."]" .. - "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. - - "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. + "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. + + "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. "field[2.3,4.2;2,1;n4;;"..numbers[4].."]" .. - "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. - - "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. + "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. + + "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. "field[2.3,5.2;2,1;n5;;"..numbers[5].."]" .. - "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. - - "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. + "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. + + "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. "field[2.3,6.2;2,1;n6;;"..numbers[6].."]" .. - "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. - + "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. + "button_exit[3,7;2,1;exit;close]" end @@ -79,7 +79,7 @@ local function check_rules(pos,elapsed) local done = minetest.deserialize(meta:get_string("done")) local placer_name = meta:get_string("placer_name") local number = meta:get_string("number") - + -- check all rules for idx,act in ipairs(actions) do if act ~= "" and numbers[idx] ~= "" then @@ -94,7 +94,7 @@ local function check_rules(pos,elapsed) end end end - + -- prepare for the next day if hour == 23 then done = {false,false,false,false,false,false} @@ -138,7 +138,7 @@ minetest.register_node("tubelib_addons2:timer", { if minetest.is_protected(pos, player:get_player_name()) then return end - + local events = minetest.deserialize(meta:get_string("events")) for idx, evt in ipairs({fields.e1, fields.e2, fields.e3, fields.e4, fields.e5, fields.e6}) do if evt ~= nil then @@ -162,12 +162,12 @@ minetest.register_node("tubelib_addons2:timer", { end end meta:set_string("actions", minetest.serialize(actions)) - + meta:set_string("formspec", formspec(events, numbers, actions)) local done = {false,false,false,false,false,false} meta:set_string("done", minetest.serialize(done)) end, - + on_timer = check_rules, after_dig_node = function(pos) @@ -180,6 +180,7 @@ minetest.register_node("tubelib_addons2:timer", { sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, + on_blast = function() end, }) @@ -202,4 +203,3 @@ tubelib.register_node("tubelib_addons2:timer", {}, { check_rules(pos,0) end, }) - diff --git a/mods/techpack/tubelib_addons3/chest.lua b/mods/techpack/tubelib_addons3/chest.lua index ed6910c0..59e630de 100644 --- a/mods/techpack/tubelib_addons3/chest.lua +++ b/mods/techpack/tubelib_addons3/chest.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + chest.lua - + A high performance chest ]]-- @@ -27,7 +27,7 @@ local function store_action(pos, player, action, stack) local number = meta:get_string("number") local item = stack:get_name().." "..stack:get_count() PlayerActions[number] = {name, action, item} -end +end local function send_off_command(pos) local meta = minetest.get_meta(pos) @@ -95,7 +95,7 @@ minetest.register_node("tubelib_addons3:chest", { local inv = meta:get_inventory() inv:set_size('main', 72) end, - + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = tubelib.add_node(pos, "tubelib_addons3:chest") @@ -113,7 +113,7 @@ minetest.register_node("tubelib_addons3:chest", { local inv = meta:get_inventory() return inv:is_empty("main") end, - + on_dig = function(pos, node, puncher, pointed_thing) minetest.node_dig(pos, node, puncher, pointed_thing) tubelib.remove_node(pos) @@ -128,6 +128,7 @@ minetest.register_node("tubelib_addons3:chest", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -164,7 +165,7 @@ tubelib.register_node("tubelib_addons3:chest", {}, { local meta = minetest.get_meta(pos) return tubelib.put_item(meta, "main", item) end, - + on_recv_message = function(pos, topic, payload) if topic == "state" then local meta = minetest.get_meta(pos) @@ -185,4 +186,4 @@ tubelib.register_node("tubelib_addons3:chest", {}, { return "unsupported" end end, -}) +}) diff --git a/mods/techpack/tubelib_addons3/chest_cart.lua b/mods/techpack/tubelib_addons3/chest_cart.lua index 5332f3da..c8338dd3 100644 --- a/mods/techpack/tubelib_addons3/chest_cart.lua +++ b/mods/techpack/tubelib_addons3/chest_cart.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + chest.lua - + A high performance chest ]]-- @@ -59,7 +59,7 @@ end minetest.register_node("tubelib_addons3:chest_cart", { description = S("TA Chest Cart"), tiles = { - -- up, down, right, left, back, front + -- up, down, right, left, back, front "tubelib_addons3_chest_cart_top.png", "tubelib_addons3_chest_cart_bottom.png", "tubelib_addons3_chest_cart_side.png", @@ -83,13 +83,14 @@ minetest.register_node("tubelib_addons3:chest_cart", { groups = {cracky = 2, crumbly = 2, choppy = 2}, node_placement_prediction = "", diggable = false, - + on_place = minecart.on_nodecart_place, on_punch = minecart.on_nodecart_punch, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, on_rightclick = on_rightclick, - + on_blast = function() end, + after_place_node = function(pos, placer) local inv = M(pos):get_inventory() inv:set_size('main', 4) @@ -99,14 +100,14 @@ minetest.register_node("tubelib_addons3:chest_cart", { M(pos):set_string("formspec", formspec()) end end, - + set_cargo = function(pos, data) local inv = M(pos):get_inventory() for idx, stack in ipairs(data) do inv:set_stack("main", idx, stack) end end, - + get_cargo = function(pos) local inv = M(pos):get_inventory() local data = {} @@ -151,7 +152,7 @@ tubelib.register_node("tubelib_addons3:chest_cart", {}, { local meta = minetest.get_meta(pos) return tubelib.put_item(meta, "main", item) end, - + on_recv_message = function(pos, topic, payload) if topic == "state" then local meta = minetest.get_meta(pos) @@ -160,7 +161,7 @@ tubelib.register_node("tubelib_addons3:chest_cart", {}, { return "unsupported" end end, -}) +}) minetest.register_craft({ output = "tubelib_addons3:chest_cart", diff --git a/mods/techpack/tubelib_addons3/depends.txt b/mods/techpack/tubelib_addons3/depends.txt deleted file mode 100644 index 278e6ab1..00000000 --- a/mods/techpack/tubelib_addons3/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -tubelib -tubelib_addons1 -default diff --git a/mods/techpack/tubelib_addons3/description.txt b/mods/techpack/tubelib_addons3/description.txt deleted file mode 100644 index 317b0ebd..00000000 --- a/mods/techpack/tubelib_addons3/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -Tubelib Extension with High Performance nodes - diff --git a/mods/techpack/tubelib_addons3/distributor.lua b/mods/techpack/tubelib_addons3/distributor.lua index 6d4ef851..37fd600c 100644 --- a/mods/techpack/tubelib_addons3/distributor.lua +++ b/mods/techpack/tubelib_addons3/distributor.lua @@ -9,7 +9,7 @@ See LICENSE.txt for more information distributor.lua: - + A high performance distributor ]]-- @@ -92,12 +92,12 @@ local function invlist_entries_as_list(list) end local function AddToTbl(kvTbl, new_items, val) - for _, l in ipairs(new_items) do + for _, l in ipairs(new_items) do if kvTbl[l] == nil then kvTbl[l] = {val} else kvTbl[l][#kvTbl[l] + 1] = val - end + end end return kvTbl end @@ -122,7 +122,7 @@ end local Side2Color = {B="red", L="green", F="blue", R="yellow"} local SlotColors = {"red", "green", "blue", "yellow"} -local Num2Ascii = {"B", "L", "F", "R"} +local Num2Ascii = {"B", "L", "F", "R"} local FilterCache = {} -- local cache for filter settings local function filter_settings(pos) @@ -132,7 +132,7 @@ local function filter_settings(pos) local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} local kvFilterItemNames = {} -- { = side,...} local OpenPorts = {} -- {side, ...} - + -- collect all filter settings for idx,slot in ipairs(SlotColors) do local side = Num2Ascii[idx] @@ -145,9 +145,9 @@ local function filter_settings(pos) end end end - + FilterCache[hash] = { - kvFilterItemNames = kvFilterItemNames, + kvFilterItemNames = kvFilterItemNames, OpenPorts = OpenPorts, } end @@ -156,24 +156,24 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 end - + local meta = M(pos) local inv = meta:get_inventory() local list = inv:get_list(listname) local stack_count = stack:get_count() - + if listname == "src" then if State:get_state(M(pos)) == tubelib.STANDBY then State:start(pos, meta) end return stack_count end - + local space_left = NUM_FILTER_ELEM - invlist_num_entries(list) if space_left <= 0 then return 0 end - + filter_settings(pos) return 1 end @@ -198,39 +198,39 @@ end -- move items to the output slots local function distributing(pos, meta) local player_name = meta:get_string("player_name") - local counter = minetest.deserialize(meta:get_string("item_counter")) or + local counter = minetest.deserialize(meta:get_string("item_counter")) or {red=0, green=0, blue=0, yellow=0} - + -- calculate the filter settings only once local hash = minetest.hash_node_position(pos) if FilterCache[hash] == nil then filter_settings(pos) end - - -- read data from Cache + + -- read data from Cache local kvFilterItemNames = FilterCache[hash].kvFilterItemNames local open_ports = table.copy(FilterCache[hash].OpenPorts) - + -- no filter configured? - if not next(kvFilterItemNames) and not next(open_ports) then + if not next(kvFilterItemNames) and not next(open_ports) then State:idle(pos, meta) return end - + local busy = false local inv = meta:get_inventory() local list = inv:get_list("src") - + -- take one stack from inventory, which fits to one output port local stack local start_idx = math.random(1, 8) for i = start_idx,start_idx+8 do stack = list[(i % 8) + 1] - if stack:get_count() > 0 and (kvFilterItemNames[stack:get_name()] or next(open_ports)) then - break + if stack:get_count() > 0 and (kvFilterItemNames[stack:get_name()] or next(open_ports)) then + break end end - + if stack:get_count() > 0 then local name = stack:get_name() local num = stack:get_count() @@ -252,7 +252,7 @@ local function distributing(pos, meta) break end end - + -- try unconfigured open output ports if not busy then local side = random_list_elem(open_ports) @@ -271,7 +271,7 @@ local function distributing(pos, meta) end end inv:set_list("src", list) - + meta:set_string("item_counter", minetest.serialize(counter)) if busy then State:keep_running(pos, meta, COUNTDOWN_TICKS, 1) @@ -306,9 +306,9 @@ local function on_receive_fields(pos, formname, fields, player) filter[4] = fields.filter4 == "true" end meta:set_string("filter", minetest.serialize(filter)) - + filter_settings(pos) - + if fields.state_button ~= nil then State:state_button_event(pos, fields) else @@ -326,9 +326,9 @@ local function change_filter_settings(pos, slot, val) filter[num] = val == "on" end meta:set_string("filter", minetest.serialize(filter)) - + filter_settings(pos) - + meta:set_string("formspec", formspec(State, pos, meta)) return true end @@ -371,25 +371,26 @@ minetest.register_node("tubelib_addons3:distributor", { local inv = M(pos):get_inventory() return inv:is_empty("src") end, - + on_dig = function(pos, node, player) State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, on_timer = keep_running, on_rotate = screwdriver.disallow, - + paramtype = "light", sunlight_propagates = true, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -415,7 +416,7 @@ minetest.register_node("tubelib_addons3:distributor_active", { }, on_receive_fields = on_receive_fields, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -432,6 +433,7 @@ minetest.register_node("tubelib_addons3:distributor_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons3:distributor_defect", { @@ -477,7 +479,7 @@ minetest.register_node("tubelib_addons3:distributor_defect", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -490,6 +492,7 @@ minetest.register_node("tubelib_addons3:distributor_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -503,7 +506,7 @@ minetest.register_craft({ }) -tubelib.register_node("tubelib_addons3:distributor", +tubelib.register_node("tubelib_addons3:distributor", {"tubelib_addons3:distributor_active", "tubelib_addons3:distributor_defect"}, { on_pull_item = function(pos, side) return tubelib.get_item(M(pos), "src") @@ -522,12 +525,12 @@ tubelib.register_node("tubelib_addons3:distributor", return change_filter_settings(pos, payload.slot, payload.val) elseif topic == "counter" then local meta = minetest.get_meta(pos) - return minetest.deserialize(meta:get_string("item_counter")) or + return minetest.deserialize(meta:get_string("item_counter")) or {red=0, green=0, blue=0, yellow=0} elseif topic == "clear_counter" then local meta = minetest.get_meta(pos) meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) - else + else local resp = State:on_receive_message(pos, topic, payload) if resp then return resp @@ -536,11 +539,11 @@ tubelib.register_node("tubelib_addons3:distributor", end end end, - + on_node_load = function(pos) State:on_node_load(pos) end, on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) diff --git a/mods/techpack/tubelib_addons3/funnel.lua b/mods/techpack/tubelib_addons3/funnel.lua index 1eeba233..064068ac 100644 --- a/mods/techpack/tubelib_addons3/funnel.lua +++ b/mods/techpack/tubelib_addons3/funnel.lua @@ -7,11 +7,11 @@ AGPL v3 See LICENSE.txt for more information - + funnel.lua A high performance funnel - + ]]-- -- Load support for I18n @@ -58,7 +58,7 @@ local function scan_for_objects(pos, elapsed) object:remove() end end - + end end return true @@ -94,7 +94,7 @@ minetest.register_node("tubelib_addons3:funnel", { local inv = meta:get_inventory() inv:set_size('main', 16) end, - + after_place_node = function(pos, placer) tubelib.add_node(pos, "tubelib_addons3:funnel") local meta = minetest.get_meta(pos) @@ -104,7 +104,7 @@ minetest.register_node("tubelib_addons3:funnel", { on_timer = scan_for_objects, on_rotate = screwdriver.disallow, - + can_dig = function(pos, player) if minetest.is_protected(pos, player:get_player_name()) then return false @@ -117,7 +117,7 @@ minetest.register_node("tubelib_addons3:funnel", { after_dig_node = function(pos, oldnode, oldmetadata, digger) tubelib.remove_node(pos) end, - + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, @@ -127,6 +127,7 @@ minetest.register_node("tubelib_addons3:funnel", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -154,7 +155,7 @@ tubelib.register_node("tubelib_addons3:funnel", {}, { local meta = minetest.get_meta(pos) return tubelib.put_item(meta, "main", item) end, - + on_recv_message = function(pos, topic, payload) if topic == "state" then local meta = minetest.get_meta(pos) @@ -167,6 +168,4 @@ tubelib.register_node("tubelib_addons3:funnel", {}, { minetest.get_node_timer(pos):start(1) end, -}) - - +}) diff --git a/mods/techpack/tubelib_addons3/locale/template.txt b/mods/techpack/tubelib_addons3/locale/template.txt index dca4125e..d21b0865 100644 --- a/mods/techpack/tubelib_addons3/locale/template.txt +++ b/mods/techpack/tubelib_addons3/locale/template.txt @@ -1,34 +1,11 @@ # textdomain: tubelib_addons3 - - - -### chest.lua ### - HighPerf Chest= connected with= - -### chest_cart.lua ### - TA Chest Cart= - -### distributor.lua ### - HighPerf Distributor= - -### funnel.lua ### - HighPerf Funnel= - -### pusher.lua ### - HighPerf Pusher= - -### pushing_chest.lua ### - HighPerf Pushing Chest= - -### teleporter.lua ### - Enter channel string= Save= Tubelib Teleporter= diff --git a/mods/techpack/tubelib_addons3/locale/tubelib_addons3.de.tr b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.de.tr index 91373678..6b59716e 100644 --- a/mods/techpack/tubelib_addons3/locale/tubelib_addons3.de.tr +++ b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.de.tr @@ -1,34 +1,11 @@ # textdomain: tubelib_addons3 - - - -### chest.lua ### - HighPerf Chest=HighPerf Kiste connected with=verbunden mit - -### chest_cart.lua ### - TA Chest Cart=TA Kistenwagen - -### distributor.lua ### - HighPerf Distributor=HighPerf Verteiler - -### funnel.lua ### - HighPerf Funnel=HighPerf Trichter - -### pusher.lua ### - HighPerf Pusher=HighPerf Schieber - -### pushing_chest.lua ### - HighPerf Pushing Chest=HighPerf Schiebende Kiste - -### teleporter.lua ### - Enter channel string=Geben Sie die Kanalbezeichner ein Save=Speichern Tubelib Teleporter=Tubelib Teleporter diff --git a/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_CN.tr b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_CN.tr new file mode 100644 index 00000000..654af53f --- /dev/null +++ b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_CN.tr @@ -0,0 +1,11 @@ +# textdomain: tubelib_addons3 +HighPerf Chest=高性能箱子 +connected with=已连接到 +TA Chest Cart=TA 储物车 +HighPerf Distributor=高性能配送器 +HighPerf Funnel=高性能漏斗 +HighPerf Pusher=高性能推送器 +HighPerf Pushing Chest=高性能推进箱 +Enter channel string=输入频道字符串 +Save=保存 +Tubelib Teleporter=Tubelib 传送器 diff --git a/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_TW.tr b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_TW.tr new file mode 100644 index 00000000..53bb37bf --- /dev/null +++ b/mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: tubelib_addons3 +HighPerf Chest=高性能箱子 +connected with=已連接到 +TA Chest Cart=TA 儲物車 +HighPerf Distributor=高性能配送器 +HighPerf Funnel=高性能漏斗 +HighPerf Pusher=高性能推送器 +HighPerf Pushing Chest=高性能推進箱 +Enter channel string=輸入頻道字符串 +Save=保存 +Tubelib Teleporter=Tubelib 傳送器 diff --git a/mods/techpack/tubelib_addons3/mod.conf b/mods/techpack/tubelib_addons3/mod.conf index 18f1527f..b34ccbbc 100644 --- a/mods/techpack/tubelib_addons3/mod.conf +++ b/mods/techpack/tubelib_addons3/mod.conf @@ -1,4 +1,4 @@ -name=tubelib_addons3 -description=Tubelib Extension with High Performance nodes -depends=tubelib,tubelib_addons1,default -optional_depends=minecart +name = tubelib_addons3 +description = Tubelib Extension with High Performance nodes +depends = tubelib, tubelib_addons1, default +optional_depends = minecart diff --git a/mods/techpack/tubelib_addons3/pusher.lua b/mods/techpack/tubelib_addons3/pusher.lua index d005ea7f..6e0984c5 100644 --- a/mods/techpack/tubelib_addons3/pusher.lua +++ b/mods/techpack/tubelib_addons3/pusher.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + pusher.lua - + A high performance pusher ]]-- @@ -67,7 +67,7 @@ local function keep_running(pos, elapsed) return State:is_active(meta) end return false -end +end minetest.register_node("tubelib_addons3:pusher", { description = S("HighPerf Pusher"), @@ -98,7 +98,7 @@ minetest.register_node("tubelib_addons3:pusher", { State:on_dig_node(pos, node, player) tubelib.remove_node(pos) end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -108,6 +108,7 @@ minetest.register_node("tubelib_addons3:pusher", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -164,7 +165,7 @@ minetest.register_node("tubelib_addons3:pusher_active", { State:stop(pos, M(pos)) end end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -177,6 +178,7 @@ minetest.register_node("tubelib_addons3:pusher_active", { groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons3:pusher_defect", { @@ -202,7 +204,7 @@ minetest.register_node("tubelib_addons3:pusher_defect", { after_dig_node = function(pos) tubelib.remove_node(pos) end, - + on_timer = keep_running, on_rotate = screwdriver.disallow, @@ -212,6 +214,7 @@ minetest.register_node("tubelib_addons3:pusher_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) @@ -224,7 +227,7 @@ minetest.register_craft({ }, }) -tubelib.register_node("tubelib_addons3:pusher", +tubelib.register_node("tubelib_addons3:pusher", {"tubelib_addons3:pusher_active", "tubelib_addons3:pusher_defect"}, { is_pusher = true, -- is a pulling/pushing node valid_sides = {"R","L"}, @@ -243,4 +246,4 @@ tubelib.register_node("tubelib_addons3:pusher", on_node_repair = function(pos) return State:on_node_repair(pos) end, -}) +}) diff --git a/mods/techpack/tubelib_addons3/pushing_chest.lua b/mods/techpack/tubelib_addons3/pushing_chest.lua index 7dd7440d..edffe40c 100644 --- a/mods/techpack/tubelib_addons3/pushing_chest.lua +++ b/mods/techpack/tubelib_addons3/pushing_chest.lua @@ -250,6 +250,7 @@ minetest.register_node("tubelib_addons3:pushing_chest", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) minetest.register_node("tubelib_addons3:pushing_chest_defect", { @@ -304,6 +305,7 @@ minetest.register_node("tubelib_addons3:pushing_chest_defect", { groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) diff --git a/mods/techpack/tubelib_addons3/teleporter.lua b/mods/techpack/tubelib_addons3/teleporter.lua index 8d5220ad..5d356144 100644 --- a/mods/techpack/tubelib_addons3/teleporter.lua +++ b/mods/techpack/tubelib_addons3/teleporter.lua @@ -7,9 +7,9 @@ AGPL v3 See LICENSE.txt for more information - + teleporter.lua - + A node, moving items to the peer teleporter node. ]]-- @@ -49,13 +49,13 @@ minetest.register_node("tubelib_addons3:teleporter", { Tube:pairing(pos, fields.channel) end end, - + after_dig_node = function(pos, oldnode, oldmetadata, digger) Tube:stop_pairing(pos, oldmetadata, sFormspec) local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) Tube:after_dig_node(pos, {tube_dir}) end, - + on_rotate = screwdriver.disallow, paramtype = "light", sunlight_propagates = true, @@ -63,6 +63,7 @@ minetest.register_node("tubelib_addons3:teleporter", { groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_blast = function() end, }) diff --git a/mods/throwing/init.lua b/mods/throwing/init.lua index a2574734..540ea391 100644 --- a/mods/throwing/init.lua +++ b/mods/throwing/init.lua @@ -380,6 +380,10 @@ function throwing.register_bow(name, def) def.strength = 20 end + local throw_sound = def.sound + -- Reserved field by Minetest. Prevent leaking irrelevant data to the registration API + def.sound = nil + def.on_use = function(itemstack, user, pointed_thing) -- Cooldown local meta = itemstack:get_meta() @@ -398,8 +402,8 @@ function throwing.register_bow(name, def) end -- Sound - if def.sound then - minetest.sound_play(def.sound, {to_player=user:get_player_name()}) + if throw_sound then + minetest.sound_play(throw_sound, {to_player=user:get_player_name()}) end meta:set_int("delay", os.time() + (def.delay or 0)) diff --git a/mods/trash_can/.luacheckrc b/mods/trash_can/.luacheckrc new file mode 100644 index 00000000..3c42a6d5 --- /dev/null +++ b/mods/trash_can/.luacheckrc @@ -0,0 +1,15 @@ +allow_defined_top = true +unused_args = false +max_line_length = false + +read_globals = { + "mcl_sounds", + "ItemStack", + "vector", + "default", + "mcl_core" +} + +globals = { + "minetest" +} diff --git a/mods/trash_can/init.lua b/mods/trash_can/init.lua index ae85e321..39151f49 100644 --- a/mods/trash_can/init.lua +++ b/mods/trash_can/init.lua @@ -2,6 +2,7 @@ local moditems = {} -- switcher local mineclone_path = minetest.get_modpath("mcl_core") and mcl_core +local S = minetest.get_translator("trash_can") if mineclone_path then -- means MineClone 2 is loaded moditems.iron_item = "mcl_core:iron_ingot" -- MCL version of iron ingot @@ -14,17 +15,18 @@ if mineclone_path then -- means MineClone 2 is loaded moditems.boxart = "bgcolor[#d0d0d0;false]listcolors[#9d9d9d;#9d9d9d;#5c5c5c;#000000;#ffffff]" moditems.trashbin_groups = {pickaxey=1,axey=1,handy=1,swordy=1,flammable=1,destroy_by_lava_flow=1,craftitem=1} moditems.dumpster_groups = {pickaxey=1,axey=1,handy=1,swordy=1,flammable=0,destroy_by_lava_flow=0,craftitem=1} - + moditems.slot_per_row = 9 else -- fallback, assume default (Minetest Game) is loaded moditems.iron_item = "default:steel_ingot" -- MTG iron ingot moditems.coal_item = "default:coalblock" -- MTG coal block moditems.green_dye = "dye:dark_green" -- MTG version of green dye - moditems.sounds = default.node_sound_defaults - moditems.trashcan_infotext = "Trash Can" - moditems.dumpster_infotext = "Dumpster" + moditems.sounds = default and default.node_sound_defaults + moditems.trashcan_infotext = S("Trash Can") + moditems.dumpster_infotext = S("Dumpster") moditems.boxart = "" moditems.trashbin_groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3} moditems.dumpster_groups = {cracky=3,oddly_breakable_by_hand=1} + moditems.slot_per_row = 8 end @@ -98,7 +100,7 @@ local dumpster_nodebox = { -- Normal Trash Can minetest.register_node("trash_can:trash_can_wooden",{ - description = "Wooden Trash Can", + description = S("Wooden Trash Can"), drawtype="nodebox", paramtype = "light", tiles = { @@ -115,11 +117,12 @@ minetest.register_node("trash_can:trash_can_wooden",{ _mcl_hardness = 1, on_construct = function(pos) local meta = minetest.get_meta(pos) + local offset = moditems.slot_per_row / 2 - 1 meta:set_string("formspec", - "size[8,9]" .. - "button[0,0;2,1;empty;Empty Trash]" .. - "list[context;trashlist;3,1;2,3;]" .. - "list[current_player;main;0,5;8,4;]" .. + "size["..moditems.slot_per_row..",9]" .. + "button[0,0;2,1;empty;" .. S("Empty Trash") .. "]" .. + "list[context;trashlist;"..offset..",1;2,3;]" .. + "list[current_player;main;0,5;"..moditems.slot_per_row..",4;]" .. "listring[]" .. moditems.boxart ) @@ -159,7 +162,7 @@ minetest.register_node("trash_can:trash_can_wooden",{ -- Dumpster minetest.register_node("trash_can:dumpster", { - description = "Dumpster", + description = S("Dumpster"), paramtype = "light", paramtype2 = "facedir", inventory_image = "dumpster_wield.png", @@ -186,11 +189,12 @@ minetest.register_node("trash_can:dumpster", { sounds = get_dumpster_sound(), on_construct = function(pos) local meta = minetest.get_meta(pos) + local offset = moditems.slot_per_row / 2 - 3 meta:set_string("formspec", - "size[8,9]" .. - "button[0,0;2,1;empty;Empty Trash]" .. - "list[context;main;1,1;6,3;]" .. - "list[current_player;main;0,5;8,4;]".. + "size["..moditems.slot_per_row..",9]" .. + "button[0,0;2,1;empty;" .. S("Empty Trash") .. "]" .. + "list[context;main;"..offset..",1;6,3;]" .. + "list[current_player;main;0,5;"..moditems.slot_per_row..",4;]".. "listring[]" .. moditems.boxart ) @@ -262,10 +266,11 @@ minetest.register_craft({ if trash_can_throw_in then -- Remove any items thrown in trash can. local old_on_step = minetest.registered_entities["__builtin:item"].on_step - minetest.registered_entities["__builtin:item"].on_step = function(self, dtime) - local item_pos = self.object:getpos() + minetest.registered_entities["__builtin:item"].on_step = function(self, dtime, ...) + local item_pos = self.object:get_pos() + item_pos.y = item_pos.y - 0.325 + item_pos = vector.round(item_pos) -- Round the values. Not essential, but makes logging look nicer. - for key, value in pairs(item_pos) do item_pos[key] = math.floor(value + 0.5) end if minetest.get_node(item_pos).name == "trash_can:trash_can_wooden" then local item_stack = ItemStack(self.itemstring) local inv = minetest.get_inventory({type="node", pos=item_pos}) @@ -283,6 +288,6 @@ if trash_can_throw_in then end return end - old_on_step(self, dtime) + old_on_step(self, dtime, ...) end end diff --git a/mods/trash_can/locale/template.txt b/mods/trash_can/locale/template.txt new file mode 100644 index 00000000..f9be7e9c --- /dev/null +++ b/mods/trash_can/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: trash_can +Trash Can= +Dumpster= +Wooden Trash Can= +Empty Trash= diff --git a/mods/trash_can/locale/trash_can.eo.tr b/mods/trash_can/locale/trash_can.eo.tr new file mode 100644 index 00000000..934c4ba5 --- /dev/null +++ b/mods/trash_can/locale/trash_can.eo.tr @@ -0,0 +1,5 @@ +# textdomain: trash_can +Trash Can=Rubujo +Dumpster=Granda Rubujo +Wooden Trash Can=Ligna Rubujo +Empty Trash=Malpleni Rubon diff --git a/mods/trash_can/locale/trash_can.fr.tr b/mods/trash_can/locale/trash_can.fr.tr new file mode 100644 index 00000000..1006d32b --- /dev/null +++ b/mods/trash_can/locale/trash_can.fr.tr @@ -0,0 +1,5 @@ +# textdomain: trash_can +Trash Can=Poubelle +Dumpster=Containeur +Wooden Trash Can=Poubelle en bois +Empty Trash=Vider diff --git a/mods/trash_can/locale/trash_can.zh_CN.tr b/mods/trash_can/locale/trash_can.zh_CN.tr new file mode 100644 index 00000000..5a94a3a9 --- /dev/null +++ b/mods/trash_can/locale/trash_can.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: trash_can +Trash Can=垃圾桶 +Dumpster=大型垃圾桶 +Wooden Trash Can=木制垃圾桶 +Empty Trash=清空垃圾桶 \ No newline at end of file diff --git a/mods/trash_can/locale/trash_can.zh_TW.tr b/mods/trash_can/locale/trash_can.zh_TW.tr new file mode 100644 index 00000000..d60ab9d8 --- /dev/null +++ b/mods/trash_can/locale/trash_can.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: trash_can +Trash Can=垃圾桶 +Dumpster=大型垃圾桶 +Wooden Trash Can=木製垃圾桶 +Empty Trash=清空垃圾桶 diff --git a/mods/trash_can/settingtypes.txt b/mods/trash_can/settingtypes.txt index a87aaf9c..341a25e9 100644 --- a/mods/trash_can/settingtypes.txt +++ b/mods/trash_can/settingtypes.txt @@ -1,2 +1,2 @@ # Requires some additional processing to check all items in the world each server step -trash_can_throw_in (Allow throwing trash into the trash can) bool true +trash_can_throw_in (Allow throwing trash into the trash can) bool false diff --git a/mods/ts_doors/init.lua b/mods/ts_doors/init.lua index 543ce75e..bcbc0bd6 100755 --- a/mods/ts_doors/init.lua +++ b/mods/ts_doors/init.lua @@ -87,7 +87,7 @@ end function ts_doors.register_door(item, description, texture, sounds, recipe) if not minetest.registered_nodes[item] then - minetest.log("[ts_doors] bug found: "..item.." is not a registered node. Cannot create doors") + minetest.log("error", "[ts_doors] Bug found: "..item.." is not a registered node. Can not create doors.") return end if not sounds then diff --git a/mods/ts_furniture/depends.txt b/mods/ts_furniture/depends.txt deleted file mode 100755 index 628a522e..00000000 --- a/mods/ts_furniture/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -moretrees? -ethereal? diff --git a/mods/ts_furniture/description.txt b/mods/ts_furniture/description.txt deleted file mode 100755 index 4d6f259c..00000000 --- a/mods/ts_furniture/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds basic furniture (Chairs, Tables, Small Tables, Tiny Tables, Benches). diff --git a/mods/ts_furniture/init.lua b/mods/ts_furniture/init.lua index 748707bc..16a348e9 100755 --- a/mods/ts_furniture/init.lua +++ b/mods/ts_furniture/init.lua @@ -7,6 +7,7 @@ ts_furniture.kneeling_bench = minetest.settings:get_bool("ts_furniture.kneeling_ -- Used for localization local S = minetest.get_translator("ts_furniture") +local has_player_monoids = minetest.get_modpath("player_monoids") -- Get texture by node name local T = function (node_name) @@ -29,13 +30,19 @@ if ts_furniture.enable_sitting then ts_furniture.sit = function(pos, _, player) local name = player:get_player_name() if not player_api.player_attached[name] then - if vector.length(player:get_player_velocity()) > 0 then + if vector.length(player:get_velocity()) > 0.5 then minetest.chat_send_player(player:get_player_name(), 'You can only sit down when you are not moving.') return end player:move_to(pos) player:set_eye_offset({x = 0, y = -7, z = 2}, {x = 0, y = 0, z = 0}) - player:set_physics_override(0, 0, 0) + if has_player_monoids then + player_monoids.speed:add_change(player, 0, "ts_furniture:sit") + player_monoids.jump:add_change(player, 0, "ts_furniture:sit") + player_monoids.gravity:add_change(player, 0, "ts_furniture:sit") + else + player:set_physics_override({speed = 0, jump = 0, gravity = 0}) + end player_api.player_attached[name] = true minetest.after(0.1, function() if player then @@ -56,7 +63,13 @@ if ts_furniture.enable_sitting then ts_furniture.stand = function(player, name) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - player:set_physics_override(1, 1, 1) + if has_player_monoids then + player_monoids.speed:del_change(player, "ts_furniture:sit") + player_monoids.jump:del_change(player, "ts_furniture:sit") + player_monoids.gravity:del_change(player, "ts_furniture:sit") + else + player:set_physics_override({speed = 1, jump = 1, gravity = 1}) + end player_api.player_attached[name] = false player_api.set_animation(player, "stand", 30) end @@ -185,7 +198,8 @@ end local ignore_groups = { ["wood"] = true, - ["stone"] = true + ["stone"] = true, + ["tree"] = true } function ts_furniture.register_furniture(recipe, description, tiles) diff --git a/mods/ts_furniture/locale/ts_furniture.fr.tr b/mods/ts_furniture/locale/ts_furniture.fr.tr new file mode 100644 index 00000000..1ce0d9b2 --- /dev/null +++ b/mods/ts_furniture/locale/ts_furniture.fr.tr @@ -0,0 +1,116 @@ +# textdomain:ts_furniture +Aspen Small Table=Petite table en bois de tremble +Aspen Tiny Table=Table basse en bois de tremble +Aspen Bench=Banc en bois de tremble +Aspen Table=Table en bois de tremble +Aspen Chair=Chaise en bois de tremble +Pine Small Table=Petite table en bois de pin +Pine Tiny Table=Table basse en bois de pin +Pine Bench=Banc en bois de pin +Pine Table=Table en bois de pin +Pine Chair=Chaise en bois de pin +Acacia Small Table=Petite table en bois d'acacia +Acacia Tiny Table=Petite table en bois d'acacia +Acacia Bench=Banc en bois d'acacia +Acacia Table=Table en bois d'acacia +Acacia Chair=Chaise en bois d'acacia +Wooden Small Table=Petite table en bois +Wooden Tiny Table=Table basse en bois +Wooden Bench=Banc en bois +Wooden Table=Table en bois +Wooden Chair=Chaise en bois +Jungle Wood Small Table=Petite table en bois de la jungle +Jungle Wood Tiny Table=Table basse en bois de la jungle +Jungle Wood Bench=Banc en bois de la jungle +Jungle Wood Table=Table en bois de la jungle +Jungle Wood Chair=Chaise en bois de la jungle +Apple Tree Small Table=Petite table en bois de pommier +Apple Tree Tiny Table=Table basse en bois de pommier +Apple Tree Bench=Banc en bois de pommier +Apple Tree Table=Table en bois de pommier +Apple Tree Chair=Chaise en bois de pommier +Beech Small Table=Petite table en bois de hêtre +Beech Tiny Table=Table basse en bois de hêtre +Beech Bench=Banc en bois de hêtre +Beech Table=Table en bois de hêtre +Beech Chair=Chaise en bois de hêtre +Birch Small Table=Petite table en bois de bouleau +Birch Tiny Table=Table basse en bois de bouleau +Birch Bench=Banc en bois de bouleau +Birch Table=Table en bois de bouleau +Birch Chair=Chaise en bois de bouleau +Fir Small Table=Petite table en bois de sapin +Fir Tiny Table=Table basse en bois de sapin +Fir Bench=Banc en bois de sapin +Fir Table=Table en bois de sapin +Fir Chair=Chaise en bois de sapin +Oak Small Table=Petite table en bois de chêne +Oak Tiny Table=Table basse en bois de chêne +Oak Bench=Banc en bois de chêne +Oak Table=Table en bois de chêne +Oak Chair=Chaise en bois de chêne +Palm Small Table=Petite table en bois de palmier +Palm Tiny Table=Table basse en bois de palmier +Palm Bench=Banc en bois de palmier +Palm Table=Table en bois de palmier +Palm Chair=Chaise en bois de palmier +Rubber Tree Small Table=Petite table en bois d'arbre à caoutchouc +Rubber Tree Tiny Table=Table basse en bois d'arbre à caoutchouc +Rubber Tree Bench=Banc en bois d'arbre à caoutchouc +Rubber Tree Table=Table en bois d'arbre à caoutchouc +Rubber Tree Chair=Chaise en bois d'arbre à caoutchouc +Sequoia Small Table=Petite table en bois de sequoia +Sequoia Tiny Table=Table basse en bois de sequoia +Sequoia Bench=Banc en bois de sequoia +Sequoia Table=Table en bois de sequoia +Sequoia Chair=Chaise en bois de sequoia +Spruce Small Table=Petite table en bois d'épicéa +Spruce Tiny Table=Table basse en bois d'épicéa +Spruce Bench=Banc en bois d'épicéa +Spruce Table=Table en bois d'épicéa +Spruce Chair=Chaise en bois d'épicéa +Willow Small Table=Petite table en bois de saule +Willow Tiny Table=Table basse en bois de saule +Willow Bench=Banc en bois de saule +Willow Table=Table en bois de saule +Willow Chair=Chaise en bois de saule +Banana Small Table=Petite table en bois de bananier +Banana Tiny Table=Table basse en bois de bananier +Banana Bench=Banc en bois de bananier +Banana Table=Table en bois de bananier +Banana Chair=Chaise en bois de bananier +Frost Small Table=Petite table en bois de givrier +Frost Tiny Table=Table basse en bois de givrier +Frost Bench=Banc en bois de givrier +Frost Table=Table en bois de givrier +Frost Chair=Chaise en bois de givrier +Mushroom Small Table=Petite table en champignon +Mushroom Tiny Table=Table basse en champignon +Mushroom Bench=Banc en champignon +Mushroom Table=Table en champignon +Mushroom Chair=Chaise en champignon +Palm Small Table=Petite table en bois de palmier +Palm Tiny Table=Table basse en bois de palmier +Palm Bench=Banc en bois de palmier +Palm Table=Table en bois de palmier +Palm Chair=Chaise en bois de palmier +Redwood Small Table=Petite table en bois de séquoia +Redwood Tiny Table=Table basse en bois de séquoia +Redwood Bench=Banc en bois de séquoia +Redwood Table=Table en bois de séquoia +Redwood Chair=Chaise en bois de séquoia +Sakura Small Table=Petite table en bois de cerisier du Japon +Sakura Tiny Table=Table basse en bois de cerisier du Japon +Sakura Bench=Banc en bois de cerisier du Japon +Sakura Table=Table en bois de cerisier du Japon +Sakura Chair=Chaise en bois de cerisier du Japon +Scorched Small Table=Petite table en bois brûlé +Scorched Tiny Table=Table basse en bois brûlé +Scorched Bench=Banc en bois brûlé +Scorched Table=Table en bois brûlé +Scorched Chair=Chaise en bois brûlé +Healing Tree Small Table=Petite table en bois de soignantier +Healing Tree Tiny Table=Table basse en bois de soignantier +Healing Tree Bench=Banc en bois de soignantier +Healing Tree Table=Table en bois de soignantier +Healing Tree Chair=Chaise en bois de soignantier diff --git a/mods/ts_furniture/mod.conf b/mods/ts_furniture/mod.conf index 6487ea4e..5a00a4bf 100755 --- a/mods/ts_furniture/mod.conf +++ b/mods/ts_furniture/mod.conf @@ -1,4 +1,4 @@ name = ts_furniture depends = default -optional_depends = moretrees, ethereal +optional_depends = moretrees, ethereal, player_monoids description = Adds basic furniture (Chairs, Tables, Small Tables, Tiny Tables, Benches). diff --git a/mods/ts_workshop/.luacheckrc b/mods/ts_workshop/.luacheckrc new file mode 100644 index 00000000..ef437f12 --- /dev/null +++ b/mods/ts_workshop/.luacheckrc @@ -0,0 +1,12 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +globals = { + "minetest", "ts_workshop", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, +} diff --git a/mods/ts_workshop/depends.txt b/mods/ts_workshop/depends.txt deleted file mode 100755 index e69de29b..00000000 diff --git a/mods/ts_workshop/description.txt b/mods/ts_workshop/description.txt deleted file mode 100755 index 11361a87..00000000 --- a/mods/ts_workshop/description.txt +++ /dev/null @@ -1 +0,0 @@ -API for workshops diff --git a/mods/ts_workshop/init.lua b/mods/ts_workshop/init.lua index 54f78fc1..f77c40f2 100755 --- a/mods/ts_workshop/init.lua +++ b/mods/ts_workshop/init.lua @@ -84,8 +84,8 @@ function ts_workshop.register_workshop(mod, name, def) local timer = minetest.get_node_timer(pos) timer:start(0.2) else - meta:set_int("progress", 0) progress = 0 + meta:set_int("progress", progress) local inv = meta:get_inventory() inv:add_item("output", working_on) meta:set_string("working_on", "") diff --git a/mods/ts_workshop/mod.conf b/mods/ts_workshop/mod.conf index b054ba8a..8fbffaef 100755 --- a/mods/ts_workshop/mod.conf +++ b/mods/ts_workshop/mod.conf @@ -1 +1,3 @@ name = ts_workshop +description = API for workshops +author = Thomas-S diff --git a/mods/tubelib2/README.md b/mods/tubelib2/README.md index acb8c226..e6e69daa 100644 --- a/mods/tubelib2/README.md +++ b/mods/tubelib2/README.md @@ -50,8 +50,7 @@ func(node, pos, out_dir, peer_pos, peer_in_dir) will be called for every change ## Dependencies -default -optional: intllib +optional: default ## License @@ -90,5 +89,6 @@ Textures: CC0 - 2021-01-23 v2.0 * Add functions for easy & fast 'valid side' checking (PR #8) - 2021-05-24 v2.1 * Add API functions 'register_on_tube_update2' - 2022-01-05 v2.2 * Extend the 'node.param2' support for all 24 possible values +- 2022-03-11 v2.2.1 * Changed to minetest 5.0 translation (#12) diff --git a/mods/tubelib2/depends.txt b/mods/tubelib2/depends.txt deleted file mode 100644 index 60f8390c..00000000 --- a/mods/tubelib2/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default? -intllib? diff --git a/mods/tubelib2/description.txt b/mods/tubelib2/description.txt deleted file mode 100644 index ad312040..00000000 --- a/mods/tubelib2/description.txt +++ /dev/null @@ -1,2 +0,0 @@ -A library for mods which need connecting tubes / pipes / cables or similar. - diff --git a/mods/tubelib2/i18n.py b/mods/tubelib2/i18n.py new file mode 100644 index 00000000..5390ab96 --- /dev/null +++ b/mods/tubelib2/i18n.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate the template file and update the translation files. +# Copy the script into the mod or modpack root folder and run it there. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer +# LGPLv2.1+ +# +# See https://github.com/minetest-tools/update_translations for +# potential future updates to this script. + +from __future__ import print_function +import os, fnmatch, re, shutil, errno +from sys import argv as _argv +from sys import stderr as _stderr + +# Running params +params = {"recursive": False, + "help": False, + "mods": False, + "verbose": False, + "folders": [], + "no-old-file": False, + "break-long-lines": False, + "sort": False, + "print-source": False, + "truncate-unused": False, +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "mods": ['--installed-mods', '-m'], + "verbose": ['--verbose', '-v'], + "no-old-file": ['--no-old-file', '-O'], + "break-long-lines": ['--break-long-lines', '-b'], + "sort": ['--sort', '-s'], + "print-source": ['--print-source', '-p'], + "truncate-unused": ['--truncate-unused', '-t'], +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 80 + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["mods"])} + run on locally installed modules + {', '.join(options["no-old-file"])} + do not create *.old files + {', '.join(options["sort"])} + sort output strings alphabetically + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["print-source"])} + add comments denoting the source file + {', '.join(options["verbose"])} + add output information + {', '.join(options["truncate-unused"])} + delete unused strings from files +''') + + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + elif params["recursive"] and params["mods"]: + print("Option --installed-mods is incompatible with --recursive") + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if params["mods"]: + print(f"on all locally installed modules in {os.path.expanduser('~/.minetest/mods/')}") + run_all_subfolders(os.path.expanduser("~/.minetest/mods")) + elif len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_bracketed_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) +pattern_lua_bracketed_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +pattern_tr = re.compile(r'(.*?[^@])=(.*)') +pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') +pattern_tr_filename = re.compile(r'\.tr$') +pattern_po_language_code = re.compile(r'(.*)\.po$') + +#attempt to read the mod's name from the mod.conf file or folder name. Returns None on failure +def get_modname(folder): + try: + with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: + for line in mod_conf: + match = pattern_name.match(line) + if match: + return match.group(1) + except FileNotFoundError: + if not os.path.isfile(os.path.join(folder, "modpack.txt")): + folder_name = os.path.basename(folder) + # Special case when run in Minetest's builtin directory + if folder_name == "builtin": + return "__builtin" + else: + return folder_name + else: + return None + return None + +#If there are already .tr files in /locale, returns a list of their names +def get_existing_tr_files(folder): + out = [] + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + if pattern_tr_filename.search(name): + out.append(name) + return out + +# A series of search and replaces that massage a .po file's contents into +# a .tr file's equivalent +def process_po_file(text): + # The first three items are for unused matches + text = re.sub(r'#~ msgid "', "", text) + text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) + text = re.sub(r'"\n#~ msgstr "', "=", text) + # comment lines + text = re.sub(r'#.*\n', "", text) + # converting msg pairs into "=" pairs + text = re.sub(r'msgid "', "", text) + text = re.sub(r'"\nmsgstr ""\n"', "=", text) + text = re.sub(r'"\nmsgstr "', "=", text) + # various line breaks and escape codes + text = re.sub(r'"\n"', "", text) + text = re.sub(r'"\n', "\n", text) + text = re.sub(r'\\"', '"', text) + text = re.sub(r'\\n', '@n', text) + # remove header text + text = re.sub(r'=Project-Id-Version:.*\n', "", text) + # remove double-spaced lines + text = re.sub(r'\n\n', '\n', text) + return text + +# Go through existing .po files and, if a .tr file for that language +# *doesn't* exist, convert it and create it. +# The .tr file that results will subsequently be reprocessed so +# any "no longer used" strings will be preserved. +# Note that "fuzzy" tags will be lost in this process. +def process_po_files(folder, modname): + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + code_match = pattern_po_language_code.match(name) + if code_match == None: + continue + language_code = code_match.group(1) + tr_name = f'{modname}.{language_code}.tr' + tr_file = os.path.join(root, tr_name) + if os.path.exists(tr_file): + if params["verbose"]: + print(f"{tr_name} already exists, ignoring {name}") + continue + fname = os.path.join(root, name) + with open(fname, "r", encoding='utf-8') as po_file: + if params["verbose"]: + print(f"Importing translations from {name}") + text = process_po_file(po_file.read()) + with open(tr_file, "wt", encoding='utf-8') as tr_out: + tr_out.write(text) + +# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 +# Creates a directory if it doesn't exist, silently does +# nothing if it already exists +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): + lOut = [f"# textdomain: {mod_name}"] + if header_comments is not None: + lOut.append(header_comments) + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + if params["sort"]: + sourceList.sort() + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + if params["sort"]: + localizedStrings.sort() + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None and comment != "" and not comment.startswith("# textdomain:"): + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: + lOut.append("") + + + unusedExist = False + if not params["truncate-unused"]: + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2]) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + #TODO remove comments here + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua_s.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_s.findall(text): + strings.append(s) + for s in pattern_lua_fs.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_fs.findall(text): + strings.append(s) + + for s in strings: + s = re.sub(r'"\.\.\s+"', "", s) + s = re.sub("@[^@=0-9]", "@@", s) + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +# Returns also header comments in the third return value. +def import_tr_file(tr_file): + dOut = {} + text = None + header_comment = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + if line.startswith("###"): + if header_comment is None and not latest_comment_block is None: + # Save header comments + header_comment = latest_comment_block + # Strip textdomain line + tmp_h_c = "" + for l in header_comment.split('\n'): + if not l.startswith("# textdomain:"): + tmp_h_c += l + '\n' + header_comment = tmp_h_c + + # Reset comment block if we hit a header + latest_comment_block = None + continue + elif line.startswith("#"): + # Save the comment we're inside + if not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + continue + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + dOut[match.group(1)] = outval + return (dOut, text, header_comment) + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file sets +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + for root, dirs, files in os.walk(folder): + for name in files: + if fnmatch.fnmatch(name, "*.lua"): + fname = os.path.join(root, name) + found = read_lua_file_strings(fname) + if params["verbose"]: + print(f"{fname}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(f"### {os.path.basename(fname)} ###") + dOut[s] = sources + + if len(dOut) == 0: + return None + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2]) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if not params["no-old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + process_po_files(folder, modname) + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print(f"\033[31mUnable to find modname in folder {folder}.\033[0m", file=_stderr) + exit(1) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] + for subfolder in subfolders: + update_mod(subfolder) + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) + + +main() diff --git a/mods/tubelib2/init.lua b/mods/tubelib2/init.lua index 509dc070..e44736fd 100644 --- a/mods/tubelib2/init.lua +++ b/mods/tubelib2/init.lua @@ -1,9 +1,9 @@ tubelib2 = {} -local MP = minetest.get_modpath("tubelib2") +-- Load support for I18n. +tubelib2.S = minetest.get_translator("tubelib2") --- Load support for intllib. -dofile(MP .. "/intllib.lua") +local MP = minetest.get_modpath("tubelib2") dofile(MP .. "/internal2.lua") dofile(MP .. "/internal1.lua") dofile(MP .. "/tube_api.lua") diff --git a/mods/tubelib2/internal1.lua b/mods/tubelib2/internal1.lua index 1ee3246e..f4d03f6c 100644 --- a/mods/tubelib2/internal1.lua +++ b/mods/tubelib2/internal1.lua @@ -15,13 +15,12 @@ ]]-- -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local P = minetest.string_to_pos +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,_ = dofile(MP.."/intllib.lua") +-- Load support for I18n. +local S = tubelib2.S local Tube = tubelib2.Tube local Turn180Deg = tubelib2.Turn180Deg @@ -71,11 +70,11 @@ end -- pos/dir are the pos of the stable secondary node pointing to the head tube node. function Tube:del_from_cache(pos, dir) - local key = S(pos) + local key = P2S(pos) if self.connCache[key] and self.connCache[key][dir] then local pos2 = self.connCache[key][dir].pos2 local dir2 = self.connCache[key][dir].dir2 - local key2 = S(pos2) + local key2 = P2S(pos2) if self.connCache[key2] and self.connCache[key2][dir2] then self.connCache[key2][dir2] = nil if self.debug_info then self.debug_info(pos2, "del") end @@ -89,7 +88,7 @@ end -- pos/dir are the pos of the secondary nodes pointing to the head tube nodes. function Tube:add_to_cache(pos1, dir1, pos2, dir2) - local key = S(pos1) + local key = P2S(pos1) if not self.connCache[key] then self.connCache[key] = {} end @@ -120,9 +119,9 @@ function Tube:infotext(pos1, pos2) if self.show_infotext then if pos1 and pos2 then if vector.equals(pos1, pos2) then - M(pos1):set_string("infotext", I("Not connected!")) + M(pos1):set_string("infotext", S("Not connected!")) else - M(pos1):set_string("infotext", I("Connected with ")..S(pos2)) + M(pos1):set_string("infotext", S("Connected to @1", P2S(pos2))) end end end @@ -135,10 +134,10 @@ end -- Pairing helper function. NOT USED (see internal2.lua)!!! function Tube:store_teleport_data(pos, peer_pos) local meta = M(pos) - meta:set_string("tele_pos", S(peer_pos)) - meta:set_string("channel", nil) - meta:set_string("formspec", nil) - meta:set_string("infotext", I("Paired with ")..S(peer_pos)) + meta:set_string("tele_pos", P2S(peer_pos)) + meta:set_string("channel", "") + meta:set_string("formspec", "") + meta:set_string("infotext", S("Paired with @1", P2S(peer_pos))) return meta:get_int("tube_dir") end diff --git a/mods/tubelib2/internal2.lua b/mods/tubelib2/internal2.lua index 6c9d0dd6..9389cc38 100644 --- a/mods/tubelib2/internal2.lua +++ b/mods/tubelib2/internal2.lua @@ -13,14 +13,12 @@ ]]-- -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local P = minetest.string_to_pos +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,IS = dofile(MP.."/intllib.lua") - +-- Load support for I18n. +local S = tubelib2.S local Tube = {} @@ -251,7 +249,7 @@ function Tube:determine_tube_dirs(pos, preferred_pos, fdir) if friendly then local v = vector.direction(pos, preferred_pos) local dir1 = self:vector_to_dir(v) - local dir2 = Turn180Deg[fdir] + local dir2 = fdir < 5 and Turn180Deg[fdir] or fdir return dir1, dir2, 1 end end @@ -328,6 +326,16 @@ function Tube:determine_tube_dirs(pos, preferred_pos, fdir) (self:connected(pos, tbl[2]) and 1 or 0) return tbl[1], tbl[2], math.min(2, num_tubes) end + + -- dir1, dir2 still unknown? + if fdir and #tbl < 2 then + -- Try to turn the node by 90 degrees + local dir1 = fdir < 5 and (fdir + 1) % 4 or fdir + local dir2 = dir1 < 5 and Turn180Deg[dir1] or dir1 + if dir1 ~= dir2 and allowed[dir1] and allowed[dir2] then + return dir1, dir2, 0 + end + end end -- Determine a tube side without connection, increment the number of connections @@ -376,10 +384,10 @@ end -- Pairing helper function function Tube:store_teleport_data(pos, peer_pos) local meta = M(pos) - meta:set_string("tele_pos", S(peer_pos)) - meta:set_string("channel", nil) - meta:set_string("formspec", nil) - meta:set_string("infotext", I("Connected with ")..S(peer_pos)) + meta:set_string("tele_pos", P2S(peer_pos)) + meta:set_string("channel", "") + meta:set_string("formspec", "") + meta:set_string("infotext", S("Connected to @1", P2S(peer_pos))) return meta:get_int("tube_dir") end @@ -393,7 +401,7 @@ function Tube:get_next_teleport_node(pos, dir) local meta = M(npos) local s = meta:get_string("tele_pos") if s ~= "" then - local tele_pos = P(s) + local tele_pos = S2P(s) local tube_dir = M(tele_pos):get_int("tube_dir") if tube_dir ~= 0 then return tele_pos, tube_dir @@ -405,7 +413,7 @@ end function Tube:dbg_out() for pos1,item1 in pairs(self.connCache) do for dir1,item2 in pairs(item1) do - print("pos1="..pos1..", dir1="..dir1..", pos2="..S(item2.pos2)..", dir2="..item2.dir2) + print("pos1="..pos1..", dir1="..dir1..", pos2="..P2S(item2.pos2)..", dir2="..item2.dir2) end end end diff --git a/mods/tubelib2/intllib.lua b/mods/tubelib2/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/tubelib2/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/tubelib2/locale/de.mo b/mods/tubelib2/locale/de.mo deleted file mode 100644 index c769b79d..00000000 Binary files a/mods/tubelib2/locale/de.mo and /dev/null differ diff --git a/mods/tubelib2/locale/de.po b/mods/tubelib2/locale/de.po deleted file mode 100644 index b19d36e8..00000000 --- a/mods/tubelib2/locale/de.po +++ /dev/null @@ -1,45 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-22 11:16+0100\n" -"PO-Revision-Date: 2018-12-22 11:19+0100\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" - -#: tube_api.lua -msgid "Maximum length reached!" -msgstr "Maximale Länge erreicht!" - -#: tube_api.lua -msgid "Pairing is missing" -msgstr "Das Pairing fehlt noch" - -#: tube_api.lua -msgid "Connection to a tube is missing!" -msgstr "Eine Verbindung zu einer Röhre fehlt!" - -#: internal1.lua -msgid "Not connected!" -msgstr "Nicht verbunden!" - -#: internal1.lua internal2.lua -msgid "Connected with " -msgstr "Verbunden mit " - -#: internal1.lua -msgid "Paired with " -msgstr "Gepaart mit " - -#~ msgid "Unconnected" -#~ msgstr "Nicht verbunden" diff --git a/mods/tubelib2/locale/template.pot b/mods/tubelib2/locale/template.pot deleted file mode 100644 index fa6cc337..00000000 --- a/mods/tubelib2/locale/template.pot +++ /dev/null @@ -1,42 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-22 11:16+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: tube_api.lua -msgid "Maximum length reached!" -msgstr "" - -#: tube_api.lua -msgid "Pairing is missing" -msgstr "" - -#: tube_api.lua -msgid "Connection to a tube is missing!" -msgstr "" - -#: internal1.lua -msgid "Not connected!" -msgstr "" - -#: internal1.lua internal2.lua -msgid "Connected with " -msgstr "" - -#: internal1.lua -msgid "Paired with " -msgstr "" diff --git a/mods/tubelib2/locale/template.txt b/mods/tubelib2/locale/template.txt new file mode 100644 index 00000000..3c47e84a --- /dev/null +++ b/mods/tubelib2/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!= +Paired with @1= +Connected to @1= +Maximum length reached!= +Pairing is missing= +Connection to a tube is missing!= +Pairing is missing (@1)= diff --git a/mods/tubelib2/locale/tubelib2.de.tr b/mods/tubelib2/locale/tubelib2.de.tr new file mode 100644 index 00000000..4eb49242 --- /dev/null +++ b/mods/tubelib2/locale/tubelib2.de.tr @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!=Nicht verbunden! +Paired with @1=Gepaart mit @1 +Connected to @1=Verbunden mit @1 +Maximum length reached!=Maximale Länge erreicht! +Pairing is missing=Das Pairing fehlt +Connection to a tube is missing!=Eine Verbindung zu einer Röhre fehlt! +Pairing is missing (@1)=Das Pairing fehlt (@1) diff --git a/mods/tubelib2/locale/tubelib2.zh_CN.tr b/mods/tubelib2/locale/tubelib2.zh_CN.tr new file mode 100644 index 00000000..57686eee --- /dev/null +++ b/mods/tubelib2/locale/tubelib2.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!=未连接! +Paired with @1=与@1配对 +Connected to @1=已连接到 @1 +Maximum length reached!=已达到最大长度! +Pairing is missing=配对缺失 +Connection to a tube is missing!=管道连接缺失! +Pairing is missing (@1)=配对缺失 (@1) diff --git a/mods/tubelib2/locale/tubelib2.zh_TW.tr b/mods/tubelib2/locale/tubelib2.zh_TW.tr new file mode 100644 index 00000000..b2078b74 --- /dev/null +++ b/mods/tubelib2/locale/tubelib2.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!=未連接! +Paired with @1=與@1配對 +Connected to @1=已連接到 @1 +Maximum length reached!=已達到最大長度! +Pairing is missing=配對缺失 +Connection to a tube is missing!=管道連接缺失! +Pairing is missing (@1)=配對缺失 (@1) diff --git a/mods/tubelib2/mod.conf b/mods/tubelib2/mod.conf index a967bf95..a5c92ea7 100644 --- a/mods/tubelib2/mod.conf +++ b/mods/tubelib2/mod.conf @@ -1 +1,3 @@ name=tubelib2 +description = A library for mods which need connecting tubes / pipes / cables or similar. +optional_depends = default diff --git a/mods/tubelib2/settingtypes.txt b/mods/tubelib2/settingtypes.txt index 7386cc29..f6860e1b 100644 --- a/mods/tubelib2/settingtypes.txt +++ b/mods/tubelib2/settingtypes.txt @@ -1,3 +1,3 @@ -# Maximim number of Forceload Blocks per player (default 20) -tubelib2_testingblocks_enabled (enbale the testing blocks) bool false +# Enable/disable test blocks +tubelib2_testingblocks_enabled (enable test blocks) bool false diff --git a/mods/tubelib2/storage.lua b/mods/tubelib2/storage.lua index b41657c2..6a88bd0e 100644 --- a/mods/tubelib2/storage.lua +++ b/mods/tubelib2/storage.lua @@ -129,16 +129,22 @@ function tubelib2.get_mem_data(pos, key, default) return tubelib2.get_mem(pos)[key] or default end -function tubelib2.walk_over_all(clbk) +function tubelib2.walk_over_all(clbk, key) local data = storage:to_table() for block_key,sblock in pairs(data.fields) do local block = minetest.deserialize(sblock) for node_key,mem in pairs(block) do - if mem then - if node_key ~= "used" and node_key ~= "best_before" then + if mem and node_key ~= "used" and node_key ~= "best_before" then + if key == nil or (type(mem) == "table" and mem[key] ~= nil) then local pos = keys_to_pos(block_key, node_key) local node = tubelib2.get_node_lvm(pos) - clbk(pos, node, mem) + if key ~= nil then + -- only specified 'key' + clbk(pos, node, {[key] = mem[key]}) + else + -- without specified 'key' + clbk(pos, node, mem) + end end end end diff --git a/mods/tubelib2/tube_api.lua b/mods/tubelib2/tube_api.lua index 48293cd4..7f29b6c6 100644 --- a/mods/tubelib2/tube_api.lua +++ b/mods/tubelib2/tube_api.lua @@ -16,12 +16,11 @@ tubelib2.version = 2.2 -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,_ = dofile(MP.."/intllib.lua") +-- Load support for I18n. +local S = tubelib2.S -- Cardinal directions, regardless of orientation local Dir2Str = {"north", "east", "south", "west", "down", "up"} @@ -119,8 +118,8 @@ local function update2(self, pos1, dir1, pos2, dir2) -- reset next tube(s) to head tube(s) again local param2 = self:encode_param2(dir1, dir2, 2) self:update_after_dig_tube(pos1, param2) - M(get_pos(pos1, dir1)):set_string("infotext", I("Maximum length reached!")) - M(get_pos(pos1, dir2)):set_string("infotext", I("Maximum length reached!")) + M(get_pos(pos1, dir1)):set_string("infotext", S("Maximum length reached!")) + M(get_pos(pos1, dir2)):set_string("infotext", S("Maximum length reached!")) return false end self:infotext(fpos1, fpos2) @@ -399,7 +398,7 @@ end -- The returned pos is the destination position, dir -- is the direction into the destination node. function Tube:get_connected_node_pos(pos, dir) - local key = S(pos) + local key = P2S(pos) if self.connCache[key] and self.connCache[key][dir] then local item = self.connCache[key][dir] return item.pos2, Turn180Deg[item.dir2] @@ -456,11 +455,11 @@ function Tube:prepare_pairing(pos, tube_dir, sFormspec) meta:set_int("tube_dir", tube_dir) elseif tube_dir then meta:set_int("tube_dir", tube_dir) - meta:set_string("channel", nil) - meta:set_string("infotext", I("Pairing is missing")) + meta:set_string("channel", "") + meta:set_string("infotext", S("Pairing is missing")) meta:set_string("formspec", sFormspec) else - meta:set_string("infotext", I("Connection to a tube is missing!")) + meta:set_string("infotext", S("Connection to a tube is missing!")) end end @@ -477,7 +476,7 @@ function Tube:pairing(pos, channel) self.pairingList[channel] = pos local meta = M(pos) meta:set_string("channel", channel) - meta:set_string("infotext", I("Pairing is missing").." ("..channel..")") + meta:set_string("infotext", S("Pairing is missing (@1)", channel)) return false end end @@ -490,10 +489,10 @@ function Tube:stop_pairing(pos, oldmetadata, sFormspec) local peer_meta = M(tele_pos) if peer_meta then self:after_dig_node(tele_pos, {peer_meta:get_int("tube_dir")}) - peer_meta:set_string("channel", nil) - peer_meta:set_string("tele_pos", nil) + peer_meta:set_string("channel", "") + peer_meta:set_string("tele_pos", "") peer_meta:set_string("formspec", sFormspec) - peer_meta:set_string("infotext", I("Pairing is missing")) + peer_meta:set_string("infotext", S("Pairing is missing")) end elseif oldmetadata.fields.channel then self.pairingList[oldmetadata.fields.channel] = nil diff --git a/mods/tubelib2/tube_test.lua b/mods/tubelib2/tube_test.lua index b925ae78..57f57221 100644 --- a/mods/tubelib2/tube_test.lua +++ b/mods/tubelib2/tube_test.lua @@ -82,9 +82,9 @@ Tube:register_on_tube_update(function(node, pos, out_dir, peer_pos, peer_in_dir) print(P2S(pos).." to the "..sdir..": Not connected") elseif Tube:is_secondary_node(peer_pos) then local node = minetest.get_node(peer_pos) - print(P2S(pos).." to the "..sdir..": Connected with "..node.name.." at "..P2S(peer_pos).."/"..peer_in_dir) + print(P2S(pos).." to the "..sdir..": Connected to "..node.name.." at "..P2S(peer_pos).."/"..peer_in_dir) else - print(P2S(pos).." to the "..sdir..": Connected with "..P2S(peer_pos).."/"..peer_in_dir) + print(P2S(pos).." to the "..sdir..": Connected to "..P2S(peer_pos).."/"..peer_in_dir) for i, pos, node in Tube:get_tube_line(pos, out_dir) do print("walk", P2S(pos), node.name) end @@ -127,6 +127,7 @@ minetest.register_node("tubelib2:tubeS", { }, on_rotate = screwdriver.disallow, -- important! paramtype = "light", + use_texture_alpha = "clip", sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, @@ -159,6 +160,7 @@ minetest.register_node("tubelib2:tubeA", { }, on_rotate = screwdriver.disallow, -- important! paramtype = "light", + use_texture_alpha = "clip", sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3, not_in_creative_inventory=1}, @@ -222,8 +224,6 @@ minetest.register_node("tubelib2:source", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -248,8 +248,6 @@ minetest.register_node("tubelib2:junction", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -352,8 +350,6 @@ minetest.register_node("tubelib2:teleporter", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -438,7 +434,7 @@ minetest.register_node("tubelib2:tool", { description = "Tubelib2 Tool", inventory_image = "tubelib2_tool.png", wield_image = "tubelib2_tool.png", - use_texture_alpha = true, + use_texture_alpha = "clip", groups = {cracky=1, book=1}, on_use = remove_tube, on_place = repair_tube, diff --git a/mods/unified_inventory/.luacheckrc b/mods/unified_inventory/.luacheckrc index e6fec97d..a951e481 100644 --- a/mods/unified_inventory/.luacheckrc +++ b/mods/unified_inventory/.luacheckrc @@ -10,6 +10,7 @@ read_globals = { string = {fields = {"split", "trim"}}, table = {fields = {"copy", "getn"}}, + "dump", "minetest", "vector", "ItemStack", "datastorage", diff --git a/mods/unified_inventory/README.md b/mods/unified_inventory/README.md index 5d23f79e..e71fb42c 100644 --- a/mods/unified_inventory/README.md +++ b/mods/unified_inventory/README.md @@ -71,6 +71,9 @@ From http://www.clker.com (Public Domain, CC-BY-4.0): * [`ui_pencil_icon.pnc`](http://www.clker.com/clipart-2256.html) * [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html) +From https://www.svgrepo.com (CC-BY) + * [`ui_teleport.png`](https://www.svgrepo.com/svg/321565/teleport) + Everaldo Coelho (YellowIcon) (LGPL v2.1+): * [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png) @@ -102,3 +105,16 @@ Other files from Wikimedia Commons: RealBadAngel: (CC-BY-4.0) * Everything else. + + +## Sounds + + * [`bell.ogg`](https://freesound.org/people/bennstir/sounds/81072/) by bennstir, CC 4.0 + * [`electricity.ogg`](https://freesound.org/people/Halleck/sounds/19486/) by Halleck, CC 4.0 (cut) + * [`pageflip1.ogg`](https://freesound.org/people/themfish/sounds/45823/) by themfish, CC 4.0 (cut, slowed down) + * `pageflip2.ogg` (derived from `pageflip1.ogg`) + * [`trash.ogg`](https://freesound.org/people/OwlStorm/sounds/151231/) by OwlStorm, CC 0 (speed up) + * [`trash_all.ogg`](https://freesound.org/people/abel_K/sounds/68280/) by abel_K, Sampling Plus 1.0 (speed up) + * [`ui_click.ogg`](https://freesound.org/people/lartti/sounds/527569/) by lartti, CC 0 (cut) + * [`ui_morning.ogg`](https://freesound.org/people/InspectorJ/sounds/439472/) by InspectorJ, CC 4.0 + * [`ui_owl.ogg`](https://freesound.org/people/manda_g/sounds/54987/) by manda_g, Sampling Plus 1.0 (cut) diff --git a/mods/unified_inventory/api.lua b/mods/unified_inventory/api.lua index 8cc55328..604d49ef 100644 --- a/mods/unified_inventory/api.lua +++ b/mods/unified_inventory/api.lua @@ -2,48 +2,61 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape local ui = unified_inventory +local function is_recipe_craftable(recipe) + -- Ensure the ingedients exist + for _, itemname in pairs(recipe.items) do + local groups = string.find(itemname, "group:") + if groups then + if not ui.get_group_item(string.sub(groups, 8)).item then + return false + end + else + -- Possibly an item + local itemname_cleaned = ItemStack(itemname):get_name() + if not minetest.registered_items[itemname_cleaned] + or minetest.get_item_group(itemname_cleaned, "not_in_craft_guide") ~= 0 then + return false + end + end + end + return true +end + -- Create detached creative inventory after loading all mods minetest.after(0.01, function() local rev_aliases = {} - for source, target in pairs(minetest.registered_aliases) do - if not rev_aliases[target] then rev_aliases[target] = {} end - table.insert(rev_aliases[target], source) + for original, newname in pairs(minetest.registered_aliases) do + if not rev_aliases[newname] then + rev_aliases[newname] = {} + end + table.insert(rev_aliases[newname], original) end + + -- Filtered item 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 + if ui.is_itemdef_listable(def) then table.insert(ui.items_list, name) + + -- Alias processing: Find recipes that belong to the current item name local all_names = rev_aliases[name] or {} table.insert(all_names, name) - for _, player_name in ipairs(all_names) do - local recipes = minetest.get_all_craft_recipes(player_name) - if recipes then - for _, recipe in ipairs(recipes) do - - local unknowns - - 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 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 - ui.register_craft(recipe) - end + for _, itemname in ipairs(all_names) do + local recipes = minetest.get_all_craft_recipes(itemname) + for _, recipe in ipairs(recipes or {}) do + if is_recipe_craftable(recipe) then + ui.register_craft(recipe) end end end end end + table.sort(ui.items_list) ui.items_list_size = #ui.items_list - print("Unified Inventory. inventory size: "..ui.items_list_size) + print("Unified Inventory. Inventory size: "..ui.items_list_size) + + -- Analyse dropped items -> custom "digging" recipes for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops @@ -133,24 +146,73 @@ minetest.after(0.01, function() end end end - for _, recipes in pairs(ui.crafts_for.recipe) do + + -- Step 1: Initialize cache for looking up groups + unified_inventory.init_matching_cache() + + -- Step 2: Find all matching items for the given spec (groups) + local get_matching_spec_items = unified_inventory.get_matching_items + + for outputitemname, recipes in pairs(ui.crafts_for.recipe) do + -- List of crafts that return this item string (variable "_") + + -- Problem: The group cache must be initialized after all mods finished loading + -- thus, invalid recipes might be indexed. Hence perform filtering with `new_recipe_list` + local new_recipe_list = {} for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) 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 + -- Get items that fit into this spec (group or item name) + local specname = ItemStack(spec):get_name() + for item_name, _ in pairs(get_matching_spec_items(specname)) do + ingredient_items[item_name] = true end end for name, _ in pairs(ingredient_items) do - if ui.crafts_for.usage[name] == nil then + if not ui.crafts_for.usage[name] then ui.crafts_for.usage[name] = {} end table.insert(ui.crafts_for.usage[name], recipe) end + + if next(ingredient_items) then + -- There's at least one known ingredient: mark as good recipe + -- PS: What whatll be done about partially incomplete recipes? + table.insert(new_recipe_list, recipe) + end end + ui.crafts_for.recipe[outputitemname] = new_recipe_list + end + + -- Remove unknown items from all categories + local total_removed = 0 + for cat_name, cat_def in pairs(ui.registered_category_items) do + for itemname, _ in pairs(cat_def) do + local idef = minetest.registered_items[itemname] + if not idef then + total_removed = total_removed + 1 + --[[ + -- For analysis + minetest.log("warning", "[unified_inventory] Removed item '" + .. itemname .. "' from category '" .. cat_name + .. "'. Reason: item not registered") + ]] + cat_def[itemname] = nil + elseif not ui.is_itemdef_listable(idef) then + total_removed = total_removed + 1 + --[[ + -- For analysis + minetest.log("warning", "[unified_inventory] Removed item '" + .. itemname .. "' from category '" .. cat_name + .. "'. Reason: item is in 'not_in_creative_inventory' group") + ]] + cat_def[itemname] = nil + end + end + end + if total_removed > 0 then + minetest.log("info", "[unified_inventory] Removed " .. total_removed .. + " items from the categories.") end for _, callback in ipairs(ui.initialized_callbacks) do @@ -158,8 +220,8 @@ minetest.after(0.01, function() end end) +---------------- Home API ---------------- --- load_home local function load_home() local input = io.open(ui.home_filename, "r") if not input then @@ -176,6 +238,7 @@ local function load_home() end io.close(input) end + load_home() function ui.set_home(player, pos) @@ -204,7 +267,8 @@ function ui.go_home(player) return false end --- register_craft +---------------- Crafting API ---------------- + function ui.register_craft(options) if not options.output then return @@ -227,14 +291,12 @@ function ui.register_craft(options) end end - local craft_type_defaults = { width = 3, height = 3, uses_crafting_grid = false, } - function ui.craft_type_defaults(name, options) if not options.description then options.description = name @@ -245,8 +307,7 @@ end function ui.register_craft_type(name, options) - ui.registered_craft_types[name] = - ui.craft_type_defaults(name, options) + ui.registered_craft_types[name] = ui.craft_type_defaults(name, options) end @@ -303,6 +364,8 @@ ui.register_craft_type("digging_chance", { height = 1, }) +---------------- GUI registrations ---------------- + function ui.register_page(name, def) ui.pages[name] = def end @@ -318,6 +381,8 @@ function ui.register_button(name, def) table.insert(ui.buttons, def) end +---------------- Callback registrations ---------------- + function ui.register_on_initialized(callback) if type(callback) ~= "function" then error(("Initialized callback must be a function, %s given."):format(type(callback))) @@ -332,6 +397,8 @@ function ui.register_on_craft_registered(callback) table.insert(ui.craft_registered_callbacks, callback) end +---------------- List getters ---------------- + function ui.get_recipe_list(output) return ui.crafts_for.recipe[output] end @@ -344,11 +411,15 @@ function ui.get_registered_outputs() return outputs end +---------------- Player utilities ---------------- + function ui.is_creative(playername) return minetest.check_player_privs(playername, {creative=true}) or minetest.settings:get_bool("creative_mode") end +---------------- Formspec helpers ---------------- + 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 "") ) diff --git a/mods/unified_inventory/bags.lua b/mods/unified_inventory/bags.lua index 14ac8758..8563c2f7 100644 --- a/mods/unified_inventory/bags.lua +++ b/mods/unified_inventory/bags.lua @@ -10,25 +10,26 @@ local F = minetest.formspec_escape local ui = unified_inventory ui.register_page("bags", { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) local player_name = player:get_player_name() - return { formspec = table.concat({ - 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)) .. "]", + local std_inv_x = perplayer_formspec.std_inv_x + local formspec = { + perplayer_formspec.standard_inv_bg, + "label[", perplayer_formspec.form_header_x, ",", + perplayer_formspec.form_header_y, ";", F(S("Bags")), "]", "listcolors[#00000000;#00000000]", - "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;]" - }) } + } + + for i = 1, 4 do + local x = std_inv_x + i * 2.5 + formspec[#formspec + 1] = ui.single_slot(x - 1.875, 1.5) + formspec[#formspec + 1] = string.format("list[detached:%s_bags;bag%i;%.3f,1.65;1,1;]", + F(player_name), i, x - 1.725) + formspec[#formspec + 1] = string.format("button[%.4f,2.75;1.875,0.75;bag%i;%s]", + x - 2.1875, i, F(S("Bag @1", i))) + end + + return { formspec = table.concat(formspec) } end, }) @@ -36,7 +37,6 @@ ui.register_button("bags", { type = "image", image = "ui_bags_icon.png", tooltip = S("Bags"), - hide_lite=true }) local function get_player_bag_stack(player, i) @@ -48,23 +48,38 @@ end for bag_i = 1, 4 do ui.register_page("bag" .. bag_i, { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image local slots = stack:get_definition().groups.bagslots + local std_inv_x = perplayer_formspec.std_inv_x + local lite_mode = perplayer_formspec.is_lite_mode + + local bag_inv_y, header_x, header_y = 1.5, 0.3, 0.65 + if lite_mode then + bag_inv_y = 0.5 + header_x = perplayer_formspec.form_header_x + header_y = perplayer_formspec.form_header_y + 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)) .. "]", + perplayer_formspec.standard_inv_bg, + ui.make_inv_img_grid(std_inv_x, bag_inv_y, 8, slots/8), + "label[", header_x, ",", header_y, ";", 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]", + bag_i, std_inv_x + ui.list_img_offset, bag_inv_y + ui.list_img_offset), + "listring[current_name;bag", bag_i, "contents]", } + + if lite_mode then + return { formspec = table.concat(formspec) } + end + local n = #formspec + 1 + formspec[n] = "image[" .. std_inv_x + 8.9 .. ",0.4;1,1;" .. image .. "]" + n = n + 1 local player_name = player:get_player_name() -- For if statement. if ui.trash_enabled @@ -114,6 +129,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +-- Player slots are preserved when unified_inventory is disabled. Do not allow modification. +-- Fix: use a detached inventory and store the data separately. local function save_bags_metadata(player, bags_inv) local is_empty = true local bags = {} @@ -127,7 +144,7 @@ local function save_bags_metadata(player, bags_inv) end local meta = player:get_meta() if is_empty then - meta:set_string("unified_inventory:bags", nil) + meta:set_string("unified_inventory:bags", "") else meta:set_string("unified_inventory:bags", minetest.serialize(bags)) @@ -163,7 +180,7 @@ local function load_bags_metadata(player, bags_inv) save_bags_metadata(player, bags_inv) end - -- Clean up deprecated garbage after saving + -- Legacy: Clean up old player lists for i = 1, 4 do local bag = "bag" .. i player_inv:set_size(bag, 0) @@ -172,46 +189,29 @@ end minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() - local bags_inv = minetest.create_detached_inventory(player_name .. "_bags",{ + local bags_inv = minetest.create_detached_inventory(player_name .. "_bags", { + allow_put = function(inv, listname, index, stack, player) + local new_slots = stack:get_definition().groups.bagslots + if not new_slots then + return 0 -- ItemStack is not a bag. + end + + -- The execution order of `allow_put`/`allow_take` is not defined. + -- We do not know the replacement ItemStack if the items are swapped. + -- Hence, bag slot upgrades and downgrades are not possible with the + -- current API. + + if not player:get_inventory():is_empty(listname .. "contents") then + -- Legacy: in case `allow_take` is not executed on old Minetest versions. + return 0 + end + return 1 + end, on_put = function(inv, listname, index, stack, player) player:get_inventory():set_size(listname .. "contents", stack:get_definition().groups.bagslots) save_bags_metadata(player, inv) end, - allow_put = function(inv, listname, index, stack, player) - local new_slots = stack:get_definition().groups.bagslots - if not new_slots then - return 0 - end - local player_inv = player:get_inventory() - local old_slots = player_inv:get_size(listname .. "contents") - - if new_slots >= old_slots then - return 1 - end - - -- using a smaller bag, make sure it fits - local old_list = player_inv:get_list(listname .. "contents") - local new_list = {} - local slots_used = 0 - local use_new_list = false - - for i, v in ipairs(old_list) do - if v and not v:is_empty() then - slots_used = slots_used + 1 - use_new_list = i > new_slots - new_list[slots_used] = v - end - end - if new_slots >= slots_used then - if use_new_list then - player_inv:set_list(listname .. "contents", new_list) - end - return 1 - end - -- New bag is smaller: Disallow inserting - return 0 - end, allow_take = function(inv, listname, index, stack, player) if player:get_inventory():is_empty(listname .. "contents") then return stack:get_count() @@ -221,6 +221,11 @@ minetest.register_on_joinplayer(function(player) on_take = function(inv, listname, index, stack, player) player:get_inventory():set_size(listname .. "contents", 0) save_bags_metadata(player, inv) + if listname == ui.current_page[player:get_player_name()] then + -- Bag is currently open: avoid follow-up issues by navigating back + -- Trick: the list name is the same as the registered page name + ui.set_inventory_formspec(player, "bags") + end end, allow_move = function() return 0 @@ -230,6 +235,20 @@ minetest.register_on_joinplayer(function(player) load_bags_metadata(player, bags_inv) end) + +minetest.register_allow_player_inventory_action(function(player, action, inventory, info) + -- From detached inventory -> player inventory: put & take callbacks + if action ~= "put" or not info.listname:find("bag%dcontents") then + return + end + if info.stack:get_definition().groups.bagslots then + -- Problem 1: empty bags could be moved into their own slots + -- Problem 2: cannot reliably keep track of ItemStack ownership due to + --> Disallow all external bag movements into this list + return 0 + end +end) + -- register bag tools minetest.register_tool("unified_inventory:bag_small", { description = S("Small Bag"), diff --git a/mods/unified_inventory/callbacks.lua b/mods/unified_inventory/callbacks.lua index 5874a0f3..52cb7103 100644 --- a/mods/unified_inventory/callbacks.lua +++ b/mods/unified_inventory/callbacks.lua @@ -1,3 +1,5 @@ +local ui = unified_inventory + local function default_refill(stack) stack:set_count(stack:get_stack_max()) local itemdef = minetest.registered_items[stack:get_name()] @@ -12,19 +14,17 @@ end minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() unified_inventory.players[player_name] = {} - unified_inventory.current_index[player_name] = 1 + unified_inventory.current_index[player_name] = 1 -- Item (~page) index unified_inventory.filtered_items_list[player_name] = - unified_inventory.items_list + unified_inventory.items_list unified_inventory.activefilter[player_name] = "" 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) -- Refill slot local refill = minetest.create_detached_inventory(player_name.."refill", { @@ -46,30 +46,58 @@ minetest.register_on_joinplayer(function(player) refill:set_size("main", 1) end) +minetest.register_on_mods_loaded(function() + minetest.register_on_joinplayer(function(player) + -- After everything is initialized, set up the formspec + ui.apply_filter(player, "", "nochange") + ui.set_inventory_formspec(player, unified_inventory.default) + end) +end) + local function apply_new_filter(player, search_text, new_dir) local player_name = player:get_player_name() - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - unified_inventory.apply_filter(player, search_text, new_dir) - unified_inventory.current_searchbox[player_name] = search_text - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) + + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) + ui.apply_filter(player, search_text, new_dir) + ui.current_searchbox[player_name] = search_text + ui.set_inventory_formspec(player, ui.current_page[player_name]) +end + +-- Search box handling +local function receive_fields_searchbox(player, formname, fields) + local player_name = player:get_player_name() + + -- always take new search text, even if not searching on it yet + if fields.searchbox and fields.searchbox ~= ui.current_searchbox[player_name] then + ui.current_searchbox[player_name] = fields.searchbox + end + + if fields.searchbutton + or fields.key_enter_field == "searchbox" then + + if ui.current_searchbox[player_name] ~= ui.activefilter[player_name] then + ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") + ui.set_inventory_formspec(player, ui.current_page[player_name]) + minetest.sound_play("paperflip2", + {to_player=player_name, gain = 1.0}) + end + elseif fields.searchresetbutton then + if ui.activefilter[player_name] ~= "" then + apply_new_filter(player, "", "nochange") + end + end end minetest.register_on_player_receive_fields(function(player, formname, fields) - local player_name = player:get_player_name() - - local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) - if formname ~= "" then return end - -- always take new search text, even if not searching on it yet - if fields.searchbox - and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then - unified_inventory.current_searchbox[player_name] = fields.searchbox - end + receive_fields_searchbox(player, formname, fields) + local player_name = player:get_player_name() + + local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) local clicked_category for name, value in pairs(fields) do @@ -88,19 +116,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) 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, + if fields.next_category or fields.prev_category then + local step = fields.next_category and 1 or -1 + local scroll_old = ui.current_category_scroll[player_name] + local scroll_new = math.max(0, math.min(#ui.category_list - ui_peruser.pagecols, scroll_old + step)) + + if scroll_old ~= scroll_new then + ui.current_category_scroll[player_name] = scroll_new + ui.set_inventory_formspec(player, unified_inventory.current_page[player_name]) end end @@ -108,7 +131,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for i, def in pairs(unified_inventory.buttons) do if fields[def.name] then def.action(player) - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) return end @@ -173,7 +196,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end if clicked_item then - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) local page = unified_inventory.current_page[player_name] local player_creative = unified_inventory.is_creative(player_name) @@ -195,22 +218,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - if fields.searchbutton - or fields.key_enter_field == "searchbox" then - unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) - minetest.sound_play("paperflip2", - {to_player=player_name, gain = 1.0}) - elseif fields.searchresetbutton then - apply_new_filter(player, "", "nochange") - end - -- alternate buttons if not (fields.alternate or fields.alternate_prev) then return end - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) local item_name = unified_inventory.current_item[player_name] if not item_name then @@ -241,11 +253,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_page[player_name]) end) -if minetest.delete_detached_inventory then - minetest.register_on_leaveplayer(function(player) - local player_name = player:get_player_name() - minetest.delete_detached_inventory(player_name.."_bags") - minetest.delete_detached_inventory(player_name.."craftrecipe") - minetest.delete_detached_inventory(player_name.."refill") - end) -end +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + minetest.remove_detached_inventory(player_name.."_bags") + minetest.remove_detached_inventory(player_name.."refill") +end) diff --git a/mods/unified_inventory/category.lua b/mods/unified_inventory/category.lua index d0fee5e6..f32a9470 100644 --- a/mods/unified_inventory/category.lua +++ b/mods/unified_inventory/category.lua @@ -96,6 +96,9 @@ function unified_inventory.register_category(category_name, config) end update_category_list() end + +-- TODO: Mark these for removal. They are pretty much useless + function unified_inventory.set_category_symbol(category_name, symbol) ensure_category_exists(category_name) unified_inventory.registered_categories[category_name].symbol = symbol @@ -112,6 +115,11 @@ function unified_inventory.set_category_index(category_name, index) update_category_list() end function unified_inventory.add_category_item(category_name, item) + if type(item) ~= "string" then + minetest.log("warning", "[unified_inventory] Cannot register category item: " .. dump(item)) + return + end + ensure_category_exists(category_name) unified_inventory.registered_category_items[category_name][item] = true end diff --git a/mods/unified_inventory/default-categories.lua b/mods/unified_inventory/default-categories.lua index 57d3e887..19825277 100644 --- a/mods/unified_inventory/default-categories.lua +++ b/mods/unified_inventory/default-categories.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("unified_inventory") +local ui = unified_inventory unified_inventory.register_category('plants', { symbol = "flowers:tulip", @@ -25,71 +26,87 @@ unified_inventory.register_category('lighting', { 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 +local function register_automatic_categorization() + -- 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) + -- Preparation for ore registration: find all possible drops (digging) + local possible_node_dig_drops = { + -- ["default:stone_with_coal"] = { "default:coal_lump", "mymod:raregem" } + -- Ores may be contained multiple times, depending on drop chances. + } + for itemname, recipes in pairs(ui.crafts_for.usage) do + for _, recipe in ipairs(recipes) do + if recipe.type == "digging" or recipe.type == "digging_chance" then + if not possible_node_dig_drops[itemname] then + possible_node_dig_drops[itemname] = {} end - else - unified_inventory.add_category_item('environment', item.ore) + local stack = ItemStack(recipe.output) + table.insert(possible_node_dig_drops[itemname], stack:get_name()) end 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 + -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment + for _, odef in pairs(minetest.registered_ores) do + local drops = possible_node_dig_drops[odef.ore] + if drops and odef.ore_type == "scatter" then + ui.add_category_item('minerals', odef.ore) + -- Register all possible drops as "minerals" + ui.add_category_items('minerals', drops) + possible_node_dig_drops[odef.ore] = {} -- mask as handled + else + ui.add_category_item('environment', odef.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 +if ui.automatic_categorization then + ui.register_on_initialized(register_automatic_categorization) +end + + -- [[ unified_inventory.add_category_items('plants', { "default:dry_grass_5", @@ -256,23 +273,6 @@ unified_inventory.add_category_items('minerals', { "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', { diff --git a/mods/unified_inventory/doc/mod_api.txt b/mods/unified_inventory/doc/mod_api.txt index ef876971..45eb4327 100644 --- a/mods/unified_inventory/doc/mod_api.txt +++ b/mods/unified_inventory/doc/mod_api.txt @@ -1,7 +1,8 @@ unified_inventory API ===================== -This file provides information about the API of unified_inventory. +This file provides information about the API of unified_inventory +and can be viewed in Markdown readers. API revisions within unified_inventory can be checked using: @@ -23,7 +24,9 @@ Grouped by use-case, afterwards sorted alphabetically. Callbacks --------- -Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft: +Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft. +This callback is run before any recipe ingredients checks, hence it is also executed on recipes that are +purged after all mods finished loading. unified_inventory.register_on_craft_registered( function (item_name, options) @@ -163,68 +166,57 @@ Register a non-standard craft 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(name, def)` + * Registers a new category + * `name` (string): internal category name + * `def` (optional, table): also its fields are optional unified_inventory.register_category("category_name", { - symbol = "mod_name:item_name" or "texture.png", + symbol = source, + -- ^ Can be in the format "mod_name:item_name" or "texture.png", label = "Human Readable Label", index = 5, + -- ^ Categories are sorted by index. Lower numbers appear before higher ones. + -- By default, the name is translated to a number: AA -> 0.0101, ZZ -> 0.2626 + --- Predefined category indices: "all" = -2, "uncategorized" = -1 items = { "mod_name:item_name", "another_mod:different_item" } + -- ^ List of items within this category }) + * `unified_inventory.remove_category(name)` + * Removes an entire category -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" +Modifier functions (to be removed) - unified_inventory.set_category_symbol("category_name", "mod_name:item_name" or "texture.png") + * `unified_inventory.set_category_symbol(name, source)` + * Changes the symbol of the category. The category does not need to exist yet. + * `name` (string): internal category name + * `source` (string, optional): `"mod_name:item_name"` or `"texture.png"`. + Defaults to `"default:stick"` if not specified. + * `unified_inventory.set_category_label(name, label)` + * Changes the human readable label of the category. + * `name` (string): internal category name + * `label` (string): human readable label. Defaults to the category name. + * `unified_inventory.set_category_index(name, index)` + * Changes the sorting index of the category. + * `name` (string): internal category name + * `index` (numeric): any real number -Add / override the human readable label for a category: - If unset this will default to the category name +Item management - unified_inventory.set_category_label("category_name", "Human Readable Label") + * ` unified_inventory.add_category_item(name, itemname)` + * Adds a single item to the category + * `itemname` (string): self-explanatory + * `unified_inventory.add_category_items(name, { itemname1, itemname2, ... }` + * Same as above but with multiple items + * `unified_inventory.remove_category_item(name, itemname)` + * Removes an item from the category + * `unified_inventory.find_category(itemname)` + * Looks up the first category containing this item + * Returns: category name (string) or nil + * `unified_inventory.find_categories(itemname)` + * Looks up the item name within all registered categories + * Returns: array of category names (table) -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/mods/unified_inventory/group.lua b/mods/unified_inventory/group.lua index 3864267a..1483b3cd 100644 --- a/mods/unified_inventory/group.lua +++ b/mods/unified_inventory/group.lua @@ -1,29 +1,5 @@ local S = minetest.get_translator("unified_inventory") - -function unified_inventory.canonical_item_spec_matcher(spec) - local specname = ItemStack(spec):get_name() - if specname:sub(1, 6) ~= "group:" then - return function (itemname) - return itemname == specname - end - end - - local group_names = specname:sub(7):split(",") - return function (itemname) - local itemdef = minetest.registered_items[itemname] - for _, group_name in ipairs(group_names) do - if (itemdef.groups[group_name] or 0) == 0 then - return false - end - end - return true - end -end - -function unified_inventory.item_matches_spec(item, spec) - local itemname = ItemStack(item):get_name() - return unified_inventory.canonical_item_spec_matcher(spec)(itemname) -end +local ui = unified_inventory function unified_inventory.extract_groupnames(groupname) local specname = ItemStack(groupname):get_name() @@ -34,22 +10,6 @@ function unified_inventory.extract_groupnames(groupname) return table.concat(group_names, S(" and ")), #group_names end -unified_inventory.registered_group_items = { - mesecon_conductor_craftable = "mesecons:wire_00000000_off", - stone = "default:cobble", - wood = "default:wood", - book = "default:book", - sand = "default:sand", - leaves = "default:leaves", - tree = "default:tree", - vessel = "vessels:glass_bottle", - wool = "wool:white", -} - -function unified_inventory.register_group_item(groupname, itemname) - unified_inventory.registered_group_items[groupname] = itemname -end - -- This is used when displaying craft recipes, where an ingredient is -- specified by group rather than as a specific item. A single-item group @@ -67,6 +27,7 @@ end -- It may be a comma-separated list of group names. This is really a -- "group:..." ingredient specification, minus the "group:" prefix. +-- TODO Replace this with the more efficient spec matcher (below) local function compute_group_item(group_name_list) local group_names = group_name_list:split(",") local candidate_items = {} @@ -125,3 +86,61 @@ function unified_inventory.get_group_item(group_name) return group_item_cache[group_name] end + +--[[ +This is for filtering known items by groups +e.g. find all items that match "group:flower,yellow" (flower AND yellow groups) +]] +local spec_matcher = {} +function unified_inventory.init_matching_cache() + for _, name in ipairs(ui.items_list) do + -- we only need to care about groups, exact items are handled separately + for group, value in pairs(minetest.registered_items[name].groups) do + if value and value ~= 0 then + if not spec_matcher[group] then + spec_matcher[group] = {} + end + spec_matcher[group][name] = true + end + end + end +end + +--[[ +Retrieves all matching items + +Arguments: + specname (string): Item name or group(s) to filter + +Output: + { + matchingitem1 = true, + ... + } +]] +function unified_inventory.get_matching_items(specname) + if specname:sub(1,6) ~= "group:" then + return { [specname] = true } + end + + local accepted = {} + for i, group in ipairs(specname:sub(7):split(",")) do + if i == 1 then + -- First step: Copy all possible item names in this group + for name, _ in pairs(spec_matcher[group] or {}) do + accepted[name] = true + end + else + -- Perform filtering + if spec_matcher[group] then + for name, _ in pairs(accepted) do + accepted[name] = spec_matcher[group][name] + end + else + -- No matching items + return {} + end + end + end + return accepted +end diff --git a/mods/unified_inventory/init.lua b/mods/unified_inventory/init.lua index 98ee2e5f..9c8ec35d 100644 --- a/mods/unified_inventory/init.lua +++ b/mods/unified_inventory/init.lua @@ -1,5 +1,11 @@ -- Unified Inventory +if not minetest.features.formspec_version_element then + -- At least formspec_version[] is the minimal feature requirement + error("Unified Inventory requires Minetest version 5.4.0 or newer.\n" .. + " Please update Minetest or use an older version of Unified Inventory.") +end + local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() @@ -44,9 +50,12 @@ unified_inventory = { 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]", + standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", - version = 3 + hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false), + hide_uncraftable_items = minetest.settings:get_bool("unified_inventory_hide_uncraftable_items", false), + + version = 5 } local ui = unified_inventory @@ -59,10 +68,16 @@ ui.style_full = { formspec_y = 1, formw = 17.75, formh = 12.25, + -- Item browser size, pos pagecols = 8, pagerows = 9, page_x = 10.75, page_y = 2.30, + -- Item browser controls + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + -- Crafting grid positions craft_x = 2.8, craft_y = 1.15, craftresult_x = 7.8, @@ -74,13 +89,15 @@ ui.style_full = { craft_guide_resultstr_x = 0.3, craft_guide_resultstr_y = 0.6, give_btn_x = 0.25, + -- Tab switching buttons main_button_x = 0.4, main_button_y = 11.0, - page_buttons_x = 11.60, - page_buttons_y = 10.15, - searchwidth = 3.4, + main_button_cols = 12, + main_button_rows = 1, + -- Tab title position form_header_x = 0.4, form_header_y = 0.4, + -- Generic sizes btn_spc = 0.85, btn_size = 0.75, std_inv_x = 0.3, @@ -92,10 +109,16 @@ ui.style_lite = { formspec_y = 0.6, formw = 14, formh = 9.75, + -- Item browser size, pos pagecols = 4, pagerows = 5, page_x = 10.5, page_y = 2.15, + -- Item browser controls + page_buttons_x = 10.5, + page_buttons_y = 6.15, + searchwidth = 1.6, + -- Crafting grid positions craft_x = 2.6, craft_y = 0.75, craftresult_x = 5.75, @@ -107,13 +130,15 @@ ui.style_lite = { craft_guide_resultstr_x = 0.15, craft_guide_resultstr_y = 0.35, give_btn_x = 0.15, + -- Tab switching buttons main_button_x = 10.5, main_button_y = 8.15, - page_buttons_x = 10.5, - page_buttons_y = 6.15, - searchwidth = 1.6, + main_button_cols = 4, + main_button_rows = 2, + -- Tab title position form_header_x = 0.2, form_header_y = 0.2, + -- Generic sizes btn_spc = 0.8, btn_size = 0.7, std_inv_x = 0.1, @@ -167,6 +192,10 @@ dofile(modpath.."/register.lua") if minetest.settings:get_bool("unified_inventory_bags") ~= false then dofile(modpath.."/bags.lua") end - -dofile(modpath.."/item_names.lua") -dofile(modpath.."/waypoints.lua") +if minetest.settings:get_bool("unified_inventory_item_names") ~= false then + dofile(modpath.."/item_names.lua") +end +if minetest.settings:get_bool("unified_inventory_waypoints") ~= false then + dofile(modpath.."/waypoints.lua") +end +dofile(modpath.."/legacy.lua") -- mod compatibility diff --git a/mods/unified_inventory/internal.lua b/mods/unified_inventory/internal.lua index b49906e7..3caa43a5 100644 --- a/mods/unified_inventory/internal.lua +++ b/mods/unified_inventory/internal.lua @@ -18,7 +18,7 @@ function ui.demangle_for_formspec(str) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) end - +-- Get the player-specific unified_inventory style 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}) @@ -27,6 +27,7 @@ function ui.get_per_player_formspec(player_name) return style end +-- Creates an item image or regular image button with a tooltip local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) local element = 'image_button' if minetest.registered_items[image] then @@ -43,47 +44,68 @@ local function formspec_button(ui_peruser, name, image, offset, pos, scale, labe 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 +-- Add registered buttons (tabs) +local function formspec_tab_buttons(player, formspec, style) local n = #formspec + 1 -- Main buttons local filtered_inv_buttons = {} - for i, def in pairs(ui.buttons) do + for _, def in pairs(ui.buttons) do if not (style.is_lite_mode and def.hide_lite) then - table.insert(filtered_inv_buttons, def) + if def.condition == nil or def.condition(player) or not ui.hide_disabled_buttons then + table.insert(filtered_inv_buttons, def) + end end end + local needs_scrollbar = #filtered_inv_buttons > style.main_button_cols * style.main_button_rows + + formspec[n] = ("scroll_container[%g,%g;%g,%g;tabbtnscroll;vertical]"):format( + style.main_button_x, style.main_button_y, -- position + style.main_button_cols * style.btn_spc, style.main_button_rows -- size + ) + n = n + 1 + 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 + local pos_x = ((i - 1) % style.main_button_cols) * style.btn_spc + local pos_y = math.floor((i - 1) / style.main_button_cols) * style.btn_spc 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;]", + if (def.condition == nil or def.condition(player)) then + formspec[n] = string.format("image_button[%g,%g;%g,%g;%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]", + formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]", pos_x, pos_y, style.btn_size, style.btn_size, def.image) n = n+1 end end end + formspec[n] = "scroll_container_end[]" + if needs_scrollbar then + local total_rows = math.ceil(#filtered_inv_buttons / style.main_button_cols) + formspec[n+1] = ("scrollbaroptions[max=%i;arrows=hide]"):format( + -- This calculation is not 100% accurate but "good enough" + (total_rows - style.main_button_rows) * style.btn_spc * 10 + ) + formspec[n+2] = ("scrollbar[%g,%g;0.4,%g;vertical;tabbtnscroll;0]"):format( + style.main_button_x + style.main_button_cols * style.btn_spc - 0.1, -- x pos + style.main_button_y, -- y pos + style.main_button_rows * style.btn_spc -- height + ) + formspec[n+3] = "scrollbaroptions[max=1000;arrows=default]" + end end +-- Add category GUI elements (top right) local function formspec_add_categories(player, formspec, ui_peruser) local player_name = player:get_player_name() local n = #formspec + 1 @@ -97,9 +119,9 @@ local function formspec_add_categories(player, formspec, ui_peruser) 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), + formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;16]", + ui_peruser.page_x-0.15, categories_scroll_pos[2], + (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.2, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), "ui_smallbg_9_sliced.png") n = n + 1 @@ -238,17 +260,25 @@ local function formspec_add_item_browser(player, formspec, ui_peruser) ui_peruser.btn_size, ui_peruser.btn_size, name, button_name ) + local tooltip = item.description + if item.mod_origin then + -- "mod_origin" may not be specified for items that were + -- registered in a callback (during or before ServerEnv init) + tooltip = tooltip .. " [" .. item.mod_origin .. "]" + end formspec[n + 1] = ("tooltip[%s;%s]"):format( - button_name, minetest.formspec_escape(item.description) + button_name, minetest.formspec_escape(tooltip) ) n = n + 2 - list_index = list_index + 1 end + list_index = list_index + 1 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, + formspec[n] = "style[page_number;content_offset=0]" + formspec[n + 1] = string.format("image_button[%f,%f;%f,0.4;;page_number;%s: %s;false;false;]", + ui_peruser.page_buttons_x, + ui_peruser.page_buttons_y + ui_peruser.btn_spc * 2 - 0.1, + ui_peruser.btn_spc * (bn - 1) + ui_peruser.btn_size, F(S("Page")), S("@1 of @2",page2,pagemax)) end @@ -280,7 +310,7 @@ function ui.get_formspec(player, page) fs[#fs + 1] = fsdata.formspec - formspec_add_filters(player, fs, ui_peruser) + formspec_tab_buttons(player, fs, ui_peruser) if fsdata.draw_inventory ~= false then -- Player inventory @@ -305,7 +335,7 @@ function ui.set_inventory_formspec(player, page) end end -local function valid_def(def) +function ui.is_itemdef_listable(def) return (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description @@ -318,11 +348,30 @@ function ui.apply_filter(player, filter, search_dir) return false end local player_name = player:get_player_name() + + -- Whether to show uncraftable items + local fprefilter = function(_) + return true + end + if ui.hide_uncraftable_items and not ui.is_creative(player_name) then + fprefilter = function(name) + return ui.get_recipe_list(name) + end + end + + local registered_items = minetest.registered_items local lfilter = string.lower(filter) local ffilter + if lfilter:sub(1, 6) == "group:" then + -- Group filter: all groups of the item must match local groups = lfilter:sub(7):split(",") - ffilter = function(name, def) + ffilter = function(name) + local def = registered_items[name] + if not def then + return false + end + for _, group in ipairs(groups) do if not def.groups[group] or def.groups[group] <= 0 then @@ -332,10 +381,16 @@ function ui.apply_filter(player, filter, search_dir) return true end else + -- Name filter: fuzzy match item names and descriptions local player_info = minetest.get_player_information(player_name) local lang = player_info and player_info.lang_code or "" - ffilter = function(name, def) + ffilter = function(name) + local def = registered_items[name] + if not def then + return false + end + local lname = string.lower(name) local ldesc = string.lower(def.description) local llocaldesc = minetest.get_translated_string @@ -344,37 +399,50 @@ function ui.apply_filter(player, filter, search_dir) or llocaldesc and string.find(llocaldesc, lfilter, 1, true) end end - ui.filtered_items_list[player_name]={} + + local filtered_items = {} + 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) + for _, name in ipairs(ui.items_list) do + if fprefilter(name) and ffilter(name) then + table.insert(filtered_items, name) end end 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) + for _, name in ipairs(ui.items_list) do + if not ui.find_category(name) + and fprefilter(name) + and ffilter(name) then + table.insert(filtered_items, 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) + -- Any other category is selected + for name, exists in pairs(ui.registered_category_items[category]) do + if exists + and fprefilter(name) + and ffilter(name) then + table.insert(filtered_items, name) end end end - table.sort(ui.filtered_items_list[player_name]) - ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name] + table.sort(filtered_items) + + ui.filtered_items_list_size[player_name] = #filtered_items + ui.filtered_items_list[player_name] = filtered_items 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 + +-- Inform players about potential visual issues +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local info = minetest.get_player_information(player_name) + if info and (info.formspec_version or 0) < 4 then + minetest.chat_send_player(player_name, S("Unified Inventory: Your game version is too old" + .. " and does not support the GUI requirements. You might experience visual issues.")) + end +end) diff --git a/mods/unified_inventory/item_names.lua b/mods/unified_inventory/item_names.lua index a1368f88..5eb0e40c 100644 --- a/mods/unified_inventory/item_names.lua +++ b/mods/unified_inventory/item_names.lua @@ -3,6 +3,8 @@ local item_names = {} -- [player_name] = { hud, dtime, itemname } local dlimit = 3 -- HUD element will be hidden after this many seconds local hudbars_mod = minetest.get_modpath("hudbars") +local only_names = minetest.settings:get_bool("unified_inventory_only_names", true) +local max_length = tonumber(minetest.settings:get("unified_inventory_max_item_name_length")) or 80 local function set_hud(player) local player_name = player:get_player_name() @@ -16,7 +18,8 @@ local function set_hud(player) item_names[player_name] = { hud = player:hud_add({ - hud_elem_type = "text", + -- TODO: remove compatibility code when 5.8.0 is no longer used + [minetest.features.hud_def_type_field and "type" or "hud_elem_type"] = "text", position = {x=0.5, y=1}, offset = off, alignment = {x=0, y=-1}, @@ -60,6 +63,7 @@ minetest.register_globalstep(function(dtime) data.itemname = itemname data.index = index data.dtime = 0 + local lang_code = minetest.get_player_information(player:get_player_name()).lang_code local desc = stack.get_meta and stack:get_meta():get_string("description") @@ -69,6 +73,14 @@ minetest.register_globalstep(function(dtime) local def = minetest.registered_items[itemname] desc = def and def.description or "" end + if only_names and desc and string.find(desc, "\n") then + desc = string.match(desc, "([^\n]*)") + end + desc = minetest.get_translated_string(lang_code, desc) + desc = minetest.strip_colors(desc) + if string.len(desc) > max_length and max_length > 0 then + desc = string.sub(desc, 1, max_length) .. " [...]" + end player:hud_change(data.hud, 'text', desc) end end diff --git a/mods/unified_inventory/legacy.lua b/mods/unified_inventory/legacy.lua new file mode 100644 index 00000000..5b62894c --- /dev/null +++ b/mods/unified_inventory/legacy.lua @@ -0,0 +1,55 @@ +-- Inefficient pattern matching + +local warned_funcs = {} +local function LOG_ONCE(funcname) + if warned_funcs[funcname] then return end + warned_funcs[funcname] = true + minetest.log("error", "Call to undocumented, deprecated API '" .. funcname .. "'." + .. " In a future version of Unified Inventory this will result in a real error.") +end + +function unified_inventory.canonical_item_spec_matcher(spec) + LOG_ONCE("canonical_item_spec_matcher") + local specname = ItemStack(spec):get_name() + if specname:sub(1, 6) ~= "group:" then + return function (itemname) + return itemname == specname + end + end + + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false + end + end + return true + end +end + +function unified_inventory.item_matches_spec(item, spec) + LOG_ONCE("item_matches_spec") + local itemname = ItemStack(item):get_name() + return unified_inventory.canonical_item_spec_matcher(spec)(itemname) +end + + +unified_inventory.registered_group_items = { + mesecon_conductor_craftable = "mesecons:wire_00000000_off", + stone = "default:cobble", + wood = "default:wood", + book = "default:book", + sand = "default:sand", + leaves = "default:leaves", + tree = "default:tree", + vessel = "vessels:glass_bottle", + wool = "wool:white", +} + +function unified_inventory.register_group_item(groupname, itemname) + LOG_ONCE("register_group_item") + unified_inventory.registered_group_items[groupname] = itemname +end + diff --git a/mods/unified_inventory/locale/unified_inventory.de.tr b/mods/unified_inventory/locale/unified_inventory.de.tr index 474049c0..f1b16707 100644 --- a/mods/unified_inventory/locale/unified_inventory.de.tr +++ b/mods/unified_inventory/locale/unified_inventory.de.tr @@ -7,17 +7,17 @@ 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= +All Items=Alle Gegenstände +Misc. Items=Sonstige Gegenstände +Plant Life=Pfanzenwelt +Building Materials=Baumaterialien +Tools=Werkzeuge +Minerals and Metals=Minerale und Metalle +Environment and Worldgen=Umwelt und Welterstellung +Lighting=Beleuchtung and = und -Scroll categories left= -Scroll categories right= +Scroll categories left=Kategorien nach links blättern +Scroll categories right=Kategorien nach rechts blättern Search=Suchen Reset search and display everything=Suche zurücksetzen und alles anzeigen First page=Erste Seite @@ -76,10 +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 -Hide waypoint= -Show waypoint= -Hide coordinates= -Show coordinates= +Hide waypoint=Wegpunkt verstecken +Show waypoint=Wegpunkt zeigen +Hide coordinates=Koordinaten verstecken +Show coordinates=Koordinaten zeigen Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern Edit waypoint name=Name des Wegpunkts ändern Waypoint active=Wegpunkt aktiv diff --git a/mods/unified_inventory/locale/unified_inventory.pl.tr b/mods/unified_inventory/locale/unified_inventory.pl.tr index 69d39e37..1e06bc13 100644 --- a/mods/unified_inventory/locale/unified_inventory.pl.tr +++ b/mods/unified_inventory/locale/unified_inventory.pl.tr @@ -1,98 +1,91 @@ # textdomain: unified_inventory -Mixing= -Cooking= -Digging= +Category:=Kategorie: +Mixing=Miksowanie +Cooking=Gotowanie +Digging=Kopanie 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= +Small Bag=Mały plecak +Medium Bag=Średni plecak +Large Bag=Duży plecak +All Items=Wszystkie przedmioty +Misc. Items=Różne przedmioty +Plant Life=Życie roślin +Building Materials=Materiały budowlane +Tools=Narzędzia +Minerals and Metals=Minerały i metale +Environment and Worldgen=Otoczenie i generowanie świata +Lighting=Oświetlenie and = i -Scroll categories left= -Scroll categories right= +Scroll categories left=Przewiń kategorię w lewo +Scroll categories right=Przewiń kategorię w prawo Search=Szukaj -Reset search and display everything= +Reset search and display everything=Zresetuj wyszukiwanie i pokaż wszystko 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 +Back three pages=Trzy strony do tyłu +Back one page=Stronę do tyłu +Forward one page=Stronę do przodu +Forward three pages=Trzy strony do przodu Last page=Ostatnia strona -No matching items=Brak pasujacych przedmiotow +No matching items=Brak pasujących przedmiotów 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"! +Can use the creative inventory=Może używać kreatywnego ekwipunku +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Wymusza wyświetlanie Unified Inventory w trybie Full jeżeli tryb Lite jest skonfigurowany globalnie +Crafting Grid=Siatka craftingu +Crafting Guide=Przewodnik craftingu +Set home position=Ustaw pozycję domu +Home position set to: @1=Pozycja domu ustawiona na: @1 +You don't have the "home" privilege!=Brak uprawnień "home"! Go home=Idź do domu Set time to day=Ustaw czas na dzień Time of day set to 6am=Czas ustawiony na 6:00 -You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settime"! +You don't have the settime privilege!=Brak uprawnień "settime"! 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= +Clear inventory=Wyczyść ekwipunek +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Aby zapobiec przypadkowemu skasowaniu ekwipunku, ten przycisk został wyłączony poza trybem kreatywnym.@nUżyj zamiast tego ikony śmietnika. +Inventory cleared!=Ekwipunek został wyczyszczony! +Trash:=Śmietnik: +Refill:=Uzupełnianie: +Any item belonging to the @1 group=Każdy przedmiot należący do @1 grupy +Any item belonging to the groups @1=Każdy przedmiot należacy do grup @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)= +Show next recipe=Pokaż nastepną recepturę +Show next usage=Pokaż następne użycie +Show previous recipe=Pokaż poprzednią recepturę +Show previous usage=Pokaż poprzednie użycie +@1 (@2)=@1 (@2) Give me:=Daj mi: -This recipe is too@@large to be displayed.= -To craft grid:= +This recipe is too@@large to be displayed.=Receptura jest zbyt@@duża aby ją wyświetlić. +To craft grid:=Do siatki craftingu. All=Wszystko -Crafting= -White=Bialy -Yellow=Zolty +Crafting=Crafting +White=Biały +Yellow=Zółty Red=Czerwony Green=Zielony Blue=Niebieski 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 -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 -Waypoint inactive=Punkt wylaczony -Finish editing=Zakoncz edycje +Set waypoint to current location=Ustaw punkt orientacyjny na bieżacej pozycji +Hide waypoint=Ukryj punkt orientacyjny +Show waypoint=Pokaż punkt orientacyjny +Hide coordinates=Ukryj koordynaty +Show coordinates=Pokaż koordynaty +Change color of waypoint display=Zmień kolor punktu +Edit waypoint name=Edytuj nazwę punktu +Waypoint active=Punkt włączony +Waypoint inactive=Punkt wyłączony +Finish editing=Zakończ edycję 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 +HUD text color=Kolor tekstu HUD \ No newline at end of file diff --git a/mods/unified_inventory/locale/unified_inventory.ru.tr b/mods/unified_inventory/locale/unified_inventory.ru.tr index 2e3489c2..0d0dbe13 100644 --- a/mods/unified_inventory/locale/unified_inventory.ru.tr +++ b/mods/unified_inventory/locale/unified_inventory.ru.tr @@ -1,23 +1,23 @@ # textdomain: unified_inventory Mixing=Мешать -Cooking=Варить +Cooking=Готовить Digging=Копать Bags=Сумки 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= +All Items=Все предметы +Misc. Items=Разн. предметы +Plant Life=Растения +Building Materials=Стройматериалы +Tools=Инструменты +Minerals and Metals=Металлы и минералы +Environment and Worldgen=Окружение и генер.мира +Lighting=Освещение and = и -Scroll categories left= -Scroll categories right= +Scroll categories left=Листать влево +Scroll categories right=Листать вправо Search=Поиск Reset search and display everything=Сброс поиска, показать всё First page=Первая страница @@ -32,7 +32,7 @@ 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= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Отображает инвентарь в полном режиме, если простой режим установлен глобально Crafting Grid=Решетка крафта Crafting Guide=Книга рецептов Set home position=Установить позицию дома @@ -59,11 +59,11 @@ Result=Результат Ingredient=Состав Show next recipe=Следующий рецепт Show next usage=Следующее использование -Show previous recipe=Прошлый рецепт -Show previous usage=Прошлая страница +Show previous recipe=Предыдущий рецепт +Show previous usage=Предыдущая страница @1 (@2)= Give me:=Дай мне: -This recipe is too@@large to be displayed.= +This recipe is too@@large to be displayed.=Этот рецепт слишком большой To craft grid:=На решeтку крафта: All=Все Crafting=Крафт @@ -76,10 +76,10 @@ Waypoints=Путевые точки Select Waypoint #@1=Выбрать путевую точку №@1 Waypoint @1=Путевая точка @1 Set waypoint to current location=Установить путевую точку по текущей позиции -Hide waypoint= -Show waypoint= -Hide coordinates= -Show coordinates= +Hide waypoint=Скрыть точку +Show waypoint=Показать точку +Hide coordinates=Скрыть координаты +Show coordinates=Показать координаты Change color of waypoint display=Поменять цвет путевой точки Edit waypoint name=Переименовать путевую точку Waypoint active=Путевая точка включена @@ -88,13 +88,4 @@ 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 показ координат путевых точек +Category:=Категории: diff --git a/mods/unified_inventory/locale/unified_inventory.zh_CN.tr b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr index 595a492d..fccb0f76 100644 --- a/mods/unified_inventory/locale/unified_inventory.zh_CN.tr +++ b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr @@ -7,17 +7,17 @@ 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= +All Items=所有物品 +Misc. Items=杂项 +Plant Life=植物 +Building Materials=建材 +Tools=工具 +Minerals and Metals=矿物与金属 +Environment and Worldgen=自然环境 +Lighting=光源 and = 和 -Scroll categories left= -Scroll categories right= +Scroll categories left=向左滚动分类栏 +Scroll categories right=向右滚动分类栏 Search=搜索 Reset search and display everything=重置搜索并显示所有物品 First page=第一页 @@ -32,7 +32,7 @@ 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= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=如果轻量模式被全局配置,强迫Unified Inventory以完全模式展现。 Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=设置家的位置 @@ -45,7 +45,7 @@ You don't have the settime privilege!=你没有“settime”权限! 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.= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按钮已在非创造模式中禁用以防止意外的背包清空。@n请使用垃圾桶栏。 Inventory cleared!=清空背包 Trash:=丢弃: Refill:=填满: @@ -57,13 +57,13 @@ No recipes=没有配方 No usages=没有用法 Result=结果 Ingredient=原料 -Show next recipe= -Show next usage= -Show previous recipe= -Show previous usage= -@1 (@2)= +Show next recipe=显示下一个配方 +Show next usage=显示下一个用法 +Show previous recipe=显示前一个配方 +Show previous usage=显示前一个用法 +@1 (@2)=@1 (@2) Give me:=给予: -This recipe is too@@large to be displayed.= +This recipe is too@@large to be displayed.=该配方太@@大,不能显示。 To craft grid:=填充物品到合成表 All=全部 Crafting=合成 @@ -76,10 +76,10 @@ Waypoints=航路点 Select Waypoint #@1=查询航路点 #@1 Waypoint @1=航路点 @1 Set waypoint to current location=将航路点设置到当前位置 -Hide waypoint= -Show waypoint= -Hide coordinates= -Show coordinates= +Hide waypoint=隐藏航路点 +Show waypoint=显示航路点 +Hide coordinates=隐藏坐标 +Show coordinates=显示坐标 Change color of waypoint display=改变航路点显示的颜色 Edit waypoint name=编辑航路点名称 Waypoint active=航路点已激活 diff --git a/mods/unified_inventory/locale/unified_inventory.zh_TW.tr b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr index f41190ce..536c703b 100644 --- a/mods/unified_inventory/locale/unified_inventory.zh_TW.tr +++ b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr @@ -7,17 +7,17 @@ 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= +All Items=所有物品 +Misc. Items=雜項 +Plant Life=植物 +Building Materials=建材 +Tools=工具 +Minerals and Metals=礦物與金屬 +Environment and Worldgen=自然環境 +Lighting=光源 and = 和 -Scroll categories left= -Scroll categories right= +Scroll categories left=向左滾動分類欄 +Scroll categories right=向右滾動分類欄 Search=搜索 Reset search and display everything=重置搜索並顯示所有物品 First page=第一頁 @@ -32,7 +32,7 @@ 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= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=如果輕量模式被全局配置,強迫Unified Inventory以完全模式展現。 Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=設置家的位置 @@ -45,7 +45,7 @@ You don't have the settime privilege!=你沒有“settime”權限! 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.= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按鈕已在非創造模式中禁用以防止意外的背包清空。@n請使用垃圾桶欄。 Inventory cleared!=清空揹包 Trash:=丟棄: Refill:=填滿: @@ -57,13 +57,13 @@ No recipes=沒有配方 No usages=沒有用法 Result=結果 Ingredient=原料 -Show next recipe= -Show next usage= -Show previous recipe= -Show previous usage= -@1 (@2)= +Show next recipe=顯示下一個配方 +Show next usage=顯示下一個用法 +Show previous recipe=顯示上一個配方 +Show previous usage=顯示上一個用法 +@1 (@2)=@1 (@2) Give me:=給予: -This recipe is too@@large to be displayed.= +This recipe is too@@large to be displayed.=該配方太@@大,不能顯示。 To craft grid:=填充物品到合成表 All=全部 Crafting=合成 @@ -76,10 +76,10 @@ Waypoints=航路點 Select Waypoint #@1=查詢航路點 #@1 Waypoint @1=航路點 @1 Set waypoint to current location=將航路點設置到當前位置 -Hide waypoint= -Show waypoint= -Hide coordinates= -Show coordinates= +Hide waypoint=隱藏航路點 +Show waypoint=顯示航路點 +Hide coordinates=隱藏坐標 +Show coordinates=顯示坐標 Change color of waypoint display=改變航路點顯示的顏色 Edit waypoint name=編輯航路點名稱 Waypoint active=航路點已激活 diff --git a/mods/unified_inventory/match_craft.lua b/mods/unified_inventory/match_craft.lua index 2dd40b04..b2d18ec5 100644 --- a/mods/unified_inventory/match_craft.lua +++ b/mods/unified_inventory/match_craft.lua @@ -126,25 +126,18 @@ Example output: } --]] function unified_inventory.find_usable_items(inv_items, craft_items) - local get_group = minetest.get_item_group local result = {} for craft_item in pairs(craft_items) do - local group = craft_item:match("^group:(.+)") - local found = {} + -- may specify group:type1,type2 + local items = unified_inventory.get_matching_items(craft_item) - if group ~= nil then - for inv_item in pairs(inv_items) do - if get_group(inv_item, group) > 0 then - found[inv_item] = true - end - end - else - if inv_items[craft_item] ~= nil then - found[craft_item] = true + local found = {} + for itemname, _ in pairs(items) do + if inv_items[itemname] then + found[itemname] = true end end - result[craft_item] = found end diff --git a/mods/unified_inventory/mod.conf b/mods/unified_inventory/mod.conf index 3d27d299..0f032310 100644 --- a/mods/unified_inventory/mod.conf +++ b/mods/unified_inventory/mod.conf @@ -1,6 +1,6 @@ name = unified_inventory -optional_depends = default, creative, sfinv, datastorage, farming +optional_depends = default, creative, sfinv, datastorage 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. diff --git a/mods/unified_inventory/register.lua b/mods/unified_inventory/register.lua index 8dc20f00..f2b689ec 100644 --- a/mods/unified_inventory/register.lua +++ b/mods/unified_inventory/register.lua @@ -98,7 +98,7 @@ ui.register_button("misc_set_day", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("birds", + minetest.sound_play("ui_morning", {to_player=player_name, gain = 1.0}) minetest.set_timeofday((6000 % 24000) / 24000) minetest.chat_send_player(player_name, @@ -122,7 +122,7 @@ ui.register_button("misc_set_night", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("owl", + minetest.sound_play("ui_owl", {to_player=player_name, gain = 1.0}) minetest.set_timeofday((21000 % 24000) / 24000) minetest.chat_send_player(player_name, @@ -183,14 +183,14 @@ ui.register_page("craft", { 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] = string.format("label[%f,%f;%s]", craftx + 6.35, crafty + 2.3, F(S("Trash:"))) formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) n=n + 2 end 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+1] = string.format("label[%f,%f;%s]", craftx - 2.4, crafty + 2.3, 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 @@ -207,17 +207,15 @@ ui.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.." "..wear + local displayitem = item:to_string() local selectitem = name if name:sub(1, 6) == "group:" then local group_name = name:sub(7) local group_item = ui.get_group_item(group_name) show_is_group = not group_item.sole - displayitem = group_item.item or "unknown" + displayitem = group_item.item or name selectitem = group_item.sole and displayitem or name end local label = show_is_group and "G" or "" @@ -245,6 +243,9 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item) return button end +-- The recipe text contains parameters, hence they can yet not be translated. +-- Instead, use a dummy translation call so that it can be picked up by the +-- static parsing of the translation string update script local recipe_text = { recipe = NS("Recipe @1 of @2"), usage = NS("Usage @1 of @2"), @@ -297,11 +298,10 @@ ui.register_page("craftguide", { local n = 4 + local item_def = minetest.registered_items[item_name] local item_name_shown - if minetest.registered_items[item_name] - and minetest.registered_items[item_name].description then - item_name_shown = S("@1 (@2)", - minetest.registered_items[item_name].description, item_name) + if item_def and item_def.description then + item_name_shown = S("@1 (@2)", item_def.description, item_name) else item_name_shown = item_name end @@ -326,12 +326,14 @@ ui.register_page("craftguide", { 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]" - }) + local giveme_form = + "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]" + if item_def and item_def.type ~= "tool" then + giveme_form = giveme_form .. + "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]" + end if not craft then -- No craft recipes available for this item. diff --git a/mods/unified_inventory/screenshot.png b/mods/unified_inventory/screenshot.png index 972cbb46..bf9e6be3 100644 Binary files a/mods/unified_inventory/screenshot.png and b/mods/unified_inventory/screenshot.png differ diff --git a/mods/unified_inventory/settingtypes.txt b/mods/unified_inventory/settingtypes.txt index 27768ac2..6f04aeae 100644 --- a/mods/unified_inventory/settingtypes.txt +++ b/mods/unified_inventory/settingtypes.txt @@ -1,14 +1,36 @@ -#Enabling lite mode enables a smaller and simpler version of the Unified -#Inventory, optimized for small displays. +# Reduced formspec layout, optimized for smaller displays. +# Note: This may also disable some features to free up visual space. unified_inventory_lite (Lite mode) bool false -#If enabled, bags will be made available which can be used to extend -#inventory storage size. +# Provides craftable bag items to extend the inventory space. unified_inventory_bags (Enable bags) bool true -#If enabled, the trash slot can be used by those without both creative -#and the give privilege. +# Shows the trash slot to everyone. +# When disabled, only players with the privilege "creative" or "give" will +# have this slot shown in their inventory. unified_inventory_trash (Enable trash) bool true +# Provides waypoints on a per-player basis to remember positions on the map. +unified_inventory_waypoints (Enable waypoints) bool true -unified_inventory_automatic_categorization (Items automatically added to categories) bool true \ No newline at end of file +# If enabled, disabled buttons will be hidden instead of grayed out. +unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false + +# Hides items with no known craft recipe from the category "all" (default). +# This setting has no effect on players in creative mode. +unified_inventory_hide_uncraftable_items (Hide uncraftable items) bool false + +# Automatically categorizes registered items based on their +# groups. This is based on a fuzzy match, thus is not 100% accurate. +unified_inventory_automatic_categorization (Categories: add items automatically) bool true + +# Shows the selected wielded item description in the HUD for a few seconds. +unified_inventory_item_names (Enable HUD item names) bool true + +# Trims the shown wielded item description to the first line. +unified_inventory_only_names (HUD item name: first line only) bool true + +# Hard character limit of the wielded item description. +# Crops the shown description to the specified length. +# 0 disables this functionality. +unified_inventory_max_item_name_length (HUD item names: character limit) int 80 diff --git a/mods/unified_inventory/sounds/birds.ogg b/mods/unified_inventory/sounds/birds.ogg deleted file mode 100644 index 4a933954..00000000 Binary files a/mods/unified_inventory/sounds/birds.ogg and /dev/null differ diff --git a/mods/unified_inventory/sounds/owl.ogg b/mods/unified_inventory/sounds/owl.ogg deleted file mode 100644 index f30d0b3c..00000000 Binary files a/mods/unified_inventory/sounds/owl.ogg and /dev/null differ diff --git a/mods/unified_inventory/sounds/ui_click.ogg b/mods/unified_inventory/sounds/ui_click.ogg new file mode 100644 index 00000000..0c9fe31b Binary files /dev/null and b/mods/unified_inventory/sounds/ui_click.ogg differ diff --git a/mods/unified_inventory/sounds/ui_morning.ogg b/mods/unified_inventory/sounds/ui_morning.ogg new file mode 100644 index 00000000..7fb8c22b Binary files /dev/null and b/mods/unified_inventory/sounds/ui_morning.ogg differ diff --git a/mods/unified_inventory/sounds/ui_owl.ogg b/mods/unified_inventory/sounds/ui_owl.ogg new file mode 100644 index 00000000..a1433f9e Binary files /dev/null and b/mods/unified_inventory/sounds/ui_owl.ogg differ diff --git a/mods/unified_inventory/textures/ui_formbg_9_sliced.png b/mods/unified_inventory/textures/ui_formbg_9_sliced.png index 0b8463ca..817ced5e 100644 Binary files a/mods/unified_inventory/textures/ui_formbg_9_sliced.png and b/mods/unified_inventory/textures/ui_formbg_9_sliced.png differ diff --git a/mods/unified_inventory/textures/ui_smallbg_9_sliced.png b/mods/unified_inventory/textures/ui_smallbg_9_sliced.png index 865e0c96..916b1463 100644 Binary files a/mods/unified_inventory/textures/ui_smallbg_9_sliced.png and b/mods/unified_inventory/textures/ui_smallbg_9_sliced.png differ diff --git a/mods/unified_inventory/textures/ui_teleport.png b/mods/unified_inventory/textures/ui_teleport.png new file mode 100644 index 00000000..8ea5d203 Binary files /dev/null and b/mods/unified_inventory/textures/ui_teleport.png differ diff --git a/mods/unified_inventory/waypoints.lua b/mods/unified_inventory/waypoints.lua index 1496cdd5..8fdd8014 100644 --- a/mods/unified_inventory/waypoints.lua +++ b/mods/unified_inventory/waypoints.lua @@ -103,7 +103,7 @@ local function get_waypoint_data(player) end ui.register_page("waypoints", { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) 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 @@ -115,12 +115,16 @@ ui.register_page("waypoints", { local sel = waypoints.selected or 1 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 + local n=3 + + if not perplayer_formspec.is_lite_mode then + formspec[n] = ui.style_full.standard_inv_bg + n = n + 1 + end -- Tabs buttons: for i = 1, COUNT do @@ -140,36 +144,49 @@ ui.register_page("waypoints", { -- Main buttons: local btnlist = { - set_waypoint = { - "ui_waypoint_set_icon.png", - S("Set waypoint to current location") - }, - toggle_waypoint = { + -- 1. formspec name + -- 2. button image + -- 3. translation text + { + "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 = { + { + "rename_waypoint", + "ui_pencil_icon.png", + S("Edit waypoint name") + }, + { + "set_waypoint", + "ui_waypoint_set_icon.png", + S("Set waypoint to current location") + }, + { + "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 = { + { + "toggle_color", "ui_circular_arrows_icon.png", S("Change color of waypoint display") }, - rename_waypoint = { - "ui_pencil_icon.png", - S("Edit waypoint name") - } } + if minetest.get_player_privs(player_name).teleport then + table.insert(btnlist, { + "teleport_waypoint", + "ui_teleport.png", + S("Teleport to waypoint") + }) + end - local x = 4 - for name, def in pairs(btnlist) do + for i, 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, + wp_buttons_rj + ui.style_full.btn_spc * (i - #btnlist), 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 + def[2], def[1], sel) + formspec[n+1] = "tooltip["..def[1]..sel..";"..F(def[3]).."]" n = n + 2 end @@ -199,7 +216,10 @@ ui.register_page("waypoints", { 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=table.concat(formspec)} + return { + formspec = table.concat(formspec), + draw_inventory = not perplayer_formspec.is_lite_mode, + } end, }) @@ -207,7 +227,6 @@ ui.register_button("waypoints", { type = "image", image = "ui_waypoints_icon.png", tooltip = S("Waypoints"), - hide_lite=true }) local function update_hud(player, waypoints, temp, i) @@ -313,6 +332,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) update_formspec = true end + if fields["teleport_waypoint" .. i] and waypoint.world_pos then + if minetest.get_player_privs(player_name).teleport then + minetest.sound_play("teleport", {to_player = player_name}) + player:set_pos(waypoint.world_pos) + end + end + if hit then -- Save first waypoints.data[i] = waypoint @@ -323,6 +349,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) update_hud(player, waypoints, temp, i) end if update_formspec then + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) ui.set_inventory_formspec(player, "waypoints") end diff --git a/mods/unifiedbricks/.luacheckrc b/mods/unifiedbricks/.luacheckrc new file mode 100644 index 00000000..1036838c --- /dev/null +++ b/mods/unifiedbricks/.luacheckrc @@ -0,0 +1,9 @@ +read_globals = { + "minetest", + "unifieddyes", + "default" +} + +globals = { + "unifiedbricks" +} \ No newline at end of file diff --git a/mods/unifiedbricks/depends.txt b/mods/unifiedbricks/depends.txt deleted file mode 100644 index 7274ef6c..00000000 --- a/mods/unifiedbricks/depends.txt +++ /dev/null @@ -1,4 +0,0 @@ -default -bucket -unifieddyes -vessels diff --git a/mods/unifiedbricks/description.txt b/mods/unifiedbricks/description.txt deleted file mode 100644 index e6c198ab..00000000 --- a/mods/unifiedbricks/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod allows the user to re-color default bricks using Unified Dyes, and provides some pattern variations as well. diff --git a/mods/unifiedbricks/init.lua b/mods/unifiedbricks/init.lua index de71175f..6ecd2581 100644 --- a/mods/unifiedbricks/init.lua +++ b/mods/unifiedbricks/init.lua @@ -16,7 +16,7 @@ minetest.register_alias("unifieddyes:lightgrey","unifieddyes:lightgrey_paint") minetest.register_alias("unifieddyes:grey","unifieddyes:grey_paint") minetest.register_alias("unifieddyes:darkgrey","unifieddyes:darkgrey_paint") -HUES = { +local HUES = { "red", "orange", "yellow", @@ -35,25 +35,18 @@ HUES = { "lightgrey", "white" } -TYPES = { - "clayblock_", - "clay_", - "brick_", - "brickblock_", - "multicolor_" -} -SATURATION = { +local SATURATION = { "_s50", "" } -DARKNESS = { +local DARKNESS = { "dark_", "medium_", "", "light_" } --formal versions -FORMALHUES = { +local FORMALHUES = { "Red", "Orange", "Yellow", @@ -72,18 +65,11 @@ FORMALHUES = { "Light grey", "White" } -FORMALTYPES = { - " clay", - " clay lump", - " brick", - " bricks", - " multicolor bricks" -} -FORMALSATURATION = { +local FORMALSATURATION = { " (low saturation)", "" } -FORMALDARKNESS = { +local FORMALDARKNESS = { "Dark ", "Medium ", "Bright ", @@ -103,7 +89,7 @@ minetest.register_node("unifiedbricks:brickblock", { paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, not_in_creative_inventory=1, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -123,7 +109,7 @@ minetest.register_node("unifiedbricks:clayblock", { }, paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - is_ground_content = true, + is_ground_content = false, groups = {crumbly=3, not_in_creative_inventory=1, ud_param2_colorable = 1}, sounds = default.node_sound_dirt_defaults({ footstep = "", @@ -144,12 +130,12 @@ minetest.register_node("unifiedbricks:brickblock_multicolor_dark", { "unifiedbricks_brickblock_multicolor_dark.png", }, overlay_tiles = { - { name = "unifiedbricks_mortar2.png", color = "white" } + { name = "unifiedbricks_mortar.png", color = "white" } }, paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -162,12 +148,12 @@ minetest.register_node("unifiedbricks:brickblock_multicolor_medium", { "unifiedbricks_brickblock_multicolor_medium.png" }, overlay_tiles = { - { name = "unifiedbricks_mortar3.png", color = "white" } + { name = "unifiedbricks_mortar.png", color = "white" } }, paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -180,12 +166,12 @@ minetest.register_node("unifiedbricks:brickblock_multicolor_light", { "unifiedbricks_brickblock_multicolor_light.png" }, overlay_tiles = { - { name = "unifiedbricks_mortar4.png", color = "white" } + { name = "unifiedbricks_mortar.png", color = "white" } }, paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", - is_ground_content = true, + is_ground_content = false, groups = {cracky=3, ud_param2_colorable = 1}, sounds = default.node_sound_stone_defaults(), on_construct = unifieddyes.on_construct, @@ -301,8 +287,8 @@ table.insert(unifiedbricks.old_static_list, "unifiedbricks:multicolor_lightgrey" for i = 1,17 do for j = 1,4 do if i > 12 then - formalname = FORMALHUES[i] - name = HUES[i] + local formalname = FORMALHUES[i] + local name = HUES[i] if j == 1 then unifiedbricks.register_old_static_block(name, formalname, "clayblock") elseif j == 4 then @@ -310,6 +296,7 @@ for i = 1,17 do end else for k = 1,4 do + local formalname, name if k == 4 then formalname = FORMALDARKNESS[k] .. FORMALHUES[i] name = DARKNESS[k] .. HUES[i] diff --git a/mods/unifiedbricks/mod.conf b/mods/unifiedbricks/mod.conf index 266e0dc8..a52de5a7 100644 --- a/mods/unifiedbricks/mod.conf +++ b/mods/unifiedbricks/mod.conf @@ -1 +1,3 @@ name = unifiedbricks +description = This mod allows the user to re-color default bricks using Unified Dyes, and provides some pattern variations as well. +depends = default, bucket, unifieddyes, vessels diff --git a/mods/unifiedbricks/textures/unifiedbricks_brickblock.png b/mods/unifiedbricks/textures/unifiedbricks_brickblock.png index 811ed60f..8e9b49b0 100644 Binary files a/mods/unifiedbricks/textures/unifiedbricks_brickblock.png and b/mods/unifiedbricks/textures/unifiedbricks_brickblock.png differ diff --git a/mods/unifiedbricks/textures/unifiedbricks_clayblock.png b/mods/unifiedbricks/textures/unifiedbricks_clayblock.png index 91876844..ee3c7d45 100644 Binary files a/mods/unifiedbricks/textures/unifiedbricks_clayblock.png and b/mods/unifiedbricks/textures/unifiedbricks_clayblock.png differ diff --git a/mods/unifiedbricks/textures/unifiedbricks_mortar.png b/mods/unifiedbricks/textures/unifiedbricks_mortar.png index 6d523356..2209987a 100644 Binary files a/mods/unifiedbricks/textures/unifiedbricks_mortar.png and b/mods/unifiedbricks/textures/unifiedbricks_mortar.png differ diff --git a/mods/unifiedbricks/textures/unifiedbricks_mortar2.png b/mods/unifiedbricks/textures/unifiedbricks_mortar2.png deleted file mode 100644 index 6d523356..00000000 Binary files a/mods/unifiedbricks/textures/unifiedbricks_mortar2.png and /dev/null differ diff --git a/mods/unifiedbricks/textures/unifiedbricks_mortar3.png b/mods/unifiedbricks/textures/unifiedbricks_mortar3.png deleted file mode 100644 index 6d523356..00000000 Binary files a/mods/unifiedbricks/textures/unifiedbricks_mortar3.png and /dev/null differ diff --git a/mods/unifiedbricks/textures/unifiedbricks_mortar4.png b/mods/unifiedbricks/textures/unifiedbricks_mortar4.png deleted file mode 100644 index 6d523356..00000000 Binary files a/mods/unifiedbricks/textures/unifiedbricks_mortar4.png and /dev/null differ diff --git a/mods/unifieddyes/.luacheckrc b/mods/unifieddyes/.luacheckrc new file mode 100644 index 00000000..a90b0663 --- /dev/null +++ b/mods/unifieddyes/.luacheckrc @@ -0,0 +1,25 @@ +unused_args = false +allow_defined_top = true + +exclude_files = {".luacheckrc"} + +globals = { + "minetest", "core", + + --mod provided + "unifieddyes", +} + +read_globals = { + string = {fields = {"split"}}, + table = {fields = {"copy", "getn"}}, + + --luac + "math", "table", + + -- Builtin + "vector", "ItemStack", "dump", "DIR_DELIM", "VoxelArea", "Settings", "PcgRandom", "VoxelManip", "PseudoRandom", + + --mod produced + +} \ No newline at end of file diff --git a/mods/unifieddyes/README.md b/mods/unifieddyes/README.md index 44ddbb2e..fc75cb09 100644 --- a/mods/unifieddyes/README.md +++ b/mods/unifieddyes/README.md @@ -13,4 +13,4 @@ Install: Unzip the distribution file, rename the resultant folder to just "unifi Usage: for detailed usage information, please see [the Unified Dyes Thread](https://forum.minetest.net/viewtopic.php?f=11&t=2178&p=28399) on the Minetest forum. -API: the full API is documented here: https://github.com/minetest-mods/unifieddyes/blob/master/API.md +API: the full API is documented here: https://github.com/mt-mods/unifieddyes/blob/master/API.md diff --git a/mods/unifieddyes/airbrush.lua b/mods/unifieddyes/airbrush.lua index 262ca24a..cc143a94 100644 --- a/mods/unifieddyes/airbrush.lua +++ b/mods/unifieddyes/airbrush.lua @@ -49,7 +49,7 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) return end - local palette = nil + local palette local fdir = 0 if not def or not def.palette then minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.") @@ -71,12 +71,15 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) local idx, hue = unifieddyes.getpaletteidx(painting_with, palette) local inv = player:get_inventory() - if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then + if (not minetest.is_creative_enabled(player_name)) and not inv:contains_item("main", painting_with) then local suff = "" if not idx then suff = " Besides, "..string.sub(painting_with, 5).." can't be applied to that node." end - minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff) + minetest.chat_send_player( + player_name, + "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff + ) return end @@ -92,8 +95,8 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) local modname = string.sub(name, 1, string.find(name, ":")-1) local nodename2 = string.sub(name, string.find(name, ":")+1) - local oldcolor = "snozzberry" - local newcolor = "razzberry" -- intentionally misspelled ;-) + local oldcolor + local newcolor if def.ud_color_start and def.ud_color_end then oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end) @@ -123,7 +126,7 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) return end minetest.swap_node(pos, {name = name, param2 = fdir + idx}) - if not creative or not creative.is_enabled_for(player_name) then + if not minetest.is_creative_enabled(player_name) then inv:remove_item("main", painting_with) return end @@ -144,7 +147,7 @@ function unifieddyes.make_readable_color(color) local s = string.gsub(color, "_s50", "") -- replace underscores with spaces to make it look nicer - local s = string.gsub(s, "_", " ") + s = string.gsub(s, "_", " ") -- capitalize words, you know, looks nicer ;) s = string.gsub(s, "(%l)(%w*)", function(a,b) return string.upper(a)..b end) @@ -160,7 +163,8 @@ function unifieddyes.make_readable_color(color) return s end -function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) +function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, + selindic, inv, explist) local dye = "dye:"..colorname @@ -216,7 +220,7 @@ function unifieddyes.show_airbrush_form(player) local player_name = player:get_player_name() local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name] - local creative = creative and creative.is_enabled_for(player_name) + local creative = minetest.is_creative_enabled(player_name) local inv = player:get_inventory() local nodepalette = "extended" local showall = unifieddyes.player_showall[player_name] @@ -280,7 +284,8 @@ function unifieddyes.show_airbrush_form(player) local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) local f - f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, + hp, v2, selindic, inv, explist) t[#t+1] = f end @@ -313,7 +318,8 @@ function unifieddyes.show_airbrush_form(player) local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) local f - f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, + nodepalette, hp, v2, selindic, inv, explist) t[#t+1] = f end end @@ -327,7 +333,7 @@ function unifieddyes.show_airbrush_form(player) local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) local grey = "grey_"..y - if y == 0 then grey = "black" + if y == 0 then grey = "black" elseif y == 4 then grey = "dark_grey" elseif y == 8 then grey = "grey" elseif y == 11 then grey = "light_grey" @@ -335,7 +341,8 @@ function unifieddyes.show_airbrush_form(player) end local f - f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, + selindic, inv, explist) t[#t+1] = f end @@ -412,11 +419,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - if fields.show_all then + if fields.show_all then unifieddyes.player_showall[player_name] = true unifieddyes.show_airbrush_form(player) return - elseif fields.show_avail then + elseif fields.show_avail then unifieddyes.player_showall[player_name] = false unifieddyes.show_airbrush_form(player) return @@ -431,7 +438,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the") minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).") if unifieddyes.player_current_dye[player_name] then - minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".") + minetest.chat_send_player(player_name, "*** Ignoring it and sticking with " + ..string.sub(unifieddyes.player_current_dye[player_name], 5)..".") else minetest.chat_send_player(player_name, "*** Ignoring it.") end @@ -447,16 +455,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end else - local s1 = string.sub(minetest.serialize(fields), 11) - local s3 = string.sub(s1,1, string.find(s1, '"')-1) + local color, _ = next(fields) local inv = player:get_inventory() - local creative = creative and creative.is_enabled_for(player_name) - local dye = "dye:"..s3 + local creative = minetest.is_creative_enabled(player_name) + local dye = "dye:"..color - if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and - (minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then - unifieddyes.player_selected_dye[player_name] = dye + if (showall or unifieddyes.palette_has_color[nodepalette.."_"..color]) and + (creative or inv:contains_item("main", dye)) then + unifieddyes.player_selected_dye[player_name] = dye unifieddyes.show_airbrush_form(player) end end @@ -482,6 +489,10 @@ minetest.register_tool("unifieddyes:airbrush", { if pos then node = minetest.get_node(pos) end if node then def = minetest.registered_items[node.name] end + if keys.sneak and def and def.on_rightclick then + return def.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def} if not keys.aux1 then @@ -492,12 +503,10 @@ minetest.register_tool("unifieddyes:airbrush", { if newcolor and string.find(def.paramtype2, "color") then minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.") - unifieddyes.player_current_dye[player_name] = "dye:"..newcolor + unifieddyes.player_current_dye[player_name] = "dye:"..newcolor else minetest.chat_send_player(player_name, "*** That node is uncolored.") end - elseif def.on_rightclick then - return def.on_rightclick(pos, node, placer, itemstack, pointed_thing) end end }) diff --git a/mods/unifieddyes/aliases.lua b/mods/unifieddyes/aliases.lua index 785eb588..8259d1ed 100644 --- a/mods/unifieddyes/aliases.lua +++ b/mods/unifieddyes/aliases.lua @@ -1,5 +1,7 @@ -minetest.register_alias("dye:light_red", "dye:pink") -minetest.register_alias("dye:medium_orange", "dye:brown") +if minetest.get_modpath("dye") then + minetest.register_alias("dye:light_red", "dye:pink") + minetest.register_alias("dye:medium_orange", "dye:brown") +end minetest.register_alias("unifieddyes:black", "dye:black") minetest.register_alias("unifieddyes:dark_grey", "dye:dark_grey") diff --git a/mods/unifieddyes/api.lua b/mods/unifieddyes/api.lua index 8b4eb14f..01a182a9 100644 --- a/mods/unifieddyes/api.lua +++ b/mods/unifieddyes/api.lua @@ -1,7 +1,5 @@ -- This file supplies the majority of Unified Dyes' API -local S = minetest.get_translator("unifieddyes") - unifieddyes.player_current_dye = {} unifieddyes.player_selected_dye = {} unifieddyes.player_last_right_clicked = {} @@ -23,11 +21,14 @@ minetest.register_on_placenode( return false end - local param2 if not string.find(itemstack:to_string(), "palette_index") then + local param2 + local color = 0 + if def.palette == "unifieddyes_palette_extended.png" and def.paramtype2 == "color" then param2 = 240 + color = 240 elseif def.palette == "unifieddyes_palette_colorwallmounted.png" and def.paramtype2 == "colorwallmounted" then param2 = newnode.param2 % 8 @@ -38,55 +39,135 @@ minetest.register_on_placenode( if param2 then minetest.swap_node(pos, {name = newnode.name, param2 = param2}) + minetest.get_meta(pos):set_int("palette_index", color) end end - - if def.palette ~= "" then - minetest.get_meta(pos):set_int("palette_index", param2 or 240) - end end ) --- The complementary function: strip-off the color if the node being dug is still white/neutral +-- The complementary function: strip-off the color if the node being dug is still white/neutral +-- adapted from +-- https://github.com/minetest/minetest/blob/fe8d04d0b3c2e3af7c406fb6527f1b5230a30137/builtin/game/item.lua#L460-L562 +local function node_dig_without_color(pos, node, digger) + if not digger then return false end + local diggername = digger:get_player_name() -local function move_item(item, pos, inv, digger, fix_color) - if not (digger and digger:is_player()) then return end - local creative = creative_mode or minetest.check_player_privs(digger, "creative") - item = unifieddyes.fix_bad_color_info(item, fix_color) - if inv:room_for_item("main", item) - and (not creative or not inv:contains_item("main", item, true)) then - inv:add_item("main", item) - elseif not creative then - minetest.item_drop(ItemStack(item), digger, pos) + local def = ItemStack(node.name):get_definition() + -- Copy pos because the callback could modify it + if not def.diggable or (def.can_dig and not def.can_dig(vector.copy(pos), digger)) then + minetest.log("info", diggername .. " tried to dig " + .. node.name .. " which is not diggable " + .. minetest.pos_to_string(pos)) + return false end + + if minetest.is_protected(pos, diggername) then + minetest.log("action", diggername + .. " tried to dig " .. node.name + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, diggername) + return false + end + + minetest.log('action', diggername .. " digs " + .. node.name .. " at " .. minetest.pos_to_string(pos)) + + local wielded = digger and digger:get_wielded_item() + local drops = {node.name} -- this is instead of asking minetest to generate the node drops + + if wielded then + local wdef = wielded:get_definition() + local tp = wielded:get_tool_capabilities() + local dp = minetest.get_dig_params(def and def.groups, tp, wielded:get_wear()) + if wdef and wdef.after_use then + wielded = wdef.after_use(wielded, digger, node, dp) or wielded + else + -- Wear out tool + if not minetest.is_creative_enabled(diggername) then + wielded:add_wear(dp.wear) + if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + end + end + end + digger:set_wielded_item(wielded) + end + + -- Check to see if metadata should be preserved. + if def and def.preserve_metadata then + local oldmeta = minetest.get_meta(pos):to_table().fields + -- Copy pos and node because the callback can modify them. + local pos_copy = vector.copy(pos) + local node_copy = { name = node.name, param1 = node.param1, param2 = node.param2 } + local drop_stacks = {} + for k, v in pairs(drops) do + drop_stacks[k] = ItemStack(v) + end + drops = drop_stacks + def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) + end + + -- Handle drops + minetest.handle_node_drops(pos, drops, digger) + + local oldmetadata + if def and def.after_dig_node then + oldmetadata = minetest.get_meta(pos):to_table() + end + + -- Remove node and update minetest.remove_node(pos) + + -- Play sound if it was done by a player + if diggername ~= "" and def and def.sounds and def.sounds.dug then + minetest.sound_play(def.sounds.dug, { + pos = pos, + exclude_player = diggername, + }, true) + end + + -- Run callback + if def and def.after_dig_node then + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = { name = node.name, param1 = node.param1, param2 = node.param2 } + def.after_dig_node(pos_copy, node_copy, oldmetadata, digger) + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_dignodes) do + local origin = minetest.callback_origins[callback] + minetest.set_last_run_mod(origin.mod) + + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = { name = node.name, param1 = node.param1, param2 = node.param2 } + callback(pos_copy, node_copy, digger) + end + + return true end function unifieddyes.on_dig(pos, node, digger) - if not digger then return end - local playername = digger:get_player_name() - if minetest.is_protected(pos, playername) then - minetest.record_protection_violation(pos, playername) - return - end - - local oldparam2 = minetest.get_node(pos).param2 + local param2 = minetest.get_node(pos).param2 local def = minetest.registered_items[node.name] - local fix_color + local del_color - if def.paramtype2 == "color" and oldparam2 == 240 and def.palette == "unifieddyes_palette_extended.png" then - fix_color = 240 - elseif def.paramtype2 == "color" and oldparam2 == 0 and def.palette == "unifieddyes_palette_extended.png" then - fix_color = 0 - elseif def.paramtype2 == "colorwallmounted" and math.floor(oldparam2 / 8) == 0 and def.palette == "unifieddyes_palette_colorwallmounted.png" then - fix_color = 0 - elseif def.paramtype2 == "colorfacedir" and math.floor(oldparam2 / 32) == 0 and string.find(def.palette, "unifieddyes_palette_") then - fix_color = 0 + if def.paramtype2 == "color" and param2 == 240 and def.palette == "unifieddyes_palette_extended.png" then + del_color = true + elseif (def.paramtype2 == "colorwallmounted" or def.paramtype2 == "colorfacedir") + and minetest.strip_param2_color(param2, def.paramtype2) == 0 + and string.find(def.palette, "unifieddyes_palette_") + then + del_color = true end - local inv = digger:get_inventory() - if fix_color then - move_item(node.name, pos, inv, digger, fix_color) + if del_color then + return node_dig_without_color(pos, node, digger) else return minetest.node_dig(pos, node, digger) end @@ -117,6 +198,7 @@ function unifieddyes.generate_split_palette_nodes(name, def, drop) def2.palette = "unifieddyes_palette_"..color.."s.png" def2.paramtype2 = "colorfacedir" def2.groups.ud_param2_colorable = 1 + def2.is_ground_content = false if drop then def2.drop = { @@ -132,14 +214,11 @@ end -- This helper function creates a colored itemstack -function unifieddyes.fix_bad_color_info(item, paletteidx) - local stack=minetest.itemstring_with_color(item, paletteidx) - return string.gsub(stack, "u0001color", "u0001palette_index") -end - function unifieddyes.make_colored_itemstack(item, palette, color) local paletteidx = unifieddyes.getpaletteidx(color, palette) - return unifieddyes.fix_bad_color_info(item, paletteidx), paletteidx + local stack = ItemStack(item) + stack:get_meta():set_int("palette_index", paletteidx) + return stack:to_string(),paletteidx end -- these helper functions register all of the recipes needed to create colored @@ -147,7 +226,7 @@ end local function register_c(craft, h, sat, val) local hue = (type(h) == "table") and h[1] or h - local color = "" + local color if val then if craft.palette == "wallmounted" then color = val..hue..sat @@ -288,9 +367,9 @@ end function unifieddyes.get_hsv(name) -- expects a node/item name local hue = "" - local a,b + local a for _, i in ipairs(unifieddyes.HUES_EXTENDED) do - a,b = string.find(name, "_"..i[1]) + a,_ = string.find(name, "_"..i[1]) if a then hue = i[1] break @@ -328,8 +407,6 @@ end function unifieddyes.getpaletteidx(color, palette_type) - local origcolor = color - if string.sub(color,1,4) == "dye:" then color = string.sub(color,5,-1) elseif string.sub(color,1,12) == "unifieddyes:" then @@ -383,7 +460,8 @@ function unifieddyes.getpaletteidx(color, palette_type) elseif color == "pink" then return 56,7 elseif color == "blue" and shade == "light" then return 40,5 elseif unifieddyes.gpidx_hues_wallmounted[color] and unifieddyes.gpidx_shades_wallmounted[shade] then - return (unifieddyes.gpidx_shades_wallmounted[shade] * 64 + unifieddyes.gpidx_hues_wallmounted[color] * 8), unifieddyes.gpidx_hues_wallmounted[color] + return (unifieddyes.gpidx_shades_wallmounted[shade] * 64 + unifieddyes.gpidx_hues_wallmounted[color] * 8), + unifieddyes.gpidx_hues_wallmounted[color] end else if color == "brown" then @@ -399,7 +477,8 @@ function unifieddyes.getpaletteidx(color, palette_type) end elseif palette_type == "extended" then if unifieddyes.gpidx_hues_extended[color] and unifieddyes.gpidx_shades_extended[shade] then - return (unifieddyes.gpidx_hues_extended[color] + unifieddyes.gpidx_shades_extended[shade]*24), unifieddyes.gpidx_hues_extended[color] + return (unifieddyes.gpidx_hues_extended[color] + unifieddyes.gpidx_shades_extended[shade]*24), + unifieddyes.gpidx_hues_extended[color] end end end @@ -427,7 +506,7 @@ function unifieddyes.color_to_name(param2, def) local color = param2 local v = 0 - local s = 1 + local s = 1 if color < 24 then v = 1 elseif color > 23 and color < 48 then v = 2 elseif color > 47 and color < 72 then v = 3 @@ -445,7 +524,7 @@ function unifieddyes.color_to_name(param2, def) elseif color == 244 then return "light_grey" elseif color == 247 then return "grey" elseif color == 251 then return "dark_grey" - elseif color == 255 then return "black" + elseif color == 255 then return "black" else return "grey_"..15-(color-240) end else diff --git a/mods/unifieddyes/color-tables.lua b/mods/unifieddyes/color-tables.lua index 12eaa325..f20fe414 100644 --- a/mods/unifieddyes/color-tables.lua +++ b/mods/unifieddyes/color-tables.lua @@ -91,24 +91,6 @@ for i = 1, 14 do end end -local default_dyes = { - "black", - "blue", - "brown", - "cyan", - "dark_green", - "dark_grey", - "green", - "grey", - "magenta", - "orange", - "pink", - "red", - "violet", - "white", - "yellow" -} - -- reverse lookups for getpaletteidx() unifieddyes.gpidx_aliases = { diff --git a/mods/unifieddyes/dyes-crafting.lua b/mods/unifieddyes/dyes-crafting.lua index 2c11c41b..9d8c8bfd 100644 --- a/mods/unifieddyes/dyes-crafting.lua +++ b/mods/unifieddyes/dyes-crafting.lua @@ -56,11 +56,11 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do local g3 = math.floor(p+(g2-p)*0.5) local b3 = math.floor(p+(b2-p)*0.5) - local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) + local ccolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) minetest.register_craftitem(":dye:"..val..hue.."_s50", { description = S(desc.." (low saturation)"), - inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", + inventory_image = "unifieddyes_dye.png^[colorize:#"..ccolor..":200", groups = { dye=1, not_in_creative_inventory=1 }, }) minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50") @@ -87,19 +87,21 @@ for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes end end -minetest.override_item("dye:grey", { - inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", -}) +if minetest.get_modpath("dye") then + minetest.override_item("dye:grey", { + inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", + }) -minetest.override_item("dye:dark_grey", { - inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", -}) + minetest.override_item("dye:dark_grey", { + inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", + }) -minetest.register_craftitem(":dye:light_grey", { - description = S("Light grey Dye"), - inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", - groups = { dye=1, not_in_creative_inventory=1 }, -}) + minetest.register_craftitem(":dye:light_grey", { + description = S("Light grey Dye"), + inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", + groups = { dye=1, not_in_creative_inventory=1 }, + }) +end -- build a table of color <-> palette associations to reduce the need for -- realtime lookups with getpaletteidx() @@ -122,7 +124,7 @@ for _, palette in ipairs({"extended", "split", "wallmounted"}) do for y = 0, 15 do local grey = "grey_"..y - if y == 0 then grey = "black" + if y == 0 then grey = "black" elseif y == 4 then grey = "dark_grey" elseif y == 8 then grey = "grey" elseif y == 11 then grey = "light_grey" diff --git a/mods/unifieddyes/init.lua b/mods/unifieddyes/init.lua index a8e5092b..8ac3d956 100644 --- a/mods/unifieddyes/init.lua +++ b/mods/unifieddyes/init.lua @@ -31,9 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc., unifieddyes = {} -local creative_mode = minetest.settings:get_bool("creative_mode") - -local S = minetest.get_translator("unifieddyes") local modpath=minetest.get_modpath(minetest.get_current_modname()) dofile(modpath.."/color-tables.lua") @@ -42,4 +39,5 @@ dofile(modpath.."/airbrush.lua") dofile(modpath.."/dyes-crafting.lua") dofile(modpath.."/aliases.lua") -print(S("[UnifiedDyes] Loaded!")) +print("[UnifiedDyes] Loaded!") +unifieddyes.init = true \ No newline at end of file diff --git a/mods/unifieddyes/locale/template.txt b/mods/unifieddyes/locale/template.txt index d7931162..24513530 100644 --- a/mods/unifieddyes/locale/template.txt +++ b/mods/unifieddyes/locale/template.txt @@ -2,91 +2,91 @@ # Template -Lime Dye= -Aqua Dye= -Sky-blue Dye= -Red-violet Dye= -Light Grey Dye= +Lime Dye= +Aqua Dye= +Sky-blue Dye= +Red-violet Dye= +Light Grey Dye= -Dark Red Dye (low saturation)= -Dark Orange Dye (low saturation)= -Dark Yellow Dye (low saturation)= -Dark Lime Dye (low saturation)= -Dark Green Dye (low saturation)= -Dark Aqua Dye (low saturation)= -Dark Cyan Dye (low saturation)= -Dark Sky-blue Dye (low saturation)= -Dark Blue Dye (low saturation)= -Dark Violet Dye (low saturation)= -Dark Magenta Dye (low saturation)= -Dark Red-violet Dye (low saturation)= +Dark Red Dye (low saturation)= +Dark Orange Dye (low saturation)= +Dark Yellow Dye (low saturation)= +Dark Lime Dye (low saturation)= +Dark Green Dye (low saturation)= +Dark Aqua Dye (low saturation)= +Dark Cyan Dye (low saturation)= +Dark Sky-blue Dye (low saturation)= +Dark Blue Dye (low saturation)= +Dark Violet Dye (low saturation)= +Dark Magenta Dye (low saturation)= +Dark Red-violet Dye (low saturation)= -Dark Red Dye= -Dark Orange Dye= -Dark Yellow Dye= -Dark Lime Dye= -Dark Green Dye= -Dark Aqua Dye= -Dark Cyan Dye= -Dark Sky-blue Dye= -Dark Blue Dye= -Dark Violet Dye= -Dark Magenta Dye= -Dark Red-violet Dye= +Dark Red Dye= +Dark Orange Dye= +Dark Yellow Dye= +Dark Lime Dye= +Dark Green Dye= +Dark Aqua Dye= +Dark Cyan Dye= +Dark Sky-blue Dye= +Dark Blue Dye= +Dark Violet Dye= +Dark Magenta Dye= +Dark Red-violet Dye= -Medium Red Dye (low saturation)= -Medium Orange Dye (low saturation)= -Medium Yellow Dye (low saturation)= -Medium Lime Dye (low saturation)= -Medium Green Dye (low saturation)= -Medium Aqua Dye (low saturation)= -Medium Cyan Dye (low saturation)= -Medium Sky-blue Dye (low saturation)= -Medium Blue Dye (low saturation)= -Medium Violet Dye (low saturation)= -Medium Magenta Dye (low saturation)= -Medium Red-violet Dye (low saturation)= +Medium Red Dye (low saturation)= +Medium Orange Dye (low saturation)= +Medium Yellow Dye (low saturation)= +Medium Lime Dye (low saturation)= +Medium Green Dye (low saturation)= +Medium Aqua Dye (low saturation)= +Medium Cyan Dye (low saturation)= +Medium Sky-blue Dye (low saturation)= +Medium Blue Dye (low saturation)= +Medium Violet Dye (low saturation)= +Medium Magenta Dye (low saturation)= +Medium Red-violet Dye (low saturation)= -Medium Red Dye= -Medium Orange Dye= -Medium Yellow Dye= -Medium Lime Dye= -Medium Green Dye= -Medium Aqua Dye= -Medium Cyan Dye= -Medium Sky-blue= -Medium Blue Dye= -Medium Violet Dye= -Medium Magenta Dye= -Medium Red-violet Dye= +Medium Red Dye= +Medium Orange Dye= +Medium Yellow Dye= +Medium Lime Dye= +Medium Green Dye= +Medium Aqua Dye= +Medium Cyan Dye= +Medium Sky-blue= +Medium Blue Dye= +Medium Violet Dye= +Medium Magenta Dye= +Medium Red-violet Dye= -Red Dye (low saturation)= -Orange Dye (low saturation)= -Yellow Dye (low saturation)= -Lime Dye (low saturation)= -Green Dye (low saturation)= -Aqua Dye (low saturation)= -Cyan Dye (low saturation)= -Sky-blue Dye (low saturation)= -Blue Dye (low saturation)= -Violet Dye (low saturation)= -Magenta Dye (low saturation)= -Red-violet Dye (low saturation)= +Red Dye (low saturation)= +Orange Dye (low saturation)= +Yellow Dye (low saturation)= +Lime Dye (low saturation)= +Green Dye (low saturation)= +Aqua Dye (low saturation)= +Cyan Dye (low saturation)= +Sky-blue Dye (low saturation)= +Blue Dye (low saturation)= +Violet Dye (low saturation)= +Magenta Dye (low saturation)= +Red-violet Dye (low saturation)= -Red Dye= -Orange Dye= -Yellow Dye= -Lime Dye= -Green Dye= -Aqua Dye= -Cyan Dye= -Sky-blue Dye= -Blue Dye= -Violet Dye= -Magenta Dye= -Red-violet Dye= +Red Dye= +Orange Dye= +Yellow Dye= +Lime Dye= +Green Dye= +Aqua Dye= +Cyan Dye= +Sky-blue Dye= +Blue Dye= +Violet Dye= +Magenta Dye= +Red-violet Dye= -[UnifiedDyes] Loaded!= +[UnifiedDyes] Loaded!= Dye Airbrush= diff --git a/mods/unifieddyes/locale/unifieddyes.tr.tr b/mods/unifieddyes/locale/unifieddyes.tr.tr index a3ecfd38..b55fff88 100644 --- a/mods/unifieddyes/locale/unifieddyes.tr.tr +++ b/mods/unifieddyes/locale/unifieddyes.tr.tr @@ -3,88 +3,88 @@ # TUrkish translation # Mahmutelmas06@hotmail.com -Lime Dye=Limon Yeşili Boya -Aqua Dye=Deniz mavisi Boya -Sky-blue Dye=Gök-Mavi Boya -Red-violet Dye=Kırmızılı Boya -Light Grey Dye=Açık Grey Boya - -Dark Red Dye (low saturation)=Koyu Kırmızı Boya (düşük doygunluk) -Dark Orange Dye (low saturation)=Koyu Turuncu Boya (düşük doygunluk) -Dark Yellow Dye (low saturation)=Koyu Sarı Boya (düşük doygunluk) -Dark Lime Dye (low saturation)=Koyu Limon Yeşili Boya (düşük doygunluk) -Dark Green Dye (low saturation)=Koyu Yeşil Boya (düşük doygunluk) -Dark Aqua Dye (low saturation)=Koyu Deniz mavisi boya (düşük doygunluk) -Dark Cyan Dye (low saturation)=Koyu Cam göbeği Boya (düşük doygunluk) -Dark Sky-blue Dye (low saturation)=Koyu Gök-Mavi Boya (düşük doygunluk) -Dark Blue Dye (low saturation)=Koyu Mavi Boya (düşük doygunluk) -Dark Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) -Dark Magenta Dye (low saturation)=Koyu Kızılımsı Mor Boya (düşük doygunluk) -Dark Red-violet Dye (low saturation)=Koyu Kırmızılı Boya (düşük doygunluk) - -Dark Red Dye=Koyu Kırmızı Boya -Dark Orange Dye=Koyu Turuncu Boya -Dark Yellow Dye=Koyu Sarı Boya -Dark Lime Dye=Koyu Limon Yeşili Boya -Dark Green Dye=Koyu Yeşil Boya -Dark Aqua Dye=Koyu Deniz mavisi Boya -Dark Cyan Dye=Koyu Cam göbeği Boya -Dark Sky-blue Dye=Koyu Gök-Mavi Boya -Dark Blue Dye=Koyu Mavi Boya -Dark Violet Dye=Koyu mor Boya -Dark Magenta Dye=Koyu Kızılımsı Mor Boya -Dark Red-violet Dye=Koyu Kırmızılı Boya - -Medium Red Dye (low saturation)=Kırmızı Boya (düşük doygunluk) -Medium Orange Dye (low saturation)=Turuncu Boya (düşük doygunluk) -Medium Yellow Dye (low saturation)=Sarı Boya (düşük doygunluk) -Medium Lime Dye (low saturation)=Limon Yeşili Boya (düşük doygunluk) -Medium Green Dye (low saturation)=Yeşil Boya (düşük doygunluk) -Medium Aqua Dye (low saturation)=Deniz mavisi Boya (düşük doygunluk) -Medium Cyan Dye (low saturation)=Cam göbeği Boya (düşük doygunluk) -Medium Sky-blue Dye (low saturation)=Gök-Mavi Boya (düşük doygunluk) -Medium Blue Dye (low saturation)=Mavi Boya (düşük doygunluk) -Medium Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) -Medium Magenta Dye (low saturation)=Kızılımsı Mor Boya (düşük doygunluk) -Medium Red-violet Dye (low saturation)=Kırmızılı Boya (düşük doygunluk) - -Medium Red Dye=Kırmızı Boya -Medium Orange Dye=Turuncu Boya -Medium Yellow Dye=Sarı Boya -Medium Lime Dye=Limon Yeşili Boya -Medium Green Dye=Yeşil Boya -Medium Aqua Dye=Deniz mavisi Boya -Medium Cyan Dye=Cam göbeği Boya -Medium Sky-blue=Gök-Mavi -Medium Blue Dye=Mavi Boya -Medium Violet Dye=Koyu mor Boya -Medium Magenta Dye=Kızılımsı Mor Boya -Medium Red-violet Dye=Kırmızılı Boya - -Red Dye (low saturation)=Kırmızı Boya (düşük doygunluk) -Orange Dye (low saturation)=Turuncu Boya (düşük doygunluk) -Yellow Dye (low saturation)=Sarı Boya (düşük doygunluk) -Lime Dye (low saturation)=Limon Yeşili Boya (düşük doygunluk) -Green Dye (low saturation)=Yeşil Boya (düşük doygunluk) -Aqua Dye (low saturation)=Deniz mavisi Boya (düşük doygunluk) -Cyan Dye (low saturation)=Cam göbeği Boya (düşük doygunluk) -Sky-blue Dye (low saturation)=Gök-Mavi Boya (düşük doygunluk) -Blue Dye (low saturation)=Mavi Boya (düşük doygunluk) -Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) -Magenta Dye (low saturation)=Kızılımsı Mor Boya (düşük doygunluk) -Red-violet Dye (low saturation)=Kırmızılı Boya (düşük doygunluk) - -Red Dye=Kırmızı Boya -Orange Dye=Turuncu Boya -Yellow Dye=Sarı Boya -Lime Dye=Limon Yeşili Boya -Green Dye=Yeşil Boya -Aqua Dye=Deniz mavisi Boya -Cyan Dye=Cam göbeği Boya -Sky-blue Dye=Gök-Mavi Boya -Blue Dye=Mavi Boya -Violet Dye=Koyu mor Boya -Magenta Dye=Kızılımsı Mor Boya -Red-violet Dye=Kırmızılı Boya - -[UnifiedDyes] Loaded!=[UnifiedBoyas] yüklendi! +Lime Dye=Limon Yeşili Boya +Aqua Dye=Deniz mavisi Boya +Sky-blue Dye=Gök-Mavi Boya +Red-violet Dye=Kırmızılı Boya +Light Grey Dye=Açık Grey Boya + +Dark Red Dye (low saturation)=Koyu Kırmızı Boya (düşük doygunluk) +Dark Orange Dye (low saturation)=Koyu Turuncu Boya (düşük doygunluk) +Dark Yellow Dye (low saturation)=Koyu Sarı Boya (düşük doygunluk) +Dark Lime Dye (low saturation)=Koyu Limon Yeşili Boya (düşük doygunluk) +Dark Green Dye (low saturation)=Koyu Yeşil Boya (düşük doygunluk) +Dark Aqua Dye (low saturation)=Koyu Deniz mavisi boya (düşük doygunluk) +Dark Cyan Dye (low saturation)=Koyu Cam göbeği Boya (düşük doygunluk) +Dark Sky-blue Dye (low saturation)=Koyu Gök-Mavi Boya (düşük doygunluk) +Dark Blue Dye (low saturation)=Koyu Mavi Boya (düşük doygunluk) +Dark Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) +Dark Magenta Dye (low saturation)=Koyu Kızılımsı Mor Boya (düşük doygunluk) +Dark Red-violet Dye (low saturation)=Koyu Kırmızılı Boya (düşük doygunluk) + +Dark Red Dye=Koyu Kırmızı Boya +Dark Orange Dye=Koyu Turuncu Boya +Dark Yellow Dye=Koyu Sarı Boya +Dark Lime Dye=Koyu Limon Yeşili Boya +Dark Green Dye=Koyu Yeşil Boya +Dark Aqua Dye=Koyu Deniz mavisi Boya +Dark Cyan Dye=Koyu Cam göbeği Boya +Dark Sky-blue Dye=Koyu Gök-Mavi Boya +Dark Blue Dye=Koyu Mavi Boya +Dark Violet Dye=Koyu mor Boya +Dark Magenta Dye=Koyu Kızılımsı Mor Boya +Dark Red-violet Dye=Koyu Kırmızılı Boya + +Medium Red Dye (low saturation)=Kırmızı Boya (düşük doygunluk) +Medium Orange Dye (low saturation)=Turuncu Boya (düşük doygunluk) +Medium Yellow Dye (low saturation)=Sarı Boya (düşük doygunluk) +Medium Lime Dye (low saturation)=Limon Yeşili Boya (düşük doygunluk) +Medium Green Dye (low saturation)=Yeşil Boya (düşük doygunluk) +Medium Aqua Dye (low saturation)=Deniz mavisi Boya (düşük doygunluk) +Medium Cyan Dye (low saturation)=Cam göbeği Boya (düşük doygunluk) +Medium Sky-blue Dye (low saturation)=Gök-Mavi Boya (düşük doygunluk) +Medium Blue Dye (low saturation)=Mavi Boya (düşük doygunluk) +Medium Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) +Medium Magenta Dye (low saturation)=Kızılımsı Mor Boya (düşük doygunluk) +Medium Red-violet Dye (low saturation)=Kırmızılı Boya (düşük doygunluk) + +Medium Red Dye=Kırmızı Boya +Medium Orange Dye=Turuncu Boya +Medium Yellow Dye=Sarı Boya +Medium Lime Dye=Limon Yeşili Boya +Medium Green Dye=Yeşil Boya +Medium Aqua Dye=Deniz mavisi Boya +Medium Cyan Dye=Cam göbeği Boya +Medium Sky-blue=Gök-Mavi +Medium Blue Dye=Mavi Boya +Medium Violet Dye=Koyu mor Boya +Medium Magenta Dye=Kızılımsı Mor Boya +Medium Red-violet Dye=Kırmızılı Boya + +Red Dye (low saturation)=Kırmızı Boya (düşük doygunluk) +Orange Dye (low saturation)=Turuncu Boya (düşük doygunluk) +Yellow Dye (low saturation)=Sarı Boya (düşük doygunluk) +Lime Dye (low saturation)=Limon Yeşili Boya (düşük doygunluk) +Green Dye (low saturation)=Yeşil Boya (düşük doygunluk) +Aqua Dye (low saturation)=Deniz mavisi Boya (düşük doygunluk) +Cyan Dye (low saturation)=Cam göbeği Boya (düşük doygunluk) +Sky-blue Dye (low saturation)=Gök-Mavi Boya (düşük doygunluk) +Blue Dye (low saturation)=Mavi Boya (düşük doygunluk) +Violet Dye (low saturation)=Koyu mor Boya (düşük doygunluk) +Magenta Dye (low saturation)=Kızılımsı Mor Boya (düşük doygunluk) +Red-violet Dye (low saturation)=Kırmızılı Boya (düşük doygunluk) + +Red Dye=Kırmızı Boya +Orange Dye=Turuncu Boya +Yellow Dye=Sarı Boya +Lime Dye=Limon Yeşili Boya +Green Dye=Yeşil Boya +Aqua Dye=Deniz mavisi Boya +Cyan Dye=Cam göbeği Boya +Sky-blue Dye=Gök-Mavi Boya +Blue Dye=Mavi Boya +Violet Dye=Koyu mor Boya +Magenta Dye=Kızılımsı Mor Boya +Red-violet Dye=Kırmızılı Boya + +[UnifiedDyes] Loaded!=[UnifiedBoyas] yüklendi! diff --git a/mods/unifieddyes/mod.conf b/mods/unifieddyes/mod.conf index 8afae562..8bf9129a 100644 --- a/mods/unifieddyes/mod.conf +++ b/mods/unifieddyes/mod.conf @@ -1,4 +1,4 @@ name = unifieddyes description = Unified Dyes expands the standard dye set from 15 to 90 colors. -depends = default, dye, basic_materials -min_minetest_version = 5.2.0 +optional_depends = default, dye, basic_materials +min_minetest_version = 5.5.0 diff --git a/mods/vehicle_mash/.luacheckrc b/mods/vehicle_mash/.luacheckrc index 22aa2a68..335f52a2 100644 --- a/mods/vehicle_mash/.luacheckrc +++ b/mods/vehicle_mash/.luacheckrc @@ -3,7 +3,7 @@ allow_defined_top = true max_line_length = 999 globals = { - "vehicle_mash", + "vehicle_mash", "player_api", } read_globals = { @@ -11,5 +11,5 @@ read_globals = { table = {fields = {"copy", "getn"}}, "minetest", "lib_mount", - "core", + "core", "vector" } diff --git a/mods/vehicle_mash/LICENSE.md b/mods/vehicle_mash/LICENSE.md index 5b7220d8..b2239a23 100644 --- a/mods/vehicle_mash/LICENSE.md +++ b/mods/vehicle_mash/LICENSE.md @@ -1,26 +1,28 @@ # Credit where credit is due Copyright (C) 2015-2016 blert2112 and contributors\ -Copyright (C) 2019-2021 Panquesito7 (halfpacho@gmail.com) and contributors +Copyright (C) 2019-2022 Panquesito7 (halfpacho@gmail.com) and contributors - Black, Blue, Brown, Cyan, Dark Green, Dark Grey, Green, Grey, Magenta, Orange, Pink, Red, Violet, White, Yellow, Hot Rod, Nyan Ride, Oerkki Bliss, and Road Master from: "Car" by Esteban - - License: - No info given in that mod but I am going to assume the credit for the original model goes to: - - Melcor and his CAR01 model + - Melcor and his CAR01 model (MELKAR) - - - License: CC-BY-NC-SA + - License: [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) - MeseCars from: "Mesecars" by paramat - - Licenses: Code WTFPL, textures CC BY-SA - Boats from "Boats" by PilzAdam +- - textures: Zeg9 - model: thetoon and Zeg9, modified by PavelS(SokolovPavel) - - License: WTFPL + - License: [WTFPL](http://www.wtfpl.net/) - Hovercraft from "Hovercraft" by Stuart Jones +- - Licenses: - textures: CC-BY-SA - sounds: freesound.org diff --git a/mods/vehicle_mash/README.md b/mods/vehicle_mash/README.md index 82148703..723f1dbf 100755 --- a/mods/vehicle_mash/README.md +++ b/mods/vehicle_mash/README.md @@ -1,6 +1,6 @@ -# Vehicle Mash [![Build status](https://github.com/minetest-mods/vehicle_mash/workflows/build/badge.svg)](https://github.com/minetest-mods/vehicle_mash/actions) [![ContentDB](https://content.minetest.net/packages/Panquesito7/vehicle_mash/shields/downloads/)](https://content.minetest.net/packages/Panquesito7/vehicle_mash/) +# Vehicle Mash [![LuaCheck status](https://github.com/minetest-mods/vehicle_mash/workflows/luacheck/badge.svg)](https://github.com/minetest-mods/vehicle_mash/actions) [![ContentDB](https://content.minetest.net/packages/Panquesito7/vehicle_mash/shields/downloads/)](https://content.minetest.net/packages/Panquesito7/vehicle_mash/) -- Current version: 2.3.0 +- Current version: 2.4.0 - By [blert2112](https://github.com/blert2112), and handed over to [Panquesito7](https://github.com/Panquesito7). ![Screenshot](https://raw.githubusercontent.com/minetest-mods/vehicle_mash/master/screenshot.png) @@ -39,14 +39,14 @@ For further information or help, see:\ ## Known issues -- Attachments incorrectly ordered. +- None as of now. ## License Copyright (C) 2015-2016 blert2112 and contributors\ -Copyright (C) 2019-2021 Panquesito7 (halfpacho@gmail.com) and contributors +Copyright (C) 2019-2022 Panquesito7 (halfpacho@gmail.com) and contributors -All licenses of previous works, of course, apply. (see credits below) +All licenses of previous works, of course, apply (see credits below). As far as the work I did... It's really just a fork of a fork of a fork of a fork, tossed it all into a blender and spun it on puree for a bit. Baked it for a while and set it on the counter to cool. What I mean is, make what you will of it, it matters not to me. See [`LICENSE.md`](LICENSE.md) for more information. @@ -67,6 +67,14 @@ There are no pending tasks to do yet. ## Changelog +v2.4.0 1/12/2022 + +- Added new API support for `lib_mount`. +- Customizable HP/Armor for all vehicles. Players will be affected. +- Short and tweak the code. +- Cars can now be killed by players. +- Support for 3+ passengers (beta). + v2.3.0 2/12/2021 - Improved formatting in `README.md`. @@ -149,35 +157,3 @@ v1.0 4/24/2015 Report bugs or suggest ideas by [creating an issue](https://github.com/minetest-mods/vehicle_mash/issues/new).\ If you know how to fix an issue, consider opening a [pull request](https://github.com/minetest-mods/vehicle_mash/compare). - -## Credit where credit is due - -- Black, Blue, Brown, Cyan, Dark Green, Dark Grey, Green, Grey, Magenta, Orange, Pink, Red, Violet, White, Yellow, Hot Rod, Nyan Ride, Oerkki Bliss, and Road Master from: "Car" by Esteban - - - - License: - - No info given in that mod but I am going to assume the credit for the original model goes to: - - Melcor and his CAR01 model - - - - License: CC-BY-NC-SA - -- MeseCars from: "Mesecars" by paramat - - - - Licenses: Code WTFPL, textures CC BY-SA - -- Boats from "Boats" by PilzAdam - - textures: Zeg9 - - model: thetoon and Zeg9, modified by PavelS(SokolovPavel) - - License: WTFPL - -- Hovercraft from "Hovercraft" by Stuart Jones - - Licenses: - - textures: CC-BY-SA - - sounds: freesound.org - - Rocket Boost Engine Loop by qubodup - CC0 - - CARTOON-BING-LOW by kantouth - CC-BY-3.0 - - All other sounds: Copyright Stuart Jones - CC-BY-SA - -I am sure many others deserve mention.\ -If you feel left out let me know and I will add you in. - -Enjoy! diff --git a/mods/vehicle_mash/boats/boat.lua b/mods/vehicle_mash/boats/boat.lua index 10b199d3..12f062dd 100644 --- a/mods/vehicle_mash/boats/boat.lua +++ b/mods/vehicle_mash/boats/boat.lua @@ -1,9 +1,8 @@ - local name = "boat" local definition = ... local craft_check = minetest.settings:get_bool("vehicle_mash.enable_crafts") -definition.description = "BoatA" +definition.description = vehicle_mash.S("BoatA") definition.inventory_image = "boat_inventory.png" definition.wield_image = "boat_wield.png" definition.mesh = "boats_boat.obj" diff --git a/mods/vehicle_mash/boats/rowboat.lua b/mods/vehicle_mash/boats/rowboat.lua index b49fc2ae..788d895e 100644 --- a/mods/vehicle_mash/boats/rowboat.lua +++ b/mods/vehicle_mash/boats/rowboat.lua @@ -1,9 +1,8 @@ - local name = "rowboat" local definition = ... local craft_check = minetest.settings:get_bool("vehicle_mash.enable_crafts") -definition.description = "Rowboat" +definition.description = vehicle_mash.S("Rowboat") definition.inventory_image = "rowboat_inventory.png" definition.wield_image = "rowboat_wield.png" definition.mesh = "rowboat.x" diff --git a/mods/vehicle_mash/car01s/black.lua b/mods/vehicle_mash/car01s/black.lua index a9991216..983b34fa 100644 --- a/mods/vehicle_mash/car01s/black.lua +++ b/mods/vehicle_mash/car01s/black.lua @@ -1,8 +1,7 @@ - local name = "car_black" local definition = ... -definition.description = "Black car" +definition.description = vehicle_mash.S("Black car") definition.inventory_image = "inv_car_black.png" definition.wield_image = "inv_car_black.png" definition.textures = {"car_black.png"} diff --git a/mods/vehicle_mash/car01s/blue.lua b/mods/vehicle_mash/car01s/blue.lua index dd9adddb..89a00d56 100644 --- a/mods/vehicle_mash/car01s/blue.lua +++ b/mods/vehicle_mash/car01s/blue.lua @@ -1,8 +1,7 @@ - local name = "car_blue" local definition = ... -definition.description = "Blue car" +definition.description = vehicle_mash.S("Blue car") definition.inventory_image = "inv_car_blue.png" definition.wield_image = "inv_car_blue.png" definition.textures = {"car_blue.png"} diff --git a/mods/vehicle_mash/car01s/brown.lua b/mods/vehicle_mash/car01s/brown.lua index 290e40a2..690e2759 100644 --- a/mods/vehicle_mash/car01s/brown.lua +++ b/mods/vehicle_mash/car01s/brown.lua @@ -1,8 +1,7 @@ - local name = "car_brown" local definition = ... -definition.description = "Brown car" +definition.description = vehicle_mash.S("Brown car") definition.inventory_image = "inv_car_brown.png" definition.wield_image = "inv_car_brown.png" definition.textures = {"car_brown.png"} diff --git a/mods/vehicle_mash/car01s/cyan.lua b/mods/vehicle_mash/car01s/cyan.lua index a9c00b9d..3675f522 100644 --- a/mods/vehicle_mash/car01s/cyan.lua +++ b/mods/vehicle_mash/car01s/cyan.lua @@ -1,8 +1,7 @@ - local name = "car_cyan" local definition = ... -definition.description = "Cyan car" +definition.description = vehicle_mash.S("Cyan car") definition.inventory_image = "inv_car_cyan.png" definition.wield_image = "inv_car_cyan.png" definition.textures = {"car_cyan.png"} diff --git a/mods/vehicle_mash/car01s/dark_green.lua b/mods/vehicle_mash/car01s/dark_green.lua index 3483fd45..3acdf191 100644 --- a/mods/vehicle_mash/car01s/dark_green.lua +++ b/mods/vehicle_mash/car01s/dark_green.lua @@ -1,8 +1,7 @@ - local name = "car_dark_green" local definition = ... -definition.description = "Dark green car" +definition.description = vehicle_mash.S("Dark green car") definition.inventory_image = "inv_car_dark_green.png" definition.wield_image = "inv_car_dark_green.png" definition.textures = {"car_dark_green.png"} diff --git a/mods/vehicle_mash/car01s/dark_grey.lua b/mods/vehicle_mash/car01s/dark_grey.lua index cce03b73..7b13f0b4 100644 --- a/mods/vehicle_mash/car01s/dark_grey.lua +++ b/mods/vehicle_mash/car01s/dark_grey.lua @@ -1,8 +1,7 @@ - local name = "car_dark_grey" local definition = ... -definition.description = "Dark grey car" +definition.description = vehicle_mash.S("Dark grey car") definition.inventory_image = "inv_car_dark_grey.png" definition.wield_image = "inv_car_dark_grey.png" definition.textures = {"car_dark_grey.png"} diff --git a/mods/vehicle_mash/car01s/green.lua b/mods/vehicle_mash/car01s/green.lua index dfab73e3..db374678 100644 --- a/mods/vehicle_mash/car01s/green.lua +++ b/mods/vehicle_mash/car01s/green.lua @@ -1,8 +1,7 @@ - local name = "car_green" local definition = ... -definition.description = "Green car" +definition.description = vehicle_mash.S("Green car") definition.inventory_image = "inv_car_green.png" definition.wield_image = "inv_car_green.png" definition.textures = {"car_green.png"} diff --git a/mods/vehicle_mash/car01s/grey.lua b/mods/vehicle_mash/car01s/grey.lua index 85fac076..0dff15a5 100644 --- a/mods/vehicle_mash/car01s/grey.lua +++ b/mods/vehicle_mash/car01s/grey.lua @@ -1,8 +1,7 @@ - local name = "car_grey" local definition = ... -definition.description = "Grey car" +definition.description = vehicle_mash.S("Grey car") definition.inventory_image = "inv_car_grey.png" definition.wield_image = "inv_car_grey.png" definition.textures = {"car_grey.png"} diff --git a/mods/vehicle_mash/car01s/hot_rod.lua b/mods/vehicle_mash/car01s/hot_rod.lua index 68ac3aba..056519da 100644 --- a/mods/vehicle_mash/car01s/hot_rod.lua +++ b/mods/vehicle_mash/car01s/hot_rod.lua @@ -1,8 +1,7 @@ - local name = "car_hot_rod" local definition = ... -definition.description = "Hot Rod car" +definition.description = vehicle_mash.S("Hot Rod car") definition.inventory_image = "inv_car_red.png" definition.wield_image = "inv_car_red.png" definition.textures = {"hot_rod.png"} diff --git a/mods/vehicle_mash/car01s/magenta.lua b/mods/vehicle_mash/car01s/magenta.lua index 4536eaf6..a42b2b74 100644 --- a/mods/vehicle_mash/car01s/magenta.lua +++ b/mods/vehicle_mash/car01s/magenta.lua @@ -1,8 +1,7 @@ - local name = "car_magenta" local definition = ... -definition.description = "Magenta car" +definition.description = vehicle_mash.S("Magenta car") definition.inventory_image = "inv_car_magenta.png" definition.wield_image = "inv_car_magenta.png" definition.textures = {"car_magenta.png"} diff --git a/mods/vehicle_mash/car01s/nyan_ride.lua b/mods/vehicle_mash/car01s/nyan_ride.lua index 1d8ff862..19f35e05 100644 --- a/mods/vehicle_mash/car01s/nyan_ride.lua +++ b/mods/vehicle_mash/car01s/nyan_ride.lua @@ -1,8 +1,7 @@ - local name = "car_nyan_ride" local definition = ... -definition.description = "Nyan Ride car" +definition.description = vehicle_mash.S("Nyan Ride car") definition.inventory_image = "inv_car_pink.png" definition.wield_image = "inv_car_pink.png" definition.textures = {"nyan_ride.png"} diff --git a/mods/vehicle_mash/car01s/oerkki_bliss.lua b/mods/vehicle_mash/car01s/oerkki_bliss.lua index 84323d46..8dda2bfd 100644 --- a/mods/vehicle_mash/car01s/oerkki_bliss.lua +++ b/mods/vehicle_mash/car01s/oerkki_bliss.lua @@ -1,8 +1,7 @@ - local name = "car_oerkki_bliss" local definition = ... -definition.description = "Oerkki Bliss car" +definition.description = vehicle_mash.S("Oerkki Bliss car") definition.inventory_image = "inv_car_black.png" definition.wield_image = "inv_car_black.png" definition.textures = {"oerkki_bliss.png"} diff --git a/mods/vehicle_mash/car01s/orange.lua b/mods/vehicle_mash/car01s/orange.lua index 30c3950a..95af5292 100644 --- a/mods/vehicle_mash/car01s/orange.lua +++ b/mods/vehicle_mash/car01s/orange.lua @@ -1,8 +1,7 @@ - local name = "car_orange" local definition = ... -definition.description = "Orange car" +definition.description = vehicle_mash.S("Orange car") definition.inventory_image = "inv_car_orange.png" definition.wield_image = "inv_car_orange.png" definition.textures = {"car_orange.png"} diff --git a/mods/vehicle_mash/car01s/pink.lua b/mods/vehicle_mash/car01s/pink.lua index fc0def98..eaf46704 100644 --- a/mods/vehicle_mash/car01s/pink.lua +++ b/mods/vehicle_mash/car01s/pink.lua @@ -1,8 +1,7 @@ - local name = "car_pink" local definition = ... -definition.description = "Pink car" +definition.description = vehicle_mash.S("Pink car") definition.inventory_image = "inv_car_pink.png" definition.wield_image = "inv_car_pink.png" definition.textures = {"car_pink.png"} diff --git a/mods/vehicle_mash/car01s/red.lua b/mods/vehicle_mash/car01s/red.lua index 24f67d57..7f357937 100644 --- a/mods/vehicle_mash/car01s/red.lua +++ b/mods/vehicle_mash/car01s/red.lua @@ -1,8 +1,7 @@ - local name = "car_red" local definition = ... -definition.description = "Red car" +definition.description = vehicle_mash.S("Red car") definition.inventory_image = "inv_car_red.png" definition.wield_image = "inv_car_red.png" definition.textures = {"car_red.png"} diff --git a/mods/vehicle_mash/car01s/road_master.lua b/mods/vehicle_mash/car01s/road_master.lua index 91fe1233..fdabbb01 100644 --- a/mods/vehicle_mash/car01s/road_master.lua +++ b/mods/vehicle_mash/car01s/road_master.lua @@ -1,8 +1,7 @@ - local name = "car_road_master" local definition = ... -definition.description = "Road Master car" +definition.description = vehicle_mash.S("Road Master car") definition.inventory_image = "inv_car_brown.png" definition.wield_image = "inv_car_brown.png" definition.textures = {"road_master.png"} diff --git a/mods/vehicle_mash/car01s/violet.lua b/mods/vehicle_mash/car01s/violet.lua index 48d660e8..5be15165 100644 --- a/mods/vehicle_mash/car01s/violet.lua +++ b/mods/vehicle_mash/car01s/violet.lua @@ -1,8 +1,7 @@ - local name = "car_violet" local definition = ... -definition.description = "Violet car" +definition.description = vehicle_mash.S("Violet car") definition.inventory_image = "inv_car_violet.png" definition.wield_image = "inv_car_violet.png" definition.textures = {"car_violet.png"} diff --git a/mods/vehicle_mash/car01s/white.lua b/mods/vehicle_mash/car01s/white.lua index 60826aa3..bafd91a7 100644 --- a/mods/vehicle_mash/car01s/white.lua +++ b/mods/vehicle_mash/car01s/white.lua @@ -1,8 +1,7 @@ - local name = "car_white" local definition = ... -definition.description = "White car" +definition.description = vehicle_mash.S("White car") definition.inventory_image = "inv_car_white.png" definition.wield_image = "inv_car_white.png" definition.textures = {"car_white.png"} diff --git a/mods/vehicle_mash/car01s/yellow.lua b/mods/vehicle_mash/car01s/yellow.lua index 71d01b09..1f782b29 100644 --- a/mods/vehicle_mash/car01s/yellow.lua +++ b/mods/vehicle_mash/car01s/yellow.lua @@ -1,8 +1,7 @@ - local name = "car_yellow" local definition = ... -definition.description = "Yellow car" +definition.description = vehicle_mash.S("Yellow car") definition.inventory_image = "inv_car_yellow.png" definition.wield_image = "inv_car_yellow.png" definition.textures = {"car_yellow.png"} diff --git a/mods/vehicle_mash/depends.txt b/mods/vehicle_mash/depends.txt index b6cd1206..4378de65 100755 --- a/mods/vehicle_mash/depends.txt +++ b/mods/vehicle_mash/depends.txt @@ -1,2 +1,6 @@ default lib_mount +player_api +wool? +xpanes? +dye? diff --git a/mods/vehicle_mash/description.txt b/mods/vehicle_mash/description.txt index a38d3db4..bb7ae0d4 100644 --- a/mods/vehicle_mash/description.txt +++ b/mods/vehicle_mash/description.txt @@ -1 +1,6 @@ -Adds many types of vehicles. \ No newline at end of file +Adds many types of vehicles: + +- Normal cars. +- Boats. +- Hovercrafts. +- And mesecars. diff --git a/mods/vehicle_mash/framework.lua b/mods/vehicle_mash/framework.lua index 062ef496..37702e07 100644 --- a/mods/vehicle_mash/framework.lua +++ b/mods/vehicle_mash/framework.lua @@ -1,7 +1,3 @@ - -vehicle_mash = {} -local drive = lib_mount.drive - function vehicle_mash.register_vehicle(name, def) minetest.register_entity(name, { terrain_type = def.terrain_type, @@ -14,17 +10,8 @@ function vehicle_mash.register_vehicle(name, def) driver_eye_offset = def.driver_eye_offset, driver_detach_pos_offset = def.driver_detach_pos_offset, number_of_passengers = def.number_of_passengers, - passenger_attach_at = def.passenger_attach_at, - passenger_eye_offset = def.passenger_eye_offset, - passenger_detach_pos_offset = def.passenger_detach_pos_offset, - passenger2_attach_at = def.passenger2_attach_at, - passenger2_eye_offset = def.passenger2_eye_offset, - passenger2_detach_pos_offset = def.passenger2_detach_pos_offset, - - passenger3_attach_at = def.passenger3_attach_at, - passenger3_eye_offset = def.passenger3_eye_offset, - passenger3_detach_pos_offset = def.passenger3_detach_pos_offset, + passengers = def.passengers, enable_crash = def.enable_crash, visual = def.visual, @@ -50,8 +37,12 @@ function vehicle_mash.register_vehicle(name, def) mouselook = false, physical = true, removed = false, - offset = {x=0, y=0, z=0}, + offset = vector.new(0,0,0), owner = "", + hp_min = def.hp_min, + hp_max = def.hp_max, + armor = def.armor, + rpm_values = {{16, 16, .5}, {10, 10, .4}, {0, 5, .3}}, on_rightclick = function(self, clicker) if not clicker or not clicker:is_player() then return @@ -60,42 +51,29 @@ function vehicle_mash.register_vehicle(name, def) if self.driver then -- if clicker is driver detach passengers and driver if clicker == self.driver then - if self.passenger then - lib_mount.detach(self.passenger, self.offset) - end - - if self.passenger2 then - lib_mount.detach(self.passenger2, self.offset) - end - - if self.passenger3 then - lib_mount.detach(self.passenger3, self.offset) + for i = 1, self.number_of_passengers do -- Detaches all passengers with the new Library Mount API. + local passenger = self.passengers[i] + if passenger.player then + lib_mount.detach(passenger.player, passenger.eye_offset) + end end -- detach driver lib_mount.detach(self.driver, self.offset) -- if clicker is not the driver else -- if clicker is passenger - -- detach passengers - if clicker == self.passenger then - lib_mount.detach(self.passenger, self.offset) - - elseif clicker == self.passenger2 then - lib_mount.detach(self.passenger2, self.offset) - - elseif clicker == self.passenger3 then - lib_mount.detach(self.passenger3, self.offset) - -- if clicker is not passenger - else - -- attach passengers if possible - if lib_mount.passengers[self.passenger] == self.passenger and self.number_of_passengers >= 1 then - lib_mount.attach(self, clicker, true, 1) - end - if lib_mount.passengers[self.passenger2] == self.passenger2 and self.number_of_passengers >= 2 then - lib_mount.attach(self, clicker, true, 2) - end - if lib_mount.passengers[self.passenger3] == self.passenger3 and self.number_of_passengers >= 3 then - lib_mount.attach(self, clicker, true, 3) + -- detach passengers with the new Library Mount API + for i = 1, self.number_of_passengers do + local passenger = self.passengers[i] + if clicker == passenger.player then + lib_mount.detach(passenger.player, passenger.eye_offset) + break + else + -- Attach passengers with the new Library Mount API + if not passenger.player then -- If there's no current passenger, attach if possible. + lib_mount.attach(self, clicker, true, i) + break -- We've already attached the player, no need to continue. + end end end end @@ -108,7 +86,16 @@ function vehicle_mash.register_vehicle(name, def) end end, on_activate = function(self, staticdata, dtime_s) - self.object:set_armor_groups({immortal = 1}) + if def.armor then + self.object:set_armor_groups({fleshy = def.armor}) -- Set armor groups to vehicle + else + self.object:set_armor_groups({fleshy = 0, immortal = 1}) -- Else, make vehicle immortal + end + + if def.hp_min and def.hp_max then + self.object:set_hp(math.random(def.hp_min, def.hp_max), "Set HP to vehicle") + end + local tmp = minetest.deserialize(staticdata) if tmp then for _,stat in pairs(tmp) do @@ -129,7 +116,7 @@ function vehicle_mash.register_vehicle(name, def) end return core.serialize(tmp) end, - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) if not puncher or not puncher:is_player() or self.removed or self.driver then return end @@ -143,12 +130,24 @@ function vehicle_mash.register_vehicle(name, def) puncher:get_inventory():add_item("main", self.name) end end, - on_step = function(self, dtime) + on_step = function(self, dtime, moveresult, ...) -- Automatically set `enable_crash` to true if there's no value found if def.enable_crash == nil then def.enable_crash = true end - drive(self, dtime, false, nil, nil, 0, def.can_fly, def.can_go_down, def.can_go_up, def.enable_crash) + lib_mount.drive(self, dtime, false, nil, nil, 0, def.can_fly, def.can_go_down, def.can_go_up, def.enable_crash, moveresult) + end, + on_death = function(self, killer) + if self.driver then + lib_mount.detach(self.driver, self.offset) + end + for i = 1, self.number_of_passengers do -- Detaches all passengers with the new Library Mount API. + local passenger = self.passengers[i] + if passenger.player then + lib_mount.detach(passenger.player, passenger.eye_offset) + passenger.player:set_eye_offset(vector.new(0,0,0), vector.new(0,0,0)) + end + end end }) diff --git a/mods/vehicle_mash/hovers/hover_blue.lua b/mods/vehicle_mash/hovers/hover_blue.lua index 3169f89b..b3066eff 100644 --- a/mods/vehicle_mash/hovers/hover_blue.lua +++ b/mods/vehicle_mash/hovers/hover_blue.lua @@ -1,9 +1,8 @@ - local name = "hover_blue" local definition = ... -definition.description = "Blue hovercraft" +definition.description = vehicle_mash.S("Blue hovercraft") definition.inventory_image = "hovercraft_blue_inv.png" definition.wield_image = "hovercraft_blue_inv.png" definition.textures = {"hovercraft_blue.png"} diff --git a/mods/vehicle_mash/hovers/hover_green.lua b/mods/vehicle_mash/hovers/hover_green.lua index 9d88a01f..eb3d9a1a 100644 --- a/mods/vehicle_mash/hovers/hover_green.lua +++ b/mods/vehicle_mash/hovers/hover_green.lua @@ -1,9 +1,8 @@ - local name = "hover_green" local definition = ... -definition.description = "Green hovercraft" +definition.description = vehicle_mash.S("Green hovercraft") definition.inventory_image = "hovercraft_green_inv.png" definition.wield_image = "hovercraft_green_inv.png" definition.textures = {"hovercraft_green.png"} diff --git a/mods/vehicle_mash/hovers/hover_red.lua b/mods/vehicle_mash/hovers/hover_red.lua index 8e01122c..eae63b1b 100644 --- a/mods/vehicle_mash/hovers/hover_red.lua +++ b/mods/vehicle_mash/hovers/hover_red.lua @@ -1,9 +1,8 @@ - local name = "hover_red" local definition = ... -definition.description = "Red hovercraft" +definition.description = vehicle_mash.S("Red hovercraft") definition.inventory_image = "hovercraft_red_inv.png" definition.wield_image = "hovercraft_red_inv.png" definition.textures = {"hovercraft_red.png"} diff --git a/mods/vehicle_mash/hovers/hover_yellow.lua b/mods/vehicle_mash/hovers/hover_yellow.lua index c6268809..8760534a 100644 --- a/mods/vehicle_mash/hovers/hover_yellow.lua +++ b/mods/vehicle_mash/hovers/hover_yellow.lua @@ -1,9 +1,8 @@ - local name = "hover_yellow" local definition = ... -definition.description = "Yellow hovercraft" +definition.description = vehicle_mash.S("Yellow hovercraft") definition.inventory_image = "hovercraft_yellow_inv.png" definition.wield_image = "hovercraft_yellow_inv.png" definition.textures = {"hovercraft_yellow.png"} diff --git a/mods/vehicle_mash/init.lua b/mods/vehicle_mash/init.lua index bc10d965..8c819618 100755 --- a/mods/vehicle_mash/init.lua +++ b/mods/vehicle_mash/init.lua @@ -1,3 +1,13 @@ +vehicle_mash = { + S = minetest.get_translator(minetest.get_current_modname()) +} + +-- Fix `player_api` eye height model if desired +if minetest.settings:get_bool("vehicle_mash.player_api_fix") == true or minetest.settings:get_bool("vehicle_mash.player_api_fix") == nil + and player_api.registered_models["character.b3d"] then + + player_api.registered_models["character.b3d"].animations.sit.eye_height = 1.47 +end -- get modpath local mpath = minetest.get_modpath("vehicle_mash") @@ -50,22 +60,34 @@ else visual = "mesh", mesh = "car.x", visual_size = {x=1, y=1}, - wield_scale = {x=1, y=1, z=1}, + wield_scale = vector.new(1,1,1), collisionbox = {-0.6, -0.05, -0.6, 0.6, 1, 0.6}, onplace_position_adj = -0.45, -- player specific stuff - player_rotation = {x=0,y=90,z=0}, - driver_attach_at = {x=3.5,y=3.7,z=3.5}, - driver_eye_offset = {x=-4, y=0, z=0}, + player_rotation = vector.new(0,90,0), + driver_attach_at = vector.new(3.5,3.7,3.5), + driver_eye_offset = vector.new(-4,0,0), number_of_passengers = 3, - passenger_attach_at = {x=3.5,y=3.7,z=-3.5}, - passenger_eye_offset = {x=4, y=0, z=0}, - passenger2_attach_at = {x=-4,y=3.7,z=3.5}, - passenger2_eye_offset = {x=-4, y=3, z=0}, + passengers = { + { + attach_at = vector.new(3.5,3.7,-3.5), + eye_offset = vector.new(4,0,0), + }, + { + attach_at = vector.new(-4,3.7,3.5), + eye_offset = vector.new(-4,3,0), + }, + { + attach_at = vector.new(-4,3.7,-3.5), + eye_offset = vector.new(4,3,0), + }, + }, - passenger3_attach_at = {x=-4,y=3.7,z=-3.5}, - passenger3_eye_offset = {x=4, y=3, z=0}, + -- HP/Armor stuff. Uncomment to enable. + -- min_hp = 10, + -- max_hp = 35, + -- armor = 25, -- drop and recipe drop_on_destroy = {"vehicle_mash:tire 2", "vehicle_mash:windshield", @@ -82,7 +104,7 @@ else "nyan_ride", "oerkki_bliss", "road_master", } --- Load all CAR01's cars if enabled + -- Load all CAR01's cars if enabled for _, name in ipairs(car01_names) do local check_enabled = minetest.settings:get_bool("vehicle_mash.enable_" .. name .. "_car") if check_enabled or check_enabled == nil then @@ -106,22 +128,26 @@ else visual = "cube", mesh = "", visual_size = {x=1.5, y=1.5}, - wield_scale = {x=1, y=1, z=1}, + wield_scale = vector.new(1,1,1), collisionbox = {-0.75, -0.75, -0.75, 0.75, 0.75, 0.75}, onplace_position_adj = 0.25, -- player specific stuff - player_rotation = {x=0,y=0,z=0}, - driver_attach_at = {x=0,y=0,z=-2.0}, - driver_eye_offset = {x=0, y=0, z=0}, + player_rotation = vector.new(0,0,0), + driver_attach_at = vector.new(0,0,-2.0), + driver_eye_offset = vector.new(0,0,0), number_of_passengers = 0, - passenger_attach_at = {x=0,y=0,z=0}, - passenger_eye_offset = {x=0, y=0, z=0}, - passenger2_attach_at = {x=0,y=0,z=0}, - passenger2_eye_offset = {x=0, y=0, z=0}, + passengers = { + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + }, - passenger3_attach_at = {x=0,y=0,z=0}, - passenger3_eye_offset = {x=0, y=0, z=0}, + -- HP/Armor stuff. Uncomment to enable. + -- min_hp = 10, + -- max_hp = 35, + -- armor = 25, -- drop and recipe drop_on_destroy = {"vehicle_mash:motor", "vehicle_mash:battery"}, @@ -158,23 +184,26 @@ else -- model specific stuff visual = "mesh", visual_size = {x=1, y=1}, - wield_scale = {x=1, y=1, z=1}, + wield_scale = vector.new(1,1,1), collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, onplace_position_adj = 0, textures = {"default_wood.png"}, -- player specific stuff - player_rotation = {x=0, y=0, z=0}, - driver_attach_at = {x=0.5,y=1,z=-3}, - driver_eye_offset = {x=0, y=0, z=0}, + player_rotation = vector.new(0,0,0), + driver_attach_at = vector.new(0.5,1,-3), + driver_eye_offset = vector.new(0,0,0), number_of_passengers = 0, - passenger_attach_at = {x=0,y=0,z=0}, - passenger_eye_offset = {x=0, y=0, z=0}, + passengers = { + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + }, - passenger2_attach_at = {x=0,y=0,z=0}, - passenger2_eye_offset = {x=0, y=0, z=0}, - - passenger3_attach_at = {x=0,y=0,z=0}, - passenger3_eye_offset = {x=0, y=0, z=0} + -- HP/Armor stuff. Uncomment to enable. + -- min_hp = 10, + -- max_hp = 35, + -- armor = 25, } local boat_names = { @@ -206,22 +235,26 @@ else visual = "mesh", mesh = "hovercraft.x", visual_size = {x=1, y=1}, - wield_scale = {x=1, y=1, z=1}, + wield_scale = vector.new(1,1,1), collisionbox = {-0.8, -0.25, -0.8, 0.8, 1.2, 0.8}, onplace_position_adj = -0.25, -- player specific stuff - player_rotation = {x=0,y=90,z=0}, - driver_attach_at = {x=-2,y=6.3,z=0}, - driver_eye_offset = {x=0, y=0, z=0}, + player_rotation = vector.new(0,90,0), + driver_attach_at = vector.new(-2,6.3,0), + driver_eye_offset = vector.new(0,0,0), number_of_passengers = 0, - passenger_attach_at = {x=0,y=0,z=0}, - passenger_eye_offset = {x=0, y=0, z=0}, - passenger2_attach_at = {x=0,y=0,z=0}, - passenger2_eye_offset = {x=0, y=0, z=0}, + passengers = { + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + }, - passenger3_attach_at = {x=0,y=0,z=0}, - passenger3_eye_offset = {x=0, y=0, z=0}, + -- HP/Armor stuff. Uncomment to enable. + -- min_hp = 10, + -- max_hp = 35, + -- armor = 25, -- recipe recipe = nil diff --git a/mods/vehicle_mash/locale/template.txt b/mods/vehicle_mash/locale/template.txt new file mode 100644 index 00000000..e63d3b1f --- /dev/null +++ b/mods/vehicle_mash/locale/template.txt @@ -0,0 +1,35 @@ +# textdomain: vehicle_mash + +Motor= +Tire= +Wind Shield= +Car battery= +BoatA= +Rowboat= +Black car= +Blue car= +Brown car= +Cyan car= +Dark green car= +Dark grey car= +Green car= +Grey car= +Hot Rod car= +Magenta car= +Nyan Ride car= +Oerkki Bliss car= +Orange car= +Pink car= +Red car= +Road Master car= +Violet car= +White car= +Yellow car= +Blue hovercraft= +Green hovercraft= +Red hovercraft= +Yellow hovercraft= +Blue Mesecar= +Pink Mesecar= +Purple Mesecar= +Yellow Mesecar= diff --git a/mods/vehicle_mash/locale/vehicle_mash.es.tr b/mods/vehicle_mash/locale/vehicle_mash.es.tr new file mode 100644 index 00000000..9600dd0b --- /dev/null +++ b/mods/vehicle_mash/locale/vehicle_mash.es.tr @@ -0,0 +1,35 @@ +# textdomain: vehicle_mash + +Motor=Motor +Tire=Lanta +Wind Shield= +Car battery=Batería de Carro +BoatA=BoteA +Rowboat=Bote de remos +Black car=Carro negro +Blue car=Carro azul +Brown car=Carro cáfe +Cyan car=Carro celeste +Dark green car=Carro verde oscuro +Dark grey car=Carro gris oscuro +Green car=Carro verde +Grey car=Carro gris +Hot Rod car=Carro de carreras +Magenta car=Carro magenta +Nyan Ride car=Carro de Nyan +Oerkki Bliss car=Carro de Oerkki +Orange car=Carro naranja +Pink car=Carro rosa +Red car=Carro rojo +Road Master car=Carro Maestro +Violet car=Carro violeta +White car=Carro blanco +Yellow car=Carro amarillo +Blue hovercraft=Aerodeslizador azul +Green hovercraft=Aerodeslizador verde +Red hovercraft=Aerodeslizador rojo +Yellow hovercraft=Aerodeslizador amarillo +Blue Mesecar=Carro de Mese azul +Pink Mesecar=Carro de Mese Rosa +Purple Mesecar=Carro de Mese Morado +Yellow Mesecar=Carro de Mese amarillo diff --git a/mods/vehicle_mash/mesecars/mese_blue.lua b/mods/vehicle_mash/mesecars/mese_blue.lua index 4a8edf77..08d659ca 100644 --- a/mods/vehicle_mash/mesecars/mese_blue.lua +++ b/mods/vehicle_mash/mesecars/mese_blue.lua @@ -1,8 +1,7 @@ - local name = "mesecar_blue" local definition = ... -definition.description = "Blue Mesecar" +definition.description = vehicle_mash.S("Blue Mesecar") definition.inventory_image = "mesecar_car1front.png" definition.wield_image = "mesecar_car1front.png" definition.textures = { diff --git a/mods/vehicle_mash/mesecars/mese_pink.lua b/mods/vehicle_mash/mesecars/mese_pink.lua index 0f27479e..d6258591 100644 --- a/mods/vehicle_mash/mesecars/mese_pink.lua +++ b/mods/vehicle_mash/mesecars/mese_pink.lua @@ -2,7 +2,7 @@ local name = "mesecar_pink" local definition = ... -definition.description = "Pink Mesecar" +definition.description = vehicle_mash.S("Pink Mesecar") definition.inventory_image = "mesecar_car3front.png" definition.wield_image = "mesecar_car3front.png" definition.textures = { diff --git a/mods/vehicle_mash/mesecars/mese_purple.lua b/mods/vehicle_mash/mesecars/mese_purple.lua index 7669c921..e926c60a 100644 --- a/mods/vehicle_mash/mesecars/mese_purple.lua +++ b/mods/vehicle_mash/mesecars/mese_purple.lua @@ -2,7 +2,7 @@ local name = "mesecar_purple" local definition = ... -definition.description = "Purple Mesecar" +definition.description = vehicle_mash.S("Purple Mesecar") definition.inventory_image = "mesecar_car2front.png" definition.wield_image = "mesecar_car2front.png" definition.textures = { diff --git a/mods/vehicle_mash/mesecars/mese_yellow.lua b/mods/vehicle_mash/mesecars/mese_yellow.lua index 5a8f2e6d..17d3a7d2 100644 --- a/mods/vehicle_mash/mesecars/mese_yellow.lua +++ b/mods/vehicle_mash/mesecars/mese_yellow.lua @@ -2,7 +2,7 @@ local name = "mesecar_yellow" local definition = ... -definition.description = "Yellow Mesecar" +definition.description = vehicle_mash.S("Yellow Mesecar") definition.inventory_image = "mesecar_car4front.png" definition.wield_image = "mesecar_car4front.png" definition.textures = { diff --git a/mods/vehicle_mash/mod.conf b/mods/vehicle_mash/mod.conf index 96449578..e00c8b3f 100644 --- a/mods/vehicle_mash/mod.conf +++ b/mods/vehicle_mash/mod.conf @@ -1,3 +1,12 @@ name = vehicle_mash -depends = default, lib_mount -description = Adds many types of vehicles. +depends = default, lib_mount, player_api +optional_depends = wool, xpanes, dye +description = """ +Adds many types of vehicles: + +- Normal cars. +- Boats. +- Hovercrafts. +- And mesecars. +""" +min_minetest_version = 5.0.0 diff --git a/mods/vehicle_mash/models/car_126r.x b/mods/vehicle_mash/models/car_126r.x deleted file mode 100755 index 58077217..00000000 --- a/mods/vehicle_mash/models/car_126r.x +++ /dev/null @@ -1,6761 +0,0 @@ -xof 0303txt 0032 - -Frame Root { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame _0002 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000,-1.000000,-0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Mesh { // _0002 mesh - 1904; - 3.333261;-2.456014;-12.688454;, - 2.812428;-2.143514;-12.688455;, - 2.812428;-2.143514;-13.938454;, - 3.333261;-2.456014;-13.938454;, - 4.166594;-2.456014;-12.688455;, - 3.333261;-2.456014;-12.688454;, - 3.333261;-2.456014;-13.938454;, - 4.166595;-2.456014;-13.938455;, - 4.687428;-2.143514;-12.688456;, - 4.166594;-2.456014;-12.688455;, - 4.166595;-2.456014;-13.938455;, - 4.687428;-2.143514;-13.938456;, - 3.333263; 0.043985;-13.938455;, - 2.812428;-0.268514;-13.938454;, - 2.812428;-0.268514;-12.688455;, - 3.333261; 0.043986;-12.688454;, - 4.166596; 0.043985;-13.938455;, - 3.333263; 0.043985;-13.938455;, - 3.333261; 0.043986;-12.688454;, - 4.166595; 0.043986;-12.688455;, - 4.687428;-0.268515;-13.938456;, - 4.166596; 0.043985;-13.938455;, - 4.166595; 0.043986;-12.688455;, - 4.687428;-0.268515;-12.688456;, - 4.999928;-1.622681;-12.688456;, - 4.687428;-2.143514;-12.688456;, - 4.687428;-2.143514;-13.938456;, - 4.999928;-1.622682;-13.938456;, - 4.999929;-0.789347;-12.688456;, - 4.999928;-1.622681;-12.688456;, - 4.999928;-1.622682;-13.938456;, - 4.999928;-0.789347;-13.938456;, - 4.687428;-0.268515;-12.688456;, - 4.999929;-0.789347;-12.688456;, - 4.999928;-0.789347;-13.938456;, - 4.687428;-0.268515;-13.938456;, - 2.499928;-0.789346;-12.688455;, - 2.812428;-0.268514;-12.688455;, - 2.812428;-0.268514;-13.938454;, - 2.499928;-0.789346;-13.938454;, - 2.499928;-1.622681;-12.688455;, - 2.499928;-0.789346;-12.688455;, - 2.499928;-0.789346;-13.938454;, - 2.499928;-1.622681;-13.938454;, - 2.812428;-2.143514;-12.688455;, - 2.499928;-1.622681;-12.688455;, - 2.499928;-1.622681;-13.938454;, - 2.812428;-2.143514;-13.938454;, - 2.499928;-0.789346;-13.938454;, - 2.812428;-0.268514;-13.938454;, - 3.333263; 0.043985;-13.938455;, - 3.333263;-0.789346;-13.938455;, - 2.499928;-1.622681;-13.938454;, - 2.499928;-0.789346;-13.938454;, - 3.333263;-0.789346;-13.938455;, - 3.333263;-1.622681;-13.938455;, - 3.333263;-1.622681;-13.938455;, - 3.333261;-2.456014;-13.938454;, - 2.812428;-2.143514;-13.938454;, - 2.499928;-1.622681;-13.938454;, - 3.333263;-0.789346;-13.938455;, - 3.333263; 0.043985;-13.938455;, - 4.166596; 0.043985;-13.938455;, - 4.166595;-0.789347;-13.938455;, - 3.333263;-1.622681;-13.938455;, - 3.333263;-0.789346;-13.938455;, - 4.166595;-0.789347;-13.938455;, - 4.166595;-1.622682;-13.938455;, - 3.333261;-2.456014;-13.938454;, - 3.333263;-1.622681;-13.938455;, - 4.166595;-1.622682;-13.938455;, - 4.166595;-2.456014;-13.938455;, - 4.166595;-0.789347;-13.938455;, - 4.166596; 0.043985;-13.938455;, - 4.687428;-0.268515;-13.938456;, - 4.999928;-0.789347;-13.938456;, - 4.166595;-1.622682;-13.938455;, - 4.166595;-0.789347;-13.938455;, - 4.999928;-0.789347;-13.938456;, - 4.999928;-1.622682;-13.938456;, - 4.166595;-2.456014;-13.938455;, - 4.166595;-1.622682;-13.938455;, - 4.999928;-1.622682;-13.938456;, - 4.687428;-2.143514;-13.938456;, - 4.999929;-0.789347;-12.688456;, - 4.687428;-0.268515;-12.688456;, - 4.166595; 0.043986;-12.688455;, - 4.166594;-0.789346;-12.063455;, - 4.999928;-1.622681;-12.688456;, - 4.999929;-0.789347;-12.688456;, - 4.166594;-0.789346;-12.063455;, - 4.166594;-1.622681;-12.063455;, - 4.687428;-2.143514;-12.688456;, - 4.999928;-1.622681;-12.688456;, - 4.166594;-1.622681;-12.063455;, - 4.166594;-2.456014;-12.688455;, - 4.166594;-0.789346;-12.063455;, - 4.166595; 0.043986;-12.688455;, - 3.333261; 0.043986;-12.688454;, - 3.333261;-0.789346;-12.063455;, - 4.166594;-1.622681;-12.063455;, - 4.166594;-0.789346;-12.063455;, - 3.333261;-0.789346;-12.063455;, - 3.333261;-1.622681;-12.063455;, - 4.166594;-2.456014;-12.688455;, - 4.166594;-1.622681;-12.063455;, - 3.333261;-1.622681;-12.063455;, - 3.333261;-2.456014;-12.688454;, - 3.333261;-0.789346;-12.063455;, - 3.333261; 0.043986;-12.688454;, - 2.812428;-0.268514;-12.688455;, - 2.499928;-0.789346;-12.688455;, - 3.333261;-1.622681;-12.063455;, - 3.333261;-0.789346;-12.063455;, - 2.499928;-0.789346;-12.688455;, - 2.499928;-1.622681;-12.688455;, - 3.333261;-2.456014;-12.688454;, - 3.333261;-1.622681;-12.063455;, - 2.499928;-1.622681;-12.688455;, - 2.812428;-2.143514;-12.688455;, - -4.166739;-2.456013;-12.688455;, - -4.687572;-2.143513;-12.688455;, - -4.687572;-2.143513;-13.938455;, - -4.166739;-2.456013;-13.938455;, - -3.333407;-2.456013;-12.688455;, - -4.166739;-2.456013;-12.688455;, - -4.166739;-2.456013;-13.938455;, - -3.333404;-2.456013;-13.938455;, - -2.812572;-2.143513;-12.688455;, - -3.333407;-2.456013;-12.688455;, - -3.333404;-2.456013;-13.938455;, - -2.812572;-2.143513;-13.938455;, - -4.166736; 0.043987;-13.938455;, - -4.687572;-0.268513;-13.938455;, - -4.687572;-0.268513;-12.688455;, - -4.166739; 0.043987;-12.688455;, - -3.333404; 0.043987;-13.938455;, - -4.166736; 0.043987;-13.938455;, - -4.166739; 0.043987;-12.688455;, - -3.333405; 0.043987;-12.688455;, - -2.812572;-0.268514;-13.938455;, - -3.333404; 0.043987;-13.938455;, - -3.333405; 0.043987;-12.688455;, - -2.812572;-0.268513;-12.688455;, - -2.500072;-1.622680;-12.688455;, - -2.812572;-2.143513;-12.688455;, - -2.812572;-2.143513;-13.938455;, - -2.500072;-1.622681;-13.938455;, - -2.500072;-0.789345;-12.688455;, - -2.500072;-1.622680;-12.688455;, - -2.500072;-1.622681;-13.938455;, - -2.500072;-0.789346;-13.938455;, - -2.812572;-0.268513;-12.688455;, - -2.500072;-0.789345;-12.688455;, - -2.500072;-0.789346;-13.938455;, - -2.812572;-0.268514;-13.938455;, - -5.000072;-0.789346;-12.688455;, - -4.687572;-0.268513;-12.688455;, - -4.687572;-0.268513;-13.938455;, - -5.000072;-0.789346;-13.938455;, - -5.000072;-1.622680;-12.688455;, - -5.000072;-0.789346;-12.688455;, - -5.000072;-0.789346;-13.938455;, - -5.000072;-1.622680;-13.938455;, - -4.687572;-2.143513;-12.688455;, - -5.000072;-1.622680;-12.688455;, - -5.000072;-1.622680;-13.938455;, - -4.687572;-2.143513;-13.938455;, - -5.000072;-0.789346;-13.938455;, - -4.687572;-0.268513;-13.938455;, - -4.166736; 0.043987;-13.938455;, - -4.166736;-0.789346;-13.938455;, - -5.000072;-1.622680;-13.938455;, - -5.000072;-0.789346;-13.938455;, - -4.166736;-0.789346;-13.938455;, - -4.166736;-1.622680;-13.938455;, - -4.166736;-1.622680;-13.938455;, - -4.166739;-2.456013;-13.938455;, - -4.687572;-2.143513;-13.938455;, - -5.000072;-1.622680;-13.938455;, - -4.166736;-0.789346;-13.938455;, - -4.166736; 0.043987;-13.938455;, - -3.333404; 0.043987;-13.938455;, - -3.333404;-0.789346;-13.938455;, - -4.166736;-1.622680;-13.938455;, - -4.166736;-0.789346;-13.938455;, - -3.333404;-0.789346;-13.938455;, - -3.333404;-1.622680;-13.938455;, - -4.166739;-2.456013;-13.938455;, - -4.166736;-1.622680;-13.938455;, - -3.333404;-1.622680;-13.938455;, - -3.333404;-2.456013;-13.938455;, - -3.333404;-0.789346;-13.938455;, - -3.333404; 0.043987;-13.938455;, - -2.812572;-0.268514;-13.938455;, - -2.500072;-0.789346;-13.938455;, - -3.333404;-1.622680;-13.938455;, - -3.333404;-0.789346;-13.938455;, - -2.500072;-0.789346;-13.938455;, - -2.500072;-1.622681;-13.938455;, - -3.333404;-2.456013;-13.938455;, - -3.333404;-1.622680;-13.938455;, - -2.500072;-1.622681;-13.938455;, - -2.812572;-2.143513;-13.938455;, - -2.500072;-0.789345;-12.688455;, - -2.812572;-0.268513;-12.688455;, - -3.333405; 0.043987;-12.688455;, - -3.333406;-0.789345;-12.063455;, - -2.500072;-1.622680;-12.688455;, - -2.500072;-0.789345;-12.688455;, - -3.333406;-0.789345;-12.063455;, - -3.333406;-1.622680;-12.063455;, - -2.812572;-2.143513;-12.688455;, - -2.500072;-1.622680;-12.688455;, - -3.333406;-1.622680;-12.063455;, - -3.333407;-2.456013;-12.688455;, - -3.333406;-0.789345;-12.063455;, - -3.333405; 0.043987;-12.688455;, - -4.166739; 0.043987;-12.688455;, - -4.166739;-0.789346;-12.063455;, - -3.333406;-1.622680;-12.063455;, - -3.333406;-0.789345;-12.063455;, - -4.166739;-0.789346;-12.063455;, - -4.166739;-1.622681;-12.063455;, - -3.333407;-2.456013;-12.688455;, - -3.333406;-1.622680;-12.063455;, - -4.166739;-1.622681;-12.063455;, - -4.166739;-2.456013;-12.688455;, - -4.166739;-0.789346;-12.063455;, - -4.166739; 0.043987;-12.688455;, - -4.687572;-0.268513;-12.688455;, - -5.000072;-0.789346;-12.688455;, - -4.166739;-1.622681;-12.063455;, - -4.166739;-0.789346;-12.063455;, - -5.000072;-0.789346;-12.688455;, - -5.000072;-1.622680;-12.688455;, - -4.166739;-2.456013;-12.688455;, - -4.166739;-1.622681;-12.063455;, - -5.000072;-1.622680;-12.688455;, - -4.687572;-2.143513;-12.688455;, - -2.291739; 1.293986;-13.313455;, - -2.812572; 1.606486;-13.313455;, - -2.812571; 1.606486;-14.563456;, - -2.291739; 1.293986;-14.563456;, - -1.458405; 1.293986;-13.313455;, - -2.291739; 1.293986;-13.313455;, - -2.291739; 1.293986;-14.563456;, - -1.458405; 1.293986;-14.563456;, - -0.937571; 1.606486;-13.313455;, - -1.458405; 1.293986;-13.313455;, - -1.458405; 1.293986;-14.563456;, - -0.937571; 1.606486;-14.563456;, - -2.291735; 3.793986;-14.563457;, - -2.812572; 3.481486;-14.563457;, - -2.812572; 3.481487;-13.313456;, - -2.291739; 3.793987;-13.313456;, - -1.458403; 3.793986;-14.563457;, - -2.291735; 3.793986;-14.563457;, - -2.291739; 3.793987;-13.313456;, - -1.458406; 3.793986;-13.313456;, - -0.937572; 3.481486;-14.563457;, - -1.458403; 3.793986;-14.563457;, - -1.458406; 3.793986;-13.313456;, - -0.937572; 3.481486;-13.313456;, - -0.625072; 2.127319;-13.313455;, - -0.937571; 1.606486;-13.313455;, - -0.937571; 1.606486;-14.563456;, - -0.625072; 2.127319;-14.563456;, - -0.625072; 2.960654;-13.313456;, - -0.625072; 2.127319;-13.313455;, - -0.625072; 2.127319;-14.563456;, - -0.625072; 2.960654;-14.563457;, - -0.937572; 3.481486;-13.313456;, - -0.625072; 2.960654;-13.313456;, - -0.625072; 2.960654;-14.563457;, - -0.937572; 3.481486;-14.563457;, - -3.125072; 2.960654;-13.313456;, - -2.812572; 3.481487;-13.313456;, - -2.812572; 3.481486;-14.563457;, - -3.125072; 2.960653;-14.563457;, - -3.125072; 2.127318;-13.313455;, - -3.125072; 2.960654;-13.313456;, - -3.125072; 2.960653;-14.563457;, - -3.125072; 2.127318;-14.563456;, - -2.812572; 1.606486;-13.313455;, - -3.125072; 2.127318;-13.313455;, - -3.125072; 2.127318;-14.563456;, - -2.812571; 1.606486;-14.563456;, - -3.125072; 2.960653;-14.563457;, - -2.812572; 3.481486;-14.563457;, - -2.291735; 3.793986;-14.563457;, - -2.291737; 2.960654;-14.563457;, - -3.125072; 2.127318;-14.563456;, - -3.125072; 2.960653;-14.563457;, - -2.291737; 2.960654;-14.563457;, - -2.291737; 2.127319;-14.563456;, - -2.291737; 2.127319;-14.563456;, - -2.291739; 1.293986;-14.563456;, - -2.812571; 1.606486;-14.563456;, - -3.125072; 2.127318;-14.563456;, - -2.291737; 2.960654;-14.563457;, - -2.291735; 3.793986;-14.563457;, - -1.458403; 3.793986;-14.563457;, - -1.458403; 2.960654;-14.563457;, - -2.291737; 2.127319;-14.563456;, - -2.291737; 2.960654;-14.563457;, - -1.458403; 2.960654;-14.563457;, - -1.458405; 2.127319;-14.563456;, - -2.291739; 1.293986;-14.563456;, - -2.291737; 2.127319;-14.563456;, - -1.458405; 2.127319;-14.563456;, - -1.458405; 1.293986;-14.563456;, - -1.458403; 2.960654;-14.563457;, - -1.458403; 3.793986;-14.563457;, - -0.937572; 3.481486;-14.563457;, - -0.625072; 2.960654;-14.563457;, - -1.458405; 2.127319;-14.563456;, - -1.458403; 2.960654;-14.563457;, - -0.625072; 2.960654;-14.563457;, - -0.625072; 2.127319;-14.563456;, - -1.458405; 1.293986;-14.563456;, - -1.458405; 2.127319;-14.563456;, - -0.625072; 2.127319;-14.563456;, - -0.937571; 1.606486;-14.563456;, - -0.625072; 2.960654;-13.313456;, - -0.937572; 3.481486;-13.313456;, - -1.458406; 3.793986;-13.313456;, - -1.458406; 2.960654;-12.688456;, - -0.625072; 2.127319;-13.313455;, - -0.625072; 2.960654;-13.313456;, - -1.458406; 2.960654;-12.688456;, - -1.458406; 2.127319;-12.688455;, - -0.937571; 1.606486;-13.313455;, - -0.625072; 2.127319;-13.313455;, - -1.458406; 2.127319;-12.688455;, - -1.458405; 1.293986;-13.313455;, - -1.458406; 2.960654;-12.688456;, - -1.458406; 3.793986;-13.313456;, - -2.291739; 3.793987;-13.313456;, - -2.291739; 2.960654;-12.688456;, - -1.458406; 2.127319;-12.688455;, - -1.458406; 2.960654;-12.688456;, - -2.291739; 2.960654;-12.688456;, - -2.291739; 2.127320;-12.688455;, - -1.458405; 1.293986;-13.313455;, - -1.458406; 2.127319;-12.688455;, - -2.291739; 2.127320;-12.688455;, - -2.291739; 1.293986;-13.313455;, - -2.291739; 2.960654;-12.688456;, - -2.291739; 3.793987;-13.313456;, - -2.812572; 3.481487;-13.313456;, - -3.125072; 2.960654;-13.313456;, - -2.291739; 2.127320;-12.688455;, - -2.291739; 2.960654;-12.688456;, - -3.125072; 2.960654;-13.313456;, - -3.125072; 2.127318;-13.313455;, - -2.291739; 1.293986;-13.313455;, - -2.291739; 2.127320;-12.688455;, - -3.125072; 2.127318;-13.313455;, - -2.812572; 1.606486;-13.313455;, - 1.458261; 1.293986;-13.313455;, - 0.937428; 1.606486;-13.313455;, - 0.937428; 1.606486;-14.563456;, - 1.458261; 1.293985;-14.563456;, - 2.291593; 1.293987;-13.313455;, - 1.458261; 1.293986;-13.313455;, - 1.458261; 1.293985;-14.563456;, - 2.291595; 1.293985;-14.563457;, - 2.812428; 1.606485;-13.313454;, - 2.291593; 1.293987;-13.313455;, - 2.291595; 1.293985;-14.563457;, - 2.812428; 1.606485;-14.563456;, - 1.458264; 3.793986;-14.563457;, - 0.937428; 3.481486;-14.563457;, - 0.937428; 3.481486;-13.313456;, - 1.458261; 3.793986;-13.313456;, - 2.291596; 3.793985;-14.563457;, - 1.458264; 3.793986;-14.563457;, - 1.458261; 3.793986;-13.313456;, - 2.291594; 3.793986;-13.313456;, - 2.812428; 3.481485;-14.563457;, - 2.291596; 3.793985;-14.563457;, - 2.291594; 3.793986;-13.313456;, - 2.812428; 3.481486;-13.313455;, - 3.124928; 2.127319;-13.313454;, - 2.812428; 1.606485;-13.313454;, - 2.812428; 1.606485;-14.563456;, - 3.124929; 2.127318;-14.563456;, - 3.124928; 2.960654;-13.313455;, - 3.124928; 2.127319;-13.313454;, - 3.124929; 2.127318;-14.563456;, - 3.124928; 2.960653;-14.563457;, - 2.812428; 3.481486;-13.313455;, - 3.124928; 2.960654;-13.313455;, - 3.124928; 2.960653;-14.563457;, - 2.812428; 3.481485;-14.563457;, - 0.624928; 2.960654;-13.313456;, - 0.937428; 3.481486;-13.313456;, - 0.937428; 3.481486;-14.563457;, - 0.624928; 2.960654;-14.563457;, - 0.624928; 2.127319;-13.313455;, - 0.624928; 2.960654;-13.313456;, - 0.624928; 2.960654;-14.563457;, - 0.624928; 2.127319;-14.563456;, - 0.937428; 1.606486;-13.313455;, - 0.624928; 2.127319;-13.313455;, - 0.624928; 2.127319;-14.563456;, - 0.937428; 1.606486;-14.563456;, - 0.624928; 2.960654;-14.563457;, - 0.937428; 3.481486;-14.563457;, - 1.458264; 3.793986;-14.563457;, - 1.458264; 2.960654;-14.563457;, - 0.624928; 2.127319;-14.563456;, - 0.624928; 2.960654;-14.563457;, - 1.458264; 2.960654;-14.563457;, - 1.458264; 2.127319;-14.563457;, - 1.458264; 2.127319;-14.563457;, - 1.458261; 1.293985;-14.563456;, - 0.937428; 1.606486;-14.563456;, - 0.624928; 2.127319;-14.563456;, - 1.458264; 2.960654;-14.563457;, - 1.458264; 3.793986;-14.563457;, - 2.291596; 3.793985;-14.563457;, - 2.291596; 2.960652;-14.563457;, - 1.458264; 2.127319;-14.563457;, - 1.458264; 2.960654;-14.563457;, - 2.291596; 2.960652;-14.563457;, - 2.291596; 2.127317;-14.563457;, - 1.458261; 1.293985;-14.563456;, - 1.458264; 2.127319;-14.563457;, - 2.291596; 2.127317;-14.563457;, - 2.291595; 1.293985;-14.563457;, - 2.291596; 2.960652;-14.563457;, - 2.291596; 3.793985;-14.563457;, - 2.812428; 3.481485;-14.563457;, - 3.124928; 2.960653;-14.563457;, - 2.291596; 2.127317;-14.563457;, - 2.291596; 2.960652;-14.563457;, - 3.124928; 2.960653;-14.563457;, - 3.124929; 2.127318;-14.563456;, - 2.291595; 1.293985;-14.563457;, - 2.291596; 2.127317;-14.563457;, - 3.124929; 2.127318;-14.563456;, - 2.812428; 1.606485;-14.563456;, - 3.124928; 2.960654;-13.313455;, - 2.812428; 3.481486;-13.313455;, - 2.291594; 3.793986;-13.313456;, - 2.291594; 2.960654;-12.688456;, - 3.124928; 2.127319;-13.313454;, - 3.124928; 2.960654;-13.313455;, - 2.291594; 2.960654;-12.688456;, - 2.291593; 2.127319;-12.688455;, - 2.812428; 1.606485;-13.313454;, - 3.124928; 2.127319;-13.313454;, - 2.291593; 2.127319;-12.688455;, - 2.291593; 1.293987;-13.313455;, - 2.291594; 2.960654;-12.688456;, - 2.291594; 3.793986;-13.313456;, - 1.458261; 3.793986;-13.313456;, - 1.458261; 2.960653;-12.688456;, - 2.291593; 2.127319;-12.688455;, - 2.291594; 2.960654;-12.688456;, - 1.458261; 2.960653;-12.688456;, - 1.458261; 2.127319;-12.688455;, - 2.291593; 1.293987;-13.313455;, - 2.291593; 2.127319;-12.688455;, - 1.458261; 2.127319;-12.688455;, - 1.458261; 1.293986;-13.313455;, - 1.458261; 2.960653;-12.688456;, - 1.458261; 3.793986;-13.313456;, - 0.937428; 3.481486;-13.313456;, - 0.624928; 2.960654;-13.313456;, - 1.458261; 2.127319;-12.688455;, - 1.458261; 2.960653;-12.688456;, - 0.624928; 2.960654;-13.313456;, - 0.624928; 2.127319;-13.313455;, - 1.458261; 1.293986;-13.313455;, - 1.458261; 2.127319;-12.688455;, - 0.624928; 2.127319;-13.313455;, - 0.937428; 1.606486;-13.313455;, - -8.750063; 1.293993;19.186543;, - -8.750066; 0.043993;19.186543;, - -8.750066; 0.043993;21.686543;, - -8.750071; 1.293993;21.686543;, - 8.749929; 0.043991;19.186544;, - 8.749926; 1.293991;19.186544;, - 8.749918; 1.293991;21.686544;, - 8.749926; 0.043991;21.686544;, - 4.999937; 0.043991;20.436544;, - 8.749929; 0.043991;19.186544;, - 8.749926; 0.043991;21.686544;, - 4.999929; 0.043991;22.936544;, - -5.000065; 0.043992;20.436543;, - 4.999937; 0.043991;20.436544;, - 4.999929; 0.043991;22.936544;, - -5.000069; 0.043993;22.936543;, - -8.750066; 0.043993;19.186543;, - -5.000065; 0.043992;20.436543;, - -5.000069; 0.043993;22.936543;, - -8.750066; 0.043993;21.686543;, - 4.999922; 1.293991;22.936544;, - 8.749918; 1.293991;21.686544;, - 8.749926; 1.293991;19.186544;, - 4.999933; 1.293991;20.436544;, - -5.000080; 1.293993;22.936543;, - 4.999922; 1.293991;22.936544;, - 4.999933; 1.293991;20.436544;, - -5.000065; 1.293992;20.436543;, - -8.750071; 1.293993;21.686543;, - -5.000080; 1.293993;22.936543;, - -5.000065; 1.293992;20.436543;, - -8.750063; 1.293993;19.186543;, - 8.749918; 1.293991;21.686544;, - 4.999922; 1.293991;22.936544;, - 4.999929; 0.043991;22.936544;, - 8.749926; 0.043991;21.686544;, - -5.000069; 0.043993;22.936543;, - 4.999929; 0.043991;22.936544;, - 4.999922; 1.293991;22.936544;, - -5.000080; 1.293993;22.936543;, - -8.750066; 0.043993;21.686543;, - -5.000069; 0.043993;22.936543;, - -5.000080; 1.293993;22.936543;, - -8.750071; 1.293993;21.686543;, - -5.000065; 0.043992;20.436543;, - -8.750066; 0.043993;19.186543;, - -8.750063; 1.293993;19.186543;, - -5.000065; 1.293992;20.436543;, - 4.999937; 0.043991;20.436544;, - -5.000065; 0.043992;20.436543;, - -5.000065; 1.293992;20.436543;, - 4.999933; 1.293991;20.436544;, - 8.749929; 0.043991;19.186544;, - 4.999937; 0.043991;20.436544;, - 4.999933; 1.293991;20.436544;, - 8.749926; 1.293991;19.186544;, - 8.749921; 1.293986;-9.563455;, - 8.749924; 0.043986;-9.563457;, - 8.749923; 0.043986;-12.063454;, - 8.749928; 1.293986;-12.063455;, - -8.750072; 0.043988;-9.563457;, - -8.750066; 1.293988;-9.563457;, - -8.750062; 1.293988;-12.063457;, - -8.750068; 0.043988;-12.063455;, - -5.000079; 0.043987;-10.813457;, - -8.750072; 0.043988;-9.563457;, - -8.750068; 0.043988;-12.063455;, - -5.000072; 0.043987;-13.313455;, - 4.999923; 0.043986;-10.813456;, - -5.000079; 0.043987;-10.813457;, - -5.000072; 0.043987;-13.313455;, - 4.999928; 0.043985;-13.313456;, - 8.749924; 0.043986;-9.563457;, - 4.999923; 0.043986;-10.813456;, - 4.999928; 0.043985;-13.313456;, - 8.749923; 0.043986;-12.063454;, - -5.000060; 1.293987;-13.313456;, - -8.750062; 1.293988;-12.063457;, - -8.750066; 1.293988;-9.563457;, - -5.000074; 1.293987;-10.813457;, - 4.999939; 1.293985;-13.313456;, - -5.000060; 1.293987;-13.313456;, - -5.000074; 1.293987;-10.813457;, - 4.999923; 1.293985;-10.813456;, - 8.749928; 1.293986;-12.063455;, - 4.999939; 1.293985;-13.313456;, - 4.999923; 1.293985;-10.813456;, - 8.749921; 1.293986;-9.563455;, - -8.750062; 1.293988;-12.063457;, - -5.000060; 1.293987;-13.313456;, - -5.000072; 0.043987;-13.313455;, - -8.750068; 0.043988;-12.063455;, - 4.999928; 0.043985;-13.313456;, - -5.000072; 0.043987;-13.313455;, - -5.000060; 1.293987;-13.313456;, - 4.999939; 1.293985;-13.313456;, - 8.749923; 0.043986;-12.063454;, - 4.999928; 0.043985;-13.313456;, - 4.999939; 1.293985;-13.313456;, - 8.749928; 1.293986;-12.063455;, - 4.999923; 0.043986;-10.813456;, - 8.749924; 0.043986;-9.563457;, - 8.749921; 1.293986;-9.563455;, - 4.999923; 1.293985;-10.813456;, - -5.000079; 0.043987;-10.813457;, - 4.999923; 0.043986;-10.813456;, - 4.999923; 1.293985;-10.813456;, - -5.000074; 1.293987;-10.813457;, - -8.750072; 0.043988;-9.563457;, - -5.000079; 0.043987;-10.813457;, - -5.000074; 1.293987;-10.813457;, - -8.750066; 1.293988;-9.563457;, - 2.499928;-0.581013;-8.000943;, - 2.499926;-3.081013;-6.750956;, - -2.500069;-3.081012;-6.750956;, - -2.500070;-0.581013;-8.000955;, - -2.500071;-0.581008;16.999035;, - -2.500071;-3.081008;15.749043;, - 2.499927;-3.081009;15.749046;, - 2.499928;-0.581009;16.999041;, - 2.499926;-3.081013;-6.750956;, - 2.499929;-0.581011; 4.499049;, - -2.500069;-0.581011; 4.499039;, - -2.500069;-3.081012;-6.750956;, - 2.499929;-0.581011; 4.499049;, - 2.499928;-0.581013;-8.000943;, - -2.500070;-0.581013;-8.000955;, - -2.500069;-0.581011; 4.499039;, - 2.499928;-0.581009;16.999041;, - 2.499929;-0.581011; 4.499049;, - -2.500069;-0.581011; 4.499039;, - -2.500071;-0.581008;16.999035;, - 2.499929;-0.581011; 4.499049;, - 2.499926;-3.081013;-6.750956;, - 2.499928;-0.581013;-8.000943;, - -2.500069;-0.581011; 4.499039;, - -2.500070;-0.581013;-8.000955;, - -2.500069;-3.081012;-6.750956;, - -2.500071;-3.081009;12.311543;, - -2.500069;-0.581011; 4.499039;, - 2.499929;-0.581011; 4.499049;, - 2.499929;-3.081010;12.311549;, - -2.500071;-3.081008;15.749043;, - -2.500071;-3.081009;12.311543;, - 2.499929;-3.081010;12.311549;, - 2.499927;-3.081009;15.749046;, - -2.500069;-0.581011; 4.499039;, - -2.500071;-3.081009;12.311543;, - -2.500071;-3.081008;15.749043;, - -2.500071;-0.581008;16.999035;, - 2.499929;-0.581011; 4.499049;, - 2.499928;-0.581009;16.999041;, - 2.499927;-3.081009;15.749046;, - 2.499929;-3.081010;12.311549;, - -7.500071;-1.518503;15.436543;, - -7.500071;-1.831003;15.124043;, - -7.500071;-1.831003;15.436543;, - 7.499930;-1.831014;15.124043;, - 7.499930;-1.518514;15.436543;, - 7.499930;-1.831014;15.436543;, - -7.500071;-1.831003;15.124043;, - -7.500071;-2.143502;15.436543;, - -7.500071;-1.831003;15.436543;, - 7.499930;-2.143515;15.436543;, - 7.499930;-1.831014;15.124043;, - 7.499930;-1.831014;15.436543;, - -7.500071;-2.143502;15.436543;, - -7.500072;-1.831003;15.749043;, - -7.500071;-1.831003;15.436543;, - 7.499930;-1.831014;15.749043;, - 7.499930;-2.143515;15.436543;, - 7.499930;-1.831014;15.436543;, - -7.500071;-1.518503;15.436543;, - -7.500071;-1.831003;15.436543;, - -7.500072;-1.831003;15.749043;, - 7.499930;-1.518514;15.436543;, - 7.499930;-1.831014;15.749043;, - 7.499930;-1.831014;15.436543;, - 7.499930;-1.831014;15.124043;, - -7.500071;-1.831003;15.124043;, - -7.500071;-1.518503;15.436543;, - 7.499930;-1.518514;15.436543;, - 7.499930;-2.143515;15.436543;, - -7.500071;-2.143502;15.436543;, - -7.500071;-1.831003;15.124043;, - 7.499930;-1.831014;15.124043;, - 7.499930;-1.831014;15.749043;, - -7.500072;-1.831003;15.749043;, - -7.500071;-2.143502;15.436543;, - 7.499930;-2.143515;15.436543;, - -7.500072;-1.831003;15.749043;, - 7.499930;-1.831014;15.749043;, - 7.499930;-1.518514;15.436543;, - -7.500071;-1.518503;15.436543;, - -7.500072;-1.518507;-6.438456;, - -7.500072;-1.831007;-6.750956;, - -7.500072;-1.831007;-6.438456;, - 7.499929;-1.831018;-6.750957;, - 7.499929;-1.518518;-6.438457;, - 7.499929;-1.831018;-6.438457;, - -7.500072;-1.831007;-6.750956;, - -7.500072;-2.143506;-6.438456;, - -7.500072;-1.831007;-6.438456;, - 7.499929;-2.143518;-6.438457;, - 7.499929;-1.831018;-6.750957;, - 7.499929;-1.831018;-6.438457;, - -7.500072;-2.143506;-6.438456;, - -7.500072;-1.831006;-6.125956;, - -7.500072;-1.831007;-6.438456;, - 7.499929;-1.831018;-6.125957;, - 7.499929;-2.143518;-6.438457;, - 7.499929;-1.831018;-6.438457;, - -7.500072;-1.518507;-6.438456;, - -7.500072;-1.831007;-6.438456;, - -7.500072;-1.831006;-6.125956;, - 7.499929;-1.518518;-6.438457;, - 7.499929;-1.831018;-6.125957;, - 7.499929;-1.831018;-6.438457;, - 7.499929;-1.831018;-6.750957;, - -7.500072;-1.831007;-6.750956;, - -7.500072;-1.518507;-6.438456;, - 7.499929;-1.518518;-6.438457;, - 7.499929;-2.143518;-6.438457;, - -7.500072;-2.143506;-6.438456;, - -7.500072;-1.831007;-6.750956;, - 7.499929;-1.831018;-6.750957;, - 7.499929;-1.831018;-6.125957;, - -7.500072;-1.831006;-6.125956;, - -7.500072;-2.143506;-6.438456;, - 7.499929;-2.143518;-6.438457;, - -7.500072;-1.831006;-6.125956;, - 7.499929;-1.831018;-6.125957;, - 7.499929;-1.518518;-6.438457;, - -7.500072;-1.518507;-6.438456;, - -6.250069;-5.581011;-6.438455;, - -6.250070;-5.078606;-8.313454;, - -6.250072;-1.831012;-6.438456;, - -6.250070;-5.078606;-8.313454;, - -6.250072;-3.706012;-9.686049;, - -6.250072;-1.831012;-6.438456;, - -6.250072;-3.706012;-9.686049;, - -6.250072;-1.831012;-10.188455;, - -6.250072;-1.831012;-6.438456;, - -6.250072;-1.831012;-10.188455;, - -6.250072; 0.043990;-9.686049;, - -6.250072;-1.831012;-6.438456;, - -6.250072; 0.043990;-9.686049;, - -6.250073; 1.416586;-8.313455;, - -6.250072;-1.831012;-6.438456;, - -6.250073; 1.416586;-8.313455;, - -6.250073; 1.918988;-6.438457;, - -6.250072;-1.831012;-6.438456;, - -6.250073; 1.918988;-6.438457;, - -6.250074; 1.416587;-4.563455;, - -6.250072;-1.831012;-6.438456;, - -6.250074; 1.416587;-4.563455;, - -6.250070; 0.043991;-3.190863;, - -6.250072;-1.831012;-6.438456;, - -6.250070; 0.043991;-3.190863;, - -6.250071;-1.831008;-2.688456;, - -6.250072;-1.831012;-6.438456;, - -6.250071;-1.831008;-2.688456;, - -6.250072;-3.706008;-3.190861;, - -6.250072;-1.831012;-6.438456;, - -6.250072;-3.706008;-3.190861;, - -6.250070;-5.078604;-4.563451;, - -6.250072;-1.831012;-6.438456;, - -6.250069;-5.581011;-6.438455;, - -6.250072;-1.831012;-6.438456;, - -6.250070;-5.078604;-4.563451;, - -8.750070;-5.078609;-8.313452;, - -6.250070;-5.078606;-8.313454;, - -6.250069;-5.581011;-6.438455;, - -8.750071;-5.581011;-6.438452;, - -8.750072;-3.706015;-9.686046;, - -6.250072;-3.706012;-9.686049;, - -6.250070;-5.078606;-8.313454;, - -8.750070;-5.078609;-8.313452;, - -8.750072;-1.831017;-10.188455;, - -6.250072;-1.831012;-10.188455;, - -6.250072;-3.706012;-9.686049;, - -8.750072;-3.706015;-9.686046;, - -8.750072; 0.043985;-9.686051;, - -6.250072; 0.043990;-9.686049;, - -6.250072;-1.831012;-10.188455;, - -8.750072;-1.831017;-10.188455;, - -8.750073; 1.416580;-8.313457;, - -6.250073; 1.416586;-8.313455;, - -6.250072; 0.043990;-9.686049;, - -8.750072; 0.043985;-9.686051;, - -8.750073; 1.918988;-6.438457;, - -6.250073; 1.918988;-6.438457;, - -6.250073; 1.416586;-8.313455;, - -8.750073; 1.416580;-8.313457;, - -8.750072; 1.416587;-4.563457;, - -6.250074; 1.416587;-4.563455;, - -6.250073; 1.918988;-6.438457;, - -8.750073; 1.918988;-6.438457;, - -8.750072; 0.043992;-3.190863;, - -6.250070; 0.043991;-3.190863;, - -6.250074; 1.416587;-4.563455;, - -8.750072; 1.416587;-4.563457;, - -8.750072;-1.831006;-2.688456;, - -6.250071;-1.831008;-2.688456;, - -6.250070; 0.043991;-3.190863;, - -8.750072; 0.043992;-3.190863;, - -8.750072;-3.706008;-3.190857;, - -6.250072;-3.706008;-3.190861;, - -6.250071;-1.831008;-2.688456;, - -8.750072;-1.831006;-2.688456;, - -8.750071;-5.078604;-4.563448;, - -6.250070;-5.078604;-4.563451;, - -6.250072;-3.706008;-3.190861;, - -8.750072;-3.706008;-3.190857;, - -6.250070;-5.078604;-4.563451;, - -8.750071;-5.078604;-4.563448;, - -8.750071;-5.581011;-6.438452;, - -6.250069;-5.581011;-6.438455;, - -8.750072;-3.454809;-5.500954;, - -8.750072;-3.706011;-6.438456;, - -8.750071;-5.581011;-6.438452;, - -8.750071;-5.078604;-4.563448;, - -8.750072;-2.768509;-4.814656;, - -8.750072;-3.454809;-5.500954;, - -8.750071;-5.078604;-4.563448;, - -8.750072;-3.706008;-3.190857;, - -8.750072;-1.831008;-4.563454;, - -8.750072;-2.768509;-4.814656;, - -8.750072;-3.706008;-3.190857;, - -8.750072;-1.831006;-2.688456;, - -8.750072;-0.893508;-4.814660;, - -8.750072;-1.831008;-4.563454;, - -8.750072;-1.831006;-2.688456;, - -8.750072; 0.043992;-3.190863;, - -8.750071;-0.207214;-5.500957;, - -8.750072;-0.893508;-4.814660;, - -8.750072; 0.043992;-3.190863;, - -8.750072; 1.416587;-4.563457;, - -8.750072; 0.043989;-6.438456;, - -8.750071;-0.207214;-5.500957;, - -8.750072; 1.416587;-4.563457;, - -8.750073; 1.918988;-6.438457;, - -8.750072;-0.207214;-7.375956;, - -8.750072; 0.043989;-6.438456;, - -8.750073; 1.918988;-6.438457;, - -8.750073; 1.416580;-8.313457;, - -8.750072;-0.893515;-8.062252;, - -8.750072;-0.207214;-7.375956;, - -8.750073; 1.416580;-8.313457;, - -8.750072; 0.043985;-9.686051;, - -8.750072;-1.831014;-8.313455;, - -8.750072;-0.893515;-8.062252;, - -8.750072; 0.043985;-9.686051;, - -8.750072;-1.831017;-10.188455;, - -8.750072;-2.768514;-8.062252;, - -8.750072;-1.831014;-8.313455;, - -8.750072;-1.831017;-10.188455;, - -8.750072;-3.706015;-9.686046;, - -8.750073;-3.454809;-7.375956;, - -8.750072;-2.768514;-8.062252;, - -8.750072;-3.706015;-9.686046;, - -8.750070;-5.078609;-8.313452;, - -8.750072;-3.706011;-6.438456;, - -8.750073;-3.454809;-7.375956;, - -8.750070;-5.078609;-8.313452;, - -8.750071;-5.581011;-6.438452;, - -7.500072;-3.706011;-6.438456;, - -7.500072;-3.454809;-7.375956;, - -8.750073;-3.454809;-7.375956;, - -8.750072;-3.706011;-6.438456;, - -7.500072;-3.454809;-7.375956;, - -7.500072;-2.768512;-8.062252;, - -8.750072;-2.768514;-8.062252;, - -8.750073;-3.454809;-7.375956;, - -7.500072;-2.768512;-8.062252;, - -7.500072;-1.831012;-8.313455;, - -8.750072;-1.831014;-8.313455;, - -8.750072;-2.768514;-8.062252;, - -7.500072;-1.831012;-8.313455;, - -7.500071;-0.893512;-8.062252;, - -8.750072;-0.893515;-8.062252;, - -8.750072;-1.831014;-8.313455;, - -7.500071;-0.893512;-8.062252;, - -7.500072;-0.207215;-7.375956;, - -8.750072;-0.207214;-7.375956;, - -8.750072;-0.893515;-8.062252;, - -7.500072;-0.207215;-7.375956;, - -7.500072; 0.043988;-6.438456;, - -8.750072; 0.043989;-6.438456;, - -8.750072;-0.207214;-7.375956;, - -7.500072; 0.043988;-6.438456;, - -7.500071;-0.207211;-5.500957;, - -8.750071;-0.207214;-5.500957;, - -8.750072; 0.043989;-6.438456;, - -7.500071;-0.207211;-5.500957;, - -7.500072;-0.893508;-4.814660;, - -8.750072;-0.893508;-4.814660;, - -8.750071;-0.207214;-5.500957;, - -7.500072;-0.893508;-4.814660;, - -7.500071;-1.831008;-4.563454;, - -8.750072;-1.831008;-4.563454;, - -8.750072;-0.893508;-4.814660;, - -7.500071;-1.831008;-4.563454;, - -7.500072;-2.768508;-4.814656;, - -8.750072;-2.768509;-4.814656;, - -8.750072;-1.831008;-4.563454;, - -7.500072;-2.768508;-4.814656;, - -7.500073;-3.454807;-5.500954;, - -8.750072;-3.454809;-5.500954;, - -8.750072;-2.768509;-4.814656;, - -7.500073;-3.454807;-5.500954;, - -7.500072;-3.706011;-6.438456;, - -8.750072;-3.706011;-6.438456;, - -8.750072;-3.454809;-5.500954;, - -7.500073;-3.454807;-5.500954;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-3.706011;-6.438456;, - -7.500072;-2.768508;-4.814656;, - -8.750072;-1.831011;-6.438456;, - -7.500073;-3.454807;-5.500954;, - -7.500071;-1.831008;-4.563454;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-2.768508;-4.814656;, - -7.500072;-0.893508;-4.814660;, - -8.750072;-1.831011;-6.438456;, - -7.500071;-1.831008;-4.563454;, - -7.500071;-0.207211;-5.500957;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-0.893508;-4.814660;, - -7.500072; 0.043988;-6.438456;, - -8.750072;-1.831011;-6.438456;, - -7.500071;-0.207211;-5.500957;, - -7.500072;-0.207215;-7.375956;, - -8.750072;-1.831011;-6.438456;, - -7.500072; 0.043988;-6.438456;, - -7.500071;-0.893512;-8.062252;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-0.207215;-7.375956;, - -7.500072;-1.831012;-8.313455;, - -8.750072;-1.831011;-6.438456;, - -7.500071;-0.893512;-8.062252;, - -7.500072;-2.768512;-8.062252;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-1.831012;-8.313455;, - -7.500072;-3.454809;-7.375956;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-2.768512;-8.062252;, - -7.500072;-3.706011;-6.438456;, - -8.750072;-1.831011;-6.438456;, - -7.500072;-3.454809;-7.375956;, - -6.250068;-5.581008;15.436543;, - -6.250069;-5.078602;13.561544;, - -6.250070;-1.831008;15.436544;, - -6.250069;-5.078602;13.561544;, - -6.250071;-3.706008;12.188950;, - -6.250070;-1.831008;15.436544;, - -6.250071;-3.706008;12.188950;, - -6.250071;-1.831009;11.686544;, - -6.250070;-1.831008;15.436544;, - -6.250071;-1.831009;11.686544;, - -6.250070; 0.043993;12.188948;, - -6.250070;-1.831008;15.436544;, - -6.250070; 0.043993;12.188948;, - -6.250073; 1.416589;13.561543;, - -6.250070;-1.831008;15.436544;, - -6.250073; 1.416589;13.561543;, - -6.250073; 1.918992;15.436543;, - -6.250070;-1.831008;15.436544;, - -6.250073; 1.918992;15.436543;, - -6.250072; 1.416590;17.311543;, - -6.250070;-1.831008;15.436544;, - -6.250072; 1.416590;17.311543;, - -6.250070; 0.043994;18.684135;, - -6.250070;-1.831008;15.436544;, - -6.250070; 0.043994;18.684135;, - -6.250071;-1.831005;19.186543;, - -6.250070;-1.831008;15.436544;, - -6.250071;-1.831005;19.186543;, - -6.250071;-3.706004;18.684137;, - -6.250070;-1.831008;15.436544;, - -6.250071;-3.706004;18.684137;, - -6.250069;-5.078600;17.311543;, - -6.250070;-1.831008;15.436544;, - -6.250068;-5.581008;15.436543;, - -6.250070;-1.831008;15.436544;, - -6.250069;-5.078600;17.311543;, - -8.750070;-5.078605;13.561545;, - -6.250069;-5.078602;13.561544;, - -6.250068;-5.581008;15.436543;, - -8.750070;-5.581007;15.436545;, - -8.750072;-3.706011;12.188951;, - -6.250071;-3.706008;12.188950;, - -6.250069;-5.078602;13.561544;, - -8.750070;-5.078605;13.561545;, - -8.750072;-1.831013;11.686543;, - -6.250071;-1.831009;11.686544;, - -6.250071;-3.706008;12.188950;, - -8.750072;-3.706011;12.188951;, - -8.750071; 0.043989;12.188947;, - -6.250070; 0.043993;12.188948;, - -6.250071;-1.831009;11.686544;, - -8.750072;-1.831013;11.686543;, - -8.750072; 1.416584;13.561542;, - -6.250073; 1.416589;13.561543;, - -6.250070; 0.043993;12.188948;, - -8.750071; 0.043989;12.188947;, - -8.750072; 1.918992;15.436542;, - -6.250073; 1.918992;15.436543;, - -6.250073; 1.416589;13.561543;, - -8.750072; 1.416584;13.561542;, - -8.750072; 1.416590;17.311543;, - -6.250072; 1.416590;17.311543;, - -6.250073; 1.918992;15.436543;, - -8.750072; 1.918992;15.436542;, - -8.750071; 0.043996;18.684135;, - -6.250070; 0.043994;18.684135;, - -6.250072; 1.416590;17.311543;, - -8.750072; 1.416590;17.311543;, - -8.750071;-1.831002;19.186543;, - -6.250071;-1.831005;19.186543;, - -6.250070; 0.043994;18.684135;, - -8.750071; 0.043996;18.684135;, - -8.750072;-3.706005;18.684139;, - -6.250071;-3.706004;18.684137;, - -6.250071;-1.831005;19.186543;, - -8.750071;-1.831002;19.186543;, - -8.750070;-5.078600;17.311546;, - -6.250069;-5.078600;17.311543;, - -6.250071;-3.706004;18.684137;, - -8.750072;-3.706005;18.684139;, - -6.250069;-5.078600;17.311543;, - -8.750070;-5.078600;17.311546;, - -8.750070;-5.581007;15.436545;, - -6.250068;-5.581008;15.436543;, - -8.750072;-3.454805;16.374043;, - -8.750072;-3.706007;15.436547;, - -8.750070;-5.581007;15.436545;, - -8.750070;-5.078600;17.311546;, - -8.750072;-2.768505;17.060341;, - -8.750072;-3.454805;16.374043;, - -8.750070;-5.078600;17.311546;, - -8.750072;-3.706005;18.684139;, - -8.750072;-1.831004;17.311543;, - -8.750072;-2.768505;17.060341;, - -8.750072;-3.706005;18.684139;, - -8.750071;-1.831002;19.186543;, - -8.750071;-0.893504;17.060337;, - -8.750072;-1.831004;17.311543;, - -8.750071;-1.831002;19.186543;, - -8.750071; 0.043996;18.684135;, - -8.750071;-0.207211;16.374039;, - -8.750071;-0.893504;17.060337;, - -8.750071; 0.043996;18.684135;, - -8.750072; 1.416590;17.311543;, - -8.750071; 0.043992;15.436542;, - -8.750071;-0.207211;16.374039;, - -8.750072; 1.416590;17.311543;, - -8.750072; 1.918992;15.436542;, - -8.750071;-0.207211;14.499042;, - -8.750071; 0.043992;15.436542;, - -8.750072; 1.918992;15.436542;, - -8.750072; 1.416584;13.561542;, - -8.750072;-0.893511;13.812745;, - -8.750071;-0.207211;14.499042;, - -8.750072; 1.416584;13.561542;, - -8.750071; 0.043989;12.188947;, - -8.750072;-1.831010;13.561543;, - -8.750072;-0.893511;13.812745;, - -8.750071; 0.043989;12.188947;, - -8.750072;-1.831013;11.686543;, - -8.750072;-2.768511;13.812745;, - -8.750072;-1.831010;13.561543;, - -8.750072;-1.831013;11.686543;, - -8.750072;-3.706011;12.188951;, - -8.750072;-3.454806;14.499043;, - -8.750072;-2.768511;13.812745;, - -8.750072;-3.706011;12.188951;, - -8.750070;-5.078605;13.561545;, - -8.750072;-3.706007;15.436547;, - -8.750072;-3.454806;14.499043;, - -8.750070;-5.078605;13.561545;, - -8.750070;-5.581007;15.436545;, - -7.500071;-3.706007;15.436546;, - -7.500071;-3.454806;14.499044;, - -8.750072;-3.454806;14.499043;, - -8.750072;-3.706007;15.436547;, - -7.500071;-3.454806;14.499044;, - -7.500071;-2.768508;13.812746;, - -8.750072;-2.768511;13.812745;, - -8.750072;-3.454806;14.499043;, - -7.500071;-2.768508;13.812746;, - -7.500070;-1.831008;13.561544;, - -8.750072;-1.831010;13.561543;, - -8.750072;-2.768511;13.812745;, - -7.500070;-1.831008;13.561544;, - -7.500070;-0.893508;13.812746;, - -8.750072;-0.893511;13.812745;, - -8.750072;-1.831010;13.561543;, - -7.500070;-0.893508;13.812746;, - -7.500070;-0.207211;14.499041;, - -8.750071;-0.207211;14.499042;, - -8.750072;-0.893511;13.812745;, - -7.500070;-0.207211;14.499041;, - -7.500070; 0.043992;15.436541;, - -8.750071; 0.043992;15.436542;, - -8.750071;-0.207211;14.499042;, - -7.500070; 0.043992;15.436541;, - -7.500071;-0.207208;16.374041;, - -8.750071;-0.207211;16.374039;, - -8.750071; 0.043992;15.436542;, - -7.500071;-0.207208;16.374041;, - -7.500071;-0.893505;17.060337;, - -8.750071;-0.893504;17.060337;, - -8.750071;-0.207211;16.374039;, - -7.500071;-0.893505;17.060337;, - -7.500071;-1.831005;17.311543;, - -8.750072;-1.831004;17.311543;, - -8.750071;-0.893504;17.060337;, - -7.500071;-1.831005;17.311543;, - -7.500071;-2.768504;17.060341;, - -8.750072;-2.768505;17.060341;, - -8.750072;-1.831004;17.311543;, - -7.500071;-2.768504;17.060341;, - -7.500072;-3.454803;16.374043;, - -8.750072;-3.454805;16.374043;, - -8.750072;-2.768505;17.060341;, - -7.500072;-3.454803;16.374043;, - -7.500071;-3.706007;15.436546;, - -8.750072;-3.706007;15.436547;, - -8.750072;-3.454805;16.374043;, - -7.500072;-3.454803;16.374043;, - -8.750072;-1.831008;15.436543;, - -7.500071;-3.706007;15.436546;, - -7.500071;-2.768504;17.060341;, - -8.750072;-1.831008;15.436543;, - -7.500072;-3.454803;16.374043;, - -7.500071;-1.831005;17.311543;, - -8.750072;-1.831008;15.436543;, - -7.500071;-2.768504;17.060341;, - -7.500071;-0.893505;17.060337;, - -8.750072;-1.831008;15.436543;, - -7.500071;-1.831005;17.311543;, - -7.500071;-0.207208;16.374041;, - -8.750072;-1.831008;15.436543;, - -7.500071;-0.893505;17.060337;, - -7.500070; 0.043992;15.436541;, - -8.750072;-1.831008;15.436543;, - -7.500071;-0.207208;16.374041;, - -7.500070;-0.207211;14.499041;, - -8.750072;-1.831008;15.436543;, - -7.500070; 0.043992;15.436541;, - -7.500070;-0.893508;13.812746;, - -8.750072;-1.831008;15.436543;, - -7.500070;-0.207211;14.499041;, - -7.500070;-1.831008;13.561544;, - -8.750072;-1.831008;15.436543;, - -7.500070;-0.893508;13.812746;, - -7.500071;-2.768508;13.812746;, - -8.750072;-1.831008;15.436543;, - -7.500070;-1.831008;13.561544;, - -7.500071;-3.454806;14.499044;, - -8.750072;-1.831008;15.436543;, - -7.500071;-2.768508;13.812746;, - -7.500071;-3.706007;15.436546;, - -8.750072;-1.831008;15.436543;, - -7.500071;-3.454806;14.499044;, - 6.249932; 1.918990;15.436543;, - 6.249932; 1.416587;13.561543;, - 6.249928;-1.831009;15.436543;, - 6.249932; 1.416587;13.561543;, - 6.249930; 0.043989;12.188949;, - 6.249928;-1.831009;15.436543;, - 6.249930; 0.043989;12.188949;, - 6.249928;-1.831010;11.686543;, - 6.249928;-1.831009;15.436543;, - 6.249928;-1.831010;11.686543;, - 6.249928;-3.706010;12.188950;, - 6.249928;-1.831009;15.436543;, - 6.249928;-3.706010;12.188950;, - 6.249927;-5.078604;13.561544;, - 6.249928;-1.831009;15.436543;, - 6.249927;-5.078604;13.561544;, - 6.249927;-5.581009;15.436544;, - 6.249928;-1.831009;15.436543;, - 6.249927;-5.581009;15.436544;, - 6.249926;-5.078603;17.311543;, - 6.249928;-1.831009;15.436543;, - 6.249926;-5.078603;17.311543;, - 6.249929;-3.706009;18.684135;, - 6.249928;-1.831009;15.436543;, - 6.249929;-3.706009;18.684135;, - 6.249929;-1.831009;19.186543;, - 6.249928;-1.831009;15.436543;, - 6.249929;-1.831009;19.186543;, - 6.249929; 0.043990;18.684137;, - 6.249928;-1.831009;15.436543;, - 6.249929; 0.043990;18.684137;, - 6.249931; 1.416585;17.311543;, - 6.249928;-1.831009;15.436543;, - 6.249932; 1.918990;15.436543;, - 6.249928;-1.831009;15.436543;, - 6.249931; 1.416585;17.311543;, - 8.749932; 1.416585;13.561545;, - 6.249932; 1.416587;13.561543;, - 6.249932; 1.918990;15.436543;, - 8.749932; 1.918990;15.436545;, - 8.749930; 0.043992;12.188951;, - 6.249930; 0.043989;12.188949;, - 6.249932; 1.416587;13.561543;, - 8.749932; 1.416585;13.561545;, - 8.749928;-1.831008;11.686543;, - 6.249928;-1.831010;11.686543;, - 6.249930; 0.043989;12.188949;, - 8.749930; 0.043992;12.188951;, - 8.749928;-3.706008;12.188948;, - 6.249928;-3.706010;12.188950;, - 6.249928;-1.831010;11.686543;, - 8.749928;-1.831008;11.686543;, - 8.749927;-5.078604;13.561543;, - 6.249927;-5.078604;13.561544;, - 6.249928;-3.706010;12.188950;, - 8.749928;-3.706008;12.188948;, - 8.749927;-5.581009;15.436543;, - 6.249927;-5.581009;15.436544;, - 6.249927;-5.078604;13.561544;, - 8.749927;-5.078604;13.561543;, - 8.749926;-5.078607;17.311541;, - 6.249926;-5.078603;17.311543;, - 6.249927;-5.581009;15.436544;, - 8.749927;-5.581009;15.436543;, - 8.749928;-3.706014;18.684135;, - 6.249929;-3.706009;18.684135;, - 6.249926;-5.078603;17.311543;, - 8.749926;-5.078607;17.311541;, - 8.749929;-1.831014;19.186543;, - 6.249929;-1.831009;19.186543;, - 6.249929;-3.706009;18.684135;, - 8.749928;-3.706014;18.684135;, - 8.749929; 0.043986;18.684139;, - 6.249929; 0.043990;18.684137;, - 6.249929;-1.831009;19.186543;, - 8.749929;-1.831014;19.186543;, - 8.749931; 1.416583;17.311546;, - 6.249931; 1.416585;17.311543;, - 6.249929; 0.043990;18.684137;, - 8.749929; 0.043986;18.684139;, - 6.249931; 1.416585;17.311543;, - 8.749931; 1.416583;17.311546;, - 8.749932; 1.918990;15.436545;, - 6.249932; 1.918990;15.436543;, - 8.749929;-0.207215;16.374043;, - 8.749928; 0.043990;15.436545;, - 8.749932; 1.918990;15.436545;, - 8.749931; 1.416583;17.311546;, - 8.749929;-0.893512;17.060341;, - 8.749929;-0.207215;16.374043;, - 8.749931; 1.416583;17.311546;, - 8.749929; 0.043986;18.684139;, - 8.749928;-1.831012;17.311543;, - 8.749929;-0.893512;17.060341;, - 8.749929; 0.043986;18.684139;, - 8.749929;-1.831014;19.186543;, - 8.749928;-2.768512;17.060337;, - 8.749928;-1.831012;17.311543;, - 8.749929;-1.831014;19.186543;, - 8.749928;-3.706014;18.684135;, - 8.749929;-3.454809;16.374041;, - 8.749928;-2.768512;17.060337;, - 8.749928;-3.706014;18.684135;, - 8.749926;-5.078607;17.311541;, - 8.749928;-3.706009;15.436543;, - 8.749929;-3.454809;16.374041;, - 8.749926;-5.078607;17.311541;, - 8.749927;-5.581009;15.436543;, - 8.749928;-3.454808;14.499043;, - 8.749928;-3.706009;15.436543;, - 8.749927;-5.581009;15.436543;, - 8.749927;-5.078604;13.561543;, - 8.749929;-2.768510;13.812746;, - 8.749928;-3.454808;14.499043;, - 8.749927;-5.078604;13.561543;, - 8.749928;-3.706008;12.188948;, - 8.749928;-1.831010;13.561543;, - 8.749929;-2.768510;13.812746;, - 8.749928;-3.706008;12.188948;, - 8.749928;-1.831008;11.686543;, - 8.749929;-0.893510;13.812746;, - 8.749928;-1.831010;13.561543;, - 8.749928;-1.831008;11.686543;, - 8.749930; 0.043992;12.188951;, - 8.749930;-0.207213;14.499043;, - 8.749929;-0.893510;13.812746;, - 8.749930; 0.043992;12.188951;, - 8.749932; 1.416585;13.561545;, - 8.749928; 0.043990;15.436545;, - 8.749930;-0.207213;14.499043;, - 8.749932; 1.416585;13.561545;, - 8.749932; 1.918990;15.436545;, - 7.499930; 0.043990;15.436545;, - 7.499930;-0.207213;14.499043;, - 8.749930;-0.207213;14.499043;, - 8.749928; 0.043990;15.436545;, - 7.499930;-0.207213;14.499043;, - 7.499929;-0.893510;13.812746;, - 8.749929;-0.893510;13.812746;, - 8.749930;-0.207213;14.499043;, - 7.499929;-0.893510;13.812746;, - 7.499928;-1.831010;13.561543;, - 8.749928;-1.831010;13.561543;, - 8.749929;-0.893510;13.812746;, - 7.499928;-1.831010;13.561543;, - 7.499929;-2.768510;13.812746;, - 8.749929;-2.768510;13.812746;, - 8.749928;-1.831010;13.561543;, - 7.499929;-2.768510;13.812746;, - 7.499928;-3.454807;14.499043;, - 8.749928;-3.454808;14.499043;, - 8.749929;-2.768510;13.812746;, - 7.499928;-3.454807;14.499043;, - 7.499928;-3.706010;15.436543;, - 8.749928;-3.706009;15.436543;, - 8.749928;-3.454808;14.499043;, - 7.499928;-3.706010;15.436543;, - 7.499929;-3.454809;16.374041;, - 8.749929;-3.454809;16.374041;, - 8.749928;-3.706009;15.436543;, - 7.499929;-3.454809;16.374041;, - 7.499929;-2.768512;17.060337;, - 8.749928;-2.768512;17.060337;, - 8.749929;-3.454809;16.374041;, - 7.499929;-2.768512;17.060337;, - 7.499929;-1.831012;17.311543;, - 8.749928;-1.831012;17.311543;, - 8.749928;-2.768512;17.060337;, - 7.499929;-1.831012;17.311543;, - 7.499929;-0.893512;17.060341;, - 8.749929;-0.893512;17.060341;, - 8.749928;-1.831012;17.311543;, - 7.499929;-0.893512;17.060341;, - 7.499929;-0.207215;16.374043;, - 8.749929;-0.207215;16.374043;, - 8.749929;-0.893512;17.060341;, - 7.499929;-0.207215;16.374043;, - 7.499930; 0.043990;15.436545;, - 8.749928; 0.043990;15.436545;, - 8.749929;-0.207215;16.374043;, - 7.499929;-0.207215;16.374043;, - 8.749928;-1.831010;15.436543;, - 7.499930; 0.043990;15.436545;, - 7.499929;-0.893512;17.060341;, - 8.749928;-1.831010;15.436543;, - 7.499929;-0.207215;16.374043;, - 7.499929;-1.831012;17.311543;, - 8.749928;-1.831010;15.436543;, - 7.499929;-0.893512;17.060341;, - 7.499929;-2.768512;17.060337;, - 8.749928;-1.831010;15.436543;, - 7.499929;-1.831012;17.311543;, - 7.499929;-3.454809;16.374041;, - 8.749928;-1.831010;15.436543;, - 7.499929;-2.768512;17.060337;, - 7.499928;-3.706010;15.436543;, - 8.749928;-1.831010;15.436543;, - 7.499929;-3.454809;16.374041;, - 7.499928;-3.454807;14.499043;, - 8.749928;-1.831010;15.436543;, - 7.499928;-3.706010;15.436543;, - 7.499929;-2.768510;13.812746;, - 8.749928;-1.831010;15.436543;, - 7.499928;-3.454807;14.499043;, - 7.499928;-1.831010;13.561543;, - 8.749928;-1.831010;15.436543;, - 7.499929;-2.768510;13.812746;, - 7.499929;-0.893510;13.812746;, - 8.749928;-1.831010;15.436543;, - 7.499928;-1.831010;13.561543;, - 7.499930;-0.207213;14.499043;, - 8.749928;-1.831010;15.436543;, - 7.499929;-0.893510;13.812746;, - 7.499930; 0.043990;15.436545;, - 8.749928;-1.831010;15.436543;, - 7.499930;-0.207213;14.499043;, - 6.249931; 1.918986;-6.438457;, - 6.249931; 1.416584;-8.313455;, - 6.249928;-1.831013;-6.438457;, - 6.249931; 1.416584;-8.313455;, - 6.249929; 0.043986;-9.686049;, - 6.249928;-1.831013;-6.438457;, - 6.249929; 0.043986;-9.686049;, - 6.249928;-1.831013;-10.188455;, - 6.249928;-1.831013;-6.438457;, - 6.249928;-1.831013;-10.188455;, - 6.249928;-3.706014;-9.686049;, - 6.249928;-1.831013;-6.438457;, - 6.249928;-3.706014;-9.686049;, - 6.249925;-5.078608;-8.313454;, - 6.249928;-1.831013;-6.438457;, - 6.249925;-5.078608;-8.313454;, - 6.249925;-5.581012;-6.438456;, - 6.249928;-1.831013;-6.438457;, - 6.249925;-5.581012;-6.438456;, - 6.249925;-5.078607;-4.563455;, - 6.249928;-1.831013;-6.438457;, - 6.249925;-5.078607;-4.563455;, - 6.249928;-3.706013;-3.190863;, - 6.249928;-1.831013;-6.438457;, - 6.249928;-3.706013;-3.190863;, - 6.249928;-1.831012;-2.688457;, - 6.249928;-1.831013;-6.438457;, - 6.249928;-1.831012;-2.688457;, - 6.249929; 0.043987;-3.190862;, - 6.249928;-1.831013;-6.438457;, - 6.249929; 0.043987;-3.190862;, - 6.249931; 1.416581;-4.563453;, - 6.249928;-1.831013;-6.438457;, - 6.249931; 1.918986;-6.438457;, - 6.249928;-1.831013;-6.438457;, - 6.249931; 1.416581;-4.563453;, - 8.749930; 1.416581;-8.313453;, - 6.249931; 1.416584;-8.313455;, - 6.249931; 1.918986;-6.438457;, - 8.749930; 1.918987;-6.438455;, - 8.749928; 0.043988;-9.686046;, - 6.249929; 0.043986;-9.686049;, - 6.249931; 1.416584;-8.313455;, - 8.749930; 1.416581;-8.313453;, - 8.749928;-1.831012;-10.188455;, - 6.249928;-1.831013;-10.188455;, - 6.249929; 0.043986;-9.686049;, - 8.749928; 0.043988;-9.686046;, - 8.749928;-3.706012;-9.686049;, - 6.249928;-3.706014;-9.686049;, - 6.249928;-1.831013;-10.188455;, - 8.749928;-1.831012;-10.188455;, - 8.749926;-5.078608;-8.313455;, - 6.249925;-5.078608;-8.313454;, - 6.249928;-3.706014;-9.686049;, - 8.749928;-3.706012;-9.686049;, - 8.749926;-5.581013;-6.438457;, - 6.249925;-5.581012;-6.438456;, - 6.249925;-5.078608;-8.313454;, - 8.749926;-5.078608;-8.313455;, - 8.749926;-5.078610;-4.563457;, - 6.249925;-5.078607;-4.563455;, - 6.249925;-5.581012;-6.438456;, - 8.749926;-5.581013;-6.438457;, - 8.749928;-3.706017;-3.190864;, - 6.249928;-3.706013;-3.190863;, - 6.249925;-5.078607;-4.563455;, - 8.749926;-5.078610;-4.563457;, - 8.749928;-1.831017;-2.688457;, - 6.249928;-1.831012;-2.688457;, - 6.249928;-3.706013;-3.190863;, - 8.749928;-3.706017;-3.190864;, - 8.749928; 0.043982;-3.190859;, - 6.249929; 0.043987;-3.190862;, - 6.249928;-1.831012;-2.688457;, - 8.749928;-1.831017;-2.688457;, - 8.749930; 1.416579;-4.563451;, - 6.249931; 1.416581;-4.563453;, - 6.249929; 0.043987;-3.190862;, - 8.749928; 0.043982;-3.190859;, - 6.249931; 1.416581;-4.563453;, - 8.749930; 1.416579;-4.563451;, - 8.749930; 1.918987;-6.438455;, - 6.249931; 1.918986;-6.438457;, - 8.749928;-0.207219;-5.500956;, - 8.749928; 0.043987;-6.438457;, - 8.749930; 1.918987;-6.438455;, - 8.749930; 1.416579;-4.563451;, - 8.749928;-0.893516;-4.814658;, - 8.749928;-0.207219;-5.500956;, - 8.749930; 1.416579;-4.563451;, - 8.749928; 0.043982;-3.190859;, - 8.749928;-1.831016;-4.563455;, - 8.749928;-0.893516;-4.814658;, - 8.749928; 0.043982;-3.190859;, - 8.749928;-1.831017;-2.688457;, - 8.749928;-2.768516;-4.814660;, - 8.749928;-1.831016;-4.563455;, - 8.749928;-1.831017;-2.688457;, - 8.749928;-3.706017;-3.190864;, - 8.749928;-3.454813;-5.500957;, - 8.749928;-2.768516;-4.814660;, - 8.749928;-3.706017;-3.190864;, - 8.749926;-5.078610;-4.563457;, - 8.749928;-3.706013;-6.438457;, - 8.749928;-3.454813;-5.500957;, - 8.749926;-5.078610;-4.563457;, - 8.749926;-5.581013;-6.438457;, - 8.749928;-3.454811;-7.375957;, - 8.749928;-3.706013;-6.438457;, - 8.749926;-5.581013;-6.438457;, - 8.749926;-5.078608;-8.313455;, - 8.749928;-2.768513;-8.062251;, - 8.749928;-3.454811;-7.375957;, - 8.749926;-5.078608;-8.313455;, - 8.749928;-3.706012;-9.686049;, - 8.749928;-1.831013;-8.313455;, - 8.749928;-2.768513;-8.062251;, - 8.749928;-3.706012;-9.686049;, - 8.749928;-1.831012;-10.188455;, - 8.749928;-0.893513;-8.062251;, - 8.749928;-1.831013;-8.313455;, - 8.749928;-1.831012;-10.188455;, - 8.749928; 0.043988;-9.686046;, - 8.749928;-0.207216;-7.375957;, - 8.749928;-0.893513;-8.062251;, - 8.749928; 0.043988;-9.686046;, - 8.749930; 1.416581;-8.313453;, - 8.749928; 0.043987;-6.438457;, - 8.749928;-0.207216;-7.375957;, - 8.749930; 1.416581;-8.313453;, - 8.749930; 1.918987;-6.438455;, - 7.499929; 0.043986;-6.438457;, - 7.499929;-0.207216;-7.375957;, - 8.749928;-0.207216;-7.375957;, - 8.749928; 0.043987;-6.438457;, - 7.499929;-0.207216;-7.375957;, - 7.499929;-0.893513;-8.062252;, - 8.749928;-0.893513;-8.062251;, - 8.749928;-0.207216;-7.375957;, - 7.499929;-0.893513;-8.062252;, - 7.499928;-1.831013;-8.313455;, - 8.749928;-1.831013;-8.313455;, - 8.749928;-0.893513;-8.062251;, - 7.499928;-1.831013;-8.313455;, - 7.499928;-2.768514;-8.062252;, - 8.749928;-2.768513;-8.062251;, - 8.749928;-1.831013;-8.313455;, - 7.499928;-2.768514;-8.062252;, - 7.499928;-3.454811;-7.375957;, - 8.749928;-3.454811;-7.375957;, - 8.749928;-2.768513;-8.062251;, - 7.499928;-3.454811;-7.375957;, - 7.499928;-3.706013;-6.438457;, - 8.749928;-3.706013;-6.438457;, - 8.749928;-3.454811;-7.375957;, - 7.499928;-3.706013;-6.438457;, - 7.499928;-3.454813;-5.500957;, - 8.749928;-3.454813;-5.500957;, - 8.749928;-3.706013;-6.438457;, - 7.499928;-3.454813;-5.500957;, - 7.499928;-2.768515;-4.814660;, - 8.749928;-2.768516;-4.814660;, - 8.749928;-3.454813;-5.500957;, - 7.499928;-2.768515;-4.814660;, - 7.499929;-1.831016;-4.563456;, - 8.749928;-1.831016;-4.563455;, - 8.749928;-2.768516;-4.814660;, - 7.499929;-1.831016;-4.563456;, - 7.499928;-0.893516;-4.814658;, - 8.749928;-0.893516;-4.814658;, - 8.749928;-1.831016;-4.563455;, - 7.499928;-0.893516;-4.814658;, - 7.499929;-0.207219;-5.500956;, - 8.749928;-0.207219;-5.500956;, - 8.749928;-0.893516;-4.814658;, - 7.499929;-0.207219;-5.500956;, - 7.499929; 0.043986;-6.438457;, - 8.749928; 0.043987;-6.438457;, - 8.749928;-0.207219;-5.500956;, - 7.499929;-0.207219;-5.500956;, - 8.749928;-1.831013;-6.438457;, - 7.499929; 0.043986;-6.438457;, - 7.499928;-0.893516;-4.814658;, - 8.749928;-1.831013;-6.438457;, - 7.499929;-0.207219;-5.500956;, - 7.499929;-1.831016;-4.563456;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-0.893516;-4.814658;, - 7.499928;-2.768515;-4.814660;, - 8.749928;-1.831013;-6.438457;, - 7.499929;-1.831016;-4.563456;, - 7.499928;-3.454813;-5.500957;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-2.768515;-4.814660;, - 7.499928;-3.706013;-6.438457;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-3.454813;-5.500957;, - 7.499928;-3.454811;-7.375957;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-3.706013;-6.438457;, - 7.499928;-2.768514;-8.062252;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-3.454811;-7.375957;, - 7.499928;-1.831013;-8.313455;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-2.768514;-8.062252;, - 7.499929;-0.893513;-8.062252;, - 8.749928;-1.831013;-6.438457;, - 7.499928;-1.831013;-8.313455;, - 7.499929;-0.207216;-7.375957;, - 8.749928;-1.831013;-6.438457;, - 7.499929;-0.893513;-8.062252;, - 7.499929; 0.043986;-6.438457;, - 8.749928;-1.831013;-6.438457;, - 7.499929;-0.207216;-7.375957;, - 9.999928; 5.668987;-2.688458;, - 8.749928; 5.668985;-11.438457;, - 8.749931; 6.918987;-3.938444;, - 7.499934;13.168989; 2.311541;, - 9.999928; 5.668987;-2.688458;, - 8.749931; 6.918987;-3.938444;, - 8.749928; 5.668985;-11.438457;, - 3.749928; 5.668986;-12.688445;, - 3.749929; 7.543987;-5.188457;, - 8.749931; 6.918987;-3.938444;, - 3.749929; 5.668992;22.311543;, - 8.749929; 5.668991;21.061541;, - 7.499930;13.168992;15.436542;, - 3.749931;13.793988;16.061541;, - 8.749931; 6.918987;-3.938444;, - 3.749929; 7.543987;-5.188457;, - 3.749931;13.793985; 1.061541;, - 7.499934;13.168989; 2.311541;, - 3.749928; 1.918985;-12.688454;, - 3.749928; 5.668986;-12.688445;, - 8.749928; 5.668985;-11.438457;, - 8.749928; 3.168986;-11.438457;, - 3.749928;-0.581014;-11.438455;, - 3.749928; 1.918985;-12.688454;, - 8.749928; 3.168986;-11.438457;, - 7.499929;-0.581014;-10.188456;, - 8.749929; 3.168991;21.061541;, - 8.749929; 5.668991;21.061541;, - 3.749929; 5.668992;22.311543;, - 3.749929; 3.168991;22.311543;, - 7.499929;-0.581009;19.811541;, - 8.749929; 3.168991;21.061541;, - 3.749929; 3.168991;22.311543;, - 3.749929;-0.581009;21.061541;, - 8.749929; 5.668991;21.061541;, - 9.999923; 5.668990;13.561543;, - 7.499930;13.168992;15.436542;, - -8.750070; 5.668993;21.061539;, - -7.500069;13.168994;15.436542;, - -10.000068; 5.668992;13.561542;, - 8.749924;-0.581012;-2.264622;, - 8.749923;-0.581010;11.061543;, - 3.749929;-1.831010;11.061543;, - 3.749929;-1.831013;-2.264621;, - 9.999928; 5.668987;-2.688458;, - 9.999923; 5.668990;13.561543;, - 9.999930; 3.168990;13.561543;, - 9.999928; 3.168987;-2.688457;, - 9.999928; 3.168987;-2.688457;, - 9.999930; 3.168990;13.561543;, - 8.749923;-0.581010;11.061543;, - 8.749924;-0.581012;-2.264622;, - -8.750069;-0.581011;-2.264623;, - -8.750072;-0.581008;11.061543;, - -10.000069; 3.168992;13.561542;, - -10.000071; 3.168989;-2.688457;, - -10.000071; 3.168989;-2.688457;, - -10.000069; 3.168992;13.561542;, - -10.000068; 5.668992;13.561542;, - -10.000063; 5.668989;-2.688457;, - -3.750072; 5.668986;-12.688456;, - -8.750072; 5.668987;-11.438456;, - -8.750060; 6.918989;-3.938469;, - -3.750071; 7.543987;-5.188457;, - 3.749928; 5.668986;-12.688445;, - -3.750072; 5.668986;-12.688456;, - -3.750071; 7.543987;-5.188457;, - 3.749929; 7.543987;-5.188457;, - -3.750071; 5.668992;22.311539;, - 3.749929; 5.668992;22.311543;, - 3.749931;13.793988;16.061541;, - -3.750070;13.793991;16.061539;, - -8.750070; 5.668993;21.061539;, - -3.750071; 5.668992;22.311539;, - -3.750070;13.793991;16.061539;, - -7.500069;13.168994;15.436542;, - -3.750071; 7.543987;-5.188457;, - -8.750060; 6.918989;-3.938469;, - -7.500067;13.168991; 2.311542;, - -3.750070;13.793988; 1.061542;, - 3.749929; 7.543987;-5.188457;, - -3.750071; 7.543987;-5.188457;, - -3.750070;13.793988; 1.061542;, - 3.749931;13.793985; 1.061541;, - -3.750072; 5.668986;-12.688456;, - 3.749928; 5.668986;-12.688445;, - 3.749928; 1.918985;-12.688454;, - -3.750072; 1.918987;-12.688455;, - -8.750072; 5.668987;-11.438456;, - -3.750072; 5.668986;-12.688456;, - -3.750072; 1.918987;-12.688455;, - -8.750072; 3.168988;-11.438456;, - -8.750072; 3.168988;-11.438456;, - -3.750072; 1.918987;-12.688455;, - -3.750072;-0.581013;-11.438455;, - -7.500072;-0.581012;-10.188455;, - 3.749928;-0.581014;-11.438455;, - -3.750072;-0.581013;-11.438455;, - -3.750072; 1.918987;-12.688455;, - 3.749928; 1.918985;-12.688454;, - -3.750071; 5.668992;22.311539;, - -8.750070; 5.668993;21.061539;, - -8.750070; 3.168993;21.061539;, - -3.750071; 3.168993;22.311539;, - 3.749929; 5.668992;22.311543;, - -3.750071; 5.668992;22.311539;, - -3.750071; 3.168993;22.311539;, - 3.749929; 3.168991;22.311543;, - -3.750071; 3.168993;22.311539;, - -8.750070; 3.168993;21.061539;, - -7.500070;-0.581007;19.811541;, - -3.750071;-0.581008;21.061541;, - 3.749929; 3.168991;22.311543;, - -3.750071; 3.168993;22.311539;, - -3.750071;-0.581008;21.061541;, - 3.749929;-0.581009;21.061541;, - -3.750071;-1.831009;11.061543;, - -8.750072;-0.581008;11.061543;, - -8.750069;-0.581011;-2.264623;, - -3.750071;-1.831011;-2.264623;, - 3.749929;-1.831010;11.061543;, - -3.750071;-1.831009;11.061543;, - -3.750071;-1.831011;-2.264623;, - 3.749929;-1.831013;-2.264621;, - 8.749928; 5.668985;-11.438457;, - 9.999928; 5.668987;-2.688458;, - 9.687428; 3.168987;-5.188457;, - 9.687428; 3.168987;-5.188457;, - 9.999928; 5.668987;-2.688458;, - 9.999928; 3.168987;-2.688457;, - 9.999928; 3.168987;-2.688457;, - 8.749924;-0.581012;-2.264622;, - 9.687428; 3.168987;-5.188457;, - -9.687571; 3.168989;-5.188455;, - -8.750069;-0.581011;-2.264623;, - -10.000071; 3.168989;-2.688457;, - -10.000063; 5.668989;-2.688457;, - -8.750072; 5.668987;-11.438456;, - -9.687571; 3.168989;-5.188455;, - -10.000071; 3.168989;-2.688457;, - -10.000063; 5.668989;-2.688457;, - -9.687571; 3.168989;-5.188455;, - 9.062428; 2.543986;-8.938455;, - 7.499929;-0.581014;-10.188456;, - 8.749928; 3.168986;-11.438457;, - -7.500072;-0.581012;-10.188455;, - -9.062572; 2.543988;-8.938455;, - -8.750072; 3.168988;-11.438456;, - -9.062572; 2.543988;-8.938455;, - -9.687571; 3.168989;-5.188455;, - -8.750072; 5.668987;-11.438456;, - -8.750072; 3.168988;-11.438456;, - 9.062428; 2.543986;-8.938455;, - 8.749928; 3.168986;-11.438457;, - 8.749928; 5.668985;-11.438457;, - 9.687428; 3.168987;-5.188457;, - 3.749928; 3.168987;-5.188456;, - 3.749929; 2.543986;-8.938455;, - 9.062428; 2.543986;-8.938455;, - 9.687428; 3.168987;-5.188457;, - -3.750072;-0.581013;-10.188455;, - -3.750072;-0.581013;-11.438455;, - 3.749928;-0.581014;-11.438455;, - 3.749928;-0.581014;-10.188455;, - 3.749928; 3.168987;-5.188456;, - 9.687428; 3.168987;-5.188457;, - 8.749924;-0.581012;-2.264622;, - 3.749929;-1.831013;-2.264621;, - 3.749928;-0.581014;-10.188455;, - 3.749928;-0.581014;-11.438455;, - 7.499929;-0.581014;-10.188456;, - 3.749929; 2.543986;-8.938455;, - 3.749928;-0.581014;-10.188455;, - 7.499929;-0.581014;-10.188456;, - 9.062428; 2.543986;-8.938455;, - 3.749929; 2.543986;-8.938455;, - 3.749928; 3.168987;-5.188456;, - 3.749929;-1.831013;-2.264621;, - 3.749928;-0.581014;-10.188455;, - -3.750072;-0.581013;-10.188455;, - 3.749928;-0.581014;-10.188455;, - 3.749929;-1.831013;-2.264621;, - -3.750071;-1.831011;-2.264623;, - -3.750071; 2.543988;-8.938455;, - -3.750071; 3.168988;-5.188456;, - -9.687571; 3.168989;-5.188455;, - -9.062572; 2.543988;-8.938455;, - -3.750071; 2.543988;-8.938455;, - -9.062572; 2.543988;-8.938455;, - -7.500072;-0.581012;-10.188455;, - -3.750072;-0.581013;-10.188455;, - -3.750071; 3.168988;-5.188456;, - -3.750071;-1.831011;-2.264623;, - -8.750069;-0.581011;-2.264623;, - -9.687571; 3.168989;-5.188455;, - -3.750071; 2.543988;-8.938455;, - -3.750072;-0.581013;-10.188455;, - -3.750071;-1.831011;-2.264623;, - -3.750071; 3.168988;-5.188456;, - -3.750072;-0.581013;-11.438455;, - -3.750072;-0.581013;-10.188455;, - -7.500072;-0.581012;-10.188455;, - 9.374929; 3.168991;17.311543;, - 8.749929; 5.668991;21.061541;, - 8.749929; 3.168991;21.061541;, - 8.749929; 3.168991;21.061541;, - 7.499929;-0.581009;19.811541;, - 9.374929; 3.168991;17.311543;, - 9.999930; 3.168990;13.561543;, - 9.999923; 5.668990;13.561543;, - 8.749929; 5.668991;21.061541;, - 9.374929; 3.168991;17.311543;, - -8.750070; 3.168993;21.061539;, - -8.750070; 5.668993;21.061539;, - -9.375071; 3.168993;17.311543;, - -8.750070; 3.168993;21.061539;, - -9.375071; 3.168993;17.311543;, - -7.500070;-0.581007;19.811541;, - -10.000069; 3.168992;13.561542;, - -9.375071; 3.168993;17.311543;, - -8.750070; 5.668993;21.061539;, - -10.000068; 5.668992;13.561542;, - -3.750071;-0.581008;19.811539;, - -3.750071;-1.831009;11.061543;, - 3.749929;-1.831010;11.061543;, - 3.749929;-0.581009;19.811539;, - -3.750071;-0.581008;21.061541;, - -3.750071;-0.581008;19.811539;, - 3.749929;-0.581009;19.811539;, - 3.749929;-0.581009;21.061541;, - 3.749929;-0.581009;21.061541;, - 3.749929;-0.581009;19.811539;, - 7.499929;-0.581009;19.811541;, - -3.750071;-0.581008;19.811539;, - -3.750071;-0.581008;21.061541;, - -7.500070;-0.581007;19.811541;, - -3.750071; 3.168991;13.561543;, - -3.750071; 3.168992;17.311543;, - -9.375071; 3.168993;17.311543;, - -10.000069; 3.168992;13.561542;, - 3.749929; 3.168990;17.311543;, - 3.749929;-0.581009;19.811539;, - 3.749929;-1.831010;11.061543;, - 3.749930; 3.168990;13.561543;, - -3.750071; 3.168991;13.561543;, - -10.000069; 3.168992;13.561542;, - -8.750072;-0.581008;11.061543;, - -3.750071;-1.831009;11.061543;, - -3.750071; 3.168992;17.311543;, - -3.750071; 3.168991;13.561543;, - -3.750071;-1.831009;11.061543;, - -3.750071;-0.581008;19.811539;, - -3.750071;-0.581008;19.811539;, - -7.500070;-0.581007;19.811541;, - -9.375071; 3.168993;17.311543;, - -3.750071; 3.168992;17.311543;, - -3.750070;13.793988; 1.061542;, - -3.750070;13.793991;16.061539;, - 3.749931;13.793988;16.061541;, - 3.749931;13.793985; 1.061541;, - 3.749931;13.793985; 1.061541;, - 3.749931;13.793988;16.061541;, - 7.499930;13.168992;15.436542;, - 7.499934;13.168989; 2.311541;, - -3.750070;13.793988; 1.061542;, - -7.500067;13.168991; 2.311542;, - -7.500069;13.168994;15.436542;, - -3.750070;13.793991;16.061539;, - -8.750072; 5.668987;-11.438456;, - -10.000063; 5.668989;-2.688457;, - -8.750060; 6.918989;-3.938469;, - -10.000063; 5.668989;-2.688457;, - -7.500067;13.168991; 2.311542;, - -8.750060; 6.918989;-3.938469;, - 3.749929; 3.168990;17.311543;, - 9.374929; 3.168991;17.311543;, - 7.499929;-0.581009;19.811541;, - 3.749929;-0.581009;19.811539;, - 3.749929; 3.168990;17.311543;, - 3.749930; 3.168990;13.561543;, - 9.999930; 3.168990;13.561543;, - 9.374929; 3.168991;17.311543;, - 3.749930; 3.168990;13.561543;, - 3.749929;-1.831010;11.061543;, - 8.749923;-0.581010;11.061543;, - 9.999930; 3.168990;13.561543;, - 7.812430;12.231491;13.366229;, - 7.812433;12.231490; 3.522479;, - 7.499934;13.168989; 2.311541;, - 7.499930;13.168992;15.436542;, - 9.687427; 6.606488;11.959980;, - 7.812430;12.231491;13.366229;, - 7.499930;13.168992;15.436542;, - 9.999923; 5.668990;13.561543;, - 9.687428; 6.606487;-0.227520;, - 9.687427; 6.606488;11.959980;, - 9.999923; 5.668990;13.561543;, - 9.999928; 5.668987;-2.688458;, - 7.812433;12.231490; 3.522479;, - 9.687428; 6.606487;-0.227520;, - 9.999928; 5.668987;-2.688458;, - 7.499934;13.168989; 2.311541;, - 9.687427; 6.606488;11.959980;, - 9.687428; 6.606487;-0.227520;, - 7.812433;12.231490; 3.522479;, - 7.812430;12.231491;13.366229;, - -7.812567;12.231492; 3.522480;, - -7.812569;12.231493;13.366229;, - -7.500069;13.168994;15.436542;, - -7.500067;13.168991; 2.311542;, - -7.812569;12.231493;13.366229;, - -9.687568; 6.606491;11.959979;, - -10.000068; 5.668992;13.561542;, - -7.500069;13.168994;15.436542;, - -9.687568; 6.606491;11.959979;, - -9.687565; 6.606489;-0.227519;, - -10.000063; 5.668989;-2.688457;, - -10.000068; 5.668992;13.561542;, - -9.687565; 6.606489;-0.227519;, - -7.812567;12.231492; 3.522480;, - -7.500067;13.168991; 2.311542;, - -10.000063; 5.668989;-2.688457;, - -9.687568; 6.606491;11.959979;, - -7.812569;12.231493;13.366229;, - -7.812567;12.231492; 3.522480;, - -9.687565; 6.606489;-0.227519;; - 510; - 4;3,2,1,0;, - 4;7,6,5,4;, - 4;11,10,9,8;, - 4;15,14,13,12;, - 4;19,18,17,16;, - 4;23,22,21,20;, - 4;27,26,25,24;, - 4;31,30,29,28;, - 4;35,34,33,32;, - 4;39,38,37,36;, - 4;43,42,41,40;, - 4;47,46,45,44;, - 4;51,50,49,48;, - 4;55,54,53,52;, - 4;59,58,57,56;, - 4;63,62,61,60;, - 4;67,66,65,64;, - 4;71,70,69,68;, - 4;75,74,73,72;, - 4;79,78,77,76;, - 4;83,82,81,80;, - 4;87,86,85,84;, - 4;91,90,89,88;, - 4;95,94,93,92;, - 4;99,98,97,96;, - 4;103,102,101,100;, - 4;107,106,105,104;, - 4;111,110,109,108;, - 4;115,114,113,112;, - 4;119,118,117,116;, - 4;123,122,121,120;, - 4;127,126,125,124;, - 4;131,130,129,128;, - 4;135,134,133,132;, - 4;139,138,137,136;, - 4;143,142,141,140;, - 4;147,146,145,144;, - 4;151,150,149,148;, - 4;155,154,153,152;, - 4;159,158,157,156;, - 4;163,162,161,160;, - 4;167,166,165,164;, - 4;171,170,169,168;, - 4;175,174,173,172;, - 4;179,178,177,176;, - 4;183,182,181,180;, - 4;187,186,185,184;, - 4;191,190,189,188;, - 4;195,194,193,192;, - 4;199,198,197,196;, - 4;203,202,201,200;, - 4;207,206,205,204;, - 4;211,210,209,208;, - 4;215,214,213,212;, - 4;219,218,217,216;, - 4;223,222,221,220;, - 4;227,226,225,224;, - 4;231,230,229,228;, - 4;235,234,233,232;, - 4;239,238,237,236;, - 4;243,242,241,240;, - 4;247,246,245,244;, - 4;251,250,249,248;, - 4;255,254,253,252;, - 4;259,258,257,256;, - 4;263,262,261,260;, - 4;267,266,265,264;, - 4;271,270,269,268;, - 4;275,274,273,272;, - 4;279,278,277,276;, - 4;283,282,281,280;, - 4;287,286,285,284;, - 4;291,290,289,288;, - 4;295,294,293,292;, - 4;299,298,297,296;, - 4;303,302,301,300;, - 4;307,306,305,304;, - 4;311,310,309,308;, - 4;315,314,313,312;, - 4;319,318,317,316;, - 4;323,322,321,320;, - 4;327,326,325,324;, - 4;331,330,329,328;, - 4;335,334,333,332;, - 4;339,338,337,336;, - 4;343,342,341,340;, - 4;347,346,345,344;, - 4;351,350,349,348;, - 4;355,354,353,352;, - 4;359,358,357,356;, - 4;363,362,361,360;, - 4;367,366,365,364;, - 4;371,370,369,368;, - 4;375,374,373,372;, - 4;379,378,377,376;, - 4;383,382,381,380;, - 4;387,386,385,384;, - 4;391,390,389,388;, - 4;395,394,393,392;, - 4;399,398,397,396;, - 4;403,402,401,400;, - 4;407,406,405,404;, - 4;411,410,409,408;, - 4;415,414,413,412;, - 4;419,418,417,416;, - 4;423,422,421,420;, - 4;427,426,425,424;, - 4;431,430,429,428;, - 4;435,434,433,432;, - 4;439,438,437,436;, - 4;443,442,441,440;, - 4;447,446,445,444;, - 4;451,450,449,448;, - 4;455,454,453,452;, - 4;459,458,457,456;, - 4;463,462,461,460;, - 4;467,466,465,464;, - 4;471,470,469,468;, - 4;475,474,473,472;, - 4;479,478,477,476;, - 4;483,482,481,480;, - 4;487,486,485,484;, - 4;491,490,489,488;, - 4;495,494,493,492;, - 4;499,498,497,496;, - 4;503,502,501,500;, - 4;507,506,505,504;, - 4;511,510,509,508;, - 4;515,514,513,512;, - 4;519,518,517,516;, - 4;523,522,521,520;, - 4;527,526,525,524;, - 4;531,530,529,528;, - 4;535,534,533,532;, - 4;539,538,537,536;, - 4;543,542,541,540;, - 4;547,546,545,544;, - 4;551,550,549,548;, - 4;555,554,553,552;, - 4;559,558,557,556;, - 4;563,562,561,560;, - 4;567,566,565,564;, - 4;571,570,569,568;, - 4;575,574,573,572;, - 4;579,578,577,576;, - 4;583,582,581,580;, - 4;587,586,585,584;, - 4;591,590,589,588;, - 4;595,594,593,592;, - 4;599,598,597,596;, - 4;603,602,601,600;, - 4;607,606,605,604;, - 4;611,610,609,608;, - 3;614,613,612;, - 3;617,616,615;, - 4;621,620,619,618;, - 4;625,624,623,622;, - 4;629,628,627,626;, - 4;633,632,631,630;, - 3;636,635,634;, - 3;639,638,637;, - 3;642,641,640;, - 3;645,644,643;, - 3;648,647,646;, - 3;651,650,649;, - 3;654,653,652;, - 3;657,656,655;, - 4;661,660,659,658;, - 4;665,664,663,662;, - 4;669,668,667,666;, - 4;673,672,671,670;, - 3;676,675,674;, - 3;679,678,677;, - 3;682,681,680;, - 3;685,684,683;, - 3;688,687,686;, - 3;691,690,689;, - 3;694,693,692;, - 3;697,696,695;, - 4;701,700,699,698;, - 4;705,704,703,702;, - 4;709,708,707,706;, - 4;713,712,711,710;, - 3;716,715,714;, - 3;719,718,717;, - 3;722,721,720;, - 3;725,724,723;, - 3;728,727,726;, - 3;731,730,729;, - 3;734,733,732;, - 3;737,736,735;, - 3;740,739,738;, - 3;743,742,741;, - 3;746,745,744;, - 3;749,748,747;, - 4;753,752,751,750;, - 4;757,756,755,754;, - 4;761,760,759,758;, - 4;765,764,763,762;, - 4;769,768,767,766;, - 4;773,772,771,770;, - 4;777,776,775,774;, - 4;781,780,779,778;, - 4;785,784,783,782;, - 4;789,788,787,786;, - 4;793,792,791,790;, - 4;797,796,795,794;, - 4;801,800,799,798;, - 4;805,804,803,802;, - 4;809,808,807,806;, - 4;813,812,811,810;, - 4;817,816,815,814;, - 4;821,820,819,818;, - 4;825,824,823,822;, - 4;829,828,827,826;, - 4;833,832,831,830;, - 4;837,836,835,834;, - 4;841,840,839,838;, - 4;845,844,843,842;, - 4;849,848,847,846;, - 4;853,852,851,850;, - 4;857,856,855,854;, - 4;861,860,859,858;, - 4;865,864,863,862;, - 4;869,868,867,866;, - 4;873,872,871,870;, - 4;877,876,875,874;, - 4;881,880,879,878;, - 4;885,884,883,882;, - 4;889,888,887,886;, - 4;893,892,891,890;, - 3;896,895,894;, - 3;899,898,897;, - 3;902,901,900;, - 3;905,904,903;, - 3;908,907,906;, - 3;911,910,909;, - 3;914,913,912;, - 3;917,916,915;, - 3;920,919,918;, - 3;923,922,921;, - 3;926,925,924;, - 3;929,928,927;, - 3;932,931,930;, - 3;935,934,933;, - 3;938,937,936;, - 3;941,940,939;, - 3;944,943,942;, - 3;947,946,945;, - 3;950,949,948;, - 3;953,952,951;, - 3;956,955,954;, - 3;959,958,957;, - 3;962,961,960;, - 3;965,964,963;, - 4;969,968,967,966;, - 4;973,972,971,970;, - 4;977,976,975,974;, - 4;981,980,979,978;, - 4;985,984,983,982;, - 4;989,988,987,986;, - 4;993,992,991,990;, - 4;997,996,995,994;, - 4;1001,1000,999,998;, - 4;1005,1004,1003,1002;, - 4;1009,1008,1007,1006;, - 4;1013,1012,1011,1010;, - 4;1017,1016,1015,1014;, - 4;1021,1020,1019,1018;, - 4;1025,1024,1023,1022;, - 4;1029,1028,1027,1026;, - 4;1033,1032,1031,1030;, - 4;1037,1036,1035,1034;, - 4;1041,1040,1039,1038;, - 4;1045,1044,1043,1042;, - 4;1049,1048,1047,1046;, - 4;1053,1052,1051,1050;, - 4;1057,1056,1055,1054;, - 4;1061,1060,1059,1058;, - 4;1065,1064,1063,1062;, - 4;1069,1068,1067,1066;, - 4;1073,1072,1071,1070;, - 4;1077,1076,1075,1074;, - 4;1081,1080,1079,1078;, - 4;1085,1084,1083,1082;, - 4;1089,1088,1087,1086;, - 4;1093,1092,1091,1090;, - 4;1097,1096,1095,1094;, - 4;1101,1100,1099,1098;, - 4;1105,1104,1103,1102;, - 4;1109,1108,1107,1106;, - 3;1112,1111,1110;, - 3;1115,1114,1113;, - 3;1118,1117,1116;, - 3;1121,1120,1119;, - 3;1124,1123,1122;, - 3;1127,1126,1125;, - 3;1130,1129,1128;, - 3;1133,1132,1131;, - 3;1136,1135,1134;, - 3;1139,1138,1137;, - 3;1142,1141,1140;, - 3;1145,1144,1143;, - 3;1148,1147,1146;, - 3;1151,1150,1149;, - 3;1154,1153,1152;, - 3;1157,1156,1155;, - 3;1160,1159,1158;, - 3;1163,1162,1161;, - 3;1166,1165,1164;, - 3;1169,1168,1167;, - 3;1172,1171,1170;, - 3;1175,1174,1173;, - 3;1178,1177,1176;, - 3;1181,1180,1179;, - 4;1185,1184,1183,1182;, - 4;1189,1188,1187,1186;, - 4;1193,1192,1191,1190;, - 4;1197,1196,1195,1194;, - 4;1201,1200,1199,1198;, - 4;1205,1204,1203,1202;, - 4;1209,1208,1207,1206;, - 4;1213,1212,1211,1210;, - 4;1217,1216,1215,1214;, - 4;1221,1220,1219,1218;, - 4;1225,1224,1223,1222;, - 4;1229,1228,1227,1226;, - 4;1233,1232,1231,1230;, - 4;1237,1236,1235,1234;, - 4;1241,1240,1239,1238;, - 4;1245,1244,1243,1242;, - 4;1249,1248,1247,1246;, - 4;1253,1252,1251,1250;, - 4;1257,1256,1255,1254;, - 4;1261,1260,1259,1258;, - 4;1265,1264,1263,1262;, - 4;1269,1268,1267,1266;, - 4;1273,1272,1271,1270;, - 4;1277,1276,1275,1274;, - 4;1281,1280,1279,1278;, - 4;1285,1284,1283,1282;, - 4;1289,1288,1287,1286;, - 4;1293,1292,1291,1290;, - 4;1297,1296,1295,1294;, - 4;1301,1300,1299,1298;, - 4;1305,1304,1303,1302;, - 4;1309,1308,1307,1306;, - 4;1313,1312,1311,1310;, - 4;1317,1316,1315,1314;, - 4;1321,1320,1319,1318;, - 4;1325,1324,1323,1322;, - 3;1328,1327,1326;, - 3;1331,1330,1329;, - 3;1334,1333,1332;, - 3;1337,1336,1335;, - 3;1340,1339,1338;, - 3;1343,1342,1341;, - 3;1346,1345,1344;, - 3;1349,1348,1347;, - 3;1352,1351,1350;, - 3;1355,1354,1353;, - 3;1358,1357,1356;, - 3;1361,1360,1359;, - 3;1364,1363,1362;, - 3;1367,1366,1365;, - 3;1370,1369,1368;, - 3;1373,1372,1371;, - 3;1376,1375,1374;, - 3;1379,1378,1377;, - 3;1382,1381,1380;, - 3;1385,1384,1383;, - 3;1388,1387,1386;, - 3;1391,1390,1389;, - 3;1394,1393,1392;, - 3;1397,1396,1395;, - 4;1401,1400,1399,1398;, - 4;1405,1404,1403,1402;, - 4;1409,1408,1407,1406;, - 4;1413,1412,1411,1410;, - 4;1417,1416,1415,1414;, - 4;1421,1420,1419,1418;, - 4;1425,1424,1423,1422;, - 4;1429,1428,1427,1426;, - 4;1433,1432,1431,1430;, - 4;1437,1436,1435,1434;, - 4;1441,1440,1439,1438;, - 4;1445,1444,1443,1442;, - 4;1449,1448,1447,1446;, - 4;1453,1452,1451,1450;, - 4;1457,1456,1455,1454;, - 4;1461,1460,1459,1458;, - 4;1465,1464,1463,1462;, - 4;1469,1468,1467,1466;, - 4;1473,1472,1471,1470;, - 4;1477,1476,1475,1474;, - 4;1481,1480,1479,1478;, - 4;1485,1484,1483,1482;, - 4;1489,1488,1487,1486;, - 4;1493,1492,1491,1490;, - 4;1497,1496,1495,1494;, - 4;1501,1500,1499,1498;, - 4;1505,1504,1503,1502;, - 4;1509,1508,1507,1506;, - 4;1513,1512,1511,1510;, - 4;1517,1516,1515,1514;, - 4;1521,1520,1519,1518;, - 4;1525,1524,1523,1522;, - 4;1529,1528,1527,1526;, - 4;1533,1532,1531,1530;, - 4;1537,1536,1535,1534;, - 4;1541,1540,1539,1538;, - 3;1544,1543,1542;, - 3;1547,1546,1545;, - 3;1550,1549,1548;, - 3;1553,1552,1551;, - 3;1556,1555,1554;, - 3;1559,1558,1557;, - 3;1562,1561,1560;, - 3;1565,1564,1563;, - 3;1568,1567,1566;, - 3;1571,1570,1569;, - 3;1574,1573,1572;, - 3;1577,1576,1575;, - 3;1580,1579,1578;, - 3;1583,1582,1581;, - 4;1587,1586,1585,1584;, - 4;1591,1590,1589,1588;, - 4;1595,1594,1593,1592;, - 4;1599,1598,1597,1596;, - 4;1603,1602,1601,1600;, - 4;1607,1606,1605,1604;, - 4;1611,1610,1609,1608;, - 3;1614,1613,1612;, - 3;1617,1616,1615;, - 4;1621,1620,1619,1618;, - 4;1625,1624,1623,1622;, - 4;1629,1628,1627,1626;, - 4;1633,1632,1631,1630;, - 4;1637,1636,1635,1634;, - 4;1641,1640,1639,1638;, - 4;1645,1644,1643,1642;, - 4;1649,1648,1647,1646;, - 4;1653,1652,1651,1650;, - 4;1657,1656,1655,1654;, - 4;1661,1660,1659,1658;, - 4;1665,1664,1663,1662;, - 4;1669,1668,1667,1666;, - 4;1673,1672,1671,1670;, - 4;1677,1676,1675,1674;, - 4;1681,1680,1679,1678;, - 4;1685,1684,1683,1682;, - 4;1689,1688,1687,1686;, - 4;1693,1692,1691,1690;, - 4;1697,1696,1695,1694;, - 4;1701,1700,1699,1698;, - 3;1704,1703,1702;, - 3;1707,1706,1705;, - 3;1710,1709,1708;, - 3;1713,1712,1711;, - 3;1716,1715,1714;, - 3;1719,1718,1717;, - 3;1722,1721,1720;, - 3;1725,1724,1723;, - 4;1729,1728,1727,1726;, - 4;1733,1732,1731,1730;, - 4;1737,1736,1735,1734;, - 4;1741,1740,1739,1738;, - 4;1745,1744,1743,1742;, - 3;1748,1747,1746;, - 4;1752,1751,1750,1749;, - 4;1756,1755,1754,1753;, - 4;1760,1759,1758,1757;, - 4;1764,1763,1762,1761;, - 4;1768,1767,1766,1765;, - 4;1772,1771,1770,1769;, - 4;1776,1775,1774,1773;, - 3;1779,1778,1777;, - 3;1782,1781,1780;, - 3;1785,1784,1783;, - 4;1789,1788,1787,1786;, - 3;1792,1791,1790;, - 3;1795,1794,1793;, - 4;1799,1798,1797,1796;, - 4;1803,1802,1801,1800;, - 4;1807,1806,1805,1804;, - 3;1810,1809,1808;, - 3;1813,1812,1811;, - 4;1817,1816,1815,1814;, - 4;1821,1820,1819,1818;, - 4;1825,1824,1823,1822;, - 4;1829,1828,1827,1826;, - 4;1833,1832,1831,1830;, - 4;1837,1836,1835,1834;, - 4;1841,1840,1839,1838;, - 4;1845,1844,1843,1842;, - 3;1848,1847,1846;, - 3;1851,1850,1849;, - 4;1855,1854,1853,1852;, - 4;1859,1858,1857,1856;, - 4;1863,1862,1861,1860;, - 4;1867,1866,1865,1864;, - 4;1871,1870,1869,1868;, - 4;1875,1874,1873,1872;, - 4;1879,1878,1877,1876;, - 4;1883,1882,1881,1880;, - 4;1887,1886,1885,1884;, - 4;1891,1890,1889,1888;, - 4;1895,1894,1893,1892;, - 4;1899,1898,1897,1896;, - 4;1903,1902,1901,1900;; - MeshNormals { // _0002 normals - 1904; - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - -0.514481;-0.857479; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - 0.514481;-0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - -0.514481; 0.857479; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.514481; 0.857479; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 0.857479;-0.514481; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - 0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -0.857479; 0.514481; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - -0.857479;-0.514481; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.457472; 0.457472; 0.762474;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.599994; 0.000000; 0.799982;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.457472;-0.457472; 0.762474;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.599994; 0.799982;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - 0.000000;-0.599994; 0.799982;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.457472; 0.457472; 0.762474;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.599994; 0.000000; 0.799982;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.457472;-0.457472; 0.762474;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000;-0.948668;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - 0.316202; 0.000000;-0.948668;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - -0.316202; 0.000000; 0.948668;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.316202; 0.000000; 0.948668;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188; 0.894406;, - 0.000000;-0.447188; 0.894406;, - 0.000000;-0.447188; 0.894406;, - 0.000000;-0.447188; 0.894406;, - 0.000000;-0.976165; 0.216926;, - 0.000000;-0.976165; 0.216926;, - 0.000000;-0.976165; 0.216926;, - 0.000000;-0.976165; 0.216926;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.952422;-0.304758;, - 0.000000;-0.952422;-0.304758;, - 0.000000;-0.952422;-0.304758;, - 0.000000;-0.952422;-0.304758;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.147008; 0.548662;, - -0.822993;-0.147008; 0.548662;, - -0.822993;-0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.147008;-0.548662;, - -0.822993; 0.147008;-0.548662;, - -0.822993; 0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.548662;-0.147008;, - -0.822993;-0.548662;-0.147008;, - -0.822993;-0.548662;-0.147008;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.548662; 0.147008;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.401654; 0.401654;, - -0.822993;-0.147008; 0.548662;, - -0.822993;-0.147008; 0.548662;, - -0.822993;-0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.147008; 0.548662;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.401654; 0.401654;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662; 0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.548662;-0.147008;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.401654;-0.401654;, - -0.822993; 0.147008;-0.548662;, - -0.822993; 0.147008;-0.548662;, - -0.822993; 0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.147008;-0.548662;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.401654;-0.401654;, - -0.822993;-0.548662;-0.147008;, - -0.822993;-0.548662;-0.147008;, - -0.822993;-0.548662;-0.147008;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.147008; 0.548662;, - 0.822993; 0.147008; 0.548662;, - 0.822993; 0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.147008;-0.548662;, - 0.822993;-0.147008;-0.548662;, - 0.822993;-0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.548662;-0.147008;, - 0.822993; 0.548662;-0.147008;, - 0.822993; 0.548662;-0.147008;, - -0.999969; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.548662; 0.147008;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.401654; 0.401654;, - 0.822993; 0.147008; 0.548662;, - 0.822993; 0.147008; 0.548662;, - 0.822993; 0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.147008; 0.548662;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.401654; 0.401654;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662; 0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.548662;-0.147008;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.401654;-0.401654;, - 0.822993;-0.147008;-0.548662;, - 0.822993;-0.147008;-0.548662;, - 0.822993;-0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.147008;-0.548662;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.401654;-0.401654;, - 0.822993; 0.548662;-0.147008;, - 0.822993; 0.548662;-0.147008;, - 0.822993; 0.548662;-0.147008;, - 0.754814; 0.646992;-0.107822;, - 0.754814; 0.646992;-0.107822;, - 0.754814; 0.646992;-0.107822;, - 0.811090; 0.486648;-0.324442;, - 0.811090; 0.486648;-0.324442;, - 0.811090; 0.486648;-0.324442;, - 0.111454; 0.972869;-0.202673;, - 0.111454; 0.972869;-0.202673;, - 0.111454; 0.972869;-0.202673;, - 0.111454; 0.972869;-0.202673;, - 0.208136; 0.602313; 0.770623;, - 0.208136; 0.602313; 0.770623;, - 0.208136; 0.602313; 0.770623;, - 0.208136; 0.602313; 0.770623;, - 0.288064; 0.691366;-0.662557;, - 0.288064; 0.691366;-0.662557;, - 0.288064; 0.691366;-0.662557;, - 0.288064; 0.691366;-0.662557;, - 0.242531; 0.000000;-0.970122;, - 0.242531; 0.000000;-0.970122;, - 0.242531; 0.000000;-0.970122;, - 0.242531; 0.000000;-0.970122;, - 0.304209;-0.405591;-0.861934;, - 0.304209;-0.405591;-0.861934;, - 0.304209;-0.405591;-0.861934;, - 0.304209;-0.405591;-0.861934;, - 0.242531; 0.000000; 0.970122;, - 0.242531; 0.000000; 0.970122;, - 0.242531; 0.000000; 0.970122;, - 0.242531; 0.000000; 0.970122;, - 0.257942;-0.343944; 0.902860;, - 0.257942;-0.343944; 0.902860;, - 0.257942;-0.343944; 0.902860;, - 0.257942;-0.343944; 0.902860;, - 0.947935; 0.276467; 0.157964;, - 0.947935; 0.276467; 0.157964;, - 0.947935; 0.276467; 0.157964;, - -0.947935; 0.276467; 0.157964;, - -0.947935; 0.276467; 0.157964;, - -0.947935; 0.276467; 0.157964;, - 0.242531;-0.970122; 0.000000;, - 0.242531;-0.970122; 0.000000;, - 0.242531;-0.970122; 0.000000;, - 0.242531;-0.970122; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.948668;-0.316202; 0.000000;, - 0.948668;-0.316202; 0.000000;, - 0.948668;-0.316202; 0.000000;, - 0.948668;-0.316202; 0.000000;, - -0.948668;-0.316202; 0.000000;, - -0.948668;-0.316202; 0.000000;, - -0.948668;-0.316202; 0.000000;, - -0.948668;-0.316202; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.111454; 0.972869;-0.202673;, - -0.111454; 0.972869;-0.202673;, - -0.111454; 0.972869;-0.202673;, - -0.111454; 0.972869;-0.202673;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.609699; 0.792596;, - 0.000000; 0.609699; 0.792596;, - 0.000000; 0.609699; 0.792596;, - 0.000000; 0.609699; 0.792596;, - -0.208136; 0.602313; 0.770623;, - -0.208136; 0.602313; 0.770623;, - -0.208136; 0.602313; 0.770623;, - -0.208136; 0.602313; 0.770623;, - -0.288064; 0.691366;-0.662557;, - -0.288064; 0.691366;-0.662557;, - -0.288064; 0.691366;-0.662557;, - -0.288064; 0.691366;-0.662557;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - -0.242531; 0.000000;-0.970122;, - -0.242531; 0.000000;-0.970122;, - -0.242531; 0.000000;-0.970122;, - -0.242531; 0.000000;-0.970122;, - -0.304209;-0.405591;-0.861904;, - -0.304209;-0.405591;-0.861904;, - -0.304209;-0.405591;-0.861904;, - -0.304209;-0.405591;-0.861904;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - -0.242531; 0.000000; 0.970122;, - -0.242531; 0.000000; 0.970122;, - -0.242531; 0.000000; 0.970122;, - -0.242531; 0.000000; 0.970122;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - -0.257942;-0.343944; 0.902860;, - -0.257942;-0.343944; 0.902860;, - -0.257942;-0.343944; 0.902860;, - -0.257942;-0.343944; 0.902860;, - 0.000000;-0.316202; 0.948668;, - 0.000000;-0.316202; 0.948668;, - 0.000000;-0.316202; 0.948668;, - 0.000000;-0.316202; 0.948668;, - -0.242531;-0.970122; 0.000000;, - -0.242531;-0.970122; 0.000000;, - -0.242531;-0.970122; 0.000000;, - -0.242531;-0.970122; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.989776; 0.017670;-0.141392;, - 0.989776; 0.017670;-0.141392;, - 0.989776; 0.017670;-0.141392;, - 0.992248; 0.000000;-0.124027;, - 0.992248; 0.000000;-0.124027;, - 0.992248; 0.000000;-0.124027;, - 0.938078;-0.325938;-0.117252;, - 0.938078;-0.325938;-0.117252;, - 0.938078;-0.325938;-0.117252;, - -0.938078;-0.325938;-0.117252;, - -0.938078;-0.325938;-0.117252;, - -0.938078;-0.325938;-0.117252;, - -0.989776; 0.017670;-0.141392;, - -0.989776; 0.017670;-0.141392;, - -0.989776; 0.017670;-0.141392;, - -0.992248; 0.000000;-0.124027;, - -0.992248; 0.000000;-0.124027;, - -0.992248; 0.000000;-0.124027;, - 0.905698;-0.370495;-0.205817;, - 0.905698;-0.370495;-0.205817;, - 0.905698;-0.370495;-0.205817;, - -0.905698;-0.370495;-0.205817;, - -0.905698;-0.370495;-0.205817;, - -0.905698;-0.370495;-0.205817;, - -0.988739;-0.019745;-0.148289;, - -0.988739;-0.019745;-0.148289;, - -0.988739;-0.019745;-0.148289;, - -0.988739;-0.019745;-0.148289;, - 0.988739;-0.019745;-0.148289;, - 0.988739;-0.019745;-0.148289;, - 0.988739;-0.019745;-0.148289;, - 0.988739;-0.019745;-0.148289;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.063906;-0.559221;-0.826533;, - 0.063906;-0.559221;-0.826533;, - 0.063906;-0.559221;-0.826533;, - 0.063906;-0.559221;-0.826533;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.987762;-0.155797;, - 0.000000;-0.987762;-0.155797;, - 0.000000;-0.987762;-0.155797;, - 0.000000;-0.987762;-0.155797;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.986389; 0.164373;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - 0.000000;-0.371380; 0.928465;, - -0.063906;-0.559221;-0.826533;, - -0.063906;-0.559221;-0.826533;, - -0.063906;-0.559221;-0.826533;, - -0.063906;-0.559221;-0.826533;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.986389; 0.000000; 0.164373;, - 0.986389; 0.000000; 0.164373;, - 0.986389; 0.000000; 0.164373;, - 0.920957;-0.358135; 0.153478;, - 0.920957;-0.358135; 0.153478;, - 0.920957;-0.358135; 0.153478;, - 0.986389; 0.000000; 0.164373;, - 0.986389; 0.000000; 0.164373;, - 0.986389; 0.000000; 0.164373;, - 0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - -0.920957;-0.358135; 0.153478;, - -0.920957;-0.358135; 0.153478;, - -0.920957;-0.358135; 0.153478;, - -0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - -0.986389; 0.000000; 0.164373;, - 0.000000;-0.989929; 0.141392;, - 0.000000;-0.989929; 0.141392;, - 0.000000;-0.989929; 0.141392;, - 0.000000;-0.989929; 0.141392;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -0.055696;-0.501328; 0.863430;, - -0.055696;-0.501328; 0.863430;, - -0.055696;-0.501328; 0.863430;, - -0.055696;-0.501328; 0.863430;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.164373; 0.986389; 0.000000;, - 0.164373; 0.986389; 0.000000;, - 0.164373; 0.986389; 0.000000;, - 0.164373; 0.986389; 0.000000;, - -0.164373; 0.986389; 0.000000;, - -0.164373; 0.986389; 0.000000;, - -0.164373; 0.986389; 0.000000;, - -0.164373; 0.986389; 0.000000;, - -0.754814; 0.646992;-0.107822;, - -0.754814; 0.646992;-0.107822;, - -0.754814; 0.646992;-0.107822;, - -0.811090; 0.486648;-0.324442;, - -0.811090; 0.486648;-0.324442;, - -0.811090; 0.486648;-0.324442;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-0.554674;-0.832026;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.055696;-0.501328; 0.863430;, - 0.055696;-0.501328; 0.863430;, - 0.055696;-0.501328; 0.863430;, - 0.055696;-0.501328; 0.863430;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - 0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;, - -0.948668; 0.316202; 0.000000;; - 510; - 4;3,2,1,0;, - 4;7,6,5,4;, - 4;11,10,9,8;, - 4;15,14,13,12;, - 4;19,18,17,16;, - 4;23,22,21,20;, - 4;27,26,25,24;, - 4;31,30,29,28;, - 4;35,34,33,32;, - 4;39,38,37,36;, - 4;43,42,41,40;, - 4;47,46,45,44;, - 4;51,50,49,48;, - 4;55,54,53,52;, - 4;59,58,57,56;, - 4;63,62,61,60;, - 4;67,66,65,64;, - 4;71,70,69,68;, - 4;75,74,73,72;, - 4;79,78,77,76;, - 4;83,82,81,80;, - 4;87,86,85,84;, - 4;91,90,89,88;, - 4;95,94,93,92;, - 4;99,98,97,96;, - 4;103,102,101,100;, - 4;107,106,105,104;, - 4;111,110,109,108;, - 4;115,114,113,112;, - 4;119,118,117,116;, - 4;123,122,121,120;, - 4;127,126,125,124;, - 4;131,130,129,128;, - 4;135,134,133,132;, - 4;139,138,137,136;, - 4;143,142,141,140;, - 4;147,146,145,144;, - 4;151,150,149,148;, - 4;155,154,153,152;, - 4;159,158,157,156;, - 4;163,162,161,160;, - 4;167,166,165,164;, - 4;171,170,169,168;, - 4;175,174,173,172;, - 4;179,178,177,176;, - 4;183,182,181,180;, - 4;187,186,185,184;, - 4;191,190,189,188;, - 4;195,194,193,192;, - 4;199,198,197,196;, - 4;203,202,201,200;, - 4;207,206,205,204;, - 4;211,210,209,208;, - 4;215,214,213,212;, - 4;219,218,217,216;, - 4;223,222,221,220;, - 4;227,226,225,224;, - 4;231,230,229,228;, - 4;235,234,233,232;, - 4;239,238,237,236;, - 4;243,242,241,240;, - 4;247,246,245,244;, - 4;251,250,249,248;, - 4;255,254,253,252;, - 4;259,258,257,256;, - 4;263,262,261,260;, - 4;267,266,265,264;, - 4;271,270,269,268;, - 4;275,274,273,272;, - 4;279,278,277,276;, - 4;283,282,281,280;, - 4;287,286,285,284;, - 4;291,290,289,288;, - 4;295,294,293,292;, - 4;299,298,297,296;, - 4;303,302,301,300;, - 4;307,306,305,304;, - 4;311,310,309,308;, - 4;315,314,313,312;, - 4;319,318,317,316;, - 4;323,322,321,320;, - 4;327,326,325,324;, - 4;331,330,329,328;, - 4;335,334,333,332;, - 4;339,338,337,336;, - 4;343,342,341,340;, - 4;347,346,345,344;, - 4;351,350,349,348;, - 4;355,354,353,352;, - 4;359,358,357,356;, - 4;363,362,361,360;, - 4;367,366,365,364;, - 4;371,370,369,368;, - 4;375,374,373,372;, - 4;379,378,377,376;, - 4;383,382,381,380;, - 4;387,386,385,384;, - 4;391,390,389,388;, - 4;395,394,393,392;, - 4;399,398,397,396;, - 4;403,402,401,400;, - 4;407,406,405,404;, - 4;411,410,409,408;, - 4;415,414,413,412;, - 4;419,418,417,416;, - 4;423,422,421,420;, - 4;427,426,425,424;, - 4;431,430,429,428;, - 4;435,434,433,432;, - 4;439,438,437,436;, - 4;443,442,441,440;, - 4;447,446,445,444;, - 4;451,450,449,448;, - 4;455,454,453,452;, - 4;459,458,457,456;, - 4;463,462,461,460;, - 4;467,466,465,464;, - 4;471,470,469,468;, - 4;475,474,473,472;, - 4;479,478,477,476;, - 4;483,482,481,480;, - 4;487,486,485,484;, - 4;491,490,489,488;, - 4;495,494,493,492;, - 4;499,498,497,496;, - 4;503,502,501,500;, - 4;507,506,505,504;, - 4;511,510,509,508;, - 4;515,514,513,512;, - 4;519,518,517,516;, - 4;523,522,521,520;, - 4;527,526,525,524;, - 4;531,530,529,528;, - 4;535,534,533,532;, - 4;539,538,537,536;, - 4;543,542,541,540;, - 4;547,546,545,544;, - 4;551,550,549,548;, - 4;555,554,553,552;, - 4;559,558,557,556;, - 4;563,562,561,560;, - 4;567,566,565,564;, - 4;571,570,569,568;, - 4;575,574,573,572;, - 4;579,578,577,576;, - 4;583,582,581,580;, - 4;587,586,585,584;, - 4;591,590,589,588;, - 4;595,594,593,592;, - 4;599,598,597,596;, - 4;603,602,601,600;, - 4;607,606,605,604;, - 4;611,610,609,608;, - 3;614,613,612;, - 3;617,616,615;, - 4;621,620,619,618;, - 4;625,624,623,622;, - 4;629,628,627,626;, - 4;633,632,631,630;, - 3;636,635,634;, - 3;639,638,637;, - 3;642,641,640;, - 3;645,644,643;, - 3;648,647,646;, - 3;651,650,649;, - 3;654,653,652;, - 3;657,656,655;, - 4;661,660,659,658;, - 4;665,664,663,662;, - 4;669,668,667,666;, - 4;673,672,671,670;, - 3;676,675,674;, - 3;679,678,677;, - 3;682,681,680;, - 3;685,684,683;, - 3;688,687,686;, - 3;691,690,689;, - 3;694,693,692;, - 3;697,696,695;, - 4;701,700,699,698;, - 4;705,704,703,702;, - 4;709,708,707,706;, - 4;713,712,711,710;, - 3;716,715,714;, - 3;719,718,717;, - 3;722,721,720;, - 3;725,724,723;, - 3;728,727,726;, - 3;731,730,729;, - 3;734,733,732;, - 3;737,736,735;, - 3;740,739,738;, - 3;743,742,741;, - 3;746,745,744;, - 3;749,748,747;, - 4;753,752,751,750;, - 4;757,756,755,754;, - 4;761,760,759,758;, - 4;765,764,763,762;, - 4;769,768,767,766;, - 4;773,772,771,770;, - 4;777,776,775,774;, - 4;781,780,779,778;, - 4;785,784,783,782;, - 4;789,788,787,786;, - 4;793,792,791,790;, - 4;797,796,795,794;, - 4;801,800,799,798;, - 4;805,804,803,802;, - 4;809,808,807,806;, - 4;813,812,811,810;, - 4;817,816,815,814;, - 4;821,820,819,818;, - 4;825,824,823,822;, - 4;829,828,827,826;, - 4;833,832,831,830;, - 4;837,836,835,834;, - 4;841,840,839,838;, - 4;845,844,843,842;, - 4;849,848,847,846;, - 4;853,852,851,850;, - 4;857,856,855,854;, - 4;861,860,859,858;, - 4;865,864,863,862;, - 4;869,868,867,866;, - 4;873,872,871,870;, - 4;877,876,875,874;, - 4;881,880,879,878;, - 4;885,884,883,882;, - 4;889,888,887,886;, - 4;893,892,891,890;, - 3;896,895,894;, - 3;899,898,897;, - 3;902,901,900;, - 3;905,904,903;, - 3;908,907,906;, - 3;911,910,909;, - 3;914,913,912;, - 3;917,916,915;, - 3;920,919,918;, - 3;923,922,921;, - 3;926,925,924;, - 3;929,928,927;, - 3;932,931,930;, - 3;935,934,933;, - 3;938,937,936;, - 3;941,940,939;, - 3;944,943,942;, - 3;947,946,945;, - 3;950,949,948;, - 3;953,952,951;, - 3;956,955,954;, - 3;959,958,957;, - 3;962,961,960;, - 3;965,964,963;, - 4;969,968,967,966;, - 4;973,972,971,970;, - 4;977,976,975,974;, - 4;981,980,979,978;, - 4;985,984,983,982;, - 4;989,988,987,986;, - 4;993,992,991,990;, - 4;997,996,995,994;, - 4;1001,1000,999,998;, - 4;1005,1004,1003,1002;, - 4;1009,1008,1007,1006;, - 4;1013,1012,1011,1010;, - 4;1017,1016,1015,1014;, - 4;1021,1020,1019,1018;, - 4;1025,1024,1023,1022;, - 4;1029,1028,1027,1026;, - 4;1033,1032,1031,1030;, - 4;1037,1036,1035,1034;, - 4;1041,1040,1039,1038;, - 4;1045,1044,1043,1042;, - 4;1049,1048,1047,1046;, - 4;1053,1052,1051,1050;, - 4;1057,1056,1055,1054;, - 4;1061,1060,1059,1058;, - 4;1065,1064,1063,1062;, - 4;1069,1068,1067,1066;, - 4;1073,1072,1071,1070;, - 4;1077,1076,1075,1074;, - 4;1081,1080,1079,1078;, - 4;1085,1084,1083,1082;, - 4;1089,1088,1087,1086;, - 4;1093,1092,1091,1090;, - 4;1097,1096,1095,1094;, - 4;1101,1100,1099,1098;, - 4;1105,1104,1103,1102;, - 4;1109,1108,1107,1106;, - 3;1112,1111,1110;, - 3;1115,1114,1113;, - 3;1118,1117,1116;, - 3;1121,1120,1119;, - 3;1124,1123,1122;, - 3;1127,1126,1125;, - 3;1130,1129,1128;, - 3;1133,1132,1131;, - 3;1136,1135,1134;, - 3;1139,1138,1137;, - 3;1142,1141,1140;, - 3;1145,1144,1143;, - 3;1148,1147,1146;, - 3;1151,1150,1149;, - 3;1154,1153,1152;, - 3;1157,1156,1155;, - 3;1160,1159,1158;, - 3;1163,1162,1161;, - 3;1166,1165,1164;, - 3;1169,1168,1167;, - 3;1172,1171,1170;, - 3;1175,1174,1173;, - 3;1178,1177,1176;, - 3;1181,1180,1179;, - 4;1185,1184,1183,1182;, - 4;1189,1188,1187,1186;, - 4;1193,1192,1191,1190;, - 4;1197,1196,1195,1194;, - 4;1201,1200,1199,1198;, - 4;1205,1204,1203,1202;, - 4;1209,1208,1207,1206;, - 4;1213,1212,1211,1210;, - 4;1217,1216,1215,1214;, - 4;1221,1220,1219,1218;, - 4;1225,1224,1223,1222;, - 4;1229,1228,1227,1226;, - 4;1233,1232,1231,1230;, - 4;1237,1236,1235,1234;, - 4;1241,1240,1239,1238;, - 4;1245,1244,1243,1242;, - 4;1249,1248,1247,1246;, - 4;1253,1252,1251,1250;, - 4;1257,1256,1255,1254;, - 4;1261,1260,1259,1258;, - 4;1265,1264,1263,1262;, - 4;1269,1268,1267,1266;, - 4;1273,1272,1271,1270;, - 4;1277,1276,1275,1274;, - 4;1281,1280,1279,1278;, - 4;1285,1284,1283,1282;, - 4;1289,1288,1287,1286;, - 4;1293,1292,1291,1290;, - 4;1297,1296,1295,1294;, - 4;1301,1300,1299,1298;, - 4;1305,1304,1303,1302;, - 4;1309,1308,1307,1306;, - 4;1313,1312,1311,1310;, - 4;1317,1316,1315,1314;, - 4;1321,1320,1319,1318;, - 4;1325,1324,1323,1322;, - 3;1328,1327,1326;, - 3;1331,1330,1329;, - 3;1334,1333,1332;, - 3;1337,1336,1335;, - 3;1340,1339,1338;, - 3;1343,1342,1341;, - 3;1346,1345,1344;, - 3;1349,1348,1347;, - 3;1352,1351,1350;, - 3;1355,1354,1353;, - 3;1358,1357,1356;, - 3;1361,1360,1359;, - 3;1364,1363,1362;, - 3;1367,1366,1365;, - 3;1370,1369,1368;, - 3;1373,1372,1371;, - 3;1376,1375,1374;, - 3;1379,1378,1377;, - 3;1382,1381,1380;, - 3;1385,1384,1383;, - 3;1388,1387,1386;, - 3;1391,1390,1389;, - 3;1394,1393,1392;, - 3;1397,1396,1395;, - 4;1401,1400,1399,1398;, - 4;1405,1404,1403,1402;, - 4;1409,1408,1407,1406;, - 4;1413,1412,1411,1410;, - 4;1417,1416,1415,1414;, - 4;1421,1420,1419,1418;, - 4;1425,1424,1423,1422;, - 4;1429,1428,1427,1426;, - 4;1433,1432,1431,1430;, - 4;1437,1436,1435,1434;, - 4;1441,1440,1439,1438;, - 4;1445,1444,1443,1442;, - 4;1449,1448,1447,1446;, - 4;1453,1452,1451,1450;, - 4;1457,1456,1455,1454;, - 4;1461,1460,1459,1458;, - 4;1465,1464,1463,1462;, - 4;1469,1468,1467,1466;, - 4;1473,1472,1471,1470;, - 4;1477,1476,1475,1474;, - 4;1481,1480,1479,1478;, - 4;1485,1484,1483,1482;, - 4;1489,1488,1487,1486;, - 4;1493,1492,1491,1490;, - 4;1497,1496,1495,1494;, - 4;1501,1500,1499,1498;, - 4;1505,1504,1503,1502;, - 4;1509,1508,1507,1506;, - 4;1513,1512,1511,1510;, - 4;1517,1516,1515,1514;, - 4;1521,1520,1519,1518;, - 4;1525,1524,1523,1522;, - 4;1529,1528,1527,1526;, - 4;1533,1532,1531,1530;, - 4;1537,1536,1535,1534;, - 4;1541,1540,1539,1538;, - 3;1544,1543,1542;, - 3;1547,1546,1545;, - 3;1550,1549,1548;, - 3;1553,1552,1551;, - 3;1556,1555,1554;, - 3;1559,1558,1557;, - 3;1562,1561,1560;, - 3;1565,1564,1563;, - 3;1568,1567,1566;, - 3;1571,1570,1569;, - 3;1574,1573,1572;, - 3;1577,1576,1575;, - 3;1580,1579,1578;, - 3;1583,1582,1581;, - 4;1587,1586,1585,1584;, - 4;1591,1590,1589,1588;, - 4;1595,1594,1593,1592;, - 4;1599,1598,1597,1596;, - 4;1603,1602,1601,1600;, - 4;1607,1606,1605,1604;, - 4;1611,1610,1609,1608;, - 3;1614,1613,1612;, - 3;1617,1616,1615;, - 4;1621,1620,1619,1618;, - 4;1625,1624,1623,1622;, - 4;1629,1628,1627,1626;, - 4;1633,1632,1631,1630;, - 4;1637,1636,1635,1634;, - 4;1641,1640,1639,1638;, - 4;1645,1644,1643,1642;, - 4;1649,1648,1647,1646;, - 4;1653,1652,1651,1650;, - 4;1657,1656,1655,1654;, - 4;1661,1660,1659,1658;, - 4;1665,1664,1663,1662;, - 4;1669,1668,1667,1666;, - 4;1673,1672,1671,1670;, - 4;1677,1676,1675,1674;, - 4;1681,1680,1679,1678;, - 4;1685,1684,1683,1682;, - 4;1689,1688,1687,1686;, - 4;1693,1692,1691,1690;, - 4;1697,1696,1695,1694;, - 4;1701,1700,1699,1698;, - 3;1704,1703,1702;, - 3;1707,1706,1705;, - 3;1710,1709,1708;, - 3;1713,1712,1711;, - 3;1716,1715,1714;, - 3;1719,1718,1717;, - 3;1722,1721,1720;, - 3;1725,1724,1723;, - 4;1729,1728,1727,1726;, - 4;1733,1732,1731,1730;, - 4;1737,1736,1735,1734;, - 4;1741,1740,1739,1738;, - 4;1745,1744,1743,1742;, - 3;1748,1747,1746;, - 4;1752,1751,1750,1749;, - 4;1756,1755,1754,1753;, - 4;1760,1759,1758,1757;, - 4;1764,1763,1762,1761;, - 4;1768,1767,1766,1765;, - 4;1772,1771,1770,1769;, - 4;1776,1775,1774,1773;, - 3;1779,1778,1777;, - 3;1782,1781,1780;, - 3;1785,1784,1783;, - 4;1789,1788,1787,1786;, - 3;1792,1791,1790;, - 3;1795,1794,1793;, - 4;1799,1798,1797,1796;, - 4;1803,1802,1801,1800;, - 4;1807,1806,1805,1804;, - 3;1810,1809,1808;, - 3;1813,1812,1811;, - 4;1817,1816,1815,1814;, - 4;1821,1820,1819,1818;, - 4;1825,1824,1823,1822;, - 4;1829,1828,1827,1826;, - 4;1833,1832,1831,1830;, - 4;1837,1836,1835,1834;, - 4;1841,1840,1839,1838;, - 4;1845,1844,1843,1842;, - 3;1848,1847,1846;, - 3;1851,1850,1849;, - 4;1855,1854,1853,1852;, - 4;1859,1858,1857,1856;, - 4;1863,1862,1861,1860;, - 4;1867,1866,1865,1864;, - 4;1871,1870,1869,1868;, - 4;1875,1874,1873,1872;, - 4;1879,1878,1877,1876;, - 4;1883,1882,1881,1880;, - 4;1887,1886,1885,1884;, - 4;1891,1890,1889,1888;, - 4;1895,1894,1893,1892;, - 4;1899,1898,1897,1896;, - 4;1903,1902,1901,1900;; - } // End of _0002 normals - MeshTextureCoords { //Cube_001 UV Coordinates - 1904; - 0.967713; 0.165504;, - 0.967751; 0.159298;, - 0.982645; 0.159343;, - 0.982606; 0.165549;, - 0.967751; 0.159298;, - 0.967781; 0.149369;, - 0.982675; 0.149414;, - 0.982645; 0.159343;, - 0.967781; 0.149369;, - 0.967781; 0.143163;, - 0.982674; 0.143208;, - 0.982675; 0.149414;, - 0.846125; 0.657064;, - 0.846071; 0.663270;, - 0.831180; 0.663316;, - 0.831234; 0.657110;, - 0.846071; 0.663270;, - 0.846102; 0.673199;, - 0.831211; 0.673245;, - 0.831180; 0.663316;, - 0.846102; 0.673199;, - 0.846193; 0.679405;, - 0.831302; 0.679450;, - 0.831211; 0.673245;, - 0.532374; 0.033322;, - 0.532353; 0.027174;, - 0.547246; 0.027129;, - 0.547267; 0.033277;, - 0.532353; 0.027174;, - 0.532322; 0.017246;, - 0.547216; 0.017201;, - 0.547246; 0.027129;, - 0.532322; 0.017246;, - 0.532305; 0.010984;, - 0.547199; 0.010939;, - 0.547216; 0.017201;, - 0.502449; 0.033277;, - 0.502466; 0.027015;, - 0.517360; 0.027061;, - 0.517343; 0.033322;, - 0.502466; 0.027015;, - 0.502497; 0.017087;, - 0.517390; 0.017133;, - 0.517360; 0.027061;, - 0.502497; 0.017087;, - 0.502518; 0.010939;, - 0.517411; 0.010984;, - 0.517390; 0.017133;, - 0.817987; 0.058753;, - 0.817990; 0.065990;, - 0.809474; 0.060885;, - 0.814578; 0.052369;, - 0.817990; 0.065990;, - 0.812886; 0.074506;, - 0.804369; 0.069402;, - 0.809474; 0.060885;, - 0.799265; 0.077918;, - 0.804369; 0.069402;, - 0.812886; 0.074506;, - 0.806502; 0.077915;, - 0.814578; 0.052369;, - 0.809474; 0.060885;, - 0.800957; 0.055780;, - 0.806062; 0.047264;, - 0.809474; 0.060885;, - 0.804369; 0.069402;, - 0.795853; 0.064297;, - 0.800957; 0.055780;, - 0.804369; 0.069402;, - 0.799265; 0.077918;, - 0.790748; 0.072814;, - 0.795853; 0.064297;, - 0.806062; 0.047264;, - 0.800957; 0.055780;, - 0.792441; 0.050676;, - 0.798825; 0.047267;, - 0.800957; 0.055780;, - 0.795853; 0.064297;, - 0.787336; 0.059192;, - 0.792441; 0.050676;, - 0.795853; 0.064297;, - 0.790748; 0.072814;, - 0.787339; 0.066429;, - 0.787336; 0.059192;, - 0.084189; 0.032111;, - 0.088824; 0.028402;, - 0.093761; 0.038347;, - 0.081396; 0.038309;, - 0.941789; 0.477264;, - 0.951712; 0.477295;, - 0.951428; 0.487223;, - 0.941504; 0.487193;, - 0.951712; 0.477295;, - 0.957903; 0.481037;, - 0.961605; 0.487254;, - 0.951428; 0.487223;, - 0.081396; 0.038309;, - 0.093761; 0.038347;, - 0.093730; 0.048276;, - 0.081365; 0.048238;, - 0.941504; 0.487193;, - 0.951428; 0.487223;, - 0.951397; 0.497152;, - 0.941474; 0.497122;, - 0.951428; 0.487223;, - 0.961605; 0.487254;, - 0.961575; 0.497184;, - 0.951397; 0.497152;, - 0.081365; 0.048238;, - 0.093730; 0.048276;, - 0.088732; 0.058190;, - 0.084120; 0.054452;, - 0.941474; 0.497122;, - 0.951397; 0.497152;, - 0.951621; 0.507082;, - 0.941698; 0.507052;, - 0.951397; 0.497152;, - 0.961575; 0.497184;, - 0.957835; 0.503378;, - 0.951621; 0.507082;, - 0.968228; 0.068181;, - 0.968266; 0.061975;, - 0.983159; 0.062020;, - 0.983121; 0.068226;, - 0.968266; 0.061975;, - 0.968296; 0.052046;, - 0.983190; 0.052091;, - 0.983159; 0.062020;, - 0.968296; 0.052046;, - 0.968296; 0.045840;, - 0.983189; 0.045885;, - 0.983190; 0.052091;, - 0.816218; 0.657064;, - 0.816165; 0.663270;, - 0.801274; 0.663316;, - 0.801327; 0.657110;, - 0.816165; 0.663270;, - 0.816195; 0.673199;, - 0.801304; 0.673245;, - 0.801274; 0.663316;, - 0.816195; 0.673199;, - 0.816287; 0.679405;, - 0.801396; 0.679450;, - 0.801304; 0.673245;, - 0.319956; 0.034880;, - 0.319935; 0.028731;, - 0.334829; 0.028686;, - 0.334850; 0.034834;, - 0.319935; 0.028731;, - 0.319905; 0.018803;, - 0.334799; 0.018758;, - 0.334829; 0.028686;, - 0.319905; 0.018803;, - 0.319888; 0.012542;, - 0.334781; 0.012496;, - 0.334799; 0.018758;, - 0.773172; 0.032325;, - 0.773189; 0.026063;, - 0.788083; 0.026108;, - 0.788066; 0.032370;, - 0.773189; 0.026063;, - 0.773220; 0.016135;, - 0.788113; 0.016180;, - 0.788083; 0.026108;, - 0.773220; 0.016135;, - 0.773241; 0.009987;, - 0.788134; 0.010032;, - 0.788113; 0.016180;, - 0.547264; 0.067382;, - 0.543855; 0.073766;, - 0.538751; 0.065249;, - 0.547267; 0.060144;, - 0.543855; 0.073766;, - 0.535339; 0.078870;, - 0.530234; 0.070354;, - 0.538751; 0.065249;, - 0.521718; 0.075458;, - 0.530234; 0.070354;, - 0.535339; 0.078870;, - 0.528102; 0.078867;, - 0.547267; 0.060144;, - 0.538751; 0.065249;, - 0.533646; 0.056733;, - 0.542163; 0.051628;, - 0.538751; 0.065249;, - 0.530234; 0.070354;, - 0.525130; 0.061837;, - 0.533646; 0.056733;, - 0.530234; 0.070354;, - 0.521718; 0.075458;, - 0.516613; 0.066942;, - 0.525130; 0.061837;, - 0.542163; 0.051628;, - 0.533646; 0.056733;, - 0.528542; 0.048216;, - 0.535779; 0.048219;, - 0.533646; 0.056733;, - 0.525130; 0.061837;, - 0.520025; 0.053321;, - 0.528542; 0.048216;, - 0.525130; 0.061837;, - 0.516613; 0.066942;, - 0.516616; 0.059705;, - 0.520025; 0.053321;, - 0.964411; 0.385438;, - 0.969046; 0.381729;, - 0.973983; 0.391673;, - 0.961618; 0.391635;, - 0.961381; 0.566576;, - 0.951458; 0.566607;, - 0.951682; 0.556677;, - 0.961605; 0.556646;, - 0.951458; 0.566607;, - 0.945245; 0.562902;, - 0.941504; 0.556708;, - 0.951682; 0.556677;, - 0.961618; 0.391635;, - 0.973983; 0.391673;, - 0.973953; 0.401602;, - 0.961588; 0.401564;, - 0.961605; 0.556646;, - 0.951682; 0.556677;, - 0.951652; 0.546748;, - 0.961575; 0.546717;, - 0.951682; 0.556677;, - 0.941504; 0.556708;, - 0.941474; 0.546779;, - 0.951652; 0.546748;, - 0.961588; 0.401564;, - 0.973953; 0.401602;, - 0.968955; 0.411516;, - 0.964343; 0.407779;, - 0.961575; 0.546717;, - 0.951652; 0.546748;, - 0.951367; 0.536819;, - 0.961290; 0.536789;, - 0.951652; 0.546748;, - 0.941474; 0.546779;, - 0.945176; 0.540562;, - 0.951367; 0.536819;, - 0.967002; 0.648553;, - 0.967040; 0.642347;, - 0.981934; 0.642392;, - 0.981895; 0.648598;, - 0.967040; 0.642347;, - 0.967070; 0.632418;, - 0.981964; 0.632463;, - 0.981934; 0.642392;, - 0.967070; 0.632418;, - 0.967070; 0.626212;, - 0.981963; 0.626258;, - 0.981964; 0.632463;, - 0.831766; 0.966351;, - 0.831713; 0.972557;, - 0.816822; 0.972603;, - 0.816876; 0.966397;, - 0.831713; 0.972557;, - 0.831743; 0.982486;, - 0.816853; 0.982532;, - 0.816822; 0.972603;, - 0.831743; 0.982486;, - 0.831835; 0.988692;, - 0.816944; 0.988737;, - 0.816853; 0.982532;, - 0.968296; 0.030946;, - 0.968275; 0.024798;, - 0.983169; 0.024752;, - 0.983190; 0.030901;, - 0.968275; 0.024798;, - 0.968245; 0.014870;, - 0.983138; 0.014824;, - 0.983169; 0.024752;, - 0.968245; 0.014870;, - 0.968228; 0.008608;, - 0.983121; 0.008563;, - 0.983138; 0.014824;, - 0.976499; 0.566561;, - 0.976516; 0.560299;, - 0.991410; 0.560345;, - 0.991393; 0.566607;, - 0.976516; 0.560299;, - 0.976547; 0.550371;, - 0.991440; 0.550417;, - 0.991410; 0.560345;, - 0.976547; 0.550371;, - 0.976568; 0.544223;, - 0.991461; 0.544269;, - 0.991440; 0.550417;, - 0.946691; 0.400894;, - 0.943282; 0.407278;, - 0.938177; 0.398762;, - 0.946694; 0.393657;, - 0.943282; 0.407278;, - 0.934766; 0.412383;, - 0.929661; 0.403867;, - 0.938177; 0.398762;, - 0.921144; 0.408971;, - 0.929661; 0.403867;, - 0.934766; 0.412383;, - 0.927528; 0.412380;, - 0.946694; 0.393657;, - 0.938177; 0.398762;, - 0.933073; 0.390245;, - 0.941589; 0.385141;, - 0.938177; 0.398762;, - 0.929661; 0.403867;, - 0.924556; 0.395350;, - 0.933073; 0.390245;, - 0.929661; 0.403867;, - 0.921144; 0.408971;, - 0.916040; 0.400455;, - 0.924556; 0.395350;, - 0.941589; 0.385141;, - 0.933073; 0.390245;, - 0.927968; 0.381729;, - 0.935205; 0.381732;, - 0.933073; 0.390245;, - 0.924556; 0.395350;, - 0.919452; 0.386833;, - 0.927968; 0.381729;, - 0.924556; 0.395350;, - 0.916040; 0.400455;, - 0.916043; 0.393218;, - 0.919452; 0.386833;, - 0.053427; 0.032111;, - 0.058062; 0.028402;, - 0.062999; 0.038347;, - 0.050634; 0.038309;, - 0.583303; 0.115417;, - 0.593227; 0.115447;, - 0.592942; 0.125376;, - 0.583019; 0.125345;, - 0.593227; 0.115447;, - 0.599417; 0.119190;, - 0.603120; 0.125407;, - 0.592942; 0.125376;, - 0.050634; 0.038309;, - 0.062999; 0.038347;, - 0.062968; 0.048276;, - 0.050604; 0.048238;, - 0.583019; 0.125345;, - 0.592942; 0.125376;, - 0.592911; 0.135305;, - 0.582988; 0.135274;, - 0.592942; 0.125376;, - 0.603120; 0.125407;, - 0.603089; 0.135336;, - 0.592911; 0.135305;, - 0.050604; 0.048238;, - 0.062968; 0.048276;, - 0.057971; 0.058190;, - 0.053359; 0.054452;, - 0.582988; 0.135274;, - 0.592911; 0.135305;, - 0.593135; 0.145235;, - 0.583212; 0.145204;, - 0.592911; 0.135305;, - 0.603089; 0.135336;, - 0.599349; 0.141530;, - 0.593135; 0.145235;, - 0.965688; 0.977625;, - 0.965726; 0.971419;, - 0.980620; 0.971465;, - 0.980581; 0.977670;, - 0.965726; 0.971419;, - 0.965757; 0.961490;, - 0.980650; 0.961535;, - 0.980620; 0.971465;, - 0.965757; 0.961490;, - 0.965756; 0.955284;, - 0.980650; 0.955330;, - 0.980650; 0.961535;, - 0.876031; 0.657064;, - 0.875978; 0.663270;, - 0.861087; 0.663316;, - 0.861140; 0.657110;, - 0.875978; 0.663270;, - 0.876008; 0.673199;, - 0.861117; 0.673245;, - 0.861087; 0.663316;, - 0.876008; 0.673199;, - 0.876099; 0.679405;, - 0.861208; 0.679450;, - 0.861117; 0.673245;, - 0.976568; 0.603884;, - 0.976547; 0.597736;, - 0.991440; 0.597690;, - 0.991461; 0.603838;, - 0.976547; 0.597736;, - 0.976516; 0.587808;, - 0.991410; 0.587762;, - 0.991440; 0.597690;, - 0.976516; 0.587808;, - 0.976499; 0.581546;, - 0.991393; 0.581501;, - 0.991410; 0.587762;, - 0.803028; 0.032325;, - 0.803045; 0.026063;, - 0.817939; 0.026108;, - 0.817922; 0.032370;, - 0.803045; 0.026063;, - 0.803076; 0.016135;, - 0.817969; 0.016180;, - 0.817939; 0.026108;, - 0.803076; 0.016135;, - 0.803097; 0.009987;, - 0.817990; 0.010032;, - 0.817969; 0.016180;, - 0.901143; 0.400894;, - 0.897734; 0.407278;, - 0.892629; 0.398762;, - 0.901146; 0.393657;, - 0.897734; 0.407278;, - 0.889217; 0.412383;, - 0.884113; 0.403867;, - 0.892629; 0.398762;, - 0.875596; 0.408971;, - 0.884113; 0.403867;, - 0.889217; 0.412383;, - 0.881980; 0.412380;, - 0.901146; 0.393657;, - 0.892629; 0.398762;, - 0.887525; 0.390245;, - 0.896041; 0.385141;, - 0.892629; 0.398762;, - 0.884113; 0.403867;, - 0.879008; 0.395350;, - 0.887525; 0.390245;, - 0.884113; 0.403867;, - 0.875596; 0.408971;, - 0.870492; 0.400455;, - 0.879008; 0.395350;, - 0.896041; 0.385141;, - 0.887525; 0.390245;, - 0.882420; 0.381729;, - 0.889657; 0.381732;, - 0.887525; 0.390245;, - 0.879008; 0.395350;, - 0.873904; 0.386833;, - 0.882420; 0.381729;, - 0.879008; 0.395350;, - 0.870492; 0.400455;, - 0.870495; 0.393218;, - 0.873904; 0.386833;, - 0.431519; 0.025959;, - 0.436154; 0.022250;, - 0.441091; 0.032194;, - 0.428726; 0.032156;, - 0.941789; 0.581501;, - 0.951712; 0.581531;, - 0.951428; 0.591459;, - 0.941504; 0.591429;, - 0.951712; 0.581531;, - 0.957903; 0.585273;, - 0.961605; 0.591491;, - 0.951428; 0.591459;, - 0.428726; 0.032156;, - 0.441091; 0.032194;, - 0.441060; 0.042123;, - 0.428696; 0.042085;, - 0.941504; 0.591429;, - 0.951428; 0.591459;, - 0.951397; 0.601388;, - 0.941474; 0.601358;, - 0.951428; 0.591459;, - 0.961605; 0.591491;, - 0.961575; 0.601420;, - 0.951397; 0.601388;, - 0.428696; 0.042085;, - 0.441060; 0.042123;, - 0.436063; 0.052037;, - 0.431451; 0.048299;, - 0.941474; 0.601358;, - 0.951397; 0.601388;, - 0.951621; 0.611318;, - 0.941698; 0.611288;, - 0.951397; 0.601388;, - 0.961575; 0.601420;, - 0.957835; 0.607614;, - 0.951621; 0.611318;, - 0.965102; 0.112953;, - 0.950210; 0.112907;, - 0.950302; 0.083120;, - 0.965194; 0.083165;, - 0.948925; 0.292137;, - 0.963817; 0.292091;, - 0.963908; 0.321879;, - 0.949016; 0.321924;, - 0.787290; 0.381820;, - 0.772260; 0.426455;, - 0.742473; 0.426365;, - 0.757503; 0.381729;, - 0.772260; 0.426455;, - 0.771897; 0.545605;, - 0.742110; 0.545514;, - 0.742473; 0.426365;, - 0.771897; 0.545605;, - 0.786654; 0.590332;, - 0.756867; 0.590241;, - 0.742110; 0.545514;, - 0.771543; 0.903156;, - 0.756516; 0.858520;, - 0.786297; 0.858429;, - 0.801325; 0.903065;, - 0.756516; 0.858520;, - 0.756151; 0.739371;, - 0.785933; 0.739280;, - 0.786297; 0.858429;, - 0.756151; 0.739371;, - 0.770905; 0.694644;, - 0.800687; 0.694553;, - 0.785933; 0.739280;, - 0.861434; 0.739233;, - 0.862080; 0.694553;, - 0.876965; 0.694599;, - 0.876319; 0.739278;, - 0.876319; 0.739278;, - 0.875953; 0.858428;, - 0.861068; 0.858382;, - 0.861434; 0.739233;, - 0.875953; 0.858428;, - 0.876325; 0.903110;, - 0.861440; 0.903065;, - 0.861068; 0.858382;, - 0.894513; 0.158139;, - 0.894376; 0.202821;, - 0.879482; 0.202775;, - 0.879619; 0.158094;, - 0.894376; 0.202821;, - 0.894010; 0.321970;, - 0.879116; 0.321925;, - 0.879482; 0.202775;, - 0.894010; 0.321970;, - 0.893873; 0.366651;, - 0.878979; 0.366606;, - 0.879116; 0.321925;, - 0.963908; 0.366606;, - 0.949016; 0.366651;, - 0.948925; 0.336864;, - 0.963817; 0.336818;, - 0.949016; 0.233634;, - 0.963908; 0.233679;, - 0.963817; 0.263467;, - 0.948925; 0.263421;, - 0.682036; 0.590241;, - 0.697066; 0.545605;, - 0.726853; 0.545696;, - 0.711823; 0.590332;, - 0.697066; 0.545605;, - 0.697429; 0.426455;, - 0.727216; 0.426546;, - 0.726853; 0.545696;, - 0.697429; 0.426455;, - 0.682672; 0.381729;, - 0.712459; 0.381820;, - 0.727216; 0.426546;, - 0.394909; 0.187632;, - 0.409936; 0.232267;, - 0.380155; 0.232358;, - 0.365127; 0.187723;, - 0.409936; 0.232267;, - 0.410301; 0.351417;, - 0.380519; 0.351508;, - 0.380155; 0.232358;, - 0.410301; 0.351417;, - 0.395547; 0.396144;, - 0.365765; 0.396235;, - 0.380519; 0.351508;, - 0.892259; 0.477263;, - 0.892396; 0.432582;, - 0.907290; 0.432628;, - 0.907153; 0.477309;, - 0.907153; 0.477309;, - 0.906787; 0.596458;, - 0.891893; 0.596413;, - 0.892259; 0.477263;, - 0.906787; 0.596458;, - 0.906650; 0.641139;, - 0.891756; 0.641094;, - 0.891893; 0.596413;, - 0.440719; 0.158414;, - 0.441091; 0.203097;, - 0.426206; 0.203051;, - 0.425834; 0.158368;, - 0.441091; 0.203097;, - 0.440725; 0.322246;, - 0.425840; 0.322201;, - 0.426206; 0.203051;, - 0.440725; 0.322246;, - 0.440080; 0.366926;, - 0.425195; 0.366880;, - 0.425840; 0.322201;, - 0.162530; 0.164393;, - 0.130129; 0.164293;, - 0.130312; 0.104719;, - 0.162713; 0.104818;, - 0.648292; 0.145235;, - 0.618013; 0.145142;, - 0.618196; 0.085567;, - 0.648475; 0.085660;, - 0.007855; 0.456088;, - 0.008264; 0.321891;, - 0.067839; 0.322073;, - 0.067430; 0.456270;, - 0.590935; 0.992553;, - 0.590479; 0.843644;, - 0.650054; 0.843462;, - 0.650510; 0.992371;, - 0.590479; 0.843644;, - 0.590024; 0.694735;, - 0.649599; 0.694553;, - 0.650054; 0.843462;, - 0.876863; 0.507005;, - 0.847489; 0.641139;, - 0.847033; 0.492202;, - 0.834256; 0.366651;, - 0.834712; 0.217714;, - 0.864086; 0.351849;, - 0.067430; 0.456270;, - 0.067147; 0.549198;, - 0.007572; 0.549017;, - 0.007855; 0.456088;, - 0.067147; 0.549198;, - 0.067022; 0.590156;, - 0.007447; 0.589974;, - 0.007572; 0.549017;, - 0.832139; 0.547962;, - 0.802642; 0.641140;, - 0.802184; 0.492202;, - 0.832013; 0.507005;, - 0.816219; 0.843490;, - 0.816677; 0.694553;, - 0.846175; 0.787730;, - 0.846049; 0.828688;, - 0.085625; 0.396521;, - 0.085625; 0.391256;, - 0.088258; 0.393888;, - 0.007447; 0.205788;, - 0.007447; 0.200523;, - 0.010080; 0.203156;, - 0.090890; 0.396521;, - 0.085625; 0.396521;, - 0.088258; 0.393888;, - 0.007447; 0.200523;, - 0.012712; 0.200523;, - 0.010080; 0.203156;, - 0.090890; 0.391255;, - 0.090890; 0.396521;, - 0.088258; 0.393888;, - 0.012712; 0.200523;, - 0.012713; 0.205789;, - 0.010080; 0.203156;, - 0.088258; 0.393888;, - 0.085625; 0.391256;, - 0.090890; 0.391255;, - 0.012713; 0.205789;, - 0.007447; 0.205788;, - 0.010080; 0.203156;, - 0.917879; 0.694555;, - 0.917811; 0.873229;, - 0.912546; 0.873227;, - 0.912614; 0.694553;, - 0.567954; 0.086719;, - 0.567406; 0.265443;, - 0.562161; 0.265427;, - 0.562709; 0.086702;, - 0.933483; 0.187915;, - 0.934031; 0.366640;, - 0.930182; 0.366651;, - 0.929634; 0.187927;, - 0.085633; 0.590156;, - 0.085084; 0.411431;, - 0.090342; 0.411415;, - 0.090890; 0.590140;, - 0.007447; 0.185629;, - 0.007447; 0.180364;, - 0.010080; 0.182996;, - 0.109970; 0.173175;, - 0.109970; 0.167909;, - 0.112603; 0.170542;, - 0.012712; 0.185629;, - 0.007447; 0.185629;, - 0.010080; 0.182996;, - 0.109970; 0.167909;, - 0.115235; 0.167910;, - 0.112603; 0.170542;, - 0.012713; 0.180363;, - 0.012712; 0.185629;, - 0.010080; 0.182996;, - 0.115235; 0.167910;, - 0.115236; 0.173175;, - 0.112603; 0.170542;, - 0.010080; 0.182996;, - 0.007447; 0.180364;, - 0.012713; 0.180363;, - 0.115236; 0.173175;, - 0.109970; 0.173175;, - 0.112603; 0.170542;, - 0.914740; 0.187978;, - 0.914672; 0.366651;, - 0.909407; 0.366649;, - 0.909475; 0.187976;, - 0.897652; 0.694569;, - 0.897104; 0.873294;, - 0.891858; 0.873277;, - 0.892407; 0.694553;, - 0.926032; 0.432582;, - 0.926580; 0.611307;, - 0.922732; 0.611318;, - 0.922184; 0.432594;, - 0.109978; 0.366809;, - 0.109430; 0.188085;, - 0.114687; 0.188069;, - 0.115236; 0.366793;, - 0.718087; 0.179130;, - 0.738116; 0.190695;, - 0.706525; 0.222286;, - 0.694959; 0.179129;, - 0.718087; 0.179130;, - 0.706525; 0.222286;, - 0.674931; 0.190691;, - 0.694959; 0.179129;, - 0.706525; 0.222286;, - 0.663369; 0.210719;, - 0.674931; 0.190691;, - 0.706525; 0.222286;, - 0.663370; 0.233847;, - 0.663369; 0.210719;, - 0.706525; 0.222286;, - 0.674935; 0.253877;, - 0.663370; 0.233847;, - 0.706525; 0.222286;, - 0.694964; 0.265442;, - 0.674935; 0.253877;, - 0.706525; 0.222286;, - 0.718091; 0.265443;, - 0.694964; 0.265442;, - 0.706525; 0.222286;, - 0.738119; 0.253881;, - 0.718091; 0.265443;, - 0.706525; 0.222286;, - 0.749682; 0.233852;, - 0.738119; 0.253881;, - 0.706525; 0.222286;, - 0.749681; 0.210725;, - 0.749682; 0.233852;, - 0.706525; 0.222286;, - 0.706525; 0.222286;, - 0.738116; 0.190695;, - 0.749681; 0.210725;, - 0.675025; 0.042920;, - 0.704812; 0.043011;, - 0.704744; 0.065320;, - 0.674957; 0.065229;, - 0.648383; 0.040815;, - 0.648475; 0.070602;, - 0.625436; 0.070673;, - 0.625345; 0.040886;, - 0.920938; 0.940436;, - 0.950726; 0.940345;, - 0.950794; 0.962685;, - 0.921007; 0.962777;, - 0.920870; 0.918096;, - 0.950657; 0.918004;, - 0.950726; 0.940345;, - 0.920938; 0.940436;, - 0.854126; 0.068216;, - 0.854137; 0.038437;, - 0.877266; 0.038447;, - 0.877255; 0.068226;, - 0.186587; 0.063748;, - 0.216374; 0.063657;, - 0.216443; 0.086110;, - 0.186655; 0.086201;, - 0.186519; 0.041528;, - 0.216306; 0.041437;, - 0.216374; 0.063657;, - 0.186587; 0.063748;, - 0.816914; 0.951457;, - 0.816822; 0.921670;, - 0.839916; 0.921599;, - 0.840007; 0.951387;, - 0.487370; 0.125074;, - 0.457583; 0.124982;, - 0.457651; 0.102859;, - 0.487438; 0.102951;, - 0.487301; 0.147606;, - 0.457514; 0.147514;, - 0.457583; 0.124982;, - 0.487370; 0.125074;, - 0.487250; 0.164509;, - 0.457462; 0.164418;, - 0.457514; 0.147514;, - 0.487301; 0.147606;, - 0.704676; 0.087691;, - 0.674888; 0.087600;, - 0.674957; 0.065229;, - 0.704744; 0.065320;, - 0.189082; 0.238239;, - 0.194864; 0.228224;, - 0.216442; 0.234005;, - 0.204877; 0.254035;, - 0.194864; 0.228224;, - 0.194864; 0.216661;, - 0.216443; 0.210877;, - 0.216442; 0.234005;, - 0.194864; 0.216661;, - 0.189083; 0.206646;, - 0.204880; 0.190849;, - 0.216443; 0.210877;, - 0.189083; 0.206646;, - 0.179069; 0.200865;, - 0.184852; 0.179287;, - 0.204880; 0.190849;, - 0.179069; 0.200865;, - 0.167505; 0.200866;, - 0.161725; 0.179288;, - 0.184852; 0.179287;, - 0.167505; 0.200866;, - 0.157491; 0.206648;, - 0.141695; 0.190853;, - 0.161725; 0.179288;, - 0.157491; 0.206648;, - 0.151708; 0.216663;, - 0.130131; 0.210883;, - 0.141695; 0.190853;, - 0.151708; 0.216663;, - 0.151708; 0.228227;, - 0.130129; 0.234010;, - 0.130131; 0.210883;, - 0.151708; 0.228227;, - 0.157489; 0.238241;, - 0.141692; 0.254039;, - 0.130129; 0.234010;, - 0.157489; 0.238241;, - 0.167503; 0.244022;, - 0.161720; 0.265601;, - 0.141692; 0.254039;, - 0.167503; 0.244022;, - 0.179067; 0.244022;, - 0.184847; 0.265600;, - 0.161720; 0.265601;, - 0.179067; 0.244022;, - 0.189082; 0.238239;, - 0.204877; 0.254035;, - 0.184847; 0.265600;, - 0.117964; 0.030160;, - 0.117929; 0.019050;, - 0.132823; 0.019004;, - 0.132857; 0.030114;, - 0.912591; 0.888122;, - 0.924138; 0.888158;, - 0.924092; 0.903052;, - 0.912546; 0.903016;, - 0.963852; 0.207678;, - 0.963818; 0.218740;, - 0.948925; 0.218694;, - 0.948958; 0.207633;, - 0.963887; 0.196412;, - 0.963852; 0.207678;, - 0.948958; 0.207633;, - 0.948993; 0.196367;, - 0.963913; 0.187961;, - 0.963887; 0.196412;, - 0.948993; 0.196367;, - 0.949019; 0.187915;, - 0.970886; 0.891836;, - 0.970920; 0.880650;, - 0.985813; 0.880695;, - 0.985779; 0.891881;, - 0.970852; 0.902990;, - 0.970886; 0.891836;, - 0.985779; 0.891881;, - 0.985745; 0.903036;, - 0.293429; 0.019986;, - 0.304948; 0.019951;, - 0.304994; 0.034844;, - 0.293475; 0.034880;, - 0.932807; 0.817306;, - 0.932773; 0.806136;, - 0.947667; 0.806090;, - 0.947701; 0.817261;, - 0.932842; 0.828477;, - 0.932807; 0.817306;, - 0.947701; 0.817261;, - 0.947735; 0.828431;, - 0.704859; 0.028026;, - 0.693295; 0.028021;, - 0.693300; 0.013132;, - 0.704865; 0.013137;, - 0.117929; 0.019050;, - 0.117895; 0.007823;, - 0.132789; 0.007778;, - 0.132823; 0.019004;, - 0.855854; 0.104853;, - 0.877266; 0.110479;, - 0.871483; 0.120494;, - 0.855854; 0.104853;, - 0.877266; 0.098915;, - 0.877266; 0.110479;, - 0.855854; 0.104853;, - 0.871485; 0.088901;, - 0.877266; 0.098915;, - 0.855854; 0.104853;, - 0.861471; 0.083120;, - 0.871485; 0.088901;, - 0.855854; 0.104853;, - 0.849907; 0.083120;, - 0.861471; 0.083120;, - 0.855854; 0.104853;, - 0.839892; 0.088903;, - 0.849907; 0.083120;, - 0.855854; 0.104853;, - 0.834110; 0.098918;, - 0.839892; 0.088903;, - 0.855854; 0.104853;, - 0.834109; 0.110482;, - 0.834110; 0.098918;, - 0.855854; 0.104853;, - 0.839891; 0.120496;, - 0.834109; 0.110482;, - 0.855854; 0.104853;, - 0.849905; 0.126277;, - 0.839891; 0.120496;, - 0.855854; 0.104853;, - 0.861468; 0.126276;, - 0.849905; 0.126277;, - 0.855854; 0.104853;, - 0.871483; 0.120494;, - 0.861468; 0.126276;, - 0.515672; 0.179404;, - 0.535701; 0.190969;, - 0.504111; 0.222560;, - 0.492545; 0.179403;, - 0.515672; 0.179404;, - 0.504111; 0.222560;, - 0.472516; 0.190965;, - 0.492545; 0.179403;, - 0.504111; 0.222560;, - 0.460954; 0.210994;, - 0.472516; 0.190965;, - 0.504111; 0.222560;, - 0.460955; 0.234121;, - 0.460954; 0.210994;, - 0.504111; 0.222560;, - 0.472520; 0.254151;, - 0.460955; 0.234121;, - 0.504111; 0.222560;, - 0.492549; 0.265716;, - 0.472520; 0.254151;, - 0.504111; 0.222560;, - 0.515677; 0.265718;, - 0.492549; 0.265716;, - 0.504111; 0.222560;, - 0.535705; 0.254155;, - 0.515677; 0.265718;, - 0.504111; 0.222560;, - 0.547267; 0.234127;, - 0.535705; 0.254155;, - 0.504111; 0.222560;, - 0.547266; 0.210999;, - 0.547267; 0.234127;, - 0.504111; 0.222560;, - 0.504111; 0.222560;, - 0.535701; 0.190969;, - 0.547266; 0.210999;, - 0.132926; 0.045053;, - 0.162713; 0.045144;, - 0.162645; 0.067453;, - 0.132858; 0.067362;, - 0.035619; 0.041631;, - 0.035710; 0.071418;, - 0.012672; 0.071489;, - 0.012580; 0.041701;, - 0.922252; 0.648644;, - 0.952039; 0.648553;, - 0.952108; 0.670893;, - 0.922321; 0.670985;, - 0.922184; 0.626303;, - 0.951971; 0.626212;, - 0.952039; 0.648553;, - 0.922252; 0.648644;, - 0.892160; 0.068216;, - 0.892171; 0.038437;, - 0.915300; 0.038447;, - 0.915289; 0.068226;, - 0.932841; 0.716864;, - 0.962629; 0.716773;, - 0.962697; 0.739226;, - 0.932910; 0.739317;, - 0.932773; 0.694644;, - 0.962561; 0.694553;, - 0.962629; 0.716773;, - 0.932841; 0.716864;, - 0.035710; 0.086453;, - 0.035619; 0.116241;, - 0.012525; 0.116170;, - 0.012616; 0.086382;, - 0.749614; 0.124799;, - 0.719827; 0.124708;, - 0.719895; 0.102585;, - 0.749682; 0.102676;, - 0.749545; 0.147331;, - 0.719758; 0.147240;, - 0.719827; 0.124708;, - 0.749614; 0.124799;, - 0.749493; 0.164235;, - 0.719706; 0.164143;, - 0.719758; 0.147240;, - 0.749545; 0.147331;, - 0.162577; 0.089825;, - 0.132789; 0.089734;, - 0.132858; 0.067362;, - 0.162645; 0.067453;, - 0.189082; 0.339448;, - 0.194864; 0.329433;, - 0.216442; 0.335213;, - 0.204877; 0.355243;, - 0.194864; 0.329433;, - 0.194864; 0.317869;, - 0.216443; 0.312086;, - 0.216442; 0.335213;, - 0.194864; 0.317869;, - 0.189083; 0.307855;, - 0.204880; 0.292057;, - 0.216443; 0.312086;, - 0.189083; 0.307855;, - 0.179069; 0.302074;, - 0.184852; 0.280495;, - 0.204880; 0.292057;, - 0.179069; 0.302074;, - 0.167505; 0.302074;, - 0.161725; 0.280496;, - 0.184852; 0.280495;, - 0.167505; 0.302074;, - 0.157491; 0.307857;, - 0.141695; 0.292061;, - 0.161725; 0.280496;, - 0.157491; 0.307857;, - 0.151708; 0.317872;, - 0.130131; 0.312091;, - 0.141695; 0.292061;, - 0.151708; 0.317872;, - 0.151708; 0.329435;, - 0.130129; 0.335219;, - 0.130131; 0.312091;, - 0.151708; 0.329435;, - 0.157489; 0.339450;, - 0.141692; 0.355247;, - 0.130129; 0.335219;, - 0.157489; 0.339450;, - 0.167503; 0.345231;, - 0.161720; 0.366809;, - 0.141692; 0.355247;, - 0.167503; 0.345231;, - 0.179067; 0.345230;, - 0.184847; 0.366808;, - 0.161720; 0.366809;, - 0.179067; 0.345230;, - 0.189082; 0.339448;, - 0.204877; 0.355243;, - 0.184847; 0.366808;, - 0.147819; 0.030160;, - 0.147785; 0.019050;, - 0.162679; 0.019004;, - 0.162713; 0.030114;, - 0.094536; 0.366774;, - 0.082989; 0.366809;, - 0.082943; 0.351916;, - 0.094490; 0.351880;, - 0.364671; 0.072128;, - 0.364637; 0.083190;, - 0.349744; 0.083144;, - 0.349778; 0.072083;, - 0.364706; 0.060862;, - 0.364671; 0.072128;, - 0.349778; 0.072083;, - 0.349812; 0.060817;, - 0.364732; 0.052411;, - 0.364706; 0.060862;, - 0.349812; 0.060817;, - 0.349838; 0.052365;, - 0.970886; 0.854556;, - 0.970920; 0.843370;, - 0.985814; 0.843416;, - 0.985779; 0.854602;, - 0.970852; 0.865711;, - 0.970886; 0.854556;, - 0.985779; 0.854602;, - 0.985745; 0.865756;, - 0.738117; 0.013132;, - 0.749636; 0.013097;, - 0.749682; 0.027991;, - 0.738163; 0.028026;, - 0.962663; 0.817306;, - 0.962629; 0.806136;, - 0.977523; 0.806090;, - 0.977557; 0.817261;, - 0.962698; 0.828477;, - 0.962663; 0.817306;, - 0.977557; 0.817261;, - 0.977591; 0.828431;, - 0.585285; 0.027057;, - 0.573721; 0.027052;, - 0.573726; 0.012162;, - 0.585291; 0.012167;, - 0.147785; 0.019050;, - 0.147751; 0.007823;, - 0.162645; 0.007778;, - 0.162679; 0.019004;, - 0.913905; 0.104853;, - 0.935316; 0.110479;, - 0.929534; 0.120494;, - 0.913905; 0.104853;, - 0.935317; 0.098915;, - 0.935316; 0.110479;, - 0.913905; 0.104853;, - 0.929535; 0.088901;, - 0.935317; 0.098915;, - 0.913905; 0.104853;, - 0.919521; 0.083120;, - 0.929535; 0.088901;, - 0.913905; 0.104853;, - 0.907958; 0.083120;, - 0.919521; 0.083120;, - 0.913905; 0.104853;, - 0.897943; 0.088903;, - 0.907958; 0.083120;, - 0.913905; 0.104853;, - 0.892160; 0.098918;, - 0.897943; 0.088903;, - 0.913905; 0.104853;, - 0.892160; 0.110482;, - 0.892160; 0.098918;, - 0.913905; 0.104853;, - 0.897941; 0.120496;, - 0.892160; 0.110482;, - 0.913905; 0.104853;, - 0.907955; 0.126277;, - 0.897941; 0.120496;, - 0.913905; 0.104853;, - 0.919519; 0.126276;, - 0.907955; 0.126277;, - 0.913905; 0.104853;, - 0.929534; 0.120494;, - 0.919519; 0.126276;, - 0.562162; 0.311933;, - 0.573727; 0.291903;, - 0.605318; 0.323494;, - 0.562161; 0.335061;, - 0.562162; 0.311933;, - 0.605318; 0.323494;, - 0.573724; 0.355089;, - 0.562161; 0.335061;, - 0.605318; 0.323494;, - 0.593752; 0.366651;, - 0.573724; 0.355089;, - 0.605318; 0.323494;, - 0.616879; 0.366650;, - 0.593752; 0.366651;, - 0.605318; 0.323494;, - 0.636909; 0.355085;, - 0.616879; 0.366650;, - 0.605318; 0.323494;, - 0.648474; 0.335055;, - 0.636909; 0.355085;, - 0.605318; 0.323494;, - 0.648475; 0.311928;, - 0.648474; 0.335055;, - 0.605318; 0.323494;, - 0.636912; 0.291899;, - 0.648475; 0.311928;, - 0.605318; 0.323494;, - 0.616884; 0.280337;, - 0.636912; 0.291899;, - 0.605318; 0.323494;, - 0.593757; 0.280338;, - 0.616884; 0.280337;, - 0.605318; 0.323494;, - 0.605318; 0.323494;, - 0.573727; 0.291903;, - 0.593757; 0.280338;, - 0.410301; 0.083099;, - 0.380514; 0.083190;, - 0.380445; 0.060737;, - 0.410232; 0.060646;, - 0.953334; 0.038447;, - 0.953323; 0.068226;, - 0.930194; 0.068216;, - 0.930205; 0.038437;, - 0.334781; 0.072205;, - 0.304994; 0.072114;, - 0.305063; 0.049773;, - 0.334850; 0.049865;, - 0.334713; 0.094546;, - 0.304925; 0.094454;, - 0.304994; 0.072114;, - 0.334781; 0.072205;, - 0.932865; 0.784069;, - 0.932773; 0.754281;, - 0.955811; 0.754211;, - 0.955903; 0.783998;, - 0.487370; 0.065594;, - 0.457583; 0.065503;, - 0.457651; 0.043194;, - 0.487438; 0.043285;, - 0.487302; 0.087966;, - 0.457515; 0.087875;, - 0.457583; 0.065503;, - 0.487370; 0.065594;, - 0.834246; 0.185917;, - 0.864034; 0.185826;, - 0.864086; 0.202729;, - 0.834298; 0.202821;, - 0.834177; 0.163385;, - 0.863965; 0.163294;, - 0.864034; 0.185826;, - 0.834246; 0.185917;, - 0.834109; 0.141262;, - 0.863897; 0.141171;, - 0.863965; 0.163294;, - 0.834177; 0.163385;, - 0.952728; 0.143163;, - 0.952819; 0.172950;, - 0.929726; 0.173021;, - 0.929634; 0.143234;, - 0.380377; 0.038517;, - 0.410164; 0.038426;, - 0.410232; 0.060646;, - 0.380445; 0.060737;, - 0.034808; 0.279635;, - 0.044823; 0.285418;, - 0.039042; 0.306996;, - 0.019013; 0.295431;, - 0.044823; 0.285418;, - 0.056387; 0.285418;, - 0.062170; 0.306997;, - 0.039042; 0.306996;, - 0.056387; 0.285418;, - 0.066401; 0.279637;, - 0.082198; 0.295435;, - 0.062170; 0.306997;, - 0.066401; 0.279637;, - 0.072182; 0.269623;, - 0.093761; 0.275406;, - 0.082198; 0.295435;, - 0.072182; 0.269623;, - 0.072181; 0.258059;, - 0.093759; 0.252279;, - 0.093761; 0.275406;, - 0.072181; 0.258059;, - 0.066399; 0.248044;, - 0.082194; 0.232249;, - 0.093759; 0.252279;, - 0.066399; 0.248044;, - 0.056384; 0.242262;, - 0.062165; 0.220684;, - 0.082194; 0.232249;, - 0.056384; 0.242262;, - 0.044821; 0.242261;, - 0.039038; 0.220683;, - 0.062165; 0.220684;, - 0.044821; 0.242261;, - 0.034807; 0.248042;, - 0.019009; 0.232245;, - 0.039038; 0.220683;, - 0.034807; 0.248042;, - 0.029025; 0.258057;, - 0.007447; 0.252273;, - 0.019009; 0.232245;, - 0.029025; 0.258057;, - 0.029026; 0.269620;, - 0.007448; 0.275401;, - 0.007447; 0.252273;, - 0.029026; 0.269620;, - 0.034808; 0.279635;, - 0.019013; 0.295431;, - 0.007448; 0.275401;, - 0.364732; 0.015131;, - 0.364698; 0.026317;, - 0.349804; 0.026271;, - 0.349838; 0.015086;, - 0.426129; 0.121147;, - 0.426103; 0.112695;, - 0.440997; 0.112650;, - 0.441022; 0.121101;, - 0.426163; 0.132413;, - 0.426129; 0.121147;, - 0.441022; 0.121101;, - 0.441057; 0.132367;, - 0.426197; 0.143474;, - 0.426163; 0.132413;, - 0.441057; 0.132367;, - 0.441091; 0.143429;, - 0.950579; 0.903052;, - 0.939032; 0.903016;, - 0.939077; 0.888122;, - 0.950624; 0.888158;, - 0.991427; 0.488491;, - 0.991461; 0.499601;, - 0.976568; 0.499646;, - 0.976533; 0.488536;, - 0.991393; 0.477264;, - 0.991427; 0.488491;, - 0.976533; 0.488536;, - 0.976499; 0.477310;, - 0.024146; 0.011842;, - 0.035710; 0.011847;, - 0.035704; 0.026737;, - 0.024140; 0.026732;, - 0.905921; 0.668280;, - 0.905887; 0.679451;, - 0.890993; 0.679405;, - 0.891027; 0.668235;, - 0.905955; 0.657110;, - 0.905921; 0.668280;, - 0.891027; 0.668235;, - 0.891062; 0.657064;, - 0.487438; 0.028265;, - 0.475919; 0.028300;, - 0.475874; 0.013407;, - 0.487393; 0.013371;, - 0.364698; 0.026317;, - 0.364664; 0.037471;, - 0.349770; 0.037426;, - 0.349804; 0.026271;, - 0.796578; 0.114236;, - 0.790631; 0.135969;, - 0.780617; 0.130186;, - 0.796578; 0.114236;, - 0.802195; 0.135969;, - 0.790631; 0.135969;, - 0.796578; 0.114236;, - 0.812209; 0.130188;, - 0.802195; 0.135969;, - 0.796578; 0.114236;, - 0.817990; 0.120174;, - 0.812209; 0.130188;, - 0.796578; 0.114236;, - 0.817990; 0.108610;, - 0.817990; 0.120174;, - 0.796578; 0.114236;, - 0.812207; 0.098595;, - 0.817990; 0.108610;, - 0.796578; 0.114236;, - 0.802193; 0.092813;, - 0.812207; 0.098595;, - 0.796578; 0.114236;, - 0.790629; 0.092812;, - 0.802193; 0.092813;, - 0.796578; 0.114236;, - 0.780615; 0.098593;, - 0.790629; 0.092812;, - 0.796578; 0.114236;, - 0.774834; 0.108607;, - 0.780615; 0.098593;, - 0.796578; 0.114236;, - 0.774834; 0.120171;, - 0.774834; 0.108607;, - 0.796578; 0.114236;, - 0.780617; 0.130186;, - 0.774834; 0.120171;, - 0.460955; 0.312207;, - 0.472520; 0.292178;, - 0.504111; 0.323768;, - 0.460954; 0.335335;, - 0.460955; 0.312207;, - 0.504111; 0.323768;, - 0.472516; 0.355363;, - 0.460954; 0.335335;, - 0.504111; 0.323768;, - 0.492545; 0.366926;, - 0.472516; 0.355363;, - 0.504111; 0.323768;, - 0.515672; 0.366924;, - 0.492545; 0.366926;, - 0.504111; 0.323768;, - 0.535701; 0.355359;, - 0.515672; 0.366924;, - 0.504111; 0.323768;, - 0.547266; 0.335330;, - 0.535701; 0.355359;, - 0.504111; 0.323768;, - 0.547267; 0.312202;, - 0.547266; 0.335330;, - 0.504111; 0.323768;, - 0.535705; 0.292174;, - 0.547267; 0.312202;, - 0.504111; 0.323768;, - 0.515677; 0.280611;, - 0.535705; 0.292174;, - 0.504111; 0.323768;, - 0.492549; 0.280613;, - 0.515677; 0.280611;, - 0.504111; 0.323768;, - 0.504111; 0.323768;, - 0.472520; 0.292178;, - 0.492549; 0.280613;, - 0.276475; 0.083284;, - 0.246687; 0.083375;, - 0.246619; 0.060923;, - 0.276406; 0.060831;, - 0.964614; 0.432592;, - 0.964603; 0.462371;, - 0.941474; 0.462361;, - 0.941485; 0.432582;, - 0.846075; 0.880816;, - 0.816287; 0.880724;, - 0.816356; 0.858384;, - 0.846143; 0.858475;, - 0.846006; 0.903156;, - 0.816219; 0.903065;, - 0.816287; 0.880724;, - 0.846075; 0.880816;, - 0.562252; 0.071809;, - 0.562161; 0.042021;, - 0.585199; 0.041951;, - 0.585291; 0.071738;, - 0.749614; 0.065320;, - 0.719827; 0.065229;, - 0.719895; 0.042920;, - 0.749682; 0.043011;, - 0.749546; 0.087691;, - 0.719758; 0.087600;, - 0.719827; 0.065229;, - 0.749614; 0.065320;, - 0.663505; 0.147331;, - 0.693293; 0.147240;, - 0.693345; 0.164143;, - 0.663557; 0.164235;, - 0.663436; 0.124799;, - 0.693224; 0.124708;, - 0.693293; 0.147240;, - 0.663505; 0.147331;, - 0.663369; 0.102676;, - 0.693156; 0.102585;, - 0.693224; 0.124708;, - 0.663436; 0.124799;, - 0.955867; 0.843370;, - 0.955958; 0.873158;, - 0.932864; 0.873229;, - 0.932773; 0.843441;, - 0.246551; 0.038702;, - 0.276338; 0.038611;, - 0.276406; 0.060831;, - 0.246619; 0.060923;, - 0.690730; 0.339290;, - 0.700745; 0.345072;, - 0.694964; 0.366650;, - 0.674935; 0.355085;, - 0.700745; 0.345072;, - 0.712308; 0.345073;, - 0.718091; 0.366651;, - 0.694964; 0.366650;, - 0.712308; 0.345073;, - 0.722322; 0.339291;, - 0.738120; 0.355089;, - 0.718091; 0.366651;, - 0.722322; 0.339291;, - 0.728104; 0.329277;, - 0.749682; 0.335061;, - 0.738120; 0.355089;, - 0.728104; 0.329277;, - 0.728103; 0.317714;, - 0.749681; 0.311933;, - 0.749682; 0.335061;, - 0.728103; 0.317714;, - 0.722321; 0.307699;, - 0.738116; 0.291903;, - 0.749681; 0.311933;, - 0.722321; 0.307699;, - 0.712306; 0.301916;, - 0.718087; 0.280338;, - 0.738116; 0.291903;, - 0.712306; 0.301916;, - 0.700742; 0.301915;, - 0.694959; 0.280337;, - 0.718087; 0.280338;, - 0.700742; 0.301915;, - 0.690728; 0.307697;, - 0.674931; 0.291899;, - 0.694959; 0.280337;, - 0.690728; 0.307697;, - 0.684947; 0.317711;, - 0.663369; 0.311928;, - 0.674931; 0.291899;, - 0.684947; 0.317711;, - 0.684948; 0.329275;, - 0.663370; 0.335055;, - 0.663369; 0.311928;, - 0.684948; 0.329275;, - 0.690730; 0.339290;, - 0.674935; 0.355085;, - 0.663370; 0.335055;, - 0.985758; 0.754256;, - 0.985724; 0.765442;, - 0.970831; 0.765396;, - 0.970865; 0.754211;, - 0.426129; 0.075428;, - 0.426103; 0.066977;, - 0.440997; 0.066931;, - 0.441022; 0.075382;, - 0.426163; 0.086694;, - 0.426129; 0.075428;, - 0.441022; 0.075382;, - 0.441057; 0.086648;, - 0.426197; 0.097756;, - 0.426163; 0.086694;, - 0.441057; 0.086648;, - 0.441091; 0.097710;, - 0.094490; 0.336987;, - 0.082943; 0.336951;, - 0.082989; 0.322057;, - 0.094536; 0.322093;, - 0.992519; 0.705779;, - 0.992553; 0.716889;, - 0.977659; 0.716935;, - 0.977625; 0.705825;, - 0.992485; 0.694553;, - 0.992519; 0.705779;, - 0.977625; 0.705825;, - 0.977591; 0.694599;, - 0.666836; 0.013132;, - 0.678401; 0.013137;, - 0.678395; 0.028026;, - 0.666831; 0.028021;, - 0.980616; 0.929220;, - 0.980582; 0.940390;, - 0.965688; 0.940345;, - 0.965722; 0.929175;, - 0.980650; 0.918050;, - 0.980616; 0.929220;, - 0.965722; 0.929175;, - 0.965757; 0.918004;, - 0.978567; 0.678386;, - 0.967048; 0.678421;, - 0.967002; 0.663527;, - 0.978521; 0.663492;, - 0.985724; 0.765442;, - 0.985690; 0.776596;, - 0.970797; 0.776551;, - 0.970831; 0.765396;, - 0.072349; 0.094507;, - 0.066401; 0.116240;, - 0.056387; 0.110457;, - 0.072349; 0.094507;, - 0.077965; 0.116241;, - 0.066401; 0.116240;, - 0.072349; 0.094507;, - 0.087979; 0.110459;, - 0.077965; 0.116241;, - 0.072349; 0.094507;, - 0.093761; 0.100445;, - 0.087979; 0.110459;, - 0.072349; 0.094507;, - 0.093760; 0.088881;, - 0.093761; 0.100445;, - 0.072349; 0.094507;, - 0.087977; 0.078867;, - 0.093760; 0.088881;, - 0.072349; 0.094507;, - 0.077963; 0.073084;, - 0.087977; 0.078867;, - 0.072349; 0.094507;, - 0.066399; 0.073083;, - 0.077963; 0.073084;, - 0.072349; 0.094507;, - 0.056385; 0.078865;, - 0.066399; 0.073083;, - 0.072349; 0.094507;, - 0.050604; 0.088879;, - 0.056385; 0.078865;, - 0.072349; 0.094507;, - 0.050604; 0.100443;, - 0.050604; 0.088879;, - 0.072349; 0.094507;, - 0.056387; 0.110457;, - 0.050604; 0.100443;, - 0.320415; 0.605317;, - 0.320961; 0.709580;, - 0.305796; 0.694725;, - 0.320961; 0.709580;, - 0.231337; 0.769414;, - 0.305796; 0.694725;, - 0.667142; 0.530437;, - 0.652434; 0.590057;, - 0.562799; 0.590332;, - 0.577363; 0.530712;, - 0.537515; 0.381820;, - 0.547267; 0.441425;, - 0.425469; 0.441051;, - 0.426187; 0.396372;, - 0.216409; 0.530220;, - 0.211093; 0.590156;, - 0.105784; 0.575222;, - 0.111094; 0.530175;, - 0.231519; 0.336568;, - 0.276201; 0.336706;, - 0.261124; 0.396235;, - 0.231337; 0.396143;, - 0.347916; 0.247303;, - 0.315515; 0.247403;, - 0.305818; 0.202751;, - 0.349594; 0.187723;, - 0.666369; 0.694553;, - 0.696139; 0.694644;, - 0.695448; 0.754218;, - 0.665678; 0.754126;, - 0.696139; 0.694644;, - 0.741257; 0.709677;, - 0.740612; 0.754356;, - 0.695448; 0.754218;, - 0.321553; 0.903198;, - 0.321599; 0.992553;, - 0.231815; 0.925798;, - 0.411159; 0.671980;, - 0.500943; 0.605225;, - 0.500897; 0.694580;, - 0.007447; 0.872951;, - 0.007931; 0.714172;, - 0.067506; 0.714276;, - 0.067022; 0.873055;, - 0.321553; 0.903198;, - 0.320961; 0.709580;, - 0.350745; 0.709489;, - 0.351337; 0.903107;, - 0.351337; 0.903107;, - 0.350745; 0.709489;, - 0.395209; 0.714394;, - 0.395695; 0.873175;, - 0.575038; 0.724603;, - 0.574552; 0.883384;, - 0.530088; 0.888290;, - 0.530681; 0.694671;, - 0.530681; 0.694671;, - 0.530088; 0.888290;, - 0.500304; 0.888198;, - 0.500897; 0.694580;, - 0.651796; 0.381545;, - 0.666869; 0.441074;, - 0.577090; 0.441349;, - 0.562161; 0.381820;, - 0.666869; 0.441074;, - 0.667142; 0.530437;, - 0.577363; 0.530712;, - 0.577090; 0.441349;, - 0.547267; 0.441425;, - 0.546993; 0.530787;, - 0.425195; 0.530413;, - 0.425469; 0.441051;, - 0.546993; 0.530787;, - 0.536876; 0.590332;, - 0.425638; 0.575096;, - 0.425195; 0.530413;, - 0.211173; 0.381703;, - 0.216443; 0.440883;, - 0.111128; 0.440838;, - 0.105852; 0.396548;, - 0.216443; 0.440883;, - 0.216409; 0.530220;, - 0.111094; 0.530175;, - 0.111128; 0.440838;, - 0.231519; 0.336568;, - 0.231794; 0.247206;, - 0.276475; 0.247343;, - 0.276201; 0.336706;, - 0.231794; 0.247206;, - 0.231976; 0.187631;, - 0.261764; 0.187723;, - 0.276475; 0.247343;, - 0.348190; 0.336666;, - 0.350233; 0.396235;, - 0.306366; 0.381475;, - 0.315789; 0.336765;, - 0.315789; 0.336765;, - 0.315515; 0.247403;, - 0.347916; 0.247303;, - 0.348190; 0.336666;, - 0.665730; 0.903065;, - 0.665404; 0.843489;, - 0.695174; 0.843580;, - 0.695500; 0.903156;, - 0.665404; 0.843489;, - 0.665678; 0.754126;, - 0.695448; 0.754218;, - 0.695174; 0.843580;, - 0.695500; 0.903156;, - 0.695174; 0.843580;, - 0.740337; 0.843718;, - 0.740709; 0.888401;, - 0.695174; 0.843580;, - 0.695448; 0.754218;, - 0.740612; 0.754356;, - 0.740337; 0.843718;, - 0.215959; 0.873587;, - 0.156384; 0.873327;, - 0.156868; 0.714548;, - 0.216443; 0.714808;, - 0.156384; 0.873327;, - 0.067022; 0.873055;, - 0.067506; 0.714276;, - 0.156868; 0.714548;, - 0.320961; 0.709580;, - 0.320415; 0.605317;, - 0.350597; 0.679700;, - 0.320961; 0.709580;, - 0.350597; 0.679700;, - 0.350745; 0.709489;, - 0.395209; 0.714394;, - 0.350745; 0.709489;, - 0.350597; 0.679700;, - 0.574552; 0.883384;, - 0.529940; 0.918079;, - 0.530088; 0.888290;, - 0.499758; 0.992462;, - 0.500304; 0.888198;, - 0.529940; 0.918079;, - 0.500304; 0.888198;, - 0.530088; 0.888290;, - 0.529940; 0.918079;, - 0.394693; 0.619974;, - 0.357792; 0.634992;, - 0.350199; 0.605225;, - 0.537136; 0.962787;, - 0.574036; 0.977804;, - 0.529542; 0.992553;, - 0.529940; 0.918079;, - 0.537136; 0.962787;, - 0.529542; 0.992553;, - 0.499758; 0.992462;, - 0.350199; 0.605225;, - 0.357792; 0.634992;, - 0.350597; 0.679700;, - 0.320415; 0.605317;, - 0.786380; 0.679312;, - 0.741661; 0.679450;, - 0.741442; 0.608705;, - 0.786185; 0.616014;, - 0.157201; 0.605322;, - 0.157156; 0.620215;, - 0.067794; 0.619943;, - 0.067839; 0.605049;, - 0.657850; 0.608705;, - 0.658067; 0.679450;, - 0.590024; 0.679659;, - 0.601261; 0.620049;, - 0.067839; 0.605049;, - 0.067794; 0.619943;, - 0.023112; 0.619807;, - 0.178528; 0.101210;, - 0.216249; 0.101095;, - 0.216443; 0.164393;, - 0.178665; 0.145891;, - 0.802184; 0.433614;, - 0.816502; 0.390639;, - 0.855598; 0.381729;, - 0.855595; 0.477309;, - 0.067794; 0.619943;, - 0.157156; 0.620215;, - 0.156868; 0.714548;, - 0.067506; 0.714276;, - 0.502548; 0.093764;, - 0.547267; 0.093900;, - 0.547074; 0.157199;, - 0.502332; 0.164509;, - 0.296935; 0.172738;, - 0.297129; 0.109440;, - 0.334850; 0.109555;, - 0.334713; 0.154237;, - 0.733447; 0.992553;, - 0.665404; 0.992344;, - 0.665621; 0.921599;, - 0.722210; 0.932943;, - 0.817990; 0.246443;, - 0.778894; 0.237532;, - 0.764576; 0.194557;, - 0.817987; 0.150863;, - 0.157156; 0.620215;, - 0.157201; 0.605322;, - 0.201837; 0.620352;, - 0.321599; 0.992553;, - 0.351360; 0.947784;, - 0.351383; 0.992462;, - 0.395786; 0.977423;, - 0.351383; 0.992462;, - 0.351360; 0.947784;, - 0.321553; 0.903198;, - 0.351337; 0.903107;, - 0.351360; 0.947784;, - 0.321599; 0.992553;, - 0.500943; 0.605225;, - 0.530727; 0.605317;, - 0.530704; 0.649994;, - 0.530704; 0.649994;, - 0.530727; 0.605317;, - 0.575130; 0.620355;, - 0.530704; 0.649994;, - 0.530681; 0.694671;, - 0.500897; 0.694580;, - 0.500943; 0.605225;, - 0.156384; 0.873327;, - 0.156066; 0.977660;, - 0.066704; 0.977387;, - 0.067022; 0.873055;, - 0.156066; 0.977660;, - 0.156021; 0.992553;, - 0.066658; 0.992281;, - 0.066704; 0.977387;, - 0.066704; 0.977387;, - 0.066658; 0.992281;, - 0.022023; 0.977251;, - 0.156021; 0.992553;, - 0.156066; 0.977660;, - 0.200747; 0.977796;, - 0.231564; 0.098407;, - 0.276245; 0.098269;, - 0.276475; 0.172738;, - 0.231771; 0.165429;, - 0.819282; 0.366651;, - 0.770860; 0.343444;, - 0.764576; 0.299207;, - 0.819362; 0.261337;, - 0.410073; 0.098084;, - 0.410301; 0.172552;, - 0.349744; 0.172738;, - 0.364446; 0.113118;, - 0.593688; 0.227573;, - 0.599973; 0.183336;, - 0.648394; 0.160128;, - 0.648475; 0.265443;, - 0.748478; 0.966444;, - 0.748341; 0.921763;, - 0.801723; 0.921599;, - 0.801928; 0.988621;, - 0.231337; 0.456311;, - 0.410027; 0.455764;, - 0.410301; 0.545127;, - 0.231610; 0.545674;, - 0.231610; 0.545674;, - 0.410301; 0.545127;, - 0.395691; 0.589853;, - 0.239337; 0.590332;, - 0.395145; 0.411129;, - 0.410027; 0.455764;, - 0.231337; 0.456311;, - 0.238790; 0.411607;, - 0.500304; 0.888198;, - 0.499758; 0.992462;, - 0.485140; 0.903054;, - 0.410680; 0.828364;, - 0.500304; 0.888198;, - 0.485140; 0.903054;, - 0.672961; 0.675727;, - 0.673167; 0.608705;, - 0.726548; 0.608869;, - 0.726411; 0.653550;, - 0.905749; 0.992473;, - 0.861068; 0.992337;, - 0.861273; 0.925315;, - 0.905976; 0.918004;, - 0.093761; 0.205789;, - 0.033203; 0.205603;, - 0.033432; 0.131135;, - 0.079058; 0.146168;, - 0.242607; 0.783810;, - 0.242965; 0.901098;, - 0.231815; 0.925798;, - 0.231337; 0.769414;, - 0.242965; 0.901098;, - 0.310269; 0.884148;, - 0.321553; 0.903198;, - 0.231815; 0.925798;, - 0.310269; 0.884148;, - 0.309825; 0.738935;, - 0.320961; 0.709580;, - 0.321553; 0.903198;, - 0.309825; 0.738935;, - 0.242607; 0.783810;, - 0.231337; 0.769414;, - 0.320961; 0.709580;, - 0.309825; 0.738935;, - 0.310269; 0.884148;, - 0.242965; 0.901098;, - 0.242607; 0.783810;, - 0.422309; 0.696681;, - 0.421950; 0.813968;, - 0.410680; 0.828364;, - 0.411159; 0.671980;, - 0.489613; 0.713630;, - 0.422309; 0.696681;, - 0.411159; 0.671980;, - 0.500897; 0.694580;, - 0.489168; 0.858844;, - 0.489613; 0.713630;, - 0.500897; 0.694580;, - 0.500304; 0.888198;, - 0.421950; 0.813968;, - 0.489168; 0.858844;, - 0.500304; 0.888198;, - 0.410680; 0.828364;, - 0.422309; 0.696681;, - 0.489613; 0.713630;, - 0.489168; 0.858844;, - 0.421950; 0.813968;; - } //End of Cube_001 UV Coordinates - } // End of _0002 mesh - } // End of _0002 -} // End of Root diff --git a/mods/vehicle_mash/models/car_f1.x b/mods/vehicle_mash/models/car_f1.x deleted file mode 100755 index e2cc87b0..00000000 --- a/mods/vehicle_mash/models/car_f1.x +++ /dev/null @@ -1,4657 +0,0 @@ -xof 0303txt 0032 - -Frame Root { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Frame _0002 { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - 0.000000,-0.000000, 1.000000, 0.000000, - 0.000000,-1.000000,-0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 1.000000;; - } - Mesh { // _0002 mesh - 1306; - 3.125003;-2.538288;-7.940267;, - -3.124995;-2.538288;-7.940269;, - -3.124992;-2.538290;-15.440267;, - 3.125002;-2.538290;-15.440267;, - 3.125003; 0.586711;-7.940267;, - 3.125005; 0.586710;-15.440265;, - -3.124992; 0.586711;-15.440267;, - -3.124991; 0.586712;-7.940267;, - 3.125005; 0.586710;-15.440265;, - 3.125002;-2.538290;-15.440267;, - -3.124992;-2.538290;-15.440267;, - -3.124992; 0.586711;-15.440267;, - 3.125003; 0.586711;-7.940267;, - 3.125003;-2.538288;-7.940267;, - 3.125002;-2.538290;-15.440267;, - 3.125005; 0.586710;-15.440265;, - -3.124991; 0.586712;-7.940267;, - -3.124995;-2.538288;-7.940269;, - 3.125003;-2.538288;-7.940267;, - 3.125003; 0.586711;-7.940267;, - -3.124995;-2.538288;-7.940269;, - -3.124991; 0.586712;-7.940267;, - -3.124992; 0.586711;-15.440267;, - -3.124992;-2.538290;-15.440267;, - 3.750003;-2.538285;15.809729;, - -3.749994;-2.538284;15.809730;, - -6.249992;-2.538285; 8.309731;, - 6.250003;-2.538286; 8.309731;, - 3.750001; 0.586715;15.809732;, - 6.250006; 0.586714; 8.309733;, - -6.249990; 0.586716; 8.309731;, - -3.749991; 0.586716;15.809729;, - 6.250006; 0.586714; 8.309733;, - 6.250003;-2.538286; 8.309731;, - -6.249992;-2.538285; 8.309731;, - -6.249990; 0.586716; 8.309731;, - 3.750001; 0.586715;15.809732;, - 3.750003;-2.538285;15.809729;, - 6.250003;-2.538286; 8.309731;, - 6.250006; 0.586714; 8.309733;, - -3.749991; 0.586716;15.809729;, - -3.749994;-2.538284;15.809730;, - 3.750003;-2.538285;15.809729;, - 3.750001; 0.586715;15.809732;, - -3.749994;-2.538284;15.809730;, - -3.749991; 0.586716;15.809729;, - -6.249990; 0.586716; 8.309731;, - -6.249992;-2.538285; 8.309731;, - 0.625006;-1.288285;13.934731;, - 6.875006;-1.288285;13.934731;, - 7.500006;-1.288285;14.559731;, - 0.000006;-1.288284;14.559731;, - 0.625006;-1.288285;10.184731;, - 0.625006;-1.288285;13.934731;, - 0.000006;-1.288284;14.559731;, - 0.000006;-1.288285; 9.559731;, - 6.875006;-1.288286;10.184731;, - 0.625006;-1.288285;10.184731;, - 0.000006;-1.288285; 9.559731;, - 7.500006;-1.288286; 9.559731;, - 6.875006;-1.288285;13.934731;, - 6.875006;-1.288286;10.184731;, - 7.500006;-1.288286; 9.559731;, - 7.500006;-1.288285;14.559731;, - 6.875006;-0.038286;13.934731;, - 6.875006;-0.038286;10.184731;, - 6.875006;-1.288286;10.184731;, - 6.875006;-1.288285;13.934731;, - 6.875006;-0.038286;10.184731;, - 0.625006;-0.038285;10.184731;, - 0.625006;-1.288285;10.184731;, - 6.875006;-1.288286;10.184731;, - 0.625006;-0.038285;10.184731;, - 0.625006;-0.038285;13.934731;, - 0.625006;-1.288285;13.934731;, - 0.625006;-1.288285;10.184731;, - 0.625006;-0.038285;13.934731;, - 6.875006;-0.038286;13.934731;, - 6.875006;-1.288285;13.934731;, - 0.625006;-1.288285;13.934731;, - 7.500006;-0.038286;14.559731;, - 0.000006;-0.038284;14.559731;, - 0.000006;-1.288284;14.559731;, - 7.500006;-1.288285;14.559731;, - 0.000006;-0.038285; 9.559731;, - 7.500006;-0.038286; 9.559731;, - 7.500006;-1.288286; 9.559731;, - 0.000006;-1.288285; 9.559731;, - 7.500006;-0.038286; 9.559731;, - 7.500006;-0.038286;14.559731;, - 7.500006;-1.288285;14.559731;, - 7.500006;-1.288286; 9.559731;, - 6.875006;-0.038286;13.934731;, - 7.500006;-0.038286;14.559731;, - 7.500006;-0.038286; 9.559731;, - 6.875006;-0.038286;10.184731;, - 6.875006;-0.038286;10.184731;, - 7.500006;-0.038286; 9.559731;, - 0.000006;-0.038285; 9.559731;, - 0.625006;-0.038285;10.184731;, - 0.625006;-0.038285;10.184731;, - 0.000006;-0.038285; 9.559731;, - 0.000006;-0.038284;14.559731;, - 0.625006;-0.038285;13.934731;, - 0.625006;-0.038285;13.934731;, - 0.000006;-0.038284;14.559731;, - 7.500006;-0.038286;14.559731;, - 6.875006;-0.038286;13.934731;, - 8.750006;-0.663291;11.747231;, - -8.749994;-0.663279;11.747231;, - -8.749994;-0.350779;12.059731;, - 8.750006;-0.350791;12.059731;, - 8.750006;-0.975791;12.059731;, - -8.749994;-0.975779;12.059731;, - -8.749994;-0.663279;11.747231;, - 8.750006;-0.663291;11.747231;, - 8.750006;-0.663291;12.372231;, - -8.749994;-0.663279;12.372231;, - -8.749994;-0.975779;12.059731;, - 8.750006;-0.975791;12.059731;, - -8.749994;-0.663279;12.372231;, - 8.750006;-0.663291;12.372231;, - 8.750006;-0.350791;12.059731;, - -8.749994;-0.350779;12.059731;, - 8.750006;-0.975791;12.059731;, - 8.750006;-0.663291;11.747231;, - 8.750006;-0.350791;12.059731;, - 8.750006;-0.663291;12.372231;, - -8.749994;-0.975779;12.059731;, - -8.749994;-0.663279;12.372231;, - -8.749994;-0.350779;12.059731;, - -8.749994;-0.663279;11.747231;, - 6.250004;-0.663295;-12.002768;, - -6.249996;-0.663284;-12.002767;, - -6.249996;-0.350784;-11.690267;, - 6.250004;-0.350795;-11.690268;, - 6.250004;-0.975795;-11.690268;, - -6.249996;-0.975784;-11.690267;, - -6.249996;-0.663284;-12.002767;, - 6.250004;-0.663295;-12.002768;, - 6.250004;-0.663295;-11.377768;, - -6.249996;-0.663284;-11.377767;, - -6.249996;-0.975784;-11.690267;, - 6.250004;-0.975795;-11.690268;, - -6.249996;-0.663284;-11.377767;, - 6.250004;-0.663295;-11.377768;, - 6.250004;-0.350795;-11.690268;, - -6.249996;-0.350784;-11.690267;, - 6.250004;-0.975795;-11.690268;, - 6.250004;-0.663295;-12.002768;, - 6.250004;-0.350795;-11.690268;, - 6.250004;-0.663295;-11.377768;, - -6.249996;-0.975784;-11.690267;, - -6.249996;-0.663284;-11.377767;, - -6.249996;-0.350784;-11.690267;, - -6.249996;-0.663284;-12.002767;, - -6.874995;-1.288283;13.934731;, - -0.624994;-1.288284;13.934731;, - 0.000006;-1.288284;14.559731;, - -7.499995;-1.288283;14.559731;, - -6.874995;-1.288284;10.184731;, - -6.874995;-1.288283;13.934731;, - -7.499995;-1.288283;14.559731;, - -7.499995;-1.288284; 9.559731;, - -0.624994;-1.288285;10.184731;, - -6.874995;-1.288284;10.184731;, - -7.499995;-1.288284; 9.559731;, - 0.000006;-1.288285; 9.559731;, - -0.624994;-1.288284;13.934731;, - -0.624994;-1.288285;10.184731;, - 0.000006;-1.288285; 9.559731;, - 0.000006;-1.288284;14.559731;, - -0.624994;-0.038284;13.934731;, - -0.624994;-0.038285;10.184731;, - -0.624994;-1.288285;10.184731;, - -0.624994;-1.288284;13.934731;, - -0.624994;-0.038285;10.184731;, - -6.874995;-0.038284;10.184731;, - -6.874995;-1.288284;10.184731;, - -0.624994;-1.288285;10.184731;, - -6.874995;-0.038284;10.184731;, - -6.874995;-0.038283;13.934731;, - -6.874995;-1.288283;13.934731;, - -6.874995;-1.288284;10.184731;, - -6.874995;-0.038283;13.934731;, - -0.624994;-0.038284;13.934731;, - -0.624994;-1.288284;13.934731;, - -6.874995;-1.288283;13.934731;, - 0.000006;-0.038284;14.559731;, - -7.499995;-0.038284;14.559731;, - -7.499995;-1.288283;14.559731;, - 0.000006;-1.288284;14.559731;, - -7.499995;-0.038284;14.559731;, - -7.499995;-0.038285; 9.559731;, - -7.499995;-1.288284; 9.559731;, - -7.499995;-1.288283;14.559731;, - -7.499995;-0.038285; 9.559731;, - 0.000006;-0.038285; 9.559731;, - 0.000006;-1.288285; 9.559731;, - -7.499995;-1.288284; 9.559731;, - -0.624994;-0.038284;13.934731;, - 0.000006;-0.038284;14.559731;, - 0.000006;-0.038285; 9.559731;, - -0.624994;-0.038285;10.184731;, - -0.624994;-0.038285;10.184731;, - 0.000006;-0.038285; 9.559731;, - -7.499995;-0.038285; 9.559731;, - -6.874995;-0.038284;10.184731;, - -6.874995;-0.038284;10.184731;, - -7.499995;-0.038285; 9.559731;, - -7.499995;-0.038284;14.559731;, - -6.874995;-0.038283;13.934731;, - -6.874995;-0.038283;13.934731;, - -7.499995;-0.038284;14.559731;, - 0.000006;-0.038284;14.559731;, - -0.624994;-0.038284;13.934731;, - 4.375004;-0.038289;-10.752768;, - 0.625005;-0.038288;-8.877767;, - 0.000005;-0.038288;-7.940267;, - 5.000004;-0.038289;-10.440268;, - 4.375004;-0.038290;-12.627768;, - 4.375004;-0.038289;-10.752768;, - 5.000004;-0.038289;-10.440268;, - 5.000004;-0.038290;-12.940268;, - 0.625005;-0.038289;-14.502767;, - 4.375004;-0.038290;-12.627768;, - 5.000004;-0.038290;-12.940268;, - 0.000005;-0.038289;-15.440267;, - 0.625005;-0.038288;-8.877767;, - 0.625005;-0.038289;-14.502767;, - 0.000005;-0.038289;-15.440267;, - 0.000005;-0.038288;-7.940267;, - 0.625005;-1.288288;-8.877767;, - 0.625005;-1.288289;-14.502767;, - 0.625005;-0.038289;-14.502767;, - 0.625005;-0.038288;-8.877767;, - 0.625005;-1.288289;-14.502767;, - 4.375004;-1.288289;-12.627768;, - 4.375004;-0.038290;-12.627768;, - 0.625005;-0.038289;-14.502767;, - 4.375004;-1.288289;-12.627768;, - 4.375004;-1.288289;-10.752768;, - 4.375004;-0.038289;-10.752768;, - 4.375004;-0.038290;-12.627768;, - 4.375004;-1.288289;-10.752768;, - 0.625005;-1.288288;-8.877767;, - 0.625005;-0.038288;-8.877767;, - 4.375004;-0.038289;-10.752768;, - 0.000005;-1.288288;-7.940267;, - 5.000004;-1.288289;-10.440268;, - 5.000004;-0.038289;-10.440268;, - 0.000005;-0.038288;-7.940267;, - 5.000004;-1.288289;-10.440268;, - 5.000004;-1.288290;-12.940268;, - 5.000004;-0.038290;-12.940268;, - 5.000004;-0.038289;-10.440268;, - 5.000004;-1.288290;-12.940268;, - 0.000005;-1.288289;-15.440267;, - 0.000005;-0.038289;-15.440267;, - 5.000004;-0.038290;-12.940268;, - 0.625005;-1.288288;-8.877767;, - 0.000005;-1.288288;-7.940267;, - 0.000005;-1.288289;-15.440267;, - 0.625005;-1.288289;-14.502767;, - 0.625005;-1.288289;-14.502767;, - 0.000005;-1.288289;-15.440267;, - 5.000004;-1.288290;-12.940268;, - 4.375004;-1.288289;-12.627768;, - 4.375004;-1.288289;-12.627768;, - 5.000004;-1.288290;-12.940268;, - 5.000004;-1.288289;-10.440268;, - 4.375004;-1.288289;-10.752768;, - 4.375004;-1.288289;-10.752768;, - 5.000004;-1.288289;-10.440268;, - 0.000005;-1.288288;-7.940267;, - 0.625005;-1.288288;-8.877767;, - -4.374996;-1.288288;-10.752767;, - -0.624995;-1.288288;-8.877767;, - 0.000005;-1.288288;-7.940267;, - -4.999996;-1.288288;-10.440267;, - -4.374996;-1.288288;-12.627768;, - -4.374996;-1.288288;-10.752767;, - -4.999996;-1.288288;-10.440267;, - -4.999996;-1.288288;-12.940267;, - -0.624995;-1.288289;-14.502767;, - -4.374996;-1.288288;-12.627768;, - -4.999996;-1.288288;-12.940267;, - 0.000005;-1.288289;-15.440267;, - -0.624995;-1.288288;-8.877767;, - -0.624995;-1.288289;-14.502767;, - 0.000005;-1.288289;-15.440267;, - 0.000005;-1.288288;-7.940267;, - -0.624995;-0.038288;-8.877767;, - -0.624995;-0.038289;-14.502767;, - -0.624995;-1.288289;-14.502767;, - -0.624995;-1.288288;-8.877767;, - -0.624995;-0.038289;-14.502767;, - -4.374996;-0.038288;-12.627768;, - -4.374996;-1.288288;-12.627768;, - -0.624995;-1.288289;-14.502767;, - -4.374996;-0.038288;-12.627768;, - -4.374996;-0.038288;-10.752767;, - -4.374996;-1.288288;-10.752767;, - -4.374996;-1.288288;-12.627768;, - -4.374996;-0.038288;-10.752767;, - -0.624995;-0.038288;-8.877767;, - -0.624995;-1.288288;-8.877767;, - -4.374996;-1.288288;-10.752767;, - 0.000005;-0.038288;-7.940267;, - -4.999996;-0.038288;-10.440267;, - -4.999996;-1.288288;-10.440267;, - 0.000005;-1.288288;-7.940267;, - -4.999996;-0.038288;-10.440267;, - -4.999996;-0.038288;-12.940267;, - -4.999996;-1.288288;-12.940267;, - -4.999996;-1.288288;-10.440267;, - -4.999996;-0.038288;-12.940267;, - 0.000005;-0.038289;-15.440267;, - 0.000005;-1.288289;-15.440267;, - -4.999996;-1.288288;-12.940267;, - -0.624995;-0.038288;-8.877767;, - 0.000005;-0.038288;-7.940267;, - 0.000005;-0.038289;-15.440267;, - -0.624995;-0.038289;-14.502767;, - -0.624995;-0.038289;-14.502767;, - 0.000005;-0.038289;-15.440267;, - -4.999996;-0.038288;-12.940267;, - -4.374996;-0.038288;-12.627768;, - -4.374996;-0.038288;-12.627768;, - -4.999996;-0.038288;-12.940267;, - -4.999996;-0.038288;-10.440267;, - -4.374996;-0.038288;-10.752767;, - -4.374996;-0.038288;-10.752767;, - -4.999996;-0.038288;-10.440267;, - 0.000005;-0.038288;-7.940267;, - -0.624995;-0.038288;-8.877767;, - -7.499997;-4.413283;12.059732;, - -7.499997;-3.910883;10.184732;, - -7.499995;-0.663287;12.059731;, - -7.499997;-3.910883;10.184732;, - -7.499995;-2.538287; 8.812136;, - -7.499995;-0.663287;12.059731;, - -7.499995;-2.538287; 8.812136;, - -7.499995;-0.663287; 8.309731;, - -7.499995;-0.663287;12.059731;, - -7.499995;-0.663287; 8.309731;, - -7.499995; 1.211713; 8.812136;, - -7.499995;-0.663287;12.059731;, - -7.499995; 1.211713; 8.812136;, - -7.499991; 2.584308;10.184731;, - -7.499995;-0.663287;12.059731;, - -7.499991; 2.584308;10.184731;, - -7.499991; 3.086713;12.059731;, - -7.499995;-0.663287;12.059731;, - -7.499991; 3.086713;12.059731;, - -7.499992; 2.584311;13.934731;, - -7.499995;-0.663287;12.059731;, - -7.499992; 2.584311;13.934731;, - -7.499994; 1.211717;15.307327;, - -7.499995;-0.663287;12.059731;, - -7.499994; 1.211717;15.307327;, - -7.499995;-0.663283;15.809732;, - -7.499995;-0.663287;12.059731;, - -7.499995;-0.663283;15.809732;, - -7.499995;-2.538283;15.307327;, - -7.499995;-0.663287;12.059731;, - -7.499995;-2.538283;15.307327;, - -7.499997;-3.910879;13.934734;, - -7.499995;-0.663287;12.059731;, - -7.499997;-4.413283;12.059732;, - -7.499995;-0.663287;12.059731;, - -7.499997;-3.910879;13.934734;, - -12.499996;-3.910878;10.184735;, - -7.499997;-3.910883;10.184732;, - -7.499997;-4.413283;12.059732;, - -12.499996;-4.413280;12.059735;, - -12.499995;-2.538286; 8.812140;, - -7.499995;-2.538287; 8.812136;, - -7.499997;-3.910883;10.184732;, - -12.499996;-3.910878;10.184735;, - -12.499994;-0.663286; 8.309731;, - -7.499995;-0.663287; 8.309731;, - -7.499995;-2.538287; 8.812136;, - -12.499995;-2.538286; 8.812140;, - -12.499993; 1.211717; 8.812135;, - -7.499995; 1.211713; 8.812136;, - -7.499995;-0.663287; 8.309731;, - -12.499994;-0.663286; 8.309731;, - -12.499991; 2.584311;10.184730;, - -7.499991; 2.584308;10.184731;, - -7.499995; 1.211713; 8.812136;, - -12.499993; 1.211717; 8.812135;, - -12.499990; 3.086719;12.059729;, - -7.499991; 3.086713;12.059731;, - -7.499991; 2.584308;10.184731;, - -12.499991; 2.584311;10.184730;, - -12.499991; 2.584314;13.934730;, - -7.499992; 2.584311;13.934731;, - -7.499991; 3.086713;12.059731;, - -12.499990; 3.086719;12.059729;, - -12.499993; 1.211722;15.307324;, - -7.499994; 1.211717;15.307327;, - -7.499992; 2.584311;13.934731;, - -12.499991; 2.584314;13.934730;, - -12.499993;-0.663276;15.809733;, - -7.499995;-0.663283;15.809732;, - -7.499994; 1.211717;15.307327;, - -12.499993; 1.211722;15.307324;, - -12.499994;-2.538279;15.307330;, - -7.499995;-2.538283;15.307327;, - -7.499995;-0.663283;15.809732;, - -12.499993;-0.663276;15.809733;, - -12.499995;-3.910875;13.934738;, - -7.499997;-3.910879;13.934734;, - -7.499995;-2.538283;15.307327;, - -12.499994;-2.538279;15.307330;, - -7.499997;-3.910879;13.934734;, - -12.499995;-3.910875;13.934738;, - -12.499996;-4.413280;12.059735;, - -7.499997;-4.413283;12.059732;, - -12.499995;-2.287078;12.997234;, - -12.499994;-2.538280;12.059731;, - -12.499996;-4.413280;12.059735;, - -12.499995;-3.910875;13.934738;, - -12.499995;-1.600778;13.683529;, - -12.499995;-2.287078;12.997234;, - -12.499995;-3.910875;13.934738;, - -12.499994;-2.538279;15.307330;, - -12.499993;-0.663278;13.934731;, - -12.499995;-1.600778;13.683529;, - -12.499994;-2.538279;15.307330;, - -12.499993;-0.663276;15.809733;, - -12.499993; 0.274219;13.683526;, - -12.499993;-0.663278;13.934731;, - -12.499993;-0.663276;15.809733;, - -12.499993; 1.211722;15.307324;, - -12.499993; 0.960516;12.997231;, - -12.499993; 0.274219;13.683526;, - -12.499993; 1.211722;15.307324;, - -12.499991; 2.584314;13.934730;, - -12.499993; 1.211719;12.059731;, - -12.499993; 0.960516;12.997231;, - -12.499991; 2.584314;13.934730;, - -12.499990; 3.086719;12.059729;, - -12.499993; 0.960514;11.122231;, - -12.499993; 1.211719;12.059731;, - -12.499990; 3.086719;12.059729;, - -12.499991; 2.584311;10.184730;, - -12.499993; 0.274217;10.435935;, - -12.499993; 0.960514;11.122231;, - -12.499991; 2.584311;10.184730;, - -12.499993; 1.211717; 8.812135;, - -12.499994;-0.663283;10.184731;, - -12.499993; 0.274217;10.435935;, - -12.499993; 1.211717; 8.812135;, - -12.499994;-0.663286; 8.309731;, - -12.499994;-1.600784;10.435937;, - -12.499994;-0.663283;10.184731;, - -12.499994;-0.663286; 8.309731;, - -12.499995;-2.538286; 8.812140;, - -12.499994;-2.287081;11.122231;, - -12.499994;-1.600784;10.435937;, - -12.499995;-2.538286; 8.812140;, - -12.499996;-3.910878;10.184735;, - -12.499994;-2.538280;12.059731;, - -12.499994;-2.287081;11.122231;, - -12.499996;-3.910878;10.184735;, - -12.499996;-4.413280;12.059735;, - -12.499994;-2.538280;12.059731;, - -9.999994;-0.663281;12.059731;, - -12.499994;-2.287081;11.122231;, - -12.499994;-2.287081;11.122231;, - -9.999994;-0.663281;12.059731;, - -12.499994;-1.600784;10.435937;, - -12.499994;-1.600784;10.435937;, - -9.999994;-0.663281;12.059731;, - -12.499994;-0.663283;10.184731;, - -12.499994;-0.663283;10.184731;, - -9.999994;-0.663281;12.059731;, - -12.499993; 0.274217;10.435935;, - -12.499993; 0.274217;10.435935;, - -9.999994;-0.663281;12.059731;, - -12.499993; 0.960514;11.122231;, - -12.499993; 0.960514;11.122231;, - -9.999994;-0.663281;12.059731;, - -12.499993; 1.211719;12.059731;, - -12.499993; 1.211719;12.059731;, - -9.999994;-0.663281;12.059731;, - -12.499993; 0.960516;12.997231;, - -12.499993; 0.960516;12.997231;, - -9.999994;-0.663281;12.059731;, - -12.499993; 0.274219;13.683526;, - -12.499993; 0.274219;13.683526;, - -9.999994;-0.663281;12.059731;, - -12.499993;-0.663278;13.934731;, - -12.499993;-0.663278;13.934731;, - -9.999994;-0.663281;12.059731;, - -12.499995;-1.600778;13.683529;, - -12.499995;-1.600778;13.683529;, - -9.999994;-0.663281;12.059731;, - -12.499995;-2.287078;12.997234;, - -12.499995;-2.287078;12.997234;, - -9.999994;-0.663281;12.059731;, - -12.499994;-2.538280;12.059731;, - -4.999998;-4.413287;-11.690266;, - -4.999998;-3.910887;-13.565266;, - -4.999996;-0.663291;-11.690267;, - -4.999998;-3.910887;-13.565266;, - -4.999996;-2.538291;-14.937862;, - -4.999996;-0.663291;-11.690267;, - -4.999996;-2.538291;-14.937862;, - -4.999996;-0.663291;-15.440268;, - -4.999996;-0.663291;-11.690267;, - -4.999996;-0.663291;-15.440268;, - -4.999996; 1.211709;-14.937862;, - -4.999996;-0.663291;-11.690267;, - -4.999996; 1.211709;-14.937862;, - -4.999992; 2.584304;-13.565267;, - -4.999996;-0.663291;-11.690267;, - -4.999992; 2.584304;-13.565267;, - -4.999992; 3.086709;-11.690268;, - -4.999996;-0.663291;-11.690267;, - -4.999992; 3.086709;-11.690268;, - -4.999992; 2.584306;-9.815267;, - -4.999996;-0.663291;-11.690267;, - -4.999992; 2.584306;-9.815267;, - -4.999995; 1.211712;-8.442673;, - -4.999996;-0.663291;-11.690267;, - -4.999995; 1.211712;-8.442673;, - -4.999995;-0.663287;-7.940267;, - -4.999996;-0.663291;-11.690267;, - -4.999995;-0.663287;-7.940267;, - -4.999996;-2.538288;-8.442673;, - -4.999996;-0.663291;-11.690267;, - -4.999996;-2.538288;-8.442673;, - -4.999998;-3.910883;-9.815264;, - -4.999996;-0.663291;-11.690267;, - -4.999998;-4.413287;-11.690266;, - -4.999996;-0.663291;-11.690267;, - -4.999998;-3.910883;-9.815264;, - -9.999998;-3.910883;-13.565264;, - -4.999998;-3.910887;-13.565266;, - -4.999998;-4.413287;-11.690266;, - -9.999998;-4.413285;-11.690264;, - -9.999996;-2.538290;-14.937860;, - -4.999996;-2.538291;-14.937862;, - -4.999998;-3.910887;-13.565266;, - -9.999998;-3.910883;-13.565264;, - -9.999996;-0.663291;-15.440267;, - -4.999996;-0.663291;-15.440268;, - -4.999996;-2.538291;-14.937862;, - -9.999996;-2.538290;-14.937860;, - -9.999994; 1.211712;-14.937861;, - -4.999996; 1.211709;-14.937862;, - -4.999996;-0.663291;-15.440268;, - -9.999996;-0.663291;-15.440267;, - -9.999993; 2.584306;-13.565269;, - -4.999992; 2.584304;-13.565267;, - -4.999996; 1.211709;-14.937862;, - -9.999994; 1.211712;-14.937861;, - -9.999991; 3.086715;-11.690270;, - -4.999992; 3.086709;-11.690268;, - -4.999992; 2.584304;-13.565267;, - -9.999993; 2.584306;-13.565269;, - -9.999993; 2.584309;-9.815269;, - -4.999992; 2.584306;-9.815267;, - -4.999992; 3.086709;-11.690268;, - -9.999991; 3.086715;-11.690270;, - -9.999994; 1.211717;-8.442676;, - -4.999995; 1.211712;-8.442673;, - -4.999992; 2.584306;-9.815267;, - -9.999993; 2.584309;-9.815269;, - -9.999995;-0.663279;-7.940267;, - -4.999995;-0.663287;-7.940267;, - -4.999995; 1.211712;-8.442673;, - -9.999994; 1.211717;-8.442676;, - -9.999995;-2.538283;-8.442671;, - -4.999996;-2.538288;-8.442673;, - -4.999995;-0.663287;-7.940267;, - -9.999995;-0.663279;-7.940267;, - -9.999997;-3.910880;-9.815261;, - -4.999998;-3.910883;-9.815264;, - -4.999996;-2.538288;-8.442673;, - -9.999995;-2.538283;-8.442671;, - -4.999998;-3.910883;-9.815264;, - -9.999997;-3.910880;-9.815261;, - -9.999998;-4.413285;-11.690264;, - -4.999998;-4.413287;-11.690266;, - -9.999994;-2.287082;-10.752765;, - -9.999994;-2.538285;-11.690265;, - -9.999998;-4.413285;-11.690264;, - -9.999997;-3.910880;-9.815261;, - -9.999997;-1.600783;-10.066467;, - -9.999994;-2.287082;-10.752765;, - -9.999997;-3.910880;-9.815261;, - -9.999995;-2.538283;-8.442671;, - -9.999996;-0.663283;-9.815267;, - -9.999997;-1.600783;-10.066467;, - -9.999995;-2.538283;-8.442671;, - -9.999995;-0.663279;-7.940267;, - -9.999995; 0.274215;-10.066469;, - -9.999996;-0.663283;-9.815267;, - -9.999995;-0.663279;-7.940267;, - -9.999994; 1.211717;-8.442676;, - -9.999993; 0.960512;-10.752769;, - -9.999995; 0.274215;-10.066469;, - -9.999994; 1.211717;-8.442676;, - -9.999993; 2.584309;-9.815269;, - -9.999993; 1.211715;-11.690269;, - -9.999993; 0.960512;-10.752769;, - -9.999993; 2.584309;-9.815269;, - -9.999991; 3.086715;-11.690270;, - -9.999994; 0.960510;-12.627767;, - -9.999993; 1.211715;-11.690269;, - -9.999991; 3.086715;-11.690270;, - -9.999993; 2.584306;-13.565269;, - -9.999995; 0.274213;-13.314064;, - -9.999994; 0.960510;-12.627767;, - -9.999993; 2.584306;-13.565269;, - -9.999994; 1.211712;-14.937861;, - -9.999996;-0.663287;-13.565267;, - -9.999995; 0.274213;-13.314064;, - -9.999994; 1.211712;-14.937861;, - -9.999996;-0.663291;-15.440267;, - -9.999995;-1.600787;-13.314064;, - -9.999996;-0.663287;-13.565267;, - -9.999996;-0.663291;-15.440267;, - -9.999996;-2.538290;-14.937860;, - -9.999994;-2.287086;-12.627765;, - -9.999995;-1.600787;-13.314064;, - -9.999996;-2.538290;-14.937860;, - -9.999998;-3.910883;-13.565264;, - -9.999994;-2.538285;-11.690265;, - -9.999994;-2.287086;-12.627765;, - -9.999998;-3.910883;-13.565264;, - -9.999998;-4.413285;-11.690264;, - -9.999994;-2.538285;-11.690265;, - -7.499996;-0.663285;-11.690267;, - -9.999994;-2.287086;-12.627765;, - -9.999994;-2.287086;-12.627765;, - -7.499996;-0.663285;-11.690267;, - -9.999995;-1.600787;-13.314064;, - -9.999995;-1.600787;-13.314064;, - -7.499996;-0.663285;-11.690267;, - -9.999996;-0.663287;-13.565267;, - -9.999996;-0.663287;-13.565267;, - -7.499996;-0.663285;-11.690267;, - -9.999995; 0.274213;-13.314064;, - -9.999995; 0.274213;-13.314064;, - -7.499996;-0.663285;-11.690267;, - -9.999994; 0.960510;-12.627767;, - -9.999994; 0.960510;-12.627767;, - -7.499996;-0.663285;-11.690267;, - -9.999993; 1.211715;-11.690269;, - -9.999993; 1.211715;-11.690269;, - -7.499996;-0.663285;-11.690267;, - -9.999993; 0.960512;-10.752769;, - -9.999993; 0.960512;-10.752769;, - -7.499996;-0.663285;-11.690267;, - -9.999995; 0.274215;-10.066469;, - -9.999995; 0.274215;-10.066469;, - -7.499996;-0.663285;-11.690267;, - -9.999996;-0.663283;-9.815267;, - -9.999996;-0.663283;-9.815267;, - -7.499996;-0.663285;-11.690267;, - -9.999997;-1.600783;-10.066467;, - -9.999997;-1.600783;-10.066467;, - -7.499996;-0.663285;-11.690267;, - -9.999994;-2.287082;-10.752765;, - -9.999994;-2.287082;-10.752765;, - -7.499996;-0.663285;-11.690267;, - -9.999994;-2.538285;-11.690265;, - -3.749998;-1.288289;-19.190268;, - -9.999994;-1.288288;-19.190268;, - -9.999987;-1.288289;-21.690268;, - 0.000008;-1.288290;-21.690266;, - 3.750002;-1.288290;-19.190268;, - -3.749998;-1.288289;-19.190268;, - 0.000008;-1.288290;-21.690266;, - 9.999997;-1.288291;-19.190269;, - 3.750002;-1.288290;-19.190268;, - 0.000008;-1.288290;-21.690266;, - 10.000003;-1.288292;-21.690266;, - -9.999990;-0.038288;-19.190268;, - -3.750000;-0.038289;-19.190268;, - 0.000008;-1.288290;-21.690266;, - -9.999987;-1.288289;-21.690268;, - 3.749999;-0.038290;-19.190268;, - 0.000008;-1.288290;-21.690266;, - -3.750000;-0.038289;-19.190268;, - 10.000003;-1.288292;-21.690266;, - 0.000008;-1.288290;-21.690266;, - 3.749999;-0.038290;-19.190268;, - 9.999997;-0.038291;-19.190269;, - -3.749998;-1.288289;-19.190268;, - 3.750002;-1.288290;-19.190268;, - 3.749999;-0.038290;-19.190268;, - -3.750000;-0.038289;-19.190268;, - -3.750000;-0.038289;-19.190268;, - -4.999996;-0.038289;-16.690266;, - -3.749998;-1.288289;-19.190268;, - -9.999992;-0.038288;-16.690266;, - -4.999996;-0.038289;-16.690266;, - -3.750000;-0.038289;-19.190268;, - -9.999990;-0.038288;-19.190268;, - -4.999996;-0.038289;-16.690266;, - -9.999992;-0.038288;-16.690266;, - -9.999994;-1.288288;-19.190268;, - -3.749998;-1.288289;-19.190268;, - 3.750002;-1.288290;-19.190268;, - 5.000004;-0.038290;-16.690266;, - 3.749999;-0.038290;-19.190268;, - 5.000004;-0.038290;-16.690266;, - 9.999997;-0.038290;-16.690266;, - 9.999997;-0.038291;-19.190269;, - 3.749999;-0.038290;-19.190268;, - 9.999997;-0.038290;-16.690266;, - 5.000004;-0.038290;-16.690266;, - 3.750002;-1.288290;-19.190268;, - 9.999997;-1.288291;-19.190269;, - -9.999992;-0.038288;-16.690266;, - -9.999990;-0.038288;-19.190268;, - -9.999987;-1.288289;-21.690268;, - -9.999994;-1.288288;-19.190268;, - 9.999997;-0.038290;-16.690266;, - 9.999997;-1.288291;-19.190269;, - 10.000003;-1.288292;-21.690266;, - 9.999997;-0.038291;-19.190269;, - 2.500005;-1.913288;-2.940270;, - -2.499995;-1.913287;-2.940275;, - -2.499996;-1.913290;-21.690264;, - 2.500004;-1.913291;-21.690264;, - 2.500008; 0.586709;-22.940256;, - 2.500004;-1.913291;-21.690264;, - -2.499996;-1.913290;-21.690264;, - -2.499992; 0.586710;-22.940268;, - 2.500006; 3.086712;-2.940269;, - 2.500005;-1.913288;-2.940270;, - 2.500004;-1.913291;-21.690264;, - 2.500008; 0.586709;-22.940256;, - -2.499995;-1.913287;-2.940275;, - -2.499994; 3.086712;-2.940274;, - -2.499992; 0.586710;-22.940268;, - -2.499996;-1.913290;-21.690264;, - -1.249994; 0.586706;17.059725;, - -2.500001;-1.913294;17.059719;, - 2.499998;-1.913294;17.059725;, - 1.250006; 0.586706;17.059729;, - -2.500001;-1.913294;17.059719;, - -7.499997;-1.913288; 2.059726;, - 7.500005;-1.913289; 2.059732;, - 2.499998;-1.913294;17.059725;, - 7.500005;-1.913289; 2.059732;, - 6.250004;-1.913288;-2.940271;, - 6.250005; 3.086712;-2.940269;, - 7.500006; 3.086712; 2.059733;, - -7.499992; 3.086713; 2.059731;, - -6.249993; 3.086712;-2.940274;, - -6.249998;-1.913287;-2.940275;, - -7.499997;-1.913288; 2.059726;, - -1.249994; 0.586706;17.059725;, - -3.749993; 4.336714; 2.059728;, - -7.499992; 3.086713; 2.059731;, - 7.500006; 3.086712; 2.059733;, - 3.750006; 4.336713; 2.059731;, - 1.250006; 0.586706;17.059729;, - 1.250006; 0.586706;17.059729;, - 3.750006; 4.336713; 2.059731;, - 2.500007; 6.836713; 7.059731;, - 2.500007; 6.836713; 7.059731;, - 3.750006; 4.336713; 2.059731;, - 1.250006; 6.836713; 2.059731;, - -3.749993; 4.336714; 2.059728;, - -1.249994; 0.586706;17.059725;, - -2.499992; 6.836714; 7.059731;, - -1.249994; 6.836713; 2.059727;, - -3.749993; 4.336714; 2.059728;, - -2.499992; 6.836714; 7.059731;, - 2.500007; 6.836713; 7.059731;, - 1.250006; 6.836713; 2.059731;, - -1.249994; 6.836713; 2.059727;, - -2.499992; 6.836714; 7.059731;, - 2.500007; 6.836713; 7.059731;, - -2.499992; 6.836714; 7.059731;, - -1.249994; 0.586706;17.059725;, - 1.250006; 0.586706;17.059729;, - 7.500006; 3.086712; 2.059733;, - 6.250005; 3.086712;-2.940269;, - 2.500006; 3.086712;-2.940269;, - 3.750006; 4.336713; 2.059731;, - -7.499992; 3.086713; 2.059731;, - -3.749993; 4.336714; 2.059728;, - -2.499994; 3.086712;-2.940274;, - -6.249993; 3.086712;-2.940274;, - -1.249994; 6.836713; 2.059727;, - 1.250006; 6.836713; 2.059731;, - 1.250006; 4.336713; 2.059731;, - -1.249994; 4.336713; 2.059731;, - 1.250006; 4.336713; 2.059731;, - 1.250006; 6.836713; 2.059731;, - 3.750006; 4.336713; 2.059731;, - -3.749993; 4.336714; 2.059728;, - -1.249994; 6.836713; 2.059727;, - -1.249994; 4.336713; 2.059731;, - 2.500008; 0.586709;-22.940256;, - -2.499992; 0.586710;-22.940268;, - -1.249994; 4.336712;-2.940274;, - 1.250006; 4.336712;-2.940271;, - -1.249994; 4.336712;-2.940274;, - -2.499992; 0.586710;-22.940268;, - -2.499994; 3.086712;-2.940274;, - 2.500006; 3.086712;-2.940269;, - 2.500008; 0.586709;-22.940256;, - 1.250006; 4.336712;-2.940271;, - 1.250006; 4.336713; 2.059731;, - 3.750006; 4.336713; 2.059731;, - 2.500006; 3.086712;-2.940269;, - 1.250006; 4.336712;-2.940271;, - -3.749993; 4.336714; 2.059728;, - -1.249994; 4.336713; 2.059731;, - -1.249994; 4.336712;-2.940274;, - -2.499994; 3.086712;-2.940274;, - -1.249995;-0.663286; 2.059732;, - -1.249995;-0.663288;-7.940267;, - -1.249994; 4.336712;-2.940274;, - -1.249994; 4.336713; 2.059731;, - 1.250005;-0.663288;-7.940267;, - 1.250005;-0.663287; 2.059732;, - 1.250006; 4.336713; 2.059731;, - 1.250006; 4.336712;-2.940271;, - -1.249995;-0.663288;-7.940267;, - 1.250005;-0.663288;-7.940267;, - 1.250006; 4.336712;-2.940271;, - -1.249994; 4.336712;-2.940274;, - 1.250005;-0.663287; 2.059732;, - -1.249995;-0.663286; 2.059732;, - -1.249994; 4.336713; 2.059731;, - 1.250006; 4.336713; 2.059731;, - -1.249995;-0.663286; 2.059732;, - 1.250005;-0.663287; 2.059732;, - 1.250005;-0.663288;-7.940267;, - -1.249995;-0.663288;-7.940267;, - -5.312495; 1.836711; 2.059725;, - -5.312495;-0.663288; 2.059724;, - -6.249998;-1.913287;-2.940275;, - -6.249993; 3.086712;-2.940274;, - -5.312495;-0.663288; 2.059724;, - -3.437495;-0.663289; 2.059724;, - -2.499995;-1.913287;-2.940275;, - -6.249998;-1.913287;-2.940275;, - -3.437493; 1.836711; 2.059726;, - -5.312495; 1.836711; 2.059725;, - -6.249993; 3.086712;-2.940274;, - -2.499994; 3.086712;-2.940274;, - -3.437495;-0.663289; 2.059724;, - -3.437493; 1.836711; 2.059726;, - -2.499994; 3.086712;-2.940274;, - -2.499995;-1.913287;-2.940275;, - -5.312495;-0.663288; 2.059724;, - -5.312495; 1.836711; 2.059725;, - -3.437493; 1.836711; 2.059726;, - -3.437495;-0.663289; 2.059724;, - 3.437505;-0.663290; 2.059728;, - 5.312505;-0.663290; 2.059728;, - 6.250004;-1.913288;-2.940271;, - 2.500005;-1.913288;-2.940270;, - 5.312505;-0.663290; 2.059728;, - 5.312505; 1.836710; 2.059728;, - 6.250005; 3.086712;-2.940269;, - 6.250004;-1.913288;-2.940271;, - 5.312505; 1.836710; 2.059728;, - 3.437506; 1.836710; 2.059728;, - 2.500006; 3.086712;-2.940269;, - 6.250005; 3.086712;-2.940269;, - 3.437506; 1.836710; 2.059728;, - 3.437505;-0.663290; 2.059728;, - 2.500005;-1.913288;-2.940270;, - 2.500006; 3.086712;-2.940269;, - 5.312505; 1.836710; 2.059728;, - 5.312505;-0.663290; 2.059728;, - 3.437505;-0.663290; 2.059728;, - 3.437506; 1.836710; 2.059728;, - -7.499992; 3.086713; 2.059731;, - -7.499997;-1.913288; 2.059726;, - -2.500001;-1.913294;17.059719;, - -1.249994; 0.586706;17.059725;, - 7.500006; 3.086712; 2.059733;, - 1.250006; 0.586706;17.059729;, - 2.499998;-1.913294;17.059725;, - 7.500005;-1.913289; 2.059732;, - -7.499997;-1.913288; 2.059726;, - -6.249998;-1.913287;-2.940275;, - -2.499995;-1.913287;-2.940275;, - 6.250004;-1.913288;-2.940271;, - 7.500005;-1.913289; 2.059732;, - 2.500005;-1.913288;-2.940270;, - -7.499997;-1.913288; 2.059726;, - -2.499995;-1.913287;-2.940275;, - 2.500005;-1.913288;-2.940270;, - 7.500005;-1.913289; 2.059732;, - 7.500002; 7.461715;17.059727;, - 7.500002; 6.211715;13.309731;, - 7.500002; 6.211714; 9.559732;, - 7.500004; 7.461714;13.309732;, - 3.750007; 6.211714; 9.559732;, - 7.500002; 6.211714; 9.559732;, - 7.500002; 6.211715;13.309731;, - 4.375006; 6.211715;13.309731;, - 4.375006; 6.211715;13.309731;, - 7.500002; 6.211715;13.309731;, - 7.500002; 7.461715;17.059727;, - 3.750008; 7.461715;17.059727;, - 7.500002; 6.211714; 9.559732;, - 3.750007; 6.211714; 9.559732;, - 0.000007; 7.461715;13.309732;, - 7.500004; 7.461714;13.309732;, - 7.500004; 7.461714;13.309732;, - 0.000007; 7.461715;13.309732;, - 3.750008; 7.461715;17.059727;, - 7.500002; 7.461715;17.059727;, - 3.750008; 7.461715;17.059727;, - 3.750004; 0.586714; 7.059732;, - 3.750007; 6.211714; 9.559732;, - 4.375006; 6.211715;13.309731;, - 3.750008; 7.461715;17.059727;, - 3.125008; 6.211715;13.309731;, - 3.750007; 6.211714; 9.559732;, - 3.750004; 0.586714; 7.059732;, - -3.749992; 7.461716;17.059727;, - -4.374994; 6.211716;13.309731;, - -3.749992; 6.211715; 9.559732;, - -3.749996; 0.586715; 7.059732;, - -3.749992; 7.461716;17.059727;, - -3.749996; 0.586715; 7.059732;, - -3.749992; 6.211715; 9.559732;, - -3.124992; 6.211716;13.309731;, - -3.124992; 6.211716;13.309731;, - 3.125008; 6.211715;13.309731;, - 3.750008; 7.461715;17.059727;, - -3.749992; 7.461716;17.059727;, - 0.000007; 7.461715;13.309732;, - -3.749992; 7.461716;17.059727;, - 3.750008; 7.461715;17.059727;, - -3.124992; 6.211716;13.309731;, - -3.749992; 6.211715; 9.559732;, - 3.750007; 6.211714; 9.559732;, - 3.125008; 6.211715;13.309731;, - -3.749992; 6.211715; 9.559732;, - 0.000007; 7.461715;13.309732;, - 3.750007; 6.211714; 9.559732;, - 0.000007; 7.461715;13.309732;, - -3.749992; 6.211715; 9.559732;, - -7.499989; 6.211716; 9.559732;, - -7.499993; 7.461717;13.309732;, - -7.499993; 7.461717;13.309732;, - -7.499993; 7.461717;17.059727;, - -3.749992; 7.461716;17.059727;, - 0.000007; 7.461715;13.309732;, - -3.749992; 6.211715; 9.559732;, - -4.374994; 6.211716;13.309731;, - -7.499994; 6.211717;13.309731;, - -7.499989; 6.211716; 9.559732;, - -7.499993; 7.461717;17.059727;, - -7.499994; 6.211717;13.309731;, - -4.374994; 6.211716;13.309731;, - -3.749992; 7.461716;17.059727;, - -7.499993; 7.461717;17.059727;, - -7.499993; 7.461717;13.309732;, - -7.499989; 6.211716; 9.559732;, - -7.499994; 6.211717;13.309731;, - 7.500010; 3.086716;12.059731;, - 7.500010; 2.584311;10.184731;, - 7.500006;-0.663284;12.059731;, - 7.500010; 2.584311;10.184731;, - 7.500006; 1.211715; 8.812137;, - 7.500006;-0.663284;12.059731;, - 7.500006; 1.211715; 8.812137;, - 7.500006;-0.663285; 8.309731;, - 7.500006;-0.663284;12.059731;, - 7.500006;-0.663285; 8.309731;, - 7.500004;-2.538286; 8.812137;, - 7.500006;-0.663284;12.059731;, - 7.500004;-2.538286; 8.812137;, - 7.500002;-3.910879;10.184732;, - 7.500006;-0.663284;12.059731;, - 7.500002;-3.910879;10.184732;, - 7.500002;-4.413283;12.059732;, - 7.500006;-0.663284;12.059731;, - 7.500002;-4.413283;12.059732;, - 7.500002;-3.910880;13.934732;, - 7.500006;-0.663284;12.059731;, - 7.500002;-3.910880;13.934732;, - 7.500005;-2.538285;15.307327;, - 7.500006;-0.663284;12.059731;, - 7.500005;-2.538285;15.307327;, - 7.500005;-0.663285;15.809732;, - 7.500006;-0.663284;12.059731;, - 7.500005;-0.663285;15.809732;, - 7.500007; 1.211714;15.307327;, - 7.500006;-0.663284;12.059731;, - 7.500007; 1.211714;15.307327;, - 7.500008; 2.584309;13.934733;, - 7.500006;-0.663284;12.059731;, - 7.500010; 3.086716;12.059731;, - 7.500006;-0.663284;12.059731;, - 7.500008; 2.584309;13.934733;, - 12.500008; 2.584306;10.184732;, - 7.500010; 2.584311;10.184731;, - 7.500010; 3.086716;12.059731;, - 12.500008; 3.086711;12.059731;, - 12.500006; 1.211715; 8.812138;, - 7.500006; 1.211715; 8.812137;, - 7.500010; 2.584311;10.184731;, - 12.500008; 2.584306;10.184732;, - 12.500006;-0.663285; 8.309731;, - 7.500006;-0.663285; 8.309731;, - 7.500006; 1.211715; 8.812137;, - 12.500006; 1.211715; 8.812138;, - 12.500007;-2.538287; 8.812133;, - 7.500004;-2.538286; 8.812137;, - 7.500006;-0.663285; 8.309731;, - 12.500006;-0.663285; 8.309731;, - 12.500005;-3.910882;10.184729;, - 7.500002;-3.910879;10.184732;, - 7.500004;-2.538286; 8.812137;, - 12.500007;-2.538287; 8.812133;, - 12.500005;-4.413285;12.059729;, - 7.500002;-4.413283;12.059732;, - 7.500002;-3.910879;10.184732;, - 12.500005;-3.910882;10.184729;, - 12.500003;-3.910883;13.934729;, - 7.500002;-3.910880;13.934732;, - 7.500002;-4.413283;12.059732;, - 12.500005;-4.413285;12.059729;, - 12.500007;-2.538291;15.307323;, - 7.500005;-2.538285;15.307327;, - 7.500002;-3.910880;13.934732;, - 12.500003;-3.910883;13.934729;, - 12.500007;-0.663293;15.809731;, - 7.500005;-0.663285;15.809732;, - 7.500005;-2.538285;15.307327;, - 12.500007;-2.538291;15.307323;, - 12.500007; 1.211710;15.307328;, - 7.500007; 1.211714;15.307327;, - 7.500005;-0.663285;15.809732;, - 12.500007;-0.663293;15.809731;, - 12.500009; 2.584306;13.934735;, - 7.500008; 2.584309;13.934733;, - 7.500007; 1.211714;15.307327;, - 12.500007; 1.211710;15.307328;, - 7.500008; 2.584309;13.934733;, - 12.500009; 2.584306;13.934735;, - 12.500008; 3.086711;12.059731;, - 7.500010; 3.086716;12.059731;, - 12.500008; 0.960508;12.997232;, - 12.500006; 1.211711;12.059731;, - 12.500008; 3.086711;12.059731;, - 12.500009; 2.584306;13.934735;, - 12.500008; 0.274208;13.683527;, - 12.500008; 0.960508;12.997232;, - 12.500009; 2.584306;13.934735;, - 12.500007; 1.211710;15.307328;, - 12.500006;-0.663291;13.934731;, - 12.500008; 0.274208;13.683527;, - 12.500007; 1.211710;15.307328;, - 12.500007;-0.663293;15.809731;, - 12.500006;-1.600788;13.683525;, - 12.500006;-0.663291;13.934731;, - 12.500007;-0.663293;15.809731;, - 12.500007;-2.538291;15.307323;, - 12.500006;-2.287086;12.997231;, - 12.500006;-1.600788;13.683525;, - 12.500007;-2.538291;15.307323;, - 12.500003;-3.910883;13.934729;, - 12.500006;-2.538289;12.059731;, - 12.500006;-2.287086;12.997231;, - 12.500003;-3.910883;13.934729;, - 12.500005;-4.413285;12.059729;, - 12.500006;-2.287085;11.122231;, - 12.500006;-2.538289;12.059731;, - 12.500005;-4.413285;12.059729;, - 12.500005;-3.910882;10.184729;, - 12.500005;-1.600786;10.435933;, - 12.500006;-2.287085;11.122231;, - 12.500005;-3.910882;10.184729;, - 12.500007;-2.538287; 8.812133;, - 12.500006;-0.663286;10.184731;, - 12.500005;-1.600786;10.435933;, - 12.500007;-2.538287; 8.812133;, - 12.500006;-0.663285; 8.309731;, - 12.500007; 0.274214;10.435935;, - 12.500006;-0.663286;10.184731;, - 12.500006;-0.663285; 8.309731;, - 12.500006; 1.211715; 8.812138;, - 12.500006; 0.960511;11.122231;, - 12.500007; 0.274214;10.435935;, - 12.500006; 1.211715; 8.812138;, - 12.500008; 2.584306;10.184732;, - 12.500006; 1.211711;12.059731;, - 12.500006; 0.960511;11.122231;, - 12.500008; 2.584306;10.184732;, - 12.500008; 3.086711;12.059731;, - 12.500006; 1.211711;12.059731;, - 10.000006;-0.663288;12.059731;, - 12.500006; 0.960511;11.122231;, - 12.500006; 0.960511;11.122231;, - 10.000006;-0.663288;12.059731;, - 12.500007; 0.274214;10.435935;, - 12.500007; 0.274214;10.435935;, - 10.000006;-0.663288;12.059731;, - 12.500006;-0.663286;10.184731;, - 12.500006;-0.663286;10.184731;, - 10.000006;-0.663288;12.059731;, - 12.500005;-1.600786;10.435933;, - 12.500005;-1.600786;10.435933;, - 10.000006;-0.663288;12.059731;, - 12.500006;-2.287085;11.122231;, - 12.500006;-2.287085;11.122231;, - 10.000006;-0.663288;12.059731;, - 12.500006;-2.538289;12.059731;, - 12.500006;-2.538289;12.059731;, - 10.000006;-0.663288;12.059731;, - 12.500006;-2.287086;12.997231;, - 12.500006;-2.287086;12.997231;, - 10.000006;-0.663288;12.059731;, - 12.500006;-1.600788;13.683525;, - 12.500006;-1.600788;13.683525;, - 10.000006;-0.663288;12.059731;, - 12.500006;-0.663291;13.934731;, - 12.500006;-0.663291;13.934731;, - 10.000006;-0.663288;12.059731;, - 12.500008; 0.274208;13.683527;, - 12.500008; 0.274208;13.683527;, - 10.000006;-0.663288;12.059731;, - 12.500008; 0.960508;12.997232;, - 12.500008; 0.960508;12.997232;, - 10.000006;-0.663288;12.059731;, - 12.500006; 1.211711;12.059731;, - 5.000008; 3.086712;-11.690268;, - 5.000008; 2.584307;-13.565266;, - 5.000004;-0.663287;-11.690268;, - 5.000008; 2.584307;-13.565266;, - 5.000004; 1.211712;-14.937862;, - 5.000004;-0.663287;-11.690268;, - 5.000004; 1.211712;-14.937862;, - 5.000004;-0.663288;-15.440268;, - 5.000004;-0.663287;-11.690268;, - 5.000004;-0.663288;-15.440268;, - 5.000004;-2.538290;-14.937862;, - 5.000004;-0.663287;-11.690268;, - 5.000004;-2.538290;-14.937862;, - 5.000002;-3.910882;-13.565266;, - 5.000004;-0.663287;-11.690268;, - 5.000002;-3.910882;-13.565266;, - 5.000000;-4.413287;-11.690266;, - 5.000004;-0.663287;-11.690268;, - 5.000000;-4.413287;-11.690266;, - 5.000002;-3.910884;-9.815266;, - 5.000004;-0.663287;-11.690268;, - 5.000002;-3.910884;-9.815266;, - 5.000004;-2.538289;-8.442673;, - 5.000004;-0.663287;-11.690268;, - 5.000004;-2.538289;-8.442673;, - 5.000004;-0.663289;-7.940267;, - 5.000004;-0.663287;-11.690268;, - 5.000004;-0.663289;-7.940267;, - 5.000005; 1.211711;-8.442673;, - 5.000004;-0.663287;-11.690268;, - 5.000005; 1.211711;-8.442673;, - 5.000008; 2.584306;-9.815265;, - 5.000004;-0.663287;-11.690268;, - 5.000008; 3.086712;-11.690268;, - 5.000004;-0.663287;-11.690268;, - 5.000008; 2.584306;-9.815265;, - 10.000008; 2.584303;-13.565265;, - 5.000008; 2.584307;-13.565266;, - 5.000008; 3.086712;-11.690268;, - 10.000008; 3.086707;-11.690267;, - 10.000006; 1.211711;-14.937860;, - 5.000004; 1.211712;-14.937862;, - 5.000008; 2.584307;-13.565266;, - 10.000008; 2.584303;-13.565265;, - 10.000005;-0.663289;-15.440267;, - 5.000004;-0.663288;-15.440268;, - 5.000004; 1.211712;-14.937862;, - 10.000006; 1.211711;-14.937860;, - 10.000005;-2.538291;-14.937861;, - 5.000004;-2.538290;-14.937862;, - 5.000004;-0.663288;-15.440268;, - 10.000005;-0.663289;-15.440267;, - 10.000003;-3.910885;-13.565269;, - 5.000002;-3.910882;-13.565266;, - 5.000004;-2.538290;-14.937862;, - 10.000005;-2.538291;-14.937861;, - 10.000004;-4.413289;-11.690269;, - 5.000000;-4.413287;-11.690266;, - 5.000002;-3.910882;-13.565266;, - 10.000003;-3.910885;-13.565269;, - 10.000002;-3.910887;-9.815268;, - 5.000002;-3.910884;-9.815266;, - 5.000000;-4.413287;-11.690266;, - 10.000004;-4.413289;-11.690269;, - 10.000005;-2.538295;-8.442676;, - 5.000004;-2.538289;-8.442673;, - 5.000002;-3.910884;-9.815266;, - 10.000002;-3.910887;-9.815268;, - 10.000006;-0.663297;-7.940269;, - 5.000004;-0.663289;-7.940267;, - 5.000004;-2.538289;-8.442673;, - 10.000005;-2.538295;-8.442676;, - 10.000006; 1.211705;-8.442672;, - 5.000005; 1.211711;-8.442673;, - 5.000004;-0.663289;-7.940267;, - 10.000006;-0.663297;-7.940269;, - 10.000008; 2.584303;-9.815263;, - 5.000008; 2.584306;-9.815265;, - 5.000005; 1.211711;-8.442673;, - 10.000006; 1.211705;-8.442672;, - 5.000008; 2.584306;-9.815265;, - 10.000008; 2.584303;-9.815263;, - 10.000008; 3.086707;-11.690267;, - 5.000008; 3.086712;-11.690268;, - 10.000006; 0.960505;-10.752765;, - 10.000006; 1.211708;-11.690265;, - 10.000008; 3.086707;-11.690267;, - 10.000008; 2.584303;-9.815263;, - 10.000006; 0.274205;-10.066466;, - 10.000006; 0.960505;-10.752765;, - 10.000008; 2.584303;-9.815263;, - 10.000006; 1.211705;-8.442672;, - 10.000005;-0.663295;-9.815267;, - 10.000006; 0.274205;-10.066466;, - 10.000006; 1.211705;-8.442672;, - 10.000006;-0.663297;-7.940269;, - 10.000005;-1.600792;-10.066470;, - 10.000005;-0.663295;-9.815267;, - 10.000006;-0.663297;-7.940269;, - 10.000005;-2.538295;-8.442676;, - 10.000006;-2.287090;-10.752769;, - 10.000005;-1.600792;-10.066470;, - 10.000005;-2.538295;-8.442676;, - 10.000002;-3.910887;-9.815268;, - 10.000004;-2.538292;-11.690269;, - 10.000006;-2.287090;-10.752769;, - 10.000002;-3.910887;-9.815268;, - 10.000004;-4.413289;-11.690269;, - 10.000005;-2.287088;-12.627767;, - 10.000004;-2.538292;-11.690269;, - 10.000004;-4.413289;-11.690269;, - 10.000003;-3.910885;-13.565269;, - 10.000005;-1.600791;-13.314063;, - 10.000005;-2.287088;-12.627767;, - 10.000003;-3.910885;-13.565269;, - 10.000005;-2.538291;-14.937861;, - 10.000005;-0.663291;-13.565267;, - 10.000005;-1.600791;-13.314063;, - 10.000005;-2.538291;-14.937861;, - 10.000005;-0.663289;-15.440267;, - 10.000005; 0.274210;-13.314063;, - 10.000005;-0.663291;-13.565267;, - 10.000005;-0.663289;-15.440267;, - 10.000006; 1.211711;-14.937860;, - 10.000006; 0.960507;-12.627765;, - 10.000005; 0.274210;-13.314063;, - 10.000006; 1.211711;-14.937860;, - 10.000008; 2.584303;-13.565265;, - 10.000006; 1.211708;-11.690265;, - 10.000006; 0.960507;-12.627765;, - 10.000008; 2.584303;-13.565265;, - 10.000008; 3.086707;-11.690267;, - 10.000006; 1.211708;-11.690265;, - 7.500004;-0.663292;-11.690268;, - 10.000006; 0.960507;-12.627765;, - 10.000006; 0.960507;-12.627765;, - 7.500004;-0.663292;-11.690268;, - 10.000005; 0.274210;-13.314063;, - 10.000005; 0.274210;-13.314063;, - 7.500004;-0.663292;-11.690268;, - 10.000005;-0.663291;-13.565267;, - 10.000005;-0.663291;-13.565267;, - 7.500004;-0.663292;-11.690268;, - 10.000005;-1.600791;-13.314063;, - 10.000005;-1.600791;-13.314063;, - 7.500004;-0.663292;-11.690268;, - 10.000005;-2.287088;-12.627767;, - 10.000005;-2.287088;-12.627767;, - 7.500004;-0.663292;-11.690268;, - 10.000004;-2.538292;-11.690269;, - 10.000004;-2.538292;-11.690269;, - 7.500004;-0.663292;-11.690268;, - 10.000006;-2.287090;-10.752769;, - 10.000006;-2.287090;-10.752769;, - 7.500004;-0.663292;-11.690268;, - 10.000005;-1.600792;-10.066470;, - 10.000005;-1.600792;-10.066470;, - 7.500004;-0.663292;-11.690268;, - 10.000005;-0.663295;-9.815267;, - 10.000005;-0.663295;-9.815267;, - 7.500004;-0.663292;-11.690268;, - 10.000006; 0.274205;-10.066466;, - 10.000006; 0.274205;-10.066466;, - 7.500004;-0.663292;-11.690268;, - 10.000006; 0.960505;-10.752765;, - 10.000006; 0.960505;-10.752765;, - 7.500004;-0.663292;-11.690268;, - 10.000006; 1.211708;-11.690265;; - 355; - 4;3,2,1,0;, - 4;7,6,5,4;, - 4;11,10,9,8;, - 4;15,14,13,12;, - 4;19,18,17,16;, - 4;23,22,21,20;, - 4;27,26,25,24;, - 4;31,30,29,28;, - 4;35,34,33,32;, - 4;39,38,37,36;, - 4;43,42,41,40;, - 4;47,46,45,44;, - 4;51,50,49,48;, - 4;55,54,53,52;, - 4;59,58,57,56;, - 4;63,62,61,60;, - 4;67,66,65,64;, - 4;71,70,69,68;, - 4;75,74,73,72;, - 4;79,78,77,76;, - 4;83,82,81,80;, - 4;87,86,85,84;, - 4;91,90,89,88;, - 4;95,94,93,92;, - 4;99,98,97,96;, - 4;103,102,101,100;, - 4;107,106,105,104;, - 4;111,110,109,108;, - 4;115,114,113,112;, - 4;119,118,117,116;, - 4;123,122,121,120;, - 4;127,126,125,124;, - 4;131,130,129,128;, - 4;135,134,133,132;, - 4;139,138,137,136;, - 4;143,142,141,140;, - 4;147,146,145,144;, - 4;151,150,149,148;, - 4;155,154,153,152;, - 4;159,158,157,156;, - 4;163,162,161,160;, - 4;167,166,165,164;, - 4;171,170,169,168;, - 4;175,174,173,172;, - 4;179,178,177,176;, - 4;183,182,181,180;, - 4;187,186,185,184;, - 4;191,190,189,188;, - 4;195,194,193,192;, - 4;199,198,197,196;, - 4;203,202,201,200;, - 4;207,206,205,204;, - 4;211,210,209,208;, - 4;215,214,213,212;, - 4;219,218,217,216;, - 4;223,222,221,220;, - 4;227,226,225,224;, - 4;231,230,229,228;, - 4;235,234,233,232;, - 4;239,238,237,236;, - 4;243,242,241,240;, - 4;247,246,245,244;, - 4;251,250,249,248;, - 4;255,254,253,252;, - 4;259,258,257,256;, - 4;263,262,261,260;, - 4;267,266,265,264;, - 4;271,270,269,268;, - 4;275,274,273,272;, - 4;279,278,277,276;, - 4;283,282,281,280;, - 4;287,286,285,284;, - 4;291,290,289,288;, - 4;295,294,293,292;, - 4;299,298,297,296;, - 4;303,302,301,300;, - 4;307,306,305,304;, - 4;311,310,309,308;, - 4;315,314,313,312;, - 4;319,318,317,316;, - 4;323,322,321,320;, - 4;327,326,325,324;, - 4;331,330,329,328;, - 4;335,334,333,332;, - 3;338,337,336;, - 3;341,340,339;, - 3;344,343,342;, - 3;347,346,345;, - 3;350,349,348;, - 3;353,352,351;, - 3;356,355,354;, - 3;359,358,357;, - 3;362,361,360;, - 3;365,364,363;, - 3;368,367,366;, - 3;371,370,369;, - 4;375,374,373,372;, - 4;379,378,377,376;, - 4;383,382,381,380;, - 4;387,386,385,384;, - 4;391,390,389,388;, - 4;395,394,393,392;, - 4;399,398,397,396;, - 4;403,402,401,400;, - 4;407,406,405,404;, - 4;411,410,409,408;, - 4;415,414,413,412;, - 4;419,418,417,416;, - 4;423,422,421,420;, - 4;427,426,425,424;, - 4;431,430,429,428;, - 4;435,434,433,432;, - 4;439,438,437,436;, - 4;443,442,441,440;, - 4;447,446,445,444;, - 4;451,450,449,448;, - 4;455,454,453,452;, - 4;459,458,457,456;, - 4;463,462,461,460;, - 4;467,466,465,464;, - 3;470,469,468;, - 3;473,472,471;, - 3;476,475,474;, - 3;479,478,477;, - 3;482,481,480;, - 3;485,484,483;, - 3;488,487,486;, - 3;491,490,489;, - 3;494,493,492;, - 3;497,496,495;, - 3;500,499,498;, - 3;503,502,501;, - 3;506,505,504;, - 3;509,508,507;, - 3;512,511,510;, - 3;515,514,513;, - 3;518,517,516;, - 3;521,520,519;, - 3;524,523,522;, - 3;527,526,525;, - 3;530,529,528;, - 3;533,532,531;, - 3;536,535,534;, - 3;539,538,537;, - 4;543,542,541,540;, - 4;547,546,545,544;, - 4;551,550,549,548;, - 4;555,554,553,552;, - 4;559,558,557,556;, - 4;563,562,561,560;, - 4;567,566,565,564;, - 4;571,570,569,568;, - 4;575,574,573,572;, - 4;579,578,577,576;, - 4;583,582,581,580;, - 4;587,586,585,584;, - 4;591,590,589,588;, - 4;595,594,593,592;, - 4;599,598,597,596;, - 4;603,602,601,600;, - 4;607,606,605,604;, - 4;611,610,609,608;, - 4;615,614,613,612;, - 4;619,618,617,616;, - 4;623,622,621,620;, - 4;627,626,625,624;, - 4;631,630,629,628;, - 4;635,634,633,632;, - 3;638,637,636;, - 3;641,640,639;, - 3;644,643,642;, - 3;647,646,645;, - 3;650,649,648;, - 3;653,652,651;, - 3;656,655,654;, - 3;659,658,657;, - 3;662,661,660;, - 3;665,664,663;, - 3;668,667,666;, - 3;671,670,669;, - 4;675,674,673,672;, - 3;678,677,676;, - 4;682,681,680,679;, - 4;686,685,684,683;, - 3;689,688,687;, - 4;693,692,691,690;, - 4;697,696,695,694;, - 3;700,699,698;, - 4;704,703,702,701;, - 4;708,707,706,705;, - 3;711,710,709;, - 4;715,714,713,712;, - 4;719,718,717,716;, - 4;723,722,721,720;, - 4;727,726,725,724;, - 4;731,730,729,728;, - 4;735,734,733,732;, - 4;739,738,737,736;, - 4;743,742,741,740;, - 4;747,746,745,744;, - 4;751,750,749,748;, - 4;755,754,753,752;, - 4;759,758,757,756;, - 3;762,761,760;, - 3;765,764,763;, - 3;768,767,766;, - 3;771,770,769;, - 3;774,773,772;, - 3;777,776,775;, - 4;781,780,779,778;, - 4;785,784,783,782;, - 4;789,788,787,786;, - 4;793,792,791,790;, - 4;797,796,795,794;, - 3;800,799,798;, - 3;803,802,801;, - 4;807,806,805,804;, - 3;810,809,808;, - 3;813,812,811;, - 4;817,816,815,814;, - 4;821,820,819,818;, - 4;825,824,823,822;, - 4;829,828,827,826;, - 4;833,832,831,830;, - 4;837,836,835,834;, - 4;841,840,839,838;, - 4;845,844,843,842;, - 4;849,848,847,846;, - 4;853,852,851,850;, - 4;857,856,855,854;, - 4;861,860,859,858;, - 4;865,864,863,862;, - 4;869,868,867,866;, - 4;873,872,871,870;, - 4;877,876,875,874;, - 4;881,880,879,878;, - 4;885,884,883,882;, - 4;889,888,887,886;, - 3;892,891,890;, - 3;895,894,893;, - 4;899,898,897,896;, - 4;903,902,901,900;, - 4;907,906,905,904;, - 4;911,910,909,908;, - 4;915,914,913,912;, - 4;919,918,917,916;, - 4;923,922,921,920;, - 4;927,926,925,924;, - 4;931,930,929,928;, - 4;935,934,933,932;, - 4;939,938,937,936;, - 3;942,941,940;, - 4;946,945,944,943;, - 3;949,948,947;, - 4;953,952,951,950;, - 4;957,956,955,954;, - 4;961,960,959,958;, - 4;965,964,963,962;, - 4;969,968,967,966;, - 3;972,971,970;, - 3;975,974,973;, - 3;978,977,976;, - 3;981,980,979;, - 3;984,983,982;, - 3;987,986,985;, - 3;990,989,988;, - 3;993,992,991;, - 3;996,995,994;, - 3;999,998,997;, - 3;1002,1001,1000;, - 3;1005,1004,1003;, - 4;1009,1008,1007,1006;, - 4;1013,1012,1011,1010;, - 4;1017,1016,1015,1014;, - 4;1021,1020,1019,1018;, - 4;1025,1024,1023,1022;, - 4;1029,1028,1027,1026;, - 4;1033,1032,1031,1030;, - 4;1037,1036,1035,1034;, - 4;1041,1040,1039,1038;, - 4;1045,1044,1043,1042;, - 4;1049,1048,1047,1046;, - 4;1053,1052,1051,1050;, - 4;1057,1056,1055,1054;, - 4;1061,1060,1059,1058;, - 4;1065,1064,1063,1062;, - 4;1069,1068,1067,1066;, - 4;1073,1072,1071,1070;, - 4;1077,1076,1075,1074;, - 4;1081,1080,1079,1078;, - 4;1085,1084,1083,1082;, - 4;1089,1088,1087,1086;, - 4;1093,1092,1091,1090;, - 4;1097,1096,1095,1094;, - 4;1101,1100,1099,1098;, - 3;1104,1103,1102;, - 3;1107,1106,1105;, - 3;1110,1109,1108;, - 3;1113,1112,1111;, - 3;1116,1115,1114;, - 3;1119,1118,1117;, - 3;1122,1121,1120;, - 3;1125,1124,1123;, - 3;1128,1127,1126;, - 3;1131,1130,1129;, - 3;1134,1133,1132;, - 3;1137,1136,1135;, - 3;1140,1139,1138;, - 3;1143,1142,1141;, - 3;1146,1145,1144;, - 3;1149,1148,1147;, - 3;1152,1151,1150;, - 3;1155,1154,1153;, - 3;1158,1157,1156;, - 3;1161,1160,1159;, - 3;1164,1163,1162;, - 3;1167,1166,1165;, - 3;1170,1169,1168;, - 3;1173,1172,1171;, - 4;1177,1176,1175,1174;, - 4;1181,1180,1179,1178;, - 4;1185,1184,1183,1182;, - 4;1189,1188,1187,1186;, - 4;1193,1192,1191,1190;, - 4;1197,1196,1195,1194;, - 4;1201,1200,1199,1198;, - 4;1205,1204,1203,1202;, - 4;1209,1208,1207,1206;, - 4;1213,1212,1211,1210;, - 4;1217,1216,1215,1214;, - 4;1221,1220,1219,1218;, - 4;1225,1224,1223,1222;, - 4;1229,1228,1227,1226;, - 4;1233,1232,1231,1230;, - 4;1237,1236,1235,1234;, - 4;1241,1240,1239,1238;, - 4;1245,1244,1243,1242;, - 4;1249,1248,1247,1246;, - 4;1253,1252,1251,1250;, - 4;1257,1256,1255,1254;, - 4;1261,1260,1259,1258;, - 4;1265,1264,1263,1262;, - 4;1269,1268,1267,1266;, - 3;1272,1271,1270;, - 3;1275,1274,1273;, - 3;1278,1277,1276;, - 3;1281,1280,1279;, - 3;1284,1283,1282;, - 3;1287,1286,1285;, - 3;1290,1289,1288;, - 3;1293,1292,1291;, - 3;1296,1295,1294;, - 3;1299,1298,1297;, - 3;1302,1301,1300;, - 3;1305,1304,1303;; - MeshNormals { // _0002 normals - 1306; - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.948668; 0.000000; 0.316202;, - 0.948668; 0.000000; 0.316202;, - 0.948668; 0.000000; 0.316202;, - 0.948668; 0.000000; 0.316202;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - -0.948668; 0.000000; 0.316202;, - -0.948668; 0.000000; 0.316202;, - -0.948668; 0.000000; 0.316202;, - -0.948668; 0.000000; 0.316202;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.447188; 0.000000; 0.894406;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - 0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -0.447188; 0.000000; 0.894406;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - -0.447188; 0.000000;-0.894406;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.209571; 0.782220;, - -0.586657; 0.209571; 0.782220;, - -0.586657; 0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.782220; 0.209571;, - -0.586657;-0.782220; 0.209571;, - -0.586657;-0.782220; 0.209571;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.209571;-0.782220;, - -0.586657;-0.209571;-0.782220;, - -0.586657;-0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.782220;-0.209571;, - -0.586657; 0.782220;-0.209571;, - -0.586657; 0.782220;-0.209571;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.782220; 0.209571;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.572619; 0.572619;, - -0.586657; 0.209571; 0.782220;, - -0.586657; 0.209571; 0.782220;, - -0.586657; 0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.209571; 0.782220;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.572619; 0.572619;, - -0.586657;-0.782220; 0.209601;, - -0.586657;-0.782220; 0.209601;, - -0.586657;-0.782220; 0.209601;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.782220;-0.209571;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.572619;-0.572619;, - -0.586657;-0.209571;-0.782220;, - -0.586657;-0.209571;-0.782220;, - -0.586657;-0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.209571;-0.782220;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.572619;-0.572619;, - -0.586657; 0.782220;-0.209571;, - -0.586657; 0.782220;-0.209571;, - -0.586657; 0.782220;-0.209571;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.894406;-0.447188;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.894406; 0.000000; 0.447188;, - 0.894406; 0.000000; 0.447188;, - 0.894406; 0.000000; 0.447188;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - -0.894406; 0.000000; 0.447188;, - -0.894406; 0.000000; 0.447188;, - -0.894406; 0.000000; 0.447188;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - 0.000000;-0.894406; 0.447188;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 0.000000;-0.447188;-0.894406;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000; 0.000000; 1.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.970122; 0.000000;-0.242531;, - 0.970122; 0.000000;-0.242531;, - 0.970122; 0.000000;-0.242531;, - 0.970122; 0.000000;-0.242531;, - -0.970122; 0.000000;-0.242531;, - -0.970122; 0.000000;-0.242531;, - -0.970122; 0.000000;-0.242531;, - -0.970122; 0.000000;-0.242531;, - -0.303720; 0.911161; 0.278390;, - -0.303720; 0.911161; 0.278390;, - -0.303720; 0.911161; 0.278390;, - 0.303720; 0.911161; 0.278390;, - 0.303720; 0.911161; 0.278390;, - 0.303720; 0.911161; 0.278390;, - 0.975799; 0.108402; 0.189734;, - 0.975799; 0.108402; 0.189734;, - 0.975799; 0.108402; 0.189734;, - 0.696310; 0.696310;-0.174078;, - 0.696310; 0.696310;-0.174078;, - 0.696310; 0.696310;-0.174078;, - -0.975799; 0.108402; 0.189734;, - -0.975799; 0.108402; 0.189734;, - -0.975799; 0.108402; 0.189734;, - -0.696310; 0.696310;-0.174047;, - -0.696310; 0.696310;-0.174047;, - -0.696310; 0.696310;-0.174047;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.847987; 0.529984;, - 0.000000; 0.847987; 0.529984;, - 0.000000; 0.847987; 0.529984;, - 0.000000; 0.847987; 0.529984;, - 0.162206; 0.973327;-0.162206;, - 0.162206; 0.973327;-0.162206;, - 0.162206; 0.973327;-0.162206;, - 0.162206; 0.973327;-0.162206;, - -0.162206; 0.973327;-0.162206;, - -0.162206; 0.973327;-0.162206;, - -0.162206; 0.973327;-0.162206;, - -0.162206; 0.973327;-0.162206;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.982849;-0.184271;, - 0.000000; 0.982849;-0.184271;, - 0.000000; 0.982849;-0.184271;, - 0.000000; 0.982849;-0.184271;, - -0.704337; 0.704337;-0.088015;, - -0.704337; 0.704337;-0.088015;, - -0.704337; 0.704337;-0.088015;, - 0.704337; 0.704337;-0.088015;, - 0.704337; 0.704337;-0.088015;, - 0.704337; 0.704337;-0.088015;, - 0.312326; 0.937040;-0.156163;, - 0.312326; 0.937040;-0.156163;, - 0.312326; 0.937040;-0.156163;, - 0.312326; 0.937040;-0.156163;, - -0.312326; 0.937040;-0.156163;, - -0.312326; 0.937040;-0.156163;, - -0.312326; 0.937040;-0.156163;, - -0.312326; 0.937040;-0.156163;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-0.999969;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - 0.000000; 0.970122;-0.242531;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - -0.982849; 0.000000;-0.184271;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.000000;-0.970122;-0.242531;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.982849; 0.000000;-0.184271;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - 0.000000; 0.000000;-1.000000;, - -0.920957; 0.153478; 0.358135;, - -0.920957; 0.153478; 0.358135;, - -0.920957; 0.153478; 0.358135;, - -0.920957; 0.153478; 0.358135;, - 0.920957; 0.153478; 0.358135;, - 0.920957; 0.153478; 0.358135;, - 0.920957; 0.153478; 0.358135;, - 0.920957; 0.153478; 0.358135;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.999969; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - -0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.990570;-0.135075; 0.022492;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000; 0.999969; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 0.948668;-0.316202;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000; 1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-1.000000; 0.000000;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - 0.000000;-0.948668; 0.316202;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.209571; 0.782220;, - 0.586657;-0.209571; 0.782220;, - 0.586657;-0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.209571;-0.782220;, - 0.586657; 0.209571;-0.782220;, - 0.586657; 0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.782220;-0.209571;, - 0.586657;-0.782220;-0.209571;, - 0.586657;-0.782220;-0.209571;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -1.000000; 0.000000; 0.000000;, - -0.999969; 0.000000; 0.000000;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.965911;-0.258797;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.707083;-0.707083;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000; 0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.258797;-0.965911;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.707083;-0.707083;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911;-0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.965911; 0.258797;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.707083; 0.707083;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000;-0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.258797; 0.965911;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.707083; 0.707083;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.000000; 0.965911; 0.258797;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.999969; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 1.000000; 0.000000; 0.000000;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.782220; 0.209571;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.572619; 0.572619;, - 0.586657;-0.209571; 0.782220;, - 0.586657;-0.209571; 0.782220;, - 0.586657;-0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.209571; 0.782220;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.572619; 0.572619;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220; 0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.782220;-0.209571;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.572619;-0.572619;, - 0.586657; 0.209571;-0.782220;, - 0.586657; 0.209571;-0.782220;, - 0.586657; 0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.209571;-0.782220;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.572619;-0.572619;, - 0.586657;-0.782220;-0.209571;, - 0.586657;-0.782220;-0.209571;, - 0.586657;-0.782220;-0.209571;; - 355; - 4;3,2,1,0;, - 4;7,6,5,4;, - 4;11,10,9,8;, - 4;15,14,13,12;, - 4;19,18,17,16;, - 4;23,22,21,20;, - 4;27,26,25,24;, - 4;31,30,29,28;, - 4;35,34,33,32;, - 4;39,38,37,36;, - 4;43,42,41,40;, - 4;47,46,45,44;, - 4;51,50,49,48;, - 4;55,54,53,52;, - 4;59,58,57,56;, - 4;63,62,61,60;, - 4;67,66,65,64;, - 4;71,70,69,68;, - 4;75,74,73,72;, - 4;79,78,77,76;, - 4;83,82,81,80;, - 4;87,86,85,84;, - 4;91,90,89,88;, - 4;95,94,93,92;, - 4;99,98,97,96;, - 4;103,102,101,100;, - 4;107,106,105,104;, - 4;111,110,109,108;, - 4;115,114,113,112;, - 4;119,118,117,116;, - 4;123,122,121,120;, - 4;127,126,125,124;, - 4;131,130,129,128;, - 4;135,134,133,132;, - 4;139,138,137,136;, - 4;143,142,141,140;, - 4;147,146,145,144;, - 4;151,150,149,148;, - 4;155,154,153,152;, - 4;159,158,157,156;, - 4;163,162,161,160;, - 4;167,166,165,164;, - 4;171,170,169,168;, - 4;175,174,173,172;, - 4;179,178,177,176;, - 4;183,182,181,180;, - 4;187,186,185,184;, - 4;191,190,189,188;, - 4;195,194,193,192;, - 4;199,198,197,196;, - 4;203,202,201,200;, - 4;207,206,205,204;, - 4;211,210,209,208;, - 4;215,214,213,212;, - 4;219,218,217,216;, - 4;223,222,221,220;, - 4;227,226,225,224;, - 4;231,230,229,228;, - 4;235,234,233,232;, - 4;239,238,237,236;, - 4;243,242,241,240;, - 4;247,246,245,244;, - 4;251,250,249,248;, - 4;255,254,253,252;, - 4;259,258,257,256;, - 4;263,262,261,260;, - 4;267,266,265,264;, - 4;271,270,269,268;, - 4;275,274,273,272;, - 4;279,278,277,276;, - 4;283,282,281,280;, - 4;287,286,285,284;, - 4;291,290,289,288;, - 4;295,294,293,292;, - 4;299,298,297,296;, - 4;303,302,301,300;, - 4;307,306,305,304;, - 4;311,310,309,308;, - 4;315,314,313,312;, - 4;319,318,317,316;, - 4;323,322,321,320;, - 4;327,326,325,324;, - 4;331,330,329,328;, - 4;335,334,333,332;, - 3;338,337,336;, - 3;341,340,339;, - 3;344,343,342;, - 3;347,346,345;, - 3;350,349,348;, - 3;353,352,351;, - 3;356,355,354;, - 3;359,358,357;, - 3;362,361,360;, - 3;365,364,363;, - 3;368,367,366;, - 3;371,370,369;, - 4;375,374,373,372;, - 4;379,378,377,376;, - 4;383,382,381,380;, - 4;387,386,385,384;, - 4;391,390,389,388;, - 4;395,394,393,392;, - 4;399,398,397,396;, - 4;403,402,401,400;, - 4;407,406,405,404;, - 4;411,410,409,408;, - 4;415,414,413,412;, - 4;419,418,417,416;, - 4;423,422,421,420;, - 4;427,426,425,424;, - 4;431,430,429,428;, - 4;435,434,433,432;, - 4;439,438,437,436;, - 4;443,442,441,440;, - 4;447,446,445,444;, - 4;451,450,449,448;, - 4;455,454,453,452;, - 4;459,458,457,456;, - 4;463,462,461,460;, - 4;467,466,465,464;, - 3;470,469,468;, - 3;473,472,471;, - 3;476,475,474;, - 3;479,478,477;, - 3;482,481,480;, - 3;485,484,483;, - 3;488,487,486;, - 3;491,490,489;, - 3;494,493,492;, - 3;497,496,495;, - 3;500,499,498;, - 3;503,502,501;, - 3;506,505,504;, - 3;509,508,507;, - 3;512,511,510;, - 3;515,514,513;, - 3;518,517,516;, - 3;521,520,519;, - 3;524,523,522;, - 3;527,526,525;, - 3;530,529,528;, - 3;533,532,531;, - 3;536,535,534;, - 3;539,538,537;, - 4;543,542,541,540;, - 4;547,546,545,544;, - 4;551,550,549,548;, - 4;555,554,553,552;, - 4;559,558,557,556;, - 4;563,562,561,560;, - 4;567,566,565,564;, - 4;571,570,569,568;, - 4;575,574,573,572;, - 4;579,578,577,576;, - 4;583,582,581,580;, - 4;587,586,585,584;, - 4;591,590,589,588;, - 4;595,594,593,592;, - 4;599,598,597,596;, - 4;603,602,601,600;, - 4;607,606,605,604;, - 4;611,610,609,608;, - 4;615,614,613,612;, - 4;619,618,617,616;, - 4;623,622,621,620;, - 4;627,626,625,624;, - 4;631,630,629,628;, - 4;635,634,633,632;, - 3;638,637,636;, - 3;641,640,639;, - 3;644,643,642;, - 3;647,646,645;, - 3;650,649,648;, - 3;653,652,651;, - 3;656,655,654;, - 3;659,658,657;, - 3;662,661,660;, - 3;665,664,663;, - 3;668,667,666;, - 3;671,670,669;, - 4;675,674,673,672;, - 3;678,677,676;, - 4;682,681,680,679;, - 4;686,685,684,683;, - 3;689,688,687;, - 4;693,692,691,690;, - 4;697,696,695,694;, - 3;700,699,698;, - 4;704,703,702,701;, - 4;708,707,706,705;, - 3;711,710,709;, - 4;715,714,713,712;, - 4;719,718,717,716;, - 4;723,722,721,720;, - 4;727,726,725,724;, - 4;731,730,729,728;, - 4;735,734,733,732;, - 4;739,738,737,736;, - 4;743,742,741,740;, - 4;747,746,745,744;, - 4;751,750,749,748;, - 4;755,754,753,752;, - 4;759,758,757,756;, - 3;762,761,760;, - 3;765,764,763;, - 3;768,767,766;, - 3;771,770,769;, - 3;774,773,772;, - 3;777,776,775;, - 4;781,780,779,778;, - 4;785,784,783,782;, - 4;789,788,787,786;, - 4;793,792,791,790;, - 4;797,796,795,794;, - 3;800,799,798;, - 3;803,802,801;, - 4;807,806,805,804;, - 3;810,809,808;, - 3;813,812,811;, - 4;817,816,815,814;, - 4;821,820,819,818;, - 4;825,824,823,822;, - 4;829,828,827,826;, - 4;833,832,831,830;, - 4;837,836,835,834;, - 4;841,840,839,838;, - 4;845,844,843,842;, - 4;849,848,847,846;, - 4;853,852,851,850;, - 4;857,856,855,854;, - 4;861,860,859,858;, - 4;865,864,863,862;, - 4;869,868,867,866;, - 4;873,872,871,870;, - 4;877,876,875,874;, - 4;881,880,879,878;, - 4;885,884,883,882;, - 4;889,888,887,886;, - 3;892,891,890;, - 3;895,894,893;, - 4;899,898,897,896;, - 4;903,902,901,900;, - 4;907,906,905,904;, - 4;911,910,909,908;, - 4;915,914,913,912;, - 4;919,918,917,916;, - 4;923,922,921,920;, - 4;927,926,925,924;, - 4;931,930,929,928;, - 4;935,934,933,932;, - 4;939,938,937,936;, - 3;942,941,940;, - 4;946,945,944,943;, - 3;949,948,947;, - 4;953,952,951,950;, - 4;957,956,955,954;, - 4;961,960,959,958;, - 4;965,964,963,962;, - 4;969,968,967,966;, - 3;972,971,970;, - 3;975,974,973;, - 3;978,977,976;, - 3;981,980,979;, - 3;984,983,982;, - 3;987,986,985;, - 3;990,989,988;, - 3;993,992,991;, - 3;996,995,994;, - 3;999,998,997;, - 3;1002,1001,1000;, - 3;1005,1004,1003;, - 4;1009,1008,1007,1006;, - 4;1013,1012,1011,1010;, - 4;1017,1016,1015,1014;, - 4;1021,1020,1019,1018;, - 4;1025,1024,1023,1022;, - 4;1029,1028,1027,1026;, - 4;1033,1032,1031,1030;, - 4;1037,1036,1035,1034;, - 4;1041,1040,1039,1038;, - 4;1045,1044,1043,1042;, - 4;1049,1048,1047,1046;, - 4;1053,1052,1051,1050;, - 4;1057,1056,1055,1054;, - 4;1061,1060,1059,1058;, - 4;1065,1064,1063,1062;, - 4;1069,1068,1067,1066;, - 4;1073,1072,1071,1070;, - 4;1077,1076,1075,1074;, - 4;1081,1080,1079,1078;, - 4;1085,1084,1083,1082;, - 4;1089,1088,1087,1086;, - 4;1093,1092,1091,1090;, - 4;1097,1096,1095,1094;, - 4;1101,1100,1099,1098;, - 3;1104,1103,1102;, - 3;1107,1106,1105;, - 3;1110,1109,1108;, - 3;1113,1112,1111;, - 3;1116,1115,1114;, - 3;1119,1118,1117;, - 3;1122,1121,1120;, - 3;1125,1124,1123;, - 3;1128,1127,1126;, - 3;1131,1130,1129;, - 3;1134,1133,1132;, - 3;1137,1136,1135;, - 3;1140,1139,1138;, - 3;1143,1142,1141;, - 3;1146,1145,1144;, - 3;1149,1148,1147;, - 3;1152,1151,1150;, - 3;1155,1154,1153;, - 3;1158,1157,1156;, - 3;1161,1160,1159;, - 3;1164,1163,1162;, - 3;1167,1166,1165;, - 3;1170,1169,1168;, - 3;1173,1172,1171;, - 4;1177,1176,1175,1174;, - 4;1181,1180,1179,1178;, - 4;1185,1184,1183,1182;, - 4;1189,1188,1187,1186;, - 4;1193,1192,1191,1190;, - 4;1197,1196,1195,1194;, - 4;1201,1200,1199,1198;, - 4;1205,1204,1203,1202;, - 4;1209,1208,1207,1206;, - 4;1213,1212,1211,1210;, - 4;1217,1216,1215,1214;, - 4;1221,1220,1219,1218;, - 4;1225,1224,1223,1222;, - 4;1229,1228,1227,1226;, - 4;1233,1232,1231,1230;, - 4;1237,1236,1235,1234;, - 4;1241,1240,1239,1238;, - 4;1245,1244,1243,1242;, - 4;1249,1248,1247,1246;, - 4;1253,1252,1251,1250;, - 4;1257,1256,1255,1254;, - 4;1261,1260,1259,1258;, - 4;1265,1264,1263,1262;, - 4;1269,1268,1267,1266;, - 3;1272,1271,1270;, - 3;1275,1274,1273;, - 3;1278,1277,1276;, - 3;1281,1280,1279;, - 3;1284,1283,1282;, - 3;1287,1286,1285;, - 3;1290,1289,1288;, - 3;1293,1292,1291;, - 3;1296,1295,1294;, - 3;1299,1298,1297;, - 3;1302,1301,1300;, - 3;1305,1304,1303;; - } // End of _0002 normals - MeshTextureCoords { //Cube_001 UV Coordinates - 1306; - 0.717871; 0.768436;, - 0.788054; 0.768222;, - 0.788311; 0.852436;, - 0.718128; 0.852651;, - 0.788312; 0.866903;, - 0.788054; 0.951003;, - 0.717871; 0.950788;, - 0.718129; 0.866687;, - 0.707799; 0.192565;, - 0.672707; 0.192458;, - 0.672923; 0.122275;, - 0.708014; 0.122382;, - 0.063343; 0.232384;, - 0.028252; 0.232277;, - 0.028510; 0.148057;, - 0.063602; 0.148165;, - 0.360518; 0.128721;, - 0.395609; 0.128613;, - 0.395824; 0.198796;, - 0.360733; 0.198904;, - 0.761033; 0.151961;, - 0.796125; 0.151854;, - 0.796383; 0.236073;, - 0.761292; 0.236181;, - 0.087613; 0.513719;, - 0.087355; 0.429499;, - 0.171484; 0.401168;, - 0.171913; 0.541534;, - 0.395394; 0.519016;, - 0.311380; 0.490684;, - 0.311638; 0.406465;, - 0.395824; 0.378649;, - 0.790034; 0.572634;, - 0.754943; 0.572526;, - 0.755373; 0.432160;, - 0.790465; 0.432268;, - 0.457849; 0.232350;, - 0.422757; 0.232242;, - 0.422948; 0.148047;, - 0.458040; 0.148155;, - 0.122527; 0.288466;, - 0.087435; 0.288358;, - 0.087694; 0.204139;, - 0.122785; 0.204246;, - 0.472076; 0.148155;, - 0.507168; 0.148047;, - 0.507359; 0.232242;, - 0.472268; 0.232350;, - 0.558828; 0.775390;, - 0.559043; 0.845573;, - 0.552047; 0.852613;, - 0.551789; 0.768393;, - 0.559043; 0.845573;, - 0.601150; 0.845444;, - 0.608190; 0.852441;, - 0.552047; 0.852613;, - 0.601150; 0.845444;, - 0.600936; 0.775261;, - 0.607932; 0.768222;, - 0.608190; 0.852441;, - 0.600936; 0.775261;, - 0.558828; 0.775390;, - 0.551789; 0.768393;, - 0.607932; 0.768222;, - 0.978845; 0.113689;, - 0.978716; 0.071579;, - 0.992752; 0.071536;, - 0.992881; 0.113646;, - 0.923951; 0.796991;, - 0.924166; 0.726808;, - 0.938203; 0.726851;, - 0.937988; 0.797034;, - 0.978816; 0.641208;, - 0.978945; 0.599098;, - 0.992982; 0.599141;, - 0.992853; 0.641251;, - 0.920144; 0.258736;, - 0.920359; 0.188553;, - 0.934396; 0.188596;, - 0.934180; 0.258779;, - 0.286143; 0.280350;, - 0.286401; 0.196130;, - 0.300438; 0.196173;, - 0.300179; 0.280393;, - 0.820012; 0.767538;, - 0.820270; 0.683318;, - 0.834307; 0.683361;, - 0.834049; 0.767581;, - 0.528968; 0.102827;, - 0.529140; 0.046680;, - 0.543177; 0.046723;, - 0.543005; 0.102870;, - 0.007018; 0.541362;, - 0.014048; 0.534366;, - 0.056098; 0.534495;, - 0.063085; 0.541534;, - 0.063085; 0.541534;, - 0.056098; 0.534495;, - 0.056314; 0.464311;, - 0.063343; 0.457315;, - 0.063343; 0.457315;, - 0.056314; 0.464311;, - 0.014263; 0.464182;, - 0.007277; 0.457143;, - 0.007277; 0.457143;, - 0.014263; 0.464182;, - 0.014048; 0.534366;, - 0.007018; 0.541362;, - 0.913897; 0.814733;, - 0.913866; 0.973874;, - 0.908904; 0.973873;, - 0.908935; 0.814732;, - 0.909914; 0.599099;, - 0.909883; 0.758241;, - 0.904921; 0.758240;, - 0.904952; 0.599098;, - 0.297312; 0.378649;, - 0.297343; 0.537791;, - 0.292380; 0.537792;, - 0.292349; 0.378650;, - 0.901144; 0.386489;, - 0.901113; 0.227347;, - 0.906076; 0.227346;, - 0.906107; 0.386488;, - 0.311435; 0.567257;, - 0.311435; 0.572220;, - 0.306472; 0.572220;, - 0.306472; 0.567257;, - 0.659556; 0.413161;, - 0.664518; 0.413161;, - 0.664518; 0.418124;, - 0.659556; 0.418124;, - 0.928836; 0.059527;, - 0.928814; 0.173199;, - 0.923851; 0.173198;, - 0.923873; 0.059526;, - 0.932919; 0.814733;, - 0.932897; 0.928405;, - 0.927934; 0.928404;, - 0.927956; 0.814732;, - 0.928914; 0.599098;, - 0.928936; 0.712771;, - 0.923973; 0.712772;, - 0.923951; 0.599099;, - 0.920166; 0.386489;, - 0.920144; 0.272816;, - 0.925107; 0.272815;, - 0.925129; 0.386488;, - 0.292436; 0.567257;, - 0.292436; 0.572220;, - 0.287473; 0.572220;, - 0.287473; 0.567257;, - 0.678555; 0.413161;, - 0.683518; 0.413161;, - 0.683518; 0.418124;, - 0.678555; 0.418124;, - 0.559086; 0.859610;, - 0.559301; 0.929793;, - 0.552304; 0.936833;, - 0.552047; 0.852613;, - 0.559301; 0.929793;, - 0.601408; 0.929664;, - 0.608447; 0.936661;, - 0.552304; 0.936833;, - 0.601408; 0.929664;, - 0.601193; 0.859481;, - 0.608190; 0.852441;, - 0.608447; 0.936661;, - 0.601193; 0.859481;, - 0.559086; 0.859610;, - 0.552047; 0.852613;, - 0.608190; 0.852441;, - 0.975261; 0.544625;, - 0.975132; 0.502515;, - 0.989169; 0.502472;, - 0.989298; 0.544582;, - 0.939166; 0.342999;, - 0.939381; 0.272815;, - 0.953417; 0.272859;, - 0.953202; 0.343042;, - 0.978716; 0.169836;, - 0.978845; 0.127726;, - 0.992881; 0.127769;, - 0.992752; 0.169879;, - 0.911000; 0.572655;, - 0.911216; 0.502472;, - 0.925252; 0.502515;, - 0.925037; 0.572699;, - 0.285884; 0.364570;, - 0.286143; 0.280350;, - 0.300179; 0.280393;, - 0.299921; 0.364613;, - 0.187094; 0.241880;, - 0.186922; 0.185733;, - 0.200958; 0.185690;, - 0.201130; 0.241836;, - 0.820270; 0.683318;, - 0.820529; 0.599098;, - 0.834565; 0.599141;, - 0.834307; 0.683361;, - 0.007277; 0.457143;, - 0.014306; 0.450146;, - 0.056357; 0.450275;, - 0.063343; 0.457315;, - 0.063343; 0.457315;, - 0.056357; 0.450275;, - 0.056572; 0.380092;, - 0.063602; 0.373095;, - 0.063602; 0.373095;, - 0.056572; 0.380092;, - 0.014522; 0.379963;, - 0.007535; 0.372923;, - 0.007535; 0.372923;, - 0.014522; 0.379963;, - 0.014306; 0.450146;, - 0.007277; 0.457143;, - 0.582812; 0.477390;, - 0.620439; 0.505666;, - 0.620440; 0.513511;, - 0.570271; 0.475809;, - 0.620439; 0.505666;, - 0.639248; 0.496271;, - 0.645519; 0.500983;, - 0.620440; 0.513511;, - 0.639248; 0.496271;, - 0.639239; 0.449203;, - 0.645508; 0.438227;, - 0.645519; 0.500983;, - 0.639239; 0.449203;, - 0.582812; 0.477390;, - 0.570271; 0.475809;, - 0.645508; 0.438227;, - 0.367557; 0.051412;, - 0.367364; 0.114576;, - 0.353327; 0.114533;, - 0.353521; 0.051369;, - 0.989175; 0.357121;, - 0.989045; 0.399231;, - 0.975009; 0.399188;, - 0.975138; 0.357078;, - 0.760039; 0.968600;, - 0.760103; 0.989655;, - 0.746067; 0.989698;, - 0.746002; 0.968643;, - 0.008611; 0.063901;, - 0.008481; 0.021791;, - 0.022518; 0.021748;, - 0.022647; 0.063858;, - 0.311435; 0.586299;, - 0.311263; 0.642446;, - 0.297226; 0.642403;, - 0.297398; 0.586256;, - 0.708014; 0.020655;, - 0.707928; 0.048728;, - 0.693892; 0.048685;, - 0.693978; 0.020612;, - 0.186122; 0.459709;, - 0.185950; 0.403563;, - 0.199986; 0.403520;, - 0.200159; 0.459666;, - 0.480885; 0.438193;, - 0.493438; 0.436619;, - 0.549942; 0.464844;, - 0.556223; 0.475827;, - 0.556223; 0.475827;, - 0.549942; 0.464844;, - 0.549925; 0.417764;, - 0.556201; 0.413053;, - 0.556201; 0.413053;, - 0.549925; 0.417764;, - 0.531091; 0.408356;, - 0.531088; 0.400509;, - 0.531088; 0.400509;, - 0.531091; 0.408356;, - 0.493438; 0.436619;, - 0.480885; 0.438193;, - 0.487166; 0.449176;, - 0.487182; 0.496256;, - 0.480907; 0.500966;, - 0.480885; 0.438193;, - 0.487182; 0.496256;, - 0.506017; 0.505664;, - 0.506019; 0.513511;, - 0.480907; 0.500966;, - 0.506017; 0.505664;, - 0.543669; 0.477401;, - 0.556223; 0.475827;, - 0.506019; 0.513511;, - 0.543669; 0.477401;, - 0.487166; 0.449176;, - 0.480885; 0.438193;, - 0.556223; 0.475827;, - 0.381788; 0.114576;, - 0.381594; 0.051412;, - 0.395631; 0.051369;, - 0.395824; 0.114533;, - 0.610526; 0.013704;, - 0.610655; 0.055814;, - 0.596619; 0.055857;, - 0.596489; 0.013747;, - 0.717864; 0.989655;, - 0.717929; 0.968600;, - 0.731966; 0.968643;, - 0.731901; 0.989698;, - 0.963777; 0.984552;, - 0.963906; 0.942442;, - 0.977943; 0.942485;, - 0.977814; 0.984595;, - 0.297054; 0.698549;, - 0.297226; 0.642403;, - 0.311263; 0.642446;, - 0.311090; 0.698592;, - 0.689791; 0.989698;, - 0.689705; 0.961625;, - 0.703742; 0.961582;, - 0.703828; 0.989655;, - 0.200159; 0.459666;, - 0.200331; 0.515813;, - 0.186294; 0.515856;, - 0.186122; 0.459709;, - 0.570271; 0.475809;, - 0.576539; 0.464833;, - 0.632967; 0.436646;, - 0.645508; 0.438227;, - 0.645508; 0.438227;, - 0.632967; 0.436646;, - 0.595340; 0.408370;, - 0.595338; 0.400526;, - 0.595338; 0.400526;, - 0.595340; 0.408370;, - 0.576531; 0.417766;, - 0.570260; 0.413053;, - 0.570260; 0.413053;, - 0.576531; 0.417766;, - 0.576539; 0.464833;, - 0.570271; 0.475809;, - 0.746997; 0.356713;, - 0.736098; 0.375590;, - 0.706321; 0.345814;, - 0.746997; 0.334915;, - 0.746997; 0.356713;, - 0.706321; 0.345814;, - 0.736098; 0.316037;, - 0.746997; 0.334915;, - 0.706321; 0.345814;, - 0.717220; 0.305139;, - 0.736098; 0.316037;, - 0.706321; 0.345814;, - 0.695423; 0.305139;, - 0.717220; 0.305139;, - 0.706321; 0.345814;, - 0.676545; 0.316038;, - 0.695423; 0.305139;, - 0.706321; 0.345814;, - 0.665646; 0.334915;, - 0.676545; 0.316038;, - 0.706321; 0.345814;, - 0.665646; 0.356713;, - 0.665646; 0.334915;, - 0.706321; 0.345814;, - 0.676545; 0.375590;, - 0.665646; 0.356713;, - 0.706321; 0.345814;, - 0.695423; 0.386489;, - 0.676545; 0.375590;, - 0.706321; 0.345814;, - 0.717220; 0.386489;, - 0.695423; 0.386489;, - 0.706321; 0.345814;, - 0.706321; 0.345814;, - 0.736098; 0.375590;, - 0.717220; 0.386489;, - 0.185603; 0.105934;, - 0.185775; 0.162080;, - 0.164784; 0.162145;, - 0.164613; 0.105998;, - 0.942872; 0.113685;, - 0.942881; 0.068216;, - 0.964679; 0.068220;, - 0.964670; 0.113689;, - 0.250086; 0.171493;, - 0.250258; 0.115347;, - 0.271313; 0.115411;, - 0.271141; 0.171558;, - 0.229031; 0.171429;, - 0.229204; 0.115282;, - 0.250258; 0.115347;, - 0.250086; 0.171493;, - 0.249507; 0.101241;, - 0.249516; 0.055772;, - 0.271313; 0.055776;, - 0.271304; 0.101245;, - 0.888317; 0.173134;, - 0.888489; 0.116987;, - 0.909814; 0.117053;, - 0.909642; 0.173199;, - 0.867592; 0.173070;, - 0.867764; 0.116924;, - 0.888489; 0.116987;, - 0.888317; 0.173134;, - 0.306368; 0.111781;, - 0.306360; 0.066312;, - 0.328157; 0.066308;, - 0.328166; 0.111777;, - 0.866022; 0.386424;, - 0.865849; 0.330278;, - 0.886904; 0.330213;, - 0.887077; 0.386360;, - 0.844967; 0.386489;, - 0.844795; 0.330343;, - 0.865849; 0.330278;, - 0.866022; 0.386424;, - 0.927943; 0.987915;, - 0.927934; 0.942446;, - 0.949732; 0.942442;, - 0.949741; 0.987911;, - 0.143668; 0.162209;, - 0.143496; 0.106063;, - 0.164613; 0.105998;, - 0.164784; 0.162145;, - 0.678047; 0.889396;, - 0.668608; 0.883946;, - 0.674058; 0.863609;, - 0.692935; 0.874508;, - 0.668608; 0.883946;, - 0.657709; 0.883946;, - 0.652260; 0.863609;, - 0.674058; 0.863609;, - 0.657709; 0.883946;, - 0.648271; 0.889396;, - 0.633383; 0.874507;, - 0.652260; 0.863609;, - 0.648271; 0.889396;, - 0.642821; 0.898834;, - 0.622484; 0.893385;, - 0.633383; 0.874507;, - 0.642821; 0.898834;, - 0.642821; 0.909733;, - 0.622484; 0.915183;, - 0.622484; 0.893385;, - 0.642821; 0.909733;, - 0.648271; 0.919172;, - 0.633383; 0.934060;, - 0.622484; 0.915183;, - 0.648271; 0.919172;, - 0.657710; 0.924621;, - 0.652260; 0.944959;, - 0.633383; 0.934060;, - 0.657710; 0.924621;, - 0.668608; 0.924621;, - 0.674058; 0.944959;, - 0.652260; 0.944959;, - 0.668608; 0.924621;, - 0.678047; 0.919172;, - 0.692935; 0.934060;, - 0.674058; 0.944959;, - 0.678047; 0.919172;, - 0.683496; 0.909733;, - 0.703834; 0.915183;, - 0.692935; 0.934060;, - 0.683496; 0.909733;, - 0.683496; 0.898834;, - 0.703834; 0.893385;, - 0.703834; 0.915183;, - 0.683496; 0.898834;, - 0.678047; 0.889396;, - 0.692935; 0.874508;, - 0.703834; 0.893385;, - 0.063602; 0.029088;, - 0.063599; 0.063901;, - 0.053700; 0.062753;, - 0.063602; 0.029088;, - 0.053700; 0.062753;, - 0.043848; 0.058092;, - 0.063602; 0.029088;, - 0.043848; 0.058092;, - 0.036684; 0.051165;, - 0.796383; 0.067505;, - 0.769465; 0.045428;, - 0.776629; 0.038501;, - 0.796383; 0.067505;, - 0.776629; 0.038501;, - 0.786481; 0.033839;, - 0.796383; 0.067505;, - 0.786481; 0.033839;, - 0.796380; 0.032692;, - 0.095867; 0.048885;, - 0.095870; 0.014072;, - 0.105769; 0.015220;, - 0.095867; 0.048885;, - 0.105769; 0.015220;, - 0.115621; 0.019881;, - 0.095867; 0.048885;, - 0.115621; 0.019881;, - 0.122785; 0.026808;, - 0.201666; 0.038336;, - 0.228584; 0.060413;, - 0.221420; 0.067340;, - 0.201666; 0.038336;, - 0.221420; 0.067340;, - 0.211568; 0.072001;, - 0.201666; 0.038336;, - 0.211568; 0.072001;, - 0.201669; 0.073149;, - 0.507359; 0.297961;, - 0.496460; 0.316838;, - 0.466684; 0.287062;, - 0.507359; 0.276163;, - 0.507359; 0.297961;, - 0.466684; 0.287062;, - 0.496460; 0.257285;, - 0.507359; 0.276163;, - 0.466684; 0.287062;, - 0.477583; 0.246387;, - 0.496460; 0.257285;, - 0.466684; 0.287062;, - 0.455785; 0.246387;, - 0.477583; 0.246387;, - 0.466684; 0.287062;, - 0.436908; 0.257286;, - 0.455785; 0.246387;, - 0.466684; 0.287062;, - 0.426009; 0.276163;, - 0.436908; 0.257286;, - 0.466684; 0.287062;, - 0.426009; 0.297961;, - 0.426009; 0.276163;, - 0.466684; 0.287062;, - 0.436908; 0.316838;, - 0.426009; 0.297961;, - 0.466684; 0.287062;, - 0.455785; 0.327737;, - 0.436908; 0.316838;, - 0.466684; 0.287062;, - 0.477583; 0.327737;, - 0.455785; 0.327737;, - 0.466684; 0.287062;, - 0.466684; 0.287062;, - 0.496460; 0.316838;, - 0.477583; 0.327737;, - 0.894695; 0.814732;, - 0.894867; 0.870878;, - 0.873876; 0.870942;, - 0.873705; 0.814796;, - 0.942973; 0.644567;, - 0.942982; 0.599098;, - 0.964779; 0.599102;, - 0.964770; 0.644571;, - 0.832328; 0.173135;, - 0.832500; 0.116988;, - 0.853555; 0.117053;, - 0.853383; 0.173199;, - 0.811273; 0.173070;, - 0.811445; 0.116924;, - 0.832500; 0.116988;, - 0.832328; 0.173135;, - 0.942872; 0.173195;, - 0.942881; 0.127726;, - 0.964679; 0.127730;, - 0.964670; 0.173199;, - 0.774885; 0.137752;, - 0.775058; 0.081605;, - 0.796383; 0.081671;, - 0.796211; 0.137817;, - 0.754161; 0.137688;, - 0.754333; 0.081542;, - 0.775058; 0.081605;, - 0.774885; 0.137752;, - 0.163977; 0.091897;, - 0.163968; 0.046428;, - 0.185766; 0.046424;, - 0.185775; 0.091893;, - 0.866022; 0.243447;, - 0.865849; 0.187300;, - 0.886904; 0.187236;, - 0.887077; 0.243382;, - 0.844967; 0.243511;, - 0.844795; 0.187365;, - 0.865849; 0.187300;, - 0.866022; 0.243447;, - 0.686217; 0.108238;, - 0.686208; 0.062769;, - 0.708005; 0.062765;, - 0.708014; 0.108234;, - 0.852760; 0.871007;, - 0.852588; 0.814861;, - 0.873705; 0.814796;, - 0.873876; 0.870942;, - 0.678047; 0.794009;, - 0.668608; 0.788559;, - 0.674058; 0.768222;, - 0.692935; 0.779120;, - 0.668608; 0.788559;, - 0.657709; 0.788559;, - 0.652260; 0.768222;, - 0.674058; 0.768222;, - 0.657709; 0.788559;, - 0.648271; 0.794009;, - 0.633383; 0.779120;, - 0.652260; 0.768222;, - 0.648271; 0.794009;, - 0.642821; 0.803447;, - 0.622484; 0.797998;, - 0.633383; 0.779120;, - 0.642821; 0.803447;, - 0.642821; 0.814346;, - 0.622484; 0.819796;, - 0.622484; 0.797998;, - 0.642821; 0.814346;, - 0.648271; 0.823785;, - 0.633383; 0.838673;, - 0.622484; 0.819796;, - 0.648271; 0.823785;, - 0.657710; 0.829234;, - 0.652260; 0.849572;, - 0.633383; 0.838673;, - 0.657710; 0.829234;, - 0.668608; 0.829234;, - 0.674058; 0.849572;, - 0.652260; 0.849572;, - 0.668608; 0.829234;, - 0.678047; 0.823785;, - 0.692935; 0.838673;, - 0.674058; 0.849572;, - 0.678047; 0.823785;, - 0.683496; 0.814346;, - 0.703834; 0.819796;, - 0.692935; 0.838673;, - 0.683496; 0.814346;, - 0.683496; 0.803447;, - 0.703834; 0.797998;, - 0.703834; 0.819796;, - 0.683496; 0.803447;, - 0.678047; 0.794009;, - 0.692935; 0.779120;, - 0.703834; 0.797998;, - 0.980157; 0.432160;, - 0.980154; 0.466973;, - 0.970255; 0.465826;, - 0.980157; 0.432160;, - 0.970255; 0.465826;, - 0.960404; 0.461164;, - 0.980157; 0.432160;, - 0.960404; 0.461164;, - 0.953239; 0.454237;, - 0.975350; 0.223366;, - 0.948433; 0.201289;, - 0.955597; 0.194362;, - 0.975350; 0.223366;, - 0.955597; 0.194362;, - 0.965448; 0.189700;, - 0.975350; 0.223366;, - 0.965448; 0.189700;, - 0.975347; 0.188553;, - 0.952240; 0.761621;, - 0.952242; 0.726808;, - 0.962142; 0.727956;, - 0.952240; 0.761621;, - 0.962142; 0.727956;, - 0.971993; 0.732617;, - 0.952240; 0.761621;, - 0.971993; 0.732617;, - 0.979157; 0.739545;, - 0.728511; 0.032692;, - 0.755428; 0.054769;, - 0.748264; 0.061696;, - 0.728511; 0.032692;, - 0.748264; 0.061696;, - 0.738413; 0.066358;, - 0.728511; 0.032692;, - 0.738413; 0.066358;, - 0.728513; 0.067505;, - 0.438776; 0.754098;, - 0.438562; 0.683915;, - 0.466505; 0.641720;, - 0.466848; 0.754012;, - 0.438562; 0.683915;, - 0.438304; 0.599696;, - 0.466505; 0.641720;, - 0.438304; 0.599696;, - 0.438090; 0.529513;, - 0.466161; 0.529427;, - 0.466505; 0.641720;, - 0.438368; 0.838491;, - 0.438583; 0.768307;, - 0.467364; 0.768396;, - 0.467019; 0.880689;, - 0.467019; 0.880689;, - 0.438110; 0.922710;, - 0.438368; 0.838491;, - 0.467019; 0.880689;, - 0.466675; 0.992982;, - 0.437895; 0.992893;, - 0.438110; 0.922710;, - 0.584555; 0.206882;, - 0.584296; 0.291102;, - 0.570260; 0.291059;, - 0.570518; 0.206839;, - 0.675668; 0.992943;, - 0.663099; 0.967854;, - 0.675656; 0.961582;, - 0.410378; 0.824368;, - 0.410550; 0.768222;, - 0.438583; 0.768307;, - 0.438368; 0.838491;, - 0.410548; 0.754185;, - 0.410377; 0.698038;, - 0.438562; 0.683915;, - 0.438776; 0.754098;, - 0.200331; 0.358122;, - 0.200318; 0.389483;, - 0.187761; 0.383211;, - 0.409861; 0.992807;, - 0.410033; 0.936661;, - 0.438110; 0.922710;, - 0.437895; 0.992893;, - 0.410033; 0.585745;, - 0.409861; 0.529599;, - 0.438090; 0.529513;, - 0.438304; 0.599696;, - 0.137374; 0.060510;, - 0.149920; 0.035396;, - 0.149932; 0.066783;, - 0.137386; 0.091897;, - 0.980011; 0.297930;, - 0.979999; 0.329317;, - 0.967454; 0.304202;, - 0.967466; 0.272815;, - 0.073442; 0.786876;, - 0.128407; 0.775417;, - 0.171377; 0.981522;, - 0.116413; 0.992982;, - 0.122613; 0.119155;, - 0.094540; 0.119069;, - 0.094712; 0.062922;, - 0.122785; 0.063008;, - 0.311435; 0.932090;, - 0.255711; 0.938963;, - 0.256081; 0.712629;, - 0.285661; 0.723124;, - 0.185950; 0.766647;, - 0.241674; 0.773520;, - 0.215900; 0.982487;, - 0.186320; 0.992982;, - 0.939030; 0.488307;, - 0.911000; 0.474184;, - 0.911086; 0.446111;, - 0.939203; 0.432160;, - 0.007018; 0.743374;, - 0.027607; 0.567031;, - 0.082572; 0.555571;, - 0.171913; 0.708996;, - 0.607420; 0.529636;, - 0.607214; 0.585795;, - 0.551068; 0.585623;, - 0.551273; 0.529464;, - 0.481606; 0.992943;, - 0.481400; 0.936784;, - 0.537547; 0.936611;, - 0.537752; 0.992770;, - 0.367579; 0.589952;, - 0.395144; 0.755998;, - 0.325472; 0.589076;, - 0.367579; 0.936082;, - 0.325472; 0.936958;, - 0.395143; 0.770035;, - 0.662295; 0.529464;, - 0.662287; 0.703080;, - 0.621456; 0.577103;, - 0.611910; 0.121571;, - 0.641508; 0.069893;, - 0.651610; 0.121618;, - 0.466840; 0.341774;, - 0.466848; 0.515390;, - 0.426009; 0.467751;, - 0.451213; 0.133963;, - 0.411513; 0.134011;, - 0.421615; 0.082286;, - 0.257449; 0.351389;, - 0.271313; 0.407499;, - 0.215167; 0.407327;, - 0.229375; 0.351303;, - 0.215167; 0.407327;, - 0.271313; 0.407499;, - 0.256945; 0.515856;, - 0.228871; 0.515770;, - 0.339680; 0.992982;, - 0.325472; 0.936958;, - 0.367579; 0.936082;, - 0.381790; 0.992852;, - 0.367579; 0.589952;, - 0.325472; 0.589076;, - 0.339680; 0.533052;, - 0.381790; 0.533181;, - 0.676332; 0.675817;, - 0.696183; 0.655966;, - 0.716034; 0.675817;, - 0.696183; 0.695668;, - 0.676332; 0.675817;, - 0.696183; 0.695668;, - 0.676332; 0.715518;, - 0.696183; 0.655966;, - 0.735885; 0.655966;, - 0.716034; 0.675817;, - 0.480885; 0.527547;, - 0.537031; 0.527720;, - 0.522300; 0.754185;, - 0.494227; 0.754099;, - 0.537293; 0.386472;, - 0.536738; 0.187219;, - 0.556223; 0.191009;, - 0.830203; 0.386489;, - 0.811273; 0.191025;, - 0.830758; 0.187236;, - 0.367579; 0.936082;, - 0.395653; 0.935995;, - 0.395825; 0.992062;, - 0.381790; 0.992852;, - 0.395653; 0.590038;, - 0.367579; 0.589952;, - 0.381790; 0.533181;, - 0.395824; 0.533971;, - 0.063257; 0.246421;, - 0.063602; 0.358714;, - 0.007455; 0.358886;, - 0.007283; 0.302740;, - 0.732651; 0.529636;, - 0.732306; 0.641929;, - 0.676332; 0.585610;, - 0.676504; 0.529464;, - 0.744801; 0.291098;, - 0.722067; 0.291102;, - 0.722051; 0.211699;, - 0.744786; 0.211694;, - 0.755736; 0.715518;, - 0.735885; 0.735369;, - 0.696183; 0.695668;, - 0.716034; 0.675817;, - 0.171569; 0.288466;, - 0.143496; 0.288380;, - 0.143840; 0.176246;, - 0.171913; 0.176332;, - 0.257424; 0.241793;, - 0.229351; 0.241880;, - 0.215167; 0.185767;, - 0.271313; 0.185594;, - 0.112083; 0.190102;, - 0.091028; 0.190037;, - 0.080675; 0.133191;, - 0.122785; 0.133320;, - 0.031848; 0.078002;, - 0.052903; 0.077938;, - 0.063602; 0.133892;, - 0.021492; 0.134020;, - 0.206730; 0.712629;, - 0.234592; 0.716065;, - 0.241674; 0.773520;, - 0.185950; 0.766647;, - 0.613885; 0.964869;, - 0.613798; 0.992943;, - 0.592743; 0.992878;, - 0.592830; 0.964805;, - 0.640908; 0.192565;, - 0.619853; 0.192501;, - 0.609500; 0.135655;, - 0.651610; 0.135784;, - 0.353862; 0.212941;, - 0.381935; 0.213027;, - 0.395824; 0.269226;, - 0.339678; 0.269053;, - 0.475606; 0.077992;, - 0.496660; 0.077928;, - 0.507359; 0.133882;, - 0.465249; 0.134011;, - 0.304353; 0.989545;, - 0.276491; 0.992982;, - 0.255711; 0.938963;, - 0.311435; 0.932090;, - 0.628007; 0.992943;, - 0.627921; 0.964869;, - 0.648976; 0.964805;, - 0.649062; 0.992878;, - 0.537547; 0.936611;, - 0.481400; 0.936784;, - 0.509125; 0.768320;, - 0.537164; 0.768222;, - 0.578792; 0.754086;, - 0.551068; 0.585623;, - 0.607214; 0.585795;, - 0.606832; 0.754185;, - 0.032218; 0.795471;, - 0.007018; 0.743374;, - 0.073442; 0.786876;, - 0.171913; 0.708996;, - 0.169631; 0.766822;, - 0.128407; 0.775417;, - 0.073442; 0.786876;, - 0.007018; 0.743374;, - 0.171913; 0.708996;, - 0.128407; 0.775417;, - 0.214995; 0.127170;, - 0.214876; 0.171558;, - 0.201666; 0.131573;, - 0.201785; 0.087185;, - 0.651610; 0.290973;, - 0.609500; 0.291102;, - 0.616389; 0.248973;, - 0.651481; 0.248866;, - 0.651481; 0.248866;, - 0.616389; 0.248973;, - 0.609242; 0.206731;, - 0.651352; 0.206602;, - 0.270926; 0.656482;, - 0.270797; 0.698592;, - 0.228000; 0.698461;, - 0.228258; 0.614241;, - 0.228258; 0.614241;, - 0.228000; 0.698461;, - 0.185950; 0.698332;, - 0.186079; 0.656222;, - 0.840705; 0.432160;, - 0.840573; 0.568431;, - 0.828314; 0.525782;, - 0.804501; 0.491044;, - 0.784846; 0.292868;, - 0.797105; 0.250218;, - 0.797236; 0.386489;, - 0.761033; 0.327606;, - 0.793585; 0.641748;, - 0.805844; 0.599098;, - 0.805975; 0.735369;, - 0.769772; 0.676486;, - 0.838551; 0.814732;, - 0.838420; 0.951003;, - 0.826161; 0.908353;, - 0.802348; 0.873615;, - 0.164766; 0.344788;, - 0.094583; 0.345003;, - 0.087435; 0.302760;, - 0.171655; 0.302503;, - 0.186337; 0.572002;, - 0.228258; 0.614241;, - 0.186079; 0.656222;, - 0.087693; 0.387131;, - 0.094583; 0.345003;, - 0.164766; 0.344788;, - 0.171913; 0.386874;, - 0.228258; 0.614241;, - 0.271184; 0.572263;, - 0.270926; 0.656482;, - 0.271184; 0.572263;, - 0.228258; 0.614241;, - 0.228516; 0.530021;, - 0.271313; 0.530153;, - 0.186466; 0.529893;, - 0.228516; 0.530021;, - 0.228258; 0.614241;, - 0.186337; 0.572002;, - 0.700867; 0.248887;, - 0.708014; 0.290973;, - 0.665905; 0.291102;, - 0.665776; 0.248995;, - 0.665776; 0.248995;, - 0.665646; 0.206731;, - 0.707756; 0.206602;, - 0.700867; 0.248887;, - 0.722051; 0.153270;, - 0.735260; 0.113285;, - 0.735379; 0.157673;, - 0.722170; 0.197657;, - 0.600036; 0.386489;, - 0.581158; 0.375590;, - 0.610935; 0.345814;, - 0.621834; 0.386489;, - 0.600036; 0.386489;, - 0.610935; 0.345814;, - 0.640711; 0.375590;, - 0.621834; 0.386489;, - 0.610935; 0.345814;, - 0.651610; 0.356713;, - 0.640711; 0.375590;, - 0.610935; 0.345814;, - 0.651610; 0.334915;, - 0.651610; 0.356713;, - 0.610935; 0.345814;, - 0.640711; 0.316038;, - 0.651610; 0.334915;, - 0.610935; 0.345814;, - 0.621834; 0.305139;, - 0.640711; 0.316038;, - 0.610935; 0.345814;, - 0.600036; 0.305139;, - 0.621834; 0.305139;, - 0.610935; 0.345814;, - 0.581158; 0.316037;, - 0.600036; 0.305139;, - 0.610935; 0.345814;, - 0.570260; 0.334915;, - 0.581158; 0.316037;, - 0.610935; 0.345814;, - 0.570260; 0.356713;, - 0.570260; 0.334915;, - 0.610935; 0.345814;, - 0.610935; 0.345814;, - 0.581158; 0.375590;, - 0.570260; 0.356713;, - 0.896964; 0.432289;, - 0.896791; 0.488436;, - 0.875466; 0.488370;, - 0.875638; 0.432224;, - 0.968762; 0.814736;, - 0.968753; 0.860205;, - 0.946955; 0.860201;, - 0.946964; 0.814732;, - 0.557965; 0.116971;, - 0.557793; 0.173118;, - 0.536738; 0.173053;, - 0.536910; 0.116907;, - 0.579020; 0.117036;, - 0.578848; 0.173182;, - 0.557793; 0.173118;, - 0.557965; 0.116971;, - 0.964779; 0.667303;, - 0.964770; 0.712772;, - 0.942973; 0.712767;, - 0.942982; 0.667298;, - 0.873876; 0.950938;, - 0.873705; 0.894792;, - 0.894695; 0.894728;, - 0.894867; 0.950874;, - 0.852760; 0.951003;, - 0.852588; 0.894856;, - 0.873705; 0.894792;, - 0.873876; 0.950938;, - 0.961087; 0.502472;, - 0.961096; 0.547941;, - 0.939298; 0.547946;, - 0.939289; 0.502477;, - 0.869657; 0.599163;, - 0.869829; 0.655309;, - 0.848774; 0.655374;, - 0.848602; 0.599227;, - 0.890712; 0.599098;, - 0.890884; 0.655245;, - 0.869829; 0.655309;, - 0.869657; 0.599163;, - 0.853546; 0.057414;, - 0.853555; 0.102883;, - 0.831757; 0.102887;, - 0.831748; 0.057418;, - 0.854741; 0.488307;, - 0.854913; 0.432160;, - 0.875638; 0.432224;, - 0.875466; 0.488370;, - 0.215750; 0.281703;, - 0.210301; 0.291142;, - 0.189963; 0.285693;, - 0.200862; 0.266815;, - 0.210301; 0.291142;, - 0.210301; 0.302041;, - 0.189963; 0.307490;, - 0.189963; 0.285693;, - 0.210301; 0.302041;, - 0.215750; 0.311480;, - 0.200862; 0.326368;, - 0.189963; 0.307490;, - 0.215750; 0.311480;, - 0.225189; 0.316929;, - 0.219740; 0.337267;, - 0.200862; 0.326368;, - 0.225189; 0.316929;, - 0.236088; 0.316929;, - 0.241537; 0.337267;, - 0.219740; 0.337267;, - 0.236088; 0.316929;, - 0.245526; 0.311480;, - 0.260415; 0.326368;, - 0.241537; 0.337267;, - 0.245526; 0.311480;, - 0.250976; 0.302041;, - 0.271313; 0.307490;, - 0.260415; 0.326368;, - 0.250976; 0.302041;, - 0.250976; 0.291142;, - 0.271313; 0.285692;, - 0.271313; 0.307490;, - 0.250976; 0.291142;, - 0.245526; 0.281703;, - 0.260415; 0.266815;, - 0.271313; 0.285692;, - 0.245526; 0.281703;, - 0.236088; 0.276254;, - 0.241537; 0.255916;, - 0.260415; 0.266815;, - 0.236088; 0.276254;, - 0.225189; 0.276254;, - 0.219739; 0.255916;, - 0.241537; 0.255916;, - 0.225189; 0.276254;, - 0.215750; 0.281703;, - 0.200862; 0.266815;, - 0.219739; 0.255916;, - 0.480441; 0.063891;, - 0.480444; 0.029078;, - 0.490343; 0.030225;, - 0.480441; 0.063891;, - 0.490343; 0.030225;, - 0.500195; 0.034887;, - 0.480441; 0.063891;, - 0.500195; 0.034887;, - 0.507359; 0.041814;, - 0.480885; 0.351659;, - 0.507802; 0.373736;, - 0.500638; 0.380663;, - 0.480885; 0.351659;, - 0.500638; 0.380663;, - 0.490787; 0.385325;, - 0.480885; 0.351659;, - 0.490787; 0.385325;, - 0.480887; 0.386472;, - 0.328166; 0.017458;, - 0.328164; 0.052271;, - 0.318264; 0.051124;, - 0.328166; 0.017458;, - 0.318264; 0.051124;, - 0.308413; 0.046462;, - 0.328166; 0.017458;, - 0.308413; 0.046462;, - 0.301249; 0.039535;, - 0.578707; 0.992943;, - 0.551789; 0.970866;, - 0.558953; 0.963939;, - 0.578707; 0.992943;, - 0.558953; 0.963939;, - 0.568805; 0.959277;, - 0.578707; 0.992943;, - 0.568805; 0.959277;, - 0.578704; 0.958129;, - 0.344250; 0.364613;, - 0.325373; 0.353714;, - 0.355149; 0.323938;, - 0.366048; 0.364613;, - 0.344250; 0.364613;, - 0.355149; 0.323938;, - 0.384926; 0.353714;, - 0.366048; 0.364613;, - 0.355149; 0.323938;, - 0.395824; 0.334836;, - 0.384926; 0.353714;, - 0.355149; 0.323938;, - 0.395824; 0.313039;, - 0.395824; 0.334836;, - 0.355149; 0.323938;, - 0.384926; 0.294161;, - 0.395824; 0.313039;, - 0.355149; 0.323938;, - 0.366048; 0.283262;, - 0.384926; 0.294161;, - 0.355149; 0.323938;, - 0.344250; 0.283262;, - 0.366048; 0.283262;, - 0.355149; 0.323938;, - 0.325373; 0.294161;, - 0.344250; 0.283262;, - 0.355149; 0.323938;, - 0.314474; 0.313039;, - 0.325373; 0.294161;, - 0.355149; 0.323938;, - 0.314474; 0.334836;, - 0.314474; 0.313039;, - 0.355149; 0.323938;, - 0.355149; 0.323938;, - 0.325373; 0.353714;, - 0.314474; 0.334836;, - 0.896964; 0.512285;, - 0.896791; 0.568431;, - 0.875466; 0.568366;, - 0.875638; 0.512220;, - 0.968762; 0.882936;, - 0.968753; 0.928405;, - 0.946955; 0.928401;, - 0.946964; 0.882932;, - 0.307111; 0.125882;, - 0.306939; 0.182029;, - 0.285884; 0.181964;, - 0.286056; 0.125818;, - 0.328166; 0.125947;, - 0.327994; 0.182094;, - 0.306939; 0.182029;, - 0.307111; 0.125882;, - 0.960972; 0.357083;, - 0.960963; 0.402552;, - 0.939166; 0.402547;, - 0.939174; 0.357078;, - 0.869890; 0.767516;, - 0.869719; 0.711369;, - 0.890709; 0.711305;, - 0.890881; 0.767452;, - 0.848774; 0.767581;, - 0.848602; 0.711434;, - 0.869719; 0.711369;, - 0.869890; 0.767516;, - 0.579011; 0.057397;, - 0.579020; 0.102866;, - 0.557222; 0.102870;, - 0.557213; 0.057401;, - 0.865849; 0.259966;, - 0.866022; 0.316112;, - 0.844967; 0.316177;, - 0.844795; 0.260030;, - 0.886904; 0.259901;, - 0.887077; 0.316048;, - 0.866022; 0.316112;, - 0.865849; 0.259966;, - 0.889390; 0.057414;, - 0.889398; 0.102883;, - 0.867601; 0.102887;, - 0.867592; 0.057418;, - 0.854741; 0.568303;, - 0.854913; 0.512156;, - 0.875638; 0.512220;, - 0.875466; 0.568366;, - 0.685343; 0.457947;, - 0.679893; 0.467386;, - 0.659556; 0.461937;, - 0.670455; 0.443059;, - 0.679893; 0.467386;, - 0.679893; 0.478285;, - 0.659556; 0.483735;, - 0.659556; 0.461937;, - 0.679893; 0.478285;, - 0.685343; 0.487724;, - 0.670455; 0.502612;, - 0.659556; 0.483735;, - 0.685343; 0.487724;, - 0.694781; 0.493173;, - 0.689332; 0.513511;, - 0.670455; 0.502612;, - 0.694781; 0.493173;, - 0.705680; 0.493173;, - 0.711130; 0.513511;, - 0.689332; 0.513511;, - 0.705680; 0.493173;, - 0.715119; 0.487724;, - 0.730007; 0.502612;, - 0.711130; 0.513511;, - 0.715119; 0.487724;, - 0.720568; 0.478285;, - 0.740906; 0.483734;, - 0.730007; 0.502612;, - 0.720568; 0.478285;, - 0.720568; 0.467386;, - 0.740906; 0.461937;, - 0.740906; 0.483734;, - 0.720568; 0.467386;, - 0.715119; 0.457947;, - 0.730007; 0.443059;, - 0.740906; 0.461937;, - 0.715119; 0.457947;, - 0.705680; 0.452498;, - 0.711130; 0.432160;, - 0.730007; 0.443059;, - 0.705680; 0.452498;, - 0.694781; 0.452498;, - 0.689332; 0.432160;, - 0.711130; 0.432160;, - 0.694781; 0.452498;, - 0.685343; 0.457947;, - 0.670455; 0.443059;, - 0.689332; 0.432160;, - 0.624692; 0.055857;, - 0.624695; 0.021043;, - 0.634594; 0.022191;, - 0.624692; 0.055857;, - 0.634594; 0.022191;, - 0.644445; 0.026853;, - 0.624692; 0.055857;, - 0.644445; 0.026853;, - 0.651610; 0.033780;, - 0.424295; 0.033436;, - 0.451212; 0.055513;, - 0.444048; 0.062440;, - 0.424295; 0.033436;, - 0.444048; 0.062440;, - 0.434197; 0.067102;, - 0.424295; 0.033436;, - 0.434197; 0.067102;, - 0.424298; 0.068249;, - 0.969790; 0.019366;, - 0.969787; 0.054179;, - 0.959888; 0.053032;, - 0.969790; 0.019366;, - 0.959888; 0.053032;, - 0.950037; 0.048370;, - 0.969790; 0.019366;, - 0.950037; 0.048370;, - 0.942872; 0.041443;, - 0.648374; 0.754185;, - 0.621456; 0.732108;, - 0.628621; 0.725181;, - 0.648374; 0.754185;, - 0.628621; 0.725181;, - 0.638472; 0.720519;, - 0.648374; 0.754185;, - 0.638472; 0.720519;, - 0.648371; 0.719372;; - } //End of Cube_001 UV Coordinates - } // End of _0002 mesh - } // End of _0002 -} // End of Root diff --git a/mods/vehicle_mash/settingtypes.txt b/mods/vehicle_mash/settingtypes.txt index f5674435..0bb73562 100644 --- a/mods/vehicle_mash/settingtypes.txt +++ b/mods/vehicle_mash/settingtypes.txt @@ -7,6 +7,8 @@ vehicle_mash.enable_crafts (Allows crafting vehicles) bool true # for registering vehicles, somebody may use this option in their server. vehicle_mash.api_mode (Disables all vehicles and only enables API functions) bool false +vehicle_mash.player_api_fix (Fix eyeheight when using cars) bool true + # CAR01's cars vehicle_mash.enable_black_car (Enables black car) bool true diff --git a/mods/vehicle_mash/template.lua b/mods/vehicle_mash/template.lua index 1cc8cf66..4caf4c7c 100644 --- a/mods/vehicle_mash/template.lua +++ b/mods/vehicle_mash/template.lua @@ -9,25 +9,30 @@ local definition = { can_fly = false, -- if enabled, the specified vehicle will be able to fly around can_go_down = false, -- applies only when `can_fly` is enabled can_go_up = false, -- applies only when `can_fly` is enabled - player_rotation = {x=0,y=0,z=0}, -- rotate player so they sit facing the correct direction - driver_attach_at = {x=0,y=0,z=0}, -- attach the driver at - driver_eye_offset = {x=0, y=0, z=0}, -- offset for first person driver view - number_of_passengers = 0, -- maximum number of passengers. Can have 3 passengers maximum - passenger_attach_at = {x=0,y=0,z=0}, -- attach the 1st passenger, if applicable, at the specified positions - passenger_eye_offset = {x=0, y=0, z=0}, -- offset for the 1st passenger in first-person view - passenger_detach_pos_offset = {x=0,y=0,z=0}, -- offset for the 1st passenger when they leave the vehicle + player_rotation = vector.new(0,0,0), -- rotate player so they sit facing the correct direction + driver_attach_at = vector.new(0,0,0), -- attach the driver at + driver_eye_offset = vector.new(0,0,0), -- offset for first person driver view + number_of_passengers = 0, -- maximum number of passengers. Can have 3 passengers maximum - passenger2_attach_at = {x=0,y=0,z=0}, -- attach the 2nd passenger, if applicable, at the specified positions - passenger2_eye_offset = {x=0,y=0,z=0}, -- offset for the 2nd passenger in first-person view - passenger2_detach_pos_offset = {x=0,y=0,z=0}, -- offset for the 2nd passenger when they leave the vehicle - - passenger3_attach_at = {x=0,y=0,z=0}, -- attach the 3rd passenger, if applicable, at the specified positions - passenger3_eye_offset = {x=0,y=0,z=0}, -- offset for the 3rd passenger in first-person view - passenger3_detach_pos_offset = {x=0,y=0,z=0}, -- offset for the 3rd passenger when they leave the vehicle + -- Attachment positions and offset for all passengers (can be over 3 passengers) + passengers = { + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + { + attach_at = vector.new(0,0,0), + eye_offset = vector.new(0,0,0), + }, + }, inventory_image = "filename.png", -- image to use in inventory wield_image = "filename.png", -- image to use in hand - wield_scale = {x=1, y=1, z=1}, -- + wield_scale = vector.new(1,1,1), -- the size of the item in hand visual = "mesh", -- what type of object (mesh, cube, etc...) mesh = "filename.ext", -- mesh model to use textures = {"filename.png"}, -- mesh texture(s) @@ -41,7 +46,11 @@ local definition = { braking = 2, -- how fast can the vehicle stop turn_speed = 2, -- how quick can the vehicle turn drop_on_destroy = {""}, -- what gets dropped when vehicle is destroyed - recipe = {} -- crafting recipe + recipe = {}, -- crafting recipe + -- HP/Armor stuff. + min_hp = 1, + max_hp = 10, + armor = 25 } -- nothing to change down here diff --git a/mods/vehicle_mash/textures/car_126r.png b/mods/vehicle_mash/textures/car_126r.png deleted file mode 100644 index 10284875..00000000 Binary files a/mods/vehicle_mash/textures/car_126r.png and /dev/null differ diff --git a/mods/vehicle_mash/textures/car_126r_inventory.png b/mods/vehicle_mash/textures/car_126r_inventory.png deleted file mode 100755 index df63f729..00000000 Binary files a/mods/vehicle_mash/textures/car_126r_inventory.png and /dev/null differ diff --git a/mods/vehicle_mash/textures/car_126r_wield.png b/mods/vehicle_mash/textures/car_126r_wield.png deleted file mode 100755 index df63f729..00000000 Binary files a/mods/vehicle_mash/textures/car_126r_wield.png and /dev/null differ diff --git a/mods/vehicle_mash/textures/car_f1.png b/mods/vehicle_mash/textures/car_f1.png deleted file mode 100644 index 99c968a2..00000000 Binary files a/mods/vehicle_mash/textures/car_f1.png and /dev/null differ diff --git a/mods/vehicle_mash/textures/car_f1_inventory.png b/mods/vehicle_mash/textures/car_f1_inventory.png deleted file mode 100755 index a3b4bcf5..00000000 Binary files a/mods/vehicle_mash/textures/car_f1_inventory.png and /dev/null differ diff --git a/mods/vehicle_mash/textures/car_f1_wield.png b/mods/vehicle_mash/textures/car_f1_wield.png deleted file mode 100755 index fc0e0503..00000000 Binary files a/mods/vehicle_mash/textures/car_f1_wield.png and /dev/null differ diff --git a/mods/windmill/README.md b/mods/windmill/README.md index 2b9e2ed1..3804ce3b 100644 --- a/mods/windmill/README.md +++ b/mods/windmill/README.md @@ -1,27 +1,55 @@ +# Windmill for Minetest +[![download](https://img.shields.io/github/tag/Sokomine/windmill.svg?style=flat-square&label=release)](https://github.com/Sokomine/windmill/archive/master.zip) +[![git](https://img.shields.io/badge/git-project-green.svg?style=flat-square)](https://github.com/Sokomine/windmill) +[![forum](https://img.shields.io/badge/minetest-mod-green.svg?style=flat-square)](http://forum.minetest.net/viewtopic.php?f=11&t=7440) +[![bower](https://img.shields.io/badge/bower-mod-green.svg?style=flat-square)](https://minetest-bower.herokuapp.com/mods/windmil) + + +## Description + +animated windmill wings and watermill wheel (upcoming); uses signlike drawtype + + +## Project Resources + +* [Download](https://github.com/Sokomine/windmill/archive/master.zip) +* [Project](https://github.com/Sokomine/windmill) +* [Forum](http://forum.minetest.net/viewtopic.php?f=11&t=7440) +* [Bower](https://minetest-bower.herokuapp.com/mods/windmil) + + +## Information This works only with latest git of Minetest (ass of 16.10.13). With older versions, you'll only see a one node large rotor. -Crafting: MATERIAL -nothing- MATERIAL - stick - MATERIAL -nothing- MATERIAL +Crafting: + +``` +MATERIAL -nothing- MATERIAL + stick +MATERIAL -nothing- MATERIAL +``` With MATERIAL beeing - steel ingot for 4-blade windmill - homedecor plastic sheet for 3-blade turbine - white wool for historic windmill sails - wood for historic windmill without sails (rotates very slowly) - stick for us-style farm windmill +* steel ingot for 4-blade windmill +* homedecor plastic sheet for 3-blade turbine +* white wool for historic windmill sails +* wood for historic windmill without sails (rotates very slowly) +* stick for us-style farm windmill Clockwise- and counterclockwise rotating rotors can be crafted into each other. The axis is mostly a decorative node to which you can attach your mill rotors. - -Axis: steel_ingot stick steel_ingot +Axis: -Liscences: for code (written by Sokomine): WTFPL (it's really only a demonstration) +``` +steel_ingot stick steel_ingot +``` + +Licenses: for code (written by Sokomine): WTFPL (it's really only a demonstration) for textures (created by VanessaE): WTFPL diff --git a/mods/windmill/bower.json b/mods/windmill/bower.json new file mode 100644 index 00000000..bb9b7b4c --- /dev/null +++ b/mods/windmill/bower.json @@ -0,0 +1,16 @@ +{ + "name": "windmil", + "description": "animated windmill wings and watermill wheel (upcoming); uses signlike drawtype", + "keywords": [ + "windmil" + ], + "homepage": "https://github.com/Sokomine/windmill", + "forum": "http://forum.minetest.net/viewtopic.php?f=11&t=7440", + "screenshots": [ + "https://cloud.githubusercontent.com/assets/51875/9275464/6afaedba-42dc-11e5-9fca-524199cb0c3a.png", + "https://cloud.githubusercontent.com/assets/51875/9275478/7813ccc4-42dc-11e5-8422-e1fb9d0e4631.png" + ], + "authors": [ + "Sokomine" + ] +} diff --git a/mods/windmill/mod.conf b/mods/windmill/mod.conf new file mode 100644 index 00000000..b769f5c3 --- /dev/null +++ b/mods/windmill/mod.conf @@ -0,0 +1,4 @@ +name = windmill +description = adds rotating blades and sails and an API to create them +author = Sokomine +title = rotating windmill sails diff --git a/mods/wine/README.md b/mods/wine/README.md index c2cca5e5..826f542e 100644 --- a/mods/wine/README.md +++ b/mods/wine/README.md @@ -27,18 +27,41 @@ Change log: re-arranged code, tweaked lucky blocks, updated translations - 1.7 - Added more uses for blue agave (fuel, paper, food, agave syrup) - 1.8 - Added glass and bottles for Champagne, Brandy and Coffee Liquor (thanks Felfa) +- 1.9 - Added wine:add_drink() function to create drink glasses and bottles +- 1.95 - Tweaked code to accept 2 item recipes, fixed mineclone2 rum recipe and ui recipes +- 1.98 - New formspec textures and Kefir drink by Sirrobzeroone +- 1.99 - Barrel now has 4 slots for recipe items (and drinking glasses) and a water slot to fill up barrel with water buckets ready for fermenting, fix mineclone2 compatibility, added translations, added cointreau and margarita (thx Ethace10 for idea) -Lucky Blocks: 18 +Lucky Blocks: 24 Wine Mod API ------------ -wine:add_item(list) +wine:add_item(item_table) e.g. wine:add_item({ + -- simple recipe automatically add drinking glasses {"farming:barley", "wine:glass_beer"}, - {"default:apple", "wine:glass_cider"}, + -- 2x apples make 1x glass cider + {"default:apple 2", "wine:glass_cider"}, + -- specific recipe has to include drinking glass if needed + {{"default:apple", "farming:sugar", "vessels:drinking_glass"}, "wine:glass_sparkling_apple}, }) + + +wine:add_drink(name, desc, has_bottle, num_hunger, num_thirst, alcoholic) + +e.g. + +wine:add_drink("beer", "Beer", true, 2, 8, 1) +wine:add_drink("cider", "Cider", true, 2, 6, 1) +wine:add_drink("kefir", "Kefir", true, 4, 4, 0) -- non alcoholic + + +Note: + +Textures used will be wine_beer_glass.png wine_beer_bottle.png and num_thirst is only +used if thirst mod is active, alcoholic is used if stamina mod is active for drunk effect. diff --git a/mods/wine/agave.lua b/mods/wine/agave.lua new file mode 100644 index 00000000..701c4179 --- /dev/null +++ b/mods/wine/agave.lua @@ -0,0 +1,156 @@ + +-- check available mods for default sound and sand node +local def = minetest.get_modpath("default") +local sand = "default:desert_sand" +local snd_l = def and default.node_sound_leaves_defaults() + +if minetest.get_modpath("mcl_core") then + sand = "mcl_core:sand" + snd_l = mcl_sounds.node_sound_leaves_defaults() +end + +local S = wine.S + + +-- blue agave +minetest.register_node("wine:blue_agave", { + description = S("Blue Agave"), + drawtype = "plantlike", + visual_scale = 0.8, + tiles = {"wine_blue_agave.png"}, + inventory_image = "wine_blue_agave.png", + wield_image = "wine_blue_agave.png", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2} + }, + groups = {snappy = 3, attached_node = 1, plant = 1}, + sounds = snd_l, + + on_use = minetest.item_eat(2), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(17) + end, + + on_timer = function(pos) + + local light = minetest.get_node_light(pos) + + if not light or light < 13 or math.random() > 1/76 then + return true -- go to next iteration + end + + local n = minetest.find_nodes_in_area_under_air( + {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}, + {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, {"wine:blue_agave"}) + + -- too crowded, we'll wait for another iteration + if n and #n > 2 then + return true + end + + -- find desert sand with air above (grow across and down only) + n = minetest.find_nodes_in_area_under_air( + {x = pos.x + 1, y = pos.y - 1, z = pos.z + 1}, + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, {sand}) + + -- place blue agave + if n and #n > 0 then + + local new_pos = n[math.random(#n)] + + new_pos.y = new_pos.y + 1 + + minetest.set_node(new_pos, {name = "wine:blue_agave"}) + end + + return true + end +}) + +wine.add_eatable("wine:blue_agave", 2) + +-- blue agave into cyan dye +if minetest.get_modpath("mcl_dye") then + + minetest.register_craft( { + output = "mcl_dye:cyan 4", + recipe = {{"wine:blue_agave"}} + }) + +elseif minetest.get_modpath("dye") then + + minetest.register_craft( { + output = "dye:cyan 4", + recipe = {{"wine:blue_agave"}} + }) +end + +-- blue agave as fuel +minetest.register_craft({ + type = "fuel", + recipe = "wine:blue_agave", + burntime = 10 +}) + +-- cook blue agave into a sugar syrup +minetest.register_craftitem("wine:agave_syrup", { + description = S("Agave Syrup"), + inventory_image = "wine_agave_syrup.png", + groups = {food_sugar = 1, vessel = 1, flammable = 3} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 7, + output = "wine:agave_syrup 2", + recipe = "wine:blue_agave" +}) + +-- blue agave into paper +minetest.register_craft( { + output = "default:paper 3", + recipe = { + {"wine:blue_agave", "wine:blue_agave", "wine:blue_agave"} + } +}) + + +-- register blue agave on mapgen +minetest.register_decoration({ + deco_type = "simple", + place_on = {sand}, + sidelen = 16, + fill_ratio = 0.001, + biomes = {"desert"}, + decoration = {"wine:blue_agave"}, + y_min = 15, + y_max = 50, + spawn_by = sand, + num_spawn_by = 6 +}) + + +-- add lbm to start agave timers +minetest.register_lbm({ + name = "wine:agave_timer_init", + nodenames = {"wine:blue_agave"}, + run_at_every_load = false, + action = function(pos) + minetest.get_node_timer(pos):start(17) + end +}) + + +-- add to bonemeal as decoration if available +if minetest.get_modpath("bonemeal") then + + bonemeal:add_deco({ + {sand, {}, {"default:dry_shrub", "wine:blue_agave", "", ""}} + }) +end diff --git a/mods/wine/depends.txt b/mods/wine/depends.txt deleted file mode 100644 index e88565af..00000000 --- a/mods/wine/depends.txt +++ /dev/null @@ -1,12 +0,0 @@ -default? -intllib? -lucky_block? -pipeworks? -bonemeal? -mcl_core? -mcl_sounds? -mcl_loot? -doc? -unified_inventory? -thirsty? -farming? diff --git a/mods/wine/drinks.lua b/mods/wine/drinks.lua new file mode 100644 index 00000000..eaf6d007 --- /dev/null +++ b/mods/wine/drinks.lua @@ -0,0 +1,157 @@ +-- add all drinks even if mods to brew them aren't active +-- (name, desc, has bottle, hunger, thirst, alcoholic) +wine:add_drink("wine", "Wine", true, 2, 5, 1) +wine:add_drink("beer", "Beer", true, 2, 8, 1) +wine:add_drink("rum", "Rum", true, 2, 5, 1) +wine:add_drink("tequila", "Tequila", true, 2, 3, 1) +wine:add_drink("wheat_beer", "Wheat Beer", true, 2, 8, 1) +wine:add_drink("sake", "Sake", true, 2, 3, 1) +wine:add_drink("bourbon", "Bourbon", true, 2, 3, 1) +wine:add_drink("vodka", "Vodka", true, 2, 3, 1) +wine:add_drink("cider", "Cider", true, 2, 6, 1) +wine:add_drink("mead", "Honey-Mead", true, 4, 5, 1) +wine:add_drink("mint", "Mint Julep", true, 4, 3, 1) +wine:add_drink("brandy", "Brandy", true, 3, 4, 1) +wine:add_drink("coffee_liquor", "Coffee Liquor", true, 3, 4, 1) +wine:add_drink("champagne", "Champagne", true, 4, 5, 1) +wine:add_drink("cointreau", "Cointreau", true, 2, 3, 1) +wine:add_drink("margarita", "Margarita", false, 4, 5, 1) +wine:add_drink("kefir", "Kefir", true, 4, 4, 0) +wine:add_drink("sparkling_agave_juice", "Sparkling Agave Juice", 2, 4, 0) +wine:add_drink("sparkling_apple_juice", "Sparkling Apple Juice", 2, 5, 0) +wine:add_drink("sparkling_carrot_juice", "Sparkling Carrot Juice", 3, 4, 0) +wine:add_drink("sparkling_blackberry_juice", "Sparkling Blackberry Juice", 2, 4, 0) + +-- brandy recipe +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "wine:glass_brandy", + recipe = "wine:glass_wine" +}) + +-- Raw champagne alias +minetest.register_alias("wine:glass_champagne_raw", "wine:glass_champagne") + +-- quick override to add wine to food group +minetest.override_item("wine:glass_wine", { + groups = { + food_wine = 1, vessel = 1, dig_immediate = 3, + attached_node = 1, alcohol = 1, drink = 1 + } +}) + +-- quick override to add brandy to food group +minetest.override_item("wine:glass_brandy", { + groups = { + food_brandy = 1, vessel = 1, dig_immediate = 3, + attached_node = 1, alcohol = 1, drink = 1 + } +}) + +-- wine mod adds tequila by default +wine:add_item({ + { + {"wine:agave_syrup", "wine:blue_agave", "vessels:drinking_glass"}, + "wine:glass_sparkling_agave_juice" + }, + {"wine:blue_agave", "wine:glass_tequila"} +}) + +-- default game +if minetest.get_modpath("default") then + + wine:add_item({ + {"default:apple", "wine:glass_cider"}, + {"default:papyrus", "wine:glass_rum"} + }) +end + +-- xdecor +if minetest.get_modpath("xdecor") then + + wine:add_item({ {"xdecor:honey", "wine:glass_mead"} }) +end + +-- mobs_animal +if minetest.get_modpath("mobs_animal") +or minetest.get_modpath("xanadu") then + + wine:add_item({ + {"mobs:honey", "wine:glass_mead"}, + {{"mobs:glass_milk", "farming:wheat"}, "wine:glass_kefir"} + }) +end + +-- farming +if minetest.get_modpath("farming") then + + wine:add_item({ {"farming:wheat", "wine:glass_wheat_beer"} }) + + if farming.mod and (farming.mod == "redo" or farming.mod == "undo") then + + -- mint julep recipe + minetest.register_craft({ + output = "wine:glass_mint", + recipe = { + {"farming:mint_leaf", "farming:mint_leaf", "farming:mint_leaf"}, + {"wine:glass_bourbon", "farming:sugar", ""} + } + }) + + wine:add_item({ + {"farming:grapes", "wine:glass_wine"}, + {"farming:barley", "wine:glass_beer"}, + {"farming:rice", "wine:glass_sake"}, + {"farming:corn", "wine:glass_bourbon"}, + {"farming:baked_potato", "wine:glass_vodka"}, + {{"wine:glass_rum", "farming:coffee_beans"}, "wine:glass_coffee_liquor"}, + {{"wine:glass_wine", "farming:sugar"}, "wine:glass_champagne"}, + { + {"default:apple", "farming:sugar", "vessels:drinking_glass"}, + "wine:glass_sparkling_apple_juice" + }, + { + {"farming:carrot", "farming:sugar", "vessels:drinking_glass"}, + "wine:glass_sparkling_carrot_juice" + }, + { + {"farming:blackberry 2", "farming:sugar", "vessels:drinking_glass"}, + "wine:glass_sparkling_blackberry_juice" + } + }) + end +end + +-- ethereal +if minetest.get_modpath("ethereal") then + + wine:add_item({ {"ethereal:orange", "wine:glass_cointreau"} }) + + -- margarita recipe + minetest.register_craft({ + output = "wine:glass_margarita 2", + recipe = { + {"wine:glass_cointreau", "wine:glass_tequila", "ethereal:lemon"} + } + }) +end + +-- mineclone2 +if minetest.get_modpath("mcl_core") then + + wine:add_item({ + {"mcl_core:apple", "wine:glass_cider"}, + {"mcl_core:reeds", "wine:glass_rum"}, + {"mcl_farming:wheat_item", "wine:glass_wheat_beer"}, + {"mcl_farming:potato_item_baked", "wine:glass_vodka"}, + { + {"mcl_core:apple", "mcl_core:sugar", "vessels:drinking_glass"}, + "wine:glass_sparkling_apple_juice" + }, + { + {"mcl_farming:carrot_item", "mcl_core:sugar", "vessels:drinking_glass"}, + "wine:glass_sparkling_carrot_juice" + } + }) +end diff --git a/mods/wine/init.lua b/mods/wine/init.lua index 7467c788..42e1685d 100644 --- a/mods/wine/init.lua +++ b/mods/wine/init.lua @@ -1,10 +1,13 @@ wine = {} +local path = minetest.get_modpath("wine") local def = minetest.get_modpath("default") +local pipe = minetest.get_modpath("pipeworks") local snd_d = def and default.node_sound_defaults() local snd_g = def and default.node_sound_glass_defaults() -local snd_l = def and default.node_sound_leaves_defaults() -local sand = "default:desert_sand" +local glass_item = def and "default:glass" +local txt +local pipes_list = pipe and pipeworks.pipes_full_nodenames or {"default:river_water_source"} -- check for MineClone2 @@ -13,88 +16,31 @@ local mcl = minetest.get_modpath("mcl_core") if mcl then snd_d = mcl_sounds.node_sound_glass_defaults() snd_g = mcl_sounds.node_sound_defaults() - snd_l = mcl_sounds.node_sound_leaves_defaults() - sand = "mcl_core:sand" + glass_item = "mcl_core:glass" end - -- check for Unified Inventory local is_uninv = minetest.global_exists("unified_inventory") or false - -- is thirsty mod active local thirsty_mod = minetest.get_modpath("thirsty") - --- Intllib support -local S -if minetest.get_translator then - S = minetest.get_translator("wine") -elseif minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s, a, ...) - if a == nil then - return s - end - a = {a, ...} - return s:gsub("(@?)@(%(?)(%d+)(%)?)", - function(e, o, n, c) - if e == ""then - return a[tonumber(n)] .. (o == "" and c or "") - else - return "@" .. o .. n .. c - end - end) - end -end - +-- translation support +local S = minetest.get_translator("wine") ; wine.S = S -- Unified Inventory hints if is_uninv then unified_inventory.register_craft_type("barrel", { description = "Barrel", - icon = 'wine_barrel.png', - width = 1, - height = 1 + icon = "wine_barrel.png", + width = 2, + height = 2 }) end - -local ferment = { - {"farming:grapes", "wine:glass_wine"}, - {"farming:barley", "wine:glass_beer"}, - {"mobs:honey", "wine:glass_mead"}, - {"xdecor:honey", "wine:glass_mead"}, -- for when xdcecor is installed - {"default:apple", "wine:glass_cider"}, - {"default:papyrus", "wine:glass_rum"}, - {"wine:blue_agave", "wine:glass_tequila"}, - {"farming:wheat", "wine:glass_wheat_beer"}, - {"farming:rice", "wine:glass_sake"}, - {"farming:corn", "wine:glass_bourbon"}, - {"farming:baked_potato", "wine:glass_vodka"}, - {"farming:coffee_beans", "wine:glass_coffee_liquor"}, - {"wine:glass_champagne_raw", "wine:glass_champagne"} -} - -if mcl then - ferment[4] = {"mcl_core:apple", "wine:glass_cider"} - ferment[5] = {"mcl_core:paper", "wine:glass_rum"} -end - - -if is_uninv then - - for _, f in pairs(ferment) do - - unified_inventory.register_craft({ - type = "barrel", - items = {f[1]}, - output = f[2] - }) - end -end +-- fermentation list (drinks added in drinks.lua) +local ferment = {} -- add item and resulting beverage to list @@ -102,47 +48,44 @@ function wine:add_item(list) for n = 1, #list do - table.insert(ferment, list[n]) + local item = list[n] + -- change old string recipe item into table + if type(item[1]) == "string" then + item = { {item[1], "vessels:drinking_glass"}, item[2] } + end + + table.insert(ferment, item) + + -- if ui mod found add recipe if is_uninv then unified_inventory.register_craft({ type = "barrel", - items = {list[n][1]}, - output = list[n][2] + items = item[1], + output = item[2] }) end end end +-- helper function +function wine.add_eatable(item, hp) --- list of beverages (name, desc, has bottle, hunger, thirst) -local beverages = { - {"wine", "Wine", true, 2, 5}, - {"beer", "Beer", true, 2, 8}, - {"rum", "Rum", true, 2, 5}, - {"tequila", "Tequila", true, 2, 3}, - {"wheat_beer", "Wheat Beer", true, 2, 8}, - {"sake", "Sake", true, 2, 3}, - {"bourbon", "Bourbon", true, 2, 3}, - {"vodka", "Vodka", true, 2, 3}, - {"cider", "Cider", true, 2, 6}, - {"mead", "Honey-Mead", true, 4, 5}, - {"mint", "Mint Julep", true, 4, 3}, - {"brandy", "Brandy", true, 3, 4}, - {"coffee_liquor", "Coffee Liquor", true, 3, 4}, - {"champagne", "Champagne", true, 4, 5} -} + local def = minetest.registered_items[item] + if def then --- create glasses and bottles -for n = 1, #beverages do + local groups = table.copy(def.groups) or {} - local name = beverages[n][1] - local desc = beverages[n][2] - local has_bottle = beverages[n][3] - local num_hunger = beverages[n][4] - local num_thirst = beverages[n][5] + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end +end + +-- add drink with bottle +function wine:add_drink(name, desc, has_bottle, num_hunger, num_thirst, alcoholic) -- glass minetest.register_node("wine:glass_" .. name, { @@ -162,9 +105,10 @@ for n = 1, #beverages do }, groups = { vessel = 1, dig_immediate = 3, - attached_node = 1, alcohol = 1, drink = 1 + attached_node = 1, drink = 1, alcohol = alcoholic }, sounds = snd_g, + on_use = function(itemstack, user, pointed_thing) if user then @@ -173,12 +117,14 @@ for n = 1, #beverages do thirsty.drink(user, num_thirst) end - return minetest.do_item_eat(num_hunger, nil, + return minetest.do_item_eat(num_hunger, "vessels:drinking_glass", itemstack, user, pointed_thing) end end }) + wine.add_eatable("wine:glass_" .. name, num_hunger) + -- bottle if has_bottle then @@ -189,6 +135,7 @@ for n = 1, #beverages do tiles = {"wine_" .. name .. "_bottle.png"}, inventory_image = "wine_" .. name .. "_bottle.png", paramtype = "light", + is_ground_content = false, sunlight_propagates = true, walkable = false, selection_box = { @@ -206,12 +153,11 @@ for n = 1, #beverages do recipe = { {glass, glass, glass}, {glass, glass, glass}, - {glass, glass, glass}, - }, + {glass, glass, glass} + } }) minetest.register_craft({ --- type = "shapeless", output = glass .. " 9", recipe = {{"wine:bottle_" .. name}} }) @@ -219,203 +165,83 @@ for n = 1, #beverages do end --- brandy recipe -minetest.register_craft({ - type = "cooking", - cooktime = 15, - output = "wine:glass_brandy", - recipe = "wine:glass_wine" -}) - - --- Raw champagne -if minetest.get_modpath("farming") -and farming.mod and (farming.mod == "undo" or farming.mod == "redo") then - - minetest.register_craftitem("wine:glass_champagne_raw", { - description = "Raw Champagne", - inventory_image = "wine_champagne_raw_glass.png", - groups = {vessel = 1, flammable = 3} - }) - - minetest.register_craft({ --- type = "shapeless", - output = "wine:glass_champagne_raw", - recipe = { - {"wine:glass_wine", "farming:sugar"} - } - }) -end - - --- override to add food group to wine and brandy glass -minetest.override_item("wine:glass_wine", { - groups = { - food_wine = 1, vessel = 1, dig_immediate = 3, - attached_node = 1, alcohol = 1, drink = 1 - } -}) - -minetest.override_item("wine:glass_brandy", { - groups = { - food_brandy = 1, vessel = 1, dig_immediate = 3, - attached_node = 1, alcohol = 1, drink = 1 - } -}) - - --- blue agave -minetest.register_node("wine:blue_agave", { - description = S("Blue Agave"), - drawtype = "plantlike", - visual_scale = 0.8, - tiles = {"wine_blue_agave.png"}, - inventory_image = "wine_blue_agave.png", - wield_image = "wine_blue_agave.png", - paramtype = "light", - is_ground_content = false, - sunlight_propagates = true, - walkable = false, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2} - }, - groups = {snappy = 3, attached_node = 1, plant = 1}, - sounds = snd_l, - - on_use = minetest.item_eat(2), - - on_construct = function(pos) - - local timer = minetest.get_node_timer(pos) - - timer:start(17) - end, - - on_timer = function(pos) - - local light = minetest.get_node_light(pos) - - if not light or light < 13 or math.random() > 1/76 then - return true -- go to next iteration - end - - local n = minetest.find_nodes_in_area_under_air( - {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}, - {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, - {"wine:blue_agave"}) - - -- too crowded, we'll wait for another iteration - if #n > 2 then - return true - end - - -- find desert sand with air above (grow across and down only) - n = minetest.find_nodes_in_area_under_air( - {x = pos.x + 1, y = pos.y - 1, z = pos.z + 1}, - {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, - {sand}) - - -- place blue agave - if n and #n > 0 then - - local new_pos = n[math.random(#n)] - - new_pos.y = new_pos.y + 1 - - minetest.set_node(new_pos, {name = "wine:blue_agave"}) - end - - return true - end -}) - --- blue agave into cyan dye -minetest.register_craft( { --- type = "shapeless", - output = "dye:cyan 4", - recipe = {{"wine:blue_agave"}} -}) - --- blue agave as fuel -minetest.register_craft({ - type = "fuel", - recipe = "wine:blue_agave", - burntime = 10, -}) - --- cook blue agave into a sugar syrup -minetest.register_craftitem("wine:agave_syrup", { - description = "Agave Syrup", - inventory_image = "wine_agave_syrup.png", - groups = {food_sugar = 1, vessel = 1, flammable = 3} -}) - -minetest.register_craft({ - type = "cooking", - cooktime = 7, - output = "wine:agave_syrup 2", - recipe = "wine:blue_agave" -}) - --- blue agave into paper -minetest.register_craft( { - output = "default:paper 3", - recipe = { - {"wine:blue_agave", "wine:blue_agave", "wine:blue_agave"}, - } -}) - - --- register blue agave on mapgen -minetest.register_decoration({ - deco_type = "simple", - place_on = {sand}, - sidelen = 16, - fill_ratio = 0.001, - biomes = {"desert"}, - decoration = {"wine:blue_agave"}, - y_min = 15, - y_max = 50, - spawn_by = sand, - num_spawn_by = 6 -}) - - --- add to bonemeal as decoration if available -if minetest.get_modpath("bonemeal") then - - bonemeal:add_deco({ - {sand, {}, {"default:dry_shrub", "wine:blue_agave", "", ""} } - }) -end - - --- Mint Julep recipe -if minetest.get_modpath("farming") -and farming.mod and (farming.mod == "redo" or farming.mod == "undo") then - - minetest.register_craft({ --- type = "shapeless", - output = "wine:glass_mint", - recipe = { - {"farming:mint_leaf", "farming:mint_leaf", "farming:mint_leaf"}, - {"wine:glass_bourbon", "farming:sugar", ""} - } - }) -end - - -- Wine barrel formspec -winebarrel_formspec = "size[8,9]" - .. "list[current_name;src;2,1;1,1;]" - .. "list[current_name;dst;5,1;1,1;]" +local function winebarrel_formspec(item_percent, brewing, water_percent) + + local mcl_bg = mcl and "listcolors[#9d9d9d;#FFF7;#474747]" or "" + + return "size[8,9]" .. mcl_bg + + -- images + .. "image[0,0;7,5;wine_barrel_fs_bg.png]" + .. "image[5.88,1.8;1,1;wine_barrel_icon_bg.png^[lowpart:" + .. item_percent .. ":wine_barrel_icon.png]" + .. "image[1.04,2.7;4.45,1.65;wine_barrel_water.png" + .. "^[colorize:#261c0e:175^[opacity:125" + .. "^[lowpart:" .. water_percent .. ":wine_barrel_water.png]" + + -- inside barrel tinv + .. "list[current_name;src;1.9,0.7;2,2;]" + .. "list[current_name;src_b;2.4,2.95;1,1;0]" + + -- outside barrel inv + .. "list[current_name;dst;7,1.8;1,1;]" .. "list[current_player;main;0,5;8,4;]" + + -- tooltips + .. "tooltip[5.88,1.8;1,1;" .. brewing .. "]" + .. "tooltip[1.05,2.7;3.495,1.45;" .. S("Water @1% Full", water_percent) .. "]" + + -- shift-click .. "listring[current_name;dst]" .. "listring[current_player;main]" .. "listring[current_name;src]" .. "listring[current_player;main]" - .. "image[3.5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]" +end + + +-- list of buckets used to fill barrel +local bucket_list = { + {"bucket:bucket_water", "bucket:bucket_empty", 20}, + {"bucket:bucket_river_water", "bucket:bucket_empty", 20}, + {"wooden_bucket:bucket_wood_water", "wooden_bucket:bucket_wood_empty", 20}, + {"wooden_bucket:bucket_wood_river_water", "wooden_bucket:bucket_wood_empty", 20}, + {"bucket_wooden:bucket_water", "bucket_wooden:bucket_empty", 20}, + {"bucket_wooden:bucket_river_water", "bucket_wooden:bucket_empty", 20}, + {"mcl_buckets:bucket_water", "mcl_buckets:bucket_empty", 20}, + {"farming:glass_water", "vessels:drinking_glass", 5}, + {"default:water_source", "", 20}, + {"default:river_water_source", "", 20}, + {"mcl_core:water_source", "", 20}, + {"bucket:bucket_water_uni_gold", "bucket:bucket_empty_gold", 20}, + {"bucket:bucket_water_uni_mese", "bucket:bucket_empty_mese", 20}, + {"bucket:bucket_water_uni_wood", "bucket:bucket_empty_wood", 20}, + {"bucket:bucket_water_uni_steel", "bucket:bucket_empty_steel", 20}, + {"bucket:bucket_water_uni_stone", "bucket:bucket_empty_stone", 20}, + {"bucket:bucket_water_uni_bronze", "bucket:bucket_empty_bronze", 20}, + {"bucket:bucket_water_uni_diamond", "bucket:bucket_empty_diamond", 20}, + {"bucket:bucket_water_river_gold", "bucket:bucket_empty_gold", 20}, + {"bucket:bucket_water_river_mese", "bucket:bucket_empty_mese", 20}, + {"bucket:bucket_water_river_wood", "bucket:bucket_empty_wood", 20}, + {"bucket:bucket_water_river_steel", "bucket:bucket_empty_steel", 20}, + {"bucket:bucket_water_river_stone", "bucket:bucket_empty_stone", 20}, + {"bucket:bucket_water_river_bronze", "bucket:bucket_empty_bronze", 20}, + {"bucket:bucket_water_river_diamond", "bucket:bucket_empty_diamond", 20}, + {"mesecraft_bucket:bucket_water", "mesecraft_bucket:bucket_empty", 20}, + {"mesecraft_bucket:bucket_river_water", "mesecraft_bucket:bucket_empty", 20} +} + + +-- water item helper +local function water_check(item) + + for n = 1, #bucket_list do + + if bucket_list[n][1] == item then + return bucket_list[n] + end + end +end -- Wine barrel node @@ -426,9 +252,10 @@ minetest.register_node("wine:wine_barrel", { mesh = "wine_barrel.obj", paramtype = "light", paramtype2 = "facedir", + is_ground_content = false, groups = { choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, - tubedevice = 1, tubedevice_receiver = 1 + tubedevice = 1, tubedevice_receiver = 1, axey = 1 }, legacy_facedir_simple = true, @@ -438,14 +265,32 @@ minetest.register_node("wine:wine_barrel", { local meta = minetest.get_meta(pos) - meta:set_string("formspec", winebarrel_formspec) + meta:set_string("formspec", winebarrel_formspec(0, "", 0)) meta:set_string("infotext", S("Fermenting Barrel")) - meta:set_float("status", 0.0) + meta:set_float("status", 0) local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("dst", 1) + inv:set_size("src", 4) -- ingredients + inv:set_size("src_b", 1) -- water bucket + inv:set_size("dst", 1) -- brewed item + end, + + -- punch old barrel to change to new 4x slot variant and add a little water + on_punch = function(pos, node, puncher, pointed_thing) + + local meta = minetest.get_meta(pos) + local inv = meta and meta:get_inventory() + local size = inv and inv:get_size("src") + + if size and size < 4 then + + inv:set_size("src", 4) + inv:set_size("src_b", 1) + + meta:set_int("water", 50) + meta:set_string("formspec", winebarrel_formspec(0, "", 50)) + end end, can_dig = function(pos,player) @@ -454,15 +299,15 @@ minetest.register_node("wine:wine_barrel", { local inv = meta:get_inventory() if not inv:is_empty("dst") - or not inv:is_empty("src") then + or not inv:is_empty("src") + or not inv:is_empty("src_b") then return false end return true end, - allow_metadata_inventory_take = function( - pos, listname, index, stack, player) + allow_metadata_inventory_take = function(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 @@ -471,8 +316,7 @@ minetest.register_node("wine:wine_barrel", { return stack:get_count() end, - allow_metadata_inventory_put = function( - pos, listname, index, stack, player) + allow_metadata_inventory_put = function(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 @@ -482,8 +326,29 @@ minetest.register_node("wine:wine_barrel", { local inv = meta:get_inventory() if listname == "src" then + return stack:get_count() + + elseif listname == "src_b" then + + local water = meta:get_int("water") + + -- water full, return item + if water == 100 then + return 0 + end + + local is_bucket = stack:get_name() + local is_water = water_check(is_bucket) + + if is_water then + return stack:get_count() + else + return 0 + end + elseif listname == "dst" then + return 0 end end, @@ -501,19 +366,86 @@ minetest.register_node("wine:wine_barrel", { if to_list == "src" then return count + elseif to_list == "dst" then return 0 + + elseif to_list == "src_b" then + return 0 end end, - on_metadata_inventory_put = function(pos) + on_metadata_inventory_put = function(pos, listname, index, stack, player) + + if listname == "src_b" then + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local is_bucket = inv:get_stack("src_b", 1):get_name() + local is_water = water_check(is_bucket) + + if is_water then + + local water = meta:get_int("water") + local amount = tonumber(is_water[3]) or 0 + + water = water + amount + + if water > 100 then water = 100 end + + inv:remove_item("src_b", is_water[1]) + + -- if replacement found then add to inventory + if is_water[2] ~= "" then + inv:add_item("src_b", is_water[2]) + end + + local status = meta:get_float("status") + + meta:set_int("water", water) + meta:set_string("formspec", + winebarrel_formspec(status, S("Water Added"), water)) + end + end local timer = minetest.get_node_timer(pos) - timer:start(5) + if not timer:is_started() then + minetest.get_node_timer(pos):start(5) + end end, - tube = (function() if minetest.get_modpath("pipeworks") then return { + on_metadata_inventory_move = function(pos) + + local timer = minetest.get_node_timer(pos) + + if not timer:is_started() then + minetest.get_node_timer(pos):start(5) + end + end, + + on_metadata_inventory_take = function(pos) + + local timer = minetest.get_node_timer(pos) + + if not timer:is_started() then + minetest.get_node_timer(pos):start(5) + end + end, + + pipe_connections = { + left = 1, right = 1, front = 1, back = 1, + left_param2 = 3, right_param2 = 1, front_param2 = 2, back_param2 = 0 + }, + + after_dig_node = function(pos) + + if pipe then + pipeworks.scan_for_pipe_objects(pos) + end + end, + + tube = (function() if pipe then return { -- using a different stack from defaut when inserting insert_object = function(pos, node, stack, direction) @@ -529,7 +461,7 @@ minetest.register_node("wine:wine_barrel", { return inv:add_item("src", stack) end, - can_insert = function(pos,node,stack,direction) + can_insert = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -539,60 +471,147 @@ minetest.register_node("wine:wine_barrel", { -- the default stack, from which objects will be taken input_inventory = "dst", - connect_sides = { - left = 1, right = 1, back = 1, - front = 1, bottom = 1, top = 1} } end end)(), + + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + + } end end)(), on_timer = function(pos) local meta = minetest.get_meta(pos) ; if not meta then return end local inv = meta:get_inventory() + local water = meta:get_int("water") or 0 + + -- check for pipeworks water inlet or well block + if water < 100 then + + if minetest.find_node_near(pos, 1, pipes_list) then + + water = water + 20 + + if water > 100 then water = 100 end + + meta:set_int("water", water) + end + end -- is barrel empty? if not inv or inv:is_empty("src") then - meta:set_float("status", 0.0) + meta:set_float("status", 0) meta:set_string("infotext", S("Fermenting Barrel")) + meta:set_string("formspec", winebarrel_formspec(0, "", water)) + + return false + end + + -- check water level + if water < 5 then + + txt = S("Fermenting Barrel") .. " " .. S("(Water Level Low)") + + meta:set_string("infotext", txt) + meta:set_float("status", 0) + meta:set_string("formspec", winebarrel_formspec(0, + S("(Water Level Low)"), water)) return false end -- does it contain any of the source items on the list? - local has_item + local has_items, recipe, item1, item2, item3, item4 for n = 1, #ferment do - if inv:contains_item("src", ItemStack(ferment[n][1])) then + recipe = ferment[n] - has_item = n + item1 = recipe[1][1] and ItemStack(recipe[1][1]) + item2 = recipe[1][2] and ItemStack(recipe[1][2]) + item3 = recipe[1][3] and ItemStack(recipe[1][3]) + item4 = recipe[1][4] and ItemStack(recipe[1][4]) + -- check for recipe items + if item1 then + + has_items = inv:contains_item("src", item1) + + if has_items and item2 then + + has_items = inv:contains_item("src", item2) + + if has_items and item3 then + + has_items = inv:contains_item("src", item3) + + if has_items and item4 then + has_items = inv:contains_item("src", item4) + end + end + end + end + + -- if we have all items in recipe break and continue + if has_items then break end end - if not has_item then + -- if we have a wrong recipe change status + if not has_items then + + txt = S("Fermenting Barrel") .. " " .. S("(No Valid Recipe)") + + meta:set_string("infotext", txt) + meta:set_float("status", 0) + meta:set_string("formspec", + winebarrel_formspec(0, S("(No Valid Recipe)"), water)) + return false end -- is there room for additional fermentation? - if not inv:room_for_item("dst", ferment[has_item][2]) then + if not inv:room_for_item("dst", recipe[2]) then - meta:set_string("infotext", S("Fermenting Barrel (FULL)")) + txt = S("Fermenting Barrel") .. " " .. S("(Output Full)") - return true + meta:set_string("infotext", txt) + meta:set_string("formspec", + winebarrel_formspec(0, S("(Output Full)"), water)) + + return false end local status = meta:get_float("status") -- fermenting (change status) if status < 100 then - meta:set_string("infotext", S("Fermenting Barrel (@1% Done)", status)) - meta:set_float("status", status + 5) - else - inv:remove_item("src", ferment[has_item][1]) - inv:add_item("dst", ferment[has_item][2]) - meta:set_float("status", 0,0) + txt = S("Fermenting Barrel") .. " " .. S("(@1% Done)", status) + + meta:set_string("infotext", txt) + meta:set_float("status", status + 5) + + local d1 = recipe[2]:split(" ")[1] + local desc = minetest.registered_items[d1].description or "" + + txt = S("Brewing: @1", desc) .. " " .. S("(@1% Done)", status) + + meta:set_string("formspec", winebarrel_formspec(status, txt, water)) + + else -- when we hit 100% remove items needed and add beverage + + if item1 then inv:remove_item("src", item1) end + if item2 then inv:remove_item("src", item2) end + if item3 then inv:remove_item("src", item3) end + if item4 then inv:remove_item("src", item4) end + + inv:add_item("dst", recipe[2]) + + water = water - 5 + + meta:set_float("status", 0) + meta:set_int("water", water) + meta:set_string("formspec", winebarrel_formspec(0, "", water)) end if inv:is_empty("src") then @@ -606,88 +625,106 @@ minetest.register_node("wine:wine_barrel", { -- wine barrel craft recipe (with mineclone2 check) -local ingot = "default:steel_ingot" - -if mcl then - ingot = "mcl_core:iron_ingot" -end +local ingot = mcl and "mcl_core:iron_ingot" or "default:steel_ingot" minetest.register_craft({ output = "wine:wine_barrel", recipe = { {"group:wood", "group:wood", "group:wood"}, {ingot, "", ingot}, - {"group:wood", "group:wood", "group:wood"}, - }, + {"group:wood", "group:wood", "group:wood"} + } }) -- LBMs to start timers on existing, ABM-driven nodes minetest.register_lbm({ - name = "wine:barrel_timer_init", + name = "wine:barrel_timer_upgrade_init", + label = "upgrade old barrels and start timers", nodenames = {"wine:wine_barrel"}, run_at_every_load = false, + action = function(pos) - local t = minetest.get_node_timer(pos) + -- convert any old 2x slot barrels into new 4x slot ones and add a little water + local meta = minetest.get_meta(pos) + local inv = meta and meta:get_inventory() + local size = inv and inv:get_size("src") - t:start(5) - end, + if size and size < 4 then + + inv:set_size("src", 4) + inv:set_size("src_b", 1) + + meta:set_int("water", 50) + meta:set_string("formspec", winebarrel_formspec(0, "", 50)) + end + + -- Start barrel timer + minetest.get_node_timer(pos):start(5) + end }) -minetest.register_lbm({ - name = "wine:agave_timer_init", - nodenames = {"wine:blue_agave"}, - run_at_every_load = false, - action = function(pos) - local t = minetest.get_node_timer(pos) - - t:start(17) - end, -}) +-- add agave plant and functions +dofile(path .. "/agave.lua") +-- add drink nodes and recipes +dofile(path .. "/drinks.lua") -- add lucky blocks if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end - lucky_block:add_blocks({ - {"fal", {"default:water_source"}, 1, true, 4}, - {"dro", {"wine:glass_wine"}, 5}, - {"dro", {"wine:glass_beer"}, 5}, - {"dro", {"wine:glass_wheat_beer"}, 5}, - {"dro", {"wine:glass_mead"}, 5}, - {"dro", {"wine:glass_cider"}, 5}, - {"dro", {"wine:glass_rum"}, 5}, - {"dro", {"wine:glass_sake"}, 5}, - {"dro", {"wine:glass_tequila"}, 5}, - {"dro", {"wine:glass_bourbon"}, 5}, - {"dro", {"wine:glass_vodka"}, 5}, - {"dro", {"wine:glass_mint"}, 5}, - {"dro", {"wine:glass_coffee_liquor"}, 5}, - {"dro", {"wine:glass_brandy"}, 5}, - {"dro", {"wine:glass_champagne"}, 5}, - {"dro", {"wine:wine_barrel"}, 1}, - {"tel", 5, 1}, - {"nod", "default:chest", 0, { - {name = "wine:bottle_wine", max = 1}, - {name = "wine:bottle_tequila", max = 1}, - {name = "wine:bottle_rum", max = 1}, - {name = "wine:bottle_cider", max = 1}, - {name = "wine:bottle_bourbon", max = 1}, - {name = "wine:bottle_vodka", max = 1}, - {name = "wine:wine_barrel", max = 1}, - {name = "wine:bottle_sake", max = 1}, - {name = "wine:bottle_mint", max = 1}, - {name = "wine:bottle_mead", max = 1}, - {name = "wine:bottle_beer", max = 1}, - {name = "wine:bottle_wheat_beer", max = 1}, - {name = "wine:bottle_coffee_liquor", max = 1}, - {name = "wine:bottle_brandy", max = 1}, - {name = "wine:bottle_champagne", max = 1}, - {name = "wine:blue_agave", max = 4}}}, + +-- mineclone2 doesn't have a drinking glass, so if none found add one +if not minetest.registered_items["vessels:drinking_glass"] then + + minetest.register_node(":vessels:drinking_glass", { + description = S("Empty Drinking Glass"), + drawtype = "plantlike", + tiles = {"wine_drinking_glass.png"}, + inventory_image = "wine_drinking_glass.png", + wield_image = "wine_drinking_glass.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = snd_g, + }) + + minetest.register_craft( { + output = "vessels:drinking_glass 14", + recipe = { + {glass_item, "" , glass_item}, + {glass_item, "" , glass_item}, + {glass_item, glass_item, glass_item} + } }) end -print (S("[MOD] Wine loaded")) +-- sort ferment table to fix recipe overlap (large to small) +minetest.after(0.2, function() + + local tmp = {} + + for l = 4, 1, -1 do + for n = 1, #ferment do + + if #ferment[n][1] == l then + table.insert(tmp, ferment[n]) + end + end + end + + ferment = tmp +end) + + +print ("[MOD] Wine loaded") diff --git a/mods/wine/license.txt b/mods/wine/license.txt index 365aad5c..4d1512bf 100644 --- a/mods/wine/license.txt +++ b/mods/wine/license.txt @@ -22,11 +22,14 @@ THE SOFTWARE. Textures by TenPlus1 unless listed below (CC-By-3.0) -Mikhail Miroscnichenko @ dreamstime.com (royalty free license) +Texture based on Thomas-s' vessels_glass_bottle.png (cc by sa 3.0): + wine_agave.syrup.png + +Texture by Runs (CC4-BY-SA) + wine_beer_glass.png wine_bourbon_bottle.png -RiverKpocc @ deviantart.com - wine_beer_glass.png +Texture by Epoxum (CC0) wine_wheat_beer_glass.png Textures by Darkstalker (cc-by-3.0 license) @@ -44,3 +47,21 @@ Textures by Felfa (CC0) wine_coffee*.png wine_brandy*.png wine_sake_bottle.png + +Textures by Sirrobzeroone (CC-by-3.0) + wine_barrel_fs_bg.png + wine_barrel_icon.png + wine_barrel_icon_bg.png + wine_kefir_glass.png + wine_kefir_bottle.png + wine_drinking_glass.png + wine_barrel_water.png + wine_sparkling_agave_juice_glass.png + wine_sparkling_agave_juice_bottle.png + wine_sparkling_apple_juice_glass.png + wine_sparkling_apple_juice_bottle.png + wine_sparkling_blackberry_juice_glass.png + wine_sparkling_blackberry_juice_bottle.png + wine_sparkling_carrot_juice_glass.png + wine_sparkling_carrot_juice_bottle.png + screenshot.png diff --git a/mods/wine/locale/template.txt b/mods/wine/locale/template.txt index 40588874..8ef6b1fa 100644 --- a/mods/wine/locale/template.txt +++ b/mods/wine/locale/template.txt @@ -1,8 +1,4 @@ -# Template for translations of wine mod # textdomain: wine -# author: ? -# last update: 2020/October/27 - Glass of Wine= Bottle of Wine= Glass of Beer= @@ -25,9 +21,25 @@ Glass of Honey-Mead= Bottle of Honey-Mead= Glass of Mint Julep= Bottle of Mint Julep= +Glass of Sparkling Agave Juice= +Bottle of Sparkling Agave Juice= +Glass of Sparkling Apple Juice= +Bottle of Sparkling Apple Juice= +Glass of Sparkling Carrot Juice= +Bottle of Sparkling Carrot Juice= +Glass of Sparkling Blackberry Juice= +Bottle of Sparkling Blackberry Juice= +Glass of Kefir= +Bottle of Kefir= Blue Agave= Agave Syrup= Fermenting Barrel= -Fermenting Barrel (FULL)= -Fermenting Barrel (@1% Done)= +Brewing: @1= +Water @1% Full= +Water Added= +(@1% Done)= +(Water Level Low)= +(No Valid Recipe)= +(Output Full)= +Empty Drinking Glass= [MOD] Wine loaded= diff --git a/mods/wine/locale/wine.de.tr b/mods/wine/locale/wine.de.tr index d09bd07e..6f60ddb9 100644 --- a/mods/wine/locale/wine.de.tr +++ b/mods/wine/locale/wine.de.tr @@ -1,9 +1,4 @@ -# Deutsche Übersetzung der wine Mod # textdomain: wine -# author: Xanthin -# author: TheDarkTiger -# last update: 2020/October/27 - Glass of Wine=Glas Wein Bottle of Wine=Flasche Wein Glass of Beer=Bier @@ -26,9 +21,25 @@ Glass of Honey-Mead=Honigwein Bottle of Honey-Mead=Flasche Honigwein Glass of Mint Julep=Minze Julep Bottle of Mint Julep=Flasch Minze Julep +Glass of Sparkling Agave Juice=Minze prickelnder Agavensaft +Bottle of Sparkling Agave Juice=Flasch Minze prickelnder Agavensaft +Glass of Sparkling Apple Juice=Minze prickelnder Apfelsaft +Bottle of Sparkling Apple Juice=Flasch Minze prickelnder Apfelsaft +Glass of Sparkling Carrot Juice=Minze prickelnder Karottensaft +Bottle of Sparkling Carrot Juice=Flasch Minze prickelnder Karottensaft +Glass of Sparkling Blackberry Juice=Minze sprudelnder Brombeersaft +Bottle of Sparkling Blackberry Juice=Flasch Minze sprudelnder Brombeersaft +Glass of Kefir=Minze Kefir +Bottle of Kefir=Flasch Minze Kefir Blue Agave=Agave Agave Syrup=Agavendicksaft Fermenting Barrel=Gärfass -Fermenting Barrel (FULL)=Gärfass (VOLL) -Fermenting Barrel (@1% Done)=Gärfass (@1% erledigt) +Brewing: @1=(Brauen: @1) +Water @1% Full=Wasser @1% +Water Added=Wasser Hinzugefügt +(@1% Done)=(@1 erledigt) +(Water Level Low)=(Wasserstand Niedrig) +(No Valid Recipe)=(kein gültiges Rezept) +(Output Full)=(Ausgabe voll) +Empty Drinking Glass=Leeres Trinkglas [MOD] Wine loaded=[MOD] Wine geladen diff --git a/mods/wine/locale/wine.es.tr b/mods/wine/locale/wine.es.tr index 18eb14a4..85870dfc 100644 --- a/mods/wine/locale/wine.es.tr +++ b/mods/wine/locale/wine.es.tr @@ -1,10 +1,4 @@ -# Traducción al español del mod Wine por TenPlus1 # textdomain: wine -# author: Unknown -# author: TenPlus1 -# author: TheDarkTiger -# last update: 2020/October/27 - Glass of Wine=Copa de vino Bottle of Wine=Botella de vino Glass of Beer=Cerveza @@ -27,9 +21,25 @@ Glass of Honey-Mead=Bebida de Miel Bottle of Honey-Mead=Botella de Bebida de Miel Glass of Mint Julep=Julepe de menta Bottle of Mint Julep=Botella de Julepe de menta +Glass of Sparkling Agave Juice=Vaso de jugo de agave espumoso +Bottle of Sparkling Agave Juice=Botella de jugo de agave espumoso +Glass of Sparkling Apple Juice=Vaso de jugo de manzana espumoso +Bottle of Sparkling Apple Juice=Botella de jugo de manzana espumoso +Glass of Sparkling Carrot Juice=Vaso de jugo de zanahoria espumoso +Bottle of Sparkling Carrot Juice=Botella de jugo de zanahoria espumoso +Glass of Sparkling Blackberry Juice=Vaso de jugo de mora espumoso +Bottle of Sparkling Blackberry Juice=Botella de jugo de mora espumoso +Glass of Kefir=vaso de kéfir +Bottle of Kefir=Botella de kéfir Blue Agave=Agave Tequilana Agave Syrup=jarabe de agave Fermenting Barrel=Barril de fermentación -Fermenting Barrel (FULL)=Barril de fermentación (Lleno) -Fermenting Barrel (@1% Done)=Barril de fermentación (@1% completado) +Brewing: @1= Fabricación de cerveza: @1 +Water @1% Full=Agua @1% Llena +Water Added=Agua añadida +(@1% Done)=(@1% completado) +(Water Level Low)=(Nivel de agua bajo) +(No Valid Recipe)=(Sin receta válida) +(Output Full)=(Salida completa) +Empty Drinking Glass=Vaso para beber vacío [MOD] Wine loaded=[MOD] Wine cargado diff --git a/mods/wine/locale/wine.fr.tr b/mods/wine/locale/wine.fr.tr index a396c7b3..72786302 100644 --- a/mods/wine/locale/wine.fr.tr +++ b/mods/wine/locale/wine.fr.tr @@ -1,8 +1,4 @@ -# Traduction Française du mod Wine par TenPlus1 # textdomain: wine -# author: TheDarkTiger -# last update: 2020/October/27 - Glass of Wine=Verre de Vin Bottle of Wine=Bouteille de Vin Glass of Beer=Bière @@ -25,9 +21,38 @@ Glass of Honey-Mead=Hydromel Bottle of Honey-Mead=Bouteille d'Hydromel Glass of Mint Julep=Mint Julep Bottle of Mint Julep=Bouteille de Mint Julep +Glass of Brandy=Verre de Brandy +Bottle of Brandy=Bouteille de Brandy +Glass of Coffee Liquor=Verre de liqueur de café +Bottle of Coffee Liquor=Bouteille de liqueur de café +Glass of Champagne=Verre de Champagne +Bottle of Champagne=Bouteille de Champagne +Glass of Cointreau=Verre de Cointreau +Bottle of Cointreau=Bouteille de Cointreau +Glass of Margarita=Verre de margarita +Bottle of Margarita=Bouteille de margarita +Glass of Kefir=Verre de kéfir +Bottle of Kefir=Bouteille de kéfir + +Glass of Sparkling Agave Juice=Verre de jus d'agave pétillant +Bottle of Sparkling Agave Juice=Bouteille de jus d'agave pétillant +Glass of Sparkling Apple Juice=Verre de jus de pomme pétillant +Bottle of Sparkling Apple Juice=Bouteille de jus de pomme pétillant +Glass of Sparkling Carrot Juice=Verre de jus de carotte pétillant +Bottle of Sparkling Carrot Juice=Bouteille de jus de carotte pétillant +Glass of Sparkling Blackberry Juice=Verre de jus de mûre pétillant +Bottle of Sparkling Blackberry Juice=Bouteille de jus de mûre pétillant + Blue Agave=Agave Bleue Agave Syrup=Sirop d'Agave + Fermenting Barrel=Baril de fermentation -Fermenting Barrel (FULL)=Baril de fermentation (PLEIN) -Fermenting Barrel (@1% Done)=Baril de fermentation (En cours @1%) +Brewing: @1=Sortie pleine: @1 +Water @1% Full=l'eau @1 rempli +Water Added=eau ajoutée +(@1% Done)=(En cours @1%) +(Water Level Low)=(niveau d'eau bas) +(No Valid Recipe)=(pas de recette valide) +(Output Full)=(Sortie pleine) +Empty Drinking Glass=Verre vide [MOD] Wine loaded=[MOD] Wine chargé diff --git a/mods/wine/lucky_block.lua b/mods/wine/lucky_block.lua new file mode 100644 index 00000000..c37326a8 --- /dev/null +++ b/mods/wine/lucky_block.lua @@ -0,0 +1,48 @@ +lucky_block:add_blocks({ + {"fal", {"default:water_source"}, 1, true, 4}, + {"dro", {"wine:glass_wine"}, 5}, + {"dro", {"wine:glass_beer"}, 5}, + {"dro", {"wine:glass_wheat_beer"}, 5}, + {"dro", {"wine:glass_mead"}, 5}, + {"dro", {"wine:glass_cider"}, 5}, + {"dro", {"wine:glass_rum"}, 5}, + {"dro", {"wine:glass_sake"}, 5}, + {"dro", {"wine:glass_tequila"}, 5}, + {"dro", {"wine:glass_bourbon"}, 5}, + {"dro", {"wine:glass_vodka"}, 5}, + {"dro", {"wine:glass_mint"}, 5}, + {"dro", {"wine:glass_coffee_liquor"}, 5}, + {"dro", {"wine:glass_brandy"}, 5}, + {"dro", {"wine:glass_champagne"}, 5}, + {"dro", {"wine:glass_cointreau"}, 5}, + {"dro", {"wine:glass_margarita"}, 5}, + {"dro", {"wine:glass_sparkling_agave_juice"}, 5}, + {"dro", {"wine:glass_sparkling_apple_juice"}, 5}, + {"dro", {"wine:glass_sparkling_carrot_juice"}, 5}, + {"dro", {"wine:glass_sparkling_blackberry_juice"}, 5}, + {"dro", {"wine:wine_barrel"}, 1}, + {"tel", 5, 1}, + {"nod", "default:chest", 0, { + {name = "wine:bottle_wine", max = 1}, + {name = "wine:bottle_tequila", max = 1}, + {name = "wine:bottle_rum", max = 1}, + {name = "wine:bottle_cider", max = 1}, + {name = "wine:bottle_bourbon", max = 1}, + {name = "wine:bottle_vodka", max = 1}, + {name = "wine:wine_barrel", max = 1}, + {name = "wine:bottle_sake", max = 1}, + {name = "wine:bottle_mint", max = 1}, + {name = "wine:bottle_mead", max = 1}, + {name = "wine:bottle_beer", max = 1}, + {name = "wine:bottle_wheat_beer", max = 1}, + {name = "wine:bottle_coffee_liquor", max = 1}, + {name = "wine:bottle_brandy", max = 1}, + {name = "wine:bottle_champagne", max = 1}, + {name = "wine:bottle_cointreau", max = 1}, + {name = "wine:bottle_sparkling_agave_juice", max = 1}, + {name = "wine:bottle_sparkling_apple_juice", max = 1}, + {name = "wine:bottle_sparkling_carrot_juice", max = 1}, + {name = "wine:bottle_sparkling_blackberry_juice", max = 1}, + {name = "wine:blue_agave", max = 4} + }} +}) diff --git a/mods/wine/mod.conf b/mods/wine/mod.conf index 86bfa50d..b8eb089e 100644 --- a/mods/wine/mod.conf +++ b/mods/wine/mod.conf @@ -1,4 +1,4 @@ name = wine -depends = -optional_depends = default, intllib, lucky_block, pipeworks, bonemeal, mcl_core, mcl_sounds, mcl_loot, doc, unified_inventory, thirsty, farming -description = Adds many alcoholic beverages and barrel to ferment them in. +description = Adds many new beverages and barrel to ferment them in. +optional_depends = default, lucky_block, pipeworks, bonemeal, mcl_core, mcl_sounds, mcl_loot, doc, unified_inventory, thirsty, farming, vessels +min_minetest_version = 5.0 diff --git a/mods/wine/screenshot.jpg b/mods/wine/screenshot.jpg deleted file mode 100644 index 0d28befa..00000000 Binary files a/mods/wine/screenshot.jpg and /dev/null differ diff --git a/mods/wine/screenshot.png b/mods/wine/screenshot.png new file mode 100644 index 00000000..d4846af5 Binary files /dev/null and b/mods/wine/screenshot.png differ diff --git a/mods/wine/textures/wine_barrel.png b/mods/wine/textures/wine_barrel.png index 8f192dd7..c6ea2a89 100644 Binary files a/mods/wine/textures/wine_barrel.png and b/mods/wine/textures/wine_barrel.png differ diff --git a/mods/wine/textures/wine_barrel_fs_bg.png b/mods/wine/textures/wine_barrel_fs_bg.png new file mode 100644 index 00000000..37e0fbc8 Binary files /dev/null and b/mods/wine/textures/wine_barrel_fs_bg.png differ diff --git a/mods/wine/textures/wine_barrel_icon.png b/mods/wine/textures/wine_barrel_icon.png new file mode 100644 index 00000000..48dfe8f2 Binary files /dev/null and b/mods/wine/textures/wine_barrel_icon.png differ diff --git a/mods/wine/textures/wine_barrel_icon_bg.png b/mods/wine/textures/wine_barrel_icon_bg.png new file mode 100644 index 00000000..c72de131 Binary files /dev/null and b/mods/wine/textures/wine_barrel_icon_bg.png differ diff --git a/mods/wine/textures/wine_barrel_water.png b/mods/wine/textures/wine_barrel_water.png new file mode 100644 index 00000000..a4c74d56 Binary files /dev/null and b/mods/wine/textures/wine_barrel_water.png differ diff --git a/mods/wine/textures/wine_beer_glass.png b/mods/wine/textures/wine_beer_glass.png index e53041ae..7cde04bb 100644 Binary files a/mods/wine/textures/wine_beer_glass.png and b/mods/wine/textures/wine_beer_glass.png differ diff --git a/mods/wine/textures/wine_bourbon_bottle.png b/mods/wine/textures/wine_bourbon_bottle.png index 56aa5c47..310c5d3e 100644 Binary files a/mods/wine/textures/wine_bourbon_bottle.png and b/mods/wine/textures/wine_bourbon_bottle.png differ diff --git a/mods/wine/textures/wine_champagne_raw_glass.png b/mods/wine/textures/wine_champagne_raw_glass.png deleted file mode 100644 index a2e238b0..00000000 Binary files a/mods/wine/textures/wine_champagne_raw_glass.png and /dev/null differ diff --git a/mods/wine/textures/wine_cointreau_bottle.png b/mods/wine/textures/wine_cointreau_bottle.png new file mode 100644 index 00000000..c6cc2c00 Binary files /dev/null and b/mods/wine/textures/wine_cointreau_bottle.png differ diff --git a/mods/wine/textures/wine_cointreau_glass.png b/mods/wine/textures/wine_cointreau_glass.png new file mode 100644 index 00000000..1b695f67 Binary files /dev/null and b/mods/wine/textures/wine_cointreau_glass.png differ diff --git a/mods/wine/textures/wine_drinking_glass.png b/mods/wine/textures/wine_drinking_glass.png new file mode 100644 index 00000000..5773030c Binary files /dev/null and b/mods/wine/textures/wine_drinking_glass.png differ diff --git a/mods/wine/textures/wine_kefir_bottle.png b/mods/wine/textures/wine_kefir_bottle.png new file mode 100644 index 00000000..a50d3028 Binary files /dev/null and b/mods/wine/textures/wine_kefir_bottle.png differ diff --git a/mods/wine/textures/wine_kefir_glass.png b/mods/wine/textures/wine_kefir_glass.png new file mode 100644 index 00000000..6e22e143 Binary files /dev/null and b/mods/wine/textures/wine_kefir_glass.png differ diff --git a/mods/wine/textures/wine_margarita_glass.png b/mods/wine/textures/wine_margarita_glass.png new file mode 100644 index 00000000..efebb3fb Binary files /dev/null and b/mods/wine/textures/wine_margarita_glass.png differ diff --git a/mods/wine/textures/wine_sparkling_agave_juice_bottle.png b/mods/wine/textures/wine_sparkling_agave_juice_bottle.png new file mode 100644 index 00000000..aae2fd76 Binary files /dev/null and b/mods/wine/textures/wine_sparkling_agave_juice_bottle.png differ diff --git a/mods/wine/textures/wine_sparkling_agave_juice_glass.png b/mods/wine/textures/wine_sparkling_agave_juice_glass.png new file mode 100644 index 00000000..2b2c1227 Binary files /dev/null and b/mods/wine/textures/wine_sparkling_agave_juice_glass.png differ diff --git a/mods/wine/textures/wine_sparkling_apple_juice_bottle.png b/mods/wine/textures/wine_sparkling_apple_juice_bottle.png new file mode 100644 index 00000000..53c0b7f9 Binary files /dev/null and b/mods/wine/textures/wine_sparkling_apple_juice_bottle.png differ diff --git a/mods/wine/textures/wine_sparkling_apple_juice_glass.png b/mods/wine/textures/wine_sparkling_apple_juice_glass.png new file mode 100644 index 00000000..3fd18f1e Binary files /dev/null and b/mods/wine/textures/wine_sparkling_apple_juice_glass.png differ diff --git a/mods/wine/textures/wine_sparkling_blackberry_juice_bottle.png b/mods/wine/textures/wine_sparkling_blackberry_juice_bottle.png new file mode 100644 index 00000000..4b7b765e Binary files /dev/null and b/mods/wine/textures/wine_sparkling_blackberry_juice_bottle.png differ diff --git a/mods/wine/textures/wine_sparkling_blackberry_juice_glass.png b/mods/wine/textures/wine_sparkling_blackberry_juice_glass.png new file mode 100644 index 00000000..15734352 Binary files /dev/null and b/mods/wine/textures/wine_sparkling_blackberry_juice_glass.png differ diff --git a/mods/wine/textures/wine_sparkling_carrot_juice_bottle.png b/mods/wine/textures/wine_sparkling_carrot_juice_bottle.png new file mode 100644 index 00000000..0fec61ba Binary files /dev/null and b/mods/wine/textures/wine_sparkling_carrot_juice_bottle.png differ diff --git a/mods/wine/textures/wine_sparkling_carrot_juice_glass.png b/mods/wine/textures/wine_sparkling_carrot_juice_glass.png new file mode 100644 index 00000000..d6b27dd3 Binary files /dev/null and b/mods/wine/textures/wine_sparkling_carrot_juice_glass.png differ diff --git a/mods/wine/textures/wine_wheat_beer_glass.png b/mods/wine/textures/wine_wheat_beer_glass.png index d88883c3..6fa2b576 100644 Binary files a/mods/wine/textures/wine_wheat_beer_glass.png and b/mods/wine/textures/wine_wheat_beer_glass.png differ diff --git a/mods/wool/README.md b/mods/wool/README.md index 71b803ce..e0f93b4d 100644 --- a/mods/wool/README.md +++ b/mods/wool/README.md @@ -1,11 +1,23 @@ -Wool mod for Minetest +Minetest Game mod: wool +======================= +See license.txt for license information. -by TenPlus1 +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) -Yep, it's a simple replacement for the wool mod that allows you to dye any -wool any colour including white, and I've also added a wool sound when walking -on top of the wool blocks to replace the leaves sound. +Authors of media (textures) +--------------------------- +PixelBox wool textures by Gambit (WTFPL): + wool_black.png wool_brown.png wool_dark_green.png wool_green.png + wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png + wool_blue.png wool_cyan.png wool_dark_grey.png wool_grey.png + wool_orange.png wool_red.png wool_white.png -Textures are from Gambit's PixelBox texture pack. +Changes by TenPlus1 +------------------- +Coloured wool can be dyed back to white and wool blocks now have their +own wool sounds. Wool blocks can also be used as fuel in furnace. -Sound is from freeSFX.co.uk and has a creative-commons license +Sound is from freesfx.co.uk and has a Creative Commons License diff --git a/mods/wool/depends.txt b/mods/wool/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/wool/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/wool/init.lua b/mods/wool/init.lua index 5a9f341a..6ef58721 100644 --- a/mods/wool/init.lua +++ b/mods/wool/init.lua @@ -1,67 +1,78 @@ +-- wool/init.lua + +-- Translation support +local S = minetest.get_translator("wool") + +-- new sound for wool +function default.node_wool_defaults(tbl) + + tbl = tbl or {} + + tbl.footstep = tbl.footstep or {name = "wool_coat_movement", gain = 1.0} + tbl.dug = tbl.dug or {name = "wool_coat_movement", gain = 0.25} + tbl.place = tbl.place or {name = "default_place_node", gain = 1.0} + + return tbl +end + +local dyes = dye.dyes + +for i = 1, #dyes do + + local name, desc = unpack(dyes[i]) + local color_group = "color_" .. name + + minetest.register_node("wool:" .. name, { + description = S(desc .. " Wool"), + tiles = {"wool_" .. name .. ".png"}, + is_ground_content = false, + groups = { + snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1, [color_group] = 1 + }, + sounds = default.node_wool_defaults() + }) + + minetest.register_craft{ + output = "wool:" .. name, + recipe = { + {"group:wool", "group:dye," .. color_group} + } + } +end + +-- Legacy (Backwards compatibility with jordach's 16-color wool mod) minetest.register_alias("wool:dark_blue", "wool:blue") minetest.register_alias("wool:gold", "wool:yellow") -function default.node_wool_defaults(table) - - table = table or {} - - table.footstep = table.footstep or - {name = "wool_coat_movement", gain = 1.0} - - table.dug = table.dug or - {name = "wool_coat_movement", gain = 0.25} - - table.place = table.place or - {name = "default_place_node", gain = 1.0} - - return table -end - -local wool_sound = default.node_wool_defaults() ---local wool_sound = default.node_sound_leaves_defaults() - -local wool_dyes = { - {"white", "White"}, - {"grey", "Grey"}, - {"black", "Black"}, - {"red", "Red"}, - {"yellow", "Yellow"}, - {"green", "Green"}, - {"cyan", "Cyan"}, - {"blue", "Blue"}, - {"magenta", "Magenta"}, - {"orange", "Orange"}, - {"violet", "Violet"}, - {"brown", "Brown"}, - {"pink", "Pink"}, - {"dark_grey", "Dark Grey"}, - {"dark_green", "Dark Green"}, -} - -for _, row in pairs(wool_dyes) do - - minetest.register_node("wool:" .. row[1], { - description = row[2] .. " Wool", - tiles = {"wool_" .. row[1] .. ".png"}, - groups = { - snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, - flammable = 3, wool = 1 - }, - sounds = wool_sound, - }) - - minetest.register_craft({ - type = "shapeless", - output = "wool:" .. row[1], - recipe = {"dye:" .. row[1], "group:wool"}, - }) - -end - +-- use wool as fuel minetest.register_craft({ type = "fuel", recipe = "group:wool", - burntime = 2, + burntime = 2 }) -print ("[MOD] Wool mod loaded") +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this run: +-- for _,e in ipairs(dye.dyes) do print(("S(%q)"):format(e[2].." Wool")) end + +--[[ +S("White Wool") +S("Grey Wool") +S("Dark Grey Wool") +S("Black Wool") +S("Violet Wool") +S("Blue Wool") +S("Cyan Wool") +S("Dark Green Wool") +S("Green Wool") +S("Yellow Wool") +S("Brown Wool") +S("Orange Wool") +S("Red Wool") +S("Magenta Wool") +S("Pink Wool") +--]] + + +print ("[MOD] Wool loaded") diff --git a/mods/wool/license.txt b/mods/wool/license.txt new file mode 100644 index 00000000..8134c920 --- /dev/null +++ b/mods/wool/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/wool/locale/template.txt b/mods/wool/locale/template.txt new file mode 100644 index 00000000..316cd2c0 --- /dev/null +++ b/mods/wool/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool= +Grey Wool= +Dark Grey Wool= +Black Wool= +Violet Wool= +Blue Wool= +Cyan Wool= +Dark Green Wool= +Green Wool= +Yellow Wool= +Brown Wool= +Orange Wool= +Red Wool= +Magenta Wool= +Pink Wool= diff --git a/mods/wool/locale/wool.de.tr b/mods/wool/locale/wool.de.tr new file mode 100644 index 00000000..9b6b8ab8 --- /dev/null +++ b/mods/wool/locale/wool.de.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Weiße Wolle +Grey Wool=Graue Wolle +Dark Grey Wool=Dunkelgraue Wolle +Black Wool=Schwarze Wolle +Violet Wool=Violette Wolle +Blue Wool=Blaue Wolle +Cyan Wool=Türkise Wolle +Dark Green Wool=Dunkelgrüne Wolle +Green Wool=Grüne Wolle +Yellow Wool=Gelbe Wolle +Brown Wool=Braune Wolle +Orange Wool=Orange Wolle +Red Wool=Rote Wolle +Magenta Wool=Magenta Wolle +Pink Wool=Rosa Wolle diff --git a/mods/wool/locale/wool.eo.tr b/mods/wool/locale/wool.eo.tr new file mode 100644 index 00000000..16e3e004 --- /dev/null +++ b/mods/wool/locale/wool.eo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Blanka Lano +Grey Wool=Griza Lano +Dark Grey Wool=Malhela Griza Lano +Black Wool=Nigra Lano +Violet Wool=Violkolora Lano +Blue Wool=Blua Lano +Cyan Wool=Bluverda Lano +Dark Green Wool=Malhela Verda Lano +Green Wool=Verda Lano +Yellow Wool=Flava Lano +Brown Wool=Bruna Lano +Orange Wool=Oranĝkolora Lano +Red Wool=Ruĝa Lano +Magenta Wool=Fuksina Lano +Pink Wool=Rozkolora Lano diff --git a/mods/wool/locale/wool.es.tr b/mods/wool/locale/wool.es.tr new file mode 100644 index 00000000..ac155920 --- /dev/null +++ b/mods/wool/locale/wool.es.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana blanca +Grey Wool=Lana gris +Dark Grey Wool=Lana gris oscuro +Black Wool=Lana negra +Violet Wool=Lana violeta +Blue Wool=Lana azul +Cyan Wool=Lana cián +Dark Green Wool=Lana verde oscuro +Green Wool=Lana verde +Yellow Wool=Lana amarilla +Brown Wool=Lana marrón +Orange Wool=Lana naranja +Red Wool=Lana roja +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/mods/wool/locale/wool.fr.tr b/mods/wool/locale/wool.fr.tr new file mode 100644 index 00000000..48a60a7e --- /dev/null +++ b/mods/wool/locale/wool.fr.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Laine blanche +Grey Wool=Laine grise +Dark Grey Wool=Laine grise foncée +Black Wool=Laine noire +Violet Wool=Laine violette +Blue Wool=Laine bleue +Cyan Wool=Laine cyan +Dark Green Wool=Laine verte foncée +Green Wool=Laine verte +Yellow Wool=Laine jaune +Brown Wool=Laine marron +Orange Wool=Laine orange +Red Wool=Laine rouge +Magenta Wool=Laine magenta +Pink Wool=Laine rose diff --git a/mods/wool/locale/wool.id.tr b/mods/wool/locale/wool.id.tr new file mode 100644 index 00000000..2448e436 --- /dev/null +++ b/mods/wool/locale/wool.id.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Wol Putih +Grey Wool=Wol Abu +Dark Grey Wool=Wol Abu Tua +Black Wool=Wol Hitam +Violet Wool=Wol Ungu +Blue Wool=Wol Biru +Cyan Wool=Wol Sian +Dark Green Wool=Wol Hijau Tua +Green Wool=Wol Hijau +Yellow Wool=Wol Kuning +Brown Wool=Wol Cokelat +Orange Wool=Wol Oranye +Red Wool=Wol Merah +Magenta Wool=Wol Magenta +Pink Wool=Wol Merah Jambu diff --git a/mods/wool/locale/wool.it.tr b/mods/wool/locale/wool.it.tr new file mode 100644 index 00000000..8108f2fc --- /dev/null +++ b/mods/wool/locale/wool.it.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana bianca +Grey Wool=Lana grigia +Dark Grey Wool=Lana grigia scura +Black Wool=Lana nera +Violet Wool=Lana viola +Blue Wool=Lana blu +Cyan Wool=Lana ciano +Dark Green Wool=Lana verde scura +Green Wool=Lana verde +Yellow Wool=Lana gialla +Brown Wool=Lana marrone +Orange Wool=Lana arancione +Red Wool=Lana rossa +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/mods/wool/locale/wool.ja.tr b/mods/wool/locale/wool.ja.tr new file mode 100644 index 00000000..5051f9e7 --- /dev/null +++ b/mods/wool/locale/wool.ja.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白色の羊毛 +Grey Wool=灰色の羊毛 +Dark Grey Wool=濃灰色の羊毛 +Black Wool=黒色の羊毛 +Violet Wool=紫色の羊毛 +Blue Wool=青色の羊毛 +Cyan Wool=青緑色の羊毛 +Dark Green Wool=濃緑色の羊毛 +Green Wool=緑色の羊毛 +Yellow Wool=黄色の羊毛 +Brown Wool=茶色の羊毛 +Orange Wool=橙色の羊毛 +Red Wool=赤色の羊毛 +Magenta Wool=赤紫色の羊毛 +Pink Wool=桃色の羊毛 diff --git a/mods/wool/locale/wool.jbo.tr b/mods/wool/locale/wool.jbo.tr new file mode 100644 index 00000000..4bf44ecf --- /dev/null +++ b/mods/wool/locale/wool.jbo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=lo blabi sunla +Grey Wool=lo grusi sunla +Dark Grey Wool=lo xekri grusi sunla +Black Wool=lo xekri sunla +Violet Wool=lo zirpu sunla +Blue Wool=lo blanu sunla +Cyan Wool=lo cicna sunla +Dark Green Wool=lo xekri crino sunla +Green Wool=lo crino sunla +Yellow Wool=lo pelxu sunla +Brown Wool=lo bunre sunla +Orange Wool=lo narju sunla +Red Wool=lo xunre sunla +Magenta Wool=lo nukni sunla +Pink Wool=lo xunblabi sunla diff --git a/mods/wool/locale/wool.ms.tr b/mods/wool/locale/wool.ms.tr new file mode 100644 index 00000000..18b54805 --- /dev/null +++ b/mods/wool/locale/wool.ms.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Bulu Biri-Biri Putih +Grey Wool=Bulu Biri-Biri Kelabu +Dark Grey Wool=Bulu Biri-Biri Kelabu Gelap +Black Wool=Bulu Biri-Biri Hitam +Violet Wool=Bulu Biri-Biri Ungu +Blue Wool=Bulu Biri-Biri Biru +Cyan Wool=Bulu Biri-Biri Biru Kehijauan +Dark Green Wool=Bulu Biri-Biri Hijau Gelap +Green Wool=Bulu Biri-Biri Hijau +Yellow Wool=Bulu Biri-Biri Kuning +Brown Wool=Bulu Biri-Biri Perang +Orange Wool=Bulu Biri-Biri Jingga +Red Wool=Bulu Biri-Biri Merah +Magenta Wool=Bulu Biri-Biri Merah Lembayung +Pink Wool=Bulu Biri-Biri Merah Jambu diff --git a/mods/wool/locale/wool.pl.tr b/mods/wool/locale/wool.pl.tr new file mode 100644 index 00000000..9c411c81 --- /dev/null +++ b/mods/wool/locale/wool.pl.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Biała wełna +Grey Wool=Szara wełna +Dark Grey Wool=Ciemnoszara wełna +Black Wool=Czarna wełna +Violet Wool=Fioletowa wełna +Blue Wool=Niebieska wełna +Cyan Wool=Cyjanowa wełna +Dark Green Wool=Ciemnozielona wełna +Green Wool=Zielona wełna +Yellow Wool=Żółta wełna +Brown Wool=Brązowa wełna +Orange Wool=Pomarańczowa wełna +Red Wool=Czerwona wełna +Magenta Wool=Karmazynowa wełna +Pink Wool=Różowa wełna diff --git a/mods/wool/locale/wool.pt_BR.tr b/mods/wool/locale/wool.pt_BR.tr new file mode 100644 index 00000000..7676191e --- /dev/null +++ b/mods/wool/locale/wool.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lã Branca +Grey Wool=Lã Cinza +Dark Grey Wool=Lã Cinza-escuro +Black Wool=Lã Preta +Violet Wool=Lã Violeta +Blue Wool=Lã Azul +Cyan Wool=Lã Ciano +Dark Green Wool=Lã Verde-escuro +Green Wool=Lã Verde +Yellow Wool=Lã Amarela +Brown Wool=Lã Marrom +Orange Wool=Lã Laranja +Red Wool=Lã Vermelha +Magenta Wool=Lã Magenta +Pink Wool=Lã Rosa diff --git a/mods/wool/locale/wool.ru.tr b/mods/wool/locale/wool.ru.tr new file mode 100644 index 00000000..f5a98aa1 --- /dev/null +++ b/mods/wool/locale/wool.ru.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Белая Шерсть +Grey Wool=Серая Шерсть +Dark Grey Wool=Тёмно-Серая Шерсть +Black Wool=Чёрная Шерсть +Violet Wool=Фиолетовая Шерсть +Blue Wool=Синяя Шерсть +Cyan Wool=Голубая Шерсть +Dark Green Wool=Тёмно-Зелёная Шерсть +Green Wool=Зелёная Шерсть +Yellow Wool=Жёлтая Шерсть +Brown Wool=Коричневая Шерсть +Orange Wool=Оранжевая Шерсть +Red Wool=Красная Шерсть +Magenta Wool=Пурпурная Шерсть +Pink Wool=Розовая Шерсть diff --git a/mods/wool/locale/wool.sk.tr b/mods/wool/locale/wool.sk.tr new file mode 100644 index 00000000..755370e8 --- /dev/null +++ b/mods/wool/locale/wool.sk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Biela vlna +Grey Wool=Šedá vlna +Dark Grey Wool=Tmavošedá vlna +Black Wool=Čierna vlna +Violet Wool=Fialová vlna +Blue Wool=Modrá vlna +Cyan Wool=Tyrkysová vlna +Dark Green Wool=Tmavozelená vlna +Green Wool=Zelená vlna +Yellow Wool=Žltá vlna +Brown Wool=Hnedá vlna +Orange Wool=Oranžová vlna +Red Wool=Červená vlna +Magenta Wool=Purpurová vlna +Pink Wool=Ružová vlna diff --git a/mods/wool/locale/wool.sv.tr b/mods/wool/locale/wool.sv.tr new file mode 100644 index 00000000..bfce2140 --- /dev/null +++ b/mods/wool/locale/wool.sv.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Vit ull +Grey Wool=Grå ull +Dark Grey Wool=Mörkgrå ull +Black Wool=Svart ull +Violet Wool=Violett ull +Blue Wool=Blå ull +Cyan Wool=Cyan ull +Dark Green Wool=Mörkgrön ull +Green Wool=Grön ull +Yellow Wool=Gul ull +Brown Wool=Brun ull +Orange Wool=Orange ull +Red Wool=Röd ull +Magenta Wool=Magenta ull +Pink Wool=Rosa ull diff --git a/mods/wool/locale/wool.uk.tr b/mods/wool/locale/wool.uk.tr new file mode 100644 index 00000000..b9a3f7a1 --- /dev/null +++ b/mods/wool/locale/wool.uk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Біла Шерсть +Grey Wool=Сіра Шерсть +Dark Grey Wool=Темно-Сіра Шерсть +Black Wool=Чорна Шерсть +Violet Wool=Фіолетова Шерсть +Blue Wool=Синя Шерсть +Cyan Wool=Голуба Шерсть +Dark Green Wool=Темно-Зелена Шерсть +Green Wool=Зелена Шерсть +Yellow Wool=Жовта Шерсть +Brown Wool=Коричнева Шерсть +Orange Wool=Оранжева Шерсть +Red Wool=Червона Шерсть +Magenta Wool=Пурпурна Шерсть +Pink Wool=Рожева Шерсть diff --git a/mods/wool/locale/wool.zh_CN.tr b/mods/wool/locale/wool.zh_CN.tr new file mode 100644 index 00000000..caac9ee2 --- /dev/null +++ b/mods/wool/locale/wool.zh_CN.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=灰羊毛 +Dark Grey Wool=暗灰羊毛 +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=蓝羊毛 +Cyan Wool=青羊毛 +Dark Green Wool=暗绿羊毛 +Green Wool=绿羊毛 +Yellow Wool=黄羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=红羊毛 +Magenta Wool=品红羊毛 +Pink Wool=粉红羊毛 diff --git a/mods/wool/locale/wool.zh_TW.tr b/mods/wool/locale/wool.zh_TW.tr new file mode 100644 index 00000000..290a1fed --- /dev/null +++ b/mods/wool/locale/wool.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=灰羊毛 +Dark Grey Wool=暗灰羊毛 +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=藍羊毛 +Cyan Wool=青羊毛 +Dark Green Wool=暗綠羊毛 +Green Wool=綠羊毛 +Yellow Wool=黃羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=紅羊毛 +Magenta Wool=品紅羊毛 +Pink Wool=粉紅羊毛 diff --git a/mods/wool/mod.conf b/mods/wool/mod.conf index 5ab8865e..a0ca3f0e 100644 --- a/mods/wool/mod.conf +++ b/mods/wool/mod.conf @@ -1,3 +1,3 @@ name = wool -depends = default -description = Adds wool blocks into game. +description = Minetest Game mod: wool +depends = default, dye diff --git a/mods/xban2/LICENSE b/mods/xban2/LICENSE new file mode 100644 index 00000000..aea08cc6 --- /dev/null +++ b/mods/xban2/LICENSE @@ -0,0 +1,24 @@ +BSD 2-Clause License + +Copyright (c) 2014-2023, Diego Martínez + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mods/xban2/init.lua b/mods/xban2/init.lua index 09385bd5..0940cb00 100644 --- a/mods/xban2/init.lua +++ b/mods/xban2/init.lua @@ -25,6 +25,7 @@ end local ACTION = make_logger("action") local WARNING = make_logger("warning") +local ERROR = make_logger("error") local unit_to_secs = { s = 1, m = 60, h = 3600, @@ -343,18 +344,12 @@ end local function save_db() minetest.after(SAVE_INTERVAL, save_db) - local f, e = io.open(DB_FILENAME, "wt") db.timestamp = os.time() - if f then - local ok, err = f:write(xban.serialize(db)) - if not ok then - WARNING("Unable to save database: %s", err) - end - else - WARNING("Unable to save database: %s", e) + local contents = assert(xban.serialize_db(db)) + local ok = minetest.safe_file_write(DB_FILENAME, contents) + if not ok then + ERROR("Unable to save database") end - if f then f:close() end - return end local function load_db() @@ -368,7 +363,7 @@ local function load_db() WARNING("Unable to load database: %s", "Read failed") return end - local t, e2 = minetest.deserialize(cont) + local t, e2 = xban.deserialize_db(cont) if not t then WARNING("Unable to load database: %s", "Deserialization failed: "..(e2 or "unknown error")) diff --git a/mods/xban2/serialize.lua b/mods/xban2/serialize.lua index c159141a..0a54212f 100644 --- a/mods/xban2/serialize.lua +++ b/mods/xban2/serialize.lua @@ -27,5 +27,44 @@ local function my_serialize_2(t, level) end function xban.serialize(t) + minetest.log("warning", "[xban2] xban.serialize() is deprecated") return "return {\n"..my_serialize_2(t, 1).."\n}" end + +-- JSON doesn't allow combined string+number keys, this function moves any +-- number keys into an "entries" table +function xban.serialize_db(t) + local res = {} + local entries = {} + for k, v in pairs(t) do + if type(k) == "number" then + entries[k] = v + else + res[k] = v + end + end + res.entries = entries + return minetest.write_json(res, true) +end + +function xban.deserialize_db(s) + if s:sub(1, 1) ~= "{" then + -- Load legacy databases + return minetest.deserialize(s) + end + + local res, err = minetest.parse_json(s) + if not res then + return nil, err + end + + -- Remove all "null"s added by empty tables + for i, entry in ipairs(res.entries or {}) do + entry.names = entry.names or {} + entry.record = entry.record or {} + res[i] = entry + end + res.entries = nil + + return res +end diff --git a/mods/xcompat/.luacheckrc b/mods/xcompat/.luacheckrc new file mode 100644 index 00000000..e46563b5 --- /dev/null +++ b/mods/xcompat/.luacheckrc @@ -0,0 +1,21 @@ +globals = { + "minetest", + "xcompat", +} + +read_globals = { + "default", + "mcl_sounds", + "ks_sounds", + "nodes_nature", + "fl_stone", + "fl_topsoil", + "fl_trees", + "hades_sounds", + "rp_sounds", + "mtt", + "sounds", + "player_api", + "mcl_player", + "fl_player", +} diff --git a/mods/xcompat/LICENSE b/mods/xcompat/LICENSE new file mode 100644 index 00000000..b04a4864 --- /dev/null +++ b/mods/xcompat/LICENSE @@ -0,0 +1,19 @@ + +MIT Copyright 2021-2024 wsor4035 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/xcompat/README.md b/mods/xcompat/README.md new file mode 100644 index 00000000..e3d1e265 --- /dev/null +++ b/mods/xcompat/README.md @@ -0,0 +1,34 @@ +# XCompat + +[![luacheck](https://github.com/mt-mods/xcompat/actions/workflows/luacheck.yml/badge.svg?branch=master)](https://github.com/mt-mods/xcompat/actions/workflows/luacheck.yml) +[![ContentDB](https://content.minetest.net/packages/mt-mods/xcompat/shields/downloads/)](https://content.minetest.net/packages/mt-mods/xcompat/) + +Provides cross compatibility between games and mods for sounds and crafting materials. + +Thanks to: +* MisterE, OgelGames, and Blockhead for naming advice/suggestion. +* luk3yx, Blockhead, BuckarooBanzai for bouncing ideas on the concept of this mod. + +## Usage + +See the respective sub apis doc file in /doc for detailed documentation. + +## Directly supported games and mods + +| Games | Sounds | Materials | Textures | Player | +| ----------------- | --------- | --------- | --------- | ------ | +| Minetest Game | x | x | x | x | +| MineClone2 | x | x | | x | +| Mineclonia | x | x | | x | +| Hades Revisited | x | x | | | +| Farlands Reloaded | x | x | x | x | +| Exile | x | | | | +| KSurvive 2 | x | | | | +| Forgotten Lands | x | | | | + +For functions see /doc/functions.md for the specifics relating to the function + +**Mods** +* `basic_materials` +* `mesecons_materials` +* `moreores` diff --git a/mods/xcompat/doc/functions.md b/mods/xcompat/doc/functions.md new file mode 100644 index 00000000..fd4541a1 --- /dev/null +++ b/mods/xcompat/doc/functions.md @@ -0,0 +1,13 @@ +# Functions API + +## `can_interact_with_node(player, pos)` +returns `bool` + +checks for the ability to interact with a node via: +* if a player +* owner metadata key +* protection_bypass + +supports +* minetest game default if present +* else polyfill \ No newline at end of file diff --git a/mods/xcompat/doc/gameid.md b/mods/xcompat/doc/gameid.md new file mode 100644 index 00000000..a09f9be5 --- /dev/null +++ b/mods/xcompat/doc/gameid.md @@ -0,0 +1,12 @@ +# GameId API + +## minetest versions >= 5.7 + +simply returns `minetest.get_game_info().id` + +## minetest versions < 5.7 + +approximates the gameid value via a hardcoded table of gameid=>modname +and then checks via `minetest.get_modpath()`. If it fails, it falls +back to using `xcompat_unknown_gameid` as the id. See the chart in the +readme for which games are supported \ No newline at end of file diff --git a/mods/xcompat/doc/materials.md b/mods/xcompat/doc/materials.md new file mode 100644 index 00000000..6eca5b36 --- /dev/null +++ b/mods/xcompat/doc/materials.md @@ -0,0 +1,3 @@ +# Materials API + +consult `/src/materials/minetest.lua` at this time \ No newline at end of file diff --git a/mods/xcompat/doc/player.md b/mods/xcompat/doc/player.md new file mode 100644 index 00000000..cdb84311 --- /dev/null +++ b/mods/xcompat/doc/player.md @@ -0,0 +1,13 @@ +# Player API + +mimic mtg player_api + +## NOTE + +`xcompat.player.player_attached` + +read/write from it is fine, looping over it is not as it is a proxy table. this +would need lua5.2 __pairs/__ipairs metamethods support which i could polyfill +for using https://stackoverflow.com/a/77354254 but didnt feel like doing at +this time. (luajit supports this via 5.2 extensions). additionally see issue: +https://github.com/minetest/minetest/issues/15133 \ No newline at end of file diff --git a/mods/xcompat/doc/sounds.md b/mods/xcompat/doc/sounds.md new file mode 100644 index 00000000..3b13d62f --- /dev/null +++ b/mods/xcompat/doc/sounds.md @@ -0,0 +1,35 @@ +# Sound API + +## Option 1: Agnostically depend + +You can do this by using a custom field in your node def instead of the `sounds` key. + +```lua +minetest.register_node(nodename, { + ... + _sound_def = { + key = "", + input = {}, + }, + ... +}) +``` + +where: + +* key: string name of the field from the sound api you want to use, for example `node_sound_stone_defaults` +* input: table input of fields you want passed to the key field, used to override specific sounds. + +## Option 2: Hard depend + +add this mod to your mod.confs depends and directly call the sound_api as follows + +```lua +minetest.register_node(nodename, { + ... + sounds = xcompat.sounds.node_sound_stone_defaults(input) + ... +}) +``` + +* input: optional table to override some or all of returned values \ No newline at end of file diff --git a/mods/xcompat/doc/textures.md b/mods/xcompat/doc/textures.md new file mode 100644 index 00000000..973e9341 --- /dev/null +++ b/mods/xcompat/doc/textures.md @@ -0,0 +1,3 @@ +# Textures API + +consult `/src/texture/minetest.lua` at this time \ No newline at end of file diff --git a/mods/xcompat/gitattributes b/mods/xcompat/gitattributes new file mode 100644 index 00000000..1a19d520 --- /dev/null +++ b/mods/xcompat/gitattributes @@ -0,0 +1,2 @@ +test export-ignore +.github export-ignore \ No newline at end of file diff --git a/mods/xcompat/init.lua b/mods/xcompat/init.lua new file mode 100644 index 00000000..883b0d3e --- /dev/null +++ b/mods/xcompat/init.lua @@ -0,0 +1,51 @@ +local modpath = minetest.get_modpath("xcompat") + +xcompat = { + modpath = modpath, +} + +xcompat.gameid = dofile(modpath .. "/src/gameid.lua") +xcompat.utilities = dofile(modpath .. "/src/utilities.lua") + +xcompat.sounds = dofile(modpath .. "/src/sounds.lua") +xcompat.materials = dofile(modpath .. "/src/materials.lua") +xcompat.textures = dofile(modpath .. "/src/textures.lua") +xcompat.functions = dofile(modpath .. "/src/functions.lua") +xcompat.player = dofile(modpath .. "/src/player.lua") + +local function validate_sound(key) + if key and xcompat.sounds[key] then + return true + elseif key then + minetest.log("warning", "attempted to call invalid sound: "..key) + else + minetest.log("warning", "sound_def is missing a sound_api key") + end + return false +end + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_nodes) do + if def._sound_def and validate_sound(def._sound_def.key) then + minetest.override_item(name, { + sounds = xcompat.sounds[def._sound_def.key](def._sound_def.input) + }) + end + end + + local old_reg_node = minetest.register_node + function minetest.register_node(name, def) + if def._sound_def and validate_sound(def._sound_def.key) then + def.sounds = xcompat.sounds[def._sound_def.key](def._sound_def.input) + end + + old_reg_node(name, def) + end +end) + +dofile(modpath .. "/src/commands.lua") + +if minetest.get_modpath("mtt") and mtt.enabled then + -- register tests + dofile(modpath .. "/mtt.lua") +end diff --git a/mods/xcompat/mod.conf b/mods/xcompat/mod.conf new file mode 100644 index 00000000..cdecf52b --- /dev/null +++ b/mods/xcompat/mod.conf @@ -0,0 +1,3 @@ +name = xcompat +description = Provides cross compatibility between mods and games for sounds and crafting materials. +optional_depends = default, fl_stone, fl_trees, mcl_sounds, hades_sounds, ks_sounds, nodes_nature, fl_topsoil, fl_trees, mcl_core, farming, x_farming, sounds, mtt, player_api, mcl_player, fl_player diff --git a/mods/xcompat/mtt.lua b/mods/xcompat/mtt.lua new file mode 100644 index 00000000..e407cfef --- /dev/null +++ b/mods/xcompat/mtt.lua @@ -0,0 +1,10 @@ + +-- emerge a part of the world (basic smoketest) +mtt.emerge_area({ x=0, y=0, z=0 }, { x=10, y=10, z=10 }) + +-- check nodelist +local mtt_nodelist = minetest.settings:get("mtt_nodelist") +if mtt_nodelist then + -- nodelist specified, check if all the required nodes are present + mtt.validate_nodenames(minetest.get_modpath("xcompat") .. "/test/nodelist/" .. mtt_nodelist) +end \ No newline at end of file diff --git a/mods/xcompat/src/commands.lua b/mods/xcompat/src/commands.lua new file mode 100644 index 00000000..15bf4e76 --- /dev/null +++ b/mods/xcompat/src/commands.lua @@ -0,0 +1,76 @@ +local materials_list = minetest.get_dir_list(xcompat.modpath.."/src/materials", false) +local materials = {} +for _, material in ipairs(materials_list) do + local gameid = material:sub(1, -5) + materials[gameid] = dofile(xcompat.modpath.."/src/materials/"..material) +end + +local textures_list = minetest.get_dir_list(xcompat.modpath.."/src/textures", false) +local textures = {} +for _, texture in ipairs(textures_list) do + local gameid = texture:sub(1, -5) + textures[gameid] = dofile(xcompat.modpath.."/src/textures/"..texture) +end + +local sounds_list = minetest.get_dir_list(xcompat.modpath.."/src/sounds", false) +local sounds = {} +for _, sound in ipairs(sounds_list) do + local gameid = sound:sub(1, -5) + sounds[gameid] = dofile(xcompat.modpath.."/src/sounds/"..sound) +end + +minetest.register_chatcommand("xcompat_test_materials", { + description = "Test materials", + privs = {server=true}, + func = function(name, _) + local reference_materials = materials["minetest"] + + for gameid, game_materials in pairs(materials) do + for material, _ in pairs(reference_materials) do + if not game_materials[material] then + minetest.chat_send_player(name, "Missing material: "..material.." in game: "..gameid) + end + end + end + + minetest.chat_send_player(name, "Materials test complete") + end +}) + +--WARNING: only handles top level of table currently +--TODO: handle nested tables +minetest.register_chatcommand("xcompat_test_textures", { + description = "Test textures", + privs = {server=true}, + func = function(name, _) + local reference_textures = textures["xcompat_agnostic"] + + for gameid, game_textures in pairs(textures) do + for texture, _ in pairs(reference_textures) do + if not game_textures[texture] then + minetest.chat_send_player(name, "Missing texture: "..texture.." in game: "..gameid) + end + end + end + + minetest.chat_send_player(name, "Textures test complete") + end +}) + +minetest.register_chatcommand("xcompat_test_sounds", { + description = "Test sounds", + privs = {server=true}, + func = function(name, _) + local reference_sounds = sounds["xcompat_agnostic"] + + for gameid, game_sounds in pairs(sounds) do + for sound, _ in pairs(reference_sounds) do + if not game_sounds[sound] then + minetest.chat_send_player(name, "Missing sound: "..sound.." in game: "..gameid) + end + end + end + + minetest.chat_send_player(name, "Sounds test complete") + end +}) diff --git a/mods/xcompat/src/functions.lua b/mods/xcompat/src/functions.lua new file mode 100644 index 00000000..51700b93 --- /dev/null +++ b/mods/xcompat/src/functions.lua @@ -0,0 +1,55 @@ +local functions = {} + +function functions.can_interact_with_node(player, pos) + --if we have default, use it + if default then return default.can_interact_with_node(player, pos) end + + local owner = minetest.get_meta(pos):get_string("owner") or "" + + --check that we have a valid player + if not player or not player:is_player() then return false end + --check there privs for compat with areas + if minetest.check_player_privs(player, "protection_bypass") then return true end + --if a normal player, check if they are the owner + if owner == "" or owner == player:get_player_name() then return true end + + return false +end + +function functions.sapling_on_place( + itemstack, player, pointed_thing, sapling_name, minp_relative, maxp_relative, interval +) + if default then + return default.sapling_on_place( + itemstack, player, pointed_thing, sapling_name, minp_relative, maxp_relative, interval + ) + end + + local pos = pointed_thing.above + local pname = player and player:get_player_name() or "" + local below_node = minetest.get_node_or_nil(pointed_thing.under) + + if below_node and minetest.registered_items[below_node.name] and + minetest.registered_items[below_node.name].buildable_to then + + pos = pointed_thing.under + end + + --check protection + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return itemstack + end + + --actually place sapling + minetest.set_node(pos, {name = sapling_name}) + + --handle survival + if not minetest.is_creative_enabled(pname) then + itemstack:take_item() + end + + return itemstack +end + +return functions \ No newline at end of file diff --git a/mods/xcompat/src/gameid.lua b/mods/xcompat/src/gameid.lua new file mode 100644 index 00000000..b21b0b1a --- /dev/null +++ b/mods/xcompat/src/gameid.lua @@ -0,0 +1,33 @@ +local game_alias = { + mineclone2 = "mineclonia", +} + +local game_modnames = { + mineclonia = "mcl_core", + farlands_reloaded = "fl_core", + minetest = "default", + hades = "hades_core", + exile = "exile_env_sounds", + ksurvive2 = "ks_metals", +} + +local gameid = "xcompat_unknown_gameid" + +if type(minetest.get_game_info) == "function" then + gameid = minetest.get_game_info().id +else + for game, modname in pairs(game_modnames) do + if minetest.get_modpath(modname) then + gameid = game + break + end + end +end + +--for games that are similar/derviatives of other games +if game_alias[gameid] then gameid = game_alias[gameid] end + +--while minetest game derviates are not supported, we can still try to detect them +if minetest.get_modpath("default") then gameid = "minetest" end + +return gameid \ No newline at end of file diff --git a/mods/xcompat/src/materials.lua b/mods/xcompat/src/materials.lua new file mode 100644 index 00000000..0512eafb --- /dev/null +++ b/mods/xcompat/src/materials.lua @@ -0,0 +1,8 @@ +local filename = xcompat.gameid + +--if we dont have a materials file for the game, use minetest +if not xcompat.utilities.file_exists(xcompat.modpath .. "/src/materials/" .. filename .. ".lua") then + filename = "minetest" +end + +return dofile(xcompat.modpath .. "/src/materials/" .. filename .. ".lua") diff --git a/mods/xcompat/src/materials/farlands_reloaded.lua b/mods/xcompat/src/materials/farlands_reloaded.lua new file mode 100644 index 00000000..7ed19551 --- /dev/null +++ b/mods/xcompat/src/materials/farlands_reloaded.lua @@ -0,0 +1,93 @@ +local materials = { + sand = "fl_stone:sand", + sandstone = "fl_stone:sandstone", + gravel = "fl_topsoil:gravel", + flint = "fl_topsoil:flint", + copper_ingot = "fl_ores:copper_ingot", + steel_ingot = "fl_ores:iron_ingot", + gold_ingot = "fl_ores:gold_ingot", + tin_ingot = "fl_ores:tin_ingot", + copper_block = "fl_ores:copper_block", + steel_block = "fl_ores:iron_block", + gold_block = "fl_ores:gold_block", + tin_block = "fl_ores:tin_block", + axe_steel = "fl_tools:steel_axe", + axe_diamond = "fl_tools:diamond_axe", + axe_bronze = "fl_tools:bronze_axe", + axe_stone = "fl_tools:stone_axe", + axe_wood = "fl_tools:wood_axe", + pick_steel = "fl_tools:steel_pick", + mese = "fl_ores:iron_ingot", + mese_crystal = "fl_ores:iron_ingot", + mese_crystal_fragment = "fl_ores:iron_ingot", + torch = "fl_light_sources:torch", + diamond = "fl_ores:diamond", + clay_lump = "fl_bricks:clay_lump", + water_bucket = "fl_bucket:bucket_water", + empty_bucket = "fl_bucket:bucket", + dye_dark_grey = "fl_dyes:dark_grey_dye", + dye_black = "fl_dyes:black_dye", + dye_white = "fl_dyes:white_dye", + dye_green = "fl_dyes:green_dye", + dye_red = "fl_dyes:red_dye", + dye_yellow = "fl_dyes:yellow_dye", + dye_brown = "fl_dyes:brown_dye", + dye_blue = "fl_dyes:blue_dye", + dye_violet = "fl_dyes:violet_dye", + dye_grey = "fl_dyes:grey_dye", + dye_dark_green = "fl_dyes:dark_green_dye", + dye_orange = "fl_dyes:orange_dye", + dye_pink = "fl_dyes:pink_dye", + dye_cyan = "fl_dyes:cyan_dye", + dye_magenta = "fl_dyes:magenta_dye", + silver_ingot = "fl_ores:iron_ingot", + silicon = "mesecons_materials:silicon", + string = "fl_plantlife:oxeye_daisy", + paper = "", + book = "", + iron_lump = "fl_ores:iron_ore", + wool_grey = "", + wool_green = "", + wool_dark_green = "", + wool_brown = "", + wool_black = "", + wool_white = "", + slab_stone = "fl_stone:stone_slab", + slab_wood = "fl_trees:apple_plank_slab", + glass = "fl_glass:framed_glass", + glass_block = "fl_glass:framed_glass", + glass_bottle = "fl_bottles:bottle", + coal_lump = "fl_ores:coal_ore", + stone = "fl_stone:stone", + desert_stone = "fl_stone:desert_stone", + desert_sand = "fl_stone:desert_sand", + chest = "fl_storage:wood_chest", + cobble = "fl_stone:stone_rubble", + brick = "", + obsidian_glass = "", + water_source = "fl_liquids:water_source", + water_flowing = "fl_liquids:water_flowing", + dirt = "fl_stone:dirt", + dirt_with_grass = "fl_topsoil:dirt_with_grass", + apple_leaves = "fl_trees:apple_leaves", + apple_log = "fl_trees:apple_trunk", + apple_planks = "fl_trees:apple_plank", + birch_leaves = "fl_trees:aspen_leaves", + birch_log = "fl_trees:aspen_trunk", + birch_planks = "fl_trees:aspen_plank", + jungle_leaves = "fl_trees:jungletree_leaves", + bowl = "", + stick = "fl_trees:stick", +} + +if minetest.get_modpath("basic_materials") then + materials.paper = "basic_materials:plastic_sheet" +end + +if minetest.registered_items["farming:bowl"] then + materials.bowl = "farming:bowl" +elseif minetest.get_modpath("x_farming") then + materials.bowl = "x_farming:bowl" +end + +return materials \ No newline at end of file diff --git a/mods/xcompat/src/materials/hades_revisited.lua b/mods/xcompat/src/materials/hades_revisited.lua new file mode 100644 index 00000000..a40f1f38 --- /dev/null +++ b/mods/xcompat/src/materials/hades_revisited.lua @@ -0,0 +1,107 @@ +local materials = { + sand = "hades_core:fertile_sand", + sandstone = "hades_core:sandstone", + gravel = "hades_core:gravel", + flint = "", + copper_ingot = "hades_core:copper_ingot", + steel_ingot = "hades_core:steel_ingot", + gold_ingot = "hades_core:gold_ingot", + tin_ingot = "hades_core:tin_ingot", + silver_ingot = "--unknown--", + copper_block = "hades_core:copperblock", + steel_block = "hades_core:steelblock", + gold_block = "hades_core:goldblock", + tin_block = "hades_core:tinblock", + axe_steel = "hades_core:axe_steel", + axe_diamond = "hades_core:axe_diamond", + axe_bronze = "hades_core:axe_bronze", + axe_stone = "hades_core:axe_stone", + axe_wood = "hades_core:axe_wood", + pick_steel = "hades_core:pick_steel", + mese = "hades_core:mese", + mese_crystal = "hades_core:mese_crystal", + mese_crystal_fragment = "hades_core:mese_crystal_fragment", + torch = "hades_torches:torch", + diamond = "hades_core:diamond", + clay_lump = "hades_core:clay_lump", + clay_brick = "hades_core:clay_brick", + + --[[ + Since hades doesnt have buckets or water for the user, + using dirt from near water to pull the water out + ]] + water_bucket = "hades_core:dirt", + empty_bucket = "hades_core:fertile_sand", + dye_dark_grey = "dye:dark_grey", + dye_black = "dye:black", + dye_white = "dye:white", + dye_green = "dye:green", + dye_red = "dye:red", + dye_yellow = "dye:yellow", + dye_brown = "dye:brown", + dye_blue = "dye:blue", + dye_violet = "dye:violet", + dye_grey = "dye:grey", + dye_dark_green = "dye:dark_green", + dye_orange = "dye:orange", + dye_pink = "dye:pink", + dye_cyan = "dye:cyan", + dye_magenta = "dye:magenta", + silicon = "hades_materials:silicon", + string = "hades_farming:string", + paper = "hades_core:paper", + book = "hades_core:book", + iron_lump = "hades_core:iron_lump", + wool_grey = "wool:grey", + wool_green = "wool:green", + wool_dark_green = "wool:dark_green", + wool_brown = "wool:brown", + wool_black = "wool:black", + wool_white = "wool:white", + slab_stone = "stairs:slab_stone", + slab_wood = "stairs:slab_wood", + glass = "hades_core:glass", + glass_block = "hades_core:glass", + glass_bottle = "vessels:glass_bottle", + obsidian_glass = "hades_core:obsidian_glass", + coal_lump = "hades_core:coal_lump", + stone = "hades_core:stone", + desert_stone = "hades_core:stone_baked", + desert_sand = "hades_core:volcanic_sand", + chest = "hades_chests:chest"; + cobble = "hades_core:cobble", + brick = "hades_core:brick", + water_source = "hades_core:water_source", + water_flowing = "hades_core:water_flowing", + dirt = "hades_core:dirt", + dirt_with_grass = "hades_core:dirt_with_grass", + apple_leaves = "hades_trees:leaves", + apple_log = "hades_trees:tree", + apple_planks = "hades_trees:wood", + birch_leaves = "hades_core:birch_leaves", + birch_log = "hades_trees:birch_tree", + birch_planks = "hades_trees:cream_wood", + jungle_leaves = "hades_trees:jungle_leaves", +--hades has no bowl but you get plate on eat so makes most sense? + bowl = "hades_food:plate", + stick = "hades_core:stick", +} + +if minetest.get_modpath("hades_bucket") then + materials["water_bucket"] = "hades_bucket:bucket_water" + materials["empty_bucket"] = "hades_bucket:bucket_empty" +end +if minetest.get_modpath("hades_extraores") then + materials["silver_ingot"] = "hades_extraores:silver_ingot" + materials["aluminum_ingot"] = "hades_extraores:aluminum_ingot" +end +if minetest.get_modpath("hades_default") then + materials.desert_sand = "hades_default:desert_sand" +end +if minetest.get_modpath("hades_technic") then + materials.lead_ingot = "hades_technic:lead_ingot" + materials.carbon_steel_ingot = "hades_technic:carbon_steel_ingot" + materials.stainless_steel_ingot = "hades_technic:stainless_steel_ingot" +end + +return materials \ No newline at end of file diff --git a/mods/xcompat/src/materials/mineclonia.lua b/mods/xcompat/src/materials/mineclonia.lua new file mode 100644 index 00000000..8b80ac55 --- /dev/null +++ b/mods/xcompat/src/materials/mineclonia.lua @@ -0,0 +1,96 @@ +--note this file handles mineclonia, mineclone2, and its rename voxelibre + +local materials = { + sand = "mcl_core:sand", + sandstone = "mcl_core:sandstone", + gravel = "mcl_core:gravel", + flint = "mcl_core:flint", + copper_ingot = "mcl_copper:copper_ingot", + steel_ingot = "mcl_core:iron_ingot", + gold_ingot = "mcl_core:gold_ingot", + tin_ingot = "mcl_core:iron_ingot", + copper_block = "mcl_copper:copper_block", + steel_block = "mcl_core:iron_block", + gold_block = "mcl_core:gold_block", + tin_block = "mcl_core:iron_block", + axe_steel = "mcl_core:axe_steel", + axe_diamond = "mcl_core:axe_diamond", + axe_bronze = "mcl_core:axe_bronze", + axe_stone = "mcl_core:axe_stone", + axe_wood = "mcl_core:axe_wood", + pick_steel = "mcl_core:pick_steel", + mese = "mesecons_torch:redstoneblock", + mese_crystal = "mesecons:redstone", + mese_crystal_fragment = "mcl_core:iron_ingot", + torch = "mcl_torches:torch", + diamond = "mcl_core:diamond", + clay_lump = "default:clay_lump", + water_bucket = "mcl_buckets:bucket_water", + empty_bucket = "mcl_buckets:bucket_empty", + dye_dark_grey = "mcl_dyes:dark_grey", + dye_black = "mcl_dyes:black", + dye_white = "mcl_dyes:white", + dye_green = "mcl_dyes:green", + dye_red = "mcl_dyes:red", + dye_yellow = "mcl_dyes:yellow", + dye_brown = "mcl_dyes:brown", + dye_blue = "mcl_dyes:blue", + dye_violet = "mcl_dyes:violet", + dye_grey = "mcl_dyes:grey", + dye_dark_green = "mcl_dyes:dark_green", + dye_orange = "mcl_dyes:orange", + dye_pink = "mcl_dyes:pink", + dye_cyan = "mcl_dyes:cyan", + dye_magenta = "mcl_dyes:magenta", + silicon = "mcl_core:iron_ingot", + string = "mcl_mobitems:string", + paper = "mcl_core:paper", + book = "mcl_core:book", + iron_lump = "mcl_core:stone_with_iron", + wool_grey = "mcl_wool:grey", + wool_green = "mcl_wool:green", + wool_dark_green = "mcl_wool:dark_green", + wool_brown = "mcl_wool:brown", + wool_black = "mcl_wool:black", + wool_white = "mcl_wool:white", + slab_stone = "mcl_stairs:slab_stone", + slab_wood = "mcl_stairs:slab_wood", + glass = "mcl_core:glass", + glass_block = "mcl_core:glass", + glass_bottle = "mcl_core:glass_bottle", + coal_lump = "mcl_core:coal", + stone = "mcl_core:stone", + desert_stone = "mcl_core:redsandstone", + desert_sand = "mcl_core:sand", + chest = "mcl_chests:chest", + cobble = "mcl_core:cobble", + brick = "mcl_core:brick", + obsidian_glass = "", + water_source = "mcl_core:water_source", + water_flowing = "mcl_core:water_flowing", + dirt = "mcl_core:dirt", + dirt_with_grass = "mcl_core:dirt_with_grass", + apple_leaves = "mcl_trees:leaves_oak", + apple_log = "mcl_trees:tree_oak", + apple_planks = "mcl_trees:wood_oak", + birch_leaves = "mcl_trees:leaves_birch", + birch_log = "mcl_trees:tree_birch", + birch_planks = "mcl_trees:wood_birch", + jungle_leaves = "mcl_trees:leaves_jungle", + bowl = "mcl_core:bowl", + stick = "mcl_core:stick", +} + +if minetest.get_modpath("moreores") then + materials.tin_ingot = "moreores:tin_ingot" + materials.tin_block = "moreores:tin_block" + materials.silver_ingot = "moreores:silver_ingot" +end + +if minetest.get_modpath("technic") then + materials.lead_ingot = "technic:lead_ingot" + materials.carbon_steel_ingot = "technic:carbon_steel_ingot" + materials.stainless_steel_ingot = "technic:stainless_steel_ingot" +end + +return materials diff --git a/mods/xcompat/src/materials/minetest.lua b/mods/xcompat/src/materials/minetest.lua new file mode 100644 index 00000000..feab7480 --- /dev/null +++ b/mods/xcompat/src/materials/minetest.lua @@ -0,0 +1,106 @@ +local materials = { + sand = "default:sand", + sandstone = "default:sandstone", + gravel = "default:gravel", + flint = "default:flint", + copper_ingot = "default:copper_ingot", + steel_ingot = "default:steel_ingot", + gold_ingot = "default:gold_ingot", + tin_ingot = "default:tin_ingot", + copper_block = "default:copperblock", + steel_block = "default:steelblock", + gold_block = "default:goldblock", + tin_block = "default:tinblock", + axe_steel = "default:axe_steel", + axe_diamond = "default:axe_diamond", + axe_bronze = "default:axe_bronze", + axe_stone = "default:axe_stone", + axe_wood = "default:axe_wood", + pick_steel = "default:pick_steel", + mese = "default:mese", + mese_crystal = "default:mese_crystal", + mese_crystal_fragment = "default:mese_crystal_fragment", + torch = "default:torch", + diamond = "default:diamond", + clay_lump = "default:clay_lump", + water_bucket = "bucket:bucket_water", + empty_bucket = "bucket:bucket_empty", + dye_dark_grey = "dye:dark_grey", + dye_black = "dye:black", + dye_white = "dye:white", + dye_green = "dye:green", + dye_red = "dye:red", + dye_yellow = "dye:yellow", + dye_brown = "dye:brown", + dye_blue = "dye:blue", + dye_violet = "dye:violet", + dye_grey = "dye:grey", + dye_dark_green = "dye:dark_green", + dye_orange = "dye:orange", + dye_pink = "dye:pink", + dye_cyan = "dye:cyan", + dye_magenta = "dye:magenta", + silicon = "mesecons_materials:silicon", + string = "farming:string", + paper = "default:paper", + book = "default:book", + iron_lump = "default:iron_lump", + wool_grey = "wool:grey", + wool_green = "wool:green", + wool_dark_green = "wool:dark_green", + wool_brown = "wool:brown", + wool_black = "wool:black", + wool_white = "wool:white", + slab_stone = "stairs:slab_stone", + slab_wood = "stairs:slab_wood", + glass = "default:glass", + glass_block = "default:glass", + glass_bottle = "vessels:glass_bottle", + coal_lump = "default:coal_lump", + stone = "default:stone", + desert_stone = "default:desert_stone", + desert_sand = "default:desert_sand", + chest = "default:chest", + cobble = "default:cobble", + brick = "default:brick", + obsidian_glass = "default:obsidian_glass", + water_source = "default:water_source", + water_flowing = "default:water_flowing", + dirt = "default:dirt", + dirt_with_grass = "default:dirt_with_grass", + apple_leaves = "default:leaves", + apple_log = "default:tree", + apple_planks = "default:wood", + birch_leaves = "default:aspen_leaves", + birch_log = "default:aspen_tree", + birch_planks = "default:aspen_wood", + jungle_leaves = "default:jungleleaves", + bowl = "", + stick = "default:stick", +} + +if minetest.registered_items["farming:bowl"] then + materials.bowl = "farming:bowl" +elseif minetest.get_modpath("x_farming") then + materials.bowl = "x_farming:bowl" +end + +if minetest.get_modpath("moreores") then + materials.silver_ingot = "moreores:silver_ingot" +end + +if minetest.get_modpath("technic") then + materials.lead_ingot = "technic:lead_ingot" + materials.carbon_steel_ingot = "technic:carbon_steel_ingot" + materials.stainless_steel_ingot = "technic:stainless_steel_ingot" +end + +if minetest.get_modpath("aloz") then + materials.aluminum_ingot = "aloz:aluminum_ingot" +end + +if minetest.get_modpath("techage") then + materials.aluminum_ingot = "techage:aluminum" +end + +return materials \ No newline at end of file diff --git a/mods/xcompat/src/player.lua b/mods/xcompat/src/player.lua new file mode 100644 index 00000000..fa03f419 --- /dev/null +++ b/mods/xcompat/src/player.lua @@ -0,0 +1,8 @@ +local filename = xcompat.gameid + +--if we dont have a player file for the game, use minetest +if not xcompat.utilities.file_exists(xcompat.modpath .. "/src/player/" .. filename .. ".lua") then + filename = "xcompat_agnostic" +end + +return dofile(xcompat.modpath .. "/src/player/" .. filename .. ".lua") \ No newline at end of file diff --git a/mods/xcompat/src/player/farlands_reloaded.lua b/mods/xcompat/src/player/farlands_reloaded.lua new file mode 100644 index 00000000..288d9ba9 --- /dev/null +++ b/mods/xcompat/src/player/farlands_reloaded.lua @@ -0,0 +1,51 @@ +local papi = {} + +local models = {} +function papi.register_model(name, def) + models[name] = def +end + +function papi.set_model(player, model_name) + local model = models[model_name] + + if not model then return end + + player:set_properties({ + mesh = model_name, + textures = model.textures, + visual = "mesh", + visual_size = model.visual_size, + stepheight = model.stepheight + }) +end + +function papi.get_animation(_) + --stub to keep from crashing +end + +function papi.get_textures(player) + return player:get_properties().textures +end + +function papi.set_textures(player, textures) + player:set_properties({textures = textures}) +end + +function papi.set_animation(player, anim_name, speed, loop) + player:set_animation(fl_player.animations[anim_name], speed, 0, loop) +end + +local metatable = { + __index = function (_, key) + return fl_player.ignore[key] + end, + __newindex = function (_, key, value) + rawset(fl_player.ignore, key, value) + end +} + +papi.player_attached = {} + +setmetatable(papi.player_attached, metatable) + +return papi \ No newline at end of file diff --git a/mods/xcompat/src/player/mineclonia.lua b/mods/xcompat/src/player/mineclonia.lua new file mode 100644 index 00000000..4758be95 --- /dev/null +++ b/mods/xcompat/src/player/mineclonia.lua @@ -0,0 +1,40 @@ +local papi = {} + +function papi.register_model(name, def) + return mcl_player.player_register_model(name, def) +end + +function papi.set_model(player, model) + return mcl_player.player_set_model(player, model) +end + +function papi.get_animation(player) + return mcl_player.player_get_animation(player) +end + +function papi.get_textures(player) + return player:get_properties().textures +end + +function papi.set_textures(player, textures) + player:set_properties({textures = textures}) +end + +function papi.set_animation(player, anim_name, speed, _) + return mcl_player.player_set_animation(player, anim_name, speed) +end + +local metatable = { + __index = function (_, key) + return mcl_player.player_attached[key] + end, + __newindex = function (_, key, value) + rawset(mcl_player.player_attached, key, value) + end +} + +papi.player_attached = {} + +setmetatable(papi.player_attached, metatable) + +return papi \ No newline at end of file diff --git a/mods/xcompat/src/player/minetest.lua b/mods/xcompat/src/player/minetest.lua new file mode 100644 index 00000000..75f4f082 --- /dev/null +++ b/mods/xcompat/src/player/minetest.lua @@ -0,0 +1,41 @@ +local papi = {} + +function papi.register_model(name, def) + return player_api.register_model(name, def) +end + +function papi.set_model(player, model) + return player_api.set_model(player, model) +end + +function papi.get_animation(player) + return player_api.get_animation(player) +end + +function papi.get_textures(player) + return player_api.get_textures(player) +end + +function papi.set_textures(player, texture) + return player_api.set_textures(player, texture) +end + +function papi.set_animation(player, anim_name, speed, loop) + return player_api.set_animation(player, anim_name, speed, loop) +end + + +local metatable = { + __index = function (_, key) + return player_api.player_attached[key] + end, + __newindex = function (_, key, value) + rawset(player_api.player_attached, key, value) + end +} + +papi.player_attached = {} + +setmetatable(papi.player_attached, metatable) + +return papi \ No newline at end of file diff --git a/mods/xcompat/src/player/xcompat_agnostic.lua b/mods/xcompat/src/player/xcompat_agnostic.lua new file mode 100644 index 00000000..3a5523e9 --- /dev/null +++ b/mods/xcompat/src/player/xcompat_agnostic.lua @@ -0,0 +1,41 @@ +local papi = {} + +local models = {} +function papi.register_model(name, def) + models[name] = def +end + +function papi.set_model(player, model_name) + local model = models[model_name] + + if not model then return end + + player:set_properties({ + mesh = model_name, + textures = model.textures, + visual = "mesh", + visual_size = model.visual_size, + stepheight = model.stepheight + }) +end + +function papi.get_animation(_) + --stub to keep from crashing +end + +function papi.get_textures(player) + return player:get_properties().textures +end + +function papi.set_textures(player, textures) + player:set_properties({textures = textures}) +end + +function papi.set_animation(_, _, _, _) + --stub to keep from crashing +end + +--nothing to do here as we have no globalstep .....that we know about anyways +papi.player_attached = {} + +return papi \ No newline at end of file diff --git a/mods/xcompat/src/sounds.lua b/mods/xcompat/src/sounds.lua new file mode 100644 index 00000000..a8712593 --- /dev/null +++ b/mods/xcompat/src/sounds.lua @@ -0,0 +1,8 @@ +local filename = xcompat.gameid + +--if we dont have a materials file for the game, use minetest +if not xcompat.utilities.file_exists(xcompat.modpath .. "/src/sounds/" .. filename .. ".lua") then + filename = "xcompat_agnostic" +end + +return dofile(xcompat.modpath .. "/src/sounds/" .. filename .. ".lua") \ No newline at end of file diff --git a/mods/xcompat/src/sounds/exile.lua b/mods/xcompat/src/sounds/exile.lua new file mode 100644 index 00000000..c944ed65 --- /dev/null +++ b/mods/xcompat/src/sounds/exile.lua @@ -0,0 +1,67 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return nodes_nature.node_sound_default(soundtable) +end + +function sound_api.node_sound_stone_defaults(soundtable) + return nodes_nature.node_sound_stone_defaults(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return nodes_nature.node_sound_dirt_defaults(soundtable) +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return sound_api.node_sound_dirt_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return nodes_nature.node_sound_sand_defaults(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return nodes_nature.node_sound_gravel_defaults(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return nodes_nature.node_sound_wood_defaults(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return nodes_nature.node_sound_leaves_defaults(soundtable) +end + +function sound_api.node_sound_glass_defaults(soundtable) + return nodes_nature.node_sound_glass_defaults(soundtable) +end + + +function sound_api.node_sound_ice_defaults(soundtable) + --s/ice/glass + return nodes_nature.node_sound_glass_defaults(soundtable) +end + +function sound_api.node_sound_metal_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_water_defaults(soundtable) + return nodes_nature.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_lava_defaults(soundtable) + --s/lava/water + return nodes_nature.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_snow_defaults(soundtable) + return nodes_nature.node_sound_snow_defaults(soundtable) +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/farlands_reloaded.lua b/mods/xcompat/src/sounds/farlands_reloaded.lua new file mode 100644 index 00000000..e5be8074 --- /dev/null +++ b/mods/xcompat/src/sounds/farlands_reloaded.lua @@ -0,0 +1,65 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return soundtable +end + +function sound_api.node_sound_stone_defaults(soundtable) + return fl_stone.sounds.stone(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return fl_topsoil.sounds.grass(soundtable) +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return sound_api.node_sound_dirt_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return fl_stone.sounds.sand(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return fl_topsoil.sounds.gravel(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return fl_trees.sounds.wood(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_glass_defaults(soundtable) + return soundtable +end + + +function sound_api.node_sound_ice_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_metal_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_water_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_lava_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_snow_defaults(soundtable) + return fl_topsoil.sounds.snow(soundtable) +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/forgotten_lands.lua b/mods/xcompat/src/sounds/forgotten_lands.lua new file mode 100644 index 00000000..96eb7d94 --- /dev/null +++ b/mods/xcompat/src/sounds/forgotten_lands.lua @@ -0,0 +1,63 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return soundtable +end + +function sound_api.node_sound_stone_defaults(soundtable) + return sounds.stone(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return sounds.dirt(soundtable) +end + +function sound_api.node_sound_grass_defaults(soundtable) + return sounds.grass(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return sounds.sand(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return sounds.gravel(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return sounds.wood(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_glass_defaults(soundtable) + return sounds.glass(soundtable) +end + +function sound_api.node_sound_ice_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_metal_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_water_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_lava_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_snow_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/hades_revisited.lua b/mods/xcompat/src/sounds/hades_revisited.lua new file mode 100644 index 00000000..a8a2a04e --- /dev/null +++ b/mods/xcompat/src/sounds/hades_revisited.lua @@ -0,0 +1,66 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return hades_sounds.node_sound_defaults(soundtable) +end + +function sound_api.node_sound_stone_defaults(soundtable) + return hades_sounds.node_sound_stone_defaults(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return hades_sounds.node_sound_dirt_defaults(soundtable) +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return hades_sounds.node_sound_grass_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return hades_sounds.node_sound_sand_defaults(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return hades_sounds.node_sound_gravel_defaults(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return hades_sounds.node_sound_wood_defaults(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return hades_sounds.node_sound_leaves_defaults(soundtable) +end + +function sound_api.node_sound_glass_defaults(soundtable) + return hades_sounds.node_sound_glass_defaults(soundtable) +end + + +function sound_api.node_sound_ice_defaults(soundtable) + --s/ice/glass + return hades_sounds.node_sound_glass_defaults(soundtable) +end + +function sound_api.node_sound_metal_defaults(soundtable) + return hades_sounds.node_sound_metal_defaults(soundtable) +end + +function sound_api.node_sound_water_defaults(soundtable) + return hades_sounds.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_lava_defaults(soundtable) + return hades_sounds.node_sound_lava_defaults(soundtable) +end + +function sound_api.node_sound_snow_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/ksurvive2.lua b/mods/xcompat/src/sounds/ksurvive2.lua new file mode 100644 index 00000000..70ae03b3 --- /dev/null +++ b/mods/xcompat/src/sounds/ksurvive2.lua @@ -0,0 +1,107 @@ +local sound_api = {} + +--ks_sounds conversion +--currently loggy and bedrock are ignored +local ks = {} + +function ks.node_sound_defaults(soundtable) + soundtable = soundtable or {} + soundtable.footstep = soundtable.footstep or ks_sounds.generalnode_sounds.footstep + soundtable.dug = soundtable.dug or ks_sounds.generalnode_sounds.dug + soundtable.dig = soundtable.dig or ks_sounds.generalnode_sounds.dig + soundtable.place = soundtable.place or ks_sounds.generalnode_sounds.place + return soundtable +end + +function ks.node_sound_wood_defaults(soundtable) + soundtable = soundtable or {} + soundtable.footstep = soundtable.footstep or ks_sounds.woodennode_sounds.footstep + soundtable.dug = soundtable.dug or ks_sounds.woodennode_sounds.dug + soundtable.dig = soundtable.dig or ks_sounds.woodennode_sounds.dig + soundtable.place = soundtable.place or ks_sounds.woodennode_sounds.place + ks.node_sound_defaults(soundtable) + return soundtable +end + +function ks.node_sound_leaves_defaults(soundtable) + soundtable = soundtable or {} + soundtable.footstep = soundtable.footstep or ks_sounds.leafynode_sounds.footstep + soundtable.dug = soundtable.dug or ks_sounds.leafynode_sounds.dug + soundtable.dig = soundtable.dig or ks_sounds.leafynode_sounds.dig + soundtable.place = soundtable.place or ks_sounds.leafynode_sounds.place + ks.node_sound_defaults(soundtable) + return soundtable +end + +function ks.node_sound_snow_defaults(soundtable) + soundtable = soundtable or {} + soundtable.footstep = soundtable.footstep or ks_sounds.snowynode_sounds.footstep + soundtable.dug = soundtable.dug or ks_sounds.snowynode_sounds.dug + soundtable.dig = soundtable.dig or ks_sounds.snowynode_sounds.dig + soundtable.place = soundtable.place or ks_sounds.snowynode_sounds.place + ks.node_sound_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_default(soundtable) + return ks.node_sound_default(soundtable) +end + +function sound_api.node_sound_stone_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return soundtable +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return sound_api.node_sound_dirt_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_wood_defaults(soundtable) + return ks.node_sound_wood_default(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return ks.node_sound_leaves_default(soundtable) +end + +function sound_api.node_sound_glass_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_ice_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_metal_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_water_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_lava_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_snow_defaults(soundtable) + return ks.node_sound_snow_default(soundtable) +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/mineclonia.lua b/mods/xcompat/src/sounds/mineclonia.lua new file mode 100644 index 00000000..5de0753b --- /dev/null +++ b/mods/xcompat/src/sounds/mineclonia.lua @@ -0,0 +1,67 @@ +--note this file handles mineclonia, mineclone2, and its rename voxelibre + +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return mcl_sounds.node_sound_defaults(soundtable) +end + +function sound_api.node_sound_stone_defaults(soundtable) + return mcl_sounds.node_sound_stone_defaults(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return mcl_sounds.node_sound_dirt_defaults(soundtable) +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return sound_api.node_sound_dirt_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return mcl_sounds.node_sound_sand_defaults(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return mcl_sounds.node_sound_sand_defaults(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return mcl_sounds.node_sound_wood_defaults(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return mcl_sounds.node_sound_leaves_defaults(soundtable) +end + +function sound_api.node_sound_glass_defaults(soundtable) + return mcl_sounds.node_sound_glass_defaults(soundtable) +end + + +function sound_api.node_sound_ice_defaults(soundtable) + return mcl_sounds.node_sound_glass_defaults(soundtable) +end + +function sound_api.node_sound_metal_defaults(soundtable) + return mcl_sounds.node_sound_metal_defaults(soundtable) +end + +function sound_api.node_sound_water_defaults(soundtable) + return mcl_sounds.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_lava_defaults(soundtable) + return mcl_sounds.node_sound_lava_defaults(soundtable) +end + +function sound_api.node_sound_snow_defaults(soundtable) + return mcl_sounds.node_sound_snow_defaults(soundtable) +end + +function sound_api.node_sound_wool_defaults(soundtable) + return mcl_sounds.node_sound_wool_defaults(soundtable) +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/minetest.lua b/mods/xcompat/src/sounds/minetest.lua new file mode 100644 index 00000000..3c2485e4 --- /dev/null +++ b/mods/xcompat/src/sounds/minetest.lua @@ -0,0 +1,67 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return default.node_sound_defaults(soundtable) +end + +function sound_api.node_sound_stone_defaults(soundtable) + return default.node_sound_stone_defaults(soundtable) +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return default.node_sound_dirt_defaults(soundtable) +end + +--return dirt as some games use dirt vs grass +function sound_api.node_sound_grass_defaults(soundtable) + return sound_api.node_sound_dirt_defaults(soundtable) +end + +function sound_api.node_sound_sand_defaults(soundtable) + return default.node_sound_sand_defaults(soundtable) +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return default.node_sound_gravel_defaults(soundtable) +end + +function sound_api.node_sound_wood_defaults(soundtable) + return default.node_sound_wood_defaults(soundtable) +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return default.node_sound_leaves_defaults(soundtable) +end + +function sound_api.node_sound_glass_defaults(soundtable) + return default.node_sound_glass_defaults(soundtable) +end + + +function sound_api.node_sound_ice_defaults(soundtable) + return default.node_sound_ice_defaults(soundtable) +end + +function sound_api.node_sound_metal_defaults(soundtable) + return default.node_sound_metal_defaults(soundtable) +end + +function sound_api.node_sound_water_defaults(soundtable) + return default.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_lava_defaults(soundtable) + --s/lava/water + return default.node_sound_water_defaults(soundtable) +end + +function sound_api.node_sound_snow_defaults(soundtable) + return default.node_sound_snow_defaults(soundtable) +end + +function sound_api.node_sound_wool_defaults(soundtable) + --s/wool/default + return default.node_sound_defaults(soundtable) +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/sounds/xcompat_agnostic.lua b/mods/xcompat/src/sounds/xcompat_agnostic.lua new file mode 100644 index 00000000..2dbdf30c --- /dev/null +++ b/mods/xcompat/src/sounds/xcompat_agnostic.lua @@ -0,0 +1,63 @@ +local sound_api = {} + +function sound_api.node_sound_default(soundtable) + return soundtable +end + +function sound_api.node_sound_stone_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_dirt_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_grass_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_sand_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_gravel_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_wood_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_leaves_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_glass_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_ice_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_metal_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_water_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_lava_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_snow_defaults(soundtable) + return soundtable +end + +function sound_api.node_sound_wool_defaults(soundtable) + return soundtable +end + +return sound_api \ No newline at end of file diff --git a/mods/xcompat/src/textures.lua b/mods/xcompat/src/textures.lua new file mode 100644 index 00000000..ceb7736a --- /dev/null +++ b/mods/xcompat/src/textures.lua @@ -0,0 +1,8 @@ +local filename = xcompat.gameid + +--if we dont have a materials file for the game, use minetest +if not xcompat.utilities.file_exists(xcompat.modpath .. "/src/textures/" .. filename .. ".lua") then + filename = "xcompat_agnostic" +end + +return dofile(xcompat.modpath .. "/src/textures/" .. filename .. ".lua") \ No newline at end of file diff --git a/mods/xcompat/src/textures/farlands_reloaded.lua b/mods/xcompat/src/textures/farlands_reloaded.lua new file mode 100644 index 00000000..eb06cd69 --- /dev/null +++ b/mods/xcompat/src/textures/farlands_reloaded.lua @@ -0,0 +1,57 @@ +local textures = { + gravel = "farlands_gravel.png", + brick = "farlands_brick.png", + + metal = { + steel = { + ore = "farlands_iron_ingot.png", + ingot = "farlands_iron_ingot.png", + block = "farlands_iron_block.png", + }, + gold = { + ore = "farlands_gold_ore.png", + ingot = "farlands_gold_ingot.png", + block = "farlands_gold_block.png", + }, + }, + glass = { + pane = "farlands_glass.png", + detail = "farlands_glass_detail.png", + }, + wood = { + apple = { + sapling = "farlands_apple_sapling.png", + planks = "farlands_apple_planks.png", + trunk_side = "farlands_apple_trunk.png", + trunk_top = "farlands_apple_trunk_top.png", + leaves = "farlands_apple_leaves.png", + }, + jungle = { + sapling = "farlands_jungletree_sapling.png", + planks = "farlands_jungletree_planks.png", + trunk_side = "farlands_jungletree_trunk.png", + trunk_top = "farlands_jungletree_trunk_top.png", + leaves = "farlands_jungletree_leaves.png", + }, + }, + water = { + tile = "farlands_water.png", + animated = { + source = "farlands_water_source_animated.png", + flowing = "farlands_water_flowing_animated.png", + }, + }, + wool = { + white = "farlands_wool.png", + black = "farlands_wool.png", + grey = "farlands_wool.png", + dark_grey = "farlands_wool.png", + }, + grass = { + top = "farlands_grass.png", + side = "farlands_dirt.png^farlands_grass_side.png", + dirt = "farlands_dirt.png", + }, +} + +return textures \ No newline at end of file diff --git a/mods/xcompat/src/textures/minetest.lua b/mods/xcompat/src/textures/minetest.lua new file mode 100644 index 00000000..2216922c --- /dev/null +++ b/mods/xcompat/src/textures/minetest.lua @@ -0,0 +1,57 @@ +local textures = { + gravel = "default_gravel.png", + brick = "default_brick.png", + + metal = { + steel = { + ore = "default_iron_lump.png", + ingot = "default_steel_ingot.png", + block = "default_steel_block.png", + }, + gold = { + ore = "default_gold_lump.png", + ingot = "default_gold_ingot.png", + block = "default_gold_block.png", + }, + }, + glass = { + pane = "default_glass.png", + detail = "default_glass_detail.png", + }, + wood = { + apple = { + sapling = "default_sapling.png", + planks = "default_wood.png", + trunk_side = "default_tree.png", + trunk_top = "default_tree_top.png", + leaves = "default_leaves.png", + }, + jungle = { + sapling = "default_junglesapling.png", + planks = "default_junglewood.png", + trunk_side = "default_jungletree.png", + trunk_top = "default_jungletree_top.png", + leaves = "default_jungleleaves.png", + }, + }, + water = { + tile = "default_water.png", + animated = { + source = "default_water_source_animated.png", + flowing = "default_water_flowing_animated.png", + }, + }, + wool = { + white = "wool_white.png", + black = "wool_black.png", + grey = "wool_grey.png", + dark_grey = "wool_dark_grey.png", + }, + grass = { + top = "default_grass.png", + side = "default_dirt.png^default_grass_side.png", + dirt = "default_dirt.png", + }, +} + +return textures \ No newline at end of file diff --git a/mods/xcompat/src/textures/xcompat_agnostic.lua b/mods/xcompat/src/textures/xcompat_agnostic.lua new file mode 100644 index 00000000..ae26238a --- /dev/null +++ b/mods/xcompat/src/textures/xcompat_agnostic.lua @@ -0,0 +1,65 @@ +local textures = { + gravel = "[combine:16x16^[noalpha^[colorize:#3a3b3c", + brick = "[combine:16x16^[noalpha^[colorize:#AA4A44", + + metal = { + steel = { + ore = "[combine:16x16^[noalpha^[colorize:#D3D3D3", + ingot = "[combine:16x16^[noalpha^[colorize:#D3D3D3", + block = "[combine:16x16^[noalpha^[colorize:#D3D3D3", + }, + gold = { + ore = "[combine:16x16^[noalpha^[colorize:#FFD700", + ingot = "[combine:16x16^[noalpha^[colorize:#FFD700", + block = "[combine:16x16^[noalpha^[colorize:#FFD700", + }, + }, + glass = { + pane = "[combine:16x16:" .. + "0,0=\\[combine\\:1x16\\^[noalpha\\^[colorize\\:#ffffff:" .. + "0,0=\\[combine\\:16x1\\^[noalpha\\^[colorize\\:#ffffff:" .. + "0,15=\\[combine\\:16x1\\^[noalpha\\^[colorize\\:#ffffff:" .. + "15,0=\\[combine\\:1x16\\^[noalpha\\^[colorize\\:#ffffff", + detail = "[combine:16x16:" .. + "0,0=\\[combine\\:1x16\\^[noalpha\\^[colorize\\:#ffffff:" .. + "0,0=\\[combine\\:16x1\\^[noalpha\\^[colorize\\:#ffffff:" .. + "0,15=\\[combine\\:16x1\\^[noalpha\\^[colorize\\:#ffffff:" .. + "15,0=\\[combine\\:1x16\\^[noalpha\\^[colorize\\:#ffffff", + }, + wood = { + apple = { + sapling = "[combine:16x16^[noalpha^[colorize:#654321", + planks = "[combine:16x16^[noalpha^[colorize:#654321", + trunk_side = "[combine:16x16^[noalpha^[colorize:#654321", + trunk_top = "[combine:16x16^[noalpha^[colorize:#654321", + leaves = "[combine:16x16^[noalpha^[colorize:#654321", + }, + jungle = { + sapling = "[combine:16x16^[noalpha^[colorize:#563d2d", + planks = "[combine:16x16^[noalpha^[colorize:#563d2d", + trunk_side = "[combine:16x16^[noalpha^[colorize:#563d2d", + trunk_top = "[combine:16x16^[noalpha^[colorize:#563d2d", + leaves = "[combine:16x16^[noalpha^[colorize:#563d2d", + }, + }, + water = { + tile = "[combine:16x16^[noalpha^[colorize:#00008b", + animated = { + source = "[combine:16x16^[noalpha^[colorize:#00008b", + flowing = "[combine:16x16^[noalpha^[colorize:#00008b", + }, + }, + wool = { + white = "[combine:16x16^[noalpha^[colorize:#ffffff", + black = "[combine:16x16^[noalpha^[colorize:#000000", + grey = "[combine:16x16^[noalpha^[colorize:#313b3c", + dark_grey = "[combine:16x16^[noalpha^[colorize:#313b3c", + }, + grass = { + top = "[combine:16x16^[noalpha^[colorize:#006400", + side = "[combine:16x16^[noalpha^[colorize:#006400", + dirt = "[combine:16x16^[noalpha^[colorize:#563d2d", + }, +} + +return textures \ No newline at end of file diff --git a/mods/xcompat/src/utilities.lua b/mods/xcompat/src/utilities.lua new file mode 100644 index 00000000..61a74110 --- /dev/null +++ b/mods/xcompat/src/utilities.lua @@ -0,0 +1,8 @@ +local utilities = {} + +function utilities.file_exists(name) + local f=io.open(name,"r") + if f~=nil then io.close(f) return true else return false end +end + +return utilities \ No newline at end of file diff --git a/mods/xcompat/test/nodelist/farlands_reloaded.txt b/mods/xcompat/test/nodelist/farlands_reloaded.txt new file mode 100644 index 00000000..29833c76 --- /dev/null +++ b/mods/xcompat/test/nodelist/farlands_reloaded.txt @@ -0,0 +1,356 @@ +fl_furniture:yellow_ipe_table +fl_trees:palm_trunk +fl_stone:mossy_stone +fl_trees:acacia_sapling +fl_doors:copper_door_a +fl_trees:jungletree_plank +fl_workshop:furnace_active +fl_topsoil:wet_farmland +fl_trees:spruce_leaves +fl_stone:stone_brick +fl_light_sources:lantern +fl_plantlife:red_mushroom_leaves +fl_stone:basalt +fl_topsoil:condensed_ice +fl_doors:apple_door_b +fl_beds:bed_pink +fl_plantlife:petunia_blue +fl_trees:acacia_leaves +fl_stone:basalt_block +fl_ores:coal_in_tuff +fl_topsoil:sea_grass_3 +fl_agriculture:carrot_2 +fl_beds:bed_violet +fl_stone:basalt_rubble +fl_furniture:spruce_bench +fl_ores:copper_in_tuff +fl_trees:willow_plank +fl_trees:yellow_ipe_plank_fence +fl_storage:spruce_vessel_shelf +fl_beds:bed_blue +fl_stone:stone_block +fl_stone:tuff_rubble +fl_ores:mithite_in_stone +fl_topsoil:savannah_dirt_with_grass +fl_furniture:pine_table +fl_trees:pine_plank_fence +fl_furniture:baobab_chair +fl_plantlife:grass_2 +fl_trees:pine_sapling +fl_beds:bed_dark_green +fl_plantlife:cactus +fl_storage:spruce_book_shelf +fl_signs:sign_wood +fl_plantlife:pink_ground_flower +fl_doors:steel_door_b +fl_topsoil:sea_grass_1 +fl_trees:aspen_leaves +fl_stone:ors_brick +fl_doors:jungletree_door_a +fl_paintings:forest +fl_storage:spruce_multi_shelf +fl_beds:bed_red +fl_tnt:tnt +fl_beds:bed_brown +fl_storage:pine_multi_shelf +fl_ores:mithite_block +fl_beds:bed_orange +fl_ores:coal_in_desert_stone +fl_plantlife:red_ground_flower +fl_ores:gold_in_desert_stone +fl_stone:silver_sandstone_block +fl_storage:wood_chest +fl_furniture:aspen_table +fl_doors:aspen_door_a +fl_stone:ors +fl_stone:sandstone_brick +fl_doors:pine_door_b +fl_furniture:acacia_table +fl_trees:acacia_trunk +fl_stone:mossy_stone_block +fl_doors:baobab_door_b +fl_plantlife:pansy_purple +fl_industrial:conveyor_funnel +fl_stone:savannah_rubble +fl_trains:straight_rise_track +fl_storage:baobab_book_shelf +fl_plantlife:purple_allium +fl_ores:diamond_block +fl_topsoil:dirt_with_grass +fl_plantlife:ground_waterlily +fl_plantlife:flowerpot +fl_plantlife:grass_4 +fl_storage:pine_book_shelf +fl_doors:palm_door_a +fl_furniture:willow_table +fl_trains:straight_45_track +fl_trees:palm_leaves +fl_glass:framed_glass_panes +fl_storage:yellow_ipe_vessel_shelf +fl_ores:coal_block +fl_plantlife:dandelion_yellow +fl_beds:bed_cyan +fl_topsoil:gravel +fl_storage:acacia_book_shelf +fl_furniture:baobab_bench +fl_furniture:willow_bench +fl_plantlife:savannah_grass_1 +fl_industrial:conveyor +fl_storage:acacia_vessel_shelf +fl_light_sources:chain +fl_trees:spruce_plank +fl_trees:apple_leaves +fl_trees:baobab_leaves +fl_stone:silver_sand +fl_stone:desert_stone +fl_furniture:spruce_chair +fl_ores:copper_in_desert_stone +fl_topsoil:snow_block +fl_ores:mithite_in_savannah +fl_trees:acacia_plank +fl_topsoil:dirt +fl_fire:fire +fl_stone:gneiss_rubble +fl_furniture:acacia_bench +fl_storage:willow_vessel_shelf +fl_plantlife:lantana +fl_stone:sandstone +fl_furniture:jungletree_chair +fl_workshop:furnace +fl_stone:gneiss +fl_agriculture:potato_4 +fl_topsoil:permafrost_with_stones +fl_topsoil:snow +fl_trees:baobab_plank +fl_stone:tuff_brick +fl_stone:desert_sandstone_block +fl_bones:bone_block +fl_stone:basalt_brick +fl_doors:steel_door_a +fl_furniture:aspen_bench +fl_ores:tin_in_savannah +fl_trees:palm_plank_fence +fl_doors:apple_door_a +fl_wool:wool +fl_furniture:spruce_table +fl_agriculture:carrot_1 +fl_ores:iron_in_stone +fl_stone:desert_sandstone_brick +fl_storage:apple_empty_shelf +fl_stone:gneiss_block +fl_stone:mossy_stone_rubble +fl_agriculture:carrot_3 +fl_trees:willow_trunk +fl_trees:pine_leaves +fl_trains:curve_right_track +fl_doors:copper_door_b +fl_doors:jungletree_door_b +fl_furniture:jungletree_bench +fl_doors:willow_door_b +fl_topsoil:sea_grass_2 +fl_ores:gold_in_ors +fl_doors:willow_door_a +fl_trains:switch_right_track +fl_doors:aspen_door_b +fl_doors:palm_door_b +fl_stone:stone +fl_plantlife:rose +fl_doors:yellow_ipe_door_b +fl_doors:yellow_ipe_door_a +fl_plantlife:grass_3 +fl_storage:apple_vessel_shelf +fl_plantlife:tulip +fl_light_sources:torch +fl_trees:palm_sapling +fl_doors:blocker_top +fl_bricks:terracotta +fl_bricks:clay_block +fl_bricks:brick +fl_agriculture:carrot_4 +fl_paintings:cthulhu +fl_trees:aspen_trunk +fl_furniture:willow_chair +fl_glass:tinted_framed_glass_panes +fl_stone:sandstone_block +fl_glass:tinted_framed_glass +fl_ores:gold_block +fl_furniture:apple_chair +fl_glass:framed_glass +fl_storage:pine_vessel_shelf +fl_beds:bed_yellow +fl_beds:bed_black +fl_stone:silver_sandstone +fl_beds:bed_dark_grey +fl_beds:bed_green +fl_ores:tin_in_tuff +fl_beds:bed_grey +fl_beds:bed_magenta +fl_beds:bed_white +fl_wildlife:spawner +fl_wool:wool_carpet +fl_paintings:dragon +fl_topsoil:dirt_with_snow +fl_ores:tin_block +fl_furniture:baobab_table +fl_dyes:demo_node +fl_plantlife:viola +fl_ores:diamond_in_ors +fl_plantlife:savannah_grass_4 +fl_plantlife:oxeye_daisy +fl_plantlife:geranium +fl_plantlife:mushroom_trunk +fl_stone:ors_rubble +fl_doors:baobab_door_a +fl_light_sources:lantern_c +fl_doors:acacia_door_b +fl_plantlife:petunia_white +fl_storage:spruce_empty_shelf +fl_plantlife:petunia_pink +fl_ores:tin_in_stone +fl_ores:mithite_in_desert_stone +fl_stone:desert_sand +fl_plantlife:pansy_blue +fl_plantlife:frozen_rose +fl_ores:gold_in_tuff +fl_stone:savannah_brick +fl_ores:coal_in_savannah +fl_plantlife:blue_ground_flower +fl_ores:iron_in_desert_stone +fl_industrial:injector +fl_trees:aspen_plank_fence +fl_plantlife:savannah_grass_2 +fl_plantlife:dandelion_white +fl_plantlife:flame_lily +fl_plantlife:brown_mushroom +fl_plantlife:red_mushroom +fl_trees:jungletree_plank_fence +fl_plantlife:brown_mushroom_leaves +fl_plantlife:raw_mushroom_leaves +fl_plantlife:savannah_grass_5 +fl_stone:tuff_block +fl_plantlife:savannah_grass_3 +fl_trees:acacia_plank_fence +fl_trees:jungletree_sapling +fl_furniture:pine_bench +fl_plantlife:grass_1 +fl_plantlife:lavender_flower +fl_ores:coal_in_stone +fl_plantlife:grass_5 +fl_ores:bronze_block +fl_trees:yellow_ipe_plank +fl_stone:gneiss_brick +fl_ores:diamond_in_savannah +fl_trees:pine_plank +fl_ores:diamond_in_desert_stone +fl_ores:diamond_in_tuff +fl_storage:baobab_empty_shelf +fl_storage:yellow_ipe_empty_shelf +fl_paintings:landscape +fl_stairs:tablesaw +fl_furniture:yellow_ipe_chair +fl_ores:copper_in_ors +fl_trees:apple_trunk +fl_trees:yellow_ipe_leaves +fl_trees:dead_aspen_leaves +fl_liquids:water_flowing +fl_furniture:aspen_chair +fl_plantlife:lobelia +fl_topsoil:dry_farmland +fl_trees:apple_plank +ignore +fl_trains:switch_left_track +fl_storage:willow_empty_shelf +fl_trees:spruce_plank_fence +fl_ores:copper_in_savannah +fl_stone:sand +fl_furniture:pine_chair +fl_storage:aspen_empty_shelf +fl_topsoil:coarse_dirt +fl_storage:acacia_multi_shelf +fl_ores:mithite_in_ors +fl_paintings:waterlilie +fl_stone:tuff +fl_stone:savannah_block +fl_trees:willow_plank_fence +fl_storage:baobab_vessel_shelf +fl_furniture:apple_table +fl_paintings:rose +fl_liquids:river_water_source +fl_trees:pine_trunk +fl_storage:aspen_vessel_shelf +fl_topsoil:ice +fl_storage:aspen_book_shelf +fl_liquids:lava_source +fl_agriculture:potato_2 +fl_storage:aspen_multi_shelf +fl_storage:willow_book_shelf +fl_furniture:acacia_chair +fl_trains:crossing_track +fl_trees:apple_plank_fence +fl_liquids:river_water_flowing +fl_trees:baobab_sapling +fl_ores:gold_in_stone +fl_trains:curve_left_track +fl_trains:straight_track +fl_doors:acacia_door_a +fl_storage:apple_multi_shelf +fl_trees:aspen_plank +fl_trees:spruce_trunk +fl_stone:desert_stone_rubble +fl_trees:baobab_trunk +fl_ores:copper_in_stone +fl_industrial:conveyor_left +fl_storage:acacia_empty_shelf +fl_trees:palm_plank +fl_agriculture:potato_1 +fl_trees:apple_sapling +fl_trees:baobab_plank_fence +fl_furniture:yellow_ipe_bench +fl_ores:tin_in_desert_stone +fl_furniture:palm_bench +fl_storage:yellow_ipe_book_shelf +fl_stone:savannah +fl_furniture:apple_bench +fl_ores:iron_block +fl_furniture:palm_chair +fl_glass:tinted_connected_glass +fl_agriculture:potato_3 +fl_trees:aspen_sapling +fl_storage:baobab_multi_shelf +fl_storage:willow_multi_shelf +fl_furniture:palm_table +fl_furniture:jungletree_table +fl_trees:jungletree_trunk +fl_stone:stone_rubble +fl_doors:pine_door_a +fl_storage:pine_empty_shelf +fl_stone:mossy_stone_brick +fl_stone:ors_block +fl_paintings:possessedwoman +fl_storage:apple_book_shelf +fl_storage:yellow_ipe_multi_shelf +fl_stone:desert_stone_block +fl_stone:desert_stone_brick +fl_trees:jungletree_leaves +fl_liquids:water_source +fl_stone:desert_sandstone +fl_trees:willow_leaves +fl_workshop:anvil +fl_paintings:mistiriusgirl +fl_trees:yellow_ipe_trunk +fl_topsoil:savannah_dirt +fl_ores:coal_in_ors +fl_topsoil:permafrost +fl_liquids:lava_flowing +fl_ores:iron_in_ors +fl_industrial:conveyor_right +fl_ores:iron_in_tuff +fl_ores:iron_in_savannah +fl_ores:copper_block +fl_stone:silver_sandstone_brick +air +fl_ores:gold_in_savannah +fl_ores:tin_in_ors +fl_ores:mithite_in_tuff +fl_stone:bedrock +fl_ores:diamond_in_stone diff --git a/mods/xcompat/test/nodelist/hades_revisited.txt b/mods/xcompat/test/nodelist/hades_revisited.txt new file mode 100644 index 00000000..0d219dc2 --- /dev/null +++ b/mods/xcompat/test/nodelist/hades_revisited.txt @@ -0,0 +1,2966 @@ +columnia:column_linktee_hades_core_tuff_baked +gluncarp:white +hades_bedrock:bedrock +columnia:column_stairsubpillar_hades_trees_colwood_dark_green +columnia:column_bottom_hades_trees_colwood_dark_grey +hades_core:brick_dark_grey +hades_doors:door_stone_e +columnia:column_crosslink_hades_core_essexite +hades_core:apolline_brick +columnia:column_linkcross_hades_core_orangite +hades_stairs:stair_cream_wood +hades_furniture:table_lamp_med +columnia:column_top_hades_core_orangite +columnia:column_mid_hades_core_brick_pink +columnia:column_linktee_hades_core_tuff +hades_chests:chest_green +hades_stairs:slab_marble +hades_stairs:stair_out_colwood_dark_grey +hades_stairs:stair_tuff_baked +columnia:column_stairsubpillar_hades_core_mossycobble +hades_flowers:violet +hades_refruit:bud_orange +hades_stairs:stair_in_floor_marble_marble +columnia:column_linktee_down_hades_trees_colwood_red +columnia:column_stairsubpillar_hades_trees_birch_bark +hades_doors:door_chondrite_d +hades_glowcrystals:window_glow +hades_stairs:stair_birch_bark +columnia:column_bottom_hades_core_orangite +columnia:column_linkangle_down_hades_core_chondrite_brick +hades_doors:door_steel_white_d +hades_doors:door_stone_baked_b +hades_core:water_flowing +hades_doors:gate_jungle_wood_closed +columnia:column_linktee_columnia_rusty_block +columnia:column_linkangle_hades_trees_colwood_yellow +columnia:column_linkangle_hades_trees_pale_bark +hades_stairs:slab_tuff_baked +hades_stairs:stair_in_brick_pink +columnia:column_mid_hades_trees_colwood_magenta +hades_doors:door_steel_green_a +hades_stairs:step_brick_dark_green +hades_doors:door_steel_red_a +hades_stairs:stair_in_pale_bark +columnia:column_bottom_hades_trees_colwood_uncolored +columnia:column_linkvertical_hades_core_apolline +columnia:column_linkangle_down_hades_core_azurite +hades_stairs:slab_colwood_pink +hades_stairs:slab_jungle_bark +columnia:column_bottom_hades_core_brick_magenta +columnia:column_linkdown_hades_trees_jungle_wood +hades_trees:wood +hades_torches:torch +hades_trees:cocoa_pod +hades_fences:fence_rusty +hades_stairs:step_out_colwood_green +columnia:column_linktee_hades_core_essexite +columnia:column_linkangle_down_hades_trees_colwood_white +gluncarp:blackgold +hades_core:stone_with_emerald +hades_stairs:slab_copperblock +columnia:column_linkcross_hades_trees_wood +columnia:column_mid_hades_core_brick_dark_grey +hades_tiles:floor_stone_tuffbaked +columnia:column_linktee_hades_core_brick_dark_grey +columnia:column_linkangle_down_hades_core_brick_violet +hades_stairs:step_out_cinnabar +hades_stairs:stair_out_floor_cream_cream +hades_core:brick_black +hades_trees:leaves +hades_bushes:orange +hades_stairs:stair_out_orangite +columnia:column_linktee_down_hades_trees_colwood_grey +hades_core:emerald_block +hades_trees:jungle_sapling +columnia:column_link_hades_trees_colwood_red +hades_stairs:slab_cyan +hades_farming:soil +hades_cloth:green +hades_doors:door_steel_black_b +hades_trees:birch_tree +hades_doors:door_sandstone_volcanic_e +columnia:column_linkangle_hades_core_marble +hades_doors:door_glass_b +hades_doors:door_chondrite_e +hades_stairs:stair_floor_stonebaked_stonebaked +hades_stairs:stair_out_sandstone_volcanic_brick +columnia:column_linkangle_down_hades_core_brick_red +columnia:column_stairsubpillar_hades_core_tuff_baked +columnia:column_stairsub_hades_trees_colwood_violet +hades_doors:door_dungeon1_c +hades_core:chondrite_brick +columnia:column_linkangle_down_hades_trees_colwood_violet +hades_windows:paperwall +hades_torches:torch_wall +columnia:column_stairsubpillar_hades_core_brick_blue +hades_stairs:stair_blue +hades_stairs:slab_floor_cream_cream +columnia:column_stairsub_hades_trees_canvas_bark +hades_doors:door_steel_red_b +hades_core:tinblock +hades_stairs:stair_in_stone +columnia:column_crosslink_hades_core_brick_black +hades_tiles:floor_tuffbaked_tuff +hades_doors:door_dungeon2_a +columnia:column_linkdown_hades_core_cobble_baked +columnia:column_linkangle_down_hades_core_cobble_sandstone +hades_core:stone +columnia:column_stairsubpillar_hades_trees_colwood_dark_grey +hades_stairs:slab_chondrite_brick +hades_windows:window_cream_wood +hades_stairs:step_colwood_uncolored +columnia:column_linktee_hades_trees_colwood_black +columnia:column_crosslink_hades_core_lillite +hades_walls:cobble_baked +hades_core:copperblock +hades_stairs:stair_in_white +columnia:column_linkvertical_hades_core_brick_white +columnia:column_linktee_down_hades_core_cobble_sandstone +hades_trees:banana_leaves +columnia:column_linkangle_hades_core_sandstone_volcanic +columnia:column_linkvertical_hades_trees_pale_bark +hades_refruit:flower_orange +hades_doors:door_steel_green_b +hades_stairs:stair_out_stone +hades_stairs:stair_out_brick_orange +columnia:column_linkvertical_hades_core_stone +columnia:column_linktee_down_hades_core_stone_baked +hades_stairs:stair_out_white +columnia:column_stairsubpillar_hades_core_basalt +hades_refruit:bud_olive +hades_stairs:slab_essexite +hades_stairs:step_in_colwood_uncolored +hades_waterplants:seaweed +gluncarp:cloth_blackgold +hades_stairs:slab_cream_wood +hades_doors:door_steel_pink_a +hades_farming:seed_tomato +hades_doors:door_steel_brown_a +hades_stairs:step_in_stonebrick_baked +hades_stairs:slab_brick_violet +hades_stairs:slab_charred_bark +hades_doors:door_steel_white_e +columnia:column_stairsubpillar_hades_core_brick_dark_grey +columnia:column_link_hades_core_sandstone_volcanic +signs_lib:sign_wall_white_red +hades_stairs:step_brick_brown +columnia:column_stairsubpillar_hades_core_essexite +columnia:column_linkangle_down_hades_core_stone +columnia:column_bottom_hades_trees_wood +columnia:column_link_hades_core_olivine +columnia:column_linkangle_hades_trees_cream_wood +hades_stairs:slab_green +columnia:column_linkangle_hades_core_olivine_brick +hades_fences:fence_cream_wood +columnia:column_stairsubpillar_hades_core_obsidian +hades_stairs:slab_double_steelblock +columnia:column_stairsubpillar_hades_core_stonebrick_baked +columnia:column_bottom_hades_core_tuff_baked_brick +hades_trees:canvas_sapling +hades_stairs:slab_cobble_sandstone_volcanic +columnia:column_bottom_hades_trees_colwood_dark_green +hades_stairs:slab_pink +columnia:column_linkdown_hades_trees_lush_wood +hades_stairs:stair_stone_baked +hades_doors:door_rusty_c +columnia:column_mid_hades_trees_colwood_red +columnia:column_stairsub_hades_core_chondrite_brick +columnia:column_bottom_hades_core_cobble_sandstone_volcanic +columnia:column_stairsub_hades_trees_colwood_grey +columnia:column_crosslink_hades_core_cobble_sandstone +hades_doors:door_steel_darkgreen_b +columnia:column_linkangle_down_hades_core_obsidian +hades_stairs:step_in_olivine +hades_stairs:slab_double_copperblock +hades_core:floor_chondrite_stone +hades_doors:door_steel_black_c +hades_tiles:floor_tuffbaked_tuffbaked +columnia:column_linktee_hades_trees_colwood_violet +columnia:column_linkcrossdown_hades_core_tuff +hades_trees:colwood_green +hades_doors:door_stone_baked_c +hades_doors:door_obsidian_glass_b +hades_chests:chest_green_locked +columnia:column_linkangle_hades_core_olivine +hades_doors:door_glass_e +columnia:column_linkangle_hades_core_brick_cyan +hades_stairs:stair_in_floor_pale_pale +hades_stairs:step_in_essexite +columnia:column_linkcrossdown_hades_trees_birch_bark +hades_stairs:stair_brick_cyan +columnia:column_linkdown_hades_trees_colwood_white +hades_stairs:stair_azurite +columnia:column_linkcrossdown_hades_core_cinnabar +hades_stairs:step_brick_red +columnia:column_link_hades_trees_pale_bark +hades_tiles:floor_lush_pale +hades_trees:charred_tree +hades_stairs:stair_in_brick_brown +columnia:column_linkvertical_hades_core_tuff_baked_brick +hades_stairs:stair_in_red +hades_doors:door_steel_red_c +hades_stairs:slab_pale_bark +columnia:column_link_hades_core_brick_yellow +hades_doors:door_rusty_a +hades_stairs:stair_out_orange +columnia:column_linkvertical_hades_trees_jungle_wood +columnia:column_linkvertical_hades_trees_colwood_uncolored +columnia:column_link_hades_core_cobble_sandstone +hades_furnaces:furnace +hades_stairs:step_in_jungle_wood +hades_flowerpots:flower_pot_cultivated_jungle_leaves +columnia:column_linkangle_down_hades_core_brick_magenta +hades_doors:door_wood_e +air +columnia:column_linkcrossdown_hades_core_brick +columnia:column_linkangle_down_hades_trees_colwood_orange +columnia:column_linkangle_down_hades_trees_wood +hades_stairs:step_tinblock +hades_farming:straw +columnia:column_linkvertical_columnia_rusty_block +hades_grass:dead_grass_5 +hades_trees:colwood_dark_green +columnia:column_mid_hades_trees_pale_wood +hades_core:volcanic_sand +hades_stairs:slab_brick_dark_green +hades_doors:door_steel_pink_b +hades_doors:door_steel_green_c +hades_stairs:step_in_tuff_baked_brick +columnia:column_linktee_down_hades_trees_wood +columnia:column_stairsubpillar_hades_core_brick +hades_trees:colwood_pink +hades_trees:orange_sapling +hades_waterplants:seaweed_4 +columnia:column_bottom_hades_core_brick_orange +columnia:column_bottom_hades_core_turquosite +hades_stairs:stair_out_floor_tuff_tuff +columnia:column_mid_hades_core_sandstone_volcanic_brick +columnia:column_linkcross_hades_core_apolline +columnia:column_linkangle_hades_core_tuff_brick +hades_stairs:step_out_colwood_uncolored +columnia:column_linkcrossdown_hades_trees_colwood_brown +hades_itemshow:pedestal_cinnabar +hades_stairs:slab_brick_cyan +columnia:column_crosslink_hades_trees_jungle_wood +columnia:column_linktee_down_hades_core_tuff_brick +hades_doors:door_steel_darkgreen_e +columnia:column_linktee_hades_core_brick_red +columnia:column_linkdown_hades_core_brick_orange +hades_stairs:stair_in_colwood_dark_green +hades_stairs:step_in_floor_wood_wood +columnia:column_linkcross_hades_core_brick_brown +columnia:column_bottom_hades_core_basalt_brick +columnia:column_crosslink_hades_core_chondrite_brick +columnia:column_linkcross_hades_core_tuff +columnia:column_linkangle_hades_core_tuff_baked_brick +hades_stairs:stair_out_grey +hades_refruit:flower_banana +columnia:column_linkvertical_hades_core_brick_red +columnia:column_crosslink_hades_core_obsidian +columnia:column_link_hades_trees_colwood_green +hades_stairs:stair_colwood_red +hades_tiles:floor_sandstonevolcanic_sandstone +hades_stairs:stair_in_violet +hades_stairs:stair_in_sandstone_volcanic +columnia:machine +columnia:column_linkcrossdown_hades_core_tuff_brick +hades_core:cactus_brick +columnia:column_linkdown_hades_core_stonebrick_baked +hades_core:papyrus +columnia:column_linkangle_hades_core_chondrite +columnia:column_top_hades_core_brick_yellow +hades_chests:chest_red_locked +hades_stairs:slab_yellow +hades_doors:door_sandstone_d +columnia:column_linkcrossdown_hades_core_brick_brown +hades_doors:door_essexite_d +gluncarp:brown +hades_windows:window_jungle_wood +hades_furniture:table_lamp_hi +columnia:column_stairsub_hades_core_tuff_brick +columnia:column_linkangle_hades_core_brick_brown +columnia:column_linktee_hades_core_tuff_baked_brick +hades_trees:cultivated_jungle_leaves +columnia:column_stairsubpillar_hades_core_cobble_sandstone +columnia:column_linkvertical_hades_core_essexite_brick +hades_doors:door_wood_jungle_a +hades_itemshow:pedestal_azurite +hades_core:ladder_bronze +columnia:column_stairsubpillar_hades_core_brick_pink +hades_doors:door_obsidian_glass_a +columnia:column_linkvertical_hades_trees_colwood_grey +hades_bushes:blue +hades_stairs:stair_in_brick_dark_green +columnia:column_linktee_down_hades_core_tuff +columnia:column_bottom_hades_trees_colwood_pink +columnia:column_link_hades_trees_colwood_dark_grey +columnia:column_stairsub_hades_trees_lush_wood +columnia:column_top_hades_core_stone +columnia:column_crosslink_hades_trees_colwood_green +hades_core:cactus +hades_windows:window_wood_green +hades_core:basalt_block +columnia:column_linkcrossdown_hades_core_essexite +columnia:column_linkvertical_hades_core_sandstone +hades_trees:burned_branches +columnia:column_bottom_hades_core_sandstone_volcanic_brick +hades_core:sandstone_volcanic_brick +hades_stairs:slab_colwood_dark_green +columnia:column_link_hades_core_chondrite_brick +columnia:column_top_hades_core_brick_orange +columnia:column_linkvertical_hades_trees_colwood_pink +hades_stairs:stair_in_straw +hades_doors:door_steel_brown_c +hades_stairs:slab_colwood_violet +hades_doors:door_steel_magenta_d +hades_doors:door_marble_d +columnia:column_link_hades_core_brick_violet +hades_stairs:stair_in_colwood_magenta +hades_stairs:slab_brick_black +hades_trees:charred_bark +columnia:column_linkcross_hades_core_brick_dark_green +columnia:column_crosslink_hades_core_brick_grey +hades_fences:fence_wood_black +hades_stairs:step_out_floor_pale_pale +columnia:column_linkcrossdown_hades_core_brick_pink +columnia:column_linkvertical_hades_core_olivine +columnia:column_crosslink_hades_core_stone +columnia:column_mid_hades_core_tuff +columnia:column_stairsubpillar_hades_core_chondrite +columnia:column_linkvertical_hades_core_basalt +columnia:column_mid_hades_trees_colwood_uncolored +hades_glowcrystals:glowcrystal_ore +columnia:column_linktee_down_hades_core_mossycobble +columnia:column_stairsub_hades_core_brick_violet +hades_doors:door_wood_lush_a +columnia:column_linktee_hades_core_essexite_brick +columnia:column_linkcrossdown_hades_core_brick_blue +hades_stairs:step_out_colwood_blue +hades_core:lava_source +hades_doors:door_steel_pink_c +columnia:column_linktee_down_hades_core_basalt_brick +columnia:column_stairsubpillar_hades_core_brick_black +hades_doors:door_wood_jungle_b +hades_stairs:slab_orange +columnia:column_mid_hades_trees_colwood_white +hades_stairs:stair_out_chondrite +columnia:column_linkangle_down_hades_core_brick_orange +columnia:column_linkangle_down_hades_core_basalt +hades_doors:door_steel_darkgreen_d +columnia:column_top_hades_trees_birch_bark +hades_flowerpots:flower_pot_canvas_leaves +hades_tiles:floor_essexitegold_essexitegold +columnia:column_linkcross_hades_core_brick_magenta +columnia:column_linktee_down_hades_core_essexite +hades_stairs:step_out_essexite +columnia:column_stairsub_hades_trees_colwood_orange +columnia:column_crosslink_hades_core_stone_baked +hades_stairs:stair_out_floor_stonebaked_stonebaked +hades_fences:fence_wood_pink +columnia:column_stairsub_hades_core_essexite +hades_stairs:step_in_floor_marble_marble +hades_stairs:step_brick_violet +columnia:column_crosslink_hades_core_mossycobble +hades_stairs:step_steelblock +hades_flowers:orange +columnia:column_linkdown_hades_core_marble +hades_tiles:floor_tuffbaked_stone +columnia:column_linkdown_hades_core_tuff +hades_stairs:stair_out_marble +columnia:column_mid_hades_core_basalt +hades_doors:gate_pale_wood_closed +columnia:column_linktee_hades_core_brick_white +hades_waterplants:waterlily_s4 +columnia:column_linkvertical_hades_core_orangite +columnia:column_crosslink_hades_core_brick_dark_grey +columnia:column_linktee_hades_core_brick_pink +columnia:column_crosslink_hades_trees_colwood_white +columnia:column_crosslink_hades_core_cobble_sandstone_volcanic +columnia:column_bottom_hades_core_tuff_baked +hades_flowerpots:flower_pot_yellow +hades_trees:sapling +hades_windows:window_wood_blue +columnia:column_linkdown_hades_core_brick_blue +columnia:column_linkdown_hades_trees_colwood_dark_green +hades_core:brick_red +columnia:column_top_hades_core_tuff_brick +columnia:column_stairsubpillar_hades_trees_colwood_cyan +columnia:column_top_hades_trees_bark +hades_doors:door_marble_c +hades_chests:chest_blue +hades_bushes:red +hades_tiles:floor_tuff_chondrite +columnia:column_linkdown_hades_trees_bark +columnia:column_linkangle_hades_trees_colwood_green +columnia:column_stairsubpillar_columnia_rusty_block +hades_doors:door_sandstone_volcanic_d +columnia:column_linkangle_down_hades_core_tuff_brick +hades_doors:gate_cream_wood_closed +columnia:column_linkdown_hades_core_tuff_brick +columnia:column_linktee_down_hades_core_chondrite_brick +hades_refruit:bud_coconut +hades_stairs:step_glowcrystal_block +hades_stairs:slab_white +hades_doors:hidden +columnia:column_linkangle_hades_trees_bark +columnia:column_linkdown_hades_trees_canvas_bark +columnia:column_linkcross_hades_core_brick_orange +columnia:column_linktee_down_hades_core_brick_violet +hades_stairs:stair_out_brick_brown +columnia:column_linkvertical_hades_core_basalt_brick +hades_stairs:stair_out_stone_baked +hades_stairs:stair_in_tuff +columnia:column_top_hades_core_basalt_brick +columnia:column_link_hades_core_brick_black +hades_waterplants:waterlily_225 +columnia:column_linkangle_hades_trees_birch_bark +columnia:column_linkdown_hades_core_brick_dark_grey +columnia:column_link_hades_trees_colwood_black +columnia:column_link_hades_core_brick_white +columnia:column_linktee_hades_core_cinnabar +hades_core:brick_yellow +hades_stairs:stair_out_brick_dark_grey +columnia:column_linktee_down_hades_core_brick_grey +columnia:column_stairsub_hades_core_cinnabar +columnia:column_crosslink_hades_trees_colwood_grey +columnia:column_crosslink_hades_core_olivine_brick +gluncarp:blue +hades_core:brick_magenta +hades_stairs:stair_in_floor_stonebaked_stonebaked +hades_doors:door_wood_lush_b +hades_stairs:step_in_basalt_brick +columnia:column_stairsub_hades_core_obsidianbrick +hades_stairs:stair_floor_essexitegold_essexitegold +columnia:column_stairsubpillar_hades_core_brick_orange +hades_stairs:step_in_brick_dark_grey +columnia:column_linkdown_hades_core_sandstone +hades_stairs:step_out_floor_essexitegold_essexitegold +columnia:column_crosslink_hades_trees_colwood_red +columnia:column_stairsub_hades_core_brick_grey +columnia:column_linkangle_down_hades_core_tuff_baked_brick +hades_furniture:binding_rusty_bars +columnia:column_linktee_hades_trees_canvas_bark +columnia:column_link_hades_trees_colwood_pink +hades_stairs:step_out_basalt +columnia:column_mid_hades_trees_colwood_green +hades_vines:cave +columnia:column_linkangle_down_columnia_rusty_block +columnia:column_link_hades_core_brick_brown +hades_stairs:step_apolline +hades_doors:trapdoor +columnia:column_bottom_hades_core_sandstone_volcanic +columnia:column_link_hades_trees_pale_wood +columnia:column_linkangle_down_hades_trees_pale_bark +hades_tiles:floor_stone_sandstonevolcanic +hades_stairs:stair_colwood_violet +hades_doors:trapdoor_pale +columnia:column_mid_hades_core_tuff_baked +hades_fences:fence_wood_yellow +hades_stairs:step_in_colwood_white +hades_stairs:slab_floor_pale_pale +columnia:column_stairsubpillar_hades_core_tuff_brick +hades_trees:colwood_grey +columnia:column_crosslink_hades_core_orangite +hades_stairs:stair_out_charred_bark +hades_core:obsidian_glass +columnia:column_linkangle_down_hades_core_cobble_sandstone_volcanic +hades_doors:door_wood_jungle_c +hades_itemshow:pedestal_orangite +hades_stairs:stair_brick_white +hades_core:olivine +columnia:column_linkvertical_hades_core_turquosite +hades_stairs:slab_bark +hades_stairs:stair_in_basalt_brick +columnia:column_linkangle_down_hades_core_brick_brown +hades_farming:spice_2 +columnia:column_bottom_hades_trees_colwood_orange +hades_stairs:stair_essexite +columnia:column_bottom_hades_trees_pale_bark +hades_core:brick_orange +hades_torches:torch_low_ceiling +hades_core:water_source +hades_doors:door_wood_pale_b +columnia:column_crosslink_hades_core_stonebrick_baked +columnia:column_linktee_down_hades_core_tuff_baked_brick +hades_trees:cream_wood +columnia:column_stairsub_hades_core_tuff_baked +hades_stairs:step_in_cobble_sandstone_volcanic +columnia:column_link_hades_core_chondrite +hades_refruit:flower_olive +columnia:column_linkangle_down_hades_core_basalt_brick +columnia:column_linkcrossdown_hades_core_chondrite +hades_wardrobes:wardrobe +hades_stairs:stair_out_black +hades_stairs:step_in_colwood_dark_grey +hades_tiles:floor_tuff_tuff +columnia:column_linkcross_hades_trees_jungle_wood +hades_stairs:step_in_jungle_bark +hades_windows:window_obsidian +columnia:column_linktee_hades_core_stone +hades_doors:door_steel_brown_b +hades_doors:door_rusty_d +hades_core:goldblock +hades_stairs:stair_in_brown +hades_tiles:floor_sandstone_stonebaked +hades_chests:chest +columnia:column_crosslink_hades_core_brick_green +hades_fences:fence_wood_magenta +columnia:column_mid_hades_core_cobble_sandstone_volcanic +columnia:column_linkcrossdown_hades_trees_colwood_pink +hades_furnaces:prism_furnace +hades_stairs:stair_brick_black +hades_doors:door_essexite_a +hades_stairs:step_colwood_brown +columnia:column_linktee_hades_core_cobble_sandstone +hades_doors:door_dungeon2_e +columnia:column_stairsubpillar_hades_core_cobble_baked +hades_stairs:step_out_brick_pink +hades_doors:door_steel_violet_d +hades_stairs:step_out_floor_essexite_essexite +hades_stairs:stair_in_colwood_red +columnia:column_linktee_down_hades_trees_colwood_yellow +columnia:column_stairsub_hades_core_brick_cyan +hades_flowerpots:flower_pot_coconut_sapling +columnia:column_linkangle_hades_core_brick_green +hades_stairs:slab_red +columnia:column_stairsub_hades_core_brick +columnia:column_linkvertical_hades_core_tuff_baked +hades_stairs:stair_grey +columnia:column_bottom_hades_core_sandstone +columnia:column_linktee_down_hades_trees_colwood_brown +columnia:column_stairsubpillar_hades_core_marble +columnia:column_bottom_hades_trees_colwood_grey +hades_tiles:floor_tuff_stone +hades_doors:door_sandstone_volcanic_a +columnia:column_crosslink_hades_core_tuff_baked +hades_stairs:step_in_colwood_brown +hades_core:cobble_sandstone +hades_doors:door_steel_magenta_b +hades_tiles:floor_stonebaked_sandstone +columnia:column_link_hades_trees_colwood_violet +hades_doors:door_rusty_b +columnia:column_stairsubpillar_hades_trees_colwood_violet +columnia:column_linkcrossdown_hades_core_brick_white +hades_doors:door_wood_b +hades_fences:fence_wood_violet +hades_windows:window_wood_cyan +columnia:column_linkcross_hades_core_brick +columnia:column_bottom_columnia_rusty_block +hades_farming:tomato_2 +hades_farming:wheat_3 +columnia:column_bottom_hades_trees_bark +columnia:column_linkangle_hades_trees_colwood_grey +columnia:column_linktee_down_hades_core_stone +columnia:column_crosslink_hades_core_sandstone_volcanic_brick +columnia:column_linkvertical_hades_core_brick_pink +columnia:column_linkcrossdown_hades_core_cobble_sandstone_volcanic +hades_stairs:stair_in_yellow +hades_trees:pale_leaves +hades_doors:door_steel_darkgrey_e +columnia:column_link_hades_core_obsidian +hades_itemshow:pedestal_essexite +columnia:column_stairsub_hades_core_sandstone_volcanic +hades_stairs:stair_in_pink +columnia:column_linkdown_hades_trees_colwood_pink +columnia:column_linkangle_down_hades_core_brick_yellow +columnia:column_stairsubpillar_hades_core_brick_white +hades_stairs:step_in_colwood_blue +columnia:column_linkangle_down_hades_core_brick_cyan +columnia:column_crosslink_hades_core_apolline +columnia:column_link_hades_trees_wood +columnia:column_linkdown_hades_core_chondrite_brick +hades_doors:door_steel_orange_d +columnia:column_linkvertical_hades_trees_colwood_violet +columnia:column_linkangle_down_hades_trees_colwood_blue +hades_stairs:slab_colwood_black +columnia:column_top_hades_trees_colwood_blue +columnia:column_linkdown_hades_trees_colwood_green +hades_stairs:stair_out_cobble_sandstone_volcanic +columnia:column_top_hades_trees_colwood_orange +hades_core:cobble_baked +hades_doors:door_steel_cyan_b +hades_stairs:slab_colwood_brown +columnia:column_linkcross_hades_core_azurite +hades_stairs:step_in_floor_sandstone_sandstone +hades_core:cactus_block +hades_stairs:stair_colwood_green +columnia:column_linktee_hades_trees_colwood_uncolored +hades_stairs:step_out_brick_dark_green +hades_core:stone_with_sapphire +hades_core:marble_brick +hades_doors:door_wood_pale_c +columnia:column_stairsubpillar_hades_core_brick_violet +hades_core:gravel +columnia:column_linkcrossdown_hades_core_tuff_baked_brick +hades_doors:door_steel_cyan_c +hades_stairs:step_out_brick_yellow +hades_stairs:step_in_obsidianbrick +columnia:column_linkcrossdown_hades_trees_cream_wood +hades_stairs:step_in_stone_baked +columnia:column_linkangle_down_hades_core_tuff +hades_doors:gate_wood_open +hades_stairs:step_out_magenta +columnia:column_stairsubpillar_hades_trees_lush_wood +hades_farming:spice_1 +hades_stairs:slab_dark_grey +hades_tiles:floor_chondrite_chondrite +columnia:column_linktee_down_hades_core_brick_dark_grey +hades_flowerpots:flower_pot_sapling +columnia:column_linkvertical_hades_core_brick_magenta +hades_stairs:stair_out_brick_grey +columnia:column_linkdown_hades_trees_colwood_red +columnia:column_crosslink_hades_core_brick_orange +columnia:column_linkcrossdown_hades_core_basalt +columnia:column_linkvertical_hades_core_brick +columnia:column_crosslink_hades_trees_lush_wood +hades_stairs:slab_glowcrystal_block +columnia:column_linkangle_hades_core_tuff +columnia:column_linkangle_hades_core_brick_white +columnia:column_stairsubpillar_hades_core_tuff_baked_brick +columnia:column_linktee_down_hades_trees_colwood_blue +hades_doors:door_steel_yellow_d +columnia:column_linktee_down_hades_core_brick_red +columnia:column_stairsub_hades_core_basalt +columnia:column_linkdown_hades_trees_birch_bark +columnia:column_link_hades_core_brick_dark_grey +columnia:column_linkcross_hades_trees_colwood_white +columnia:column_linkvertical_hades_core_tuff_brick +columnia:column_linkdown_hades_core_brick_pink +hades_doors:door_marble_a +columnia:column_crosslink_hades_trees_colwood_black +hades_walls:cobble +columnia:column_linkdown_hades_core_cinnabar +hades_stairs:slab_brick_green +columnia:column_top_hades_core_cinnabar +hades_trees:colwood_magenta +hades_doors:door_steel_violet_e +hades_core:stone_block_baked +columnia:column_stairsubpillar_hades_core_cobble +columnia:column_linkangle_down_hades_core_orangite +columnia:column_stairsubpillar_hades_core_sandstone +columnia:column_bottom_hades_core_brick_grey +hades_doors:door_dungeon2_d +signs_lib:sign_wall_locked +hades_fences:fence_wood +hades_farming:wheat_2 +hades_doors:door_chondrite_b +hades_furniture:L_binding_bars +columnia:column_linkvertical_hades_trees_colwood_dark_green +hades_doors:door_wood_a +hades_stairs:step_in_pale_bark +hades_stairs:step_out_orangite +hades_doors:door_basalt_c +hades_stairs:stair_in_tuff_baked_brick +columnia:column_linkvertical_hades_core_cobble_baked +columnia:column_top_hades_core_brick_violet +hades_stairs:stair_in_colwood_black +hades_stairs:stair_out_straw +columnia:column_link_hades_core_stonebrick_baked +hades_stairs:slab_floorblock_chondrite_stone +hades_trees:coconut +columnia:column_top_hades_core_marble +columnia:column_linkangle_hades_trees_jungle_wood +hades_stairs:step_out_colwood_magenta +hades_core:apolline +hades_flowerpots:flower_pot_blue +hades_stairs:step_colwood_grey +hades_farming:strawberry_3 +columnia:column_link_hades_trees_colwood_dark_green +gluncarp:green +columnia:column_top_hades_core_brick_pink +hades_stairs:step_out_colwood_black +columnia:column_crosslink_hades_trees_colwood_yellow +hades_tiles:floor_cream_pale +columnia:column_linkangle_hades_core_brick_magenta +columnia:column_linkvertical_hades_trees_colwood_white +hades_doors:door_steel_white_b +columnia:column_bottom_hades_core_chondrite_brick +columnia:column_bottom_hades_trees_canvas_bark +columnia:column_linktee_down_hades_trees_colwood_black +hades_stairs:stair_in_sandstonebrick +hades_doors:door_steel_darkgrey_d +hades_waterplants:waterlily_675 +columnia:column_linkcross_hades_trees_colwood_green +columnia:column_linkangle_hades_core_basalt +hades_stairs:stair_in_colwood_blue +hades_fences:fence_jungle_wood +columnia:column_linktee_down_hades_core_sandstone_volcanic_brick +hades_doors:door_wood_cream_e +columnia:column_crosslink_hades_core_brick_brown +columnia:column_link_hades_core_tuff +hades_core:brick_dark_green +columnia:column_bottom_hades_core_olivine +hades_stairs:slab_colwood_grey +hades_farming:tomato_1 +hades_stairs:slab_birch_bark +columnia:column_linkdown_hades_core_cobble_sandstone +hades_doors:door_steel_c +columnia:column_top_hades_core_essexite +columnia:column_linkdown_hades_core_orangite +hades_core:mese +gluncarp:yellow +hades_flowers:white +hades_core:ladder_jungle_wood +columnia:column_bottom_hades_core_stone +columnia:column_bottom_hades_core_lillite +hades_stairs:step_floor_essexitegold_essexitegold +columnia:column_linkcrossdown_hades_trees_colwood_dark_grey +columnia:column_linkcross_hades_core_marble +hades_trees:colwood_white +hades_stairs:step_in_colwood_dark_green +columnia:column_stairsub_hades_core_brick_red +hades_trees:coconut_sapling +hades_core:azurite_block +columnia:column_stairsub_hades_trees_birch_bark +columnia:column_linkvertical_hades_core_obsidian +hades_stairs:slab_stone_baked +columnia:column_linkdown_hades_core_cobble_sandstone_volcanic +columnia:column_linkcrossdown_hades_core_stone_baked +hades_stairs:step_out_lush_wood +hades_itemshow:pedestal_lillite +hades_stairs:stair_pale_bark +hades_itemshow:pedestal_turquosite +hades_itemshow:pedestal_olivine +hades_itemshow:pedestal_apolline +hades_itemshow:pedestal_basalt +hades_stairs:step_brick_magenta +gluncarp:red +hades_stairs:step_in_cinnabar_brick +columnia:column_linkdown_hades_core_brick_green +hades_itemshow:pedestal_obsidian +hades_itemshow:pedestal_sandstone_volcanic +hades_stairs:step_out_yellow +hades_itemshow:pedestal_sandstone +hades_itemshow:pedestal_marble +columnia:column_stairsubpillar_hades_core_brick_green +hades_itemshow:pedestal_stone_baked +hades_tiles:floor_tuff_tuffbaked +hades_stairs:stair_in_brick_black +columnia:column_linkcrossdown_hades_core_brick_red +hades_itemshow:pedestal_stone +hades_core:stone_with_tin +columnia:column_link_hades_core_brick +hades_walls:mossycobble +hades_stairs:step_out_sandstone +hades_stairs:step_floor_cream_cream +hades_stairs:stair_pink +columnia:column_linktee_hades_trees_colwood_yellow +columnia:column_linkcrossdown_hades_core_brick_dark_grey +mobs_hades:cobweb +columnia:column_linkvertical_hades_core_brick_cyan +hades_stairs:stair_out_azurite +columnia:column_linktee_down_hades_core_sandstone +mobs:spawner +hades_trees:orange_tree +hades_meshhand:hand +gluncarp:machine +columnia:column_linktee_hades_core_brick_dark_green +hades_bushes:yellow +columnia:column_linkcross_hades_core_essexite_brick +hades_stairs:step_floor_jungle_jungle +columnia:column_top_hades_trees_cream_wood +hades_food:tomatosalad +columnia:column_linkangle_hades_core_brick_grey +hades_stairs:stair_lillite +columnia:column_link_hades_trees_canvas_bark +hades_doors:door_steel_yellow_e +hades_stairs:slab_turquosite +hades_food:bottle_olive_oil +hades_stairs:step_in_pink +columnia:column_linkcrossdown_hades_core_brick_violet +hades_stairs:step_out_colwood_orange +hades_doors:door_dungeon2_c +hades_core:chondrite +hades_food:plate +hades_stairs:slab_double_floorblock_chondrite_stone +hades_stairs:stair_in_cactus_brick +hades_stairs:stair_colwood_orange +hades_stairs:slab_floorblock_bstone_sandstone +hades_stairs:slab_double_floorblock_marble_essexite2 +hades_stairs:slab_floorblock_marble_essexite2 +columnia:column_linkdown_hades_trees_colwood_blue +columnia:column_linkcross_hades_core_obsidianbrick +hades_stairs:slab_floorblock_essexite_gold_block +hades_stairs:step_in_lillite_brick +hades_stairs:step_out_lillite_brick +hades_stairs:step_lillite_brick +hades_stairs:slab_lillite_brick +columnia:column_stairsub_hades_trees_colwood_pink +hades_stairs:stair_in_lillite_brick +hades_stairs:stair_out_lillite_brick +columnia:column_linkvertical_hades_core_brick_dark_grey +columnia:column_linktee_down_hades_trees_birch_bark +hades_stairs:stair_lillite_brick +hades_stairs:step_in_turquosite_brick +hades_stairs:step_out_turquosite_brick +hades_tiles:floor_sandstone_sandstonevolcanic +hades_stairs:step_turquosite_brick +hades_doors:door_sandstone_volcanic_c +columnia:column_linktee_down_hades_core_brick_cyan +hades_stairs:slab_turquosite_brick +hades_stairs:stair_in_turquosite_brick +hades_stairs:stair_out_turquosite_brick +hades_stairs:stair_turquosite_brick +columnia:column_linkcross_hades_core_brick_black +hades_stairs:step_in_azurite_brick +hades_stairs:slab_floor_lush_lush +hades_stairs:step_out_azurite_brick +columnia:column_bottom_hades_core_cobble +hades_stairs:step_azurite_brick +columnia:column_stairsubpillar_hades_core_sandstone_volcanic +hades_stairs:stair_out_brick_dark_green +columnia:column_linkangle_down_hades_trees_colwood_pink +hades_stairs:slab_azurite_brick +hades_stairs:stair_in_azurite_brick +hades_stairs:stair_out_azurite_brick +columnia:column_mid_hades_core_cinnabar +hades_stairs:stair_azurite_brick +columnia:column_top_hades_core_brick_red +hades_furniture:table_white +hades_stairs:step_in_olivine_brick +columnia:column_linkangle_down_hades_core_mossycobble +columnia:column_link_hades_trees_colwood_white +columnia:column_bottom_hades_core_chondrite +columnia:column_link_hades_core_brick_magenta +columnia:column_linkvertical_hades_trees_colwood_red +hades_stairs:step_out_olivine_brick +hades_stairs:step_olivine_brick +hades_stairs:slab_olivine_brick +hades_stairs:stair_in_olivine_brick +columnia:column_linkcross_hades_trees_colwood_grey +hades_tiles:floor_cream_cream +hades_windows:window_wood_darkgrey +hades_stairs:stair_out_olivine_brick +hades_stairs:stair_olivine_brick +columnia:column_linktee_down_hades_core_sandstone_volcanic +hades_itemshow:pedestal_chondrite +hades_core:cobble_block +hades_doors:door_steel_white_c +hades_stairs:step_out_cinnabar_brick +hades_tiles:floor_sandstone_tuffbaked +hades_stairs:step_cinnabar_brick +hades_stairs:slab_cinnabar_brick +hades_stairs:stair_in_olivine +hades_stairs:stair_in_cinnabar_brick +hades_stairs:stair_out_cinnabar_brick +hades_core:steelblock +hades_stairs:stair_cinnabar_brick +hades_stairs:step_in_orangite_brick +hades_stairs:step_out_orangite_brick +hades_stairs:stair_in_brick_dark_grey +columnia:column_linkcrossdown_hades_trees_colwood_red +hades_refruit:bud_apple +hades_stairs:step_orangite_brick +hades_stairs:slab_orangite_brick +hades_stairs:stair_in_orangite_brick +hades_stairs:stair_out_orangite_brick +hades_stairs:stair_orangite_brick +hades_stairs:step_in_apolline_brick +hades_stairs:step_out_apolline_brick +columnia:column_linkcrossdown_hades_trees_colwood_black +hades_stairs:step_apolline_brick +hades_stairs:slab_apolline_brick +hades_stairs:stair_in_apolline_brick +columnia:column_linkangle_down_hades_core_lillite +hades_grass:dead_grass_4 +hades_stairs:stair_out_apolline_brick +hades_trees:pale_sapling +hades_stairs:stair_apolline_brick +columnia:column_bottom_hades_trees_colwood_cyan +hades_stairs:step_out_apolline +columnia:column_link_hades_core_olivine_brick +columnia:column_mid_hades_trees_bark +hades_stairs:step_lillite +columnia:column_linkdown_hades_core_mossycobble +hades_farming:cotton_2 +hades_stairs:slab_basalt_brick +hades_stairs:stair_in_lillite +signs_lib:sign_wall_yellow +columnia:column_linktee_hades_core_brick_orange +columnia:column_stairsub_hades_trees_colwood_black +columnia:column_linktee_hades_core_olivine +hades_stairs:step_in_turquosite +hades_stairs:slab_sandstonebrick +hades_stairs:step_out_turquosite +columnia:column_link_hades_core_brick_green +columnia:column_top_hades_core_obsidian +columnia:column_linktee_down_hades_trees_colwood_orange +hades_stairs:step_turquosite +hades_chests:chest_dark_grey_locked +hades_stairs:step_out_colwood_yellow +hades_stairs:stair_in_turquosite +hades_stairs:stair_out_turquosite +columnia:column_linkvertical_hades_trees_birch_bark +hades_stairs:stair_turquosite +columnia:column_linkvertical_hades_core_marble +hades_stairs:step_in_azurite +columnia:column_bottom_hades_core_tuff +hades_stairs:step_azurite +hades_stairs:slab_tuff +hades_stairs:stair_in_azurite +hades_core:marble_block +hades_stairs:step_out_olivine +hades_vines:root +hades_stairs:step_olivine +hades_tiles:floor_tuff_stonebaked +columnia:column_linkdown_hades_trees_colwood_cyan +hades_stairs:step_in_lush_wood +hades_stairs:step_in_cinnabar +hades_stairs:step_cinnabar +hades_core:gravel_volcanic_block +hades_stairs:step_brick_orange +hades_stairs:stair_in_cinnabar +columnia:column_stairsub_hades_core_cactus_brick +hades_stairs:stair_out_wood +hades_stairs:stair_cinnabar +hades_stairs:step_goldblock +hades_stairs:step_orangite +columnia:column_stairsub_hades_core_stone_baked +hades_stairs:slab_stonebrick_baked +hades_stairs:slab_orangite +hades_stairs:stair_out_essexite +hades_core:brick_brown +hades_stairs:slab_jungle_wood +columnia:column_linkdown_hades_core_brick_yellow +columnia:column_stairsubpillar_hades_trees_colwood_yellow +hades_stairs:stair_in_orangite +hades_stairs:stair_orangite +hades_stairs:step_in_apolline +hades_doors:gate_pale_wood_open +hades_stairs:step_out_lillite +columnia:column_top_hades_trees_colwood_grey +columnia:column_linkvertical_hades_core_brick_blue +hades_stairs:step_out_tuff_baked_brick +hades_core:stone_with_diamond +hades_stairs:step_chondrite +hades_stairs:stair_tuff_baked_brick +hades_core:brick_grey +hades_flowerpots:flower_pot_red +hades_chests:chest_magenta +hades_stairs:stair_apolline +hades_stairs:step_out_floor_marble_marble +hades_stairs:step_floor_marble_marble +columnia:column_linkcross_hades_core_cobble +hades_windows:window_wood +columnia:column_crosslink_hades_trees_canvas_bark +columnia:column_crosslink_hades_trees_colwood_cyan +hades_stairs:slab_floor_marble_marble +hades_stairs:stair_out_floor_marble_marble +columnia:column_linkvertical_hades_trees_colwood_dark_grey +hades_chests:chest_violet_locked +hades_core:bronzeblock +columnia:column_stairsub_hades_core_mossycobble +hades_stairs:slab_floor_essexitegold_essexitegold +hades_stairs:step_dark_grey +hades_stairs:stair_sandstone_volcanic +columnia:column_linkcross_hades_core_brick_dark_grey +hades_stairs:step_in_colwood_orange +columnia:column_linktee_hades_trees_colwood_magenta +columnia:column_linkangle_down_hades_trees_lush_wood +hades_stairs:stair_out_floor_essexitegold_essexitegold +hades_stairs:step_in_floor_essexite_essexite +columnia:column_stairsub_hades_core_apolline +columnia:column_linkdown_hades_trees_cream_wood +hades_stairs:step_floor_essexite_essexite +hades_stairs:stair_in_floor_essexite_essexite +hades_stairs:stair_out_floor_essexite_essexite +hades_trees:colwood_cyan +columnia:column_linktee_hades_core_cobble_sandstone_volcanic +hades_core:dirt_with_grass_l1 +hades_stairs:step_in_floor_chondrite_chondrite +columnia:column_stairsubpillar_hades_trees_colwood_orange +hades_stairs:step_out_floor_chondrite_chondrite +hades_core:ruby_block +hades_stairs:step_in_stonebrick +hades_stairs:step_floor_chondrite_chondrite +hades_doors:door_rusty_e +columnia:column_stairsub_hades_core_brick_pink +hades_cloth:pink +columnia:column_top_hades_core_brick_dark_grey +hades_stairs:stair_glowcrystal_block +hades_stairs:slab_charred_wood +hades_stairs:stair_out_floor_chondrite_chondrite +hades_doors:door_obsidian_glass_d +hades_stairs:stair_floor_chondrite_chondrite +hades_stairs:step_in_floor_sandstonevolcanic_sandstonevolcanic +columnia:column_crosslink_hades_core_sandstonebrick +hades_stairs:step_floor_sandstonevolcanic_sandstonevolcanic +hades_stairs:stair_in_brick_orange +columnia:column_stairsubpillar_hades_trees_colwood_uncolored +hades_stairs:slab_tuff_brick +hades_stairs:stair_in_floor_sandstonevolcanic_sandstonevolcanic +hades_stairs:stair_in_jungle_wood +hades_stairs:step_canvas_bark +hades_stairs:step_cobble_sandstone_volcanic +hades_doors:trapdoor_lush_open +hades_stairs:step_out_floor_sandstone_sandstone +columnia:column_linkangle_hades_core_essexite_brick +columnia:column_bottom_hades_core_brick_violet +hades_stairs:step_floor_sandstone_sandstone +hades_stairs:slab_floor_sandstone_sandstone +hades_stairs:stair_in_floor_sandstone_sandstone +hades_stairs:stair_out_floor_sandstone_sandstone +hades_stairs:stair_floor_sandstone_sandstone +hades_stairs:step_in_floor_tuffbaked_tuffbaked +hades_stairs:step_out_floor_tuffbaked_tuffbaked +hades_stairs:step_floor_tuffbaked_tuffbaked +hades_stairs:step_in_tuff_baked +columnia:column_linkangle_down_hades_trees_colwood_brown +hades_stairs:stair_in_floor_tuffbaked_tuffbaked +hades_chests:chest_pink_locked +hades_stairs:stair_out_floor_tuffbaked_tuffbaked +columnia:column_top_hades_core_brick_cyan +hades_stairs:stair_floor_tuffbaked_tuffbaked +hades_stairs:step_in_floor_tuff_tuff +columnia:column_crosslink_hades_trees_jungle_bark +hades_stairs:step_floor_tuff_tuff +hades_stairs:slab_floor_tuff_tuff +hades_stairs:stair_in_floor_tuff_tuff +hades_trees:orange_leaves +hades_trees:jungle_tree +columnia:column_linkdown_hades_core_tuff_baked +hades_stairs:step_in_floor_stonebaked_stonebaked +hades_stairs:step_out_floor_stonebaked_stonebaked +hades_stairs:step_floor_stonebaked_stonebaked +hades_chests:chest_dark_green +columnia:column_linkcrossdown_hades_trees_bark +columnia:column_stairsub_hades_trees_colwood_dark_grey +hades_furniture:armchair_white +hades_stairs:step_in_tuff +columnia:column_stairsubpillar_hades_core_apolline +hades_stairs:step_in_floor_stone_stone +hades_stairs:stair_out_stonebrick_baked +hades_stairs:step_floor_stone_stone +columnia:column_linktee_down_hades_trees_colwood_white +columnia:column_linkdown_hades_core_brick_red +columnia:column_linkcrossdown_hades_core_olivine +columnia:column_crosslink_hades_trees_wood +columnia:column_crosslink_hades_core_obsidianbrick +hades_stairs:step_cobble_baked +hades_stairs:stair_in_floor_stone_stone +columnia:column_linktee_hades_core_mossycobble +hades_stairs:stair_floor_stone_stone +hades_stairs:step_in_floor_jungle_jungle +hades_stairs:step_out_floor_jungle_jungle +hades_flowerpots:flower_pot_pale_sapling +columnia:column_top_hades_trees_colwood_dark_grey +columnia:column_linktee_hades_core_sandstonebrick +columnia:column_linkvertical_hades_trees_colwood_green +hades_stairs:stair_floor_jungle_jungle +columnia:column_linkangle_hades_trees_colwood_red +hades_stairs:step_in_floor_cream_cream +hades_stairs:step_out_floor_cream_cream +hades_itemshow:frame +hades_stairs:stair_in_floor_cream_cream +hades_core:lillite_brick +columnia:column_linktee_down_hades_core_brick_green +hades_stairs:stair_floor_cream_cream +hades_stairs:step_out_jungle_wood +hades_stairs:stair_tinblock +columnia:column_stairsub_hades_trees_colwood_yellow +columnia:column_linkcross_hades_core_tuff_brick +columnia:column_bottom_hades_trees_colwood_brown +hades_stairs:step_in_floor_pale_pale +columnia:column_linkcross_hades_trees_canvas_bark +hades_flowers:blue +hades_stairs:step_floor_pale_pale +hades_stairs:stair_out_floor_pale_pale +hades_stairs:stair_floor_pale_pale +hades_stairs:stair_out_red +hades_stairs:stair_out_charred_wood +columnia:column_linkangle_down_hades_trees_colwood_magenta +hades_stairs:stair_out_bronzeblock +columnia:column_linkvertical_hades_core_cobble +hades_stairs:step_out_floor_lush_lush +hades_stairs:slab_grey +columnia:column_linkangle_down_hades_core_sandstonebrick +hades_stairs:stair_colwood_uncolored +hades_core:basalt_brick +hades_stairs:stair_floor_lush_lush +hades_stairs:step_out_floor_wood_wood +hades_stairs:step_floor_wood_wood +columnia:column_stairsub_hades_core_brick_magenta +columnia:column_top_hades_core_brick_dark_green +columnia:column_link_hades_core_sandstone +hades_stairs:stair_marble +hades_core:azurite +hades_stairs:stair_out_floor_wood_wood +hades_stairs:stair_floor_wood_wood +hades_stairs:step_in_glowcrystal_block +hades_doors:door_wood_c +columnia:column_linktee_hades_core_cactus_brick +columnia:column_crosslink_hades_core_cobble_baked +hades_stairs:step_out_glowcrystal_block +hades_stairs:stair_in_glowcrystal_block +hades_trees:colwood_yellow +hades_core:lillite_block +hades_doors:door_basalt_a +hades_stairs:stair_in_floor_chondrite_chondrite +hades_stairs:step_in_dark_green +hades_stairs:step_out_dark_green +hades_stairs:step_dark_green +columnia:column_linktee_hades_core_turquosite +hades_stairs:stair_in_dark_green +hades_stairs:stair_out_dark_green +hades_flowers:yellow +columnia:column_linkangle_hades_trees_colwood_white +hades_stairs:stair_dark_green +hades_stairs:step_in_dark_grey +columnia:column_linkcrossdown_hades_core_olivine_brick +hades_stairs:step_out_dark_grey +hades_stairs:stair_in_floor_essexitegold_essexitegold +hades_stairs:stair_in_dark_grey +hades_vines:vines_block +hades_stairs:stair_out_dark_grey +hades_stairs:stair_dark_grey +columnia:column_linktee_hades_core_cobble_baked +hades_stairs:step_out_pink +hades_stairs:step_pink +columnia:column_linkcrossdown_hades_trees_orange_bark +columnia:column_linkangle_down_hades_trees_jungle_wood +hades_stairs:step_out_brown +hades_stairs:step_brown +hades_stairs:slab_brown +hades_stairs:stair_out_brown +hades_stairs:stair_brown +hades_stairs:step_in_violet +hades_stairs:step_out_violet +columnia:column_linktee_down_hades_core_brick_pink +hades_doors:door_steel_bar_d +columnia:column_bottom_hades_trees_jungle_wood +columnia:column_stairsub_hades_trees_wood +hades_stairs:step_violet +hades_stairs:slab_violet +columnia:column_linkangle_hades_core_stone +hades_stairs:stair_out_violet +hades_stairs:stair_violet +hades_stairs:step_in_orange +columnia:column_linktee_hades_trees_colwood_brown +columnia:column_crosslink_hades_trees_pale_bark +hades_doors:door_steel_a +columnia:column_bottom_hades_core_marble +hades_windows:window_wood_violet +hades_stairs:step_orange +columnia:column_mid_hades_core_azurite +columnia:column_stairsub_hades_core_orangite +hades_stairs:step_sandstonebrick +columnia:column_bottom_hades_trees_orange_bark +hades_stairs:step_magenta +hades_stairs:step_out_colwood_cyan +hades_stairs:slab_magenta +hades_stairs:stair_in_magenta +columnia:column_linkdown_hades_trees_colwood_brown +hades_refruit:flower_apple +columnia:column_stairsub_hades_core_brick_white +hades_stairs:step_out_marble +hades_stairs:step_in_blue +hades_stairs:step_out_blue +hades_stairs:step_blue +columnia:column_linkcrossdown_hades_core_obsidian +hades_stairs:stair_out_blue +hades_chests:chest_black +hades_stairs:step_out_cyan +hades_stairs:step_cyan +hades_cloth:black +columnia:column_crosslink_hades_trees_colwood_pink +columnia:column_crosslink_hades_trees_bark +hades_stairs:stair_out_cyan +hades_chests:chest_cyan +hades_stairs:stair_out_colwood_blue +hades_stairs:step_in_green +columnia:column_linkcrossdown_hades_core_brick_yellow +hades_stairs:step_out_green +hades_stairs:step_green +gluncarp:pink +columnia:column_linkvertical_hades_core_brick_grey +hades_core:tuff +columnia:column_link_hades_trees_colwood_orange +hades_stairs:stair_in_green +hades_stairs:stair_out_green +hades_stairs:stair_in_marble_brick +hades_stairs:step_in_yellow +hades_stairs:step_yellow +columnia:column_linkvertical_hades_core_cactus_brick +columnia:column_linkangle_hades_core_chondrite_brick +hades_fences:fence_wood_green +hades_doors:door_steel_darkgreen_c +hades_stairs:step_in_red +columnia:column_linkdown_hades_core_olivine_brick +hades_tiles:floor_cream_jungle +hades_stairs:stair_out_brick_green +columnia:column_linkcross_hades_core_tuff_baked_brick +hades_stairs:step_out_red +hades_stairs:step_red +hades_stairs:step_in_black +hades_core:chondrite_block +hades_stairs:step_out_black +hades_stairs:step_black +columnia:column_mid_hades_core_lillite_brick +columnia:column_bottom_hades_core_cobble_baked +hades_core:sapphire_block +hades_stairs:stair_in_black +hades_stairs:step_out_charred_wood +hades_stairs:stair_in_charred_wood +columnia:column_mid_hades_trees_colwood_dark_grey +hades_stairs:step_colwood_white +columnia:column_bottom_hades_trees_colwood_white +hades_stairs:step_out_grey +hades_stairs:step_grey +signs_lib:sign_wall_green +hades_stairs:step_floor_lush_lush +hades_stairs:step_out_cobble +hades_stairs:stair_in_grey +hades_stairs:step_in_white +columnia:column_top_hades_core_azurite +hades_core:stonebrick_baked +hades_stairs:step_out_white +hades_stairs:step_white +hades_stairs:stair_white +hades_stairs:step_in_straw +hades_tiles:floor_marble_marble +columnia:column_mid_hades_core_mossycobble +columnia:column_stairsub_hades_trees_colwood_blue +hades_stairs:step_out_straw +hades_stairs:step_straw +hades_stairs:slab_straw +hades_stairs:stair_straw +hades_stairs:step_out_obsidianbrick +hades_doors:door_obsidian_glass_c +columnia:column_linkdown_hades_core_cactus_brick +hades_stairs:step_obsidianbrick +hades_tiles:floor_lush_wood +hades_flowerpots:flower_pot_violet +hades_doors:door_steel_darkgrey_a +hades_stairs:stair_in_obsidianbrick +hades_tiles:floor_stone_stonebaked +hades_stairs:stair_obsidianbrick +columnia:column_stairsub_hades_core_basalt_brick +columnia:column_linkcross_hades_trees_lush_wood +hades_stairs:step_in_cactus_brick +hades_stairs:step_out_cactus_brick +hades_stairs:stair_cobble +hades_stairs:step_cactus_brick +hades_doors:door_stone_d +hades_stairs:slab_cactus_brick +columnia:column_linkangle_down_hades_core_marble +hades_stairs:slab_double_floorblock_bstone_sandstone +columnia:column_linkangle_hades_core_essexite +columnia:column_linkcross_hades_core_chondrite +columnia:column_linkangle_hades_core_brick_dark_grey +hades_vines:willow_rotten +hades_stairs:stair_out_cactus_brick +hades_stairs:stair_cactus_brick +hades_stairs:step_in_rusty_block +hades_stairs:step_out_rusty_block +hades_stairs:step_rusty_block +hades_stairs:slab_rusty_block +hades_stairs:stair_in_rusty_block +hades_stairs:stair_out_rusty_block +columnia:column_linktee_hades_core_chondrite_brick +columnia:column_linktee_down_hades_core_brick_dark_green +hades_stairs:stair_rusty_block +columnia:column_linkcrossdown_hades_core_stonebrick_baked +hades_stairs:stair_in_essexite +hades_stairs:step_in_essexite_brick +columnia:column_linktee_hades_core_olivine_brick +hades_stairs:step_out_essexite_brick +columnia:column_top_hades_core_chondrite +hades_stairs:step_essexite_brick +hades_stairs:slab_essexite_brick +hades_stairs:stair_in_essexite_brick +hades_stairs:stair_out_essexite_brick +hades_stairs:stair_essexite_brick +hades_stairs:slab_floor_tuffbaked_tuffbaked +hades_stairs:step_out_tuff_baked +hades_stairs:stair_brick_dark_green +hades_core:clay +columnia:column_linkcrossdown_hades_core_brick_magenta +hades_stairs:stair_in_tuff_baked +columnia:column_linktee_down_hades_core_marble +hades_stairs:stair_out_tuff_baked +hades_doors:door_basalt_d +hades_stairs:step_tuff_baked_brick +columnia:column_linktee_down_hades_core_chondrite +hades_stairs:slab_tuff_baked_brick +hades_stairs:stair_out_tuff_baked_brick +hades_doors:door_steel_grey_d +columnia:column_linkvertical_hades_core_brick_violet +columnia:column_stairsubpillar_hades_core_brick_yellow +hades_stairs:stair_in_apolline +hades_stairs:step_out_tuff +hades_stairs:step_tuff +hades_stairs:slab_azurite +columnia:column_linkdown_hades_core_marble_brick +hades_stairs:stair_tuff +hades_stairs:step_in_tuff_brick +hades_stairs:step_out_tuff_brick +gluncarp:cyan +columnia:column_linktee_down_hades_core_brick_yellow +columnia:column_linktee_down_hades_core_obsidian +hades_stairs:stair_out_brick_white +hades_tiles:floor_stonebaked_stonebaked +hades_stairs:step_tuff_brick +hades_stairs:slab_floor_sandstonevolcanic_sandstonevolcanic +hades_stairs:stair_in_tuff_brick +hades_furniture:armchair_red +hades_stairs:stair_out_tuff_brick +hades_stairs:stair_tuff_brick +hades_stairs:step_in_marble +columnia:column_mid_hades_core_essexite +hades_tiles:floor_tuffbaked_chondrite +columnia:column_linkdown_hades_core_brick_grey +columnia:column_linkangle_down_hades_trees_colwood_black +hades_stairs:step_in_chondrite_brick +columnia:column_top_hades_trees_colwood_brown +hades_stairs:step_marble +hades_stairs:step_in_brick_grey +hades_stairs:slab_floor_wood_wood +hades_stairs:step_in_marble_brick +hades_stairs:step_out_marble_brick +hades_stairs:step_marble_brick +hades_stairs:slab_marble_brick +hades_stairs:stair_green +hades_stairs:stair_out_marble_brick +hades_stairs:stair_marble_brick +hades_stairs:step_in_chondrite +columnia:column_linkcrossdown_hades_trees_jungle_wood +columnia:column_stairsub_hades_core_brick_yellow +hades_stairs:slab_apolline +hades_doors:trapdoor_rusty_bar +hades_stairs:stair_out_colwood_cyan +hades_stairs:step_out_brick_black +columnia:column_linkcross_hades_core_brick_green +hades_core:tuff_block +hades_stairs:stair_in_chondrite +columnia:column_linkangle_down_hades_core_brick_blue +hades_chests:chest_orange_locked +hades_stairs:step_out_chondrite_brick +hades_stairs:stair_in_steelblock +hades_stairs:step_chondrite_brick +columnia:column_linktee_down_hades_core_olivine_brick +columnia:column_stairsubpillar_hades_core_lillite +columnia:column_linkvertical_hades_core_azurite_brick +hades_stairs:stair_chondrite_brick +hades_core:gravel_block +hades_stairs:step_in_basalt +hades_cloth:violet +hades_stairs:step_basalt +hades_stairs:slab_basalt +hades_stairs:stair_in_basalt +columnia:column_linkcrossdown_hades_core_marble +hades_stairs:stair_out_basalt +columnia:column_linktee_hades_core_brick_black +hades_furniture:armchair_dark_green +columnia:column_linktee_down_hades_trees_colwood_dark_green +hades_furniture:chair_uncolored +hades_core:essexite +columnia:column_top_hades_core_olivine_brick +hades_stairs:step_out_basalt_brick +hades_stairs:step_basalt_brick +hades_stairs:step_out_colwood_white +columnia:column_stairsub_hades_core_turquosite +hades_stairs:step_out_stonebrick +hades_stairs:step_stonebrick +hades_tiles:floor_pale_lush +hades_stairs:step_out_tinblock +hades_stairs:stair_out_stonebrick +hades_stairs:stair_stonebrick +columnia:column_linktee_hades_core_azurite_brick +hades_stairs:step_out_sandstone_volcanic_brick +hades_stairs:step_sandstone_volcanic_brick +columnia:column_bottom_hades_core_apolline +hades_doors:door_steel_d +columnia:column_linkdown_hades_trees_colwood_yellow +hades_stairs:stair_out_cobble_baked +columnia:column_linkdown_hades_core_obsidian +hades_stairs:step_brick_dark_grey +hades_stairs:stair_out_olivine +hades_stairs:step_out_cobble_sandstone_volcanic +hades_core:brick_blue +hades_stairs:stair_floor_sandstonevolcanic_sandstonevolcanic +hades_stairs:stair_in_cobble_sandstone_volcanic +hades_stairs:stair_in_cyan +hades_stairs:step_in_sandstone_volcanic +columnia:column_linktee_down_hades_core_obsidianbrick +hades_grass:grass_3 +hades_stairs:step_out_sandstone_volcanic +columnia:column_link_hades_core_marble_brick +hades_stairs:step_brick_grey +hades_trees:colwood_blue +hades_core:dirt_with_grass_l3 +columnia:column_linkdown_hades_trees_pale_wood +columnia:column_mid_hades_core_lillite +columnia:column_top_hades_trees_jungle_wood +hades_stairs:stair_orange +hades_stairs:stair_out_sandstonebrick +columnia:column_linkdown_hades_core_apolline +hades_chests:chest_yellow +hades_stairs:stair_sandstonebrick +columnia:column_linkangle_hades_core_mossycobble +hades_stairs:step_in_cobble_sandstone +hades_stairs:step_out_cobble_sandstone +columnia:column_linkcross_hades_core_brick_red +hades_stairs:step_cobble_sandstone +columnia:column_linktee_down_hades_trees_pale_wood +hades_vines:jungle_rotten +hades_stairs:stair_in_cobble_sandstone +hades_stairs:stair_out_cobble_sandstone +columnia:column_linkcross_hades_core_obsidian +hades_stairs:stair_cobble_sandstone +hades_doors:door_sandstone_e +hades_itemshow:pedestal_top +hades_stairs:step_sandstone +columnia:column_top_hades_core_lillite +gluncarp:dark_grey +hades_doors:door_sandstone_c +hades_stairs:stair_out_brick +hades_stairs:stair_sandstone +hades_stairs:step_in_brick_yellow +columnia:column_linkangle_down_hades_trees_colwood_yellow +hades_doors:gate_wood_closed +hades_stairs:stair_out_brick_magenta +hades_stairs:step_in_brick_cyan +hades_stairs:slab_brick_yellow +hades_stairs:stair_in_brick_yellow +hades_bushes:violet +columnia:column_linkcross_hades_core_brick_pink +hades_stairs:stair_out_brick_yellow +hades_stairs:stair_brick_yellow +hades_tiles:floor_sandstone_chondrite +hades_stairs:step_out_brick_white +hades_stairs:step_brick_white +hades_cloth:brown +columnia:column_linkvertical_hades_core_marble_brick +hades_stairs:step_in_brick_violet +hades_stairs:step_out_brick_violet +hades_stairs:stair_in_brick_violet +hades_stairs:stair_out_brick_violet +hades_flowerpots:flower_pot_olive_sapling +hades_stairs:step_in_brick_red +columnia:column_top_hades_trees_colwood_green +columnia:column_linkangle_down_hades_trees_orange_bark +columnia:column_stairsubpillar_hades_core_sandstone_volcanic_brick +columnia:column_crosslink_hades_core_brick_red +hades_trees:charred_wood +hades_bushes:green +hades_stairs:stair_out_brick_red +columnia:column_stairsub_hades_trees_cream_wood +hades_windows:window_wood_grey +hades_stairs:stair_brick_red +hades_stairs:step_in_brick_pink +signs_lib:sign_hanging +hades_stairs:step_brick_pink +columnia:column_linkangle_down_hades_core_sandstone_volcanic_brick +hades_stairs:slab_brick_pink +columnia:column_bottom_hades_core_cactus_brick +hades_trees:canvas_leaves +hades_stairs:stair_brick_pink +hades_core:diamondblock +hades_stairs:step_in_brick_orange +hades_stairs:step_out_brick_orange +columnia:column_link_hades_core_sandstone_volcanic_brick +hades_stairs:slab_brick_orange +hades_stairs:stair_brick_orange +hades_stairs:step_in_brick_magenta +hades_doors:door_chondrite_a +hades_core:lava_flowing +hades_farming:tomato_3 +hades_core:brick +columnia:column_bottom_hades_core_stone_baked +hades_stairs:stair_in_brick_magenta +hades_stairs:step_brick_yellow +hades_stairs:stair_brick_magenta +hades_stairs:stair_in_marble +hades_fences:fence_wood_cyan +hades_stairs:step_out_brick_grey +hades_tiles:floor_stone_chondrite +hades_stairs:stair_out_colwood_yellow +columnia:column_linkangle_down_hades_core_brick_white +hades_core:olivine_block +columnia:column_linktee_down_hades_core_stonebrick +columnia:column_linkangle_hades_core_obsidian +columnia:column_stairsubpillar_hades_core_turquosite_brick +columnia:column_linktee_down_hades_trees_colwood_dark_grey +hades_stairs:step_out_brick_green +columnia:column_crosslink_hades_core_chondrite +hades_stairs:stair_in_brick_green +columnia:column_top_hades_core_brick_magenta +columnia:column_top_hades_core_cobble_sandstone +hades_stairs:stair_in_sandstone_volcanic_brick +columnia:column_linktee_down_hades_core_brick_white +columnia:column_bottom_hades_trees_colwood_magenta +hades_stairs:slab_brick_dark_grey +hades_stairs:stair_brick_dark_grey +columnia:column_linkvertical_hades_core_tuff +hades_stairs:step_tuff_baked +hades_stairs:step_out_brick_cyan +hades_core:turquosite_brick +hades_stairs:stair_in_brick_cyan +hades_stairs:stair_out_brick_cyan +signs_lib:sign_yard +columnia:column_linktee_hades_core_tuff_brick +hades_stairs:step_in_brick_brown +columnia:column_linkangle_down_hades_core_obsidianbrick +hades_stairs:slab_brick_brown +hades_core:floor_marble_essexite2 +columnia:column_linkangle_hades_core_sandstone +hades_stairs:step_in_brick_blue +hades_tiles:floor_cream_wood +hades_core:stone_with_ruby +hades_stairs:stair_in_colwood_orange +hades_core:turquosite_block +hades_cloth:cyan +hades_stairs:step_brick_blue +hades_stairs:slab_brick_blue +columnia:column_top_hades_core_tuff_baked_brick +hades_stairs:stair_in_brick_blue +columnia:column_link_hades_core_brick_dark_green +hades_stairs:stair_brick_blue +hades_doors:door_stone_c +columnia:column_linkvertical_hades_trees_wood +hades_stairs:step_in_brick_black +columnia:column_stairsubpillar_hades_trees_colwood_red +hades_doors:door_essexite_c +hades_doors:door_steel_orange_a +hades_stairs:stair_out_tuff +columnia:column_mid_hades_trees_colwood_brown +hades_stairs:step_in_brick +columnia:column_linkcrossdown_hades_core_cobble +columnia:column_linkcross_hades_core_olivine +hades_stairs:stair_in_colwood_pink +hades_stairs:step_out_brick +hades_waterplants:waterlily +hades_stairs:step_brick +hades_lamps:lantern_rusty +columnia:column_linkcrossdown_hades_core_brick_orange +columnia:column_linktee_hades_trees_lush_wood +columnia:column_linktee_hades_trees_bark +columnia:column_linkcrossdown_hades_trees_jungle_bark +hades_stairs:stair_brick +columnia:column_crosslink_hades_trees_colwood_orange +hades_stairs:step_in_cobble_baked +columnia:column_link_hades_trees_cream_wood +hades_stairs:stair_pale_wood +hades_stairs:step_out_cobble_baked +hades_stairs:slab_cobble_baked +hades_core:mossystone +hades_stairs:stair_in_cobble_baked +columnia:column_top_hades_trees_wood +hades_stairs:slab_sandstone_volcanic_brick +columnia:column_linkvertical_hades_core_orangite_brick +columnia:column_top_hades_trees_jungle_bark +hades_stairs:step_cobble +hades_doors:door_steel_blue_a +hades_stairs:stair_in_cobble +columnia:column_crosslink_columnia_rusty_block +hades_tiles:floor_sandstonevolcanic_sandstonevolcanic +hades_stairs:stair_out_cobble +columnia:column_crosslink_hades_core_essexite_brick +columnia:column_stairsub_hades_core_lillite_brick +hades_stairs:step_stone_baked +columnia:column_linkangle_down_hades_trees_jungle_bark +hades_stairs:slab_lush_wood +columnia:column_crosslink_hades_core_cobble +hades_stairs:step_stonebrick_baked +hades_cloth:dark_green +hades_stairs:step_out_pale_bark +hades_stairs:stair_in_stonebrick_baked +hades_stairs:step_out_floor_stone_stone +hades_tiles:floor_chondrite_stonebaked +hades_core:brick_green +hades_doors:door_steel_grey_a +hades_stairs:step_in_charred_wood +hades_stairs:step_out_stone +columnia:column_linktee_down_hades_core_essexite_brick +hades_stairs:step_stone +hades_stairs:slab_stone +hades_stairs:stair_stone +hades_stairs:step_in_goldblock +hades_stairs:step_out_goldblock +columnia:column_mid_hades_core_stonebrick_baked +columnia:column_linkvertical_hades_core_cinnabar +hades_stairs:step_in_orangite +columnia:column_stairsub_hades_core_cinnabar_brick +hades_core:sandstone_volcanic +hades_stairs:slab_goldblock +hades_stairs:stair_in_goldblock +hades_stairs:stair_out_goldblock +hades_core:fertile_sand +hades_farming:seed_spice +hades_stairs:stair_goldblock +hades_doors:door_marble_e +hades_stairs:step_in_tinblock +columnia:column_stairsubpillar_hades_trees_pale_bark +hades_stairs:stair_in_stonebrick +hades_tiles:floor_stone_tuff +columnia:column_link_hades_core_brick_orange +hades_stairs:slab_double_tinblock +hades_stairs:step_pale_wood +hades_stairs:stair_in_tinblock +hades_stairs:stair_out_tinblock +columnia:column_bottom_hades_core_brick_black +hades_stairs:step_in_bronzeblock +hades_doors:door_steel_yellow_a +hades_stairs:step_out_bronzeblock +hades_farming:cotton_3 +hades_stairs:stair_out_colwood_uncolored +columnia:column_linkangle_down_hades_core_brick_grey +hades_core:stone_with_coal +hades_stairs:step_bronzeblock +hades_stairs:slab_double_bronzeblock +columnia:column_crosslink_hades_core_brick_white +hades_core:cinnabar +hades_stairs:slab_bronzeblock +hades_furniture:armchair_blue +columnia:column_link_hades_core_tuff_baked_brick +hades_stairs:stair_in_bronzeblock +columnia:column_stairsubpillar_hades_trees_colwood_white +hades_stairs:step_in_floor_lush_lush +hades_stairs:stair_bronzeblock +columnia:column_link_columnia_rusty_block +hades_stairs:step_in_copperblock +columnia:column_linkangle_hades_trees_colwood_magenta +columnia:column_mid_hades_core_brick_blue +hades_stairs:step_copperblock +hades_stairs:stair_in_copperblock +columnia:column_mid_hades_core_cobble_sandstone +hades_stairs:stair_copperblock +hades_vessels:glass_bottle +columnia:column_linkcross_hades_core_sandstonebrick +hades_stairs:step_out_steelblock +hades_stairs:slab_steelblock +hades_stairs:stair_out_steelblock +columnia:column_linkcrossdown_hades_core_cinnabar_brick +hades_stairs:stair_out_bark +hades_stairs:step_colwood_yellow +hades_stairs:slab_colwood_yellow +columnia:column_linkangle_hades_trees_pale_wood +hades_doors:door_steel_violet_b +hades_stairs:slab_brick_grey +columnia:column_bottom_hades_core_azurite +columnia:column_top_hades_core_sandstone +hades_stairs:stair_colwood_yellow +hades_stairs:stair_bark +hades_stairs:stair_out_basalt_brick +columnia:column_linkvertical_hades_trees_colwood_yellow +hades_chests:chest_dark_grey +hades_furniture:armchair +columnia:column_linkcross_hades_trees_colwood_dark_grey +hades_stairs:stair_out_colwood_white +hades_stairs:stair_colwood_white +columnia:column_linkvertical_hades_trees_orange_bark +hades_stairs:stair_in_colwood_yellow +hades_stairs:step_colwood_violet +hades_stairs:stair_out_brick_pink +columnia:column_linktee_hades_trees_birch_bark +columnia:column_linkdown_hades_trees_colwood_black +columnia:column_linktee_down_hades_core_turquosite_brick +hades_stairs:step_in_colwood_red +hades_stairs:step_out_colwood_red +columnia:column_stairsub_hades_core_stone +columnia:column_linkcross_columnia_rusty_block +hades_stairs:stair_colwood_dark_green +columnia:column_linkangle_hades_core_lillite_brick +hades_beds:fancy_bed_top +hades_stairs:slab_colwood_red +hades_trees:apple +hades_windows:window_wood_white +columnia:column_linkcross_hades_core_stonebrick_baked +hades_core:stonebrick +hades_stairs:stair_out_colwood_red +columnia:column_stairsub_hades_trees_orange_bark +hades_stairs:step_out_colwood_pink +hades_stairs:step_colwood_pink +columnia:column_linkvertical_hades_core_brick_brown +hades_fences:fence_wood_white +hades_stairs:stair_colwood_pink +hades_stairs:step_charred_bark +columnia:column_link_hades_core_sandstonebrick +hades_stairs:stair_out_colwood_orange +columnia:column_linkcrossdown_hades_trees_lush_wood +hades_stairs:step_colwood_magenta +columnia:column_linkcross_hades_core_lillite +columnia:column_linktee_down_hades_core_brick_blue +columnia:column_linkdown_hades_core_brick_magenta +columnia:column_top_hades_trees_pale_bark +hades_stairs:stair_out_floor_sandstonevolcanic_sandstonevolcanic +columnia:column_stairsubpillar_hades_core_brick_dark_green +hades_core:obsidian +hades_doors:door_steel_cyan_d +hades_stairs:step_in_colwood_grey +columnia:column_linktee_down_hades_core_olivine +hades_stairs:step_out_colwood_grey +hades_glowcrystals:glowcrystal_block +hades_stairs:stair_in_colwood_grey +columnia:column_linkangle_hades_trees_jungle_bark +columnia:column_link_hades_core_azurite +hades_doors:trapdoor_steel_open +columnia:column_linkdown_hades_core_sandstone_volcanic +hades_stairs:step_colwood_green +hades_stairs:slab_colwood_green +hades_doors:trapdoor_lush +hades_stairs:stair_out_colwood_green +columnia:column_linkcrossdown_hades_core_sandstone +columnia:column_bottom_hades_core_brick_dark_grey +hades_trees:colwood_red +hades_stairs:step_out_colwood_dark_grey +hades_stairs:step_colwood_dark_grey +hades_stairs:slab_colwood_dark_grey +columnia:column_linkcrossdown_hades_trees_colwood_grey +hades_stairs:stair_in_colwood_dark_grey +hades_stairs:stair_colwood_dark_grey +hades_stairs:stair_in_blue +hades_stairs:step_colwood_dark_green +columnia:column_linkcrossdown_hades_core_basalt_brick +hades_stairs:step_in_colwood_cyan +hades_core:glass +columnia:column_crosslink_hades_core_lillite_brick +hades_fences:fence_lush_wood +hades_stairs:slab_chondrite +hades_stairs:stair_out_glowcrystal_block +hades_doors:door_basalt_b +hades_stairs:step_out_colwood_brown +hades_stairs:stair_in_colwood_brown +hades_trees:colwood_uncolored +hades_stairs:stair_out_colwood_brown +hades_stairs:stair_jungle_wood +hades_stairs:stair_colwood_brown +hades_stairs:step_colwood_blue +columnia:column_linkvertical_hades_core_essexite +hades_stairs:stair_cyan +hades_stairs:stair_colwood_blue +columnia:column_linktee_hades_core_brick_yellow +hades_windows:window_wood_red +hades_stairs:step_in_colwood_black +hades_stairs:step_colwood_black +hades_stairs:stair_out_colwood_black +hades_stairs:stair_colwood_black +hades_stairs:slab_colwood_uncolored +hades_stairs:step_lush_wood +hades_stairs:stair_out_floor_lush_lush +hades_trees:pale_bark +hades_stairs:step_in_charred_bark +hades_doors:door_steel_blue_d +hades_stairs:step_colwood_orange +hades_stairs:stair_in_charred_bark +columnia:column_crosslink_hades_core_marble +columnia:column_linktee_down_hades_core_brick_orange +columnia:column_linktee_down_hades_trees_orange_bark +hades_stairs:stair_charred_bark +columnia:column_linkcross_hades_core_sandstone +columnia:column_linkdown_hades_trees_colwood_dark_grey +hades_stairs:step_in_canvas_bark +hades_stairs:step_out_canvas_bark +hades_stairs:stair_out_colwood_magenta +columnia:column_link_hades_core_brick_grey +hades_stairs:slab_canvas_bark +hades_stairs:stair_in_canvas_bark +hades_stairs:stair_out_canvas_bark +hades_stairs:stair_canvas_bark +hades_stairs:step_in_orange_bark +hades_stairs:step_out_orange_bark +hades_stairs:step_orange_bark +hades_stairs:slab_orange_bark +hades_stairs:stair_in_orange_bark +hades_stairs:stair_out_orange_bark +hades_stairs:stair_orange_bark +hades_stairs:step_in_birch_bark +hades_stairs:step_out_birch_bark +hades_stairs:step_birch_bark +columnia:column_stairsub_columnia_rusty_block +hades_stairs:stair_in_birch_bark +hades_stairs:stair_out_birch_bark +columnia:column_linktee_hades_core_basalt +hades_stairs:step_pale_bark +hades_stairs:stair_out_pale_bark +hades_stairs:step_out_jungle_bark +hades_stairs:step_jungle_bark +hades_stairs:slab_blue +hades_doors:door_sandstone_volcanic_b +columnia:column_linkcross_hades_core_essexite +hades_stairs:stair_jungle_bark +columnia:column_linktee_hades_core_turquosite_brick +columnia:column_crosslink_hades_core_sandstone +hades_stairs:step_out_bark +columnia:column_linkangle_hades_core_brick_red +hades_trees:birch_leaves +columnia:column_linktee_hades_trees_colwood_dark_green +hades_stairs:step_bark +hades_stairs:stair_in_bark +hades_stairs:step_in_colwood_yellow +hades_stairs:step_in_stone +hades_stairs:step_charred_wood +columnia:column_linkcross_hades_core_stone_baked +hades_stairs:stair_black +hades_stairs:stair_charred_wood +hades_stairs:step_in_cream_wood +hades_trees:colwood_brown +hades_stairs:step_out_cream_wood +columnia:column_top_hades_core_apolline_brick +hades_fences:fence_wood_orange +columnia:column_linktee_hades_core_obsidian +hades_windows:window_lush_wood +hades_stairs:stair_in_cream_wood +hades_stairs:stair_out_cream_wood +columnia:column_linkangle_columnia_rusty_block +hades_stairs:stair_olivine +hades_itemshow:showcase +hades_stairs:stair_in_colwood_uncolored +columnia:column_link_hades_core_orangite +hades_stairs:step_out_stonebrick_baked +hades_stairs:stair_in_lush_wood +hades_stairs:stair_out_lush_wood +hades_stairs:stair_lush_wood +hades_stairs:step_jungle_wood +columnia:column_linkdown_hades_trees_jungle_bark +hades_stairs:step_out_pale_wood +hades_stairs:slab_tinblock +columnia:column_stairsubpillar_hades_core_brick_brown +hades_stairs:stair_in_pale_wood +columnia:column_linkdown_hades_core_olivine +columnia:column_linkangle_hades_core_stonebrick_baked +hades_stairs:stair_out_pale_wood +hades_core:stone_block +hades_stairs:step_out_wood +hades_stairs:step_wood +hades_core:orangite_block +hades_stairs:slab_wood +columnia:column_linkangle_hades_core_tuff_baked +hades_trees:orange_bark +hades_stairs:stair_in_wood +columnia:column_linkcross_hades_core_cinnabar_brick +hades_farming:spice_3 +hades_core:ladder_lush_wood +hades_farming:strawberry_2 +hades_windows:window_wood_black +hades_farming:strawberry_1 +hades_farming:seed_strawberry +hades_doors:door_steel_green_d +hades_farming:potato_3 +columnia:column_linkangle_down_hades_core_essexite_brick +hades_farming:potato_2 +hades_farming:potato_1 +hades_vines:jungle +hades_doors:door_steel_b +hades_farming:seed_potato +hades_stairs:slab_brick_magenta +hades_flowerpots:flower_pot_branch_bush +hades_stairs:slab_lillite +columnia:column_linktee_hades_core_sandstone_volcanic_brick +columnia:column_linkangle_down_hades_trees_colwood_grey +hades_farming:cotton_1 +hades_farming:seed_cotton +columnia:column_linkcross_hades_trees_colwood_blue +hades_farming:wheat_1 +hades_stairs:stair_colwood_cyan +hades_farming:soil_wet +hades_stairs:stair_out_pink +hades_doors:door_steel_grey_c +hades_doors:door_steel_cyan_e +hades_grass:junglegrass +hades_grass:seed_grass +hades_stairs:slab_cobble_sandstone +hades_grass:grass_4 +hades_grass:grass_2 +hades_grass:grass_1 +hades_bones:bones +hades_beds:bed_top +hades_doors:door_sandstone_b +columnia:column_stairsub_hades_core_azurite +hades_cloth:dark_grey +columnia:column_linkcrossdown_hades_core_tuff_baked +hades_stairs:slab_brick_white +hades_cloth:orange +hades_cloth:magenta +hades_doors:door_steel_red_d +hades_cloth:blue +columnia:column_linkvertical_hades_core_brick_yellow +hades_stairs:step_out_brick_blue +columnia:column_stairsubpillar_hades_trees_colwood_black +columnia:column_mid_hades_trees_pale_bark +hades_doors:door_steel_yellow_b +columnia:column_top_hades_core_olivine +hades_cloth:red +hades_cloth:grey +hades_cloth:white +columnia:column_linktee_down_columnia_rusty_block +hades_trees:jungle_bark +columnia:column_linkcrossdown_columnia_rusty_block +columnia:column_linkdown_columnia_rusty_block +columnia:column_stairsub_hades_core_tuff_baked_brick +columnia:column_linkvertical_hades_core_obsidianbrick +hades_doors:door_wood_cream_b +columnia:column_mid_columnia_rusty_block +columnia:column_stairsubpillar_hades_core_lillite_brick +hades_stairs:step_out_stone_baked +columnia:column_linktee_down_hades_core_lillite_brick +columnia:column_linktee_hades_core_lillite_brick +columnia:column_linkangle_down_hades_core_lillite_brick +columnia:column_link_hades_core_essexite +hades_stairs:step_colwood_red +columnia:column_linkvertical_hades_core_lillite_brick +columnia:column_linkcrossdown_hades_core_lillite_brick +hades_doors:door_steel_black_d +columnia:column_crosslink_hades_core_brick_violet +hades_core:brick_white +columnia:column_stairsub_hades_core_cobble_sandstone_volcanic +columnia:column_linkcross_hades_core_lillite_brick +columnia:lamp_ceiling +columnia:column_linkdown_hades_core_lillite_brick +columnia:column_link_hades_core_lillite_brick +columnia:column_linktee_down_hades_core_brick_magenta +hades_stairs:slab_colwood_cyan +columnia:column_bottom_hades_core_lillite_brick +hades_doors:door_wood_cream_c +columnia:column_top_hades_core_lillite_brick +hades_stairs:slab_black +hades_fences:fence_wood_blue +columnia:column_linktee_hades_core_stonebrick_baked +columnia:column_linkcrossdown_hades_trees_pale_bark +columnia:column_stairsub_hades_core_lillite +columnia:column_linktee_down_hades_core_lillite +hades_stairs:stair_cobble_sandstone_volcanic +hades_doors:trapdoor_cream +columnia:column_linkdown_hades_core_brick +hades_fences:fence_pale_wood +columnia:column_linkvertical_hades_core_lillite +columnia:column_mid_hades_core_tuff_brick +columnia:column_linkcrossdown_hades_core_lillite +hades_stairs:slab_colwood_magenta +columnia:column_crosslink_hades_core_turquosite +columnia:column_link_hades_core_lillite +hades_core:tuff_brick +hades_stairs:stair_in_sandstone +hades_stairs:step_in_sandstonebrick +columnia:column_linkcrossdown_hades_core_chondrite_brick +columnia:column_linkdown_hades_core_brick_brown +hades_chests:chest_orange +hades_core:stone_with_gold +columnia:column_stairsubpillar_hades_core_azurite_brick +columnia:column_stairsub_hades_core_azurite_brick +columnia:column_linktee_down_hades_core_azurite_brick +hades_stairs:step_in_sandstone_volcanic_brick +hades_refruit:flower_cocoa +columnia:column_top_hades_core_tuff +columnia:column_linkcrossdown_hades_core_brick_green +columnia:column_linkangle_down_hades_core_azurite_brick +columnia:column_top_hades_core_brick_brown +columnia:column_link_hades_core_stone +columnia:column_linkangle_hades_core_azurite_brick +hades_stairs:stair_out_chondrite_brick +columnia:column_linkangle_hades_core_brick_black +columnia:column_linkcrossdown_hades_core_azurite_brick +columnia:column_linkvertical_hades_core_chondrite +columnia:column_linkcross_hades_core_azurite_brick +columnia:column_linkdown_hades_core_azurite_brick +columnia:column_linkcross_hades_trees_colwood_orange +columnia:column_linkangle_hades_core_brick_orange +columnia:column_link_hades_core_azurite_brick +columnia:column_crosslink_hades_core_azurite_brick +columnia:column_bottom_hades_core_azurite_brick +columnia:column_top_hades_core_azurite_brick +columnia:column_mid_hades_core_azurite_brick +hades_beds:fancy_bed_bottom +columnia:column_linktee_down_hades_core_azurite +columnia:column_bottom_hades_trees_colwood_violet +columnia:column_linktee_hades_core_azurite +hades_core:brick_pink +hades_doors:trapdoor_jungle +columnia:column_stairsubpillar_hades_core_brick_cyan +hades_doors:door_glass_c +gluncarp:grey +columnia:column_linkangle_down_hades_trees_colwood_green +columnia:column_linkdown_hades_core_chondrite +columnia:column_linkvertical_hades_core_azurite +columnia:column_link_hades_core_brick_red +columnia:column_linkcrossdown_hades_core_azurite +columnia:column_linkdown_hades_core_azurite +columnia:column_link_hades_trees_birch_bark +columnia:column_linkdown_hades_trees_pale_bark +hades_core:dirt_with_grass +columnia:column_mid_hades_core_marble +hades_stairs:stair_in_orange +hades_doors:door_stone_baked_e +hades_stairs:stair_brick_grey +columnia:column_stairsub_hades_core_turquosite_brick +hades_trash:trash_can_plastic +hades_stairs:stair_out_colwood_violet +columnia:column_stairsub_hades_core_brick_green +columnia:column_stairsubpillar_hades_core_turquosite +hades_stairs:step_in_bark +columnia:column_linkangle_down_hades_core_turquosite_brick +columnia:column_linkangle_hades_core_turquosite_brick +columnia:column_linkvertical_hades_core_turquosite_brick +columnia:column_linkcrossdown_hades_core_turquosite_brick +columnia:column_linkcross_hades_core_turquosite_brick +columnia:column_linkdown_hades_core_turquosite_brick +columnia:column_link_hades_core_turquosite_brick +columnia:column_crosslink_hades_core_turquosite_brick +columnia:column_linktee_hades_trees_colwood_cyan +columnia:column_bottom_hades_core_turquosite_brick +columnia:column_top_hades_core_turquosite_brick +columnia:column_mid_hades_core_turquosite_brick +columnia:column_top_hades_core_tuff_baked +hades_stairs:stair_basalt_brick +columnia:column_linktee_down_hades_core_turquosite +columnia:column_link_hades_core_cinnabar +columnia:column_crosslink_hades_core_brick_magenta +hades_stairs:slab_dark_green +columnia:column_linkangle_down_hades_core_turquosite +columnia:column_linkangle_hades_core_turquosite +columnia:column_linkcrossdown_hades_core_turquosite +columnia:column_linkcross_hades_core_turquosite +columnia:column_linkdown_hades_core_turquosite +columnia:column_link_hades_core_turquosite +columnia:column_linkdown_hades_core_lillite +hades_vines:cave_rotten +columnia:column_linktee_hades_core_brick_green +columnia:column_top_hades_core_turquosite +columnia:column_mid_hades_core_turquosite +columnia:column_stairsubpillar_hades_core_cinnabar_brick +columnia:column_stairsub_hades_trees_jungle_wood +hades_stairs:slab_double_goldblock +hades_waterplants:seaweed_2 +columnia:column_linktee_down_hades_core_cinnabar_brick +columnia:column_linktee_hades_core_cinnabar_brick +columnia:column_linkangle_down_hades_core_cinnabar_brick +columnia:column_linkangle_hades_core_cinnabar_brick +hades_doors:door_steel_orange_c +columnia:column_linkvertical_hades_core_cinnabar_brick +columnia:column_linkvertical_hades_core_brick_orange +hades_stairs:stair_steelblock +hades_stairs:stair_wood +columnia:column_mid_hades_core_cobble_baked +columnia:column_linkdown_hades_core_cinnabar_brick +columnia:column_link_hades_core_cinnabar_brick +columnia:column_crosslink_hades_core_cinnabar_brick +columnia:column_bottom_hades_core_cinnabar_brick +columnia:column_top_hades_core_cinnabar_brick +hades_doors:door_steel_magenta_c +columnia:column_mid_hades_core_cinnabar_brick +columnia:column_stairsubpillar_hades_core_cinnabar +columnia:column_linktee_down_hades_core_cinnabar +columnia:column_stairsub_hades_core_stonebrick +columnia:column_linkangle_hades_core_cinnabar +hades_stairs:stair_in_colwood_cyan +hades_doors:door_basalt_e +columnia:column_crosslink_hades_core_cinnabar +columnia:column_stairsub_hades_core_essexite_brick +hades_tiles:floor_jungle_lush +columnia:bracket +columnia:column_stairsubpillar_hades_core_orangite_brick +columnia:column_stairsub_hades_core_orangite_brick +columnia:column_linktee_down_hades_core_orangite_brick +columnia:column_linktee_hades_core_orangite_brick +columnia:column_linkangle_down_hades_core_orangite_brick +columnia:column_linkangle_hades_core_orangite_brick +hades_stairs:stair_cobble_baked +columnia:column_linkcrossdown_hades_core_orangite_brick +columnia:column_linkcross_hades_core_orangite_brick +columnia:column_linkdown_hades_core_orangite_brick +columnia:column_link_hades_core_orangite_brick +hades_core:cobble +columnia:column_crosslink_hades_core_orangite_brick +columnia:column_bottom_hades_core_orangite_brick +columnia:column_top_hades_core_orangite_brick +columnia:column_mid_hades_core_orangite_brick +columnia:column_stairsubpillar_hades_core_orangite +columnia:column_linktee_down_hades_core_orangite +columnia:column_linktee_hades_core_orangite +columnia:column_linkangle_hades_core_orangite +columnia:column_linktee_down_hades_core_cobble +columnia:column_linkcrossdown_hades_core_orangite +columnia:column_linkdown_hades_core_apolline_brick +columnia:column_crosslink_hades_trees_birch_bark +columnia:column_stairsubpillar_hades_core_apolline_brick +columnia:column_stairsub_hades_core_apolline_brick +columnia:column_linktee_down_hades_core_apolline_brick +columnia:column_linktee_hades_core_apolline_brick +hades_doors:trapdoor_steel_bar_open +columnia:column_linkangle_down_hades_core_apolline_brick +columnia:column_linkangle_hades_core_apolline_brick +columnia:column_linkvertical_hades_core_apolline_brick +hades_bushes:white +columnia:column_linkcrossdown_hades_core_apolline_brick +columnia:column_linkcross_hades_core_apolline_brick +columnia:column_mid_hades_core_orangite +columnia:column_link_hades_core_apolline_brick +columnia:column_crosslink_hades_core_apolline_brick +columnia:column_bottom_hades_core_apolline_brick +hades_stairs:step_cream_wood +columnia:column_linkangle_down_hades_core_olivine +columnia:column_mid_hades_core_apolline_brick +columnia:column_crosslink_hades_trees_colwood_blue +columnia:column_linktee_down_hades_core_apolline +columnia:column_linktee_hades_core_apolline +columnia:column_linktee_down_hades_core_basalt +columnia:column_linkvertical_hades_trees_lush_wood +hades_core:cobble_block_baked +columnia:column_linkvertical_hades_trees_cream_wood +hades_core:ash +hades_trees:banana +hades_stairs:stair_out_cinnabar +columnia:column_linkcrossdown_hades_core_apolline +columnia:column_link_hades_core_apolline +columnia:column_top_hades_core_apolline +columnia:column_mid_hades_core_apolline +columnia:column_stairsubpillar_hades_core_olivine_brick +columnia:column_stairsub_hades_core_olivine_brick +hades_core:glowing_cactus_block +hades_stairs:stair_in_chondrite_brick +columnia:column_mid_hades_core_olivine_brick +columnia:column_crosslink_hades_core_olivine +hades_core:lillite +hades_stairs:slab_colwood_white +columnia:column_stairsub_hades_trees_colwood_cyan +hades_doors:door_steel_violet_a +columnia:column_linkangle_hades_core_sandstonebrick +hades_stairs:slab_olivine +columnia:column_stairsub_hades_trees_colwood_magenta +columnia:column_mid_hades_core_brick_white +hades_flowerpots:flower_pot_white +columnia:column_link_hades_core_tuff_baked +hades_tiles:floor_chondrite_tuffbaked +columnia:column_linkcrossdown_hades_trees_colwood_yellow +gluncarp:black +hades_stairs:step_brick_cyan +hades_lamps:lantern +hades_fences:fence_wood_red +hades_doors:door_steel_red_e +hades_tiles:floor_pale_cream +columnia:column_crosslink_hades_trees_cream_wood +hades_doors:door_stone_baked_a +hades_doors:trapdoor_steel_bar +hades_core:azurite_brick +hades_core:apolline_block +columnia:column_linkcross_hades_trees_jungle_bark +columnia:column_linktee_hades_core_brick_grey +hades_doors:door_steel_yellow_c +hades_doors:trapdoor_pale_open +columnia:column_linkcross_hades_core_stonebrick +hades_walls:sandstone_volcanic +columnia:column_linkdown_hades_core_essexite +hades_stairs:step_in_colwood_green +hades_core:tuff_baked_brick +columnia:column_bottom_hades_core_olivine_brick +hades_doors:door_dungeon2_b +hades_doors:door_marble_b +hades_stairs:stair_in_brick_red +columnia:column_linkangle_hades_core_obsidianbrick +columnia:column_stairsubpillar_hades_core_marble_brick +columnia:column_stairsubpillar_hades_core_basalt_brick +hades_flowerpots:flower_pot_olive_leaves +columnia:column_linkcrossdown_hades_core_brick_grey +hades_core:ladder_cream_wood +hades_doors:door_steel_pink_d +columnia:column_stairsubpillar_hades_trees_bark +columnia:column_link_hades_core_brick_cyan +columnia:column_linktee_down_hades_core_marble_brick +columnia:column_linktee_hades_core_marble_brick +hades_doors:door_steel_black_e +hades_core:basalt +columnia:column_bottom_hades_trees_colwood_yellow +hades_stairs:step_out_brick_magenta +hades_doors:trapdoor_rusty_bar_open +columnia:column_stairsub_hades_core_marble +columnia:column_mid_hades_core_brick_red +hades_grass:dead_grass_2 +hades_tiles:floor_wood_lush +hades_doors:door_rusty_bar_e +hades_doors:door_rusty_bar_d +hades_doors:door_rusty_bar_a +hades_doors:door_steel_brown_d +hades_stairs:stair_out_lillite +columnia:column_linkangle_hades_core_basalt_brick +hades_waterplants:waterlily_45 +hades_core:cinnabar_block +columnia:column_stairsubpillar_hades_core_azurite +columnia:column_stairsub_hades_trees_colwood_red +hades_stairs:stair_out_brick_blue +hades_doors:door_essexite_b +columnia:column_mid_hades_core_chondrite_brick +hades_stairs:stair_basalt +hades_stairs:step_out_floor_sandstonevolcanic_sandstonevolcanic +columnia:column_linkangle_hades_trees_colwood_dark_green +hades_stairs:stair_yellow +hades_doors:door_steel_darkgrey_b +hades_tiles:floor_tuffbaked_sandstone +columnia:column_linkcrossdown_hades_trees_colwood_magenta +hades_doors:door_steel_blue_e +columnia:column_linkcross_hades_core_cobble_sandstone_volcanic +hades_flowerpots:flower_pot_burned_branches +hades_core:obsidian_block +hades_stairs:step_out_charred_bark +hades_doors:door_steel_blue_c +hades_doors:door_steel_blue_b +columnia:column_linkcrossdown_hades_core_brick_dark_green +columnia:column_stairsub_hades_trees_bark +hades_doors:gate_jungle_wood_open +hades_windows:window_wood_brown +hades_tiles:floor_jungle_pale +hades_torches:torch_ceiling +hades_doors:door_steel_grey_e +hades_doors:door_steel_green_e +columnia:column_stairsub_hades_core_cobble_baked +hades_trees:birch_bark +columnia:column_bottom_hades_core_essexite_brick +hades_doors:door_rusty_bar_c +columnia:column_linkcross_hades_core_olivine_brick +hades_stairs:stair_in_floor_wood_wood +columnia:column_linkcrossdown_hades_core_stonebrick +hades_doors:door_wood_lush_d +hades_doors:door_wood_cream_d +columnia:column_crosslink_hades_core_brick_blue +hades_doors:door_wood_lush_c +hades_tiles:floor_lush_cream +columnia:column_crosslink_hades_core_tuff_baked_brick +hades_doors:door_wood_cream_a +hades_chests:chest_white_locked +columnia:column_linkangle_down_hades_core_cinnabar +columnia:column_mid_hades_trees_colwood_cyan +hades_windows:window_wood_pink +hades_core:turquosite +hades_doors:door_wood_d +hades_doors:door_stone_baked_d +columnia:column_stairsubpillar_hades_core_brick_red +columnia:column_linkdown_hades_core_brick_black +hades_core:ladder +columnia:column_linkdown_hades_core_brick_dark_green +hades_windows:window_wood_orange +hades_stairs:step_out_azurite +columnia:column_mid_hades_core_brick_dark_green +columnia:column_linkcross_hades_core_cinnabar +columnia:column_linkvertical_hades_core_brick_dark_green +hades_flowerpots:flower_pot_banana_leaves +hades_flowerpots:flower_pot_orange_leaves +hades_core:ash_block +hades_flowerpots:flower_pot_birch_sapling +hades_tiles:floor_pale_pale +columnia:column_linktee_down_hades_trees_pale_bark +columnia:column_linkvertical_hades_core_chondrite_brick +columnia:column_link_hades_trees_colwood_magenta +hades_windows:window_pale_wood +columnia:column_linkcross_hades_trees_colwood_yellow +columnia:column_link_hades_core_brick_blue +columnia:column_linkangle_down_hades_trees_pale_wood +hades_core:tuff_baked_block +hades_trees:olive_leaves +columnia:column_mid_hades_core_brick_grey +columnia:column_linkcross_hades_trees_bark +columnia:column_bottom_hades_core_basalt +hades_doors:gate_lush_wood_closed +columnia:column_mid_hades_core_cobble +hades_flowerpots:flower_pot_cultivated_jungle_sapling +hades_stairs:stair_floor_tuff_tuff +hades_doors:door_sandstone_a +hades_stairs:stair_chondrite +hades_stairs:slab_sandstone +hades_stairs:stair_out_floor_jungle_jungle +columnia:column_linktee_down_hades_trees_lush_wood +hades_tiles:floor_jungle_jungle +hades_chests:chest_red +columnia:column_linkangle_hades_core_brick +columnia:column_mid_hades_trees_orange_bark +hades_core:obsidianbrick +columnia:column_linkcross_hades_trees_colwood_black +hades_fences:fence_wood_dark_grey +hades_doors:door_steel_violet_c +columnia:column_linktee_down_hades_trees_canvas_bark +columnia:column_link_hades_core_essexite_brick +hades_core:stone_with_copper +hades_furniture:table_lamp_off +hades_doors:door_dungeon1_a +columnia:rusty_block +columnia:column_mid_hades_trees_colwood_grey +hades_doors:gate_lush_wood_open +columnia:column_linkangle_down_hades_core_chondrite +columnia:column_mid_hades_trees_canvas_bark +hades_core:essexite_brick +columnia:column_linktee_hades_core_brick_cyan +hades_stairs:step_out_colwood_dark_green +columnia:column_linkdown_hades_trees_orange_bark +columnia:column_linktee_hades_core_cobble +columnia:column_stairsub_hades_trees_colwood_brown +columnia:column_stairsub_hades_core_sandstone +columnia:column_linkvertical_hades_core_brick_green +columnia:column_bottom_hades_core_brick_blue +gluncarp:dark_green +hades_stairs:stair_out_sandstone_volcanic +columnia:column_top_hades_core_sandstone_volcanic +hades_core:marble +hades_stairs:step_brick_green +hades_flowerpots:flower_pot_leaves +hades_core:mossycobble +columnia:column_linkdown_hades_core_sandstonebrick +columnia:column_bottom_hades_trees_colwood_red +columnia:column_linkvertical_hades_core_cobble_sandstone_volcanic +hades_torches:torch_low +hades_waterplants:seaweed_3 +columnia:column_top_hades_core_stonebrick +columnia:column_mid_hades_core_brick +columnia:column_linkangle_down_hades_trees_cream_wood +hades_chests:chest_violet +columnia:column_stairsub_hades_core_brick_brown +columnia:column_mid_hades_core_chondrite +hades_core:floor_bstone_sandstone +hades_furniture:bars +hades_refruit:bud_cocoa +columnia:column_linktee_hades_trees_jungle_bark +hades_stairs:stair_in_stone_baked +hades_doors:trapdoor_open +hades_core:sugarcane +columnia:column_bottom_hades_trees_pale_wood +hades_doors:door_glass_a +hades_tiles:floor_stonebaked_tuff +columnia:column_linkcross_hades_core_basalt +hades_tiles:floor_wood_wood +columnia:column_link_hades_core_basalt_brick +hades_stairs:step_out_copperblock +hades_windows:window_wood_uncolored +hades_stairs:step_out_colwood_violet +hades_flowerpots:flower_pot_jungle_sapling +columnia:column_linkangle_down_hades_trees_bark +columnia:column_link_hades_core_cobble_sandstone_volcanic +hades_core:dirt_with_grass_l2 +columnia:column_linkangle_hades_core_cobble_sandstone +columnia:column_crosslink_hades_trees_colwood_dark_grey +hades_core:ladder_pale_wood +columnia:column_linkdown_hades_trees_colwood_orange +hades_bushes:branch_bush +columnia:column_bottom_hades_core_essexite +hades_windows:window_wood_magenta +columnia:column_link_hades_core_obsidianbrick +columnia:column_linkcrossdown_hades_trees_canvas_bark +columnia:column_stairsubpillar_hades_trees_colwood_grey +hades_flowerpots:flower_pot_pale_leaves +hades_walls:sandstone +hades_stairs:step_in_floor_essexitegold_essexitegold +hades_fences:fence_wood_uncolored +columnia:column_crosslink_hades_core_brick_dark_green +hades_tiles:floor_essexite_essexitegold +columnia:column_mid_hades_trees_wood +hades_tiles:floor_basalt_marble +columnia:column_top_hades_core_sandstonebrick +hades_core:stone_baked +columnia:column_linkdown_hades_core_stonebrick +hades_tiles:floor_marble_essexite +hades_trees:cultivated_jungle_sapling +hades_tiles:floor_pale_wood +hades_trees:banana_sapling +hades_flowerpots:flower_pot_birch_leaves +hades_stairs:slab_obsidianbrick +columnia:column_stairsub_hades_trees_pale_bark +hades_tiles:floor_lush_jungle +columnia:column_top_hades_trees_lush_wood +columnia:column_linkcross_hades_core_cobble_sandstone +columnia:column_linkcrossdown_hades_core_cobble_sandstone +columnia:column_top_hades_trees_canvas_bark +columnia:column_linkdown_hades_trees_colwood_grey +columnia:column_linkvertical_hades_trees_colwood_orange +columnia:column_stairsubpillar_hades_trees_colwood_blue +hades_core:coalblock +columnia:column_stairsub_hades_core_sandstone_volcanic_brick +columnia:column_linkvertical_hades_trees_colwood_blue +columnia:column_linkangle_hades_core_azurite +columnia:column_linkangle_hades_core_lillite +hades_chests:chest_magenta_locked +columnia:column_stairsub_hades_core_tuff +hades_fences:fence_wood_grey +hades_stairs:slab_sandstone_volcanic +columnia:column_linkangle_down_hades_core_stonebrick_baked +columnia:column_stairsubpillar_hades_trees_colwood_green +columnia:column_stairsubpillar_hades_trees_orange_bark +columnia:column_mid_hades_core_brick_black +hades_tiles:floor_wood_jungle +columnia:column_mid_hades_core_sandstonebrick +hades_furniture:chair_white +columnia:column_linkcross_hades_trees_colwood_dark_green +columnia:column_linkvertical_hades_trees_pale_wood +hades_chests:chest_grey_locked +hades_trees:cocoa_sapling +hades_trees:colwood_violet +columnia:column_bottom_hades_core_brick_dark_green +hades_furniture:plant_pot +hades_stairs:step_in_brick_green +hades_tiles:floor_essexite_marble +hades_flowers:red +hades_walls:cobble_sandstone_volcanic +hades_furniture:table_lamp_low +gluncarp:violet +hades_tiles:floor_wood_pale +hades_flowerpots:flower_pot_cactus +columnia:column_stairsub_hades_core_chondrite +columnia:column_crosslink_hades_trees_colwood_violet +columnia:column_stairsubpillar_hades_trees_jungle_wood +hades_doors:trapdoor_steel +columnia:column_linktee_down_hades_trees_colwood_cyan +columnia:column_linkcrossdown_hades_trees_colwood_cyan +columnia:column_crosslink_hades_trees_colwood_dark_green +hades_stairs:step_in_wood +hades_torches:torch_low_wall +columnia:column_linkangle_down_hades_trees_colwood_cyan +hades_stairs:step_in_lillite +columnia:column_linkcross_hades_trees_pale_bark +hades_stairs:stair_out_apolline +hades_tiles:floor_lush_lush +columnia:column_stairsub_hades_core_brick_blue +hades_chests:chest_cyan_locked +hades_doors:door_steel_brown_e +columnia:column_mid_hades_core_brick_green +hades_chests:chest_yellow_locked +hades_trees:bark +columnia:column_stairsubpillar_hades_core_brick_magenta +hades_grass:grass_5 +columnia:column_stairsubpillar_hades_trees_colwood_magenta +columnia:column_crosslink_hades_core_azurite +hades_tiles:floor_sandstone_tuff +hades_doors:door_essexite_e +hades_flowerpots:flower_pot_orange_sapling +columnia:column_link_hades_trees_colwood_uncolored +hades_core:cinnabar_brick +hades_grass:dead_grass_1 +hades_flowerpots:flower_pot_banana_sapling +columnia:column_bottom_hades_core_obsidianbrick +hades_refruit:bud_banana +hades_trees:orange +columnia:column_linktee_hades_trees_colwood_pink +hades_tiles:floor_basalt_basalt +gluncarp:orange +columnia:column_stairsubpillar_hades_core_obsidianbrick +columnia:column_crosslink_hades_core_tuff +columnia:column_linkcross_hades_core_brick_yellow +columnia:column_mid_hades_core_obsidian +columnia:column_mid_hades_trees_cream_wood +hades_glowcrystals:glowglass +hades_core:gravel_volcanic +columnia:column_top_hades_core_brick +hades_stairs:step_in_steelblock +hades_stairs:stair_colwood_magenta +columnia:column_linkcross_hades_trees_colwood_uncolored +hades_stairs:step_out_brick_brown +hades_fences:fence_wood_dark_green +hades_doors:door_steel_orange_e +columnia:column_mid_hades_trees_lush_wood +hades_tiles:floor_sandstone_sandstone +hades_glowcrystals:glowcrystal_torch +columnia:column_bottom_hades_trees_cream_wood +hades_stairs:stair_in_colwood_green +columnia:column_linktee_hades_trees_pale_wood +hades_stairs:slab_stonebrick +columnia:column_mid_hades_core_brick_yellow +hades_core:dirt +columnia:column_stairsubpillar_hades_trees_wood +hades_doors:door_steel_e +columnia:column_linkcrossdown_hades_core_mossycobble +columnia:column_linktee_down_hades_core_stonebrick_baked +hades_trees:tree +columnia:column_linkdown_hades_core_stone_baked +hades_doors:door_steel_magenta_e +hades_trees:lush_wood +columnia:column_linkangle_down_hades_core_sandstone_volcanic +columnia:column_linktee_hades_trees_wood +hades_doors:door_wood_jungle_d +hades_furniture:table_black +columnia:column_mid_hades_trees_colwood_dark_green +hades_fences:fence_wood_brown +hades_furnaces:prism_furnace_active +columnia:column_link_hades_core_stonebrick +hades_trees:olive_sapling +columnia:column_mid_hades_trees_colwood_yellow +hades_furniture:armchair_brown +hades_stairs:step_in_cyan +hades_stairs:slab_floor_stone_stone +ignore +hades_stairs:slab_brick_red +hades_core:sandstone +hades_doors:trapdoor_cream_open +hades_core:olivine_brick +hades_doors:door_steel_bar_b +hades_furniture:table_uncolored +columnia:column_link_hades_core_mossycobble +hades_stairs:stair_out_colwood_dark_green +hades_chests:chest_black_locked +columnia:column_linkangle_hades_trees_colwood_orange +signs_lib:sign_wall_white_black +hades_chests:chest_blue_locked +hades_stairs:step_out_brick_red +columnia:column_bottom_hades_core_stonebrick_baked +hades_doors:door_steel_bar_a +hades_waterplants:waterlily_s1 +hades_core:brick_cyan +columnia:column_linkvertical_hades_core_olivine_brick +hades_stairs:stair_stonebrick_baked +hades_doors:door_steel_bar_e +hades_doors:gate_cream_wood_open +columnia:column_link_hades_core_stone_baked +columnia:column_linkcross_hades_core_marble_brick +hades_stairs:stair_red +hades_stairs:step_in_brick_white +columnia:column_linkcross_hades_trees_birch_bark +hades_doors:door_steel_pink_e +columnia:column_top_hades_trees_colwood_black +hades_stairs:stair_out_jungle_wood +columnia:column_link_hades_core_basalt +columnia:column_mid_hades_core_stone_baked +hades_stairs:stair_out_colwood_grey +columnia:column_linktee_down_hades_core_cobble_baked +columnia:column_bottom_hades_core_brick_white +columnia:column_linkangle_down_hades_core_cobble_baked +hades_tiles:floor_tuffbaked_stonebaked +columnia:column_stairsub_hades_core_cobble_sandstone +hades_stairs:step_in_sandstone +hades_trees:birch_sapling +hades_stairs:stair_out_jungle_bark +columnia:column_linkcross_hades_core_cobble_baked +columnia:column_link_hades_core_cobble_baked +columnia:column_linkangle_hades_core_sandstone_volcanic_brick +columnia:column_linkangle_down_hades_core_sandstone +columnia:column_stairsubpillar_hades_core_chondrite_brick +hades_tiles:floor_tuff_sandstone +columnia:column_linkvertical_hades_trees_jungle_bark +columnia:column_linkvertical_hades_core_sandstone_volcanic_brick +columnia:column_linkcross_hades_core_brick_cyan +columnia:column_linkcrossdown_hades_core_essexite_brick +columnia:column_stairsub_hades_core_brick_dark_grey +hades_refruit:flower_coconut +columnia:column_linkcross_hades_core_sandstone_volcanic_brick +columnia:column_top_hades_core_sandstone_volcanic_brick +columnia:column_crosslink_hades_core_sandstone_volcanic +hades_stairs:stair_floor_essexite_essexite +columnia:column_bottom_hades_trees_jungle_bark +columnia:column_linkvertical_hades_trees_colwood_brown +columnia:column_linktee_hades_core_brick_brown +hades_stairs:stair_brick_brown +columnia:column_linkangle_hades_core_cobble_sandstone_volcanic +columnia:column_linkcrossdown_hades_core_sandstonebrick +hades_trees:colwood_dark_grey +columnia:column_linktee_hades_core_marble +hades_chests:chest_dark_green_locked +columnia:column_linkvertical_hades_core_sandstone_volcanic +columnia:column_linkdown_hades_core_sandstone_volcanic_brick +hades_tiles:floor_cream_lush +hades_stairs:step_out_orange +columnia:column_linktee_down_hades_trees_colwood_violet +columnia:column_linkvertical_hades_trees_canvas_bark +columnia:column_mid_hades_core_olivine +columnia:column_crosslink_hades_core_cactus_brick +columnia:column_linkangle_down_hades_core_tuff_baked +columnia:column_linkangle_hades_core_cobble +columnia:column_linkangle_down_hades_core_cobble +columnia:column_mid_hades_core_brick_violet +gluncarp:magenta +columnia:column_mid_hades_trees_colwood_black +columnia:column_stairsub_hades_core_cobble +columnia:column_linkangle_down_hades_core_brick_dark_green +hades_doors:door_wood_pale_d +columnia:column_linkcrossdown_hades_core_cobble_baked +columnia:column_top_hades_core_cobble_baked +columnia:column_linkangle_hades_core_cobble_baked +hades_doors:door_steel_magenta_a +columnia:column_linkangle_down_hades_trees_birch_bark +columnia:column_link_hades_core_tuff_brick +hades_chests:chest_locked +columnia:column_linkangle_down_hades_core_brick_pink +columnia:column_linkangle_hades_trees_orange_bark +columnia:column_linkcrossdown_hades_core_stone +columnia:column_stairsubpillar_hades_core_stone +hades_doors:door_rusty_bar_b +columnia:column_mid_hades_core_cactus_brick +hades_stairs:stair_colwood_grey +columnia:column_top_hades_core_cactus_brick +hades_stairs:stair_in_colwood_violet +columnia:column_link_hades_core_cobble +columnia:column_linkcrossdown_hades_core_cactus_brick +columnia:column_linkangle_hades_core_cactus_brick +columnia:column_linkangle_hades_core_apolline +columnia:column_mid_hades_core_stone +columnia:column_top_hades_core_stone_baked +columnia:column_bottom_hades_core_brick_green +hades_tiles:floor_chondrite_stone +columnia:column_bottom_hades_trees_birch_bark +columnia:column_linkangle_hades_core_stone_baked +columnia:column_linkangle_down_hades_core_stone_baked +hades_doors:door_steel_darkgreen_a +columnia:column_stairsubpillar_hades_core_stone_baked +columnia:column_top_hades_core_stonebrick_baked +hades_stairs:step_essexite +columnia:column_linkvertical_hades_core_stonebrick_baked +hades_lamps:lamp_wall +hades_waterplants:waterlily_s2 +columnia:column_stairsub_hades_core_stonebrick_baked +columnia:column_bottom_hades_core_mossycobble +hades_chests:chest_pink +hades_stairs:stair_magenta +columnia:column_link_hades_trees_bark +hades_stairs:stair_out_floor_stone_stone +hades_trees:jungle_wood +columnia:column_bottom_hades_core_obsidian +columnia:column_bottom_hades_core_brick +hades_stairs:stair_in_jungle_bark +columnia:column_stairsub_hades_core_obsidian +columnia:column_crosslink_hades_core_brick_pink +signs_lib:sign_wall +columnia:column_linkcrossdown_hades_core_obsidianbrick +hades_stairs:stair_brick_violet +columnia:column_top_hades_trees_colwood_yellow +columnia:column_bottom_hades_core_stonebrick +hades_vines:willow +columnia:column_linkangle_hades_core_stonebrick +columnia:column_linkangle_down_hades_core_stonebrick +columnia:column_stairsubpillar_hades_trees_pale_wood +columnia:column_top_hades_trees_colwood_dark_green +hades_tiles:floor_sandstonevolcanic_stone +columnia:column_linkangle_hades_trees_wood +columnia:column_linkcross_hades_trees_cream_wood +hades_stairs:step_out_sandstonebrick +hades_stairs:slab_floor_jungle_jungle +hades_stairs:step_out_chondrite +hades_doors:door_obsidian_glass_e +columnia:column_bottom_hades_core_brick_yellow +hades_stairs:step_in_brown +columnia:column_linktee_down_hades_trees_jungle_wood +columnia:column_bottom_hades_core_brick_pink +columnia:column_linktee_hades_core_brick_violet +columnia:column_top_hades_trees_pale_wood +columnia:column_crosslink_hades_trees_pale_wood +hades_core:sandstonebrick +columnia:column_linkcrossdown_hades_trees_pale_wood +columnia:column_bottom_hades_core_cobble_sandstone +columnia:column_mid_hades_trees_jungle_bark +columnia:column_linktee_hades_trees_colwood_white +columnia:column_linkcross_hades_core_chondrite_brick +hades_tiles:floor_chondrite_sandstone +columnia:column_linkcrossdown_hades_trees_wood +columnia:column_linktee_hades_trees_cream_wood +columnia:column_crosslink_hades_core_basalt_brick +columnia:column_linktee_down_hades_trees_cream_wood +hades_core:orangite_brick +columnia:column_bottom_hades_trees_lush_wood +columnia:column_linkangle_hades_trees_colwood_blue +columnia:column_link_hades_trees_lush_wood +hades_stairs:step_in_colwood_magenta +columnia:column_linkangle_down_hades_core_apolline +columnia:column_linkangle_down_hades_core_olivine_brick +hades_stairs:slab_brick +columnia:column_top_hades_trees_colwood_uncolored +columnia:column_bottom_hades_trees_colwood_black +columnia:column_linkangle_hades_trees_colwood_uncolored +columnia:column_link_hades_core_cactus_brick +columnia:column_linktee_hades_trees_jungle_wood +columnia:column_linktee_down_hades_trees_colwood_uncolored +columnia:column_linkcrossdown_hades_trees_colwood_white +columnia:column_top_hades_core_mossycobble +hades_trees:pale_tree +columnia:column_linkangle_down_hades_trees_colwood_red +columnia:column_linkdown_hades_core_stone +columnia:column_linkvertical_hades_trees_colwood_black +columnia:column_linkangle_hades_trees_colwood_black +hades_core:stone_with_mese +hades_windows:window_wood_yellow +columnia:column_linkcrossdown_hades_trees_colwood_uncolored +hades_stairs:slab_cobble +columnia:column_mid_hades_trees_colwood_blue +hades_core:stone_with_iron +hades_stairs:slab_cinnabar +hades_flowerpots:flower_pot_orange +hades_doors:door_wood_jungle_e +columnia:column_linkcross_hades_trees_pale_wood +hades_stairs:slab_colwood_orange +hades_flowerpots:flower_pot_jungle_leaves +hades_core:brick_violet +hades_doors:door_glass_d +columnia:column_crosslink_hades_trees_colwood_brown +columnia:column_link_hades_trees_colwood_brown +columnia:column_top_hades_core_brick_green +hades_stairs:stair_out_magenta +hades_walls:cobble_sandstone +columnia:column_linktee_hades_core_sandstone_volcanic +hades_doors:door_steel_white_a +hades_furnaces:furnace_active +columnia:column_stairsubpillar_hades_trees_colwood_brown +columnia:column_top_hades_trees_colwood_cyan +columnia:column_linkvertical_hades_core_stone_baked +hades_food:tomato_potato_salad +hades_doors:hidden_center +columnia:column_mid_hades_core_obsidianbrick +columnia:column_linkangle_hades_trees_colwood_cyan +hades_tiles:floor_stone_stone +hades_doors:door_dungeon1_e +columnia:column_crosslink_hades_core_basalt +columnia:column_linkvertical_hades_core_stonebrick +columnia:column_linkcrossdown_hades_trees_colwood_dark_green +columnia:column_stairsub_hades_trees_colwood_dark_green +hades_stairs:stair_in_floor_jungle_jungle +hades_stairs:step_in_colwood_violet +hades_tiles:floor_marble_basalt +hades_stairs:stair_in_colwood_white +hades_stairs:stair_floor_marble_marble +columnia:column_linkangle_hades_trees_colwood_dark_grey +columnia:column_linkangle_down_hades_trees_colwood_dark_grey +columnia:column_bottom_hades_core_sandstonebrick +hades_trees:canvas_tree +columnia:column_linktee_hades_trees_colwood_dark_grey +hades_doors:door_wood_lush_e +hades_stairs:slab_floor_stonebaked_stonebaked +columnia:column_mid_hades_trees_jungle_wood +hades_doors:door_chondrite_c +columnia:column_linkcross_hades_core_mossycobble +hades_tiles:floor_stonebaked_stone +columnia:column_linkangle_down_hades_core_cactus_brick +columnia:column_linktee_hades_trees_colwood_grey +columnia:column_linkcrossdown_hades_trees_colwood_green +hades_tiles:floor_pale_jungle +columnia:column_bottom_hades_trees_colwood_green +columnia:column_linkcross_hades_core_cactus_brick +columnia:column_stairsubpillar_hades_core_tuff +columnia:column_linktee_hades_core_stonebrick +columnia:column_bottom_hades_trees_colwood_blue +columnia:column_stairsub_hades_trees_colwood_green +hades_furniture:table_lamp_max +columnia:column_top_hades_trees_colwood_magenta +columnia:column_linktee_down_hades_trees_colwood_magenta +columnia:column_linkcross_hades_trees_colwood_magenta +columnia:column_stairsubpillar_hades_core_cactus_brick +columnia:column_link_hades_trees_colwood_grey +hades_doors:door_steel_bar_c +columnia:column_linktee_hades_core_sandstone +columnia:column_linkdown_hades_trees_colwood_magenta +hades_flowerpots:flower_pot_canvas_sapling +hades_tiles:floor_stonebaked_tuffbaked +columnia:column_top_hades_core_basalt +columnia:column_mid_hades_trees_colwood_orange +columnia:column_linktee_down_hades_trees_colwood_green +hades_stairs:slab_floor_essexite_essexite +columnia:column_linkcrossdown_hades_trees_colwood_orange +columnia:column_linkvertical_hades_trees_colwood_magenta +columnia:column_linktee_hades_trees_colwood_orange +columnia:column_linktee_hades_trees_colwood_red +columnia:column_top_hades_trees_colwood_pink +columnia:column_linkdown_hades_trees_colwood_uncolored +hades_stairs:stair_out_obsidianbrick +columnia:column_linkangle_down_hades_trees_colwood_dark_green +columnia:column_linkangle_hades_trees_colwood_pink +columnia:column_top_hades_trees_colwood_red +hades_stairs:slab_double_floorblock_essexite_gold_block +columnia:column_linkcross_hades_trees_colwood_red +signs_lib:sign_wall_red +hades_trees:canvas_bark +columnia:column_top_hades_core_essexite_brick +columnia:column_mid_hades_trees_colwood_violet +columnia:column_top_hades_trees_colwood_violet +columnia:column_linkdown_hades_trees_colwood_violet +columnia:column_linkcross_hades_trees_colwood_violet +hades_furniture:rusty_bars +columnia:column_top_hades_core_cobble +columnia:column_linkcrossdown_hades_trees_colwood_blue +columnia:column_top_hades_trees_colwood_white +columnia:column_link_hades_trees_colwood_yellow +hades_doors:door_steel_cyan_a +columnia:column_stairsub_hades_core_sandstonebrick +hades_tiles:floor_stone_sandstone +columnia:column_crosslink_hades_trees_colwood_uncolored +columnia:column_stairsub_hades_trees_colwood_white +hades_tiles:floor_jungle_cream +hades_doors:door_dungeon1_b +columnia:column_crosslink_hades_trees_colwood_magenta +columnia:column_mid_hades_core_stonebrick +hades_stairs:stair_out_yellow +hades_core:tuff_baked +columnia:column_linkdown_hades_core_tuff_baked_brick +hades_stairs:stair_out_colwood_pink +columnia:column_linktee_hades_core_lillite +columnia:column_linkcross_hades_trees_colwood_pink +hades_stairs:step_in_pale_wood +columnia:column_linkdown_hades_trees_wood +columnia:column_linkangle_hades_core_brick_pink +hades_stairs:stair_sandstone_volcanic_brick +columnia:column_stairsubpillar_hades_core_sandstonebrick +columnia:column_linkangle_hades_core_brick_violet +hades_stairs:step_out_floor_tuff_tuff +columnia:column_link_hades_trees_jungle_bark +hades_stairs:stair_in_brick +hades_core:cobble_sandstone_volcanic +hades_doors:door_wood_pale_e +columnia:column_linkangle_down_hades_trees_colwood_uncolored +columnia:column_stairsub_hades_trees_jungle_bark +columnia:column_linkcrossdown_hades_core_sandstone_volcanic +columnia:column_crosslink_hades_core_stonebrick +hades_doors:door_stone_a +columnia:column_linktee_hades_trees_pale_bark +columnia:column_linkangle_hades_trees_colwood_violet +columnia:column_mid_hades_core_brick_brown +columnia:column_linktee_hades_trees_colwood_blue +columnia:column_linkvertical_hades_core_cobble_sandstone +columnia:column_linktee_down_hades_core_cobble_sandstone_volcanic +columnia:column_linkdown_hades_core_essexite_brick +hades_doors:door_wood_pale_a +columnia:column_link_hades_trees_colwood_blue +hades_stairs:step_out_brick_dark_grey +columnia:column_mid_hades_core_sandstone_volcanic +columnia:column_top_hades_trees_orange_bark +columnia:column_linkcross_hades_core_brick_violet +hades_stairs:step_in_magenta +columnia:column_crosslink_hades_trees_orange_bark +columnia:column_link_hades_trees_orange_bark +columnia:column_link_hades_core_marble +columnia:column_mid_hades_core_sandstone +columnia:column_linkcross_hades_trees_orange_bark +hades_grass:dead_grass_3 +hades_tiles:floor_sandstone_stone +columnia:column_linktee_hades_trees_orange_bark +hades_stairs:step_in_colwood_pink +columnia:column_linktee_hades_trees_colwood_green +columnia:column_bottom_hades_core_brick_brown +hades_core:orangite +columnia:column_link_hades_trees_jungle_wood +columnia:column_linkangle_hades_trees_canvas_bark +columnia:column_linkangle_down_hades_trees_canvas_bark +columnia:column_linkangle_hades_core_brick_blue +hades_stairs:stair_out_sandstone +columnia:column_stairsubpillar_hades_core_brick_grey +columnia:column_linkangle_down_hades_core_brick_black +columnia:column_linktee_down_hades_core_brick_brown +columnia:column_mid_hades_trees_birch_bark +columnia:column_stairsubpillar_hades_trees_canvas_bark +hades_windows:window_wood_darkgreen +columnia:column_link_hades_trees_colwood_cyan +columnia:column_stairsubpillar_hades_trees_cream_wood +columnia:column_crosslink_hades_core_brick +hades_core:floor_essexite_gold +hades_doors:door_steel_grey_b +columnia:column_linkangle_down_hades_core_brick +columnia:column_linktee_down_hades_core_cactus_brick +columnia:column_linktee_down_hades_core_brick +hades_trees:colwood_black +hades_core:essexite_block +hades_stairs:stair_in_floor_lush_lush +hades_trees:pale_wood +columnia:column_linkcross_hades_core_brick_white +columnia:column_linkcrossdown_hades_core_brick_black +hades_cloth:yellow +hades_stairs:step_colwood_cyan +columnia:column_stairsub_hades_trees_colwood_uncolored +hades_core:bookshelf +columnia:column_stairsubpillar_hades_trees_colwood_pink +hades_tiles:floor_essexitegold_essexite +hades_doors:door_steel_darkgrey_c +columnia:column_mid_hades_core_brick_orange +hades_stairs:slab_pale_wood +hades_flowerpots:flower_pot_cocoa_sapling +columnia:column_bottom_hades_core_brick_cyan +columnia:column_linkdown_hades_core_brick_cyan +hades_furniture:chair_black +hades_tiles:floor_chondrite_tuff +columnia:column_stairsub_hades_trees_pale_wood +columnia:column_linkangle_hades_trees_lush_wood +hades_trees:olive +hades_doors:door_steel_orange_b +hades_doors:trapdoor_jungle_open +columnia:column_top_columnia_rusty_block +columnia:column_linktee_down_hades_trees_jungle_bark +hades_doors:door_stone_b +columnia:column_linkcross_hades_core_stone +columnia:column_crosslink_hades_core_brick_cyan +columnia:column_linkangle_hades_core_brick_dark_green +columnia:column_stairsub_hades_core_brick_dark_green +columnia:column_stairsubpillar_hades_trees_jungle_bark +hades_stairs:slab_floor_chondrite_chondrite +columnia:column_mid_hades_trees_colwood_pink +columnia:column_linkvertical_hades_core_sandstonebrick +hades_core:mossytuff +columnia:column_linktee_down_hades_trees_colwood_pink +columnia:column_linkangle_hades_core_brick_yellow +columnia:column_linkangle_down_hades_core_brick_dark_grey +hades_tiles:floor_wood_cream +columnia:column_mid_hades_core_brick_cyan +columnia:column_linkangle_down_hades_core_brick_green +hades_trees:colwood_orange +columnia:column_linkcross_hades_core_brick_blue +hades_doors:door_steel_black_a +columnia:column_crosslink_hades_core_tuff_brick +columnia:column_linktee_hades_core_brick_blue +columnia:column_linkcross_hades_core_brick_grey +hades_stairs:step_in_grey +columnia:column_linkdown_hades_core_cobble +columnia:column_mid_hades_core_brick_magenta +hades_stairs:stair_brick_green +columnia:column_linktee_down_hades_trees_bark +columnia:column_top_hades_core_cobble_sandstone_volcanic +columnia:column_linktee_hades_core_brick_magenta +hades_chests:chest_white +columnia:column_linkdown_hades_core_obsidianbrick +columnia:column_bottom_hades_core_cinnabar +hades_stairs:stair_in_brick_grey +columnia:column_linkvertical_hades_trees_bark +hades_tiles:floor_stonebaked_chondrite +columnia:column_linktee_down_hades_core_brick_black +columnia:column_stairsub_hades_core_brick_orange +columnia:column_stairsubpillar_hades_core_cobble_sandstone_volcanic +columnia:column_link_hades_core_brick_pink +hades_stairs:step_in_brick_dark_green +columnia:column_linkcrossdown_hades_core_sandstone_volcanic_brick +columnia:column_linktee_down_hades_core_sandstonebrick +hades_tiles:floor_essexite_essexite +columnia:column_linkvertical_hades_core_brick_black +hades_doors:door_dungeon1_d +columnia:column_linkdown_hades_core_brick_violet +hades_stairs:stair_out_copperblock +columnia:column_top_hades_core_chondrite_brick +columnia:column_linktee_hades_core_stone_baked +columnia:column_top_hades_core_brick_black +columnia:column_stairsubpillar_hades_core_olivine +columnia:column_linktee_hades_core_brick +columnia:column_linkdown_hades_core_brick_white +hades_flowerpots:flower_pot +columnia:column_crosslink_hades_core_brick_yellow +columnia:column_mid_hades_core_marble_brick +columnia:column_top_hades_core_marble_brick +columnia:column_crosslink_hades_core_marble_brick +hades_stairs:step_sandstone_volcanic +hades_stairs:step_brick_black +hades_tiles:floor_jungle_wood +columnia:column_linkcrossdown_hades_core_marble_brick +hades_stairs:stair_in_brick_white +columnia:column_linkangle_hades_core_marble_brick +columnia:column_linkangle_down_hades_core_marble_brick +columnia:column_linkvertical_hades_core_mossycobble +columnia:column_stairsub_hades_core_marble_brick +columnia:column_linkcross_hades_trees_colwood_brown +hades_waterplants:waterlily_s3 +columnia:column_linktee_hades_core_chondrite +columnia:column_stairsubpillar_hades_core_stonebrick +columnia:column_bottom_hades_core_brick_red +columnia:column_linkcross_hades_trees_colwood_cyan +hades_stairs:step_in_cobble +columnia:column_bottom_hades_core_marble_brick +columnia:column_linkcross_hades_core_sandstone_volcanic +columnia:column_top_hades_core_obsidianbrick +columnia:column_stairsub_hades_core_brick_black +columnia:column_linkvertical_hades_trees_colwood_cyan +columnia:column_mid_hades_core_basalt_brick +columnia:column_linkdown_hades_core_basalt_brick +columnia:column_linkcross_hades_core_basalt_brick +columnia:column_linkcrossdown_hades_core_brick_cyan +columnia:column_linktee_hades_core_basalt_brick +columnia:column_top_hades_core_brick_blue +columnia:column_stairsub_hades_core_olivine +hades_stairs:stair_out_brick_black +columnia:column_linkcrossdown_hades_trees_colwood_violet +hades_chests:chest_grey +columnia:column_bottom_hades_core_tuff_brick +columnia:column_top_hades_core_brick_grey +columnia:column_linktee_hades_core_obsidianbrick +columnia:column_linkcross_hades_core_tuff_baked +columnia:column_top_hades_core_brick_white +columnia:column_linktee_down_hades_core_tuff_baked +columnia:column_mid_hades_core_tuff_baked_brick +hades_trees:jungle_leaves +hades_stairs:slab_colwood_blue +hades_farming:seed_wheat +columnia:column_linkangle_down_hades_core_essexite +columnia:column_mid_hades_core_essexite_brick +hades_beds:bed_bottom +columnia:column_stairsubpillar_hades_core_essexite_brick +columnia:column_linkdown_hades_core_basalt +columnia:column_linkangle_hades_trees_colwood_brown diff --git a/mods/xcompat/test/nodelist/mineclonia.txt b/mods/xcompat/test/nodelist/mineclonia.txt new file mode 100644 index 00000000..c2b5d57b --- /dev/null +++ b/mods/xcompat/test/nodelist/mineclonia.txt @@ -0,0 +1,3517 @@ +mcl_walls:brick_5 +pipeworks:conductor_tube_on_2 +mcl_walls:brick_6 +pipeworks:storage_tank_6 +mesecons:wire_10111010_on +mesecons:wire_10111010_off +mcl_walls:brick_8 +mesecons:wire_01110001_on +mesecons:wire_01110001_off +pipeworks:conductor_tube_on_4 +mcl_walls:brick_10 +mcl_stairs:slab_jungle_bark +mcl_stairs:slab_jungle_bark_top +mcl_walls:brick_12 +mesecons:wire_11111010_on +mesecons:wire_11111010_off +pipeworks:conductor_tube_on_6 +mesecons:wire_11110001_on +mesecons:wire_11110001_off +mcl_walls:brick_15 +pipeworks:conductor_tube_on_7 +mcl_walls:brick_16 +pipeworks:expansion_tank_8 +mcl_walls:brick_21 +pipeworks:conductor_tube_on_8 +mesecons:wire_01100110_on +mesecons:wire_01100110_off +pipeworks:conductor_tube_off_9 +mesecons:wire_10011001_on +mesecons:wire_10011001_off +mcl_walls:sandstone_1 +pipeworks:conductor_tube_off_10 +mcl_walls:sandstone_2 +mcl_walls:sandstone_3 +pipeworks:expansion_tank_9 +mesecons:wire_11100110_on +mesecons:wire_11100110_off +mesecons_pressureplates:pressure_plate_jungle_on +mesecons:wire_11011001_on +mesecons:wire_11011001_off +pipeworks:storage_tank_9 +mesecons_button:button_jungle_off +mcl_ocean:tube_coral +mcl_stairs:slab_deepslate_cobbled_top +mcl_stairs:slab_deepslate_cobbled_double +mesecons:wire_01110110_on +mesecons:wire_01110110_off +mesecons:wire_10111001_on +mesecons:wire_10111001_off +mcl_ocean:dead_tube_coral_fan +mcl_walls:sandstone_13 +mcl_deepslate:deepslatecobbledwall_0 +mcl_walls:sandstone_14 +mcl_deepslate:deepslatecobbledwall_1 +mesecons:wire_11110110_on +mesecons:wire_11110110_off +mcl_walls:sandstone_16 +mesecons:wire_11111001_on +mesecons:wire_11111001_off +mcl_ocean:dead_brain_coral +mcl_walls:redsandstone_0 +mcl_stairs:slab_deepslate_tiles_cracked_top +mcl_walls:redsandstone_1 +mesecons:wire_11101110_on +mesecons:wire_11101110_off +mesecons:wire_01010101_on +mcl_ocean:bubble_coral_block +homedecor:painting_15 +mcl_ocean:dead_bubble_coral_block +homedecor:banister_wood_diagonal_right_grey +mesecons:wire_11111110_on +mesecons:wire_11111110_off +mcl_ocean:dead_bubble_coral +homedecor:banister_wood_diagonal_right_red +homedecor:banister_wood_diagonal_right_vermilion +mcl_ocean:bubble_coral_fan +homedecor:banister_wood_diagonal_right_orange +mcl_ocean:dead_bubble_coral_fan +homedecor:banister_wood_diagonal_right_amber +mesecons:wire_00010001_on +mcl_ocean:fire_coral_block +homedecor:banister_wood_diagonal_right_lime +mcl_ocean:dead_fire_coral_block +homedecor:banister_wood_diagonal_right_chartreuse +mcl_trees:stripped_spruce +homedecor:banister_wood_diagonal_right_harlequin +mcl_ocean:fire_coral +homedecor:banister_wood_diagonal_right_green +mcl_ocean:dead_fire_coral +mcl_trees:wood_spruce +homedecor:banister_wood_diagonal_right_spring +mcl_ocean:fire_coral_fan +mcl_fences:red_nether_brick_fence +mcl_trees:bark_stripped_spruce +mcl_trees:bark_spruce +mcl_monster_eggs:monster_egg_stonebrickcarved +homedecor:banister_wood_diagonal_right_cerulean +mcl_ocean:horn_coral_block +homedecor:banister_wood_diagonal_right_azure +mcl_fences:nether_brick_fence_gate +mcl_fences:nether_brick_fence_gate_open +mcl_ocean:horn_coral +mcl_ocean:dead_horn_coral +mcl_ocean:horn_coral_fan +mcl_ocean:dead_horn_coral_fan +mcl_trees:leaves_spruce +air +mcl_ocean:seagrass_dirt +mcl_ocean:seagrass_sand +mcl_ocean:seagrass_redsand +mcl_ocean:seagrass_gravel +mesecons_pressureplates:pressure_plate_crimson_off +mesecons_pressureplates:pressure_plate_crimson_on +mesecons_button:button_crimson_off +mcl_walls:cobble +mcl_walls:mossycobble +mcl_walls:andesite +mcl_walls:granite +mesecons_button:button_crimson_on +mcl_walls:diorite +mcl_walls:brick +mcl_walls:sandstone +mcl_walls:redsandstone +mcl_walls:stonebrick +mcl_walls:stonebrickmossy +mcl_walls:prismarine +mcl_walls:endbricks +mcl_walls:netherbrick +mcl_walls:rednetherbrick +mcl_walls:mudbrick +mcl_walls:cobble_0 +mcl_walls:cobble_1 +mcl_walls:cobble_2 +mcl_walls:cobble_3 +mcl_walls:cobble_4 +mcl_walls:cobble_5 +mcl_walls:cobble_6 +mcl_walls:cobble_7 +mcl_walls:cobble_8 +mcl_walls:cobble_9 +mcl_walls:cobble_10 +mcl_walls:cobble_11 +mcl_walls:cobble_12 +mcl_walls:cobble_13 +pipeworks:accelerator_tube_9 +mcl_walls:cobble_14 +pipeworks:tube_1 +mcl_walls:cobble_15 +mcl_walls:cobble_16 +mcl_walls:cobble_21 +mcl_walls:mossycobble_0 +mcl_walls:mossycobble_1 +mcl_walls:mossycobble_2 +mcl_walls:mossycobble_3 +mcl_walls:mossycobble_4 +mcl_walls:mossycobble_5 +pipeworks:mese_sand_tube_2 +mcl_walls:mossycobble_6 +mcl_flowerpots:flower_pot_warped_fungus +mcl_walls:mossycobble_7 +mcl_walls:mossycobble_8 +pipeworks:mese_sand_tube_4 +mcl_walls:mossycobble_9 +mcl_walls:mossycobble_10 +homedecor:microwave_oven_active +mcl_walls:mossycobble_11 +pipeworks:mese_sand_tube_6 +mcl_walls:mossycobble_12 +mcl_walls:mossycobble_13 +pipeworks:one_way_tube +mcl_walls:mossycobble_14 +pipeworks:mese_sand_tube_8 +mcl_walls:mossycobble_15 +mcl_walls:mossycobble_16 +mcl_walls:mossycobble_21 +pipeworks:mese_sand_tube_10 +homedecor:microwave_oven_active_locked +pipeworks:tube_2 +mcl_walls:andesite_0 +mcl_walls:andesite_1 +pipeworks:tube_3 +mcl_walls:andesite_2 +mcl_walls:andesite_3 +mcl_walls:andesite_4 +mcl_stairs:stair_lapisblock_inner +mcl_walls:andesite_5 +mcl_walls:andesite_6 +pipeworks:tube_5 +mcl_walls:andesite_7 +mcl_walls:andesite_8 +mcl_stairs:slab_lapisblock_top +mcl_walls:andesite_9 +mcl_walls:andesite_10 +mcl_walls:andesite_11 +pipeworks:tube_7 +mcl_walls:andesite_12 +pipeworks:crossing_tube_2 +mcl_walls:andesite_13 +mcl_walls:andesite_14 +mcl_walls:andesite_15 +pipeworks:crossing_tube_4 +pipeworks:tube_9 +pipeworks:crossing_tube_5 +pipeworks:crossing_tube_6 +pipeworks:crossing_tube_7 +homedecor:kitchen_cabinet_colorable_locked +pipeworks:crossing_tube_8 +mcl_signs:wall_sign_cherry_blossom +pipeworks:crossing_tube_9 +homedecor:kitchen_cabinet_colored_locked +pipeworks:crossing_tube_10 +pipeworks:crossing_tube_compatibility +homedecor:kitchen_cabinet_colorable_with_drawers_locked +mesecons_pressureplates:pressure_plate_cherry_blossom_off +mesecons_pressureplates:pressure_plate_cherry_blossom_on +mesecons_button:button_cherry_blossom_off +homedecor:kitchen_cabinet_colored_granite +homedecor:kitchen_cabinet_colorable_granite_locked +mesecons_button:button_cherry_blossom_on +mcl_flowerpots:flower_pot_sapling_cherry_blossom +homedecor:kitchen_cabinet_colored_with_drawers_granite +mcl_heads:zombie_ceiling +homedecor:kitchen_cabinet_colorable_with_drawers_granite +mcl_heads:zombie_wall +homedecor:kitchen_cabinet_colored_with_drawers_granite_locked +mcl_heads:creeper_ceiling +mcl_heads:creeper_wall +pipeworks:lua_tube110001 +pipeworks:lua_tube001001 +homedecor:kitchen_cabinet_colorable_marble_locked +homedecor:kitchen_cabinet_colorable_marble +pipeworks:lua_tube101001 +homedecor:banister_wood_diagonal_right_sapphire +homedecor:banister_wood_diagonal_right_blue +pipeworks:lua_tube111001 +mcl_heads:steve_wall +pipeworks:lua_tube000101 +homedecor:banister_wood_diagonal_right_violet +homedecor:kitchen_cabinet_colored_with_drawers_marble +homedecor:banister_wood_diagonal_right_mulberry +homedecor:banister_wood_diagonal_right_magenta +homedecor:banister_wood_diagonal_right_fuchsia +homedecor:kitchen_cabinet_colorable_with_drawers_marble_locked +homedecor:banister_wood_diagonal_right_rose +mcl_bamboo:bamboo_mosaic +homedecor:banister_wood_diagonal_right_crimson +pipeworks:lua_tube100101 +homedecor:banister_white_dark_diagonal_right +pipeworks:lua_tube010101 +homedecor:banister_brass_diagonal_right +mcl_bamboo:scaffolding_horizontal +homedecor:banister_wrought_iron_diagonal_right +pipeworks:lua_tube110101 +pipeworks:lua_tube001101 +pipeworks:lua_tube101101 +pipeworks:lua_tube011101 +mcl_flowerpots:flower_pot_bamboo +pipeworks:lua_tube000011 +mcl_stairs:slab_bamboo +mcl_stairs:slab_bamboo_top +mcl_stairs:slab_bamboo_double +mcl_trees:tree_bamboo +mcl_trees:wood_bamboo +mcl_stairs:slab_bamboo_bark +mcl_stairs:slab_bamboo_bark_top +mcl_stairs:slab_bamboo_bark_double +mcl_flowerpots:flower_pot_allium +mcl_flowerpots:flower_pot_azure_bluet +mcl_flowerpots:flower_pot_blue_orchid +mcl_flowerpots:flower_pot_dandelion +mcl_flowerpots:flower_pot_fern +mcl_flowerpots:flower_pot_oxeye_daisy +mcl_trees:stripped_bamboo +mcl_flowerpots:flower_pot_tulip_orange +mcl_flowerpots:flower_pot_tulip_pink +mcl_flowerpots:flower_pot_tulip_red +mcl_flowerpots:flower_pot_tulip_white +mcl_signs:wall_sign_bamboo +mcl_flowers:allium +mcl_signs:standing_sign_bamboo +mcl_flowers:blue_orchid +mcl_trees:bark_stripped_bamboo +mcl_trees:bark_bamboo +mcl_flowers:double_fern_top +mcl_flowers:fern +mcl_flowers:lilac +mcl_flowers:lilac_top +mcl_flowers:oxeye_daisy +mcl_flowers:peony +mesecons_pressureplates:pressure_plate_bamboo_off +mcl_flowers:poppy +mesecons_pressureplates:pressure_plate_bamboo_on +mcl_flowers:rose_bush_top +mcl_flowers:sunflower +mcl_flowers:sunflower_top +mesecons_button:button_bamboo_off +mcl_bells:bell +mcl_flowers:double_grass_top +mcl_flowers:tulip_orange +mesecons_button:button_bamboo_on +mcl_flowers:tulip_red +mcl_flowers:tulip_white +mcl_flowers:waterlily +mcl_heads:creeper +mcl_heads:skeleton +mcl_fences:bamboo_fence +mcl_heads:wither_skeleton +mcl_fences:bamboo_fence_gate +mcl_fences:bamboo_fence_gate_open +mcl_core:ladder +mcl_core:lava_source +mcl_core:lava_flowing +mcl_core:water_source +mcl_core:water_flowing +mclx_core:river_water_source +mclx_core:river_water_flowing +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_male_crea +pipeworks:lua_tube101111 +mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_crea +pipeworks:lua_tube011111 +mcl_maps:filled_map_mcl_skins_base_18D471DFF_male_crea +pipeworks:lua_tube111111 +mcl_maps:filled_map_character_male_crea +mcl_doors:door_bamboo_b_1 +mcl_nether:nether_wart_1 +mcl_nether:nether_wart_2 +mcl_nether:nether_wart +mcl_amethyst:amethyst_cluster +mcl_amethyst:budding_amethyst_block +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_female_surv +mcl_doors:door_bamboo_b_2 +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_male_surv +mcl_doors:door_bamboo_t_2 +mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_surv +mcl_doors:trapdoor_bamboo +mcl_maps:filled_map_mcl_skins_base_18D471DFF_male_surv +mcl_maps:filled_map_character_male_surv +mcl_maps:filled_map_mcl_skins_character_1_female_surv +mcl_comparators:comparator_on_sub +mcl_comparators:comparator_off_sub +mcl_comparators:comparator_on_comp +mcl_comparators:comparator_off_comp +mesecons_delayer:delayer_off_1 +mcl_doors:trapdoor_bamboo_open +mesecons_delayer:delayer_off_3 +mesecons_delayer:delayer_off_4 +mesecons_delayer:delayer_on_1 +mesecons_delayer:delayer_on_2 +mcl_stairs:stair_bamboo +mcl_mushrooms:brown_mushroom_block_cap_101110 +mcl_amethyst:tinted_glass +mcl_stairs:stair_bamboo_inner +mesecons_torch:mesecon_torch_on_wall +mcl_mushrooms:brown_mushroom_block_cap_110000 +mcl_ocean:sea_pickle_1_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_cap_110001 +mcl_ocean:sea_pickle_3_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_cap_110010 +mcl_amethyst:medium_amethyst_bud +mcl_mushrooms:brown_mushroom_block_cap_110011 +mcl_stairs:stair_bamboo_bark_outer +mcl_amethyst:large_amethyst_bud +mcl_chests:dark_green_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_110101 +mcl_chests:lightblue_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_110110 +mcl_chests:orange_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_110111 +mcl_chests:pink_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_111000 +mcl_chests:red_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_111001 +mcl_chests:white_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_111010 +mcl_core:snow +mcl_mushrooms:brown_mushroom_block_cap_111011 +mcl_core:snow_3 +mcl_core:snow_4 +mesecons:wire_11010101_on +mesecons:wire_11010101_off +mcl_core:snow_7 +mcl_mushrooms:brown_mushroom_block_cap_111110 +mcl_torches:torch +mcl_torches:torch_wall +mcl_farming:wheat +mcl_farming:wheat_2 +mcl_farming:wheat_3 +mcl_farming:wheat_4 +mcl_farming:wheat_5 +mcl_farming:wheat_6 +mcl_farming:wheat_7 +mcl_deepslate:deepslate_bricks_cracked +pipeworks:tag_tube_110100 +homedecor:wood_table_large_square +pipeworks:tag_tube_110101 +mcl_stairs:slab_andesite_smooth +mcl_stairs:slab_andesite_smooth_top +mcl_stairs:slab_andesite_smooth_double +mesecons:wire_11110101_on +mcl_amethyst:small_amethyst_bud +pipeworks:tag_tube_110111 +pipeworks:tag_tube_111000 +mcl_stairs:slab_deepslate_bricks +mcl_stairs:slab_deepslate_bricks_top +mcl_stairs:slab_deepslate_bricks_double +mcl_stairs:stair_granite_smooth +homedecor:banister_wood_diagonal_left_grey +mcl_stairs:stair_granite_smooth_outer +mcl_stairs:stair_granite_smooth_inner +mcl_deepslate:deepslatebrickswall +mcl_copper:block_raw +homedecor:banister_wood_diagonal_left_red +mcl_stairs:slab_granite_smooth +mcl_stairs:slab_granite_smooth_top +mcl_stairs:slab_granite_smooth_double +mesecons:wire_11111101_on +mesecons:wire_11111101_off +homedecor:banister_wood_diagonal_left_vermilion +mcl_deepslate:deepslatebrickswall_4 +mcl_deepslate:deepslatebrickswall_5 +mcl_deepslate:deepslatebrickswall_6 +mcl_deepslate:deepslatebrickswall_7 +mcl_stairs:stair_diorite_smooth +mesecons:wire_00110011_on +mcl_stairs:stair_diorite_smooth_outer +mcl_stairs:stair_diorite_smooth_inner +mcl_deepslate:deepslatebrickswall_10 +homedecor:banister_wood_horizontal_yellow +mcl_deepslate:deepslatebrickswall_11 +homedecor:banister_wood_diagonal_left_yellow +mcl_deepslate:deepslatebrickswall_12 +mcl_stairs:slab_diorite_smooth +mcl_stairs:slab_diorite_smooth_top +mcl_stairs:slab_diorite_smooth_double +mesecons:wire_10110011_off +homedecor:banister_wood_diagonal_left_lime +mcl_deepslate:deepslatebrickswall_15 +building_blocks:Tar +mcl_deepslate:deepslatebrickswall_16 +homedecor:banister_wood_horizontal_chartreuse +mcl_deepslate:deepslatebrickswall_21 +homedecor:banister_wood_diagonal_left_chartreuse +mcl_stairs:stair_stonebrickmossy +mesecons:wire_01110011_off +mcl_stairs:stair_stonebrickmossy_outer +mcl_stairs:stair_stonebrickmossy_inner +building_blocks:fakegrass +homedecor:banister_wood_horizontal_green +building_blocks:hardwood +homedecor:simple_bench +mcl_stairs:slab_stonebrickmossy +mcl_stairs:slab_stonebrickmossy_top +mcl_stairs:slab_stonebrickmossy_double +mesecons:wire_11110011_off +homedecor:kitchen_chair_wood +homedecor:office_chair_basic +homedecor:office_chair_upscale +homedecor:banister_wood_horizontal_spring +homedecor:banister_wood_diagonal_left_spring +mesecons:wire_10111011_on +mesecons:wire_10111011_off +pipeworks:spigot_pouring +mcl_villages:crop_flower_2 +mcl_wool:white +mcl_stairs:stair_copper_cut +pipeworks:fountainhead +pipeworks:fountainhead_pouring +mcl_stairs:stair_copper_cut_outer +mcl_stairs:stair_copper_cut_inner +homedecor:banister_wood_diagonal_left_cyan +mesecons:wire_11111011_on +mesecons:wire_11111011_off +mcl_wool:yellow_carpet +homedecor:banister_wood_horizontal_cerulean +mcl_stairs:slab_copper_cut +mcl_stairs:slab_copper_cut_top +mcl_stairs:slab_copper_cut_double +building_blocks:woodglass +homedecor:banister_wood_horizontal_azure +homedecor:banister_wood_diagonal_left_azure +mesecons:wire_01110111_on +mesecons:wire_01110111_off +homedecor:banister_wood_horizontal_sapphire +mcl_stairs:stair_copper_exposed_cut +homedecor:banister_wood_diagonal_left_sapphire +mcl_stairs:stair_copper_exposed_cut_outer +mcl_stairs:stair_copper_exposed_cut_inner +homedecor:banister_wood_horizontal_blue +mcl_lanterns:lantern_ceiling +mesecons:wire_11110111_on +mesecons:wire_11110111_off +mcl_stairs:slab_copper_exposed_cut +mcl_stairs:slab_copper_exposed_cut_top +mcl_stairs:slab_copper_exposed_cut_double +homedecor:banister_wood_diagonal_left_indigo +mcl_lanterns:soul_lantern_ceiling +mcl_wool:magenta +mesecons:wire_11111111_on +mesecons:wire_11111111_off +building_blocks:BWtile +mcl_wool:magenta_carpet +homedecor:banister_wood_horizontal_mulberry +building_blocks:Fireplace +mcl_wool:blue +homedecor:banister_wood_horizontal_magenta +homedecor:banister_wood_diagonal_left_magenta +mcl_flowerpots:flower_pot_deadbush +mesecons_walllever:wall_lever_off +mcl_wool:green +mcl_core:light_0 +mcl_wool:green_carpet +mesecons_walllever:wall_lever_on +mcl_core:light_1 +mcl_wool:brown +mcl_core:light_2 +mcl_core:light_3 +mcl_fletching_table:fletching_table +mcl_core:light_4 +mcl_core:light_5 +mcl_core:light_6 +mcl_core:light_7 +mcl_core:light_8 +mesecons_solarpanel:solar_panel_on +mcl_core:light_9 +mcl_cartography_table:cartography_table +mcl_core:light_10 +mesecons_solarpanel:solar_panel_inverted_off +mcl_core:light_11 +mcl_core:light_12 +mcl_core:light_13 +mcl_core:light_14 +homedecor:shingle_side_glass +homedecor:skylight +homedecor:shingle_outer_corner_terracotta +homedecor:shingle_inner_corner_terracotta +homedecor:shingle_side_terracotta +homedecor:shingle_inner_corner_wood +homedecor:shingle_outer_corner_wood +homedecor:shingle_side_wood +homedecor:fence_picket_white +mcl_chests:yellow_shulker_box +homedecor:fence_privacy_corner +mcl_chests:white_shulker_box +mcl_chests:dark_grey_shulker_box +homedecor:fence_privacy +mcl_chests:blue_shulker_box +pipeworks:filter +pipeworks:mese_filter +mcl_chests:green_shulker_box +mcl_chests:magenta_shulker_box +homedecor:fence_barbed_wire +mcl_chests:black_shulker_box +mcl_chests:red_shulker_box +mcl_chests:pink_shulker_box +mcl_chests:brown_shulker_box +mcl_chests:dark_green_shulker_box +mcl_chests:orange_shulker_box +mcl_chests:cyan_shulker_box +mcl_chests:lightblue_shulker_box +mcl_chests:grey_shulker_box +mcl_blackstone:blackstone_chiseled_polished +mcl_blackstone:blackstone_brick_polished +mcl_stairs:slab_blackstone_polished +mcl_blackstone:nether_gold +mcl_blackstone:blackstone_gilded +homedecor:digital_clock +homedecor:analog_clock_wood +homedecor:grandfather_clock +homedecor:analog_clock_plastic +mcl_walls:endbricks_12 +mcl_walls:endbricks_13 +mcl_composters:composter +mcl_walls:endbricks_15 +mcl_walls:endbricks_16 +mcl_walls:endbricks_21 +mcl_composters:composter_ready +mcl_cauldrons:cauldron +mcl_walls:netherbrick_0 +mcl_walls:netherbrick_1 +mcl_composters:composter_1 +mcl_composters:composter_2 +mcl_composters:composter_3 +mcl_composters:composter_4 +mcl_composters:composter_5 +mcl_composters:composter_6 +mcl_composters:composter_7 +mcl_walls:netherbrick_5 +mcl_walls:netherbrick_6 +mcl_walls:netherbrick_7 +mcl_walls:netherbrick_8 +mcl_walls:netherbrick_9 +mcl_walls:netherbrick_10 +mcl_trees:bark_oak +mcl_walls:netherbrick_11 +mcl_walls:netherbrick_12 +mcl_walls:netherbrick_13 +mesecons:wire_00000000_off +mcl_walls:netherbrick_14 +mcl_walls:netherbrick_15 +mcl_brewing:stand_000 +mcl_walls:netherbrick_16 +mcl_walls:netherbrick_21 +homedecor:desk_fan +mcl_walls:rednetherbrick_0 +mcl_monster_eggs:monster_egg_stonebrickcracked +mcl_monster_eggs:monster_egg_stonebrick +mcl_walls:rednetherbrick_2 +mcl_trees:leaves_oak +mcl_walls:rednetherbrick_3 +mcl_walls:rednetherbrick_4 +mcl_walls:rednetherbrick_5 +mcl_walls:rednetherbrick_6 +mcl_walls:rednetherbrick_7 +mcl_walls:rednetherbrick_8 +mesecons:wire_10000000_on +mesecons:wire_10000000_off +mcl_walls:rednetherbrick_10 +mcl_walls:rednetherbrick_11 +mcl_walls:rednetherbrick_12 +mcl_walls:rednetherbrick_13 +mcl_walls:rednetherbrick_14 +mcl_fences:oak_fence_gate +mcl_walls:rednetherbrick_15 +mcl_walls:rednetherbrick_16 +mcl_walls:rednetherbrick_21 +homedecor:medicine_cabinet_open +mcl_trees:leaves_acacia +mcl_panes:pane_white_flat +mcl_walls:mudbrick_1 +mcl_nether:magma +mcl_walls:mudbrick_2 +ontime_clocks:green_digital +mcl_walls:mudbrick_4 +mcl_fences:acacia_fence +mcl_walls:mudbrick_5 +mcl_fences:acacia_fence_gate +mcl_doors:door_oak_b_1 +ontime_clocks:red_digital +mcl_walls:mudbrick_7 +mcl_walls:mudbrick_8 +mcl_doors:door_oak_t_1 +ontime_clocks:white +mcl_doors:door_oak_b_2 +ontime_clocks:frameless_black +mcl_tnt:tnt +mcl_walls:mudbrick_12 +mcl_doors:trapdoor_oak +ontime_clocks:frameless_gold +mcl_stairs:slab_prismarine_dark +mcl_doors:door_acacia_b_1 +mcl_amethyst:amethyst_block +ontime_clocks:frameless_white +mcl_walls:mudbrick_16 +mcl_doors:door_acacia_t_1 +mcl_amethyst:calcite +mcl_blackstone:basalt_smooth +mcl_doors:door_acacia_b_2 +mcl_doors:door_acacia_t_2 +mcl_doors:trapdoor_acacia +mcl_raw_ores:raw_iron_block +mcl_anvils:anvil_damage_2 +mcl_stairs:stair_oak_outer +mcl_stairs:stair_oak_inner +mcl_panes:pane_magenta_flat +mcl_stairs:stair_oak_bark +mcl_raw_ores:raw_gold_block +mcl_stairs:stair_oak_bark_outer +mcl_stairs:stair_oak_bark_inner +mcl_stairs:stair_acacia +homedecor:shingle_outer_corner_asphalt +mcl_stairs:stair_acacia_outer +mcl_stairs:stair_acacia_inner +mcl_farming:soil +mcl_farming:soil_wet +mcl_stairs:slab_oak_top +mcl_stairs:slab_oak_double +homedecor:plasma_lamp_6 +mcl_panes:pane_magenta +homedecor:ground_lantern_6 +mcl_stairs:stair_acacia_bark_outer +mcl_mangrove:propagule +mcl_mangrove:mangrove_roots +homedecor:ceiling_lantern_6 +mcl_panes:pane_blue_flat +mcl_stairs:slab_oak_bark +mcl_sponges:sponge +mcl_stairs:slab_oak_bark_double +homedecor:lattice_lantern_small_6 +homedecor:desk_lamp_6 +mcl_stairs:stair_concrete_magenta +homedecor:ceiling_lamp_6 +mcl_mangrove:hanging_propagule_1 +mcl_end:purpur_block +mcl_signs:wall_sign_oak +mcl_panes:pane_blue +mcl_itemframes:frame +mcl_stairs:slab_concrete_magenta_double +homedecor:glowlight_half_7 +mcl_mangrove:water_logged_roots +mcl_mangrove:river_water_logged_roots +homedecor:chimney +mcl_panes:pane_green_flat +homedecor:doghouse +steel:plate_soft +steel:plate_rusted +homedecor:plasma_lamp_7 +mesecons_pressureplates:pressure_plate_oak_off +mcl_signs:wall_sign_dark_oak +mesecons_pressureplates:pressure_plate_oak_on +mcl_stairs:stair_concrete_blue +homedecor:hanging_lantern_7 +mcl_stairs:stair_concrete_blue_inner +mesecons_button:button_oak_off +homedecor:ceiling_lantern_7 +mcl_pottery_sherds:pot +mcl_panes:pane_green +mcl_stairs:slab_concrete_blue_top +mesecons_pressureplates:pressure_plate_dark_oak_on +steel:grate_hard +homedecor:desk_lamp_7 +mesecons_button:button_dark_oak_off +mcl_trees:stripped_mangrove +mcl_trees:tree_mangrove +mcl_panes:pane_brown_flat +mesecons_button:button_dark_oak_on +signs_road:black_left_sign +mcl_trees:wood_mangrove +mcl_flowerpots:flower_pot_sapling_dark_oak +signs_road:black_right_sign +homedecor:swing +mcl_trees:bark_stripped_mangrove +mcl_trees:bark_mangrove +mcl_stairs:stair_concrete_green_inner +signs_road:white_left_sign +steel:strut_mount +signs_road:white_right_sign +mcl_panes:pane_brown +mcl_stairs:slab_concrete_green_top +homedecor:plasma_lamp_8 +signs_road:blue_left_sign +homedecor:ground_lantern_8 +signs_road:blue_right_sign +mcl_farming:potato_1 +homedecor:hanging_lantern_8 +mcl_panes:pane_black_flat +mcl_farming:potato +homedecor:ceiling_lantern_8 +homedecor:lattice_lantern_large_8 +steel:shingle_side_roofing +homedecor:lattice_lantern_small_8 +mcl_stairs:stair_concrete_brown_outer +homedecor:desk_lamp_8 +steel:shingle_outer_corner_roofing +steel:shingle_inner_corner_roofing +homedecor:ceiling_lamp_8 +mcl_farming:potato_2 +mcl_farming:potato_3 +mcl_farming:potato_4 +mcl_farming:potato_5 +mcl_farming:potato_6 +mcl_farming:potato_7 +homedecor:standing_lamp_8 +mcl_trees:wood_jungle +homedecor:glowlight_half_9 +homedecor:glowlight_quarter_9 +mcl_trees:bark_stripped_jungle +mcl_trees:bark_jungle +mcl_beds:respawn_anchor +mcl_stairs:stair_concrete_black_outer +mesecons_torch:mesecon_torch_overheated +mesecons_torch:mesecon_torch_overheated_wall +homedecor:stonepath +homedecor:hanging_lantern_9 +mcl_fences:crimson_fence +pipeworks:tag_tube_000000 +homedecor:ceiling_lantern_9 +mcl_stairs:slab_concrete_black_top +pipeworks:tag_tube_000001 +homedecor:lattice_lantern_large_9 +pipeworks:tag_tube_000010 +homedecor:lattice_lantern_small_9 +homedecor:lattice_wood +pipeworks:tag_tube_000011 +homedecor:desk_lamp_9 +pipeworks:tag_tube_000100 +mcl_books:bookshelf +homedecor:television +pipeworks:tag_tube_000101 +homedecor:table_lamp_9 +pipeworks:tag_tube_000110 +homedecor:tv +homedecor:standing_lamp_9 +pipeworks:tag_tube_000111 +homedecor:curtain_open +pipeworks:tag_tube_001000 +mcl_doors:door_crimson_b_1 +mcl_farming:beetroot_0 +pipeworks:tag_tube_001001 +homedecor:glowlight_small_cube_10 +homedecor:lattice_white_wood_vegetal +mcl_farming:beetroot_1 +mcl_farming:beetroot_2 +pipeworks:tag_tube_001011 +mcl_farming:beetroot +pipeworks:tag_tube_001100 +pipeworks:tag_tube_001101 +pipeworks:tag_tube_001110 +homedecor:shrubbery_yellow +mcl_stairs:stair_concrete_silver +pipeworks:tag_tube_001111 +mcl_stairs:stair_concrete_silver_outer +mcl_stairs:stair_concrete_silver_inner +pipeworks:tag_tube_010000 +homedecor:shutter_colored +pipeworks:tag_tube_010001 +mcl_stairs:slab_concrete_silver +pipeworks:tag_tube_010010 +mcl_stairs:slab_concrete_silver_double +homedecor:shrubbery_red +pipeworks:tag_tube_010011 +homedecor:table_lamp_10 +pipeworks:tag_tube_010100 +homedecor:standing_lamp_10 +pipeworks:tag_tube_010101 +homedecor:glowlight_half_11 +pipeworks:tag_tube_010110 +homedecor:glowlight_quarter_11 +pipeworks:tag_tube_010111 +mcl_stairs:stair_concrete_light_blue +pipeworks:tag_tube_011000 +mcl_stairs:stair_concrete_light_blue_inner +homedecor:plasma_lamp_11 +pipeworks:tag_tube_011001 +homedecor:window_plain +homedecor:blinds_thin +pipeworks:tag_tube_011010 +mcl_farming:sweet_berry_bush_1 +mesecons_pistons:piston_down_pusher_normal +pipeworks:tag_tube_011011 +mcl_core:snowblock +pipeworks:tag_tube_011100 +mcl_farming:sweet_berry_bush_0 +mesecons_pistons:piston_down_pusher_sticky +mcl_farming:sweet_berry_bush_3 +mcl_farming:sweet_berry_bush_2 +mcl_stairs:slab_crimson_bark +pipeworks:tag_tube_011110 +mcl_stairs:slab_crimson_bark_double +pipeworks:tag_tube_011111 +pipeworks:tag_tube_100000 +mcl_stairs:stair_concrete_orange_outer +pipeworks:tag_tube_100001 +pipeworks:tag_tube_100010 +mcl_signs:wall_sign_crimson +pipeworks:tag_tube_100011 +mcl_stairs:slab_concrete_orange_top +mcl_stairs:slab_concrete_orange_double +pipeworks:tag_tube_100100 +pipeworks:tag_tube_100101 +homedecor:curtainrod_brass +pipeworks:tag_tube_100110 +mcl_lectern:lectern +pipeworks:tag_tube_100111 +homedecor:curtainrod_wrought_iron +pipeworks:tag_tube_101000 +ignore +pipeworks:tag_tube_101001 +pipeworks:lua_tube_burnt +pipeworks:tag_tube_101010 +homedecor:desk_locked +pipeworks:tag_tube_101011 +homedecor:stained_glass +mcl_stairs:slab_stone_rough_top +mcl_stairs:slab_stone_rough_double +pipeworks:tag_tube_101101 +mcl_stairs:stair_concrete_lime_inner +pipeworks:tag_tube_101110 +homedecor:calendar +pipeworks:tag_tube_101111 +mcl_stairs:slab_concrete_lime +mcl_stairs:slab_concrete_lime_top +pipeworks:tag_tube_110000 +mcl_stairs:slab_stone +mcl_stairs:slab_stone_top +mcl_stairs:slab_stone_double +mcl_blackstone:soul_torch +mcl_stairs:stair_andesite +mcl_stairs:stair_concrete_purple +mcl_stairs:stair_andesite_outer +mcl_stairs:stair_andesite_inner +mcl_stairs:stair_concrete_purple_inner +pipeworks:sand_tube_2 +mcl_stairs:slab_andesite +mcl_stairs:slab_andesite_top +mcl_stairs:slab_andesite_double +pipeworks:sand_tube_4 +pipeworks:sand_tube_5 +pipeworks:sand_tube_6 +mcl_mushrooms:red_mushroom_block_stem_full +pipeworks:sand_tube_7 +mcl_stairs:stair_granite +mcl_stairs:stair_granite_outer +mcl_stairs:stair_granite_inner +mcl_mushrooms:red_mushroom_block_cap_111111 +mcl_mushrooms:red_mushroom_block_cap_000000 +mcl_stairs:stair_concrete_grey_outer +pipeworks:sand_tube_10 +mcl_stairs:slab_granite +mcl_stairs:slab_granite_top +mcl_stairs:slab_granite_double +mcl_mushrooms:red_mushroom_block_cap_000001 +mcl_stairs:slab_concrete_grey +mcl_stairs:slab_concrete_grey_top +mcl_stairs:slab_concrete_grey_double +mcl_deepslate:deepslatecobbledwall_3 +mcl_deepslate:deepslatecobbledwall_4 +mcl_deepslate:deepslatecobbledwall_5 +mcl_deepslate:deepslatecobbledwall_6 +mcl_deepslate:deepslatecobbledwall_7 +mcl_deepslate:deepslatecobbledwall_8 +mcl_deepslate:deepslatecobbledwall_9 +mcl_deepslate:deepslatecobbledwall_10 +mcl_stairs:stair_concrete_cyan_inner +mcl_deepslate:deepslatecobbledwall_11 +mcl_mushrooms:red_mushroom_block_cap_000101 +mcl_colorblocks:concrete_powder_green +mcl_deepslate:deepslatecobbledwall_13 +mcl_colorblocks:concrete_green +mcl_deepslate:deepslatecobbledwall_14 +mcl_stairs:slab_concrete_cyan_double +mcl_mushrooms:red_mushroom_block_cap_000110 +mcl_deepslate:deepslatecobbledwall_16 +mcl_deepslate:deepslatecobbledwall_21 +mcl_mushrooms:red_mushroom_block_cap_000111 +mcl_mushrooms:red_mushroom_block_cap_001000 +mcl_mushrooms:red_mushroom_block_cap_001001 +mcl_colorblocks:hardened_clay_brown +mcl_stairs:stair_deepslate_polished_outer +mcl_stairs:stair_deepslate_polished_inner +mcl_colorblocks:concrete_powder_brown +mcl_mushrooms:red_mushroom_block_cap_001010 +mcl_colorblocks:concrete_brown +mcl_stairs:slab_deepslate_polished +mcl_stairs:slab_deepslate_polished_top +mcl_mushrooms:red_mushroom_block_cap_001011 +mcl_blackstone:soul_fire +mcl_mushrooms:red_mushroom_block_cap_001100 +mcl_deepslate:deepslatepolishedwall +mcl_mushrooms:red_mushroom_block_cap_001101 +mcl_deepslate:deepslatepolishedwall_1 +mcl_deepslate:deepslatepolishedwall_2 +mcl_mushrooms:red_mushroom_block_cap_001110 +mcl_colorblocks:hardened_clay_black +mcl_deepslate:deepslatepolishedwall_4 +mcl_colorblocks:concrete_powder_black +mcl_mushrooms:red_mushroom_block_cap_001111 +mcl_colorblocks:concrete_black +pipeworks:tag_tube_111100 +mcl_mushrooms:red_mushroom_block_cap_010000 +mcl_stairs:stair_blackstone_polished_outer +pipeworks:tag_tube_111101 +mcl_mushrooms:red_mushroom_block_cap_010001 +pipeworks:tag_tube_111110 +pipeworks:tag_tube_111111 +mcl_stairs:slab_end_stone_top +mcl_stairs:slab_end_stone_double +mcl_colorblocks:hardened_clay_red +mcl_colorblocks:concrete_powder_red +mcl_colorblocks:concrete_red +mcl_stairs:stair_stone_inner +mcl_farming:carrot +mcl_farming:carrot_7 +mcl_farming:carrot_6 +mcl_farming:carrot_5 +mcl_farming:carrot_4 +mcl_farming:carrot_3 +mcl_farming:carrot_2 +mcl_farming:carrot_1 +mcl_colorblocks:hardened_clay_silver +mcl_stairs:slab_concrete_yellow_top +mcl_stairs:slab_concrete_yellow_double +mcl_colorblocks:concrete_powder_silver +mcl_colorblocks:concrete_silver +mcl_stairs:stair_concrete_white +mcl_stairs:stair_concrete_white_outer +mcl_stairs:stair_concrete_white_inner +mcl_colorblocks:hardened_clay_light_blue +mcl_colorblocks:concrete_powder_cyan +mcl_wool:black_carpet +mcl_colorblocks:concrete_light_blue +mcl_heads:skeleton_ceiling +mcl_heads:skeleton_wall +mcl_wool:red +mcl_doors:door_mangrove_t_1 +mcl_wool:red_carpet +mcl_doors:door_mangrove_b_2 +mcl_doors:door_mangrove_t_2 +mcl_heads:wither_skeleton_ceiling +mcl_doors:trapdoor_mangrove +mcl_heads:wither_skeleton_wall +mcl_wool:silver_carpet +mcl_colorblocks:concrete_powder_orange +mcl_colorblocks:concrete_orange +mcl_wool:light_blue +mcl_doors:trapdoor_mangrove_open +mcl_wool:light_blue_carpet +mcl_stairs:stair_mangrove +mcl_stairs:stair_mangrove_outer +mcl_armor_stand:armor_stand +mcl_wool:orange_carpet +mcl_stairs:stair_mangrove_bark +mcl_stairs:stair_mangrove_bark_outer +mcl_stairs:stair_mangrove_bark_inner +mcl_colorblocks:concrete_powder_lime +mcl_colorblocks:concrete_lime +mcl_wool:lime_carpet +mesecons_delayer:delayer_on_locked +mcl_wool:purple +mcl_crimson:crimson_nylium +mcl_wool:purple_carpet +mcl_flowerpots:flower_pot_crimson_roots +homedecor:banister_brass_horizontal +mcl_flowerpots:flower_pot_crimson_fungus +mcl_crimson:crimson_fungus +mcl_wool:grey +homedecor:painting_4 +mcl_crimson:shroomlight +mcl_beds:respawn_anchor_charged_1 +mcl_wool:grey_carpet +mcl_crimson:warped_wart_block +mcl_beds:respawn_anchor_charged_2 +mcl_flowerpots:flower_pot_warped_roots +mcl_colorblocks:concrete_purple +mcl_beds:respawn_anchor_charged_3 +mcl_wool:cyan +homedecor:bathtub_clawfoot_brass_taps +mcl_beds:respawn_anchor_charged_4 +mcl_stairs:stair_goldblock +mcl_wool:cyan_carpet +pipeworks:tag_tube_101100 +mcl_crimson:twisting_vines +mcl_crimson:warped_fungus +mcl_stairs:slab_acacia +mcl_walls:stonebrickmossy_0 +mcl_doors:door_spruce_b_2 +mesecons:wire_11011101_on +mcl_walls:endbricks_9 +mcl_walls:prismarine_14 +mcl_stairs:slab_redsandstonesmooth2_top +mcl_stairs:slab_brick_block +mcl_panes:pane_pink_flat +mcl_stairs:slab_warped_double +mcl_colorblocks:hardened_clay_grey +mcl_stairs:slab_warped_top +mcl_stairs:slab_sandstone_top +mcl_colorblocks:concrete_powder_grey +mcl_stairs:stair_warped_bark_inner +mcl_colorblocks:concrete_grey +mcl_stairs:stair_warped_bark_outer +mcl_villages:crop_flower_1 +mcl_villages:crop_flower_7 +mcl_villages:crop_flower_8 +mcl_stairs:stair_lapisblock_outer +mcl_doors:trapdoor_warped_open +mcl_stairs:slab_ironblock_top +mcl_doors:door_warped_t_2 +mcl_stairs:stair_stonebrickcracked +mcl_doors:door_warped_t_1 +mcl_doors:door_warped_b_1 +mcl_fences:warped_fence_gate +mcl_fences:warped_fence_gate_open +mcl_minecarts:activator_rail_on +mcl_fences:warped_fence +mcl_trees:bark_stripped_warped +mcl_loom:loom +mcl_trees:stripped_warped +mcl_trees:bark_warped +mcl_minecarts:detector_rail_on +mcl_minecarts:detector_rail +mcl_trees:wood_warped +mcl_trees:tree_warped +pipeworks:pipe_1_empty +mesecons_button:button_jungle_on +mcl_stairs:slab_crimson_bark_top +mcl_stairs:slab_crimson_double +mcl_stairs:slab_crimson_top +mcl_stairs:slab_crimson +mcl_droppers:dropper_up +mcl_droppers:dropper_down +mcl_stairs:stair_crimson_bark_inner +pipeworks:pipe_compatibility_loaded +mcl_droppers:dropper +mcl_stairs:stair_crimson_bark_outer +mcl_minecarts:golden_rail_on +mcl_stairs:stair_crimson_bark +pipeworks:valve_on_empty +mcl_stairs:stair_crimson_inner +pipeworks:valve_off_empty +mcl_stairs:stair_crimson_outer +pipeworks:entry_panel_empty +mcl_stairs:stair_crimson +pipeworks:flow_sensor_empty +mcl_doors:trapdoor_crimson_open +pipeworks:straight_pipe_empty +mcl_doors:trapdoor_crimson +pipeworks:valve_on_loaded +mcl_doors:door_crimson_t_2 +pipeworks:entry_panel_loaded +mcl_doors:door_crimson_b_2 +pipeworks:flow_sensor_loaded +mcl_doors:door_crimson_t_1 +pipeworks:straight_pipe_loaded +mcl_fences:crimson_fence_gate +mcl_fences:crimson_fence_gate_open +homedecor:medicine_cabinet +homedecor:shower_head +homedecor:banister_wood_diagonal_left_malachite +mcl_observers:observer_up_off +mcl_observers:observer_up_on +mcl_observers:observer_down_off +mcl_observers:observer_down_on +pipeworks:pipe_2_empty +homedecor:banister_wood_horizontal_lime +pipeworks:pipe_2_loaded +mcl_doors:door_cherry_blossom_t_2 +homedecor:shower_tray +mcl_doors:trapdoor_cherry_blossom +mcl_observers:observer_on +pipeworks:pipe_3_loaded +mcl_stairs:slab_deepslate_bricks_cracked_double +mcl_stairs:slab_deepslate_bricks_cracked_top +mcl_stairs:slab_deepslate_bricks_cracked +pipeworks:pipe_4_empty +mcl_cake:cake_4 +pipeworks:pipe_4_loaded +mcl_cake:cake_5 +mcl_cake:cake_6 +mcl_cake:cake +mcl_doors:trapdoor_cherry_blossom_open +mcl_trees:bark_stripped_oak +pipeworks:pipe_5_loaded +mcl_blackstone:wall +mcl_blackstone:wall_21 +mcl_stairs:stair_cherry_blossom +pipeworks:pipe_6_empty +mcl_stairs:stair_cherry_blossom_outer +mcl_stairs:stair_cherry_blossom_inner +mcl_core:cobble +mcl_stairs:stair_end_bricks_inner +mcl_stairs:slab_end_bricks +pipeworks:pipe_7_empty +pipeworks:mese_tube_000000 +pipeworks:pipe_7_loaded +mcl_stairs:stair_cherry_blossom_bark +mcl_signs:wall_sign_jungle +mcl_stairs:stair_cherry_blossom_bark_outer +mcl_stairs:stair_cherry_blossom_bark_inner +mcl_blackstone:wall_13 +pipeworks:pipe_8_loaded +pipeworks:mese_tube_000010 +mcl_blackstone:wall_12 +mcl_blackstone:wall_11 +pipeworks:pipe_9_empty +mcl_panes:pane_pink +mcl_stairs:slab_cherry_blossom +mcl_stairs:slab_cherry_blossom_top +mcl_stairs:slab_cherry_blossom_double +mcl_blackstone:wall_9 +pipeworks:mese_tube_000100 +mcl_blackstone:wall_8 +pipeworks:pipe_10_loaded +mcl_blackstone:wall_7 +mcl_stairs:stair_acacia_bark_inner +pipeworks:mese_tube_000101 +mcl_walls:mudbrick_11 +mcl_walls:mudbrick_9 +mcl_walls:mudbrick_3 +mcl_walls:rednetherbrick_9 +pipeworks:mese_tube_000110 +mcl_stairs:slab_cherry_blossom_bark +mcl_stairs:slab_cherry_blossom_bark_top +mcl_stairs:slab_cherry_blossom_bark_double +mcl_blackstone:wall_1 +pipeworks:mese_tube_000111 +mcl_blackstone:wall_0 +mcl_stairs:slab_blackstone_brick_polished_double +mcl_stairs:slab_blackstone_brick_polished_top +pipeworks:mese_tube_001000 +mcl_stairs:slab_blackstone_brick_polished +mcl_stairs:stair_oak +mcl_stairs:stair_blackstone_brick_polished_outer +mcl_stairs:stair_blackstone_brick_polished +pipeworks:mese_tube_001001 +mcl_stairs:slab_blackstone_polished_double +mcl_stairs:slab_blackstone_polished_top +mcl_stairs:stair_blackstone_polished_inner +mcl_stairs:stair_blackstone_polished +pipeworks:mese_tube_001010 +mcl_stairs:slab_blackstone_double +homedecor:skylight_frosted +mcl_stairs:slab_blackstone_top +mcl_stairs:slab_blackstone +pipeworks:mese_tube_001011 +mcl_stairs:stair_blackstone_inner +mcl_stairs:stair_blackstone_outer +mcl_stairs:stair_andesite_smooth_outer +mcl_sponges:sponge_wet +pipeworks:mese_tube_001100 +mcl_blackstone:quartz_brick +mcl_blackstone:blackstone_polished +mcl_blackstone:basalt +mcl_blackstone:basalt_polished +pipeworks:mese_tube_001101 +mcl_blackstone:blackstone +mcl_stairs:slab_concrete_cyan_top +mcl_stairs:slab_concrete_cyan +mcl_stairs:stair_concrete_cyan_outer +pipeworks:mese_tube_001110 +mcl_stairs:stair_concrete_cyan +mcl_stairs:stair_concrete_grey_inner +mcl_stairs:stair_concrete_grey +homedecor:shingles_wood +pipeworks:mese_tube_001111 +mcl_villages:crop_gourd_2 +mcl_villages:crop_gourd_1 +mcl_stairs:slab_concrete_purple_double +pipeworks:mese_tube_010000 +mcl_stairs:slab_concrete_purple_top +mcl_stairs:slab_concrete_purple +mcl_stairs:stair_concrete_purple_outer +mcl_stairs:slab_concrete_lime_double +pipeworks:mese_tube_010001 +mcl_stairs:stair_concrete_lime_outer +lavalamp:lavalamp +mcl_stairs:stair_concrete_lime +mcl_stairs:slab_concrete_orange +pipeworks:mese_tube_010010 +mcl_stairs:stair_concrete_orange_inner +mcl_stairs:stair_concrete_orange +mcl_stairs:slab_concrete_light_blue_double +lavalamp:lavalamp_off +pipeworks:mese_tube_010011 +mcl_stairs:slab_concrete_light_blue_top +mcl_stairs:slab_concrete_light_blue +mcl_stairs:stair_concrete_light_blue_outer +mcl_stairs:slab_concrete_silver_top +pipeworks:mese_tube_010100 +mcl_stairs:slab_concrete_red_double +mcl_stairs:slab_concrete_red_top +mcl_stairs:slab_concrete_red +mcl_stairs:stair_concrete_red_inner +pipeworks:mese_tube_010101 +homedecor:plasma_ball_off +mcl_stairs:stair_concrete_red_outer +mcl_stairs:stair_concrete_red +mcl_stairs:slab_concrete_black_double +pipeworks:mese_tube_010110 +mcl_stairs:slab_concrete_black +mesecons_pressureplates:pressure_plate_stone_off +mcl_stairs:stair_concrete_black_inner +mesecons_pressureplates:pressure_plate_stone_on +pipeworks:mese_tube_010111 +mcl_stairs:stair_concrete_black +mcl_stairs:slab_concrete_brown_double +mcl_stairs:slab_concrete_brown_top +mesecons_pressureplates:pressure_plate_polished_blackstone_off +pipeworks:mese_tube_011000 +mesecons_pressureplates:pressure_plate_polished_blackstone_on +mcl_stairs:slab_concrete_brown +pipeworks:tube_compatibility +mcl_stairs:stair_concrete_brown_inner +pipeworks:mese_tube_011001 +mcl_stairs:stair_concrete_brown +mcl_stairs:slab_concrete_green_double +mcl_stairs:slab_concrete_green +mcl_stairs:stair_concrete_green_outer +pipeworks:mese_tube_011010 +mcl_stairs:stair_concrete_green +mcl_stairs:slab_concrete_blue_double +mcl_stairs:slab_concrete_blue +mcl_stairs:stair_concrete_blue_outer +pipeworks:mese_tube_011011 +mcl_stairs:slab_concrete_magenta_top +mcl_stairs:slab_concrete_magenta +homedecor:wall_sconce +mcl_walls:redsandstone_2 +pipeworks:mese_tube_011100 +mcl_walls:redsandstone_3 +mcl_stairs:stair_concrete_magenta_inner +mcl_walls:redsandstone_4 +mcl_stairs:stair_concrete_magenta_outer +mcl_walls:redsandstone_5 +mcl_stairs:slab_concrete_pink_double +mcl_walls:redsandstone_6 +mcl_stairs:slab_concrete_pink_top +mcl_walls:redsandstone_7 +mcl_stairs:stair_redsandstone_outer +mcl_walls:redsandstone_8 +pipeworks:steel_block_embedded_tube +mcl_walls:redsandstone_9 +mcl_stairs:slab_concrete_pink +mcl_walls:redsandstone_10 +mcl_stairs:stair_concrete_pink_inner +mcl_walls:redsandstone_11 +mcl_stairs:slab_redsandstone_top +mcl_walls:redsandstone_12 +mcl_stairs:stair_concrete_pink_outer +mcl_walls:redsandstone_13 +mcl_stairs:stair_concrete_pink +mcl_walls:redsandstone_14 +mcl_stairs:slab_concrete_white_double +mcl_walls:redsandstone_15 +mcl_stairs:slab_concrete_white_top +mcl_walls:redsandstone_16 +pipeworks:mese_tube_100010 +mcl_walls:redsandstone_21 +mcl_stairs:stair_redsandstonesmooth2 +mcl_stairs:slab_concrete_white +mcl_stairs:stair_redsandstonesmooth2_outer +mcl_stairs:stair_redsandstonesmooth2_inner +mcl_walls:stonebrick_0 +mcl_stairs:slab_concrete_yellow +mcl_walls:stonebrick_1 +mcl_stairs:stair_concrete_yellow_inner +mcl_walls:stonebrick_2 +mcl_stairs:slab_redsandstonesmooth2 +mcl_walls:stonebrick_3 +mcl_stairs:slab_redsandstonesmooth2_double +mcl_walls:stonebrick_4 +homedecor:welcome_mat_green +mcl_walls:stonebrick_5 +mcl_stairs:stair_concrete_yellow_outer +mcl_walls:stonebrick_6 +homedecor:welcome_mat_brown +mcl_walls:stonebrick_7 +mcl_stairs:stair_concrete_yellow +mcl_walls:stonebrick_8 +homedecor:welcome_mat_grey +mcl_walls:stonebrick_9 +pipeworks:lua_tube100000 +mcl_walls:stonebrick_10 +mcl_stairs:stair_redsandstonesmooth_inner +mcl_walls:stonebrick_11 +mcl_stairs:stair_stone_outer +mcl_walls:stonebrick_12 +mcl_core:slimeblock +mcl_walls:stonebrick_13 +mcl_stairs:slab_redsandstonesmooth +mcl_walls:stonebrick_14 +mcl_stairs:slab_redsandstonesmooth_double +mcl_walls:stonebrick_15 +mcl_chests:ender_chest +mcl_walls:stonebrick_16 +mesecons_commandblock:commandblock_off +mcl_walls:stonebrick_21 +mcl_portals:portal +mcl_portals:end_portal_frame +mcl_enchanting:table +mcl_jukebox:jukebox +mcl_banners:hanging_banner +mcl_banners:standing_banner +mcl_beehives:bee_nest +mcl_walls:stonebrickmossy_2 +mcl_compass:lodestone +mcl_walls:stonebrickmossy_3 +mcl_sculk:catalyst +mcl_furnaces:furnace_active +mcl_blast_furnace:blast_furnace +mcl_blast_furnace:blast_furnace_active +mcl_smoker:smoker +mcl_smoker:smoker_active +mcl_stairs:slab_stonebrick_double +mcl_walls:stonebrickmossy_7 +mcl_stairs:stair_stone +mcl_walls:stonebrickmossy_8 +pipeworks:lua_tube101000 +mcl_walls:stonebrickmossy_9 +mcl_stairs:slab_end_stone +mcl_walls:stonebrickmossy_10 +mcl_barrels:barrel_open +mcl_walls:stonebrickmossy_11 +mcl_stairs:stair_end_stone_inner +mcl_walls:stonebrickmossy_12 +mcl_stairs:stair_end_stone_outer +mcl_walls:stonebrickmossy_13 +mcl_chests:chest_small +mcl_walls:stonebrickmossy_14 +mcl_chests:chest_right +mcl_walls:stonebrickmossy_15 +mcl_chests:trapped_chest_small +mcl_walls:stonebrickmossy_16 +mcl_chests:trapped_chest_right +mcl_walls:stonebrickmossy_21 +mcl_stairs:stair_end_stone +mcl_stairs:slab_deepslate_tiles_cracked_double +mcl_stairs:slab_deepslate_tiles_cracked +mcl_trees:leaves_mangrove +mcl_campfires:campfire +mcl_campfires:campfire_lit +mcl_walls:prismarine_1 +mcl_campfires:soul_campfire_lit +mcl_walls:prismarine_2 +mcl_stairs:stair_deepslate_tiles_cracked_inner +mcl_walls:prismarine_3 +pipeworks:broken_tube_3 +mcl_fences:mangrove_fence +mcl_stairs:stair_deepslate_tiles_cracked_outer +mcl_fences:mangrove_fence_gate +mcl_fences:mangrove_fence_gate_open +mcl_walls:prismarine_6 +mcl_colorblocks:glazed_terracotta_orange +mcl_walls:prismarine_7 +mcl_colorblocks:glazed_terracotta_green +mcl_walls:prismarine_8 +mcl_colorblocks:glazed_terracotta_purple +mcl_walls:prismarine_9 +mcl_colorblocks:glazed_terracotta_blue +mcl_walls:prismarine_10 +mcl_colorblocks:glazed_terracotta_white +mcl_walls:prismarine_11 +mcl_colorblocks:glazed_terracotta_silver +mcl_walls:prismarine_12 +mcl_colorblocks:glazed_terracotta_brown +mcl_walls:prismarine_13 +mcl_colorblocks:glazed_terracotta_pink +mcl_bamboo:bamboo +mcl_bamboo:bamboo_endcap +mcl_bamboo:bamboo_1 +mcl_bamboo:bamboo_2 +mcl_bamboo:bamboo_3 +mcl_stairs:stair_deepslate_tiles_cracked +mcl_bamboo:scaffolding +mcl_beds:bed_black_top +mcl_beds:bed_black_bottom +mcl_beds:bed_blue_top +mcl_beds:bed_blue_bottom +mcl_beds:bed_brown_top +mcl_beds:bed_brown_bottom +mcl_beds:bed_cyan_top +mcl_beds:bed_cyan_bottom +mcl_beds:bed_green_top +mcl_beds:bed_green_bottom +mcl_beds:bed_grey_top +mcl_walls:endbricks_4 +mcl_beds:bed_light_blue_top +mcl_walls:endbricks_5 +mcl_beds:bed_lime_top +mcl_beds:bed_lime_bottom +mcl_beds:bed_magenta_top +mcl_walls:endbricks_7 +mcl_beds:bed_orange_top +mcl_beds:bed_orange_bottom +mcl_beds:bed_pink_top +mcl_beds:bed_pink_bottom +mcl_beds:bed_purple_top +mcl_beds:bed_purple_bottom +mcl_beds:bed_red_top +mcl_beds:bed_red_bottom +mcl_beds:bed_silver_top +mcl_beds:bed_silver_bottom +mcl_deepslate:tuff +mcl_beds:bed_white_bottom +mcl_beds:bed_yellow_top +mcl_beds:bed_yellow_bottom +mcl_core:cactus +mcl_core:reeds +mcl_core:vine +mcl_cake:cake_1 +mcl_cake:cake_2 +mcl_cake:cake_3 +mesecons:wire_01010001_on +mesecons:wire_01010001_off +pipeworks:digiline_filter +mcl_farming:pumpkin_face +mcl_farming:pumpkin_face_light +mcl_farming:pumpkin +mcl_farming:melon +mcl_end:chorus_plant +mcl_core:cobweb +mcl_cocoas:cocoa_1 +mcl_cocoas:cocoa_2 +mesecons:wire_11010001_on +mesecons:wire_11010001_off +mcl_stairs:stair_deepslate_bricks_cracked_inner +mcl_stairs:stair_deepslate_bricks_cracked_outer +mcl_stairs:stair_deepslate_bricks_cracked +mcl_doors:iron_door_t_1 +mcl_doors:iron_door_b_1 +mcl_doors:iron_door_t_2 +mcl_doors:iron_door_b_2 +mcl_stairs:slab_stonebrickcracked_double +pipeworks:lua_tube001110 +mesecons:wire_00110001_on +mesecons:wire_00110001_off +mcl_stairs:slab_stonebrickcracked_top +pipeworks:lua_tube101110 +mcl_stairs:slab_stonebrickcracked +pipeworks:lua_tube011110 +mcl_stairs:stair_stonebrickcracked_inner +pipeworks:lua_tube111110 +mcl_stairs:slab_jungle +pipeworks:lua_tube000001 +mcl_doors:door_warped_b_2 +mesecons:wire_10110001_on +mesecons:wire_10110001_off +mcl_stairs:slab_ironblock_double +mcl_doors:trapdoor_warped +mesecons:wire_11111000_on +mesecons:wire_11111000_off +mcl_stairs:slab_ironblock +mcl_stairs:stair_ironblock_inner +mcl_stairs:stair_ironblock_outer +mcl_stairs:stair_ironblock +mcl_stairs:stair_bamboo_bark_inner +mcl_stairs:slab_goldblock_top +mcl_stairs:stair_bamboo_bark +mcl_stairs:stair_goldblock_inner +mcl_stairs:stair_goldblock_outer +mesecons:wire_01000100_on +mesecons:wire_01000100_off +mcl_crimson:nether_sprouts +mcl_stairs:slab_lapisblock_double +mcl_stairs:slab_lapisblock +mcl_stairs:stair_warped +mcl_stairs:stair_lapisblock +mcl_stairs:stair_warped_outer +mcl_stairs:stair_warped_inner +pipeworks:detector_tube_on_10 +mcl_villages:crop_flower_5 +mesecons:wire_11000100_on +mesecons:wire_11000100_off +pipeworks:detector_tube_off_4 +mcl_villages:crop_flower_3 +mcl_stairs:stair_warped_bark +mcl_villages:crop_tree_8 +pipeworks:conductor_tube_off_2 +mcl_villages:crop_tree_6 +mcl_villages:crop_tree_5 +pipeworks:conductor_tube_off_6 +pipeworks:conductor_tube_off_8 +mesecons:wire_01100100_on +mesecons:wire_01100100_off +pipeworks:conductor_tube_on_3 +pipeworks:steel_pane_embedded_tube +mcl_crimson:weeping_vines +mcl_villages:crop_bush_7 +pipeworks:nodebreaker_off +mcl_villages:crop_bush_6 +mcl_ocean:dried_kelp_block +pipeworks:nodebreaker_on +mcl_villages:crop_bush_5 +mesecons:wire_11100100_on +mesecons:wire_11100100_off +mcl_villages:crop_bush_4 +mcl_villages:crop_bush_3 +mcl_villages:crop_bush_2 +mcl_villages:crop_bush_1 +pipeworks:teleport_tube_9 +mcl_deepslate:deepslatetileswall_3 +mcl_villages:crop_gourd_6 +pipeworks:lua_tube011000 +pipeworks:lua_tube100100 +mesecons:wire_01010100_on +mesecons:wire_01010100_off +pipeworks:lua_tube001100 +pipeworks:deployer_on +mcl_villages:crop_root_8 +pipeworks:lua_tube101010 +mcl_villages:crop_root_6 +pipeworks:dispenser_off +mcl_villages:crop_root_5 +pipeworks:lua_tube110110 +mcl_villages:crop_root_3 +mesecons:wire_11010100_on +mesecons:wire_11010100_off +mcl_villages:crop_root_2 +mcl_villages:crop_root_1 +pipeworks:lua_tube011011 +mcl_villages:crop_grain_7 +mcl_villages:crop_grain_6 +pipeworks:lua_tube110111 +pipeworks:sand_tube_1 +mcl_villages:crop_grain_3 +mcl_villages:crop_grain_2 +mesecons:wire_01110100_on +mesecons:wire_01110100_off +mcl_villages:crop_grain_1 +mcl_villages:path_endpoint +mcl_villages:no_paths +mcl_villages:building_block +homedecor:pole_brass +mcl_crimson:crimson_roots +mcl_crimson:warped_roots +mcl_trees:stripped_crimson +mcl_trees:tree_crimson +mesecons:wire_11110100_on +mesecons:wire_11110100_off +homedecor:taps_brass +homedecor:taps +mcl_trees:wood_crimson +mcl_walls:stonebrickmossy_6 +homedecor:toilet_open +mcl_trees:leaves_spruce_orphan +homedecor:toilet +mcl_trees:bark_stripped_crimson +mcl_trees:bark_crimson +mesecons:wire_11001100_on +mesecons:wire_11001100_off +homedecor:banister_wood_diagonal_left_rose +homedecor:desk_lamp_11 +homedecor:banister_wood_diagonal_left_fuchsia +mcl_fences:spruce_fence +homedecor:ceiling_lamp_11 +mcl_fences:spruce_fence_gate +mcl_fences:spruce_fence_gate_open +homedecor:bathroom_tiles_dark +homedecor:table_lamp_11 +mesecons:wire_11101100_on +mesecons:wire_11101100_off +homedecor:standing_lamp_11 +homedecor:radiator +homedecor:space_heater +homedecor:ceiling_fan +homedecor:glowlight_half_12 +homedecor:air_conditioner +homedecor:glowlight_quarter_12 +homedecor:alarm_clock +homedecor:glowlight_small_cube_12 +mesecons:wire_11011100_on +mesecons:wire_11011100_off +homedecor:shrubbery_green +mcl_doors:door_spruce_b_1 +homedecor:plasma_lamp_12 +homedecor:shrubbery_large_green +homedecor:shrubbery_large_red +homedecor:ground_lantern_12 +mcl_doors:door_spruce_t_1 +homedecor:shrubbery_large_yellow +homedecor:hanging_lantern_12 +mesecons:wire_11111100_on +mesecons:wire_11111100_off +homedecor:ceiling_lantern_12 +mcl_doors:door_spruce_t_2 +homedecor:well +mcl_doors:trapdoor_spruce +homedecor:swing_rope +homedecor:lattice_wood_vegetal +homedecor:lattice_lantern_small_12 +homedecor:lattice_white_wood +homedecor:barbecue +mesecons:wire_00100010_on +mesecons:wire_00100010_off +homedecor:paper_towel +homedecor:ceiling_lamp_12 +mcl_flowerpots:flower_pot_sapling_oak +homedecor:copper_pans +mcl_doors:trapdoor_spruce_open +homedecor:table_lamp_12 +homedecor:kitchen_cabinet_colored_with_sink +homedecor:kitchen_cabinet_colored_with_sink_locked +homedecor:standing_lamp_12 +mesecons:wire_10100010_on +mesecons:wire_10100010_off +mcl_stairs:stair_spruce_outer +mcl_stairs:stair_spruce_inner +mcl_walls:sandstone_11 +homedecor:glowlight_quarter_13 +homedecor:kitchen_cabinet_colorable_with_sink_locked +homedecor:glowlight_small_cube_13 +homedecor:kitchen_cabinet_colored_half +homedecor:kitchen_cabinet_colored_half_locked +mcl_stairs:stair_spruce_bark +mesecons:wire_01100010_on +mesecons:wire_01100010_off +mcl_stairs:stair_spruce_bark_inner +homedecor:kitchen_cabinet_colorable_half +homedecor:ground_lantern_13 +homedecor:kitchen_cabinet_colorable_half_locked +mcl_lightning_rods:rod +homedecor:hanging_lantern_13 +homedecor:kitchen_cabinet_colored_with_drawers_steel +mcl_lightning_rods:rod_powered +mcl_stairs:slab_spruce +mesecons:wire_11100010_on +mesecons:wire_11100010_off +homedecor:lattice_lantern_large_13 +homedecor:kitchen_cabinet_colored_with_drawers_steel_locked +mcl_farming:melontige_1 +homedecor:lattice_lantern_small_13 +homedecor:kitchen_cabinet_colorable_with_drawers_steel +homedecor:kitchen_cabinet_colorable_with_drawers_steel_locked +homedecor:desk_lamp_13 +homedecor:kitchen_cabinet_colored_steel +homedecor:kitchen_cabinet_colored_steel_locked +mesecons:wire_00110010_on +mesecons:wire_00110010_off +homedecor:kitchen_cabinet_colorable_steel +mcl_stairs:slab_spruce_bark +mcl_stairs:slab_spruce_bark_top +mcl_stairs:slab_spruce_bark_double +homedecor:kitchen_cabinet_colorable_steel_locked +homedecor:standing_lamp_13 +homedecor:kitchen_cabinet_colored_with_drawers_marble_locked +homedecor:kitchen_cabinet_colorable_with_drawers_marble +homedecor:kitchen_cabinet_colored_marble +homedecor:kitchen_cabinet_colored_marble_locked +homedecor:kitchen_cabinet_colorable_with_drawers_granite_locked +homedecor:kitchen_cabinet_colored_granite_locked +mcl_farming:melontige_unconnect +mcl_farming:melontige_2 +mcl_farming:melontige_3 +mcl_farming:melontige_4 +mcl_farming:melontige_5 +mcl_farming:melontige_6 +mcl_farming:melontige_7 +homedecor:wood_table_large_square_with_wrought_iron_legs +homedecor:kitchen_cabinet_colorable_granite +homedecor:kitchen_cabinet_colored_with_drawers +homedecor:kitchen_cabinet_colored_with_drawers_locked +homedecor:wood_table_large_square_with_wood_legs +homedecor:kitchen_cabinet_colorable_with_drawers +homedecor:kitchen_cabinet_colored +mesecons:wire_01110010_on +mesecons:wire_01110010_off +mesecons_pressureplates:pressure_plate_spruce_on +pipeworks:lua_tube111000 +mesecons_button:button_spruce_off +mcl_fences:oak_fence +homedecor:dishwasher_wood +mesecons_button:button_spruce_on +mesecons:wire_11110010_on +mesecons:wire_11110010_off +mcl_wool:pink_carpet +homedecor:wood_table_small_square_with_wood_legs +mcl_flowerpots:flower_pot_sapling_spruce +homedecor:dishwasher_steel +mcl_walls:sandstone_12 +homedecor:microwave_oven +homedecor:microwave_oven_locked +mcl_stairs:stair_mangrove_inner +homedecor:oven_steel_active_locked +mesecons:wire_10101010_on +mesecons:wire_10101010_off +homedecor:lattice_lantern_small_14 +homedecor:desk_lamp_14 +homedecor:ceiling_lamp_14 +homedecor:wood_table_small_round_with_wrought_iron_legs +homedecor:standing_lamp_14 +homedecor:oven_steel +mcl_mangrove:propagule_mud +homedecor:wood_table_small_round_with_wood_legs +mcl_walls:mudbrick_0 +mcl_chests:yellow_shulker_box_small +homedecor:oven +mcl_farming:melontige_linked_r +mcl_farming:melontige_linked_l +mcl_farming:melontige_linked_t +mcl_farming:melontige_linked_b +homedecor:oven_locked +homedecor:refrigerator_white +mcl_heads:zombie +homedecor:refrigerator_steel +mcl_flowers:peony_top +homedecor:torch_wall +lrfurn:endtable +homedecor:chandelier_brass +mcl_cocoas:cocoa_3 +mcl_dispensers:dispenser_up +mcl_dispensers:dispenser_down +mcl_doors:trapdoor_oak_open +mcl_dispensers:dispenser +homedecor:chain_steel_top +mcl_trees:stripped_acacia +homedecor:oil_lamp_tabletop +mcl_walls:brick_9 +mcl_walls:brick_7 +homedecor:candlestick_wrought_iron +mcl_trees:wood_acacia +lrfurn:coffeetable +homedecor:candle_thin +mcl_deepslate:deepslate_with_lapis +homedecor:glowlight_half_0 +mcl_trees:bark_stripped_acacia +mcl_trees:bark_acacia +homedecor:wall_lamp_on +homedecor:glowlight_quarter_0 +mcl_colorblocks:hardened_clay_purple +mcl_signs:standing_sign_acacia +homedecor:plasma_ball_on +homedecor:wall_lamp_off +homedecor:glowlight_small_cube_0 +mcl_trees:leaves_birch_orphan +homedecor:rope_light_on_floor_off +homedecor:table_lamp_14 +homedecor:plasma_lamp_0 +mcl_walls:endbricks_3 +mcl_walls:endbricks_2 +homedecor:hanging_lantern_14 +homedecor:ground_lantern_0 +mcl_walls:prismarine_15 +homedecor:plasma_lamp_14 +mcl_panes:pane_black +mcl_anvils:anvil +mcl_anvils:anvil_damage_1 +mcl_trees:stripped_jungle +mcl_stairs:stair_spruce +homedecor:ceiling_lantern_0 +homedecor:table_lamp_13 +homedecor:ceiling_lamp_13 +homedecor:ceiling_lantern_13 +homedecor:plasma_lamp_13 +homedecor:lattice_lantern_large_0 +lrfurn:longsofa +homedecor:glowlight_half_13 +homedecor:desk_lamp_12 +homedecor:lattice_lantern_large_12 +homedecor:lattice_lantern_small_11 +homedecor:lattice_lantern_small_0 +homedecor:lattice_lantern_large_11 +homedecor:ceiling_lantern_11 +homedecor:hanging_lantern_11 +homedecor:desk_lamp_0 +homedecor:ground_lantern_11 +homedecor:glowlight_small_cube_11 +homedecor:ceiling_lamp_10 +homedecor:ceiling_lamp_0 +homedecor:desk_lamp_10 +homedecor:lattice_lantern_small_10 +homedecor:lattice_lantern_large_10 +homedecor:ceiling_lantern_10 +homedecor:table_lamp_0 +homedecor:hanging_lantern_10 +homedecor:ground_lantern_10 +homedecor:plasma_lamp_10 +homedecor:painting_16 +homedecor:standing_lamp_0 +homedecor:glowlight_quarter_10 +homedecor:glowlight_half_10 +homedecor:ceiling_lamp_9 +homedecor:ground_lantern_9 +fake_fire:ice_fire +homedecor:painting_17 +homedecor:plasma_lamp_9 +homedecor:glowlight_small_cube_9 +homedecor:glowlight_quarter_1 +homedecor:table_lamp_8 +homedecor:glowlight_small_cube_8 +homedecor:glowlight_quarter_8 +homedecor:painting_18 +homedecor:glowlight_half_8 +homedecor:standing_lamp_7 +homedecor:table_lamp_7 +homedecor:ceiling_lamp_7 +homedecor:lattice_lantern_small_7 +fake_fire:embers +homedecor:painting_19 +homedecor:lattice_lantern_large_7 +homedecor:ground_lantern_1 +homedecor:ground_lantern_7 +homedecor:glowlight_small_cube_7 +homedecor:hanging_lantern_1 +homedecor:painting_20 +homedecor:glowlight_quarter_7 +homedecor:ceiling_lantern_1 +homedecor:standing_lamp_6 +homedecor:table_lamp_6 +homedecor:lattice_lantern_large_6 +homedecor:lattice_lantern_large_1 +homedecor:hanging_lantern_6 +homedecor:glowlight_small_cube_6 +homedecor:glowlight_quarter_6 +homedecor:glowlight_half_6 +mcl_cherry_blossom:pink_petals +mcl_colorblocks:glazed_terracotta_yellow +mcl_walls:sandstone_5 +homedecor:desk_lamp_1 +fake_fire:chimney_top_stone +homedecor:ceiling_lamp_5 +mcl_trees:leaves_cherry_blossom +homedecor:desk_lamp_5 +homedecor:lattice_lantern_small_5 +homedecor:lattice_lantern_large_5 +homedecor:table_lamp_1 +homedecor:ceiling_lantern_5 +mesecons_delayer:delayer_on_3 +homedecor:standing_lamp_1 +mcl_doors:door_jungle_t_2 +mcl_doors:trapdoor_jungle +mcl_flowers:azure_bluet +homedecor:glowlight_half_2 +homedecor:washing_machine +homedecor:glowlight_quarter_2 +mcl_fire:eternal_fire +homedecor:dryer +homedecor:glowlight_half_5 +homedecor:standing_lamp_4 +homedecor:ironing_board +mcl_beds:bed_white_top +mcl_trees:stripped_cherry_blossom +mcl_trees:tree_cherry_blossom +mcl_trees:tree_birch +mcl_trees:tree_jungle +homedecor:hanging_lantern_2 +mcl_stairs:stair_bamboo_outer +mcl_trees:wood_cherry_blossom +homedecor:ceiling_lantern_2 +mcl_chests:trapped_chest_on_small +mcl_monster_eggs:monster_egg_cobble +homedecor:lattice_lantern_large_2 +mcl_trees:bark_stripped_cherry_blossom +mcl_trees:bark_cherry_blossom +mcl_chests:trapped_chest_on_right +homedecor:inbox +mcl_stairs:stair_jungle_bark_inner +homedecor:desk_lamp_2 +mcl_stairs:stair_deepslate_cobbled +homedecor:ground_lantern_4 +homedecor:ceiling_lamp_2 +homedecor:plasma_lamp_4 +homedecor:glowlight_small_cube_4 +homedecor:glowlight_quarter_4 +homedecor:table_lamp_2 +homedecor:banister_wood_horizontal_fuchsia +homedecor:standing_lamp_3 +homedecor:standing_lamp_2 +homedecor:table_lamp_3 +pipeworks:tube_4 +homedecor:pole_wrought_iron +homedecor:glowlight_half_3 +mesecons:wire_11101010_off +homedecor:lattice_lantern_small_3 +homedecor:bars +homedecor:lattice_lantern_large_3 +homedecor:glowlight_quarter_3 +mcl_trees:leaves_cherry_blossom_orphan +homedecor:glowlight_small_cube_3 +homedecor:ceiling_lamp_1 +homedecor:ground_lantern_2 +homedecor:plasma_lamp_3 +homedecor:lattice_lantern_small_2 +homedecor:L_binding_bars +homedecor:ground_lantern_3 +homedecor:chains +mcl_fences:cherry_blossom_fence +homedecor:hanging_lantern_3 +homedecor:plasma_lamp_2 +homedecor:glowlight_small_cube_2 +homedecor:ceiling_lantern_3 +homedecor:lattice_lantern_small_1 +homedecor:plasma_lamp_1 +mesecons_noteblock:noteblock +homedecor:glowlight_small_cube_1 +homedecor:glowlight_half_1 +mcl_fences:cherry_blossom_fence_gate +mcl_fences:cherry_blossom_fence_gate_open +homedecor:hanging_lantern_0 +homedecor:desk_lamp_3 +mesecons:wire_10010001_on +homedecor:japanese_wall_top +homedecor:ceiling_lamp_3 +homedecor:tatami_mat +homedecor:spiral_staircase +homedecor:banister_wrought_iron_horizontal +mcl_deepslate:deepslate +homedecor:bathtub_clawfoot_chrome_taps +homedecor:banister_white_dark_horizontal +homedecor:wall_shelf +homedecor:banister_wood_horizontal_grey +homedecor:banister_wood_horizontal_crimson +homedecor:banister_wood_horizontal_rose +homedecor:glowlight_half_4 +homedecor:toaster_loaf +mcl_doors:door_cherry_blossom_b_1 +homedecor:banister_wood_horizontal_violet +homedecor:toaster +homedecor:bottle_green +homedecor:bottle_brown +mcl_doors:door_cherry_blossom_t_1 +homedecor:4_bottles_green +homedecor:4_bottles_multi +mcl_doors:door_cherry_blossom_b_2 +homedecor:banister_wood_horizontal_indigo +homedecor:coffee_maker +homedecor:banister_wood_horizontal_cyan +homedecor:banister_wood_horizontal_turquoise +homedecor:banister_wood_horizontal_malachite +homedecor:cutlery_set +homedecor:banister_wood_horizontal_harlequin +homedecor:sink +homedecor:banister_wood_horizontal_amber +homedecor:banister_wood_horizontal_orange +homedecor:banister_wood_horizontal_vermilion +homedecor:banister_wood_horizontal_red +pipeworks:mese_tube_110011 +mcl_farming:pumpkin_1 +homedecor:banister_wood_diagonal_right_indigo +homedecor:banister_wood_diagonal_right_cyan +homedecor:banister_wood_diagonal_right_turquoise +homedecor:banister_wood_diagonal_right_malachite +homedecor:banister_wood_diagonal_right_yellow +homedecor:banister_wood_diagonal_right +homedecor:banister_wrought_iron_diagonal_left +homedecor:banister_brass_diagonal_left +homedecor:banister_white_dark_diagonal_left +homedecor:banister_wood_diagonal_left_crimson +homedecor:bathroom_tiles_light +homedecor:bathroom_tiles_medium +mcl_core:goldblock +homedecor:banister_wood_diagonal_left_mulberry +mcl_core:clay +homedecor:banister_wood_diagonal_left_violet +mcl_core:packed_ice +homedecor:banister_wood_diagonal_left_blue +mcl_core:bone_block +homedecor:banister_wood_diagonal_left_cerulean +mcl_core:ironblock +homedecor:banister_wood_diagonal_left_turquoise +homedecor:towel_rod +mcl_core:emeraldblock +homedecor:banister_wood_diagonal_left_green +homedecor:banister_wood_diagonal_left_harlequin +homedecor:banister_wood_diagonal_left_amber +mcl_farming:pumpkintige_unconnect +mcl_farming:pumpkin_2 +mcl_farming:pumpkin_3 +mcl_farming:pumpkin_4 +mcl_farming:pumpkin_5 +mcl_farming:pumpkin_6 +mcl_farming:pumpkin_7 +homedecor:banister_wood_diagonal_left_orange +mcl_itemframes:glow_frame +homedecor:banister_wood_diagonal_left +pipeworks:priority_tube_8 +pipeworks:broken_tube_6 +homedecor:trophy +pipeworks:teleport_tube_3 +homedecor:pool_table +homedecor:dvd_cd_cabinet +homedecor:cardboard_box +homedecor:cardboard_box_big +homedecor:fishtank_lighted +homedecor:fishtank +homedecor:bathroom_set +pipeworks:detector_tube_off_3 +pipeworks:detector_tube_off_2 +pipeworks:detector_tube_off_1 +pipeworks:detector_tube_on_7 +mcl_trees:tree_acacia +homedecor:rug_small +homedecor:ceiling_tile +homedecor:ceiling_paint +homedecor:desk_globe +homedecor:desk +homedecor:filing_cabinet +homedecor:filing_cabinet_locked +homedecor:shutter +homedecor:window_flowerbox +homedecor:curtainrod_wood +homedecor:curtain_closed +homedecor:blinds_thick +homedecor:window_quartered +building_blocks:terrycloth_towel +building_blocks:Tarmac_spread +building_blocks:gravel_spread +building_blocks:brobble_spread +building_blocks:Marble +mcl_hoppers:hopper_side +mcl_hoppers:hopper +mcl_hoppers:hopper_disabled +building_blocks:Roofing +building_blocks:Adobe +building_blocks:smoothglass +building_blocks:grate +technic:granite +mcl_hoppers:hopper_side_disabled +fake_fire:chimney_top_sandstone +fake_fire:fancy_fire +mcl_mushrooms:red_mushroom_block_cap_100011 +homedecor:nightstand_mahogany_two_drawers_locked +mcl_core:brick_block +homedecor:nightstand_mahogany_one_drawer_locked +homedecor:nightstand_oak_two_drawers +mcl_doors:door_oak_t_2 +mcl_doors:door_birch_b_2 +mcl_flowerpots:flower_pot_sapling_jungle +mcl_chests:black_shulker_box_small +homedecor:bed_extended +homedecor:table_legs_wrought_iron +mcl_copper:block_preserved +mcl_copper:block_cut_preserved +mcl_copper:block_exposed_preserved +mcl_copper:block_exposed_cut_preserved +mcl_copper:block_weathered_preserved +mcl_copper:block_weathered_cut_preserved +mcl_copper:block_oxidized_preserved +mcl_copper:block_oxidized_cut_preserved +homedecor:book_open_brown +homedecor:book_brown +mcl_deepslate:deepslate_tiles_cracked +mcl_core:glass_black +homedecor:book_grey +homedecor:book_open_violet +mcl_colorblocks:glazed_terracotta_black +mcl_trees:wood_oak +mcl_mushrooms:mushroom_brown +mcl_trees:sapling_oak +mcl_trees:sapling_spruce +mcl_trees:sapling_birch +mcl_trees:sapling_dark_oak +homedecor:book_open_blue +mesecons_torch:mesecon_torch_on +mcl_signs:standing_sign_spruce +homedecor:book_green +mcl_stairs:slab_deepslate_tiles +mcl_stairs:slab_deepslate_tiles_top +mcl_stairs:slab_deepslate_tiles_double +homedecor:book_open_red +mcl_chests:trapped_chest_on_left +mcl_core:redsandstone +mcl_stairs:stair_stonebrick_outer +mcl_sculk:sculk +mcl_stairs:stair_sandstonesmooth2_inner +mesecons:wire_00010001_off +mcl_deepslate:deepslatetileswall +mcl_deepslate:deepslatetileswall_0 +homedecor:light_switch_off +mcl_deepslate:deepslatetileswall_1 +mcl_core:frosted_ice_1 +mcl_deepslate:deepslatetileswall_2 +mcl_chests:trapped_chest_left +mcl_core:frosted_ice_2 +homedecor:power_outlet +mcl_deepslate:deepslatetileswall_4 +mcl_core:frosted_ice_3 +mcl_deepslate:deepslatetileswall_5 +homedecor:telephone +mcl_deepslate:deepslatetileswall_6 +mcl_stairs:stair_redsandstonesmooth +mcl_deepslate:deepslatetileswall_7 +mcl_walls:endbricks_0 +mcl_deepslate:deepslatetileswall_8 +mcl_nether:red_nether_brick +mcl_deepslate:deepslatetileswall_9 +mcl_minecarts:rail +mcl_deepslate:deepslatetileswall_10 +mcl_stairs:stair_copper_cut_preserved +mcl_deepslate:deepslatetileswall_11 +mcl_minecarts:golden_rail +mcl_deepslate:deepslatetileswall_12 +mcl_walls:stonebrickmossy_4 +mcl_deepslate:deepslatetileswall_13 +mcl_stairs:stair_copper_exposed_cut_preserved +mcl_minecarts:activator_rail +mcl_stairs:stair_sandstonesmooth_outer +mcl_deepslate:deepslatetileswall_15 +mcl_barrels:barrel_closed +mcl_meshhand:mcl_skins_base_1EEB592FF_female_crea +mcl_stairs:stair_copper_weathered_cut_preserved +mcl_meshhand:mcl_skins_base_1EEB592FF_male_crea +mcl_meshhand:mcl_skins_base_1B47A57FF_female_crea +mcl_meshhand:mcl_skins_base_1B47A57FF_male_crea +mcl_meshhand:mcl_skins_base_18D471DFF_female_crea +mcl_meshhand:mcl_skins_base_18D471DFF_male_crea +mcl_stairs:stair_copper_oxidized_cut_preserved +mcl_meshhand:mcl_skins_character_1_female_crea +mcl_meshhand:mcl_skins_base_1EEB592FF_female_surv +mcl_meshhand:mcl_skins_base_1EEB592FF_male_surv +mcl_meshhand:mcl_skins_base_1B47A57FF_female_surv +mcl_meshhand:mcl_skins_base_1B47A57FF_male_surv +mcl_meshhand:mcl_skins_base_18D471DFF_female_surv +mcl_stairs:slab_copper_cut_preserved +mcl_meshhand:character_male_surv +mcl_meshhand:mcl_skins_character_1_female_surv +homedecor:fence_wrought_iron_2_corner +homedecor:fence_wrought_iron_2 +mcl_stairs:slab_copper_exposed_cut_preserved +mcl_flowers:double_fern +homedecor:fence_chainlink +homedecor:fence_barbed_wire_corner +homedecor:fence_picket_corner_white +mcl_stairs:slab_copper_weathered_cut_preserved +homedecor:fence_picket_corner +mcl_mushrooms:red_mushroom_block_cap_010010 +homedecor:fence_picket +mcl_mud:mud_bricks +mcl_stairs:slab_copper_oxidized_cut_preserved +mcl_doors:door_jungle_b_1 +mcl_mushrooms:red_mushroom_block_cap_010011 +homedecor:coat_tree +homedecor:coatrack_wallmount +mcl_stairs:stair_copper_cut_inner_preserved +mcl_mushrooms:red_mushroom_block_cap_010100 +homedecor:openframe_bookshelf +mcl_stairs:stair_copper_exposed_cut_inner_preserved +homedecor:wine_rack +mcl_mushrooms:red_mushroom_block_cap_010101 +mcl_stairs:stair_copper_weathered_cut_inner_preserved +homedecor:4_bottles_brown +homedecor:painting_14 +mcl_stairs:stair_copper_oxidized_cut_inner_preserved +homedecor:painting_13 +homedecor:painting_12 +homedecor:painting_11 +homedecor:painting_10 +mcl_stairs:stair_copper_cut_outer_preserved +homedecor:painting_9 +mcl_cauldrons:cauldron_1 +mcl_stairs:stair_copper_exposed_cut_outer_preserved +mcl_mushrooms:red_mushroom_block_cap_011000 +mcl_cauldrons:cauldron_1r +mcl_stairs:stair_copper_weathered_cut_outer_preserved +mcl_stairs:slab_acacia_top +mcl_stairs:slab_acacia_double +mcl_stairs:stair_copper_oxidized_cut_outer_preserved +homedecor:painting_8 +mcl_mushrooms:red_mushroom_block_cap_011010 +homedecor:painting_7 +homedecor:painting_6 +homedecor:painting_5 +mcl_end:end_stone +mcl_nether:netherrack +mcl_stairs:slab_copper_cut_top_preserved +mcl_crimson:warped_nylium +mcl_mushrooms:red_mushroom_block_cap_011100 +homedecor:painting_3 +homedecor:painting_2 +mcl_mushrooms:red_mushroom_block_cap_011101 +mcl_stairs:slab_copper_exposed_cut_top_preserved +homedecor:painting_1 +homedecor:picture_frame2 +mcl_mushrooms:red_mushroom_block_cap_011110 +homedecor:picture_frame1 +homedecor:tv_off +mcl_stairs:slab_copper_weathered_cut_top_preserved +mcl_mushrooms:red_mushroom_block_cap_011111 +homedecor:tv_stand +steel:strut +mcl_mushrooms:red_mushroom_block_cap_100000 +steel:roofing_wall +mcl_stairs:slab_copper_oxidized_cut_top_preserved +mcl_mushrooms:red_mushroom_block_cap_100001 +steel:roofing +steel:grate_soft +mcl_mushrooms:red_mushroom_block_cap_100010 +steel:plate_hard +homedecor:shingle_side_asphalt +homedecor:shingle_inner_corner_asphalt +mcl_stairs:slab_copper_cut_double_preserved +homedecor:shingles_terracotta +homedecor:shingles_asphalt +mcl_mushrooms:red_mushroom_block_cap_100100 +homedecor:kitchen_chair_padded +homedecor:bench_large_2 +mcl_stairs:slab_copper_exposed_cut_double_preserved +mcl_mushrooms:red_mushroom_block_cap_100101 +homedecor:bench_large_1 +homedecor:deckchair_striped_blue +mcl_mushrooms:red_mushroom_block_cap_100110 +homedecor:deckchair +mcl_stairs:slab_copper_weathered_cut_double_preserved +homedecor:armchair +mcl_mushrooms:red_mushroom_block_cap_100111 +lrfurn:armchair +mcl_deepslate:deepslatepolishedwall_9 +mcl_mushrooms:red_mushroom_block_cap_101000 +mcl_stairs:slab_copper_oxidized_cut_double_preserved +mcl_mushrooms:red_mushroom_block_cap_101001 +mcl_stairs:stair_copper_weathered_cut_outer +mcl_stairs:stair_copper_weathered_cut_inner +mcl_mushrooms:red_mushroom_block_cap_101010 +homedecor:table_white +homedecor:table_mahogany +homedecor:table +mcl_mushrooms:red_mushroom_block_cap_101011 +mcl_stairs:slab_copper_weathered_cut +mcl_stairs:slab_copper_weathered_cut_top +mcl_stairs:slab_copper_weathered_cut_double +homedecor:wood_table_small_round_with_brass_legs +homedecor:wood_table_small_round +mcl_mushrooms:red_mushroom_block_cap_101101 +basic_materials:cement_block +homedecor:wood_table_small_square_with_wrought_iron_legs +mesecons:wire_01000000_on +mesecons:wire_01000000_off +homedecor:wood_table_small_square_with_brass_legs +basic_materials:concrete_block +mcl_mushrooms:red_mushroom_block_cap_101111 +mcl_stairs:stair_copper_oxidized_cut_outer +basic_materials:chain_steel +mcl_mushrooms:red_mushroom_block_cap_110000 +mcl_cauldrons:cauldron_3_lava +mcl_mushrooms:red_mushroom_block_cap_110001 +homedecor:wood_table_small_square +basic_materials:chain_brass +mcl_stairs:slab_copper_oxidized_cut +mcl_stairs:slab_copper_oxidized_cut_top +mcl_stairs:slab_copper_oxidized_cut_double +basic_materials:brass_block +homedecor:wood_table_large_square_with_brass_legs +homedecor:glass_table_small_round_with_wood_legs +mcl_mushrooms:red_mushroom_block_cap_110100 +homedecor:glass_table_small_round_with_wrought_iron_legs +mcl_mushrooms:red_mushroom_block_cap_110101 +homedecor:glass_table_small_round_with_brass_legs +mesecons:wire_00100000_on +mesecons:wire_00100000_off +homedecor:glass_table_small_round +homedecor:glass_table_small_square_with_wood_legs +homedecor:glass_table_small_square_with_wrought_iron_legs +mcl_mushrooms:red_mushroom_block_cap_110111 +homedecor:glass_table_small_square_with_brass_legs +homedecor:glass_table_small_square +mcl_mushrooms:red_mushroom_block_cap_111000 +homedecor:glass_table_large_square_with_wood_legs +mcl_mushrooms:red_mushroom_block_cap_111001 +mesecons:wire_10100000_on +mesecons:wire_10100000_off +mcl_mushrooms:red_mushroom_block_cap_111010 +homedecor:glass_table_large_square_with_wrought_iron_legs +mcl_stairs:slab_dark_oak +mcl_stairs:slab_dark_oak_top +mcl_stairs:slab_dark_oak_double +mcl_mushrooms:red_mushroom_block_cap_111100 +homedecor:glass_table_large_square_with_brass_legs +mcl_mushrooms:red_mushroom_block_cap_111101 +homedecor:glass_table_large_square +mcl_cauldrons:cauldron_1_lava +mcl_mushrooms:red_mushroom_block_cap_111110 +mcl_panes:pane_silver_flat +homedecor:table_legs_wood +homedecor:bed_regular +homedecor:table_legs_brass +homedecor:trash_can +homedecor:trash_can_green_open +mcl_stairs:slab_dark_oak_bark +mcl_stairs:slab_dark_oak_bark_top +mcl_stairs:slab_dark_oak_bark_double +mesecons:wire_11100000_on +mesecons:wire_11100000_off +mcl_cauldrons:cauldron_2_lava +homedecor:trash_can_green +mcl_brewing:stand_100 +mcl_brewing:stand_010 +mcl_brewing:stand_001 +mcl_brewing:stand_110 +mcl_brewing:stand_101 +mcl_brewing:stand_011 +mcl_brewing:stand_111 +mesecons:wire_00010000_on +mesecons:wire_00010000_off +itemframes:pedestal +mcl_mushrooms:brown_mushroom_block_cap_000100 +itemframes:frame +mcl_mushrooms:brown_mushroom_block_cap_000101 +mcl_panes:pane_light_blue_flat +mcl_mushrooms:brown_mushroom_block_cap_000110 +pipeworks:autocrafter +mcl_mushrooms:brown_mushroom_block_cap_000111 +pipeworks:storage_tank_10 +mcl_mushrooms:brown_mushroom_block_cap_001000 +mesecons:wire_10010000_off +mcl_mushrooms:brown_mushroom_block_cap_001001 +pipeworks:expansion_tank_10 +mcl_mushrooms:brown_mushroom_block_cap_001010 +pipeworks:mese_tube_100011 +mcl_mushrooms:brown_mushroom_block_cap_001011 +pipeworks:storage_tank_8 +mcl_mushrooms:brown_mushroom_block_cap_001100 +pipeworks:storage_tank_7 +mcl_mushrooms:brown_mushroom_block_cap_001101 +mesecons:wire_01010000_on +mesecons:wire_01010000_off +pipeworks:expansion_tank_7 +mcl_mushrooms:brown_mushroom_block_cap_001111 +pipeworks:mese_tube_100101 +mcl_mushrooms:brown_mushroom_block_cap_010000 +pipeworks:expansion_tank_6 +mcl_mushrooms:brown_mushroom_block_cap_010001 +pipeworks:storage_tank_5 +mcl_mushrooms:brown_mushroom_block_cap_010010 +mcl_panes:pane_orange_flat +mcl_mushrooms:brown_mushroom_block_cap_010011 +mesecons:wire_11010000_off +mcl_mushrooms:brown_mushroom_block_cap_010100 +pipeworks:mese_tube_100111 +mcl_mushrooms:brown_mushroom_block_cap_010101 +pipeworks:expansion_tank_5 +mcl_mushrooms:brown_mushroom_block_cap_010110 +mcl_nether:nether_lava_source +pipeworks:storage_tank_4 +pipeworks:expansion_tank_4 +pipeworks:storage_tank_3 +mesecons:wire_00110000_on +mesecons:wire_00110000_off +mcl_end:end_bricks +pipeworks:mese_tube_101010 +pipeworks:expansion_tank_3 +mcl_panes:pane_orange +pipeworks:storage_tank_2 +pipeworks:expansion_tank_2 +mcl_end:purpur_pillar +mcl_stairs:stair_copper_oxidized_cut +mcl_copper:block_weathered_cut +mesecons:wire_10110000_on +mesecons:wire_10110000_off +pipeworks:storage_tank_0 +mcl_core:stone_with_coal +pipeworks:expansion_tank_0 +mcl_signs:wall_sign_birch +pipeworks:spigot +pipeworks:grating +pipeworks:pump_off +mcl_core:stone_with_iron +pipeworks:pump_on +pipeworks:pipe_compatibility_empty +pipeworks:pipe_10_empty +pipeworks:pipe_9_loaded +mcl_core:stone_with_gold +mesecons:wire_01110000_on +mesecons:wire_01110000_off +pipeworks:pipe_8_empty +mesecons_pressureplates:pressure_plate_birch_on +pipeworks:pipe_6_loaded +mcl_panes:pane_lime +pipeworks:pipe_5_empty +mesecons_button:button_birch_off +mcl_ocean:kelp_redsand +pipeworks:pipe_3_empty +pipeworks:pipe_1_loaded +mesecons_button:button_birch_on +mesecons:wire_11110000_off +mcl_core:stone_with_redstone_lit +mcl_panes:pane_purple_flat +pipeworks:mese_sand_tube_compatibility +mcl_flowerpots:flower_pot_sapling_birch +pipeworks:priority_tube_2 +pipeworks:mese_sand_tube_9 +pipeworks:mese_sand_tube_7 +pipeworks:priority_tube_3 +pipeworks:mese_sand_tube_5 +mesecons:wire_10001000_on +mesecons:wire_10001000_off +pipeworks:mese_sand_tube_3 +mcl_stairs:stair_end_bricks +pipeworks:priority_tube_5 +mcl_stairs:stair_end_bricks_outer +mcl_beacons:beacon +pipeworks:priority_tube_6 +pipeworks:mese_sand_tube_1 +mcl_panes:pane_purple +pipeworks:priority_tube_7 +mesecons:wire_11001000_on +mesecons:wire_11001000_off +mcl_sus_nodes:sand_1 +mcl_stairs:slab_end_bricks_double +pipeworks:sand_tube_compatibility +pipeworks:priority_tube_9 +mcl_sus_nodes:sand_2 +pipeworks:sand_tube_9 +mcl_panes:pane_grey_flat +pipeworks:sand_tube_8 +mcl_sus_nodes:sand_3 +mesecons:wire_10101000_on +mesecons:wire_10101000_off +pipeworks:sand_tube_3 +mcl_villages:crop_grain_4 +pipeworks:lua_tube001111 +mcl_sus_nodes:gravel +mcl_villages:crop_grain_5 +pipeworks:lua_tube010111 +pipeworks:lua_tube100111 +mcl_sus_nodes:gravel_1 +pipeworks:lua_tube000111 +mesecons:wire_11101000_on +mcl_sus_nodes:gravel_2 +pipeworks:lua_tube111011 +mcl_panes:pane_grey +mcl_villages:crop_grain_8 +pipeworks:lua_tube101011 +pipeworks:lua_tube001011 +pipeworks:lua_tube110011 +pipeworks:lua_tube010011 +pipeworks:lua_tube100011 +pipeworks:lua_tube111101 +mesecons:wire_10011000_on +mcl_nether:ancient_debris +pipeworks:lua_tube011001 +pipeworks:lua_tube010001 +pipeworks:lua_tube100001 +mcl_villages:crop_root_4 +pipeworks:lua_tube010110 +pipeworks:lua_tube100110 +mcl_flowerpots:flower_pot_cactus +pipeworks:lua_tube000110 +pipeworks:lua_tube111010 +mesecons:wire_11011000_on +mesecons:wire_11011000_off +pipeworks:lua_tube011010 +mcl_villages:crop_root_7 +pipeworks:lua_tube001010 +pipeworks:lua_tube110010 +mcl_core:glass +mcl_panes:pane_cyan +pipeworks:lua_tube010010 +pipeworks:lua_tube100010 +pipeworks:lua_tube000010 +mesecons:wire_10111000_on +mesecons:wire_10111000_off +pipeworks:lua_tube111100 +pipeworks:lua_tube011100 +pipeworks:lua_tube101100 +mcl_villages:crop_gourd_3 +pipeworks:lua_tube110100 +pipeworks:lua_tube010100 +mcl_villages:crop_gourd_4 +pipeworks:lua_tube000100 +homedecor:kitchen_cabinet_colorable +mcl_villages:crop_gourd_5 +pipeworks:lua_tube001000 +pipeworks:lua_tube110000 +mcl_core:glass_grey +pipeworks:lua_tube010000 +pipeworks:lua_tube000000 +mcl_villages:crop_gourd_7 +pipeworks:teleport_tube_10 +mcl_core:glass_yellow +mcl_villages:crop_gourd_8 +mcl_deepslate:deepslatetileswall_16 +pipeworks:trashcan +pipeworks:accelerator_tube_1 +pipeworks:teleport_tube_6 +pipeworks:teleport_tube_5 +mcl_core:glass_white +pipeworks:teleport_tube_4 +homedecor:piano +pipeworks:accelerator_tube_3 +pipeworks:teleport_tube_2 +pipeworks:teleport_tube_1 +pipeworks:accelerator_tube_4 +mcl_core:glass_pink +pipeworks:tag_tube_111011 +pipeworks:accelerator_tube_5 +pipeworks:tag_tube_111010 +mcl_portals:portal_end +pipeworks:accelerator_tube_6 +pipeworks:tag_tube_111001 +pipeworks:tag_tube_110110 +pipeworks:accelerator_tube_7 +pipeworks:tag_tube_110011 +pipeworks:tag_tube_110010 +mesecons_pistons:piston_normal_on +mesecons_pistons:piston_pusher_normal +pipeworks:tag_tube_110001 +mcl_villages:crop_bush_8 +pipeworks:tag_tube_011101 +pipeworks:tag_tube_001010 +mcl_villages:crop_tree_1 +pipeworks:conductor_tube_on_compatibility +pipeworks:conductor_tube_on_10 +pipeworks:conductor_tube_on_9 +pipeworks:conductor_tube_on_5 +mesecons_torch:redstoneblock +mcl_villages:crop_tree_2 +pipeworks:conductor_tube_on_1 +pipeworks:conductor_tube_off_compatibility +mcl_villages:crop_tree_3 +pipeworks:conductor_tube_off_7 +signs_road:green_left_sign +mcl_villages:crop_tree_4 +signs_road:green_right_sign +pipeworks:conductor_tube_off_5 +mesecons_pistons:piston_sticky_on +mesecons_pistons:piston_pusher_sticky +pipeworks:conductor_tube_off_4 +signs_road:yellow_left_sign +pipeworks:conductor_tube_off_3 +signs_road:yellow_right_sign +mcl_villages:crop_tree_7 +mcl_deepslate:deepslatebrickswall_0 +pipeworks:detector_tube_off_compatibility +mesecons_pistons:piston_up_normal_on +mesecons_pistons:piston_up_pusher_normal +mcl_copper:block +signs_road:red_right_sign +pipeworks:detector_tube_off_9 +pipeworks:detector_tube_off_8 +pipeworks:detector_tube_off_7 +mesecons_pistons:piston_up_sticky_on +mesecons_pistons:piston_up_pusher_sticky +mcl_walls:sandstone_4 +pipeworks:detector_tube_off_5 +pipeworks:mese_tube_101011 +mcl_villages:crop_flower_4 +homedecor:flower_pot_terracotta +homedecor:flower_pot_green +homedecor:flower_pot_black +pipeworks:mese_tube_101100 +pipeworks:detector_tube_on_compatibility +mcl_villages:crop_flower_6 +mcl_doors:trapdoor_jungle_open +signs_road:large_street_sign +pipeworks:mese_tube_101101 +signs_road:red_street_sign +signs_road:blue_sign +signs_road:yellow_sign +signs_road:green_sign +signs:wooden_long_sign +signs_road:red_sign +signs_road:white_sign +homedecor:rug_large +homedecor:rug_persian +pipeworks:mese_tube_101111 +mcl_stairs:stair_jungle_inner +mcl_walls:diorite_16 +pipeworks:mese_tube_110000 +homedecor:japanese_wall_middle +homedecor:japanese_wall_bottom +mcl_flowerpots:flower_pot_wither_rose +mcl_stairs:stair_stonebrickcracked_outer +pipeworks:mese_tube_110001 +mcl_deepslate:deepslatecobbledwall_12 +pipeworks:mese_tube_111111 +homedecor:dartboard +mcl_flowerpots:flower_pot_lily_of_the_valley +pipeworks:mese_tube_110010 +pipeworks:tube_10 +homedecor:sportbench +pipeworks:broken_tube_9 +homedecor:skateboard +mcl_flowerpots:flower_pot_cornflower +pipeworks:accelerator_tube_2 +pipeworks:crossing_tube_3 +pipeworks:mese_tube_110111 +pipeworks:mese_tube_100001 +pipeworks:mese_tube_110100 +pipeworks:mese_tube_101000 +homedecor:banister_wood_horizontal +pipeworks:mese_tube_101110 +pipeworks:mese_tube_101001 +pipeworks:mese_tube_110101 +boards:black_board +pipeworks:mese_tube_100110 +boards:green_board +pipeworks:mese_tube_100100 +pipeworks:mese_tube_110110 +pipeworks:mese_tube_100000 +pipeworks:mese_tube_011111 +pipeworks:mese_tube_011110 +pipeworks:mese_tube_011101 +mcl_nether:netheriteblock +pipeworks:mese_tube_000011 +pipeworks:mese_tube_000001 +pipeworks:mese_tube_111000 +pipeworks:crossing_tube_1 +pipeworks:accelerator_tube_compatibility +pipeworks:accelerator_tube_10 +pipeworks:accelerator_tube_8 +pipeworks:mese_tube_111001 +pipeworks:priority_tube_compatibility +pipeworks:priority_tube_10 +pipeworks:mese_tube_111010 +pipeworks:priority_tube_4 +pipeworks:priority_tube_1 +pipeworks:broken_tube_compatibility +pipeworks:broken_tube_10 +pipeworks:mese_tube_111011 +pipeworks:broken_tube_8 +pipeworks:broken_tube_7 +pipeworks:mese_tube_111100 +pipeworks:broken_tube_5 +pipeworks:broken_tube_4 +pipeworks:broken_tube_2 +pipeworks:broken_tube_1 +pipeworks:mese_tube_111101 +pipeworks:tube_8 +pipeworks:tube_6 +pipeworks:mese_tube_111110 +mcl_core:coarse_dirt +mcl_nether:soul_sand +mcl_mobspawners:spawner +mcl_core:barrier +mcl_end:chorus_flower +mcl_end:chorus_flower_dead +mcl_end:end_rod +mcl_end:dragon_egg +mcl_portals:end_portal_frame_eye +mcl_lanterns:chain +pipeworks:dispenser_on +pipeworks:deployer_off +mcl_nether:cracked_nether_brick +mcl_nether:nether_wart_block +signs:wooden_left_sign +mcl_core:grass_path +signs:wooden_right_sign +mcl_nether:quartz_block +pipeworks:teleport_tube_7 +mcl_deepslate:deepslate_chiseled +mcl_deepslate:deepslatetileswall_21 +pipeworks:teleport_tube_8 +mcl_beehives:bee_nest_1 +mcl_nether:quartz_chiseled +mcl_beehives:bee_nest_2 +mcl_deepslate:deepslatetileswall_14 +mcl_beehives:bee_nest_3 +mcl_nether:quartz_pillar +mcl_beehives:bee_nest_4 +pipeworks:teleport_tube_compatibility +mcl_stairs:stair_deepslate_tiles_inner +mcl_nether:quartz_smooth +mcl_stairs:stair_deepslate_tiles_outer +mcl_stairs:stair_deepslate_tiles +mcl_deepslate:deepslate_tiles +mcl_deepslate:deepslatebrickswall_14 +signs:wooden_sign +mcl_deepslate:deepslatebrickswall_13 +signs:label_medium +signs:paper_poster +mcl_deepslate:deepslatebrickswall_9 +mcl_deepslate:deepslatebrickswall_8 +mcl_deepslate:deepslatebrickswall_3 +mcl_deepslate:deepslatebrickswall_2 +mcl_deepslate:deepslatebrickswall_1 +pipeworks:conductor_tube_off_1 +mcl_stairs:stair_deepslate_bricks_inner +mcl_stairs:stair_deepslate_bricks_outer +mcl_stairs:stair_deepslate_bricks +mcl_deepslate:deepslate_bricks +mcl_deepslate:deepslatepolishedwall_21 +mcl_deepslate:deepslatepolishedwall_16 +mcl_deepslate:deepslatepolishedwall_15 +mcl_deepslate:deepslatepolishedwall_14 +mcl_deepslate:deepslatepolishedwall_13 +mcl_deepslate:deepslatepolishedwall_12 +mcl_deepslate:deepslatepolishedwall_11 +mcl_deepslate:deepslatepolishedwall_10 +mcl_trees:stripped_dark_oak +lrfurn:sofa +mcl_deepslate:deepslatepolishedwall_8 +mcl_deepslate:deepslatepolishedwall_7 +mcl_deepslate:deepslatepolishedwall_6 +mcl_trees:wood_dark_oak +mcl_deepslate:deepslatepolishedwall_5 +mcl_deepslate:deepslatepolishedwall_3 +mcl_deepslate:deepslatepolishedwall_0 +mcl_stairs:slab_deepslate_polished_double +mcl_trees:bark_stripped_dark_oak +mcl_trees:bark_dark_oak +mcl_stairs:stair_deepslate_polished +mcl_deepslate:deepslate_polished +mcl_deepslate:deepslatecobbledwall +mcl_deepslate:deepslatecobbledwall_15 +pipeworks:detector_tube_on_1 +mcl_deepslate:deepslatecobbledwall_2 +mcl_stairs:slab_jungle_top +pipeworks:detector_tube_on_2 +homedecor:hanging_lantern_4 +mesecons:wire_10110010_off +pipeworks:detector_tube_on_3 +homedecor:ceiling_lantern_4 +mcl_farming:wheat_1 +pipeworks:detector_tube_on_4 +homedecor:lattice_lantern_large_4 +mcl_monster_eggs:monster_egg_stone +pipeworks:detector_tube_on_5 +homedecor:lattice_lantern_small_4 +mcl_doors:door_bamboo_t_1 +pipeworks:detector_tube_on_6 +homedecor:desk_lamp_4 +mcl_trees:leaves_dark_oak +mcl_trees:leaves_dark_oak_orphan +homedecor:ceiling_lamp_4 +mcl_stairs:stair_jungle +pipeworks:detector_tube_on_8 +mcl_trees:sapling_jungle +homedecor:table_lamp_4 +pipeworks:detector_tube_on_9 +homedecor:book_red +mcl_fences:dark_oak_fence +mcl_sus_nodes:gravel_3 +mcl_fences:dark_oak_fence_gate +mcl_fences:dark_oak_fence_gate_open +mcl_walls:diorite_9 +homedecor:glowlight_quarter_5 +mcl_flowerpots:flower_pot_poppy +homedecor:glowlight_small_cube_5 +homedecor:fence_chainlink_corner +mcl_flowers:rose_bush +homedecor:plasma_lamp_5 +homedecor:book_open_green +mcl_lush_caves:spore_blossom +homedecor:ground_lantern_5 +mcl_lush_caves:moss_carpet +mesecons_delayer:delayer_off_2 +homedecor:hanging_lantern_5 +homedecor:book_blue +mcl_stairs:slab_stone_rough +mcl_lush_caves:hanging_roots +mcl_doors:door_dark_oak_b_1 +mcl_lush_caves:rooted_dirt +mcl_stairs:stair_quartzblock_outer +mcl_stairs:stair_quartzblock_inner +mcl_doors:door_jungle_t_1 +mcl_doors:door_dark_oak_t_1 +homedecor:book_violet +mcl_colorblocks:glazed_terracotta_grey +mcl_doors:door_dark_oak_b_2 +mcl_stairs:slab_quartzblock +mcl_stairs:slab_quartzblock_top +mcl_doors:door_dark_oak_t_2 +homedecor:fence_brass +mcl_doors:trapdoor_dark_oak +mcl_stairs:stair_andesite_smooth_inner +homedecor:table_lamp_5 +homedecor:fence_wrought_iron +mcl_colorblocks:glazed_terracotta_lime +homedecor:standing_lamp_5 +mcl_colorblocks:glazed_terracotta_red +mcl_stairs:stair_redsandstone +mcl_walls:prismarine_5 +mcl_stairs:stair_quartz_smooth +mcl_lush_caves:cave_vines_lit +mcl_lush_caves:cave_vines +mcl_doors:trapdoor_dark_oak_open +mcl_core:lapisblock +mcl_walls:prismarine_4 +mcl_copper:block_exposed_cut +mcl_copper:block_cut +mcl_stairs:stair_dark_oak +mcl_stairs:slab_quartz_smooth +mcl_stairs:stair_dark_oak_outer +mcl_stairs:stair_dark_oak_inner +mcl_lush_caves:azalea +mcl_colorblocks:concrete_pink +mcl_farming:pumpkintige_linked_r +mcl_farming:pumpkintige_linked_l +mcl_farming:pumpkintige_linked_t +mcl_farming:pumpkintige_linked_b +mcl_stairs:stair_dark_oak_bark +mcl_core:diamondblock +mcl_stairs:stair_dark_oak_bark_outer +mcl_stairs:stair_dark_oak_bark_inner +mcl_stairs:stair_nether_brick +mcl_copper:block_weathered +mcl_stairs:stair_nether_brick_outer +mcl_stairs:stair_nether_brick_inner +mcl_fences:jungle_fence_gate +mcl_campfires:soul_campfire +mcl_fences:jungle_fence +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_surv +mcl_stairs:slab_sandstonesmooth_top +mcl_stairs:slab_nether_brick +mcl_stairs:slab_nether_brick_top +mcl_colorblocks:hardened_clay_magenta +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_female_crea +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_crea +mcl_colorblocks:concrete_powder_magenta +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_crea +mcl_colorblocks:concrete_magenta +mcl_core:coalblock +homedecor:light_switch_on +mcl_stairs:stair_sandstonesmooth_inner +homedecor:speaker_open +mcl_stairs:stair_sandstonesmooth +mcl_stairs:stair_red_nether_brick +mcl_chests:chest +mcl_stairs:stair_red_nether_brick_outer +mcl_stairs:stair_red_nether_brick_inner +homedecor:bed_kingsize +homedecor:nightstand_oak_one_drawer +homedecor:speaker +homedecor:nightstand_mahogany_one_drawer +homedecor:nightstand_mahogany_two_drawers +mcl_stairs:slab_red_nether_brick +mcl_stairs:slab_red_nether_brick_top +mcl_stairs:slab_red_nether_brick_double +mcl_mushrooms:red_mushroom_block_cap_101100 +homedecor:doorbell +mcl_colorblocks:hardened_clay_blue +mesecons:wire_11000000_on +mcl_stairs:slab_stonebrick_top +mcl_colorblocks:concrete_powder_blue +mcl_stairs:slab_stonebrick +mcl_colorblocks:concrete_blue +mcl_walls:stonebrickmossy_5 +homedecor:cobweb_corner +mcl_cauldrons:cauldron_2 +mcl_fences:nether_brick_fence +homedecor:cobweb_centered +mcl_stairs:stair_stonebrick_inner +homedecor:cobweb_flat +mcl_stairs:stair_stonebrick +mcl_mushrooms:brown_mushroom_block_cap_111111 +homedecor:cobweb_plantlike +mesecons_commandblock:commandblock_on +mcl_stairs:slab_sandstone_double +mcl_stairs:slab_warped +mcl_mangrove:mangrove_mud_roots +homedecor:nightstand_oak_one_drawer_locked +mcl_core:crying_obsidian +mcl_core:obsidian +mcl_stairs:slab_redsandstonesmooth_top +mcl_core:void +mcl_core:realm_barrier +mesecons:wire_00000000_on +mesecons_pressureplates:pressure_plate_birch_off +mcl_walls:rednetherbrick_1 +mcl_stairs:stair_redsandstonesmooth_outer +homedecor:dvd_vcr +mcl_panes:pane_white +homedecor:nightstand_oak_two_drawers_locked +mcl_stairs:slab_warped_bark +mcl_stairs:slab_warped_bark_top +mcl_stairs:slab_warped_bark_double +mcl_walls:endbricks_10 +mcl_walls:endbricks_14 +mcl_stairs:slab_oak +mcl_walls:mudbrick_21 +mcl_walls:mudbrick_14 +mcl_walls:mudbrick_6 +mcl_observers:observer_off +signs_road:red_left_sign +mcl_lush_caves:azalea_leaves +mcl_lush_caves:azalea_leaves_orphan +mesecons_button:button_oak_on +mcl_signs:wall_sign_warped +mcl_walls:endbricks_8 +mcl_lush_caves:azalea_leaves_flowering +mcl_lush_caves:azalea_leaves_flowering_orphan +mcl_stairs:slab_redsandstone_double +mcl_stairs:slab_redsandstone +mcl_trees:tree_oak +homedecor:projection_screen +mcl_walls:prismarine_21 +mcl_stairs:stair_mossycobble +mcl_stairs:stair_redsandstone_inner +mesecons_pressureplates:pressure_plate_warped_off +mcl_core:snow_5 +mesecons_pressureplates:pressure_plate_warped_on +mcl_core:snow_2 +homedecor:speaker_small +mcl_walls:stonebrickmossy_1 +mesecons_button:button_warped_off +homedecor:stereo +mcl_flowerpots:flower_pot_azalea +homedecor:book_open_grey +mesecons_button:button_warped_on +mcl_mushrooms:red_mushroom_block_cap_011001 +mesecons_solarpanel:solar_panel_inverted_on +mcl_core:snow_8 +mcl_flowerpots:flower_pot_azalea_flowering +mcl_core:snow_6 +mcl_core:frosted_ice_0 +mcl_core:glass_brown +mcl_stairs:stair_cobble +mcl_mushrooms:red_mushroom_block_cap_011011 +mcl_mushrooms:red_mushroom_block_cap_110011 +mesecons_solarpanel:solar_panel_off +mcl_walls:sandstone_8 +mcl_flowerpots:flower_pot_mushroom_brown +mesecons:wire_00110011_off +mesecons_pistons:piston_down_sticky_on +mcl_walls:sandstone_0 +mcl_walls:brick_14 +mcl_walls:brick_13 +mcl_stairs:slab_acacia_bark +mcl_stairs:slab_acacia_bark_top +mcl_stairs:slab_acacia_bark_double +mcl_stairs:slab_diorite +mesecons:wire_01110101_on +mcl_core:stone_with_lapis +mcl_sculk:vein +mcl_stairs:stair_diorite_inner +mcl_stairs:stair_diorite_outer +mcl_core:ice +mesecons:wire_01110101_off +mcl_honey:honeycomb_block +mcl_stairs:stair_spruce_bark_outer +mcl_nether:chiseled_nether_brick +mcl_signs:wall_sign_acacia +mcl_walls:brick_0 +mcl_stairs:slab_oak_bark_top +mesecons:wire_10110010_on +signs:label_small +mcl_flowers:tulip_pink +mcl_honey:honey_block +mcl_grindstone:grindstone +mcl_stairs:stair_acacia_bark +mcl_doors:trapdoor_acacia_open +mcl_doors:iron_trapdoor_open +mesecons_pressureplates:pressure_plate_acacia_off +mcl_walls:granite_21 +mesecons_pressureplates:pressure_plate_acacia_on +mesecons:wire_11110011_on +mesecons:wire_11110101_off +mcl_wool:brown_carpet +mesecons_pistons:piston_sticky_off +mesecons_pistons:piston_normal_off +mesecons_pistons:piston_up_sticky_off +mesecons_pistons:piston_up_normal_off +mesecons_pistons:piston_down_sticky_off +mesecons_pistons:piston_down_normal_off +mcl_walls:granite_13 +mcl_walls:netherbrick_2 +mcl_ocean:prismarine +mcl_flowerpots:flower_pot_sapling_acacia +mcl_copper:block_oxidized_cut +mcl_core:stonebrickmossy +mcl_ocean:prismarine_brick +mcl_copper:block_exposed +mcl_stairs:stair_deepslate_cobbled_inner +mcl_ocean:prismarine_dark +mcl_maps:filled_map_mcl_skins_character_1_female_crea +mcl_mushrooms:red_mushroom_block_stem +mcl_mushrooms:brown_mushroom_block_cap_100110 +mcl_mushrooms:red_mushroom_block_cap_110010 +mcl_lanterns:lantern_floor +mcl_trees:tree_dark_oak +mcl_walls:andesite_21 +mcl_walls:sandstone_21 +mcl_mushrooms:red_mushroom_block_cap_000011 +mesecons_button:button_stone_off +mcl_colorblocks:hardened_clay_green +mesecons_lightstone:lightstone_off +mcl_core:bedrock +mcl_stairs:slab_mangrove +mcl_stairs:slab_mangrove_top +mcl_stairs:slab_mangrove_double +mcl_fences:red_nether_brick_fence_gate_open +mesecons_lightstone:lightstone_on +mcl_colorblocks:concrete_powder_light_blue +mcl_stairs:slab_nether_brick_double +mcl_stairs:slab_quartz_smooth_top +mcl_nether:glowstone +mesecons:wire_10110011_on +mcl_stairs:stair_quartz_smooth_outer +mcl_mushrooms:red_mushroom_block_cap_010111 +mcl_stairs:stair_quartzblock +mcl_trees:stripped_birch +mcl_nether:quartz_ore +mcl_stairs:slab_mangrove_bark +mcl_stairs:slab_mangrove_bark_top +mcl_stairs:slab_mangrove_bark_double +mcl_stairs:stair_prismarine_inner +mcl_ocean:sea_pickle_4_dead_brain_coral_block +mcl_wool:blue_carpet +mcl_ocean:sea_pickle_2_off_dead_brain_coral_block +mcl_mushrooms:red_mushroom_block_cap_111011 +mcl_trees:bark_stripped_birch +mcl_trees:bark_birch +mcl_stairs:slab_prismarine_top +mcl_stairs:slab_prismarine_double +mcl_ocean:sea_pickle_1_off_dead_brain_coral_block +mcl_mushrooms:red_mushroom_block_cap_110110 +mcl_signs:wall_sign_mangrove +mcl_ocean:kelp_sand +mcl_stairs:stair_purpur_block +mcl_ocean:dead_horn_coral_block +mcl_stairs:stair_purpur_block_outer +mcl_stairs:stair_purpur_block_inner +mcl_flowerpots:flower_pot +mcl_stairs:slab_mud_brick +mcl_stairs:stair_prismarine_brick +mcl_meshhand:mcl_skins_base_18D471DFF_male_surv +mcl_stairs:stair_prismarine_brick_outer +mcl_stairs:stair_prismarine_brick_inner +mcl_stairs:slab_purpur_block_top +mcl_stairs:slab_purpur_block_double +mesecons_pressureplates:pressure_plate_mangrove_off +mcl_mushrooms:brown_mushroom_block_stem_full +mesecons_pressureplates:pressure_plate_mangrove_on +mcl_stairs:slab_prismarine_brick +mcl_stairs:slab_prismarine_brick_top +mcl_stairs:slab_prismarine_brick_double +mesecons_button:button_mangrove_off +mcl_stairs:stair_birch_bark_inner +mcl_walls:endbricks_11 +mcl_mushrooms:brown_mushroom_block_cap_000011 +mcl_chests:violet_shulker_box_small +mcl_wool:pink +mesecons:wire_01100000_off +mcl_fences:birch_fence +mesecons_button:button_stone_on +mcl_fences:birch_fence_gate +mcl_stairs:stair_prismarine_dark +mesecons:wire_10010000_on +mesecons_button:button_mangrove_on +mcl_stairs:stair_prismarine_dark_inner +mcl_trees:leaves_oak_orphan +mcl_trees:leaves_jungle +mcl_chests:magenta_shulker_box_small +mcl_signs:standing_sign_oak +mcl_mushrooms:brown_mushroom_block_cap_111101 +mcl_stairs:slab_prismarine_dark_top +mcl_stairs:slab_prismarine_dark_double +mcl_signs:standing_sign_jungle +mcl_colorblocks:concrete_powder_yellow +mcl_signs:standing_sign_birch +mcl_trees:leaves_jungle_orphan +mesecons_button:button_polished_blackstone_off +mcl_stairs:slab_spruce_double +mcl_doors:door_birch_b_1 +mesecons:wire_11010000_on +mesecons_button:button_polished_blackstone_on +mcl_beehives:beehive +mcl_signs:standing_sign_crimson +mcl_doors:door_birch_t_1 +mcl_signs:standing_sign_warped +mcl_stonecutter:stonecutter +mcl_signs:standing_sign_cherry_blossom +mcl_target:target_off +mcl_mangrove:propagule_dirt +mcl_doors:door_birch_t_2 +mcl_walls:brick_11 +mcl_mangrove:propagule_coarse_dirt +mcl_stairs:stair_jungle_outer +mesecons:wire_11011101_off +mcl_farming:hay_block +mcl_beds:bed_grey_bottom +mcl_stairs:stair_sandstone_inner +mcl_lush_caves:azalea_flowering +mcl_panes:pane_cyan_flat +mcl_trees:leaves_birch +mcl_wool:white_carpet +mcl_mushrooms:brown_mushroom_block_cap_001110 +mcl_panes:pane_red_flat +mcl_doors:trapdoor_birch_open +mcl_mushrooms:brown_mushroom_block_cap_101111 +mcl_beacons:beacon_beam +mcl_blackstone:soul_soil +mcl_core:stone_with_redstone +mcl_flowerpots:flower_pot_propagule +signs_road:blue_street_sign +mcl_stairs:stair_birch_outer +mcl_stairs:stair_birch_inner +mcl_colorblocks:concrete_powder_pink +mesecons:wire_10010001_off +mcl_heads:steve +mesecons:wire_01110011_on +mcl_mangrove:propagule_clay +mcl_stairs:slab_mud_brick_double +mcl_stairs:stair_birch_bark +mcl_heads:steve_ceiling +mcl_stairs:stair_birch_bark_outer +mcl_panes:pane_natural_flat +mcl_walls:sandstone_15 +mcl_beehives:beehive_5 +mcl_beehives:bee_nest_5 +mesecons:wire_11110000_on +mcl_mud:mud +mcl_trees:leaves_acacia_orphan +mcl_stairs:stair_birch +mcl_stairs:slab_birch +mcl_stairs:slab_birch_top +mcl_stairs:slab_birch_double +mcl_colorblocks:concrete_cyan +mcl_colorblocks:glazed_terracotta_cyan +mcl_stairs:slab_spruce_top +mcl_colorblocks:hardened_clay_cyan +mcl_colorblocks:glazed_terracotta_magenta +mcl_signs:wall_sign_spruce +mcl_panes:pane_natural +mesecons_pressureplates:pressure_plate_spruce_off +mcl_fences:acacia_fence_gate_open +mcl_colorblocks:glazed_terracotta_light_blue +mcl_mushrooms:mushroom_red +mcl_mushrooms:red_mushroom_block_cap_101110 +mcl_stairs:slab_birch_bark +mcl_stairs:slab_birch_bark_top +mcl_stairs:slab_birch_bark_double +mcl_panes:bar +mcl_stairs:stair_mud_brick_inner +mcl_panes:pane_yellow_flat +mcl_core:podzol +mcl_core:podzol_snow +mcl_core:mycelium +mcl_core:mycelium_snow +mcl_trees:stripped_oak +mcl_beehives:beehive_1 +mcl_doors:trapdoor_birch +mcl_beehives:beehive_2 +mcl_panes:bar_flat +mcl_beehives:beehive_3 +mesecons:wire_10011000_off +mcl_beehives:beehive_4 +mesecons_pressureplates:pressure_plate_jungle_off +mcl_signs:standing_sign_dark_oak +mesecons_pressureplates:pressure_plate_dark_oak_off +homedecor:rope_light_on_floor_on +mcl_panes:pane_yellow +mcl_panes:pane_red +mcl_stairs:stair_prismarine_dark_outer +mcl_panes:pane_lime_flat +mcl_fences:birch_fence_gate_open +mcl_colorblocks:concrete_powder_purple +homedecor:rope_light_on_ceiling_on +homedecor:rope_light_on_ceiling_off +mcl_flowers:cornflower +mcl_flowers:lily_of_the_valley +mcl_lush_caves:moss +mesecons_delayer:delayer_off_locked +mcl_core:dirt +mcl_flowers:wither_rose +mcl_wool:lime +mcl_stairs:slab_end_bricks_top +mcl_trees:wood_birch +mcl_stairs:stair_prismarine_outer +mcl_stairs:stair_prismarine +mcl_wool:orange +mcl_core:stone +mcl_stairs:slab_jungle_bark_double +mcl_chests:chest_left +mcl_chests:trapped_chest +mcl_colorblocks:hardened_clay_lime +mcl_colorblocks:hardened_clay_orange +mcl_chests:trapped_chest_on +mcl_chests:ender_chest_small +mcl_wool:silver +mcl_chests:dark_grey_shulker_box_small +mcl_chests:violet_shulker_box +mcl_chests:green_shulker_box_small +mcl_doors:door_mangrove_b_1 +mcl_ocean:tube_coral_block +mesecons_button:button_acacia_on +mcl_wool:black +mesecons_button:button_acacia_off +mcl_chests:brown_shulker_box_small +mcl_chests:cyan_shulker_box_small +mcl_chests:grey_shulker_box_small +mcl_mushrooms:brown_mushroom_block_cap_000000 +mcl_chests:blue_shulker_box_small +mcl_stairs:slab_purpur_block +mcl_stairs:slab_prismarine +mcl_panes:pane_light_blue +mcl_panes:pane_silver +mcl_target:target_on +mcl_ocean:dead_tube_coral_block +mcl_ocean:dead_tube_coral +mcl_ocean:tube_coral_fan +mcl_ocean:brain_coral_block +mcl_ocean:dead_brain_coral_block +mcl_ocean:brain_coral +mcl_ocean:brain_coral_fan +mcl_ocean:dead_brain_coral_fan +mcl_ocean:bubble_coral +mcl_ocean:dead_fire_coral_fan +mcl_mushrooms:brown_mushroom_block_cap_010111 +mcl_ocean:kelp_dirt +mcl_mushrooms:brown_mushroom_block_cap_011000 +mcl_ocean:kelp_gravel +mcl_mushrooms:brown_mushroom_block_cap_011001 +mcl_ocean:sea_pickle_2_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_cap_011010 +mcl_ocean:sea_pickle_3_off_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_cap_011011 +mcl_ocean:sea_pickle_4_off_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_cap_011100 +mcl_nether:nether_brick +mcl_mushrooms:brown_mushroom_block_cap_011101 +mcl_stairs:slab_quartzblock_double +mcl_mushrooms:brown_mushroom_block_cap_011110 +mcl_stairs:stair_quartz_smooth_inner +mcl_mushrooms:brown_mushroom_block_cap_011111 +mcl_stairs:slab_quartz_smooth_double +mcl_mushrooms:brown_mushroom_block_cap_100000 +mcl_nether:nether_lava_flowing +mcl_mushrooms:brown_mushroom_block_cap_100001 +mcl_fences:red_nether_brick_fence_gate +mcl_mushrooms:brown_mushroom_block_cap_100010 +mcl_mushrooms:red_mushroom_block_cap_000100 +mcl_mushrooms:brown_mushroom_block_cap_100011 +mcl_mushrooms:red_mushroom_block_cap_000010 +mcl_mushrooms:brown_mushroom_block_cap_100100 +mcl_meshhand:character_male_crea +mcl_mushrooms:brown_mushroom_block_cap_100101 +mcl_flowers:double_grass +mcl_sus_nodes:sand +mcl_doors:iron_trapdoor +mcl_mushrooms:brown_mushroom_block_cap_100111 +mcl_copper:stone_with_copper +mcl_mushrooms:brown_mushroom_block_cap_101000 +mcl_copper:block_oxidized +mcl_mushrooms:brown_mushroom_block_cap_101001 +mcl_stairs:stair_copper_weathered_cut +mcl_mushrooms:brown_mushroom_block_cap_101010 +mcl_stairs:stair_copper_oxidized_cut_inner +mcl_mushrooms:brown_mushroom_block_cap_101011 +mcl_walls:sandstone_10 +mcl_mushrooms:brown_mushroom_block_cap_101100 +mesecons_torch:mesecon_torch_off +mcl_mushrooms:brown_mushroom_block_cap_101101 +mcl_core:stone_with_emerald +mcl_nether:nether_wart_0 +mcl_crafting_table:crafting_table +mesecons_delayer:delayer_on_4 +mcl_stairs:stair_blackstone +mcl_core:stone_with_diamond +homedecor:chandelier_steel +homedecor:chain_brass_top +mcl_core:stonebrick +mcl_stairs:stair_diorite +mcl_mushrooms:brown_mushroom_block_cap_000010 +mcl_core:glass_magenta +mcl_core:stonebrickcarved +homedecor:candle +mcl_furnaces:furnace +mcl_core:stonebrickcracked +homedecor:candlestick_brass +homedecor:oil_lamp +mcl_core:glass_blue +mcl_stairs:slab_diorite_top +mcl_stairs:slab_diorite_double +mcl_core:stone_smooth +mcl_flowerpots:flower_pot_mushroom_red +mcl_core:granite +mcl_walls:sandstone_6 +mcl_core:glass_green +mcl_walls:sandstone_7 +mcl_core:granite_smooth +mesecons_pistons:piston_down_normal_on +homedecor:kitchen_cabinet_colorable_with_sink +homedecor:dishwasher +mcl_core:andesite +mcl_colorblocks:hardened_clay +mcl_stairs:stair_cobble_outer +mcl_stairs:stair_cobble_inner +mcl_core:andesite_smooth +homedecor:dishwasher_marble +homedecor:dishwasher_granite +homedecor:kitchen_faucet +mcl_core:diorite +mcl_stairs:slab_cobble +mcl_stairs:slab_cobble_top +mcl_stairs:slab_cobble_double +mcl_core:diorite_smooth +homedecor:toilet_paper +mcl_stairs:stair_blackstone_brick_polished_inner +mcl_core:glass_red +mcl_sponges:sponge_wet_river_water +mcl_walls:prismarine_0 +mcl_core:dirt_with_grass_snow +homedecor:glowlight_half_14 +homedecor:glowlight_quarter_14 +homedecor:glowlight_small_cube_14 +mcl_core:glass_silver +homedecor:ground_lantern_14 +mcl_stairs:stair_mossycobble_outer +mcl_stairs:stair_mossycobble_inner +mcl_walls:endbricks_1 +homedecor:ceiling_lantern_14 +homedecor:lattice_lantern_large_14 +mcl_walls:endbricks_6 +mcl_core:glass_light_blue +mcl_stairs:slab_mossycobble +mcl_stairs:slab_mossycobble_top +mcl_stairs:slab_mossycobble_double +mcl_walls:netherbrick_3 +mcl_blackstone:wall_2 +homedecor:oven_active +mcl_blackstone:wall_3 +mcl_core:glass_orange +mcl_blackstone:wall_4 +mcl_walls:mudbrick_10 +mcl_blackstone:wall_5 +mcl_walls:mudbrick_13 +mcl_blackstone:wall_6 +mcl_stairs:stair_brick_block +mcl_core:glass_lime +mcl_stairs:stair_brick_block_outer +mcl_stairs:stair_brick_block_inner +mcl_core:sand +mcl_core:gravel +mcl_trees:leaves_mangrove_orphan +mcl_blackstone:wall_10 +mcl_walls:mudbrick_15 +mcl_core:glass_purple +mcl_stairs:slab_brick_block_top +mcl_stairs:slab_brick_block_double +homedecor:oven_active_locked +mcl_core:sandstone +mesecons:wire_11101000_off +mcl_blackstone:wall_14 +homedecor:oven_steel_active +mcl_blackstone:wall_15 +mcl_fences:oak_fence_gate_open +mcl_blackstone:wall_16 +mcl_mushrooms:brown_mushroom_block_cap_111100 +mcl_core:sandstonesmooth +mcl_stairs:stair_sandstone +mcl_core:glass_cyan +mcl_stairs:stair_sandstone_outer +mcl_core:sandstonecarved +mcl_signs:standing_sign_mangrove +mcl_blackstone:soul_torch_wall +mcl_walls:netherbrick_4 +mcl_core:sandstonesmooth2 +homedecor:oven_steel_locked +mcl_stairs:slab_sandstone +mcl_core:redsand +mcl_colorblocks:hardened_clay_yellow +mcl_deepslate:deepslate_cobbled +mcl_mushrooms:brown_mushroom_block_cap_000001 +mcl_ocean:sea_lantern +mcl_deepslate:deepslate_reinforced +mcl_colorblocks:concrete_yellow +mcl_portals:portal_gateway +mcl_deepslate:infested_deepslate +mcl_mushrooms:brown_mushroom_block_stem +mcl_fire:fire +mcl_core:redsandstonesmooth +mcl_stairs:stair_sandstonesmooth2 +mesecons:wire_01100000_on +mcl_stairs:stair_sandstonesmooth2_outer +mcl_core:redsandstonecarved +mcl_cauldrons:cauldron_2r +mcl_cauldrons:cauldron_3 +mcl_cauldrons:cauldron_3r +mcl_core:redsandstonesmooth2 +mesecons:wire_11000000_off +mcl_stairs:slab_sandstonesmooth2 +mcl_stairs:slab_sandstonesmooth2_top +mcl_stairs:slab_sandstonesmooth2_double +mcl_beds:bed_light_blue_bottom +mcl_walls:andesite_16 +mcl_colorblocks:hardened_clay_white +mcl_deepslate:deepslate_with_redstone_lit +mcl_deepslate:deepslate_with_redstone +mcl_colorblocks:concrete_powder_white +mcl_mushrooms:red_mushroom_block_cap_010110 +mcl_colorblocks:concrete_white +mcl_walls:granite_0 +mcl_lanterns:soul_lantern_floor +mcl_walls:granite_1 +pipeworks:detector_tube_off_6 +mcl_walls:granite_2 +mcl_core:mossycobble +mcl_walls:granite_3 +mcl_wool:yellow +mcl_walls:granite_4 +mcl_smithing_table:table +mcl_walls:granite_5 +mcl_stairs:slab_sandstonesmooth +mcl_walls:granite_6 +mcl_stairs:slab_sandstonesmooth_double +mcl_walls:granite_7 +pipeworks:detector_tube_off_10 +mcl_walls:granite_8 +mcl_fences:jungle_fence_gate_open +mcl_walls:granite_9 +mcl_colorblocks:hardened_clay_pink +mcl_walls:granite_10 +pipeworks:expansion_tank_1 +mcl_walls:granite_11 +mcl_walls:prismarine_16 +mcl_walls:granite_12 +mcl_beds:bed_magenta_bottom +mcl_mud:packed_mud +pipeworks:storage_tank_1 +mcl_walls:granite_14 +mcl_walls:sandstone_9 +mcl_walls:granite_15 +mcl_stairs:stair_stone_rough +mcl_walls:granite_16 +mcl_stairs:stair_stone_rough_outer +mcl_stairs:stair_stone_rough_inner +mcl_stairs:stair_andesite_smooth +mesecons:wire_01010101_off +mcl_mushrooms:brown_mushroom_block_cap_110100 +mesecons_torch:mesecon_torch_off_wall +mcl_walls:diorite_0 +mcl_stairs:slab_deepslate_cobbled +mcl_walls:diorite_1 +mcl_doors:door_jungle_b_2 +mcl_walls:diorite_2 +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_surv +mcl_walls:diorite_3 +homedecor:refrigerator_white_locked +mcl_walls:diorite_4 +mcl_flowers:tallgrass +mcl_walls:diorite_5 +homedecor:refrigerator_steel_locked +mcl_walls:diorite_6 +mcl_flowers:dandelion +mcl_walls:diorite_7 +mcl_core:deadbush +mcl_walls:diorite_8 +mcl_stairs:stair_mud_brick +mcl_deepslate:deepslate_with_coal +mcl_stairs:stair_mud_brick_outer +mcl_walls:diorite_10 +mcl_trees:sapling_acacia +mcl_walls:diorite_11 +mcl_trees:sapling_cherry_blossom +mcl_walls:diorite_12 +mcl_deepslate:deepslate_with_iron +mcl_walls:diorite_13 +mcl_stairs:slab_mud_brick_top +mcl_walls:diorite_14 +mcl_trees:tree_spruce +mcl_walls:diorite_15 +mcl_stairs:slab_goldblock +mcl_deepslate:deepslate_with_gold +mcl_stairs:slab_goldblock_double +mcl_walls:diorite_21 +mcl_stairs:stair_jungle_bark +mcl_monster_eggs:monster_egg_stonebrickmossy +mcl_stairs:stair_jungle_bark_outer +mesecons:wire_11101010_on +mcl_deepslate:deepslate_with_emerald +mcl_core:dirt_with_grass +mcl_walls:brick_1 +mcl_stairs:stair_deepslate_cobbled_outer +mcl_walls:brick_2 +mcl_deepslate:deepslate_with_copper +mcl_walls:brick_3 +mcl_deepslate:deepslate_with_diamond +mcl_walls:brick_4 +mcl_stairs:slab_jungle_double diff --git a/mods/xcompat/test/nodelist/minetest.txt b/mods/xcompat/test/nodelist/minetest.txt new file mode 100644 index 00000000..472668a0 --- /dev/null +++ b/mods/xcompat/test/nodelist/minetest.txt @@ -0,0 +1,1494 @@ +pipeworks:steel_block_embedded_tube +steel:roofing +homedecor:ceiling_lantern_0 +steel:roofing_wall +homedecor:lattice_lantern_large_0 +pipeworks:steel_pane_embedded_tube +steel:strut +homedecor:lattice_lantern_small_0 +steel:strut_mount +homedecor:desk_lamp_0 +homedecor:dryer +steel:steel_block +homedecor:ceiling_lamp_0 +homedecor:ironing_board +beds:bed_bottom +homedecor:table_lamp_0 +basic_materials:cement_block +homedecor:standing_lamp_0 +beds:fancy_bed_top +basic_materials:concrete_block +steel:shingle_side_roofing +basic_materials:chain_steel +steel:shingle_outer_corner_roofing +steel:shingle_inner_corner_roofing +homedecor:inbox +basic_materials:brass_block +homedecor:glowlight_small_cube_1 +homedecor:plasma_lamp_1 +homedecor:ground_lantern_1 +homedecor:hanging_lantern_1 +homedecor:ceiling_lantern_1 +homedecor:lattice_lantern_large_1 +homedecor:lattice_lantern_small_1 +homedecor:filing_cabinet_locked +homedecor:filing_cabinet +homedecor:ceiling_lamp_1 +doors:homedecor_wood_plain_d +homedecor:desk_locked +homedecor:standing_lamp_1 +homedecor:glowlight_half_2 +homedecor:glowlight_quarter_2 +stairs:stair_stonebrick +homedecor:calendar +doors:homedecor_exterior_fancy_a +stairs:stair_inner_stonebrick +doors:homedecor_exterior_fancy_b +homedecor:hanging_lantern_2 +stairs:stair_outer_stonebrick +homedecor:ceiling_lantern_2 +stairs:slab_stonebrick +homedecor:lattice_lantern_small_2 +stairs:stair_stone_block +homedecor:desk_lamp_2 +default:bush_stem +homedecor:ceiling_lamp_2 +stairs:stair_inner_stone_block +default:bush_leaves +homedecor:table_lamp_2 +stairs:stair_outer_stone_block +homedecor:standing_lamp_2 +tnt:tnt_burning +stairs:slab_stone_block +default:blueberry_bush_leaves +homedecor:glowlight_quarter_3 +homedecor:glowlight_small_cube_3 +default:acacia_bush_stem +homedecor:plasma_lamp_3 +stairs:stair_inner_desert_stone +homedecor:ground_lantern_3 +default:pine_bush_stem +stairs:stair_outer_desert_stone +default:pine_bush_needles +homedecor:ceiling_lantern_3 +stairs:slab_desert_stone +default:sand_with_kelp +stairs:stair_desert_cobble +homedecor:lattice_lantern_small_3 +boards:black_board +boards:green_board +stairs:stair_inner_desert_cobble +homedecor:ceiling_lamp_3 +homedecor:table_lamp_3 +default:coral_skeleton +homedecor:standing_lamp_3 +homedecor:fishtank_lighted +homedecor:glowlight_half_4 +stairs:stair_desert_stonebrick +homedecor:glowlight_quarter_4 +default:coral_cyan +pipeworks:pump_off +stairs:stair_inner_desert_stonebrick +building_blocks:Tar +stairs:slab_ice +default:coral_orange +homedecor:wall_sconce +stairs:stair_snowblock +homedecor:ceiling_lantern_4 +stairs:stair_inner_snowblock +stairs:stair_desert_stone_block +building_blocks:fakegrass +default:water_flowing +building_blocks:hardwood +stairs:stair_outer_snowblock +homedecor:desk_lamp_4 +default:river_water_source +stairs:slab_snowblock +default:river_water_flowing +stairs:stair_outer_desert_stone_block +stairs:stair_glass +homedecor:standing_lamp_4 +homedecor:piano +stairs:slab_glass +homedecor:glowlight_half_5 +stairs:stair_sandstone +homedecor:glowlight_quarter_5 +stairs:stair_inner_glass +pipeworks:filter +pipeworks:mese_filter +stairs:stair_inner_sandstone +stairs:stair_outer_glass +homedecor:ground_lantern_5 +stairs:stair_obsidian_glass +building_blocks:grate +stairs:slab_sandstone +stairs:slab_obsidian_glass +homedecor:lattice_lantern_large_5 +stairs:stair_sandstonebrick +stairs:stair_inner_obsidian_glass +homedecor:lattice_lantern_small_5 +default:bookshelf +stairs:stair_inner_sandstonebrick +fireflies:firefly_bottle +pipeworks:priority_tube_1 +stairs:stair_outer_sandstonebrick +building_blocks:brobble_spread +stairs:slab_sandstonebrick +pipeworks:priority_tube_4 +pipeworks:priority_tube_5 +building_blocks:Tarmac_spread +default:ladder_wood +building_blocks:terrycloth_towel +default:ladder_steel +building_blocks:BWtile +default:fence_wood +pipeworks:priority_tube_9 +stairs:slab_sandstone_block +default:fence_acacia_wood +pipeworks:priority_tube_10 +stairs:stair_desert_sandstone +default:fence_junglewood +default:permafrost_with_moss +default:fence_pine_wood +stairs:stair_inner_desert_sandstone +default:sand +default:fence_aspen_wood +default:desert_sand +default:fence_rail_wood +default:silver_sand +stairs:slab_desert_sandstone +default:gravel +default:fence_rail_acacia_wood +stairs:stair_desert_sandstone_brick +vessels:shelf +default:clay +default:fence_rail_junglewood +pipeworks:mese_tube_010100 +stairs:stair_inner_desert_sandstone_brick +vessels:drinking_glass +default:snowblock +pipeworks:mese_tube_010101 +default:ice +vessels:steel_bottle +flowers:rose +default:cave_ice +stairs:slab_desert_sandstone_brick +pipeworks:tag_tube_100101 +flowers:geranium +stairs:stair_desert_sandstone_block +default:obsidian_glass +flowers:dandelion_white +farming:cotton_5 +default:brick +stairs:stair_inner_desert_sandstone_block +farming:cotton_6 +default:meselamp +carts:powerrail +stairs:stair_outer_desert_sandstone_block +pipeworks:tag_tube_101010 +default:mese_post_light +pipeworks:tube_4 +default:mese_post_light_acacia_wood +default:mese_post_light_junglewood +pipeworks:tag_tube_101100 +default:mese_post_light_pine_wood +pipeworks:mese_tube_011011 +default:mese_post_light_aspen_wood +default:cloud +default:junglewood +stairs:stair_inner_silver_sandstone +pipeworks:tag_tube_101111 +stairs:stair_outer_silver_sandstone +homedecor:table_lamp_8 +stairs:slab_silver_sandstone +pipeworks:tube_8 +homedecor:standing_lamp_8 +default:pine_wood +pipeworks:tag_tube_110011 +homedecor:glowlight_half_9 +homedecor:glowlight_quarter_9 +pipeworks:mese_tube_100000 +default:acacia_tree +pipeworks:tag_tube_110101 +flowers:mushroom_red +default:acacia_wood +homedecor:plasma_lamp_9 +flowers:mushroom_brown +default:acacia_leaves +homedecor:ground_lantern_9 +pipeworks:mese_tube_100010 +pipeworks:tag_tube_111000 +homedecor:hanging_lantern_9 +default:aspen_tree +homedecor:ceiling_lantern_9 +pipeworks:tag_tube_111010 +homedecor:lattice_lantern_large_9 +pipeworks:tag_tube_111011 +homedecor:lattice_lantern_small_9 +pipeworks:pipe_compatibility_empty +pipeworks:tag_tube_111100 +pipeworks:pipe_compatibility_loaded +default:stone_with_coal +flowers:waterlily +default:coalblock +flowers:waterlily_waving +default:stone_with_iron +pipeworks:entry_panel_empty +default:steelblock +pipeworks:straight_pipe_empty +default:stone_with_copper +pipeworks:valve_on_loaded +pipeworks:entry_panel_loaded +default:copperblock +pipeworks:flow_sensor_loaded +default:stone_with_tin +default:tinblock +flowers:chrysanthemum_green +flowers:tulip_black +default:bronzeblock +default:stone_with_mese +default:mese +default:stone_with_gold +default:goldblock +default:stone_with_diamond +default:diamondblock +default:large_cactus_seedling +default:dry_shrub +default:junglegrass +default:grass_1 +default:dry_grass_1 +default:fern_1 +default:marram_grass_1 +homedecor:curtainrod_wood +pipeworks:broken_tube_2 +homedecor:spiral_staircase +pipeworks:broken_tube_3 +pipeworks:broken_tube_4 +pipeworks:broken_tube_5 +pipeworks:broken_tube_6 +homedecor:flower_pot_terracotta +homedecor:flower_pot_green +homedecor:coatrack_wallmount +homedecor:coat_tree +pipeworks:broken_tube_9 +pipeworks:broken_tube_10 +homedecor:welcome_mat_green +pipeworks:broken_tube_compatibility +homedecor:rug_small +homedecor:welcome_mat_brown +homedecor:rug_large +homedecor:rug_persian +homedecor:welcome_mat_grey +homedecor:japanese_wall_top +homedecor:japanese_wall_middle +homedecor:japanese_wall_bottom +homedecor:tatami_mat +homedecor:pool_table +homedecor:dartboard +homedecor:sportbench +homedecor:skateboard +homedecor:fence_picket_corner +homedecor:fence_picket +homedecor:banister_wood_horizontal +default:apple +homedecor:fence_picket_corner_white +homedecor:fence_picket_white +homedecor:fence_privacy_corner +homedecor:ceiling_paint +default:tree +homedecor:ceiling_tile +homedecor:fence_privacy +default:jungletree +default:jungleleaves +homedecor:fence_barbed_wire_corner +homedecor:fence_barbed_wire +default:pine_tree +default:pine_needles +homedecor:fence_chainlink_corner +homedecor:fence_chainlink +homedecor:fence_wrought_iron_2_corner +homedecor:analog_clock_wood +homedecor:grandfather_clock +homedecor:potted_rose +homedecor:analog_clock_plastic +homedecor:potted_tulip +homedecor:alarm_clock +default:sapling +default:junglesapling +default:pine_sapling +default:acacia_sapling +default:aspen_sapling +default:bush_sapling +default:blueberry_bush_sapling +default:acacia_bush_sapling +default:pine_bush_sapling +default:emergent_jungle_sapling +default:stonebrick +homedecor:banister_wood_diagonal_left +default:stone_block +homedecor:banister_wood_horizontal_red +homedecor:banister_wood_diagonal_left_red +default:desert_stone +default:desert_cobble +homedecor:banister_wood_horizontal_vermilion +default:desert_stonebrick +homedecor:banister_wood_horizontal_orange +homedecor:air_conditioner +homedecor:banister_wood_diagonal_left_orange +default:sandstone +homedecor:desk_fan +default:sandstonebrick +homedecor:ceiling_fan +default:sandstone_block +homedecor:space_heater +default:desert_sandstone +homedecor:radiator +default:desert_sandstone_brick +homedecor:oven_steel +stairs:stair_silver_sandstone_brick +default:desert_sandstone_block +homedecor:desk_lamp_5 +homedecor:kitchen_cabinet_colorable +default:silver_sandstone +homedecor:ceiling_lamp_5 +stairs:stair_inner_silver_sandstone_brick +default:silver_sandstone_brick +pipeworks:teleport_tube_7 +homedecor:table_lamp_5 +default:silver_sandstone_block +stairs:stair_outer_silver_sandstone_brick +homedecor:standing_lamp_5 +butterflies:butterfly_red +butterflies:butterfly_violet +default:obsidianbrick +homedecor:shower_head +homedecor:glowlight_half_6 +default:obsidian_block +homedecor:glowlight_quarter_6 +homedecor:glowlight_small_cube_6 +homedecor:plasma_lamp_6 +stairs:stair_inner_silver_sandstone_block +homedecor:ground_lantern_6 +default:dirt_with_grass_footsteps +homedecor:hanging_lantern_6 +butterflies:hidden_butterfly_white +homedecor:ceiling_lantern_6 +stairs:slab_silver_sandstone_block +homedecor:lattice_lantern_large_6 +butterflies:hidden_butterfly_red +stairs:stair_obsidian +homedecor:rope_light_on_ceiling_on +homedecor:rope_light_on_ceiling_off +default:dirt_with_coniferous_litter +homedecor:desk_lamp_6 +butterflies:hidden_butterfly_violet +stairs:stair_inner_obsidian +homedecor:ceiling_lamp_6 +homedecor:wall_lamp_on +lavalamp:lavalamp_off +homedecor:table_lamp_6 +homedecor:standing_lamp_6 +stairs:slab_obsidian +homedecor:glowlight_half_7 +stairs:stair_obsidianbrick +homedecor:glowlight_quarter_7 +homedecor:toaster_loaf +homedecor:glowlight_small_cube_7 +homedecor:toaster +stairs:stair_inner_obsidianbrick +homedecor:bottle_brown +homedecor:plasma_lamp_7 +homedecor:4_bottles_green +homedecor:4_bottles_multi +homedecor:ground_lantern_7 +homedecor:coffee_maker +homedecor:hanging_lantern_7 +homedecor:ceiling_lantern_7 +pipeworks:tube_2 +fire:basic_flame +homedecor:lattice_lantern_large_7 +fire:permanent_flame +homedecor:lattice_lantern_small_7 +homedecor:desk_lamp_7 +homedecor:ceiling_lamp_7 +homedecor:table_lamp_7 +homedecor:standing_lamp_7 +fireflies:hidden_firefly +homedecor:glowlight_half_8 +homedecor:glowlight_quarter_8 +doors:homedecor_french_mahogany_c +homedecor:glowlight_small_cube_8 +doors:homedecor_french_mahogany_d +homedecor:shingles_terracotta +homedecor:plasma_lamp_8 +xpanes:obsidian_pane +homedecor:ground_lantern_8 +pipeworks:mese_sand_tube_2 +homedecor:hanging_lantern_8 +pipeworks:mese_sand_tube_3 +homedecor:ceiling_lantern_8 +pipeworks:mese_sand_tube_4 +itemframes:pedestal +homedecor:lattice_lantern_large_8 +pipeworks:mese_sand_tube_5 +doors:homedecor_french_white_c +homedecor:lattice_lantern_small_8 +doors:homedecor_french_white_d +pipeworks:sand_tube_1 +homedecor:desk_lamp_8 +pipeworks:mese_sand_tube_7 +homedecor:gate_barbed_wire_open +homedecor:ceiling_lamp_8 +homedecor:gate_barbed_wire_closed +vessels:glass_bottle +homedecor:gate_chainlink_open +flowers:dandelion_yellow +homedecor:gate_chainlink_closed +homedecor:gate_picket_open +pipeworks:sand_tube_5 +homedecor:gate_picket_closed +homedecor:gate_picket_white_open +doors:homedecor_basic_panel_c +homedecor:gate_picket_white_closed +homedecor:chain_steel_top +homedecor:chandelier_steel +homedecor:chain_brass_top +homedecor:chandelier_brass +pipeworks:mese_tube_000100 +xpanes:trapdoor_steel_bar_open +pipeworks:sand_tube_9 +homedecor:candle +homedecor:candlestick_wrought_iron +homedecor:candle_thin +homedecor:candlestick_brass +homedecor:oil_lamp +homedecor:oil_lamp_tabletop +homedecor:door_japanese_closed +pipeworks:mese_tube_000110 +doors:homedecor_wood_plain_a +doors:homedecor_wrought_iron_a +doors:homedecor_wrought_iron_b +pipeworks:mese_tube_000111 +doors:homedecor_wrought_iron_c +doors:homedecor_wrought_iron_d +pipeworks:mese_tube_001000 +pipeworks:mese_tube_001001 +wool:cyan +bones:bones +homedecor:glowlight_half_14 +homedecor:glowlight_quarter_14 +homedecor:glowlight_small_cube_14 +homedecor:plasma_lamp_14 +homedecor:ground_lantern_14 +doors:homedecor_carolina_d +homedecor:hanging_lantern_14 +doors:homedecor_french_white_b +homedecor:ceiling_lantern_14 +homedecor:lattice_lantern_large_14 +homedecor:lattice_lantern_small_14 +homedecor:desk_lamp_14 +homedecor:ceiling_lamp_14 +homedecor:table_lamp_14 +homedecor:standing_lamp_14 +xpanes:trapdoor_steel_bar +homedecor:torch_wall +pipeworks:mese_tube_000001 +doors:homedecor_woodglass_a +pipeworks:mese_tube_001111 +doors:homedecor_woodglass_b +pipeworks:mese_tube_000010 +doors:homedecor_woodglass_c +doors:homedecor_basic_panel_a +doors:homedecor_woodglass_d +doors:homedecor_basic_panel_b +pipeworks:mese_tube_010001 +wool:pink +pipeworks:mese_tube_010010 +stairs:stair_sandstone_block +lavalamp:lavalamp +pipeworks:mese_tube_010011 +doors:homedecor_closet_mahogany_a +xpanes:pane +doors:homedecor_closet_mahogany_b +homedecor:glowlight_half_0 +doors:homedecor_closet_mahogany_d +homedecor:glowlight_quarter_0 +homedecor:glowlight_small_cube_0 +xpanes:obsidian_pane_flat +homedecor:plasma_lamp_0 +homedecor:ground_lantern_0 +doors:homedecor_closet_oak_a +doors:homedecor_closet_oak_b +doors:homedecor_closet_oak_c +doors:homedecor_closet_oak_d +doors:homedecor_wood_plain_b +doors:homedecor_wood_plain_c +doors:hidden +default:grass_4 +default:grass_5 +default:dry_grass_2 +default:dry_grass_3 +default:dry_grass_4 +default:dry_grass_5 +default:fern_2 +default:fern_3 +default:marram_grass_2 +default:marram_grass_3 +homedecor:bed_kingsize +homedecor:nightstand_oak_one_drawer +homedecor:nightstand_oak_two_drawers +homedecor:nightstand_mahogany_one_drawer +homedecor:nightstand_mahogany_two_drawers +ontime_clocks:green_digital +ontime_clocks:red_digital +ontime_clocks:white +ontime_clocks:frameless_black +ontime_clocks:frameless_gold +homedecor:nightstand_mahogany_two_drawers_locked +ontime_clocks:frameless_white +doors:trapdoor +homedecor:pole_brass +doors:trapdoor_steel +homedecor:window_quartered +homedecor:window_plain +homedecor:blinds_thin +homedecor:blinds_thick +homedecor:window_flowerbox +homedecor:nightstand_oak_one_drawer_locked +air +pipeworks:straight_pipe_loaded +homedecor:wall_shelf +pipeworks:pipe_1_loaded +walls:desertcobble +doors:gate_acacia_wood_closed +doors:gate_junglewood_closed +doors:gate_pine_wood_closed +doors:gate_aspen_wood_closed +pipeworks:pipe_3_empty +pipeworks:pipe_3_loaded +ignore +homedecor:wood_table_large_square_with_wrought_iron_legs +stairs:slab_steelblock +stairs:stair_pine_wood +stairs:stair_tinblock +doors:door_wood_b +doors:door_wood_c +farming:cotton_wild +stairs:stair_inner_tinblock +homedecor:wood_table_small_square_with_brass_legs +pipeworks:pipe_6_loaded +homedecor:stained_glass +farming:wheat_3 +homedecor:wood_table_small_square_with_wrought_iron_legs +pipeworks:pipe_7_empty +farming:wheat_4 +pipeworks:pipe_7_loaded +stairs:slab_tinblock +farming:wheat_5 +pipeworks:pipe_8_empty +stairs:stair_copperblock +pipeworks:pipe_8_loaded +farming:wheat_7 +homedecor:wood_table_small_round_with_brass_legs +stairs:stair_inner_copperblock +default:sign_wall_wood +homedecor:wood_table_small_round_with_wrought_iron_legs +stairs:stair_outer_copperblock +default:sign_wall_steel +homedecor:wood_table_small_round_with_wood_legs +default:dirt_with_snow +stairs:stair_bronzeblock +farming:cotton_1 +default:cobble +default:mossycobble +stairs:slab_cobble +stairs:slab_mossycobble +stairs:stair_cobble +stairs:stair_mossycobble +lrfurn:endtable +stairs:stair_inner_mossycobble +stairs:stair_outer_cobble +stairs:stair_outer_mossycobble +stairs:stair_outer_bronzeblock +walls:mossycobble +farming:dry_soil +farming:dry_soil_wet +stairs:slab_bronzeblock +technic:granite +stairs:stair_goldblock +lrfurn:coffeetable +stairs:stair_inner_goldblock +farming:desert_sand_soil_wet +stairs:stair_outer_goldblock +doors:door_steel_a +stairs:slab_goldblock +doors:door_steel_b +doors:door_steel_c +homedecor:book_grey +doors:door_steel_d +homedecor:book_open_grey +stairs:stair_inner_ice +steles:stone_stele +steles:sandstone_stele +farming:seed_wheat +steles:desert_stone_stele +homedecor:trash_can_green_open +doors:door_glass_b +homedecor:trash_can_green +homedecor:book_red +doors:door_glass_d +homedecor:book_open_red +homedecor:shingle_side_glass +homedecor:skylight +homedecor:shingle_outer_corner_terracotta +homedecor:shingle_inner_corner_terracotta +homedecor:book_open_green +homedecor:shingle_inner_corner_wood +homedecor:shingle_outer_corner_wood +homedecor:shingle_side_wood +doors:door_obsidian_glass_c +homedecor:book_blue +doors:trapdoor_open +homedecor:book_open_blue +homedecor:trash_can +homedecor:shingles_asphalt +stairs:slab_straw +homedecor:book_violet +homedecor:book_open_violet +homedecor:skylight_frosted +pipeworks:expansion_tank_1 +doors:gate_wood_open +homedecor:nightstand_oak_two_drawers_locked +homedecor:nightstand_mahogany_one_drawer_locked +homedecor:book_brown +doors:gate_acacia_wood_open +homedecor:bed_extended +homedecor:book_open_brown +homedecor:bed_regular +doors:gate_junglewood_open +beds:bed_top +beds:fancy_bed_bottom +homedecor:table_legs_wood +doors:gate_pine_wood_open +homedecor:wood_table_small_square +farming:cotton_8 +farming:cotton_7 +homedecor:armchair +pipeworks:storage_tank_2 +farming:cotton_4 +farming:cotton_3 +farming:cotton_2 +farming:seed_cotton +farming:wheat_8 +farming:wheat_6 +farming:wheat_2 +pipeworks:expansion_tank_3 +stairs:stair_outer_straw +farming:wheat_1 +stairs:stair_inner_straw +stairs:stair_straw +farming:straw +pipeworks:storage_tank_3 +farming:desert_sand_soil +farming:soil_wet +farming:soil +fake_fire:ice_fire +homedecor:openframe_bookshelf +pipeworks:crossing_tube_9 +pipeworks:expansion_tank_4 +homedecor:office_chair_basic +stairs:slab_desert_stonebrick +homedecor:kitchen_chair_wood +homedecor:bench_large_2 +fake_fire:fancy_fire +pipeworks:storage_tank_4 +homedecor:glass_table_small_square +homedecor:bench_large_1 +signs_road:black_left_sign +homedecor:wood_table_small_round +pipeworks:one_way_tube +fake_fire:embers +signs_road:black_right_sign +homedecor:deckchair_striped_blue +pipeworks:mese_sand_tube_1 +doors:door_wood_a +lrfurn:sofa +signs_road:white_left_sign +pipeworks:storage_tank_5 +homedecor:shingle_inner_corner_asphalt +homedecor:table +homedecor:table_mahogany +homedecor:table_white +wool:magenta +default:lava_source +default:obsidian +signs_road:blue_left_sign +pipeworks:tag_tube_000110 +signs_road:blue_right_sign +fake_fire:chimney_top_stone +pipeworks:tag_tube_000111 +fake_fire:chimney_top_sandstone +wool:red +signs_road:green_left_sign +wool:orange +signs_road:green_right_sign +pipeworks:tag_tube_001001 +homedecor:kitchen_cabinet_colorable_marble_locked +homedecor:kitchen_cabinet_colorable_marble +pipeworks:tag_tube_001010 +signs_road:yellow_left_sign +default:coral_pink +signs_road:yellow_right_sign +homedecor:table_legs_brass +homedecor:kitchen_cabinet_colored_marble_locked +pipeworks:tag_tube_001100 +wool:yellow +signs_road:red_left_sign +homedecor:kitchen_cabinet_colored_with_drawers_marble +signs_road:red_right_sign +homedecor:table_legs_wrought_iron +pipeworks:tag_tube_001110 +wool:green +wool:dark_green +homedecor:kitchen_cabinet_colorable_with_drawers_marble_locked +homedecor:kitchen_cabinet_colorable_with_drawers_marble +wool:blue +pipeworks:storage_tank_8 +wool:violet +wool:black +wool:dark_grey +homedecor:kitchen_cabinet_colored_with_drawers_marble_locked +wool:grey +wool:white +homedecor:glass_table_large_square +pipeworks:autocrafter +signs_road:yellow_sign +signs_road:red_sign +homedecor:gate_half_door_closed +signs_road:red_street_sign +signs_road:green_sign +signs_road:blue_street_sign +homedecor:glass_table_large_square_with_wrought_iron_legs +signs_road:white_sign +doors:homedecor_exterior_fancy_d +default:coral_brown +homedecor:glass_table_large_square_with_wood_legs +homedecor:kitchen_cabinet_colorable_steel_locked +homedecor:gate_half_door_white_closed +pipeworks:expansion_tank_9 +pipeworks:expansion_tank_10 +pipeworks:storage_tank_9 +homedecor:gate_half_door_white_open +pipeworks:storage_tank_10 +homedecor:kitchen_cabinet_colored_steel_locked +pipeworks:expansion_tank_8 +homedecor:glass_table_small_square_with_brass_legs +pipeworks:storage_tank_7 +homedecor:kitchen_cabinet_colored_with_drawers_steel +pipeworks:expansion_tank_7 +homedecor:glass_table_small_square_with_wrought_iron_legs +pipeworks:storage_tank_6 +pipeworks:expansion_tank_6 +pipeworks:expansion_tank_5 +homedecor:glass_table_small_square_with_wood_legs +homedecor:kitchen_cabinet_colorable_with_drawers_steel +pipeworks:expansion_tank_2 +pipeworks:storage_tank_1 +pipeworks:storage_tank_0 +pipeworks:expansion_tank_0 +pipeworks:flow_sensor_empty +homedecor:kitchen_cabinet_colored_with_drawers_steel_locked +pipeworks:spigot_pouring +homedecor:banister_wood_horizontal_blue +homedecor:glass_table_small_round_with_brass_legs +pipeworks:grating +pipeworks:valve_off_empty +pipeworks:valve_on_empty +homedecor:glass_table_small_round_with_wrought_iron_legs +butterflies:butterfly_white +pipeworks:pipe_10_loaded +homedecor:kitchen_cabinet_colorable_half_locked +homedecor:glass_table_small_round_with_wood_legs +pipeworks:pipe_10_empty +pipeworks:pipe_9_loaded +pipeworks:pipe_9_empty +homedecor:kitchen_cabinet_colored_half_locked +pipeworks:pipe_6_empty +pipeworks:pipe_5_loaded +pipeworks:pipe_5_empty +homedecor:fence_wrought_iron_2 +pipeworks:pipe_4_loaded +pipeworks:pipe_4_empty +pipeworks:pipe_2_loaded +pipeworks:pipe_2_empty +homedecor:fence_brass +homedecor:kitchen_cabinet_colorable_with_sink_locked +pipeworks:pipe_1_empty +pipeworks:mese_sand_tube_compatibility +homedecor:fence_wrought_iron +pipeworks:mese_sand_tube_10 +homedecor:kitchen_cabinet_colored_with_sink_locked +pipeworks:mese_sand_tube_9 +pipeworks:mese_sand_tube_8 +pipeworks:mese_sand_tube_6 +homedecor:cutlery_set +homedecor:deckchair +pipeworks:sand_tube_compatibility +pipeworks:sand_tube_10 +pipeworks:sand_tube_8 +pipeworks:sand_tube_7 +pipeworks:sand_tube_6 +pipeworks:sand_tube_4 +pipeworks:sand_tube_3 +pipeworks:sand_tube_2 +pipeworks:teleport_tube_compatibility +pipeworks:teleport_tube_10 +pipeworks:teleport_tube_9 +pipeworks:teleport_tube_8 +pipeworks:teleport_tube_6 +pipeworks:teleport_tube_5 +pipeworks:teleport_tube_4 +pipeworks:teleport_tube_3 +pipeworks:teleport_tube_2 +pipeworks:teleport_tube_1 +pipeworks:tag_tube_111111 +pipeworks:tag_tube_111110 +pipeworks:tag_tube_111101 +pipeworks:tag_tube_111001 +pipeworks:tag_tube_110111 +pipeworks:tag_tube_110110 +pipeworks:tag_tube_110100 +pipeworks:tag_tube_110010 +pipeworks:tag_tube_110001 +pipeworks:tag_tube_110000 +pipeworks:tag_tube_101110 +pipeworks:tag_tube_101101 +pipeworks:tag_tube_101011 +pipeworks:tag_tube_101001 +homedecor:pole_wrought_iron +pipeworks:tag_tube_101000 +pipeworks:tag_tube_100111 +pipeworks:tag_tube_100110 +homedecor:bars +pipeworks:tag_tube_100100 +homedecor:hanging_lantern_5 +stairs:slab_desert_cobble +steel:plate_hard +homedecor:speaker_open +homedecor:wood_table_large_square_with_brass_legs +pipeworks:tag_tube_011111 +pipeworks:tag_tube_011110 +homedecor:L_binding_bars +pipeworks:tag_tube_011101 +homedecor:chains +pipeworks:tag_tube_011100 +homedecor:speaker +pipeworks:tag_tube_011011 +pipeworks:tag_tube_011010 +pipeworks:tag_tube_011001 +pipeworks:tag_tube_011000 +pipeworks:tag_tube_010111 +homedecor:kitchen_cabinet_colored_with_drawers_granite_locked +pipeworks:tag_tube_010101 +pipeworks:tag_tube_010100 +pipeworks:tag_tube_010011 +pipeworks:tag_tube_000000 +pipeworks:tag_tube_010010 +homedecor:kitchen_cabinet_colorable_steel +pipeworks:tag_tube_000001 +stairs:stair_wood +pipeworks:tag_tube_010000 +pipeworks:tag_tube_000010 +homedecor:kitchen_cabinet_colorable_with_drawers_steel_locked +pipeworks:tag_tube_001101 +pipeworks:tag_tube_000011 +stairs:stair_inner_wood +pipeworks:tag_tube_001011 +pipeworks:nodebreaker_off +pipeworks:tag_tube_001000 +pipeworks:tag_tube_000101 +stairs:stair_outer_wood +pipeworks:tag_tube_000100 +pipeworks:mese_tube_111111 +homedecor:banister_wood_diagonal_left_azure +stairs:stair_silver_sandstone_block +stairs:stair_outer_silver_sandstone_block +pipeworks:mese_tube_111011 +stairs:stair_junglewood +pipeworks:mese_tube_111010 +pipeworks:mese_tube_111001 +homedecor:potted_bonsai +pipeworks:mese_tube_110111 +homedecor:dvd_vcr +stairs:stair_inner_junglewood +pipeworks:mese_tube_110110 +pipeworks:deployer_on +pipeworks:mese_tube_110101 +xpanes:door_steel_bar_c +stairs:stair_outer_junglewood +homedecor:wardrobe +pipeworks:mese_tube_110011 +default:apple_mark +stairs:slab_junglewood +pipeworks:mese_tube_110001 +doors:homedecor_french_mahogany_a +pipeworks:mese_tube_101111 +doors:homedecor_french_oak_b +pipeworks:mese_tube_101101 +homedecor:painting_1 +homedecor:door_japanese_open +homedecor:plasma_ball_on +stairs:stair_inner_pine_wood +pipeworks:mese_tube_101010 +pipeworks:mese_tube_101001 +pipeworks:mese_tube_101000 +homedecor:painting_6 +homedecor:rope_light_on_floor_on +homedecor:rope_light_on_floor_off +pipeworks:mese_tube_100110 +doors:door_obsidian_glass_a +default:grass_2 +pipeworks:mese_tube_100011 +pipeworks:mese_tube_100001 +stairs:stair_acacia_wood +homedecor:speaker_small +pipeworks:mese_tube_011111 +pipeworks:mese_tube_011110 +homedecor:stereo +pipeworks:mese_tube_011101 +stairs:stair_inner_acacia_wood +pipeworks:mese_tube_011100 +pipeworks:mese_tube_011010 +pipeworks:mese_tube_011001 +pipeworks:mese_tube_011000 +stairs:stair_outer_acacia_wood +pipeworks:mese_tube_010111 +homedecor:telephone +pipeworks:mese_tube_010110 +stairs:slab_acacia_wood +pipeworks:mese_tube_010000 +homedecor:potted_dandelion_yellow +pipeworks:mese_tube_001110 +stairs:stair_aspen_wood +pipeworks:mese_tube_001101 +pipeworks:mese_tube_001100 +pipeworks:dispenser_on +pipeworks:mese_tube_001011 +pipeworks:mese_tube_001010 +stairs:stair_inner_aspen_wood +pipeworks:mese_tube_000101 +pipeworks:mese_tube_000011 +pipeworks:mese_tube_000000 +homedecor:simple_bench +stairs:stair_outer_aspen_wood +pipeworks:crossing_tube_compatibility +homedecor:kitchen_chair_padded +homedecor:potted_geranium +stairs:slab_aspen_wood +homedecor:office_chair_upscale +homedecor:tv_stand +homedecor:swing_rope +homedecor:swing +stairs:stair_stone +pipeworks:crossing_tube_7 +homedecor:potted_viola +doors:homedecor_basic_panel_d +pipeworks:crossing_tube_5 +homedecor:desk +stairs:stair_inner_stone +pipeworks:crossing_tube_3 +homedecor:potted_cactus +default:fence_rail_aspen_wood +homedecor:glass_table_large_square_with_brass_legs +stairs:stair_outer_stone +pipeworks:accelerator_tube_10 +homedecor:light_switch_on +pipeworks:accelerator_tube_9 +doors:door_wood_d +pipeworks:accelerator_tube_7 +pipeworks:accelerator_tube_6 +default:snow +pipeworks:accelerator_tube_4 +signs:wooden_left_sign +homedecor:power_outlet +signs:wooden_right_sign +homedecor:dishwasher_granite +homedecor:kitchen_faucet +homedecor:taps +pipeworks:accelerator_tube_3 +homedecor:copper_pans +homedecor:paper_towel +homedecor:toilet_paper +pipeworks:accelerator_tube_2 +homedecor:doorbell +pipeworks:accelerator_tube_1 +homedecor:desk_lamp_9 +homedecor:cardboard_box_big +pipeworks:priority_tube_compatibility +homedecor:ceiling_lamp_9 +pipeworks:priority_tube_8 +homedecor:cobweb_corner +homedecor:dvd_cd_cabinet +homedecor:table_lamp_9 +pipeworks:priority_tube_7 +homedecor:cobweb_centered +homedecor:standing_lamp_9 +homedecor:cobweb_flat +pipeworks:priority_tube_6 +homedecor:trophy +homedecor:glowlight_half_10 +pipeworks:priority_tube_3 +homedecor:glowlight_quarter_10 +pipeworks:priority_tube_2 +homedecor:glowlight_small_cube_10 +pipeworks:broken_tube_8 +pipeworks:broken_tube_7 +pipeworks:broken_tube_1 +pipeworks:tube_compatibility +homedecor:plasma_lamp_10 +pipeworks:tube_10 +pipeworks:tube_9 +homedecor:ground_lantern_10 +pipeworks:tube_7 +pipeworks:tube_6 +homedecor:hanging_lantern_10 +homedecor:banister_wood_diagonal_left_grey +pipeworks:tube_5 +homedecor:ceiling_lantern_10 +pipeworks:tube_3 +pipeworks:tube_1 +homedecor:lattice_lantern_large_10 +pipeworks:dispenser_off +pipeworks:deployer_off +homedecor:lattice_lantern_small_10 +pipeworks:nodebreaker_on +pipeworks:trashcan +homedecor:desk_lamp_10 +pipeworks:digiline_filter +homedecor:bathroom_set +homedecor:ceiling_lamp_10 +homedecor:oven_locked +homedecor:bathtub_clawfoot_chrome_taps +lrfurn:longsofa +homedecor:table_lamp_10 +homedecor:shower_tray +default:desert_stone_block +homedecor:standing_lamp_10 +homedecor:oven_active_locked +homedecor:fishtank +stairs:stair_inner_sandstone_block +homedecor:glowlight_half_11 +homedecor:oven_steel_active +homedecor:glowlight_quarter_11 +homedecor:lattice_lantern_large_3 +homedecor:glowlight_small_cube_11 +homedecor:plasma_lamp_5 +homedecor:medicine_cabinet +homedecor:towel_rod +homedecor:banister_wood_horizontal_amber +homedecor:plasma_lamp_11 +homedecor:banister_wood_diagonal_left_amber +homedecor:bathroom_tiles_light +homedecor:ground_lantern_11 +homedecor:bathroom_tiles_medium +homedecor:banister_wood_horizontal_yellow +homedecor:hanging_lantern_11 +homedecor:banister_wood_diagonal_left_yellow +xpanes:pane_flat +homedecor:ceiling_lantern_11 +homedecor:digital_clock +doors:homedecor_carolina_a +homedecor:lattice_lantern_large_11 +homedecor:painting_2 +homedecor:banister_wood_diagonal_left_lime +homedecor:lattice_lantern_small_11 +default:chest +homedecor:microwave_oven_active +homedecor:desk_lamp_11 +homedecor:banister_wood_horizontal_chartreuse +homedecor:ceiling_lamp_4 +homedecor:ceiling_lamp_11 +homedecor:shrubbery_large_green +homedecor:picture_frame2 +homedecor:shingles_wood +homedecor:table_lamp_11 +homedecor:banister_wood_horizontal_harlequin +homedecor:well +homedecor:standing_lamp_11 +tnt:boom +stairs:stair_outer_desert_sandstone +homedecor:banister_wood_horizontal_green +homedecor:glowlight_half_12 +homedecor:banister_wood_diagonal_left_green +homedecor:glowlight_quarter_12 +stairs:slab_obsidianbrick +homedecor:glowlight_small_cube_12 +homedecor:lattice_wood +homedecor:banister_wood_horizontal_malachite +homedecor:book_green +homedecor:banister_wood_diagonal_left_malachite +homedecor:plasma_lamp_12 +homedecor:doghouse +homedecor:barbecue +homedecor:ground_lantern_12 +homedecor:banister_wood_horizontal_spring +homedecor:kitchen_cabinet_colored_with_sink +homedecor:hanging_lantern_12 +homedecor:kitchen_cabinet_colorable_with_sink +basic_materials:chain_brass +homedecor:ceiling_lantern_12 +homedecor:kitchen_cabinet_colorable_half +homedecor:banister_wood_horizontal_turquoise +homedecor:lattice_lantern_large_12 +homedecor:banister_wood_diagonal_left_turquoise +pipeworks:tag_tube_001111 +homedecor:lattice_lantern_small_12 +homedecor:kitchen_cabinet_colored_steel +homedecor:banister_wood_horizontal_cyan +homedecor:desk_lamp_12 +homedecor:banister_wood_diagonal_left_cyan +pipeworks:tag_tube_010001 +homedecor:ceiling_lamp_12 +homedecor:kitchen_cabinet_colored_marble +stairs:stair_obsidian_block +homedecor:banister_wood_horizontal_cerulean +homedecor:table_lamp_12 +homedecor:banister_wood_diagonal_left_cerulean +homedecor:microwave_oven_locked +homedecor:standing_lamp_12 +stairs:stair_inner_obsidian_block +homedecor:refrigerator_white +homedecor:banister_wood_horizontal_azure +homedecor:glowlight_half_13 +homedecor:refrigerator_steel +homedecor:glowlight_quarter_13 +pipeworks:tag_tube_010110 +homedecor:refrigerator_white_locked +default:chest_locked_open +homedecor:banister_wood_horizontal_sapphire +default:glass +homedecor:refrigerator_steel_locked +homedecor:plasma_lamp_13 +stairs:stair_brick +homedecor:oven +homedecor:ground_lantern_13 +homedecor:kitchen_cabinet_colored_granite +homedecor:banister_wood_diagonal_left_blue +homedecor:hanging_lantern_13 +stairs:stair_inner_brick +homedecor:kitchen_cabinet_colored_granite_locked +homedecor:ceiling_lantern_13 +homedecor:banister_wood_horizontal_indigo +homedecor:kitchen_cabinet_colorable_locked +homedecor:lattice_lantern_large_13 +homedecor:kitchen_cabinet_colorable_granite_locked +homedecor:kitchen_cabinet_colored_with_drawers_locked +homedecor:lattice_lantern_small_13 +homedecor:banister_wood_horizontal_violet +doors:gate_wood_closed +homedecor:desk_lamp_13 +homedecor:kitchen_cabinet_colorable_with_drawers +stairs:stair_steelblock +homedecor:ceiling_lamp_13 +homedecor:kitchen_cabinet_colorable_with_drawers_locked +homedecor:banister_wood_horizontal_mulberry +homedecor:wood_table_large_square_with_wood_legs +homedecor:table_lamp_13 +stairs:stair_inner_steelblock +homedecor:kitchen_cabinet_colored_locked +homedecor:standing_lamp_13 +homedecor:banister_wood_horizontal_magenta +homedecor:kitchen_cabinet_colorable_granite +homedecor:banister_wood_diagonal_left_magenta +homedecor:dishwasher_steel +homedecor:dishwasher_wood +homedecor:dishwasher_marble +homedecor:dishwasher +homedecor:banister_wood_horizontal_fuchsia +homedecor:microwave_oven_active_locked +homedecor:banister_wood_diagonal_left_fuchsia +homedecor:microwave_oven +homedecor:kitchen_cabinet_colored_with_drawers_granite +homedecor:oven_steel_active_locked +homedecor:banister_wood_horizontal_rose +homedecor:oven_steel_locked +homedecor:banister_wood_diagonal_left_rose +homedecor:oven_active +homedecor:kitchen_cabinet_colorable_with_drawers_granite_locked +homedecor:kitchen_cabinet_colorable_with_drawers_granite +homedecor:shingle_side_terracotta +homedecor:banister_wood_horizontal_crimson +stairs:stair_inner_cobble +homedecor:banister_wood_diagonal_left_crimson +pipeworks:accelerator_tube_5 +signs:wooden_long_sign +building_blocks:Fireplace +homedecor:kitchen_cabinet_colored +default:furnace_active +pipeworks:tag_tube_100000 +default:furnace +homedecor:plasma_ball_off +pipeworks:tag_tube_100001 +pipeworks:accelerator_tube_8 +stairs:stair_outer_desert_cobble +pipeworks:tag_tube_100010 +homedecor:kitchen_cabinet_colored_with_drawers +wool:brown +pipeworks:tag_tube_100011 +homedecor:medicine_cabinet_open +stairs:stair_outer_sandstone +pipeworks:accelerator_tube_compatibility +stairs:slab_stone +homedecor:shrubbery_green +stairs:slab_wood +homedecor:lattice_lantern_small_4 +homedecor:kitchen_cabinet_colored_half +signs_road:white_right_sign +homedecor:wall_lamp_off +homedecor:toilet_open +xpanes:door_steel_bar_d +xpanes:door_steel_bar_b +homedecor:toilet +signs_road:large_street_sign +signs_road:blue_sign +default:wood +default:torch_ceiling +default:torch_wall +doors:gate_aspen_wood_open +stairs:stair_outer_pine_wood +doors:trapdoor_steel_open +default:lava_flowing +doors:door_obsidian_glass_b +doors:door_glass_c +doors:door_glass_a +lrfurn:armchair +homedecor:stonepath +homedecor:gate_half_door_open +tnt:gunpowder_burning +default:cactus +tnt:gunpowder +default:dirt +default:dirt_with_grass +default:dirt_with_dry_grass +default:dirt_with_rainforest_litter +default:dry_dirt +default:dry_dirt_with_dry_grass +default:papyrus +doors:homedecor_closet_mahogany_c +flowers:viola +stairs:stair_outer_obsidian_glass +stairs:stair_outer_ice +homedecor:cobweb_plantlike +homedecor:bathtub_clawfoot_brass_taps +homedecor:lattice_white_wood +stairs:stair_outer_obsidian +homedecor:shingle_outer_corner_asphalt +stairs:slab_silver_sandstone_brick +stairs:slab_desert_sandstone_block +stairs:stair_outer_desert_sandstone_brick +default:coral_green +homedecor:lattice_wood_vegetal +homedecor:taps_brass +default:grass_3 +stairs:stair_inner_desert_stone_block +pipeworks:mese_tube_100100 +stairs:stair_silver_sandstone +default:blueberry_bush_leaves_with_berries +homedecor:lattice_white_wood_vegetal +homedecor:lattice_lantern_small_6 +pipeworks:mese_tube_100101 +homedecor:wood_table_large_square +homedecor:banister_wood_diagonal_left_sapphire +stairs:stair_inner_bronzeblock +homedecor:wine_rack +homedecor:tv_off +homedecor:television +homedecor:banister_wood_diagonal_left_chartreuse +homedecor:sink +pipeworks:crossing_tube_1 +pipeworks:mese_tube_100111 +homedecor:tv +pipeworks:crossing_tube_2 +homedecor:shrubbery_red +default:fence_rail_pine_wood +homedecor:shrubbery_large_red +homedecor:desk_globe +homedecor:banister_white_dark_horizontal +pipeworks:crossing_tube_4 +homedecor:banister_white_dark_diagonal_left +xpanes:bar +homedecor:curtain_closed +homedecor:picture_frame1 +homedecor:painting_4 +pipeworks:crossing_tube_6 +homedecor:banister_brass_horizontal +pipeworks:mese_tube_101011 +homedecor:banister_brass_diagonal_left +stairs:slab_desert_stone_block +homedecor:bathroom_tiles_dark +pipeworks:crossing_tube_8 +pipeworks:mese_tube_101100 +homedecor:bottle_green +homedecor:banister_wrought_iron_horizontal +doors:homedecor_carolina_b +homedecor:banister_wrought_iron_diagonal_left +pipeworks:crossing_tube_10 +homedecor:shrubbery_yellow +homedecor:banister_wood_diagonal_right_grey +homedecor:shrubbery_large_yellow +homedecor:banister_wood_diagonal_right +pipeworks:mese_tube_101110 +homedecor:banister_wood_diagonal_right_red +xpanes:bar_flat +homedecor:banister_wood_diagonal_right_vermilion +homedecor:shutter +homedecor:banister_wood_diagonal_right_orange +doors:homedecor_french_mahogany_b +homedecor:banister_wood_diagonal_right_amber +pipeworks:mese_tube_110000 +homedecor:banister_wood_diagonal_right_yellow +stairs:stair_ice +homedecor:banister_wood_diagonal_right_lime +homedecor:shutter_colored +homedecor:banister_wood_diagonal_right_chartreuse +doors:homedecor_french_white_a +homedecor:banister_wood_diagonal_right_harlequin +doors:homedecor_french_oak_a +homedecor:banister_wood_diagonal_right_green +pipeworks:mese_tube_110010 +homedecor:banister_wood_diagonal_right_malachite +walls:cobble +homedecor:banister_wood_diagonal_right_spring +homedecor:light_switch_off +homedecor:banister_wood_diagonal_right_turquoise +homedecor:painting_3 +homedecor:banister_wood_diagonal_right_cyan +homedecor:curtain_open +homedecor:banister_wood_diagonal_right_cerulean +pipeworks:mese_tube_110100 +homedecor:banister_wood_diagonal_right_azure +xpanes:door_steel_bar_a +homedecor:banister_wood_diagonal_right_sapphire +building_blocks:woodglass +homedecor:banister_wood_diagonal_right_blue +building_blocks:Roofing +homedecor:banister_wood_diagonal_right_indigo +itemframes:frame +homedecor:banister_wood_diagonal_right_violet +homedecor:painting_5 +homedecor:banister_wood_diagonal_right_mulberry +homedecor:flower_pot_black +homedecor:banister_wood_diagonal_right_magenta +homedecor:potted_dandelion_white +homedecor:banister_wood_diagonal_right_fuchsia +fireflies:firefly +homedecor:banister_wood_diagonal_right_rose +pipeworks:mese_tube_111000 +homedecor:banister_wood_diagonal_right_crimson +default:torch +homedecor:cardboard_box +homedecor:banister_wood_diagonal_left_vermilion +homedecor:banister_white_dark_diagonal_right +homedecor:painting_7 +homedecor:4_bottles_brown +homedecor:banister_brass_diagonal_right +default:permafrost_with_stones +default:permafrost +homedecor:banister_wrought_iron_diagonal_right +stairs:stair_outer_steelblock +homedecor:painting_8 +homedecor:banister_wood_diagonal_left_mulberry +homedecor:wood_table_small_square_with_wood_legs +pipeworks:mese_tube_111100 +homedecor:banister_wood_diagonal_left_violet +stairs:slab_brick +stairs:stair_outer_brick +homedecor:painting_9 +pipeworks:mese_tube_111101 +pipeworks:pump_on +stairs:slab_obsidian_block +pipeworks:mese_tube_111110 +default:chest_open +stairs:stair_outer_obsidianbrick +homedecor:painting_10 +homedecor:banister_wood_diagonal_left_spring +default:water_source +default:chest_locked +stairs:stair_outer_tinblock +homedecor:banister_wood_horizontal_lime +pipeworks:spigot +homedecor:painting_11 +carts:rail +homedecor:banister_wood_horizontal_grey +homedecor:washing_machine +pipeworks:fountainhead +pipeworks:fountainhead_pouring +stairs:slab_copperblock +homedecor:painting_12 +doors:homedecor_french_oak_d +signs:label_small +homedecor:curtainrod_wrought_iron +stairs:stair_desert_stone +homedecor:curtainrod_brass +building_blocks:smoothglass +homedecor:painting_13 +homedecor:projection_screen +default:acacia_bush_leaves +doors:homedecor_carolina_c +signs:label_medium +signs:wooden_sign +default:leaves +homedecor:painting_14 +stairs:stair_outer_obsidian_block +default:stone +building_blocks:Adobe +building_blocks:Marble +building_blocks:gravel_spread +homedecor:shingle_side_asphalt +homedecor:painting_15 +stairs:stair_outer_sandstone_block +flowers:tulip +homedecor:glowlight_half_1 +homedecor:glowlight_quarter_1 +homedecor:desk_lamp_1 +homedecor:table_lamp_1 +homedecor:painting_16 +homedecor:glowlight_small_cube_2 +homedecor:plasma_lamp_2 +homedecor:ground_lantern_2 +homedecor:lattice_lantern_large_2 +homedecor:glowlight_half_3 +homedecor:hanging_lantern_3 +homedecor:painting_17 +homedecor:desk_lamp_3 +homedecor:glowlight_small_cube_4 +homedecor:plasma_lamp_4 +homedecor:ground_lantern_4 +homedecor:hanging_lantern_4 +homedecor:lattice_lantern_large_4 +homedecor:painting_18 +homedecor:chimney +homedecor:table_lamp_4 +homedecor:glowlight_small_cube_5 +steel:plate_soft +steel:plate_rusted +homedecor:ceiling_lantern_5 +homedecor:painting_19 +homedecor:banister_wood_diagonal_left_harlequin +default:aspen_leaves +default:aspen_wood +homedecor:glowlight_small_cube_9 +carts:brakerail +signs:paper_poster +homedecor:painting_20 +doors:homedecor_french_oak_c +doors:homedecor_exterior_fancy_c +homedecor:banister_wood_diagonal_left_indigo +homedecor:glass_table_small_round +steel:grate_soft +stairs:stair_outer_desert_stonebrick +homedecor:glowlight_small_cube_13 +doors:door_obsidian_glass_d +steel:grate_hard +stairs:slab_pine_wood +homedecor:hanging_lantern_0 diff --git a/mods/xcompat/test/nodelist/voxelibre.txt b/mods/xcompat/test/nodelist/voxelibre.txt new file mode 100644 index 00000000..52b337e7 --- /dev/null +++ b/mods/xcompat/test/nodelist/voxelibre.txt @@ -0,0 +1,2530 @@ +mcl_maps:filled_map_character_male_crea +mcl_potions:food_poisoning_arrow_box +mcl_doors:spruce_trapdoor_ladder +mcl_colorblocks:hardened_clay_white +mcl_ocean:dead_tube_coral_block +mcl_chests:green_shulker_box +mcl_beehives:bee_nest +mcl_potions:harming_arrow_box +mcl_cauldrons:cauldron_3 +mcl_stairs:stair_copper_cut +mcl_doors:birch_trapdoor_ladder +mcl_core:barrier +vl_hollow_logs:stripped_warped_hyphae_hollow +mcl_core:sprucetree +mcl_walls:prismarine_6 +xpanes:pane_green +mcl_stairs:stair_wood +mcl_flowerpots:flower_pot_blue_orchid +mcl_core:glass_yellow +mcl_portals:portal_gateway +mcl_core:light_2 +mcl_stairs:stair_crimson_hyphae_wood_inner +mcl_ocean:bubble_coral_block +mesecons_lightstone:lightstone_off +mcl_colorblocks:glazed_terracotta_orange +mcl_farming:potato_1 +mcl_flowerpots:flower_pot_tulip_pink +mcl_flowers:double_grass_top +mcl_amethyst:medium_amethyst_bud +mcl_stairs:stair_warped_hyphae_wood_outer +mcl_stairs:slab_stonebrickcracked_double +mcl_walls:andesite_5 +mcl_mobspawners:spawner +mcl_mud:mud +mesecons_pistons:piston_up_sticky_on +mcl_core:frosted_ice_1 +mcl_compass:lodestone +mcl_stairs:slab_brick_block +mcl_crimson:weeping_vines +mcl_colorblocks:concrete_orange +mcl_walls:stonebrickmossy +mcl_colorblocks:glazed_terracotta_pillar_silver +mcl_core:ironblock +mcl_end:dragon_egg +mcl_stairs:stair_redsandstonesmooth2_outer +mcl_potions:saturation_arrow_box +mcl_brewing:stand_011 +mcl_walls:mudbrick_7 +mcl_stairs:stair_waxed_copper_oxidized_cut_inner +mcl_beds:respawn_anchor_charged_4 +mcl_lanterns:chain +mcl_stairs:slab_birchtree_bark_double +mcl_mushrooms:red_mushroom_block_cap_110010 +mcl_stairs:slab_concrete_orange +mcl_core:snow_6 +mcl_chests:cyan_shulker_box_small +mcl_crimson:warped_door_b_3 +mcl_beds:bed_blue_top +mcl_walls:redsandstone_6 +mcl_deepslate:deepslatecobbledwall_2 +mcl_stairs:stair_concrete_magenta_outer +mcl_wool:pink_carpet +mcl_walls:brick_3 +mcl_walls:prismarine +mcl_mushrooms:brown_mushroom_block_cap_110100 +mcl_fences:birch_fence_gate_open +mcl_brewing:stand_010 +mcl_walls:rednetherbrick_4 +mcl_mushrooms:brown_mushroom_block_cap_110000 +mcl_core:jungletree +mcl_wool:blue_carpet +mcl_flowerpots:flower_pot_lily_of_the_valley +mcl_stairs:slab_crimson_hyphae_wood_double +mcl_cherry_blossom:cherry_door_t_2 +mcl_flowers:poppy +xpanes:pane_white +mcl_stairs:slab_acaciawood_top +mcl_ocean:kelp_sand +mcl_walls:diorite_3 +mcl_stairs:stair_mangrove_wood_inner +mcl_cake:cake_4 +mcl_deepslate:deepslatepolishedwall_8 +mcl_ocean:kelp_dirt +mcl_deepslate:deepslatebrickswall_8 +mcl_cake:cake +mcl_minecarts:detector_rail +mcl_walls:brick_21 +mcl_core:acaciatree_bark +mcl_stairs:slab_copper_cut +mcl_wool:green_carpet +mcl_stairs:slab_blackstone_brick_polished_double +mcl_flowers:double_grass +mcl_torches:torch_wall +mesecons_pressureplates:pressure_plate_birchwood_on +mcl_doors:acacia_door_t_3 +mcl_beehives:beehive_3 +mcl_core:packed_ice +mcl_stairs:slab_bamboo_mosaic_double +mcl_walls:stonebrickmossy_1 +mesecons_button:button_warped_hyphae_wood_on +mcl_walls:rednetherbrick_15 +mcl_farming:melontige_4 +mcl_stairs:stair_acaciawood_inner +mcl_stairs:stair_concrete_red_inner +xpanes:pane_light_blue_flat +mcl_walls:rednetherbrick_21 +mcl_core:mycelium_snow +mcl_signs:standing_sign22_5_warped_hyphae_wood +xpanes:pane_yellow +mcl_walls:redsandstone_12 +mcl_wool:yellow +mcl_stonecutter:stonecutter +mcl_walls:diorite_5 +mcl_comparators:comparator_on_comp +mcl_stairs:stair_stone_rough_inner +mesecons_torch:mesecon_torch_overheated +mcl_stairs:slab_birchtree_bark +mcl_stairs:stair_sandstone_outer +mcl_stairs:stair_copper_exposed_cut_outer +mcl_core:glass_magenta +mcl_deepslate:deepslatetileswall_10 +mesecons_torch:mesecon_torch_overheated_wall +xpanes:bar +mesecons_button:button_polished_blackstone_off +mcl_observers:observer_on +mcl_ocean:sea_lantern +mcl_doors:trapdoor_ladder +mcl_anvils:anvil_damage_2 +xpanes:bar_flat +mcl_bamboo:bamboo_1 +mcl_stairs:slab_sandstonesmooth2 +mcl_end:end_rod_lightblue +mcl_walls:stonebrickmossy_3 +mcl_wool:orange_carpet +mcl_core:stone_with_redstone_lit +mcl_stairs:slab_bamboo_block_top +mcl_mushrooms:red_mushroom_block_cap_010111 +mcl_deepslate:deepslatecobbledwall_15 +mcl_walls:stonebrick_4 +mcl_farming:pumpkintige_linked_l +mcl_stairs:stair_diorite_smooth_outer +mcl_fences:jungle_fence_gate_open +mcl_core:frosted_ice_0 +mcl_end:end_rod_purple +mcl_stairs:slab_deepslate_cobbled_top +mcl_wool:silver +mcl_colorblocks:concrete_magenta +mcl_stairs:stair_sandstonesmooth2_inner +mcl_walls:andesite_2 +mcl_core:stone_with_iron +mcl_mushrooms:brown_mushroom_block_cap_011110 +mcl_potions:strength_arrow_box +mcl_farming:melontige_7 +mcl_colorblocks:glazed_terracotta_pink +mesecons_torch:redstoneblock +mcl_walls:stonebrick_5 +mcl_flowers:lilac +mcl_deepslate:deepslatecobbledwall_3 +mcl_core:snow_5 +mcl_walls:brick_14 +mcl_core:lava_source +mcl_walls:granite_15 +mcl_crimson:warped_door_b_2 +mcl_stairs:slab_sandstone_top +mcl_signs:standing_sign_bamboo +mcl_mushrooms:red_mushroom_block_cap_101101 +mcl_walls:redsandstone_5 +mcl_walls:rednetherbrick_7 +mcl_stairs:slab_nether_brick +mcl_walls:brick_0 +mcl_meshhand:mcl_skins_base_1B47A57FF_female_surv +mcl_stairs:stair_sandstone +xpanes:pane_green_flat +mcl_signs:standing_sign_mangrove_wood +mesecons_button:button_wood_off +mcl_deepslate:deepslatepolishedwall_9 +mcl_stairs:stair_blackstone_inner +mcl_core:glass +mcl_stairs:slab_andesite_double +mcl_flowers:rose_bush_top +mcl_flowers:allium +mcl_ocean:brain_coral +mcl_potions:leaping_arrow_box +xpanes:pane_yellow_flat +mcl_cherry_blossom:cherrytree +mcl_stairs:stair_concrete_magenta_inner +mcl_blackstone:soul_torch_wall +mcl_blackstone:wall_6 +mcl_flowerpots:flower_pot_darksapling +mcl_end:end_rod_green +mcl_doors:jungle_trapdoor_ladder +mcl_mangrove:mangrove_door_t_2 +mcl_heads:wither_skeleton45 +mcl_walls:granite_6 +mcl_stairs:slab_stone_rough_top +mcl_compressed_blocks:sextuple_compressed_cobblestone +mcl_signs:standing_sign45_mangrove_wood +mcl_walls:stonebrickmossy_0 +mcl_stairs:stair_bamboo_stripped_outer +mcl_crimson:warped_roots +mcl_signs:wall_sign_warped_hyphae_wood +mcl_stairs:stair_tree_bark +mcl_enchanting:table +mcl_core:mycelium +mesecons_lightstone:lightstone_on_cyan +mclx_fences:red_nether_brick_fence +mcl_stairs:slab_deepslate_polished +mcl_stairs:slab_concrete_silver_top +mcl_walls:prismarine_10 +air +mcl_walls:granite +mcl_mangrove:propagule_mud +mcl_core:darkleaves +mcl_chests:red_shulker_box_small +mcl_farming:sweet_berry_bush_1 +mcl_composters:composter_2 +mcl_beehives:bee_nest_2 +mcl_potions:frost_arrow_box +mcl_walls:redsandstone_11 +mcl_walls:mossycobble_7 +mesecons_lightstone:lightstone_on_blue +mcl_deepslate:deepslatebrickswall_6 +mcl_cherry_blossom:stripped_cherrytree_bark +mcl_crimson:warped_hyphae_wood +vl_hollow_logs:stripped_crimson_hyphae_hollow +mcl_cauldrons:cauldron +mcl_potions:resistance_arrow_box +mcl_stairs:stair_mangrove_wood_outer +mcl_copper:block_weathered_cut +mcl_walls:stonebrickmossy_12 +mcl_beehives:bee_nest_3 +mcl_farming:potato_3 +mcl_stairs:stair_andesite_smooth +mcl_deepslate:deepslatepolishedwall_14 +mcl_stairs:stair_waxed_copper_weathered_cut_inner +mesecons_button:button_polished_blackstone_on +mcl_deepslate:deepslatecobbledwall_16 +mcl_stairs:stair_prismarine_dark_inner +mcl_crimson:nether_sprouts +mcl_core:light_0 +mcl_ocean:seagrass_redsand +mcl_blackstone:wall_5 +mcl_fences:dark_oak_fence +mcl_walls:stonebrick_6 +mcl_farming:pumpkin +mcl_doors:jungle_door_t_1 +mcl_colorblocks:concrete_powder_silver +mcl_stairs:slab_sprucetree_bark +mcl_walls:endbricks_0 +mcl_beds:respawn_anchor_charged_2 +mcl_torches:torch +mcl_core:clay +mcl_fences:birch_fence_gate +mcl_core:snow_4 +mcl_banners:standing_banner +mcl_wool:purple +mcl_chests:green_shulker_box_small +mcl_walls:rednetherbrick_14 +mcl_lanterns:lantern_ceiling +mcl_fences:jungle_fence +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_crea +mcl_stairs:stair_sprucetree_bark +mcl_stairs:stair_deepslate_polished_inner +mcl_stairs:slab_goldblock +mcl_walls:rednetherbrick_6 +mcl_mangrove:mangrove_wood_fence_gate +mcl_smithing_table:table +mcl_stairs:slab_quartzblock_double +mcl_crimson:stripped_warped_hyphae_bark +mcl_stairs:slab_deepslate_polished_top +mcl_stairs:slab_copper_exposed_cut +mcl_amethyst:amethyst_cluster +mcl_sculk:catalyst +mcl_beds:bed_magenta_bottom +mesecons_pressureplates:pressure_plate_crimson_hyphae_wood_on +mcl_colorblocks:concrete_yellow +mcl_stairs:slab_concrete_grey_top +mcl_walls:redsandstone_0 +mesecons_delayer:delayer_on_1 +mcl_crimson:crimson_door_b_1 +mcl_deepslate:deepslate_with_redstone_lit +mcl_nether:red_nether_brick +mcl_walls:granite_7 +mcl_walls:diorite_15 +mcl_stairs:stair_quartzblock_outer +mcl_walls:mudbrick_14 +mcl_core:diorite_smooth +mcl_wool:brown +mcl_colorblocks:hardened_clay_brown +mcl_doors:acacia_trapdoor_open +mcl_farming:soil_wet +mcl_mushrooms:mushroom_red +mcl_flowerpots:flower_pot_cactus +mesecons_commandblock:commandblock_on +mcl_stairs:slab_jungletree_bark +mesecons_lightstone:lightstone_on_white +mcl_doors:birch_trapdoor_open +mcl_walls:stonebrick_21 +mcl_ocean:tube_coral +mcl_stairs:slab_copper_weathered_cut_top +mcl_stairs:slab_acaciawood_double +mcl_walls:prismarine_7 +mcl_stairs:slab_blackstone +mcl_chests:trapped_chest_left +mesecons_pistons:piston_normal_on +mcl_stairs:stair_blackstone_polished_inner +mcl_ocean:sea_pickle_3_dead_brain_coral_block +mesecons_lightstone:lightstone_on_red +mcl_flowers:clover +mcl_stairs:stair_quartzblock_inner +mcl_stairs:stair_tree_bark_inner +mcl_hoppers:hopper_side_disabled +mesecons_lightstone:lightstone_on_yellow +mcl_doors:jungle_door_t_4 +mcl_farming:sweet_berry_bush_2 +mcl_cherry_blossom:cherrywood +mcl_walls:sandstone_11 +mcl_core:glass_purple +mcl_copper:waxed_block +mesecons_lightstone:lightstone_off_brown +mcl_cauldrons:cauldron_2 +mcl_walls:diorite_7 +mcl_composters:composter_1 +mcl_stairs:slab_red_nether_brick +mcl_core:light_11 +mcl_lanterns:soul_lantern_floor +mcl_walls:mossycobble_0 +mcl_deepslate:deepslatetileswall_16 +mcl_crimson:warped_fence_gate_open +mcl_stairs:stair_stonebrickcracked_inner +mcl_farming:potato_2 +mesecons_pistons:piston_up_pusher_normal +mcl_blackstone:wall_21 +mcl_stairs:slab_deepslate_tiles_top +xpanes:pane_natural_flat +mcl_mangrove:mangrove_trapdoor_open +mcl_walls:stonebrickmossy_13 +mcl_stairs:slab_mossycobble_double +mcl_doors:jungle_trapdoor_open +mcl_flowerpots:flower_pot_dandelion +mcl_potions:invisibility_arrow_box +mcl_flowers:sunflower +mcl_cherry_blossom:cherryleaves_orphan +mcl_farming:pumpkin_face_light +mcl_colorblocks:hardened_clay_lime +mcl_mushrooms:brown_mushroom_block_cap_001100 +mcl_walls:prismarine_0 +mcl_walls:prismarine_21 +mcl_deepslate:infested_deepslate +mcl_mushrooms:red_mushroom_block_cap_000011 +mcl_crafting_table:crafting_table +mcl_stairs:slab_darkwood +mcl_walls:brick_15 +mcl_core:stripped_dark_oak +mcl_colorblocks:concrete_powder_red +mcl_beds:bed_magenta_top +mcl_stairs:slab_granite_smooth +mcl_chests:trapped_chest_on_left +mcl_bamboo:bamboo +mcl_chests:ender_chest_small +vl_hollow_logs:stripped_acacia_hollow +mcl_chests:violet_shulker_box_small +mcl_core:stone +mcl_dispensers:dispenser +mcl_wool:yellow_carpet +mcl_furnaces:furnace_active +mcl_walls:rednetherbrick_1 +mcl_nether:quartz_block +mcl_walls:brick_16 +mcl_stairs:slab_copper_weathered_cut +mcl_copper:waxed_block_oxidized +mcl_mushrooms:brown_mushroom_block_cap_001101 +mcl_mushrooms:brown_mushroom_block_cap_011001 +mcl_cherry_blossom:cherry_door_b_3 +mcl_walls:endbricks_2 +mcl_core:brick_block +mcl_walls:mudbrick_11 +mcl_heads:skeleton_wall +mcl_comparators:comparator_off_comp +mcl_core:stripped_jungle_bark +mcl_colorblocks:concrete_light_blue +mcl_core:snow_8 +mcl_walls:granite_8 +mcl_farming:melon +mcl_beehives:beehive_2 +mcl_stairs:slab_copper_cut_top +mcl_core:acaciatree +mcl_stairs:stair_quartzblock +mcl_walls:redsandstone_7 +mcl_wool:light_blue +mcl_doors:wooden_door_b_3 +mcl_stairs:slab_mossycobble_top +mcl_bamboo:bamboo_3 +mcl_deepslate:deepslatepolishedwall_16 +mcl_compressed_blocks:quadruple_compressed_cobblestone +mcl_core:darktree +mcl_stairs:slab_sandstonesmooth2_double +mcl_deepslate:deepslatetileswall_3 +mcl_end:purpur_block +mcl_doors:dark_oak_trapdoor_ladder +mcl_deepslate:deepslatebrickswall_5 +mcl_copper:waxed_block_cut +mcl_walls:endbricks_14 +mcl_stairs:stair_concrete_red +mcl_colorblocks:concrete_black +mcl_deepslate:deepslatecobbledwall_10 +mcl_doors:jungle_door_t_3 +mcl_mushrooms:brown_mushroom_block_cap_000111 +mcl_walls:netherbrick_8 +mcl_farming:melontige_5 +mcl_mushrooms:brown_mushroom_block_cap_000011 +mcl_doors:birch_door_t_4 +mcl_stairs:stair_concrete_blue +mcl_walls:rednetherbrick_10 +xpanes:pane_pink +mcl_walls:diorite_0 +mcl_meshhand:mcl_skins_character_1_female_crea +mcl_stairs:stair_andesite_smooth_outer +mcl_walls:granite_9 +mcl_flowerpots:flower_pot_cornflower +mcl_walls:andesite_21 +mesecons_lightstone:lightstone_off_magenta +mcl_chests:orange_shulker_box +mcl_end:end_rod_yellow +mesecons_pressureplates:pressure_plate_warped_hyphae_wood_off +mcl_flowers:oxeye_daisy +mcl_crimson:warped_door_t_4 +mcl_end:end_rod_magenta +mcl_walls:sandstone_2 +mcl_core:birchwood +xpanes:pane_blue +mesecons_lightstone:lightstone_on_brown +mesecons_pistons:piston_down_normal_on +mcl_chests:grey_shulker_box +mcl_cauldrons:cauldron_1_lava +mcl_stairs:stair_redsandstone_outer +mcl_stairs:stair_end_bricks_outer +mcl_stairs:stair_bamboo_mosaic_outer +mcl_colorblocks:glazed_terracotta_grey +mcl_farming:pumpkin_face +mcl_doors:trapdoor_open +mcl_walls:mossycobble_1 +mcl_walls:prismarine_1 +mcl_nether:ancient_debris +mcl_walls:mudbrick_1 +mcl_colorblocks:concrete_red +mcl_stairs:stair_blackstone_chiseled_polished_inner +mcl_potions:water_breathing_arrow_box +mesecons_delayer:delayer_on_locked +mcl_brewing:stand_101 +mcl_walls:granite_1 +mcl_walls:redsandstone_2 +mcl_walls:redsandstone_13 +mcl_stairs:slab_copper_cut_double +mcl_deepslate:deepslate_with_coal +mcl_colorblocks:glazed_terracotta_pillar_black +mcl_mushrooms:red_mushroom_block_cap_011110 +mcl_stairs:slab_redsandstone_top +mcl_campfires:soul_campfire +mcl_core:cactus +mcl_deepslate:deepslate_bricks +mcl_walls:rednetherbrick_16 +mcl_stairs:slab_redsandstonesmooth2 +mcl_core:sandstonesmooth +mcl_core:light_12 +mcl_deepslate:deepslatetileswall_15 +mcl_wool:magenta +mcl_furnaces:furnace +mcl_crimson:crimson_fence +mcl_deepslate:deepslatepolishedwall_4 +mcl_walls:mudbrick_16 +mcl_stairs:stair_blackstone_polished +mcl_walls:stonebrick_0 +mcl_cherry_blossom:cherry_door_b_2 +mcl_walls:cobble_21 +mcl_walls:granite_11 +mcl_colorblocks:glazed_terracotta_pillar_lime +mcl_stairs:stair_redsandstone_inner +mcl_flowerpots:flower_pot_mushroom_brown +mcl_flowers:fern +mcl_stairs:slab_end_bricks_double +mcl_stairs:slab_brick_block_top +mcl_core:redsandstonesmooth2 +mcl_target:target_on +mcl_blackstone:wall_16 +mcl_stairs:stair_darktree_bark +mcl_stairs:stair_red_nether_brick +mcl_blackstone:wall_7 +mcl_stairs:stair_waxed_copper_exposed_cut_outer +xpanes:pane_silver +mcl_doors:wooden_door_b_2 +mcl_doors:spruce_door_t_1 +mcl_bamboo:bamboo_2 +mcl_fire:eternal_fire +mcl_mangrove:mangrove_door_t_3 +mcl_stairs:stair_red_nether_brick_outer +mcl_ocean:fire_coral_block +mcl_core:crying_obsidian +mcl_walls:sandstone_21 +mcl_heads:stalker_wall +mcl_deepslate:tuff +mcl_stairs:stair_blackstone_chiseled_polished_outer +mcl_stairs:slab_blackstone_polished_top +mcl_stairs:stair_deepslate_polished_outer +mcl_colorblocks:hardened_clay_purple +mcl_stairs:slab_andesite_smooth_double +mesecons_pistons:piston_down_pusher_sticky +mcl_core:glass_silver +mcl_farming:pumpkin_5 +mcl_deepslate:deepslatebrickswall_4 +mcl_walls:rednetherbrick_0 +mcl_stairs:stair_waxed_copper_cut_inner +mcl_copper:block_oxidized_cut +mcl_stairs:stair_jungletree_bark_inner +mcl_crimson:warped_trapdoor_ladder +mcl_ocean:kelp_redsand +mcl_beds:bed_grey_bottom +mcl_mangrove:hanging_propagule_1 +mcl_stairs:stair_prismarine_dark_outer +mcl_walls:endbricks_15 +mcl_fences:acacia_fence_gate_open +mcl_stairs:slab_copper_oxidized_cut_top +mcl_stairs:slab_redsandstone_double +mcl_flowerpots:flower_pot_warped_fungus +mcl_walls:sandstone +mcl_stairs:stair_warped_hyphae_wood_inner +mcl_walls:rednetherbrick_13 +mcl_maps:filled_map_character_male_surv +mcl_stairs:slab_waxed_copper_weathered_cut_double +mcl_heads:wither_skeleton67_5 +mcl_deepslate:deepslatecobbledwall_11 +mcl_stairs:stair_sandstone_inner +mcl_walls:mossycobble_2 +mcl_stairs:slab_prismarine_dark_double +mcl_stairs:slab_concrete_white_double +mcl_core:tree_bark +mcl_stairs:stair_blackstone_chiseled_polished +mcl_crimson:crimson_roots +mcl_walls:diorite_1 +mcl_walls:sandstone_13 +mcl_stairs:stair_bamboo_plank +mcl_deepslate:deepslate +mcl_stairs:slab_stonebrickcracked +mcl_doors:jungle_trapdoor +mcl_core:water_source +mesecons_lightstone:lightstone_off_lightblue +mcl_walls:mudbrick_2 +mcl_wool:black_carpet +mcl_stairs:slab_wood_top +mcl_walls:cobble_14 +mcl_farming:melontige_3 +mcl_stairs:stair_cobble +mcl_deepslate:deepslatetileswall +mcl_crimson:warped_fungus +mcl_copper:stone_with_copper +mcl_stairs:stair_prismarine_outer +mcl_mushrooms:brown_mushroom_block_cap_101000 +mcl_walls:netherbrick_9 +mcl_core:jungletree_bark +mcl_wool:red_carpet +mcl_amethyst:small_amethyst_bud +mcl_core:sprucesapling +mcl_walls:prismarine_2 +mesecons_lightstone:lightstone_off_orange +mcl_stairs:stair_stonebrickmossy_outer +mcl_stairs:slab_birchwood +mcl_beds:respawn_anchor_charged_1 +mcl_walls:mossycobble_21 +mcl_core:redsand +mcl_meshhand:mcl_skins_character_1_female_surv +mcl_stairs:slab_concrete_brown +mcl_signs:standing_sign45_bamboo +mcl_core:jungleleaves_orphan +mcl_farming:melontige_unconnect +mcl_walls:redsandstone_1 +mcl_signs:standing_sign67_5_crimson_hyphae_wood +mcl_minecarts:rail +mesecons:wire_00010000_off +mcl_stairs:slab_granite_double +mcl_stairs:stair_diorite +mcl_stairs:slab_jungletree_bark_double +mcl_beds:bed_lime_bottom +mcl_chests:blue_shulker_box_small +mcl_stairs:stair_granite_smooth_outer +mcl_stairs:slab_mangrove_wood_top +mcl_brewing:stand_100 +mcl_stairs:stair_concrete_light_blue_outer +mcl_walls:granite_16 +mcl_end:end_rod_grey +mcl_chests:magenta_shulker_box +mcl_cherry_blossom:cherry_door_b_1 +mcl_core:mossycobble +mcl_stairs:stair_copper_cut_outer +mcl_crimson:warped_fence_gate +mcl_stairs:slab_redsandstone +mcl_walls:cobble_15 +mcl_stairs:stair_stonebrickmossy_inner +mcl_core:glass_orange +mcl_core:light_7 +mcl_doors:jungle_door_b_3 +mcl_stairs:slab_mangrove_wood_double +mcl_stairs:slab_waxed_copper_cut +mcl_doors:wooden_door_b_1 +mcl_chests:black_shulker_box +mcl_walls:diorite_14 +mcl_signs:standing_sign22_5 +mcl_walls:stonebrick_1 +mcl_core:glass_blue +mcl_ocean:dead_bubble_coral +mcl_stairs:slab_copper_weathered_cut_double +mcl_stairs:stair_bamboo_mosaic +mcl_deepslate:deepslatetileswall_9 +mcl_minecarts:golden_rail +mcl_stairs:slab_stonebrickmossy +mcl_signs:standing_sign22_5_bamboo +mcl_stairs:stair_goldblock_inner +mcl_core:obsidian +mesecons_delayer:delayer_on_4 +mcl_walls:rednetherbrick_3 +mcl_crimson:crimson_door_b_4 +mcl_droppers:dropper_down +mcl_stairs:stair_mud_brick_inner +mcl_farming:carrot +mcl_cake:cake_2 +mcl_farming:pumpkin_4 +mcl_core:slimeblock +mcl_stairs:stair_waxed_copper_cut_outer +mcl_stairs:slab_bamboo_mosaic +mcl_stairs:slab_birchwood_double +mcl_stairs:slab_diorite_smooth_double +mcl_flowers:cornflower +mcl_stairs:stair_concrete_white_outer +mcl_stairs:slab_blackstone_double +mcl_blackstone:wall_14 +mcl_stairs:stair_redsandstone +mcl_blackstone:soul_fire +mcl_core:glass_black +mcl_core:birchleaves_orphan +mcl_stairs:stair_prismarine_dark +mcl_walls:rednetherbrick_12 +mcl_mangrove:mangrove_trapdoor_ladder +mcl_stairs:stair_goldblock +mcl_chests:chest +mcl_chests:black_shulker_box_small +mcl_walls:diorite_2 +mcl_core:birchleaves +mcl_deepslate:deepslatecobbledwall_12 +mcl_itemframes:item_frame +mcl_walls:prismarine_3 +mcl_deepslate:deepslate_with_gold +mcl_composters:composter_6 +mcl_heads:stalker +mcl_monster_eggs:monster_egg_cobble +mcl_stairs:slab_deepslate_tiles_double +mcl_stairs:stair_stone_rough_outer +mcl_stairs:stair_diorite_smooth_inner +mcl_farming:carrot_5 +mcl_chests:cyan_shulker_box +mcl_farming:beetroot_1 +xpanes:pane_red +mcl_core:light_10 +mcl_stairs:slab_granite_smooth_double +mcl_crimson:stripped_crimson_hyphae +mcl_stairs:slab_wood +mcl_copper:block_weathered +mcl_walls:mossycobble_3 +mcl_walls:mudbrick_3 +mcl_deepslate:deepslatebrickswall_14 +mcl_deepslate:deepslatebrickswall_2 +mesecons_lightstone:lightstone_on_lightblue +mcl_colorblocks:glazed_terracotta_silver +mcl_stairs:slab_concrete_light_blue_top +mcl_stairs:slab_cherrywood_double +mcl_doors:acacia_door_b_3 +mcl_core:granite +mcl_deepslate:deepslatetileswall_21 +mcl_farming:melontige_6 +mcl_crimson:crimson_door_t_4 +mcl_stairs:stair_copper_exposed_cut +mcl_bamboo:pressure_plate_bamboo_wood_off +mesecons_pressureplates:pressure_plate_mangrove_wood_on +mcl_mushrooms:red_mushroom_block_cap_111010 +mcl_stairs:stair_copper_oxidized_cut_outer +mcl_farming:melontige_linked_b +mcl_potions:swiftness_arrow_box +mcl_ocean:horn_coral_fan +mcl_crimson:crimson_hyphae_wood +mcl_core:dirt_with_grass +mcl_doors:iron_trapdoor +mcl_deepslate:deepslatepolishedwall_6 +mcl_compressed_blocks:triple_compressed_cobblestone +mcl_bells:bell +mcl_walls:brick_11 +mcl_copper:block +mesecons_lightstone:lightstone_on_black +mcl_stairs:slab_crimson_hyphae_wood_top +mcl_wool:black +mcl_wool:light_blue_carpet +mcl_ocean:brain_coral_block +mcl_colorblocks:hardened_clay_orange +mcl_flowerpots:flower_pot_tulip_red +mcl_potions:nausea_arrow_box +mcl_signs:wall_sign +mcl_stairs:stair_waxed_copper_oxidized_cut_outer +mcl_crimson:warped_trapdoor_open +mcl_fences:fence_gate_open +mcl_doors:spruce_trapdoor +mcl_walls:mudbrick_10 +mcl_wool:lime +mesecons_lightstone:lightstone_on_pink +mcl_deepslate:deepslatecobbledwall_8 +mcl_mangrove:mangrove_stripped +mcl_walls:stonebrick_2 +mcl_copper:block_oxidized +mcl_stairs:slab_blackstone_top +mcl_crimson:crimson_door_t_1 +mcl_colorblocks:concrete_powder_cyan +mcl_farming:wheat_7 +mcl_walls:granite_13 +mcl_stairs:stair_stonebrickcracked +mcl_composters:composter_5 +mcl_mushrooms:brown_mushroom_block_cap_000010 +mesecons_delayer:delayer_off_locked +mcl_signs:standing_sign67_5 +mcl_crimson:warped_hyphae +mcl_stairs:slab_quartzblock_top +mcl_cherry_blossom:cherry_trapdoor_ladder +mcl_maps:filled_map_mcl_skins_character_1_female_surv +mcl_deepslate:deepslatetileswall_8 +mcl_beehives:beehive_1 +mcl_walls:netherbrick +mesecons_lightstone:lightstone_off_white +mcl_core:snow +mcl_core:snowblock +mcl_signs:wall_sign_crimson_hyphae_wood +mcl_observers:observer_down_on +mcl_walls:endbricks_21 +mcl_deepslate:deepslatetileswall_13 +mcl_colorblocks:hardened_clay_silver +mcl_flowers:fourleaf_clover +mcl_signs:standing_sign22_5_crimson_hyphae_wood +mcl_walls:diorite_11 +xpanes:pane_purple +mesecons_lightstone:lightstone_off_silver +mcl_deepslate:deepslatebrickswall +mcl_blackstone:nether_gold +mcl_bamboo:bamboo_fence_gate_open +mcl_portals:portal +mcl_fletching_table:fletching_table +mcl_deepslate:deepslatecobbledwall_13 +mcl_flowers:sunflower_top +mcl_beds:bed_silver_top +mcl_deepslate:deepslatebrickswall_1 +mcl_heads:skeleton +mcl_bamboo:bamboo_block +mcl_doors:jungle_door_b_2 +mcl_blackstone:blackstone +mcl_deepslate:deepslatecobbledwall_21 +mcl_compressed_blocks:octuple_compressed_cobblestone +mcl_stairs:slab_prismarine_dark_top +mcl_mushrooms:red_mushroom_block_stem +mcl_beds:bed_cyan_bottom +mcl_walls:redsandstone_3 +mcl_stairs:slab_deepslate_cobbled_double +mcl_deepslate:deepslatebrickswall_15 +mcl_stairs:slab_stonebrick_double +mcl_mushrooms:mushroom_brown +mcl_chests:orange_shulker_box_small +mcl_stairs:slab_stone_top +mcl_deepslate:deepslatepolishedwall_15 +mcl_stairs:slab_concrete_purple +mesecons_torch:mesecon_torch_off +mcl_stairs:slab_deepslate_cobbled +mcl_campfires:campfire_lit +mcl_stairs:slab_prismarine_top +mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_crea +mcl_walls:brick_9 +mcl_core:deadbush +mcl_walls:sandstone_1 +mcl_core:stone_with_gold +mcl_crimson:warped_door_t_1 +mcl_farming:melontige_1 +mcl_farming:beetroot_0 +mcl_stairs:stair_quartz_smooth_outer +mcl_beds:respawn_anchor +mcl_stairs:stair_blackstone_brick_polished_inner +mclx_fences:red_nether_brick_fence_gate +mcl_walls:mudbrick +mcl_observers:observer_up_off +mesecons_lightstone:lightstone_on_orange +mcl_mangrove:mangroveleaves_orphan +mcl_nether:quartz_smooth +mcl_farming:pumpkin_6 +mcl_end:end_bricks +mcl_mushrooms:red_mushroom_block_cap_101111 +mcl_walls:netherbrick_4 +mcl_minecarts:activator_rail +vl_hollow_logs:acaciatree_hollow +mcl_stairs:slab_concrete_silver_double +mcl_beds:bed_light_blue_top +mcl_walls:andesite_8 +mcl_signs:wall_sign_darkwood +mcl_crimson:warped_door_b_4 +mcl_bamboo:bamboo_door_t_3 +mcl_flowers:peony +mcl_potions:weakness_arrow_box +mcl_stairs:stair_prismarine +mcl_nether:nether_wart_1 +mcl_portals:portal_end +mcl_signs:standing_sign45_crimson_hyphae_wood +mcl_stairs:stair_red_nether_brick_inner +mcl_end:chorus_plant +mcl_stairs:slab_blackstone_chiseled_polished_top +mcl_flowers:wither_rose +mcl_mangrove:river_water_logged_roots +mcl_deepslate:deepslatepolishedwall_7 +mcl_stairs:slab_deepslate_bricks +mcl_walls:granite_10 +mesecons_button:button_crimson_hyphae_wood_off +mcl_walls:sandstone_15 +mcl_deepslate:deepslatecobbledwall_9 +mcl_colorblocks:hardened_clay_magenta +mcl_signs:standing_sign67_5_warped_hyphae_wood +mcl_core:redsandstonecarved +mcl_flowers:tulip_white +mcl_nether:nether_wart +mcl_stairs:stair_cobble_outer +mcl_walls:cobble_4 +mcl_deepslate:deepslate_with_emerald +mesecons_button:button_birchwood_on +mcl_farming:melontige_linked_t +mcl_compressed_blocks:quintuple_compressed_cobblestone +mcl_core:water_flowing +mcl_deepslate:deepslatetileswall_12 +mcl_blackstone:wall_12 +mcl_minecarts:detector_rail_on +mcl_doors:wooden_door_t_3 +mcl_stairs:stair_andesite_smooth_inner +mcl_flowerpots:flower_pot_azure_bluet +mcl_core:coalblock +mcl_ocean:horn_coral +mcl_ocean:dead_brain_coral +mcl_core:darksapling +mcl_walls:redsandstone +mcl_droppers:dropper_up +mcl_monster_eggs:monster_egg_stonebrick +mcl_ocean:bubble_coral +mcl_end:end_rod_orange +mcl_stairs:stair_blackstone_brick_polished +mcl_stairs:stair_deepslate_cobbled +mcl_stairs:slab_purpur_block_double +mcl_stairs:stair_bamboo_stripped +vl_hollow_logs:birchtree_hollow +mcl_compressed_blocks:compressed_cobblestone +mcl_walls:endbricks_10 +mcl_lanterns:lantern_floor +mcl_walls:redsandstone_21 +mcl_stairs:slab_lapisblock_double +mcl_monster_eggs:monster_egg_stonebrickcarved +mcl_anvils:anvil_damage_1 +mesecons_commandblock:commandblock_off +mcl_stairs:slab_waxed_copper_exposed_cut +mcl_stairs:slab_waxed_copper_exposed_cut_double +mcl_crimson:warped_nylium +mesecons_lightstone:lightstone_off_blue +mcl_potions:slowness_arrow_box +mcl_stairs:stair_concrete_grey_outer +mcl_core:sprucetree_bark +mcl_stairs:slab_crimson_hyphae_wood +mcl_stairs:slab_cobble_double +mcl_beehives:bee_nest_1 +mcl_core:gravel +xpanes:pane_red_flat +mcl_signs:wall_sign_sprucewood +mesecons_lightstone:lightstone_off_grey +mcl_mangrove:mangrove_door_b_1 +mcl_doors:acacia_door_t_4 +mcl_deepslate:deepslatetileswall_6 +mcl_deepslate:deepslatepolishedwall_12 +mcl_walls:brick_12 +mcl_deepslate:deepslatetileswall_11 +mcl_ocean:sea_pickle_4_dead_brain_coral_block +mcl_stairs:stair_prismarine_brick_inner +mcl_mushrooms:brown_mushroom_block_stem_full +mcl_walls:netherbrick_5 +mcl_walls:mossycobble +mcl_walls:netherbrick_13 +mcl_core:birchsapling +mcl_stairs:stair_copper_weathered_cut_outer +mcl_farming:pumpkin_1 +mcl_flowers:tulip_pink +mcl_blackstone:wall_13 +mcl_core:emeraldblock +mcl_doors:dark_oak_door_t_4 +mcl_mushrooms:red_mushroom_block_cap_000100 +mcl_bamboo:bamboo_door_b_4 +mcl_core:stripped_jungle +mcl_deepslate:deepslate_chiseled +mesecons_pressureplates:pressure_plate_darkwood_off +mcl_flowers:tulip_orange +xpanes:pane_natural +mcl_deepslate:deepslatepolishedwall_0 +mcl_stairs:slab_andesite_smooth +mcl_walls:mossycobble_14 +mcl_flowerpots:flower_pot_poppy +mcl_beehives:beehive_4 +mcl_copper:waxed_block_oxidized_cut +mcl_colorblocks:glazed_terracotta_pillar_yellow +mcl_nether:nether_brick +mcl_stairs:slab_waxed_copper_oxidized_cut_top +mcl_chests:grey_shulker_box_small +mcl_cherry_blossom:cherry_fence_gate +mesecons_button:button_mangrove_wood_on +mcl_stairs:stair_redsandstonesmooth2 +mcl_stairs:stair_deepslate_cobbled_inner +mcl_wool:silver_carpet +mcl_core:stone_smooth +mcl_heads:steve22_5 +mcl_walls:endbricks_11 +mcl_core:stripped_birch +mcl_crimson:crimson_fence_gate_open +mcl_chests:trapped_chest_small +mcl_nether:nether_wart_0 +mcl_end:end_rod +mcl_deepslate:deepslatecobbledwall +mcl_stairs:stair_junglewood_inner +mcl_heads:steve67_5 +mcl_farming:carrot_7 +mcl_stairs:stair_redsandstonesmooth2_inner +mcl_core:stripped_oak +mcl_bamboo:bamboo_fence +mesecons_delayer:delayer_off_2 +mcl_ocean:dead_bubble_coral_block +mcl_stairs:stair_deepslate_bricks_inner +mesecons_pressureplates:pressure_plate_polished_blackstone_on +mcl_signs:standing_sign_crimson_hyphae_wood +mcl_doors:wooden_door_t_2 +mcl_walls:sandstone_12 +mcl_stairs:slab_birchtree_bark_top +mcl_potions:health_boost_arrow_box +mcl_walls:granite_5 +mcl_mangrove:mangrove_mud_roots +mcl_stairs:slab_blackstone_polished_double +mcl_crimson:crimson_fence_gate +mcl_stairs:slab_granite_top +mcl_walls:diorite_13 +mcl_stairs:stair_darktree_bark_inner +mcl_walls:prismarine_16 +xpanes:pane_white_flat +mcl_walls:netherbrick_11 +mcl_core:junglesapling +mcl_walls:redsandstone_8 +mcl_walls:mudbrick_12 +mcl_mud:mud_bricks +mcl_colorblocks:concrete_brown +mclx_core:river_water_flowing +mcl_stairs:stair_sprucewood_inner +mesecons_lightstone:lightstone_off_purple +mcl_stairs:stair_warped_hyphae_wood +mcl_chests:lightblue_shulker_box_small +mcl_signs:standing_sign_darkwood +mcl_smoker:smoker +mcl_stairs:stair_blackstone_brick_polished_outer +mcl_potions:blindness_arrow_box +mesecons_button:button_darkwood_on +mcl_mangrove:mangrove_trapdoor +mcl_ocean:dead_fire_coral_fan +mcl_walls:brick_13 +mcl_deepslate:deepslatebrickswall_7 +mcl_farming:wheat_5 +mcl_colorblocks:glazed_terracotta_pillar_white +mcl_mangrove:mangrove_stripped_bark +mcl_smoker:smoker_active +mesecons_solarpanel:solar_panel_inverted_off +mcl_core:acaciawood +mcl_bamboo:bamboo_mosaic +mcl_crimson:crimson_trapdoor +mcl_compressed_blocks:septuple_compressed_cobblestone +mcl_core:stripped_oak_bark +mcl_core:birchtree +mesecons_pressureplates:pressure_plate_sprucewood_on +mcl_walls:diorite_21 +xpanes:pane_gray +mcl_farming:soil +mcl_mangrove:mangrove_wood +mcl_stairs:stair_tree_bark_outer +mcl_farming:beetroot_2 +mcl_farming:melontige_linked_r +mcl_deepslate:deepslatepolishedwall_1 +mcl_stairs:slab_stone_rough +mcl_colorblocks:hardened_clay_red +mcl_stairs:stair_sprucetree_bark_inner +mcl_walls:netherbrick_6 +mcl_stairs:stair_end_bricks +mcl_blackstone:basalt +mcl_blackstone:soul_torch +mcl_beacons:beacon_beam +mcl_stairs:slab_quartz_smooth +mcl_core:stone_with_lapis +mcl_walls:cobble_10 +mcl_walls:andesite_14 +mcl_farming:potato +mcl_walls:netherbrick_12 +mcl_core:glass_brown +mcl_stairs:slab_warped_hyphae_wood_top +mcl_core:snow_3 +mcl_core:darkwood +mcl_heads:wither_skeleton_wall +mcl_flowers:lily_of_the_valley +mcl_campfires:campfire +mcl_ocean:tube_coral_block +mcl_mushrooms:red_mushroom_block_cap_001011 +mcl_stairs:stair_mud_brick_outer +mcl_ocean:sea_pickle_1_dead_brain_coral_block +mcl_core:stripped_birch_bark +mcl_mushrooms:red_mushroom_block_cap_010001 +mcl_stairs:stair_purpur_block +mcl_doors:trapdoor +mcl_end:end_rod_blue +mcl_farming:carrot_6 +mcl_stairs:stair_waxed_copper_exposed_cut +mcl_signs:wall_sign_birchwood +mcl_doors:iron_door_t_3 +mcl_minecarts:activator_rail_on +mesecons_solarpanel:solar_panel_off +mcl_signs:standing_sign45_warped_hyphae_wood +mcl_core:goldblock +mcl_mushrooms:brown_mushroom_block_cap_101011 +mcl_doors:iron_door_b_4 +mcl_walls:endbricks_8 +mcl_farming:wheat_6 +mcl_nether:glowstone +mcl_stairs:stair_goldblock_outer +mcl_colorblocks:concrete_powder_black +mcl_portals:end_portal_frame_eye +mcl_doors:wooden_door_t_1 +mcl_chests:yellow_shulker_box_small +mcl_jukebox:jukebox +mcl_core:stone_with_coal +vl_hollow_logs:darktree_hollow +mcl_core:stripped_acacia +mcl_potions:absorption_arrow_box +mcl_monster_eggs:monster_egg_stone +mcl_doors:birch_door_t_2 +mcl_flowerpots:flower_pot_acaciasapling +mcl_flowers:azure_bluet +mcl_walls:diorite_10 +mclx_fences:red_nether_brick_fence_gate_open +mcl_stairs:stair_jungletree_bark +mcl_deepslate:deepslatetileswall_5 +mcl_stairs:slab_end_bricks +mcl_walls:stonebrickmossy_15 +mcl_stairs:slab_concrete_silver +mcl_stairs:stair_blackstone_polished_outer +mcl_core:glass_gray +mcl_ocean:bubble_coral_fan +mesecons:wire_10111011_off +mcl_walls:endbricks_12 +mesecons_button:button_mangrove_wood_off +mcl_stairs:slab_waxed_copper_oxidized_cut +mcl_end:end_rod_cyan +mcl_core:glass_red +mcl_walls:stonebrickmossy_9 +mcl_core:stonebrick +mcl_deepslate:deepslatebrickswall_10 +mcl_walls:diorite +mcl_farming:pumpkintige_linked_r +mcl_walls:endbricks_13 +mesecons_button:button_wood_on +mcl_ocean:dead_horn_coral_fan +mcl_flowerpots:flower_pot_tulip_white +mcl_core:jungleleaves +mcl_stairs:slab_copper_exposed_cut_double +mcl_farming:melontige_2 +mcl_stairs:stair_purpur_block_outer +mcl_heads:stalker22_5 +mcl_bamboo:scaffolding +mcl_stairs:slab_concrete_green +mcl_mangrove:mangrove_door_b_3 +mcl_flowerpots:flower_pot_tulip_orange +mcl_stairs:stair_junglewood_outer +mcl_chests:trapped_chest_on_right +mcl_walls:cobble_11 +mcl_colorblocks:glazed_terracotta_pillar_grey +mcl_stairs:slab_mud_brick +mcl_deepslate:deepslatepolishedwall_2 +mcl_brewing:stand_001 +mcl_colorblocks:concrete_powder_green +mcl_crimson:warped_wart_block +mcl_ocean:dead_fire_coral_block +mcl_barrels:barrel_open +mcl_villages:structblock +mcl_cherry_blossom:pressure_plate_cherrywood_off +mesecons_pistons:piston_up_pusher_sticky +mcl_core:snow_2 +mcl_wool:pink +mcl_core:acaciasapling +mcl_wool:red +mcl_cake:cake_1 +mcl_fences:jungle_fence_gate +mcl_crimson:warped_door_b_1 +mcl_stairs:slab_prismarine_dark +mcl_beehives:beehive +mcl_stairs:stair_deepslate_bricks +mcl_cake:cake_6 +mcl_beds:respawn_anchor_charged_3 +mcl_beds:bed_white_top +mesecons_torch:mesecon_torch_off_wall +mcl_beds:bed_light_blue_bottom +mcl_beds:bed_lime_top +mcl_beds:bed_pink_top +mcl_beds:bed_pink_bottom +mcl_cocoas:cocoa_3 +mcl_beds:bed_brown_top +mcl_beds:bed_brown_bottom +mcl_beds:bed_purple_top +mcl_maps:filled_map_mcl_skins_base_18D471DFF_male_crea +mcl_loom:loom +mcl_beds:bed_orange_top +mcl_cherry_blossom:cherry_door_b_4 +mcl_beds:bed_orange_bottom +mcl_deepslate:deepslatecobbledwall_4 +mcl_beds:bed_green_top +mcl_crimson:warped_hyphae_bark +mcl_brewing:stand_000 +mcl_beds:bed_green_bottom +mcl_beds:bed_yellow_top +mcl_beds:bed_yellow_bottom +mcl_beds:bed_black_top +mcl_core:light_6 +mcl_beds:bed_silver_bottom +mcl_signs:standing_sign_warped_hyphae_wood +mcl_beds:bed_grey_top +mcl_monster_eggs:monster_egg_stonebrickmossy +mcl_beds:bed_cyan_top +mcl_beds:bed_blue_bottom +mcl_nether:nether_wart_2 +mcl_doors:acacia_door_t_2 +mcl_beds:bed_red_bottom +mcl_books:bookshelf +mcl_stairs:slab_bamboo_mosaic_top +mesecons_torch:mesecon_torch_on_wall +mcl_doors:iron_door_t_4 +mcl_walls:endbricks_9 +mesecons_solarpanel:solar_panel_on +mcl_potions:haste_arrow_box +mesecons_button:button_bamboo_on +mcl_beacons:beacon +mesecons_button:button_bamboo_off +mcl_stairs:stair_ironblock_inner +mcl_stairs:slab_bamboo_plank_double +mcl_meshhand:mcl_skins_base_1EEB592FF_female_crea +mcl_signs:standing_sign67_5_bamboo +mcl_signs:wall_sign_bamboo +mcl_bamboo:pressure_plate_bamboo_wood_on +mcl_copper:block_exposed_cut +mcl_bamboo:bamboo_fence_gate +mcl_stairs:slab_quartz_smooth_top +mcl_core:redsandstone +mcl_doors:wooden_door_b_4 +mcl_stairs:slab_bamboo_plank_top +mcl_farming:pumpkintige_linked_b +mcl_stairs:slab_bamboo_plank +mcl_mangrove:mangrove_door_t_4 +mcl_stairs:stair_bamboo_plank_inner +mcl_stairs:stair_bamboo_plank_outer +mcl_colorblocks:hardened_clay_pink +mcl_doors:dark_oak_door_t_1 +mesecons_pressureplates:pressure_plate_darkwood_on +mcl_stairs:slab_bamboo_stripped_top +mcl_stairs:stair_cobble_inner +mcl_stairs:slab_bamboo_stripped +mesecons:wire_10110011_off +mcl_stairs:slab_bamboo_block_double +mcl_stairs:slab_bamboo_block +mcl_amethyst:budding_amethyst_block +mcl_stairs:stair_bamboo_block_inner +mcl_stairs:stair_bamboo_block_outer +mcl_core:stonebrickcarved +mcl_stairs:stair_bamboo_block +mcl_bamboo:bamboo_trapdoor_ladder +mcl_bamboo:bamboo_trapdoor_open +mcl_stairs:slab_prismarine_brick +xpanes:pane_silver_flat +mcl_bamboo:bamboo_trapdoor +mcl_colorblocks:concrete_powder_white +mcl_bamboo:bamboo_door_b_3 +mcl_bamboo:bamboo_door_t_2 +mcl_crimson:crimson_hyphae_bark +mcl_stairs:stair_cherrywood_outer +mcl_walls:cobble_7 +mcl_mangrove:mangrove_roots +mcl_bamboo:bamboo_door_t_1 +mcl_bamboo:bamboo_door_b_1 +mcl_ocean:tube_coral_fan +mcl_stairs:slab_concrete_grey +mcl_stairs:slab_concrete_yellow +mcl_bamboo:bamboo_plank +mcl_bamboo:bamboo_block_stripped +mcl_bamboo:bamboo_endcap +mcl_blackstone:wall +mcl_blackstone:wall_15 +mcl_blackstone:wall_11 +mcl_grindstone:grindstone +mcl_mushrooms:red_mushroom_block_cap_111100 +mcl_blackstone:wall_8 +mcl_blackstone:wall_4 +mcl_nether:soul_sand +mcl_blackstone:wall_3 +mcl_blackstone:wall_2 +mcl_blackstone:wall_1 +mcl_blackstone:blackstone_chiseled_polished +mcl_stairs:slab_blackstone_brick_polished_top +mcl_stairs:slab_blackstone_brick_polished +mcl_stairs:slab_blackstone_chiseled_polished_double +mcl_stairs:slab_blackstone_chiseled_polished +mcl_stairs:slab_blackstone_polished +mcl_walls:netherbrick_14 +mcl_stairs:slab_darktree_bark +mcl_blackstone:soul_soil +mcl_core:light_14 +mcl_doors:birch_door_t_1 +mcl_deepslate:deepslate_bricks_cracked +mcl_blackstone:quartz_brick +mcl_blackstone:blackstone_brick_polished +xpanes:pane_magenta_flat +mcl_fences:fence +mcl_blackstone:wall_0 +mcl_blackstone:blackstone_polished +mcl_stairs:stair_ironblock +mcl_heads:steve +mcl_blackstone:basalt_polished +mcl_blackstone:blackstone_gilded +mcl_stairs:slab_concrete_light_blue_double +mcl_stairs:slab_concrete_light_blue +mcl_stairs:stair_concrete_light_blue_inner +mcl_stairs:stair_concrete_light_blue +mcl_amethyst:tinted_glass +mcl_stairs:slab_concrete_lime_double +mcl_stairs:slab_concrete_lime_top +mcl_walls:cobble_12 +mcl_stairs:slab_concrete_lime +mcl_stairs:stair_concrete_lime_inner +mcl_deepslate:deepslatetileswall_4 +mcl_stairs:stair_concrete_lime_outer +mcl_stairs:stair_concrete_lime +mcl_stairs:slab_concrete_pink_double +mesecons_button:button_warped_hyphae_wood_off +mcl_portals:end_portal_frame +mesecons_walllever:wall_lever_off +mcl_stairs:slab_concrete_pink_top +mcl_stairs:slab_concrete_pink +mcl_stairs:stair_concrete_pink_inner +mcl_deepslate:deepslatebrickswall_11 +mcl_stairs:stair_concrete_pink_outer +mcl_core:glass_pink +xpanes:pane_purple_flat +mcl_stairs:slab_concrete_brown_double +mcl_farming:wheat_3 +mcl_stairs:slab_concrete_brown_top +mcl_stairs:stair_concrete_brown_inner +vl_hollow_logs:mangrove_stripped_hollow +mcl_stairs:stair_concrete_brown_outer +mcl_stairs:stair_concrete_brown +mcl_stairs:slab_concrete_purple_double +mesecons_pistons:piston_down_pusher_normal +mcl_stairs:slab_concrete_purple_top +mcl_stairs:stair_concrete_purple_inner +mcl_stairs:stair_concrete_purple_outer +mcl_stairs:slab_acaciawood +mcl_stairs:slab_concrete_orange_double +mcl_stairs:slab_concrete_orange_top +mcl_stairs:stair_concrete_orange_inner +mcl_walls:prismarine_8 +mcl_stairs:stair_concrete_orange_outer +mcl_ocean:horn_coral_block +mcl_nether:nether_wart_block +mcl_mushrooms:brown_mushroom_block_cap_011000 +mcl_stairs:stair_copper_weathered_cut +mcl_deepslate:deepslatepolishedwall_11 +mcl_stairs:slab_concrete_magenta_top +mcl_core:light_8 +mcl_stairs:slab_concrete_magenta +mcl_mangrove:mangrove_door_b_2 +mcl_deepslate:deepslate_cobbled +mcl_walls:stonebrick_15 +mcl_stairs:stair_concrete_grey +mcl_stairs:slab_concrete_blue_double +mcl_stairs:slab_concrete_blue_top +mcl_stairs:slab_concrete_blue +mcl_doors:acacia_trapdoor +mcl_stairs:stair_concrete_blue_inner +mcl_stairs:stair_concrete_blue_outer +mcl_stairs:slab_concrete_cyan_double +mcl_stairs:slab_concrete_cyan_top +mcl_farming:pumpkin_3 +mcl_doors:dark_oak_door_b_4 +mcl_farming:melontige_linked_l +mcl_stairs:stair_concrete_cyan_inner +mcl_stairs:stair_concrete_cyan_outer +mcl_stairs:stair_concrete_cyan +mcl_stairs:slab_concrete_green_double +mcl_stairs:slab_concrete_green_top +mcl_stairs:stair_concrete_green_inner +mcl_stairs:stair_concrete_green_outer +mcl_core:light_4 +mcl_comparators:comparator_on_sub +mcl_stairs:stair_concrete_green +mcl_stairs:slab_concrete_yellow_double +mcl_stairs:slab_concrete_yellow_top +mcl_stairs:stair_concrete_yellow_inner +mcl_stairs:stair_concrete_yellow_outer +mcl_walls:mudbrick_9 +mcl_heads:stalker67_5 +mcl_stairs:slab_concrete_red_double +mcl_compressed_blocks:double_compressed_cobblestone +mcl_doors:birch_door_b_1 +mcl_stairs:slab_concrete_red_top +mcl_walls:netherbrick_0 +mcl_stairs:slab_concrete_red +mcl_heads:steve_wall +mcl_cherry_blossom:stripped_cherrytree +mcl_colorblocks:concrete_white +mcl_stairs:slab_concrete_black_double +mcl_core:andesite +mcl_stairs:slab_concrete_black_top +mcl_ocean:sea_pickle_4_off_dead_brain_coral_block +mcl_mushrooms:brown_mushroom_block_stem +mcl_walls:brick_5 +mcl_mangrove:mangrove_wood_fence +mcl_stairs:stair_concrete_black_inner +mcl_walls:andesite_4 +mcl_stairs:stair_concrete_black_outer +mcl_walls:sandstone_14 +mcl_core:spruceleaves_orphan +mcl_mushrooms:red_mushroom_block_cap_110101 +mcl_wool:green +mcl_flowerpots:flower_pot_mushroom_red +mcl_stairs:stair_concrete_silver_inner +mcl_stairs:stair_concrete_silver_outer +mcl_stairs:slab_stonebrick +mcl_stairs:stair_concrete_silver +mcl_stairs:slab_concrete_grey_double +mcl_flowerpots:flower_pot_bamboo_plant +mcl_walls:cobble_0 +mcl_stairs:stair_concrete_grey_inner +mcl_stairs:stair_concrete_magenta +mcl_core:leaves_orphan +mesecons_pistons:piston_pusher_sticky +mcl_stairs:slab_concrete_white_top +mcl_mushrooms:brown_mushroom_block_cap_111010 +mcl_stairs:slab_concrete_white +mcl_stairs:stair_concrete_white_inner +mesecons:wire_11001000_off +mcl_stairs:stair_birchwood_inner +mcl_copper:waxed_block_exposed +mcl_stairs:stair_stonebrickcracked_outer +mcl_stairs:stair_ironblock_outer +mcl_core:glass_lime +mcl_blackstone:basalt_smooth +mcl_stairs:slab_ironblock_double +mcl_end:end_rod_brown +mcl_cocoas:cocoa_2 +mcl_stairs:slab_ironblock_top +mcl_stairs:slab_ironblock +mcl_potions:night_vision_arrow_box +mcl_stairs:slab_goldblock_top +mcl_doors:dark_oak_door_t_3 +mcl_mushrooms:brown_mushroom_block_cap_010101 +mcl_stairs:stair_lapisblock +mcl_walls:andesite_16 +mcl_stairs:slab_lapisblock_top +mcl_stairs:slab_lapisblock +mcl_barrels:barrel_closed +mcl_deepslate:deepslatepolishedwall_3 +mcl_heads:wither_skeleton +mcl_stairs:slab_darktree_bark_double +mcl_stairs:stair_bamboo_stripped_inner +mcl_stairs:stair_blackstone +mcl_core:redsandstonesmooth +mcl_amethyst:large_amethyst_bud +mcl_stairs:stair_birchtree_bark_inner +mcl_walls:redsandstone_14 +mcl_deepslate:deepslatecobbledwall_5 +mesecons_pressureplates:pressure_plate_mangrove_wood_off +mcl_stairs:stair_birchtree_bark +mcl_stairs:slab_sprucetree_bark_double +mcl_walls:endbricks_16 +mcl_stairs:stair_sprucetree_bark_outer +mcl_nether:quartz_chiseled +mcl_stairs:slab_acaciatree_bark_double +mcl_stairs:slab_acaciatree_bark_top +mcl_walls:stonebrickmossy_5 +mcl_stairs:slab_acaciatree_bark +mcl_chests:dark_grey_shulker_box +mcl_target:target_off +mcl_stairs:stair_acaciatree_bark_inner +mcl_heads:zombie45 +mcl_core:sprucewood +mcl_stairs:stair_acaciatree_bark_outer +mcl_ocean:fire_coral +mcl_stairs:stair_acaciatree_bark +mcl_potions:darkness_arrow_box +mcl_stairs:stair_jungletree_bark_outer +mcl_stairs:slab_tree_bark_double +mcl_stairs:slab_tree_bark_top +mcl_stairs:slab_tree_bark +mcl_walls:mudbrick_5 +mcl_colorblocks:glazed_terracotta_light_blue +mcl_colorblocks:concrete_powder_light_blue +mcl_stairs:slab_nether_brick_double +mcl_colorblocks:hardened_clay_light_blue +mcl_core:diamondblock +mcl_colorblocks:concrete_lime +mcl_colorblocks:concrete_powder_lime +mcl_colorblocks:glazed_terracotta_pillar_pink +mcl_colorblocks:concrete_pink +mcl_stairs:slab_purpur_block_top +mcl_mushrooms:red_mushroom_block_cap_011000 +mcl_stairs:slab_bamboo_stripped_double +mcl_core:acacialeaves +mcl_core:glass_white +mcl_core:ladder +mcl_colorblocks:glazed_terracotta_brown +mcl_end:purpur_pillar +mcl_colorblocks:concrete_powder_brown +mcl_colorblocks:glazed_terracotta_pillar_purple +mcl_fences:birch_fence +mcl_mushrooms:brown_mushroom_block_cap_111110 +mcl_colorblocks:concrete_powder_purple +mcl_colorblocks:glazed_terracotta_pillar_orange +mcl_colorblocks:concrete_powder_orange +mcl_stairs:slab_junglewood +mcl_stairs:slab_copper_oxidized_cut_double +mcl_walls:prismarine_14 +xpanes:pane_brown +mcl_colorblocks:glazed_terracotta_pillar_blue +mcl_stairs:stair_waxed_copper_weathered_cut_outer +mcl_colorblocks:glazed_terracotta_blue +mcl_walls:diorite_8 +mcl_colorblocks:concrete_blue +mcl_stairs:stair_prismarine_inner +mcl_potions:levitation_arrow_box +mcl_colorblocks:glazed_terracotta_pillar_cyan +mcl_colorblocks:glazed_terracotta_cyan +mcl_colorblocks:concrete_cyan +mcl_colorblocks:hardened_clay_cyan +mcl_colorblocks:glazed_terracotta_pillar_green +mcl_stairs:stair_prismarine_brick +mcl_colorblocks:glazed_terracotta_green +mcl_colorblocks:concrete_green +mcl_stairs:slab_junglewood_double +mcl_colorblocks:glazed_terracotta_yellow +mcl_potions:stone_cloak_arrow_box +mcl_core:junglewood +mcl_colorblocks:concrete_powder_yellow +mcl_stairs:stair_birchwood +mcl_colorblocks:glazed_terracotta_pillar_red +mcl_colorblocks:glazed_terracotta_red +mcl_walls:stonebrick +mcl_colorblocks:glazed_terracotta_black +mcl_colorblocks:hardened_clay_black +mcl_colorblocks:concrete_silver +mcl_colorblocks:concrete_grey +mcl_colorblocks:concrete_powder_grey +mcl_walls:mossycobble_10 +mcl_doors:iron_door_b_2 +mcl_colorblocks:hardened_clay_grey +mcl_colorblocks:glazed_terracotta_white +mcl_stairs:stair_concrete_red_outer +mcl_bamboo:bamboo_door_t_4 +mcl_colorblocks:hardened_clay +mcl_minecarts:golden_rail_on +xpanes:pane_cyan +mcl_walls:cobble_13 +mcl_fences:dark_oak_fence_gate +mcl_composters:composter_ready +mcl_walls:mossycobble_16 +mcl_composters:composter_7 +mcl_composters:composter_4 +mcl_composters:composter_3 +mcl_walls:mossycobble_9 +mcl_hoppers:hopper_side +mcl_crimson:stripped_warped_hyphae +mcl_hoppers:hopper_disabled +mcl_chests:white_shulker_box +mcl_hoppers:hopper +mcl_signs:standing_sign67_5_sprucewood +mcl_cauldrons:cauldron_3_lava +mcl_dispensers:dispenser_down +mcl_farming:pumpkintige_linked_t +mcl_signs:standing_sign22_5_junglewood +mcl_droppers:dropper +vl_hollow_logs:warped_hyphae_hollow +vl_hollow_logs:crimson_hyphae_hollow +mesecons_lightstone:lightstone_off_cyan +vl_hollow_logs:mangrove_tree_hollow +mcl_stairs:slab_nether_brick_top +vl_hollow_logs:stripped_cherrytree_hollow +vl_hollow_logs:cherrytree_hollow +mcl_walls:sandstone_8 +vl_hollow_logs:tree_hollow +mcl_walls:granite_0 +mcl_fences:nether_brick_fence +vl_hollow_logs:stripped_spruce_hollow +vl_hollow_logs:sprucetree_hollow +vl_hollow_logs:stripped_jungle_hollow +vl_hollow_logs:jungletree_hollow +mcl_wool:purple_carpet +mcl_walls:prismarine_12 +mcl_sculk:sculk +mcl_core:glass_cyan +vl_hollow_logs:stripped_birch_hollow +mcl_wool:white_carpet +mesecons_button:button_cherrywood_on +mcl_deepslate:deepslatebrickswall_12 +mcl_stairs:slab_waxed_copper_weathered_cut_top +mesecons_button:button_cherrywood_off +mcl_potions:trolling_arrow_box +mcl_cherry_blossom:cherry_fence_gate_open +mcl_observers:observer_off +mcl_cherry_blossom:cherry_fence +mcl_signs:standing_sign67_5_cherrywood +mcl_signs:standing_sign45_cherrywood +mcl_crimson:crimson_hyphae +mcl_signs:standing_sign22_5_cherrywood +mcl_signs:standing_sign_cherrywood +mcl_crimson:crimson_door_b_3 +mcl_signs:wall_sign_cherrywood +mcl_doors:jungle_door_b_1 +mcl_stairs:slab_cherrywood_top +mcl_stairs:slab_cherrywood +mcl_stairs:slab_deepslate_bricks_double +mcl_stairs:stair_cherrywood_inner +mcl_bamboo:bamboo_door_b_2 +mcl_walls:stonebrickmossy_10 +mcl_stairs:stair_cherrywood +mesecons_lightstone:lightstone_on_green +mesecons:wire_11110101_on +mcl_walls:prismarine_9 +mcl_farming:wheat_4 +mcl_cherry_blossom:cherry_trapdoor +mcl_ocean:dead_brain_coral_fan +mcl_core:light_9 +mcl_cherry_blossom:cherry_door_t_4 +mcl_cherry_blossom:cherry_door_t_3 +mcl_cherry_blossom:cherry_door_t_1 +mcl_cherry_blossom:cherrysapling +mcl_stairs:slab_copper_oxidized_cut +mcl_potions:fire_resistance_arrow_box +mcl_stairs:stair_waxed_copper_cut +mcl_cherry_blossom:cherrytree_bark +mcl_stairs:stair_waxed_copper_oxidized_cut +mcl_stairs:stair_mossycobble_outer +mcl_chests:chest_left +mcl_end:end_rod_pink +mcl_ocean:dead_bubble_coral_fan +mcl_deepslate:deepslatebrickswall_16 +mesecons_walllever:wall_lever_on +mcl_copper:waxed_block_weathered +mcl_stairs:stair_deepslate_tiles +vl_hollow_logs:stripped_dark_oak_hollow +mesecons:wire_01110000_off +mesecons_button:button_sprucewood_off +mesecons_button:button_birchwood_off +mcl_deepslate:deepslatecobbledwall_14 +mesecons:wire_10011001_on +mcl_walls:stonebrick_16 +mesecons:wire_10000000_off +mesecons_button:button_darkwood_off +mesecons_button:button_stone_on +mesecons:wire_11110100_on +mcl_stairs:stair_waxed_copper_exposed_cut_inner +mesecons:wire_01000000_on +mesecons:wire_11111010_off +mcl_flowers:double_fern +mcl_walls:andesite_13 +mcl_stairs:slab_waxed_copper_cut_top +mesecons_lightstone:lightstone_off_pink +mcl_stairs:stair_stonebrickmossy +mesecons:wire_11111000_on +mesecons_pressureplates:pressure_plate_warped_hyphae_wood_on +mcl_raw_ores:raw_iron_block +mcl_stairs:slab_darktree_bark_top +mcl_farming:pumpkin_2 +mesecons_pressureplates:pressure_plate_sprucewood_off +mcl_core:dirt_with_grass_snow +mcl_cauldrons:cauldron_2r +mesecons:wire_01010000_on +mcl_walls:diorite_9 +mcl_signs:standing_sign45_sprucewood +mcl_mushrooms:brown_mushroom_block_cap_010111 +mcl_doors:birch_door_b_4 +mcl_farming:potato_5 +mcl_honey:honeycomb_block +mcl_mushrooms:red_mushroom_block_cap_000111 +mcl_farming:pumpkintige_unconnect +mcl_maps:filled_map_mcl_skins_character_1_female_crea +mcl_mushrooms:brown_mushroom_block_cap_100111 +mcl_nether:quartz_ore +mcl_chests:chest_small +xpanes:pane_lime_flat +mcl_mushrooms:brown_mushroom_block_cap_011101 +mesecons_pressureplates:pressure_plate_junglewood_off +mcl_core:vine +mcl_heads:skeleton67_5 +mcl_signs:wall_sign_junglewood +mesecons_pistons:piston_normal_off +mesecons_pressureplates:pressure_plate_acaciawood_off +mesecons:wire_01100000_off +xpanes:pane_light_blue +mcl_walls:prismarine_15 +mesecons_lightstone:lightstone_on_magenta +mesecons:wire_11111111_off +mcl_doors:spruce_door_t_4 +mesecons:wire_11110111_off +mesecons:wire_11110111_on +mcl_walls:andesite_9 +mesecons:wire_01110111_on +mesecons:wire_11111011_off +mcl_core:lava_flowing +mcl_wool:lime_carpet +mesecons:wire_11110011_on +mesecons:wire_01110011_on +mcl_stairs:stair_andesite_inner +mesecons:wire_10110011_on +mesecons:wire_00110011_off +mcl_mangrove:mangrove_door_t_1 +mesecons:wire_11111101_off +mcl_observers:observer_down_off +mesecons:wire_11111101_on +mesecons:wire_11011101_off +mesecons:wire_11011101_on +mcl_core:light_5 +mcl_core:sandstonecarved +mesecons:wire_01110101_on +mcl_cocoas:cocoa_1 +mesecons:wire_11010101_off +mcl_walls:stonebrickmossy_4 +mesecons:wire_11010101_on +mcl_mushrooms:red_mushroom_block_cap_011001 +mesecons:wire_01010101_off +mcl_stairs:stair_granite_smooth +mcl_stairs:stair_diorite_outer +mcl_lectern:lectern +mcl_stairs:slab_mud_brick_top +mesecons:wire_11110001_off +mesecons:wire_11110001_on +mesecons:wire_00000000_off +mcl_core:reeds +mesecons_delayer:delayer_off_1 +mcl_farming:carrot_3 +mcl_mushrooms:red_mushroom_block_cap_011011 +mcl_doors:acacia_door_b_2 +mcl_wool:cyan_carpet +mesecons:wire_00110001_off +mcl_stairs:stair_wood_outer +mesecons:wire_11010001_off +mcl_stairs:slab_end_bricks_top +mesecons:wire_01010001_off +mcl_walls:netherbrick_1 +mcl_farming:carrot_4 +mesecons:wire_10010001_off +mesecons:wire_10010001_on +mcl_wool:grey_carpet +mesecons:wire_11111110_on +mesecons:wire_11101110_off +mcl_mushrooms:red_mushroom_block_cap_111000 +mesecons:wire_11101110_on +mesecons:wire_11110110_off +mesecons:wire_11110110_on +mcl_heads:skeleton22_5 +mcl_sponges:sponge +mcl_walls:rednetherbrick_9 +mesecons:wire_11100110_off +mcl_walls:andesite_7 +mesecons:wire_11100110_on +mcl_deepslate:deepslatecobbledwall_6 +mesecons:wire_01100110_on +mesecons:wire_11111010_on +mcl_mushrooms:brown_mushroom_block_cap_011011 +mesecons:wire_10111010_off +mcl_stairs:stair_concrete_orange +mcl_ocean:prismarine +mesecons:wire_10111010_on +mcl_cherry_blossom:cherryleaves +mesecons:wire_11101010_on +mesecons:wire_10101010_on +mesecons:wire_11110010_off +mcl_beehives:bee_nest_5 +mcl_doors:jungle_door_t_2 +mesecons:wire_11110010_on +mesecons:wire_01110010_off +mesecons_pressureplates:pressure_plate_polished_blackstone_off +mesecons_pistons:piston_up_sticky_off +mcl_end:end_rod_white +mcl_stairs:slab_goldblock_double +mesecons:wire_11100010_off +mcl_stairs:stair_copper_weathered_cut_inner +mcl_core:leaves +mcl_chests:brown_shulker_box +mesecons:wire_01100010_on +mcl_walls:mudbrick_21 +mesecons:wire_10100010_on +mesecons:wire_00100010_off +mesecons:wire_00100010_on +mesecons:wire_11111100_off +mcl_stairs:stair_crimson_hyphae_wood +mesecons:wire_11111100_on +mesecons:wire_11011100_off +mesecons:wire_11011100_on +mcl_chests:pink_shulker_box +mesecons:wire_11101100_off +mesecons:wire_11101100_on +mcl_anvils:anvil +mcl_stairs:stair_darkwood_outer +mcl_doors:iron_door_b_3 +mcl_stairs:stair_darkwood +mcl_mushrooms:red_mushroom_block_cap_111111 +mcl_deepslate:deepslatetileswall_2 +mesecons:wire_01110100_on +mcl_stairs:slab_sprucewood +mcl_doors:dark_oak_door_b_3 +mcl_core:stripped_dark_oak_bark +mesecons:wire_01010100_on +mesecons:wire_11100100_off +mesecons:wire_01100100_off +mcl_colorblocks:hardened_clay_green +mesecons:wire_11000100_on +mesecons_pistons:piston_pusher_normal +mcl_doors:spruce_door_t_2 +mcl_chests:ender_chest +mesecons_pressureplates:pressure_plate_stone_off +mcl_flowers:tulip_red +mcl_signs:standing_sign45 +mcl_mushrooms:red_mushroom_block_cap_001010 +mesecons:wire_01000100_on +mcl_walls:stonebrick_8 +mcl_walls:andesite +mcl_walls:mossycobble_15 +mesecons:wire_11111000_off +mesecons:wire_01100100_on +mcl_walls:mudbrick_8 +mcl_doors:acacia_door_b_1 +mcl_core:andesite_smooth +mcl_colorblocks:glazed_terracotta_pillar_light_blue +mcl_stairs:stair_blackstone_outer +mcl_walls:cobble_2 +mcl_core:podzol +mcl_walls:andesite_12 +mcl_farming:wheat_1 +mcl_mangrove:mangrove_door_b_4 +mcl_chests:dark_green_shulker_box_small +mcl_walls:cobble_16 +mcl_stairs:stair_copper_oxidized_cut +mcl_doors:acacia_door_b_4 +mcl_walls:stonebrick_11 +mcl_stairs:stair_quartz_smooth_inner +mcl_walls:rednetherbrick_11 +mcl_stairs:slab_red_nether_brick_top +mcl_chests:trapped_chest_on +mesecons:wire_11001000_on +mesecons:wire_10001000_off +mcl_itemframes:glow_item_frame +mesecons:wire_11110000_on +mesecons:wire_01110000_on +mcl_deepslate:deepslatebrickswall_21 +mcl_doors:jungle_door_b_4 +mcl_ocean:dead_horn_coral_block +mcl_walls:diorite_12 +mcl_sponges:sponge_wet +mesecons:wire_00110000_off +mcl_doors:spruce_door_b_4 +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_crea +mcl_walls:brick_1 +mcl_walls:endbricks_1 +mcl_deepslate:deepslatepolishedwall_21 +mesecons:wire_11100000_on +mcl_walls:stonebrick_14 +mcl_walls:prismarine_11 +mesecons:wire_01100000_on +mesecons:wire_10100000_off +xpanes:pane_cyan_flat +mcl_deepslate:deepslate_with_lapis +mcl_colorblocks:glazed_terracotta_lime +mesecons:wire_00100000_off +mesecons:wire_11000000_off +mesecons:wire_10000000_on +mcl_crimson:crimson_fungus +mcl_deepslate:deepslatetileswall_1 +mcl_fences:acacia_fence +mcl_tnt:tnt +mesecons:wire_01010100_off +mcl_core:birchtree_bark +mcl_farming:sweet_berry_bush_0 +mcl_dispensers:dispenser_up +mesecons:wire_10111011_on +mcl_crimson:warped_door_t_3 +mcl_colorblocks:concrete_powder_magenta +mcl_ocean:seagrass_sand +mcl_cake:cake_3 +mcl_chests:dark_green_shulker_box +mcl_doors:spruce_door_b_2 +xpanes:pane_magenta +mcl_doors:birch_trapdoor +mcl_chests:violet_shulker_box +mcl_walls:sandstone_10 +mcl_wool:blue +mcl_meshhand:mcl_skins_base_18D471DFF_male_crea +mcl_deepslate:deepslatebrickswall_13 +mcl_walls:netherbrick_2 +vl_hollow_logs:stripped_oak_hollow +mcl_mushrooms:red_mushroom_block_cap_011101 +mcl_blast_furnace:blast_furnace +mcl_chests:trapped_chest_right +mcl_chests:brown_shulker_box_small +mcl_doors:birch_door_b_3 +mcl_signs:wall_sign_mangrove_wood +mcl_chests:dark_grey_shulker_box_small +mesecons_pistons:piston_down_sticky_on +mcl_core:light_3 +mcl_signs:standing_sign_sprucewood +mcl_walls:andesite_10 +mcl_stairs:slab_mangrove_wood +mcl_doors:spruce_trapdoor_open +mcl_walls:netherbrick_16 +mcl_doors:iron_door_t_1 +mcl_deepslate:deepslatebrickswall_3 +mcl_farming:beetroot +mesecons_lightstone:lightstone_off_black +mcl_stairs:stair_lapisblock_inner +mcl_walls:diorite_6 +mcl_stairs:stair_granite_outer +mcl_meshhand:mcl_skins_base_18D471DFF_female_crea +mcl_cauldrons:cauldron_1 +mcl_crimson:warped_trapdoor +mcl_core:ice +mcl_chests:lightblue_shulker_box +mesecons:wire_11010000_off +mcl_doors:spruce_door_b_3 +mesecons:wire_10110001_off +mcl_core:coarse_dirt +mcl_fire:fire +mcl_farming:potato_4 +mcl_mushrooms:brown_mushroom_block_cap_110110 +mcl_mushrooms:red_mushroom_block_cap_000000 +mesecons:wire_10100010_off +mcl_chests:chest_right +mcl_flowers:double_fern_top +mcl_mushrooms:brown_mushroom_block_cap_100100 +mcl_colorblocks:hardened_clay_blue +mcl_composters:composter +mcl_stairs:stair_sandstonesmooth2_outer +mcl_walls:mossycobble_8 +mcl_core:stripped_acacia_bark +mcl_beds:bed_black_bottom +mcl_signs:standing_sign67_5_acaciawood +mclx_fences:nether_brick_fence_gate +mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_surv +mcl_banners:hanging_banner +mcl_lightning_rods:rod +mcl_walls:stonebrickmossy_11 +mcl_doors:iron_trapdoor_open +mcl_core:dirt +mesecons_lightstone:lightstone_on_purple +mcl_walls:cobble_5 +mcl_walls:brick_4 +mcl_deepslate:deepslatepolishedwall_13 +mcl_stairs:stair_deepslate_tiles_outer +mcl_beehives:beehive_5 +mcl_flowerpots:flower_pot_allium +mcl_core:granite_smooth +mcl_stairs:slab_granite_smooth_top +mcl_mushrooms:red_mushroom_block_cap_001110 +mcl_deepslate:deepslatetileswall_14 +mcl_walls:granite_2 +mcl_stairs:stair_acaciawood_outer +mcl_ocean:dead_brain_coral_block +mcl_walls:mudbrick_4 +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_surv +mcl_stairs:slab_concrete_black +mcl_mushrooms:red_mushroom_block_cap_111101 +mcl_deepslate:deepslate_with_diamond +mcl_nether:nether_lava_source +mcl_mushrooms:brown_mushroom_block_cap_110011 +mcl_farming:carrot_2 +mcl_mushrooms:red_mushroom_block_cap_010010 +mcl_blast_furnace:blast_furnace_active +mcl_core:sandstonesmooth2 +mcl_mushrooms:red_mushroom_block_cap_001001 +mcl_end:end_stone +mcl_stairs:stair_deepslate_polished +mcl_mushrooms:brown_mushroom_block_cap_110111 +mcl_core:frosted_ice_2 +mcl_stairs:stair_birchtree_bark_outer +mcl_walls:andesite_6 +xpanes:pane_brown_flat +mcl_walls:endbricks_4 +mcl_stairs:stair_mossycobble +mcl_colorblocks:glazed_terracotta_magenta +mcl_stairs:slab_quartz_smooth_double +mcl_mushrooms:brown_mushroom_block_cap_111001 +mcl_mushrooms:brown_mushroom_block_cap_111000 +mcl_doors:dark_oak_trapdoor +mcl_stairs:stair_concrete_pink +mcl_stairs:slab_warped_hyphae_wood_double +mcl_nether:netherrack +mcl_doors:iron_trapdoor_ladder +mcl_stairs:slab_darkwood_double +mcl_stairs:stair_granite +mcl_signs:standing_sign_junglewood +mcl_mushrooms:red_mushroom_block_cap_100010 +mcl_mushrooms:brown_mushroom_block_cap_111111 +mcl_signs:standing_sign67_5_darkwood +mcl_walls:redsandstone_16 +mcl_nether:netheriteblock +mcl_mushrooms:brown_mushroom_block_cap_110001 +mesecons:wire_01100010_off +mcl_core:stone_with_emerald +mcl_heads:zombie +mcl_walls:redsandstone_9 +ignore +mcl_mushrooms:brown_mushroom_block_cap_010001 +mcl_mushrooms:red_mushroom_block_cap_100111 +mcl_mushrooms:brown_mushroom_block_cap_101010 +mcl_meshhand:mcl_skins_base_1B47A57FF_male_surv +mcl_chests:trapped_chest +mcl_mushrooms:brown_mushroom_block_cap_011100 +mesecons_pressureplates:pressure_plate_crimson_hyphae_wood_off +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_female_surv +mcl_mushrooms:brown_mushroom_block_cap_110010 +mcl_crimson:warped_fence +mcl_mushrooms:brown_mushroom_block_cap_100010 +mcl_mushrooms:brown_mushroom_block_cap_100001 +mcl_mushrooms:brown_mushroom_block_cap_000000 +mcl_mushrooms:red_mushroom_block_cap_110000 +mcl_fences:spruce_fence_gate_open +mesecons:wire_11010000_on +mcl_mushrooms:red_mushroom_block_cap_010101 +mcl_deepslate:deepslatecobbledwall_7 +mcl_nether:quartz_pillar +mcl_mushrooms:brown_mushroom_block_cap_100110 +mesecons:wire_11100010_on +mcl_potions:poison_arrow_box +mesecons:wire_01110100_off +mcl_stairs:slab_diorite_smooth_top +mcl_stairs:slab_concrete_magenta_double +mesecons:wire_00000000_on +mcl_flowerpots:flower_pot_crimson_fungus +mesecons:wire_11000000_on +mcl_fences:spruce_fence_gate +mcl_mushrooms:brown_mushroom_block_cap_001111 +mesecons:wire_10100000_on +mcl_mushrooms:brown_mushroom_block_cap_010100 +mcl_flowers:lilac_top +mcl_mushrooms:brown_mushroom_block_cap_001011 +mcl_flowers:peony_top +mesecons_button:button_stone_off +mcl_doors:dark_oak_trapdoor_open +mcl_doors:spruce_door_t_3 +mcl_flowerpots:flower_pot_cherrysapling +mcl_stairs:slab_deepslate_tiles +mcl_stairs:slab_redsandstonesmooth2_double +mcl_chests:white_shulker_box_small +mcl_stairs:stair_bamboo_mosaic_inner +mesecons:wire_10010000_off +mcl_potions:slow_falling_arrow_box +mcl_mushrooms:red_mushroom_block_cap_001100 +mcl_mushrooms:red_mushroom_block_cap_100000 +mcl_end:end_rod_black +mcl_ocean:dead_tube_coral_fan +mcl_doors:spruce_door_b_1 +mesecons:wire_10110000_on +mcl_end:end_rod_silver +mcl_mushrooms:red_mushroom_block_cap_110011 +mcl_mushrooms:brown_mushroom_block_cap_100101 +mesecons:wire_10001000_on +mcl_mangrove:propagule_coarse_dirt +mcl_mushrooms:red_mushroom_block_cap_110111 +mesecons:wire_01010001_on +mcl_fences:acacia_fence_gate +mesecons:wire_10011000_on +mcl_deepslate:deepslate_polished +mcl_doors:iron_door_b_1 +mesecons:wire_00110000_on +mcl_mushrooms:brown_mushroom_block_cap_000001 +mcl_deepslate:deepslate_with_iron +mcl_core:darktree_bark +mcl_stairs:stair_lapisblock_outer +mcl_mushrooms:red_mushroom_block_stem_full +mcl_walls:sandstone_16 +mcl_stairs:stair_stonebrick_outer +mcl_meshhand:mcl_skins_base_1EEB592FF_female_surv +mesecons:wire_10010000_on +mcl_meshhand:mcl_skins_base_1B47A57FF_female_crea +mesecons:wire_10111000_on +mcl_mangrove:mangrove_tree +mcl_walls:cobble_3 +mcl_copper:block_cut +mcl_potions:fatigue_arrow_box +mcl_mushrooms:brown_mushroom_block_cap_010010 +mcl_fences:dark_oak_fence_gate_open +mesecons:wire_11000100_off +mcl_mushrooms:brown_mushroom_block_cap_101111 +mcl_mushrooms:red_mushroom_block_cap_100100 +mcl_cauldrons:cauldron_3r +mcl_stairs:slab_diorite_smooth +mcl_stairs:stair_sprucewood_outer +mcl_stairs:slab_stonebrickmossy_double +mcl_mushrooms:red_mushroom_block_cap_101010 +mesecons:wire_11010100_off +mcl_core:stone_with_redstone +mcl_stairs:slab_stone_double +mcl_stairs:stair_crimson_hyphae_wood_outer +mesecons:wire_11111011_on +mcl_villages:stonebrickcarved +mcl_signs:standing_sign45_birchwood +mcl_mushrooms:brown_mushroom_block_cap_000101 +mcl_doors:dark_oak_door_b_1 +mesecons_pistons:piston_sticky_on +mcl_farming:pumpkin_7 +mcl_walls:andesite_15 +mcl_walls:rednetherbrick_2 +mcl_ocean:dead_horn_coral +mcl_mushrooms:red_mushroom_block_cap_011100 +mcl_cherry_blossom:cherry_trapdoor_open +mesecons:wire_01110101_off +mcl_mushrooms:brown_mushroom_block_cap_101110 +mcl_mushrooms:red_mushroom_block_cap_101001 +mcl_crimson:shroomlight +mesecons:wire_10110010_on +mcl_farming:wheat_2 +mcl_walls:cobble_8 +mcl_ocean:prismarine_brick +mesecons:wire_01110010_on +mcl_walls:stonebrick_9 +mcl_mushrooms:red_mushroom_block_cap_011111 +mcl_mushrooms:brown_mushroom_block_cap_111101 +mcl_core:lapisblock +mcl_farming:potato_7 +mcl_stairs:stair_waxed_copper_weathered_cut +mesecons_pistons:piston_down_normal_off +mcl_mushrooms:red_mushroom_block_cap_000110 +mcl_heads:stalker45 +mcl_blackstone:wall_10 +mcl_core:stonebrickmossy +mcl_stairs:slab_prismarine_brick_top +mcl_walls:rednetherbrick_8 +mesecons_pressureplates:pressure_plate_stone_on +mesecons:wire_10101010_off +mcl_mushrooms:red_mushroom_block_cap_100110 +mcl_deepslate:deepslatetileswall_0 +mcl_mushrooms:red_mushroom_block_cap_100101 +mesecons_button:button_junglewood_on +mcl_campfires:soul_campfire_lit +mcl_core:grass_path +mcl_colorblocks:concrete_powder_pink +mcl_stairs:stair_darktree_bark_outer +mcl_doors:birch_door_b_2 +mcl_observers:observer_up_on +mcl_mushrooms:brown_mushroom_block_cap_001110 +mcl_mushrooms:red_mushroom_block_cap_101011 +xpanes:pane_orange_flat +mesecons:wire_00010001_off +mcl_walls:redsandstone_15 +mesecons:wire_01100110_off +xpanes:pane_blue_flat +xpanes:pane_gray_flat +mesecons:wire_01110110_off +mcl_mushrooms:red_mushroom_block_cap_111011 +mcl_blackstone:wall_9 +mesecons_pressureplates:pressure_plate_birchwood_off +mcl_mushrooms:brown_mushroom_block_cap_000100 +mcl_core:stripped_spruce_bark +mcl_mushrooms:brown_mushroom_block_cap_001010 +mcl_walls:netherbrick_15 +mcl_wool:brown_carpet +mcl_colorblocks:glazed_terracotta_pillar_magenta +mcl_stairs:stair_diorite_smooth +mesecons_delayer:delayer_on_3 +mcl_core:darkleaves_orphan +mcl_core:stripped_spruce +mcl_walls:brick_10 +mcl_walls:cobble +mesecons_button:button_sprucewood_on +mesecons_pistons:piston_down_sticky_off +mclx_fences:nether_brick_fence_gate_open +mcl_crimson:crimson_trapdoor_ladder +mesecons_pressureplates:pressure_plate_wood_on +mcl_stairs:slab_sandstone +mcl_copper:block_raw +mcl_stairs:slab_wood_double +mcl_mushrooms:brown_mushroom_block_cap_101100 +mcl_walls:mossycobble_12 +mcl_walls:redsandstone_4 +mcl_walls:sandstone_4 +mcl_mushrooms:brown_mushroom_block_cap_001000 +mcl_colorblocks:glazed_terracotta_purple +mcl_mud:packed_mud +mcl_stairs:stair_purpur_block_inner +mcl_mushrooms:red_mushroom_block_cap_011010 +mcl_walls:andesite_3 +mcl_mangrove:propagule_dirt +mcl_ocean:dead_tube_coral +mcl_stairs:slab_prismarine +mcl_copper:block_exposed +mcl_mushrooms:brown_mushroom_block_cap_100000 +mcl_mushrooms:brown_mushroom_block_cap_101101 +mcl_deepslate:deepslatecobbledwall_0 +mcl_walls:granite_3 +mcl_end:end_rod_red +mcl_crimson:warped_door_t_2 +mesecons_button:button_acaciawood_off +mcl_sponges:sponge_wet_river_water +mcl_lightning_rods:rod_powered +mcl_core:spruceleaves +mcl_mushrooms:brown_mushroom_block_cap_010110 +mcl_deepslate:deepslatepolishedwall_10 +mcl_ocean:seagrass_gravel +mesecons:wire_01110110_on +mcl_core:glass_light_blue +mcl_doors:dark_oak_door_t_2 +mesecons_lightstone:lightstone_on_lime +xpanes:pane_pink_flat +mesecons:wire_11100000_off +mesecons_lightstone:lightstone_on_silver +xpanes:pane_lime +mesecons:wire_01110011_off +mesecons:wire_01000100_off +mcl_mushrooms:brown_mushroom_block_cap_110101 +mcl_raw_ores:raw_gold_block +mesecons:wire_11110101_off +mcl_stairs:slab_waxed_copper_exposed_cut_top +mcl_cauldrons:cauldron_1r +mcl_cauldrons:cauldron_2_lava +mesecons_lightstone:lightstone_on_grey +mesecons:wire_11010100_on +mcl_brewing:stand_111 +mcl_mushrooms:red_mushroom_block_cap_010000 +mcl_beds:bed_red_top +mesecons_lightstone:lightstone_on +mcl_walls:mossycobble_4 +mcl_heads:wither_skeleton22_5 +mcl_signs:standing_sign22_5_mangrove_wood +mcl_stairs:stair_mud_brick +mcl_heads:zombie22_5 +mcl_mushrooms:brown_mushroom_block_cap_011010 +mcl_farming:carrot_1 +mcl_stairs:slab_red_nether_brick_double +mcl_core:sapling +mcl_stairs:stair_concrete_black +mcl_wool:white +mcl_stairs:slab_sandstone_double +mesecons:wire_10110000_off +mcl_mushrooms:red_mushroom_block_cap_100001 +mesecons:wire_10011000_off +mcl_mushrooms:brown_mushroom_block_cap_001001 +mesecons_delayer:delayer_off_3 +mcl_stairs:slab_andesite +mcl_meshhand:mcl_skins_base_18D471DFF_male_surv +mcl_flowerpots:flower_pot +mcl_mushrooms:red_mushroom_block_cap_101100 +mcl_copper:waxed_block_exposed_cut +mcl_flowerpots:flower_pot_junglesapling +mcl_core:diorite +mcl_flowerpots:flower_pot_birchsapling +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_male_crea +mcl_chests:yellow_shulker_box +mcl_monster_eggs:monster_egg_stonebrickcracked +mesecons:wire_00110010_on +mcl_potions:withering_arrow_box +mcl_stairs:slab_junglewood_top +mcl_fences:spruce_fence +mcl_stairs:slab_jungletree_bark_top +mcl_stairs:stair_birchwood_outer +mesecons:wire_11110011_off +mesecons:wire_11111001_off +mcl_walls:prismarine_4 +mcl_flowerpots:flower_pot_oxeye_daisy +mesecons_pressureplates:pressure_plate_acaciawood_on +mcl_stairs:stair_andesite +mesecons:wire_01000000_off +mesecons:wire_11100100_on +mcl_potions:healing_arrow_box +mcl_flowerpots:flower_pot_propagule +mcl_stairs:stair_nether_brick +mcl_core:podzol_snow +mesecons:wire_10111001_off +mcl_potions:luck_arrow_box +mesecons:wire_11010001_on +mcl_walls:granite_21 +mcl_flowerpots:flower_pot_warped_roots +mcl_doors:acacia_door_t_1 +mcl_core:realm_barrier +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_female_crea +mcl_flowerpots:flower_pot_deadbush +mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_surv +mcl_end:chorus_flower_dead +mesecons_lightstone:lightstone_off_red +mesecons_delayer:delayer_on_2 +mcl_ocean:sea_pickle_2_dead_brain_coral_block +mcl_stairs:slab_stone +mcl_beds:bed_white_bottom +mcl_maps:filled_map_mcl_skins_base_18D471DFF_male_surv +mcl_mushrooms:red_mushroom_block_cap_001101 +mcl_mushrooms:brown_mushroom_block_cap_100011 +mcl_meshhand:character_male_crea +mcl_signs:standing_sign +mcl_mushrooms:red_mushroom_block_cap_010110 +mesecons_pistons:piston_up_normal_off +mcl_signs:standing_sign_birchwood +mcl_signs:standing_sign22_5_birchwood +mcl_stairs:stair_end_bricks_inner +mcl_signs:standing_sign67_5_birchwood +mesecons_pressureplates:pressure_plate_wood_off +mcl_core:frosted_ice_3 +mcl_signs:standing_sign22_5_darkwood +mcl_signs:standing_sign45_darkwood +mcl_stairs:stair_copper_oxidized_cut_inner +mcl_crimson:crimson_door_b_2 +mesecons_lightstone:lightstone_off_yellow +mesecons_delayer:delayer_off_4 +mcl_armor_stand:armor_stand +mcl_mushrooms:red_mushroom_block_cap_100011 +mcl_signs:standing_sign22_5_acaciawood +mcl_core:bedrock +mcl_walls:netherbrick_21 +mcl_deepslate:deepslate_tiles_cracked +mcl_stairs:stair_wood_inner +mcl_signs:standing_sign45_acaciawood +mclx_core:river_water_source +mcl_deepslate:deepslatepolishedwall +mcl_walls:sandstone_7 +mesecons_pistons:piston_sticky_off +mcl_doors:wooden_door_t_4 +mcl_colorblocks:glazed_terracotta_pillar_brown +mesecons_lightstone:lightstone_off_lime +mcl_ocean:fire_coral_fan +mesecons:wire_11011001_on +mcl_walls:stonebrickmossy_7 +mcl_ocean:seagrass_dirt +mcl_crimson:crimson_trapdoor_open +mcl_potions:bad_luck_arrow_box +mcl_meshhand:character_male_surv +mcl_flowerpots:flower_pot_crimson_roots +mcl_ocean:sea_pickle_2_off_dead_brain_coral_block +mcl_chests:trapped_chest_on_small +mcl_maps:filled_map_mcl_skins_base_1B47A57FF_male_surv +mcl_walls:cobble_1 +mcl_stairs:slab_waxed_copper_cut_double +mcl_mushrooms:red_mushroom_block_cap_001111 +mcl_chests:red_shulker_box +mcl_amethyst:amethyst_block +mcl_walls:cobble_6 +mcl_core:stone_with_diamond +mcl_walls:redsandstone_10 +mcl_walls:cobble_9 +mcl_ocean:kelp_gravel +mcl_stairs:stair_deepslate_cobbled_outer +mesecons:wire_11101000_on +mcl_mushrooms:red_mushroom_block_cap_101000 +mcl_mushrooms:red_mushroom_block_cap_000001 +mesecons:wire_10101000_off +mesecons:wire_10110001_on +mcl_walls:mossycobble_6 +mesecons_torch:mesecon_torch_on +mcl_chests:blue_shulker_box +mcl_walls:mossycobble_11 +mcl_walls:mossycobble_13 +mcl_stairs:stair_prismarine_brick_outer +mcl_walls:andesite_1 +mcl_honey:honey_block +mcl_stairs:stair_granite_smooth_inner +mcl_stairs:slab_waxed_copper_oxidized_cut_double +mcl_core:acacialeaves_orphan +mcl_mushrooms:red_mushroom_block_cap_001000 +mcl_walls:andesite_11 +mesecons:wire_11101000_off +mcl_mushrooms:brown_mushroom_block_cap_000110 +mcl_walls:netherbrick_3 +mcl_mushrooms:red_mushroom_block_cap_000101 +mcl_stairs:slab_granite +mcl_nether:nether_lava_flowing +mcl_walls:granite_14 +mcl_stairs:slab_prismarine_brick_double +mesecons_solarpanel:solar_panel_inverted_on +mcl_flowerpots:flower_pot_sprucesapling +mcl_walls:endbricks_3 +mcl_walls:brick_2 +mcl_flowers:tallgrass +mcl_stairs:stair_darkwood_inner +mcl_walls:brick_7 +mcl_mushrooms:red_mushroom_block_cap_111110 +mcl_stairs:slab_sprucewood_double +mcl_signs:standing_sign_acaciawood +mcl_walls:brick +mesecons_lightstone:lightstone_off_green +mcl_stairs:slab_copper_exposed_cut_top +mesecons:wire_10011001_off +mcl_walls:sandstone_5 +mcl_heads:steve45 +mcl_walls:sandstone_6 +mcl_signs:standing_sign67_5_mangrove_wood +mcl_walls:prismarine_13 +mcl_meshhand:mcl_skins_base_1B47A57FF_male_crea +mcl_walls:sandstone_9 +mcl_deepslate:deepslate_with_redstone +mcl_doors:birch_door_t_3 +xpanes:pane_black_flat +mcl_lanterns:soul_lantern_ceiling +mcl_walls:sandstone_3 +mcl_meshhand:mcl_skins_base_1EEB592FF_male_surv +mcl_walls:diorite_16 +mcl_deepslate:deepslatetileswall_7 +mcl_end:end_rod_lime +mcl_walls:andesite_0 +mcl_stairs:slab_brick_block_double +mesecons:wire_11011000_off +mcl_walls:stonebrick_7 +mcl_walls:stonebrick_10 +mcl_cherry_blossom:pressure_plate_cherrywood_on +mcl_stairs:stair_stonebrick +mcl_potions:regeneration_arrow_box +mcl_walls:stonebrick_13 +mcl_chests:magenta_shulker_box_small +mcl_walls:stonebrickmossy_8 +mcl_walls:stonebrickmossy_16 +mcl_walls:stonebrickmossy_21 +mcl_mushrooms:brown_mushroom_block_cap_010011 +mcl_stairs:slab_diorite +mcl_crimson:stripped_crimson_hyphae_bark +mcl_signs:standing_sign22_5_sprucewood +mcl_colorblocks:concrete_purple +mcl_core:cobweb +mcl_amethyst:calcite +mcl_core:glass_green +mesecons:wire_11001100_on +mesecons:wire_10110010_off +mcl_walls:endbricks_7 +mcl_stairs:slab_sprucetree_bark_top +mcl_beehives:bee_nest_4 +mesecons:wire_11111110_off +mcl_core:void +mcl_farming:potato_6 +mesecons:wire_11110100_off +mesecons_button:button_junglewood_off +mcl_walls:netherbrick_7 +mcl_walls:netherbrick_10 +mcl_ocean:dead_fire_coral +mcl_stairs:stair_brick_block +mcl_stairs:slab_purpur_block +mcl_core:tree +mcl_core:light_1 +mcl_walls:rednetherbrick +mcl_mangrove:mangroveleaves +mcl_stairs:slab_deepslate_bricks_top +mcl_walls:mudbrick_0 +mesecons:wire_00110010_off +mcl_wool:magenta_carpet +mcl_walls:stonebrick_3 +mcl_wool:grey +mcl_core:sandstone +mcl_walls:mudbrick_13 +mcl_mushrooms:brown_mushroom_block_cap_101001 +mesecons:wire_00110011_on +mcl_stairs:stair_concrete_yellow +mesecons:wire_00110001_on +mcl_stairs:stair_junglewood +mcl_flowers:rose_bush +mcl_deepslate:deepslate_with_copper +mcl_walls:mudbrick_6 +mcl_stairs:stair_acaciawood +mcl_ocean:brain_coral_fan +mcl_stairs:stair_concrete_purple +mcl_stairs:stair_sprucewood +mcl_walls:granite_4 +mcl_ocean:sea_pickle_1_off_dead_brain_coral_block +mcl_deepslate:deepslate_tiles +mcl_stairs:slab_sprucewood_top +mcl_stairs:slab_stonebrickcracked_top +mcl_heads:skeleton45 +mcl_core:sand +mcl_stairs:slab_birchwood_top +mcl_walls:endbricks_5 +mcl_stairs:slab_waxed_copper_weathered_cut +mcl_mushrooms:red_mushroom_block_cap_010011 +mcl_flowers:waterlily +mcl_mushrooms:brown_mushroom_block_cap_111100 +mcl_stairs:slab_concrete_cyan +mcl_stairs:slab_darkwood_top +mcl_stairs:slab_stone_rough_double +mesecons_pistons:piston_up_normal_on +mcl_mushrooms:red_mushroom_block_cap_110110 +mcl_flowers:blue_orchid +mcl_stairs:stair_deepslate_bricks_outer +mcl_stairs:stair_andesite_outer +mcl_farming:sweet_berry_bush_3 +mcl_stairs:slab_andesite_top +mcl_walls:brick_6 +mcl_stairs:stair_granite_inner +mcl_walls:granite_12 +mcl_cartography_table:cartography_table +mcl_deepslate:deepslatecobbledwall_1 +mcl_mangrove:propagule +mcl_core:snow_7 +mcl_stairs:stair_diorite_inner +mcl_doors:iron_door_t_2 +mcl_stairs:slab_diorite_top +mesecons:wire_01010101_on +mcl_stairs:slab_cobble +mcl_stairs:slab_cobble_top +mcl_farming:hay_block +mcl_stairs:slab_diorite_double +mesecons:wire_11011000_on +mcl_stairs:stair_brick_block_outer +mcl_stairs:stair_brick_block_inner +mcl_chests:pink_shulker_box_small +mcl_signs:standing_sign67_5_junglewood +mcl_stairs:stair_sandstonesmooth2 +mcl_stairs:slab_sandstonesmooth2_top +mcl_meshhand:mcl_skins_base_1EEB592FF_male_crea +mcl_comparators:comparator_off_sub +mcl_stairs:stair_copper_exposed_cut_inner +mcl_walls:stonebrick_12 +mcl_stairs:stair_stonebrick_inner +mcl_stairs:slab_stonebrick_top +mesecons_button:button_acaciawood_on +mcl_stairs:slab_quartzblock +mcl_stairs:stair_quartz_smooth +mcl_walls:endbricks +mcl_stairs:stair_nether_brick_outer +mcl_stairs:stair_nether_brick_inner +mcl_doors:acacia_trapdoor_ladder +mcl_walls:rednetherbrick_5 +mcl_mushrooms:brown_mushroom_block_cap_010000 +mcl_brewing:stand_110 +mcl_stairs:stair_concrete_white +mesecons_button:button_crimson_hyphae_wood_on +mcl_beds:bed_purple_bottom +mcl_walls:mossycobble_5 +mcl_colorblocks:concrete_powder_blue +mesecons:wire_01010000_off +mcl_stairs:slab_prismarine_double +mcl_walls:prismarine_5 +mesecons:wire_10111001_on +mcl_cake:cake_5 +mcl_ocean:prismarine_dark +mcl_wool:cyan +xpanes:pane_black +mcl_stairs:slab_mud_brick_double +mcl_flowerpots:flower_pot_sapling +mcl_walls:stonebrickmossy_2 +mcl_colorblocks:hardened_clay_yellow +mcl_stairs:slab_andesite_smooth_top +mcl_doors:dark_oak_door_b_2 +mcl_walls:brick_8 +mcl_core:bone_block +mcl_mushrooms:red_mushroom_block_cap_111001 +mcl_stairs:slab_stonebrickmossy_top +mesecons_pressureplates:pressure_plate_junglewood_on +mesecons:wire_11111111_on +mcl_walls:endbricks_6 +mcl_wool:orange +mcl_deepslate:deepslatebrickswall_9 +mcl_walls:sandstone_0 +mcl_end:chorus_flower +mcl_mangrove:propagule_clay +mcl_mangrove:water_logged_roots +mcl_walls:mudbrick_15 +mcl_ocean:sea_pickle_3_off_dead_brain_coral_block +mcl_mushrooms:red_mushroom_block_cap_000010 +mesecons:wire_00100000_on +mcl_mangrove:mangrove_wood_fence_gate_open +mcl_sculk:vein +mesecons_noteblock:noteblock +mcl_stairs:stair_mangrove_wood +mesecons:wire_01110001_on +mesecons:wire_11110000_off +mcl_crimson:twisting_vines +mcl_mushrooms:brown_mushroom_block_cap_011111 +mesecons:wire_11111001_on +mcl_mangrove:mangrove_tree_bark +mcl_stairs:slab_warped_hyphae_wood +mcl_flowerpots:flower_pot_fern +mcl_nether:magma +mcl_walls:stonebrickmossy_6 +mesecons:wire_10111000_off +mesecons:wire_00010001_on +mcl_core:stonebrickcracked +mcl_copper:waxed_block_weathered_cut +mcl_crimson:crimson_door_t_2 +mcl_crimson:crimson_door_t_3 +mesecons:wire_01110001_off +mcl_mushrooms:brown_mushroom_block_cap_111011 +mcl_mushrooms:red_mushroom_block_cap_110001 +mesecons:wire_11101010_off +mcl_mushrooms:red_mushroom_block_cap_101110 +mcl_flowers:dandelion +mcl_ocean:dried_kelp_block +mcl_meshhand:mcl_skins_base_18D471DFF_female_surv +mcl_signs:standing_sign45_junglewood +xpanes:pane_orange +mcl_stairs:slab_mossycobble +mcl_heads:zombie67_5 +mcl_mushrooms:red_mushroom_block_cap_110100 +mcl_core:light_13 +mcl_heads:zombie_wall +mcl_farming:wheat +mcl_core:cobble +mesecons:wire_11001100_off +mcl_stairs:stair_mossycobble_inner +mesecons:wire_01110111_off +mcl_stairs:slab_redsandstonesmooth2_top +mcl_core:wood +mesecons:wire_11011001_off +mcl_flowerpots:flower_pot_wither_rose +mcl_signs:wall_sign_acaciawood +mesecons:wire_00010000_on +mcl_walls:stonebrickmossy_14 +mcl_walls:diorite_4 +mesecons:wire_10101000_on +mcl_deepslate:deepslatepolishedwall_5 +mcl_deepslate:deepslatebrickswall_0 +mcl_stairs:slab_deepslate_polished_double +mcl_stairs:stair_stone_rough +mcl_fences:fence_gate +mcl_mushrooms:red_mushroom_block_cap_010100 +mcl_crimson:crimson_nylium +mcl_stairs:stair_deepslate_tiles_inner +mcl_stairs:stair_copper_cut_inner diff --git a/mods/xdecor/src/chess.lua b/mods/xdecor/src/chess.lua index d9db38ea..fd348590 100644 --- a/mods/xdecor/src/chess.lua +++ b/mods/xdecor/src/chess.lua @@ -1,6 +1,7 @@ local realchess = {} local S = minetest.get_translator("xdecor") local FS = function(...) return minetest.formspec_escape(S(...)) end +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false screwdriver = screwdriver or {} local function index_to_xy(idx) @@ -1429,6 +1430,7 @@ minetest.register_node(":realchess:chessboard", { inventory_image = "chessboard_top.png", wield_image = "chessboard_top.png", tiles = {"chessboard_top.png", "chessboard_top.png", "chessboard_sides.png"}, + use_texture_alpha = ALPHA_OPAQUE, groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3}, sounds = default.node_sound_wood_defaults(), node_box = {type = "fixed", fixed = {-.375, -.5, -.375, .375, -.4375, .375}}, diff --git a/mods/xdecor/src/enchanting.lua b/mods/xdecor/src/enchanting.lua index 0cfd192f..fd073363 100644 --- a/mods/xdecor/src/enchanting.lua +++ b/mods/xdecor/src/enchanting.lua @@ -186,11 +186,6 @@ function enchanting.destruct(pos) end function enchanting.timer(pos) - local num = #minetest.get_objects_inside_radius(pos, 0.9) - if num == 0 then - minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") - end - local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} @@ -249,14 +244,26 @@ minetest.register_entity("xdecor:book_open", { collisionbox = {0}, physical = false, textures = {"xdecor_book_open.png"}, - on_activate = function(self) - local pos = self.object:get_pos() - local pos_under = {x = pos.x, y = pos.y - 1, z = pos.z} + static_save = false, +}) - if minetest.get_node(pos_under).name ~= "xdecor:enchantment_table" then - self.object:remove() +minetest.register_lbm({ + label = "recreate book entity", + name = "xdecor:create_book_entity", + nodenames = {"xdecor:enchantment_table"}, + run_at_every_load = true, + action = function(pos, node) + local objs = minetest.get_objects_inside_radius(pos, 0.9) + + for _, obj in ipairs(objs) do + local e = obj:get_luaentity() + if e and e.name == "xdecor:book_open" then + return + end end - end + + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") + end, }) function enchanting:register_tools(mod, def) diff --git a/mods/xdecor/src/mechanisms.lua b/mods/xdecor/src/mechanisms.lua index c6e8cd0e..a758f45e 100644 --- a/mods/xdecor/src/mechanisms.lua +++ b/mods/xdecor/src/mechanisms.lua @@ -1,11 +1,10 @@ -- Thanks to sofar for helping with that code. -minetest.settings:set("nodetimer_interval", 0.1) - local plate = {} screwdriver = screwdriver or {} local S = minetest.get_translator("xdecor") +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false local function door_toggle(pos_actuator, pos_door, player) local player_name = player:get_player_name() @@ -59,6 +58,7 @@ function plate.register(material, desc, def) xdecor.register("pressure_" .. material .. "_off", { description = def.description or (desc .. " Pressure Plate"), tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), groups = def.groups, @@ -70,6 +70,7 @@ function plate.register(material, desc, def) }) xdecor.register("pressure_" .. material .. "_on", { tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), groups = def.groups, @@ -95,6 +96,7 @@ plate.register("stone", "Stone", { xdecor.register("lever_off", { description = S("Lever"), tiles = {"xdecor_lever_off.png"}, + use_texture_alpha = ALPHA_OPAQUE, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), groups = {cracky = 3, oddly_breakable_by_hand = 2}, @@ -118,6 +120,7 @@ xdecor.register("lever_off", { xdecor.register("lever_on", { tiles = {"xdecor_lever_on.png"}, + use_texture_alpha = ALPHA_OPAQUE, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1}, diff --git a/mods/xdecor/src/nodes.lua b/mods/xdecor/src/nodes.lua index f4dd20c2..256e8192 100644 --- a/mods/xdecor/src/nodes.lua +++ b/mods/xdecor/src/nodes.lua @@ -1,5 +1,7 @@ screwdriver = screwdriver or {} local S = minetest.get_translator("xdecor") +local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false local function register_pane(name, desc, def) xpanes.register_pane(name, { @@ -80,6 +82,7 @@ local function register_storage(name, desc, def) inventory = {size = def.inv_size or 24}, infotext = desc, tiles = def.tiles, + use_texture_alpha = ALPHA_OPAQUE, node_box = def.node_box, on_rotate = def.on_rotate, on_place = def.on_place, @@ -480,6 +483,7 @@ local painting_box = { xdecor.register("painting_1", { description = S("Painting"), tiles = {"xdecor_painting_1.png"}, + use_texture_alpha = ALPHA_OPAQUE, inventory_image = "xdecor_painting_empty.png", wield_image = "xdecor_painting_empty.png", paramtype2 = "wallmounted", @@ -505,6 +509,7 @@ xdecor.register("painting_1", { for i = 2, 4 do xdecor.register("painting_" .. i, { tiles = {"xdecor_painting_" .. i .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, paramtype2 = "wallmounted", drop = "xdecor:painting_1", sunlight_propagates = true, @@ -584,6 +589,7 @@ xdecor.register("tatami", { xdecor.register("trampoline", { description = S("Trampoline"), tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"}, + use_texture_alpha = ALPHA_CLIP, groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90}, node_box = xdecor.nodebox.slab_y(0.5), sounds = { @@ -616,6 +622,7 @@ xdecor.register("woodframed_glass", { drawtype = "glasslike_framed", sunlight_propagates = true, tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"}, + use_texture_alpha = ALPHA_CLIP, groups = {cracky = 2, oddly_breakable_by_hand = 1}, sounds = default.node_sound_glass_defaults() }) diff --git a/mods/xdecor/src/workbench.lua b/mods/xdecor/src/workbench.lua index b2252dd5..4c87c3e6 100644 --- a/mods/xdecor/src/workbench.lua +++ b/mods/xdecor/src/workbench.lua @@ -310,6 +310,7 @@ for i = 1, #nodes do drawtype = "nodebox", sounds = def.sounds, tiles = tiles, + use_texture_alpha = def.use_texture_alpha, groups = groups, -- `unpack` has been changed to `table.unpack` in newest Lua versions node_box = xdecor.pixelbox(16, {unpack(d, 3)}), diff --git a/reset-all-world.mt-regenerate-from-config-file b/reset-all-world.mt-regenerate-from-config-file index 92755c55..79000d4d 100644 --- a/reset-all-world.mt-regenerate-from-config-file +++ b/reset-all-world.mt-regenerate-from-config-file @@ -24,10 +24,10 @@ mv -f /home/minetest/.minetest/minetest.conf /tmp/minetest.conf echo "Remove /home/minetest" rm -rf /home/minetest -echo "Clone minetest_game $mt_version" +echo "Clone minetest_game $mt_game_version" mkdir -p /home/minetest/.minetest/games/ rm -rf /home/minetest/.minetest/games/minetest -git clone --depth 1 --branch "$mt_version" https://github.com/minetest/minetest_game.git /home/minetest/.minetest/games/minetest +git clone --depth 1 --branch "$mt_game_version" https://github.com/minetest/minetest_game.git /home/minetest/.minetest/games/minetest echo "Restore minetest.conf and regenerate world.mt" mkdir -p /home/minetest/.minetest/worlds/world/ @@ -51,8 +51,3 @@ cp -r mods /home/minetest/.minetest/mods echo "Fix privileges on /home/minetest" chown minetest:minetest /home/minetest/ -cR -if [ -z "$1" ] -then -echo "Start minetestsrv service" -systemctl start minetestsrv -fi diff --git a/reset-map-and-players b/reset-map-and-players index c3b0fa28..15e075d8 100644 --- a/reset-map-and-players +++ b/reset-map-and-players @@ -12,5 +12,3 @@ sudo -u postgres createdb minetest_players sudo -u postgres psql -U postgres -d postgres -c "grant all privileges on database "minetest" to minetest;" sudo -u postgres psql -U postgres -d postgres -c "grant all privileges on database "minetest_players" to minetest;" -echo "Start minetestsrv service" -systemctl start minetestsrv diff --git a/setup-mt b/setup-mt index 5ad444f9..bcb6ba00 100755 --- a/setup-mt +++ b/setup-mt @@ -12,9 +12,11 @@ echo "Allow sources repo and install dependecies for build" perl -pi.orig -0e 's/^(deb .*\n)# (deb-src)/$1$2/mg' /etc/apt/sources.list apt update apt-get build-dep minetest -y - fi +apt install -y libzstd-dev +apt install -y rpl + echo "Compile libspatialindex" rm -rf /tmp/spatialindex git clone https://github.com/libspatialindex/libspatialindex /tmp/spatialindex @@ -50,10 +52,10 @@ echo "Stop minetestsrv service(upgrade case)" systemctl stop minetestsrv make install -echo "Clone minetest_game $mt_version" +echo "Clone minetest_game $mt_game_version" mkdir -p /home/minetest/.minetest/games/ rm -rf /home/minetest/.minetest/games/minetest -git clone --depth 1 --branch "$mt_version" https://github.com/minetest/minetest_game.git /home/minetest/.minetest/games/minetest +git clone --depth 1 --branch "$mt_game_version" https://github.com/minetest/minetest_game.git /home/minetest/.minetest/games/minetest echo "Fix privileges on /home/minetest" chown minetest:minetest /home/minetest/ -cR